Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/cansdo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/sdocommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
65 changes: 64 additions & 1 deletion test/test_cansdo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ---------------------------------------------------------------------------
Expand Down Expand Up @@ -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
);
Loading