From bfe5e1e7f8cba581360bf3057e487821ee91bdcf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 13:29:34 +0000 Subject: [PATCH 1/3] Add SDO commands for parameter flags, loading defaults, and clearing CAN map Agent-Logs-Url: https://github.com/jsphuebner/libopeninv/sessions/16cb1caf-a3bd-4cb7-b464-cf3b85b7832a Co-authored-by: jsphuebner <3882041+jsphuebner@users.noreply.github.com> --- src/cansdo.cpp | 24 ++++++++++++++++ src/sdocommands.cpp | 4 +++ test/test_cansdo.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) 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..9ac6398 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 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 ); From 88bb67e622cb690ab4cbe88b3807457b7acb4e5d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 13:31:59 +0000 Subject: [PATCH 2/3] Expose SDO_INDEX_PARAM_FLAGS in cansdo.h; use constant in tests Agent-Logs-Url: https://github.com/jsphuebner/libopeninv/sessions/16cb1caf-a3bd-4cb7-b464-cf3b85b7832a Co-authored-by: jsphuebner <3882041+jsphuebner@users.noreply.github.com> --- include/cansdo.h | 2 ++ src/cansdo.cpp | 1 - test/test_cansdo.cpp | 14 +++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/cansdo.h b/include/cansdo.h index af62027..29e8a99 100644 --- a/include/cansdo.h +++ b/include/cansdo.h @@ -40,6 +40,8 @@ #define SDO_ERR_RANGE 0x06090030 #define SDO_ERR_GENERAL 0x08000000 +#define SDO_INDEX_PARAM_FLAGS 0x2200 + class CanSdo: CanCallback, public IPutChar { public: diff --git a/src/cansdo.cpp b/src/cansdo.cpp index b4d98c5..b166910 100644 --- a/src/cansdo.cpp +++ b/src/cansdo.cpp @@ -25,7 +25,6 @@ #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 diff --git a/test/test_cansdo.cpp b/test/test_cansdo.cpp index 9ac6398..7b6ee38 100644 --- a/test/test_cansdo.cpp +++ b/test/test_cansdo.cpp @@ -467,13 +467,13 @@ static void sdo_read_strings_initiates_print_request() } // --------------------------------------------------------------------------- -// Parameter flags via SDO index 0x2200 +// 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); + SendSdoRequest(SDO_READ, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, 0); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_READ_REPLY); @@ -483,14 +483,14 @@ static void sdo_read_param_flags_default() static void sdo_write_and_read_param_flags() { // Set FLAG_HIDDEN on ocurlim - SendSdoRequest(SDO_WRITE, 0x2200, Param::ocurlim, (uint32_t)Param::FLAG_HIDDEN); + SendSdoRequest(SDO_WRITE, SDO_INDEX_PARAM_FLAGS, 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); + SendSdoRequest(SDO_READ, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, 0); ASSERT(GetReply()->cmd == SDO_READ_REPLY); ASSERT(GetReply()->data == (uint32_t)Param::FLAG_HIDDEN); } @@ -499,7 +499,7 @@ 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); + SendSdoRequest(SDO_WRITE, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, (uint32_t)Param::FLAG_NONE); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_WRITE_REPLY); @@ -508,7 +508,7 @@ static void sdo_write_param_flags_clear() static void sdo_read_param_flags_invalid_index() { - SendSdoRequest(SDO_READ, 0x2200, Param::PARAM_LAST, 0); + SendSdoRequest(SDO_READ, SDO_INDEX_PARAM_FLAGS, Param::PARAM_LAST, 0); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_ABORT); @@ -517,7 +517,7 @@ static void sdo_read_param_flags_invalid_index() static void sdo_write_param_flags_invalid_index() { - SendSdoRequest(SDO_WRITE, 0x2200, Param::PARAM_LAST, (uint32_t)Param::FLAG_HIDDEN); + SendSdoRequest(SDO_WRITE, SDO_INDEX_PARAM_FLAGS, Param::PARAM_LAST, (uint32_t)Param::FLAG_HIDDEN); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_ABORT); From f01697f3b5e7e2d7dd7e10cf88ce13b4a3dcce5e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 13:38:55 +0000 Subject: [PATCH 3/3] Move SDO_INDEX_PARAM_FLAGS to cansdo.cpp alongside other SDO indexes Agent-Logs-Url: https://github.com/jsphuebner/libopeninv/sessions/f1a87314-bbb4-4c5f-a2e3-79b729dc81a1 Co-authored-by: jsphuebner <3882041+jsphuebner@users.noreply.github.com> --- include/cansdo.h | 2 -- src/cansdo.cpp | 1 + test/test_cansdo.cpp | 12 ++++++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/cansdo.h b/include/cansdo.h index 29e8a99..af62027 100644 --- a/include/cansdo.h +++ b/include/cansdo.h @@ -40,8 +40,6 @@ #define SDO_ERR_RANGE 0x06090030 #define SDO_ERR_GENERAL 0x08000000 -#define SDO_INDEX_PARAM_FLAGS 0x2200 - class CanSdo: CanCallback, public IPutChar { public: diff --git a/src/cansdo.cpp b/src/cansdo.cpp index b166910..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 diff --git a/test/test_cansdo.cpp b/test/test_cansdo.cpp index 7b6ee38..5bba665 100644 --- a/test/test_cansdo.cpp +++ b/test/test_cansdo.cpp @@ -473,7 +473,7 @@ static void sdo_read_strings_initiates_print_request() static void sdo_read_param_flags_default() { // By default flags are FLAG_NONE (0) - SendSdoRequest(SDO_READ, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, 0); + SendSdoRequest(SDO_READ, 0x2200, Param::ocurlim, 0); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_READ_REPLY); @@ -483,14 +483,14 @@ static void sdo_read_param_flags_default() static void sdo_write_and_read_param_flags() { // Set FLAG_HIDDEN on ocurlim - SendSdoRequest(SDO_WRITE, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, (uint32_t)Param::FLAG_HIDDEN); + 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, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, 0); + SendSdoRequest(SDO_READ, 0x2200, Param::ocurlim, 0); ASSERT(GetReply()->cmd == SDO_READ_REPLY); ASSERT(GetReply()->data == (uint32_t)Param::FLAG_HIDDEN); } @@ -499,7 +499,7 @@ 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, SDO_INDEX_PARAM_FLAGS, Param::ocurlim, (uint32_t)Param::FLAG_NONE); + SendSdoRequest(SDO_WRITE, 0x2200, Param::ocurlim, (uint32_t)Param::FLAG_NONE); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_WRITE_REPLY); @@ -508,7 +508,7 @@ static void sdo_write_param_flags_clear() static void sdo_read_param_flags_invalid_index() { - SendSdoRequest(SDO_READ, SDO_INDEX_PARAM_FLAGS, Param::PARAM_LAST, 0); + SendSdoRequest(SDO_READ, 0x2200, Param::PARAM_LAST, 0); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_ABORT); @@ -517,7 +517,7 @@ static void sdo_read_param_flags_invalid_index() static void sdo_write_param_flags_invalid_index() { - SendSdoRequest(SDO_WRITE, SDO_INDEX_PARAM_FLAGS, Param::PARAM_LAST, (uint32_t)Param::FLAG_HIDDEN); + SendSdoRequest(SDO_WRITE, 0x2200, Param::PARAM_LAST, (uint32_t)Param::FLAG_HIDDEN); ASSERT(canStub->m_canId == SdoRepId); ASSERT(GetReply()->cmd == SDO_ABORT);