@@ -71,13 +71,14 @@ ODriveCAN::~ODriveCAN() {
7171
7272void ODriveCAN::registerCommands (){
7373 CommandHandler::registerCommands ();
74- registerCommand (" canid" , ODriveCAN_commands::canid, " CAN id of ODrive" );
75- registerCommand (" canspd" , ODriveCAN_commands::canspd, " CAN baudrate" );
76- registerCommand (" errors" , ODriveCAN_commands::errors, " ODrive error flags" );
77- registerCommand (" state" , ODriveCAN_commands::state, " ODrive state" );
78- registerCommand (" maxtorque" , ODriveCAN_commands::maxtorque, " Max torque to send for scaling" );
79- registerCommand (" vbus" , ODriveCAN_commands::vbus, " ODrive Vbus" );
80- registerCommand (" anticogging" , ODriveCAN_commands::anticogging, " Set 1 to start anticogging calibration" );
74+ registerCommand (" canid" , ODriveCAN_commands::canid, " CAN id of ODrive" ,CMDFLAG_GET | CMDFLAG_SET );
75+ registerCommand (" canspd" , ODriveCAN_commands::canspd, " CAN baudrate" ,CMDFLAG_GET | CMDFLAG_SET );
76+ registerCommand (" errors" , ODriveCAN_commands::errors, " ODrive error flags" ,CMDFLAG_GET );
77+ registerCommand (" state" , ODriveCAN_commands::state, " ODrive state" ,CMDFLAG_GET );
78+ registerCommand (" maxtorque" , ODriveCAN_commands::maxtorque, " Max torque to send for scaling" ,CMDFLAG_GET | CMDFLAG_SET );
79+ registerCommand (" vbus" , ODriveCAN_commands::vbus, " ODrive Vbus" ,CMDFLAG_GET );
80+ registerCommand (" anticogging" , ODriveCAN_commands::anticogging, " Set 1 to start anticogging calibration" ,CMDFLAG_SET );
81+ registerCommand (" connected" , ODriveCAN_commands::connected, " ODrive connection state" ,CMDFLAG_GET );
8182}
8283
8384void ODriveCAN::restoreFlash (){
@@ -174,6 +175,16 @@ void ODriveCAN::Run(){
174175 if (HAL_GetTick () - lastVoltageUpdate > 1000 ){
175176 requestMsg (0x17 ); // Update voltage
176177 }
178+
179+ if (HAL_GetTick () - lastCanMessage > 2000 ){ // Timeout
180+ odriveCurrentState = ODriveState::AXIS_STATE_UNDEFINED ;
181+ state = ODriveLocalState::IDLE ;
182+ waitReady = true ;
183+ connected = false ;
184+ }else {
185+ connected = true ;
186+ }
187+
177188 }
178189}
179190
@@ -282,9 +293,7 @@ CommandStatus ODriveCAN::command(const ParsedCommand& cmd,std::vector<CommandRep
282293 break ;
283294
284295 case ODriveCAN_commands::canid:
285- if (cmd.type == CMDtype::get){
286- return handleGetSet (cmd, replies, this ->nodeId );
287- }
296+ return handleGetSet (cmd, replies, this ->nodeId );
288297 break ;
289298 case ODriveCAN_commands::state:
290299 if (cmd.type == CMDtype::get){
@@ -321,6 +330,11 @@ CommandStatus ODriveCAN::command(const ParsedCommand& cmd,std::vector<CommandRep
321330 }
322331 break ;
323332 }
333+ case ODriveCAN_commands::connected:
334+ if (cmd.type == CMDtype::get){
335+ replies.push_back (CommandReply (connected ? 1 : 0 ));
336+ }
337+ break ;
324338
325339 default :
326340 return CommandStatus::NOT_FOUND ;
@@ -340,6 +354,8 @@ void ODriveCAN::canRxPendCallback(CAN_HandleTypeDef *hcan,uint8_t* rxBuf,CAN_RxH
340354 uint64_t msg = *reinterpret_cast <uint64_t *>(rxBuf);
341355 uint8_t cmd = rxHeader->StdId & 0x1F ;
342356
357+ lastCanMessage = HAL_GetTick ();
358+
343359 switch (cmd){
344360 case 1 :
345361 {
0 commit comments