Skip to content

Commit 23d4e7a

Browse files
committed
Fix restoring of PDO config
It should not be possible to update enabled PDO:s, except if in STATE_INIT when the dictionary is restored. Fix rtlabs-com#51.
1 parent 8ada1a7 commit 23d4e7a

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/co_pdo.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ static uint32_t co_pdo_comm_set (
184184
{
185185
if (!co_validate_cob_id (*value))
186186
return CO_SDO_ABORT_VALUE;
187-
if (((pdo->cobid | *value) & CO_COBID_INVALID) == 0)
187+
if (((pdo->cobid | *value) & CO_COBID_INVALID) == 0 && net->state != STATE_INIT)
188188
return CO_SDO_ABORT_VALUE;
189189
pdo->cobid = *value;
190190
pdo->sync_counter = 0;
@@ -197,7 +197,7 @@ static uint32_t co_pdo_comm_set (
197197
pdo->transmission_type = *value & 0xFF;
198198
break;
199199
case 3:
200-
if ((pdo->cobid & CO_COBID_INVALID) == 0)
200+
if ((pdo->cobid & CO_COBID_INVALID) == 0 && net->state != STATE_INIT)
201201
return CO_SDO_ABORT_VALUE;
202202
pdo->inhibit_time = *value & 0xFFFF;
203203
break;
@@ -207,7 +207,7 @@ static uint32_t co_pdo_comm_set (
207207
case 6:
208208
if (is_rx)
209209
return CO_SDO_ABORT_BAD_SUBINDEX;
210-
if ((pdo->cobid & CO_COBID_INVALID) == 0)
210+
if ((pdo->cobid & CO_COBID_INVALID) == 0 && net->state != STATE_INIT)
211211
return CO_SDO_ABORT_VALUE;
212212
pdo->sync_start = *value & 0xFF;
213213
break;

test/test_od.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ extern "C" uint32_t cb2001 (
4848
}
4949

5050
static const co_default_t od_defaults[] = {
51+
{0x1800, 1, 0x181},
5152
{0x2000, 1, 11},
5253
{0x2000, 2, 22},
5354
{0x2000, 3, 33},
@@ -290,6 +291,49 @@ TEST_F (OdTest, StoreThenLoadNewOD)
290291
EXPECT_EQ (0, memcmp (expect_str2001, str2001, sizeof(str2001) - 1));
291292
}
292293

294+
TEST_F (OdTest, LoadUpdatedPDOConfig)
295+
{
296+
const co_obj_t * obj1800 = find_obj (0x1800);
297+
uint32_t value;
298+
uint32_t result;
299+
300+
// Defaults contain enabled TPDO
301+
net.defaults = od_defaults;
302+
net.state = STATE_PREOP;
303+
304+
// Set TPDO COB-ID to 0x456
305+
306+
value = 0x80000456;
307+
result = co_od1800_fn (&net, OD_EVENT_WRITE, obj1800, NULL, 1, &value);
308+
EXPECT_EQ (0u, result);
309+
310+
value = 0x00000456;
311+
result = co_od1800_fn (&net, OD_EVENT_WRITE, obj1800, NULL, 1, &value);
312+
EXPECT_EQ (0u, result);
313+
314+
// Store comm parameters
315+
co_od_store (&net, CO_STORE_COMM, 0x1000, 0x1FFF);
316+
317+
// Set TPDO COB-ID to 0x457
318+
319+
value = 0x80000457;
320+
result = co_od1800_fn (&net, OD_EVENT_WRITE, obj1800, NULL, 1, &value);
321+
EXPECT_EQ (0u, result);
322+
323+
value = 0x00000457;
324+
result = co_od1800_fn (&net, OD_EVENT_WRITE, obj1800, NULL, 1, &value);
325+
EXPECT_EQ (0u, result);
326+
327+
// Reset comm parameters while in STATE_INIT
328+
net.state = STATE_INIT;
329+
co_od_reset (&net, CO_STORE_COMM, 0x1000, 0x1FFF);
330+
331+
// TPDO COB-ID should have been restored
332+
result = co_od1800_fn (&net, OD_EVENT_READ, obj1800, NULL, 1, &value);
333+
EXPECT_EQ (0u, result);
334+
EXPECT_EQ (0x456u, value);
335+
}
336+
293337
TEST_F (OdTest, OD1010)
294338
{
295339
const co_obj_t * obj1010 = find_obj (0x1010);

0 commit comments

Comments
 (0)