diff --git a/src/cansdo.cpp b/src/cansdo.cpp index d10b21e..b4d98c5 100644 --- a/src/cansdo.cpp +++ b/src/cansdo.cpp @@ -25,6 +25,7 @@ #define SDO_INDEX_PARAMS 0x2000 #define SDO_INDEX_PARAM_UID 0x2100 +#define SDO_INDEX_PARAM_FLAGS 0x2200 #define SDO_INDEX_MAP_TX 0x3000 #define SDO_INDEX_MAP_RX 0x3001 #define SDO_INDEX_MAP_RD 0x3100 @@ -192,6 +193,29 @@ void CanSdo::ProcessSDO(uint32_t data[2]) sdo->data = SDO_ERR_INVIDX; } } + else if (sdo->index == SDO_INDEX_PARAM_FLAGS) + { + Param::PARAM_NUM paramIdx = (Param::PARAM_NUM)sdo->subIndex; + + if (paramIdx < Param::PARAM_LAST) + { + if (sdo->cmd == SDO_WRITE) + { + Param::SetFlagsRaw(paramIdx, (uint8_t)sdo->data); + sdo->cmd = SDO_WRITE_REPLY; + } + else if (sdo->cmd == SDO_READ) + { + sdo->data = (uint32_t)Param::GetFlag(paramIdx); + sdo->cmd = SDO_READ_REPLY; + } + } + else + { + sdo->cmd = SDO_ABORT; + sdo->data = SDO_ERR_INVIDX; + } + } else if (0 != canMap && sdo->index == SDO_INDEX_MAP_TX) { AddCanMap(sdo, false); diff --git a/src/sdocommands.cpp b/src/sdocommands.cpp index 9e9bedc..673ac26 100644 --- a/src/sdocommands.cpp +++ b/src/sdocommands.cpp @@ -34,6 +34,7 @@ #define SDO_CMD_LOAD 1 #define SDO_CMD_RESET 2 #define SDO_CMD_DEFAULTS 3 +#define SDO_CMD_CLEAR_CAN 4 bool SdoCommands::saveEnabled = true; CanMap* SdoCommands::canMap; @@ -96,6 +97,9 @@ void SdoCommands::ProcessStandardCommands(CanSdo::SdoFrame* sdoFrame) Param::LoadDefaults(); Param::Change(Param::PARAM_LAST); break; + case SDO_CMD_CLEAR_CAN: + if (0 != canMap) canMap->Clear(); + break; default: sdoFrame->cmd = SDO_ABORT; sdoFrame->data = SDO_ERR_INVIDX; diff --git a/test/test_cansdo.cpp b/test/test_cansdo.cpp index 3480b48..5bba665 100644 --- a/test/test_cansdo.cpp +++ b/test/test_cansdo.cpp @@ -466,6 +466,64 @@ static void sdo_read_strings_initiates_print_request() ASSERT(canSdo->GetPrintRequest() == 3); } +// --------------------------------------------------------------------------- +// Parameter flags via SDO index SDO_INDEX_PARAM_FLAGS (0x2200) +// --------------------------------------------------------------------------- + +static void sdo_read_param_flags_default() +{ + // By default flags are FLAG_NONE (0) + SendSdoRequest(SDO_READ, 0x2200, Param::ocurlim, 0); + + ASSERT(canStub->m_canId == SdoRepId); + ASSERT(GetReply()->cmd == SDO_READ_REPLY); + ASSERT(GetReply()->data == (uint32_t)Param::FLAG_NONE); +} + +static void sdo_write_and_read_param_flags() +{ + // Set FLAG_HIDDEN on ocurlim + SendSdoRequest(SDO_WRITE, 0x2200, Param::ocurlim, (uint32_t)Param::FLAG_HIDDEN); + + ASSERT(canStub->m_canId == SdoRepId); + ASSERT(GetReply()->cmd == SDO_WRITE_REPLY); + ASSERT(Param::GetFlag(Param::ocurlim) == Param::FLAG_HIDDEN); + + // Read it back + SendSdoRequest(SDO_READ, 0x2200, Param::ocurlim, 0); + ASSERT(GetReply()->cmd == SDO_READ_REPLY); + ASSERT(GetReply()->data == (uint32_t)Param::FLAG_HIDDEN); +} + +static void sdo_write_param_flags_clear() +{ + // Pre-set the flag, then clear it via SDO + Param::SetFlag(Param::ocurlim, Param::FLAG_HIDDEN); + SendSdoRequest(SDO_WRITE, 0x2200, Param::ocurlim, (uint32_t)Param::FLAG_NONE); + + ASSERT(canStub->m_canId == SdoRepId); + ASSERT(GetReply()->cmd == SDO_WRITE_REPLY); + ASSERT(Param::GetFlag(Param::ocurlim) == Param::FLAG_NONE); +} + +static void sdo_read_param_flags_invalid_index() +{ + SendSdoRequest(SDO_READ, 0x2200, Param::PARAM_LAST, 0); + + ASSERT(canStub->m_canId == SdoRepId); + ASSERT(GetReply()->cmd == SDO_ABORT); + ASSERT(GetReply()->data == SDO_ERR_INVIDX); +} + +static void sdo_write_param_flags_invalid_index() +{ + SendSdoRequest(SDO_WRITE, 0x2200, Param::PARAM_LAST, (uint32_t)Param::FLAG_HIDDEN); + + ASSERT(canStub->m_canId == SdoRepId); + ASSERT(GetReply()->cmd == SDO_ABORT); + ASSERT(GetReply()->data == SDO_ERR_INVIDX); +} + // --------------------------------------------------------------------------- // Test registration // --------------------------------------------------------------------------- @@ -497,5 +555,10 @@ REGISTER_TEST( sdo_reply_sent_via_send_sdo_reply, sdo_request_ignored_for_wrong_node_id, sdo_request_processed_after_set_node_id, - sdo_read_strings_initiates_print_request + sdo_read_strings_initiates_print_request, + sdo_read_param_flags_default, + sdo_write_and_read_param_flags, + sdo_write_param_flags_clear, + sdo_read_param_flags_invalid_index, + sdo_write_param_flags_invalid_index );