@@ -152,6 +152,27 @@ TEST_F (PdoTest, PackWithPadding)
152152 EXPECT_EQ (1u , frame[1 ]);
153153}
154154
155+ TEST_F (PdoTest, PackArray)
156+ {
157+ co_pdo_t pdo;
158+ uint8_t * frame = (uint8_t *)&pdo.frame ;
159+ const co_obj_t * obj2000 = find_obj (0x2000 );
160+
161+ memset (&pdo, 0 , sizeof (pdo));
162+
163+ pdo.number_of_mappings = 2 ;
164+ pdo.mappings [0 ] = 0x20000308 ;
165+ pdo.mappings [1 ] = 0x20000708 ;
166+ pdo.entries [0 ] = find_entry (obj2000, 3 );
167+ pdo.entries [1 ] = find_entry (obj2000, 7 );
168+ pdo.objs [0 ] = obj2000;
169+ pdo.objs [1 ] = obj2000;
170+
171+ co_pdo_pack (&net, &pdo);
172+ EXPECT_EQ (3u , frame[0 ]);
173+ EXPECT_EQ (7u , frame[1 ]);
174+ }
175+
155176TEST_F (PdoTest, Unpack)
156177{
157178 co_pdo_t pdo;
@@ -236,6 +257,31 @@ TEST_F (PdoTest, UnpackWithPadding)
236257 EXPECT_EQ (0x3322u , value6003_07);
237258}
238259
260+ TEST_F (PdoTest, UnpackArray)
261+ {
262+ co_pdo_t pdo;
263+ uint8_t * frame = (uint8_t *)&pdo.frame ;
264+ const co_obj_t * obj2000 = find_obj (0x2000 );
265+
266+ memset (&pdo, 0 , sizeof (pdo));
267+
268+ pdo.number_of_mappings = 2 ;
269+ pdo.mappings [0 ] = 0x20000308 ;
270+ pdo.mappings [1 ] = 0x20000708 ;
271+ pdo.entries [0 ] = find_entry (obj2000, 3 );
272+ pdo.entries [1 ] = find_entry (obj2000, 7 );
273+ pdo.objs [0 ] = obj2000;
274+ pdo.objs [1 ] = obj2000;
275+
276+ frame[0 ] = 0x00 ;
277+ frame[1 ] = 0x11 ;
278+
279+ co_pdo_unpack (&net, &pdo);
280+
281+ EXPECT_EQ (0x00u , arr2000[2 ]);
282+ EXPECT_EQ (0x11u , arr2000[6 ]);
283+ }
284+
239285TEST_F (PdoTest, CommParamsSet)
240286{
241287 const co_obj_t * obj1400 = find_obj (0x1400 );
@@ -811,3 +857,53 @@ TEST_F (PdoTest, SparsePdo)
811857 EXPECT_EQ (0u , result);
812858 EXPECT_EQ (0x1234u , value);
813859}
860+
861+ TEST_F (PdoTest, RPDOMonitoring)
862+ {
863+ uint8_t pdo[][4 ] = {
864+ {0x11 , 0x22 , 0x33 , 0x44 },
865+ };
866+
867+ net.state = STATE_OP;
868+
869+ net.pdo_rx [0 ].cobid = 0x201 ;
870+ net.pdo_rx [0 ].event_timer = 100 ;
871+
872+ // Arm RPDO deadline monitoring
873+ co_pdo_rx (&net, 0x201 , pdo[0 ], sizeof (pdo[0 ]));
874+ EXPECT_TRUE (net.pdo_rx [0 ].rpdo_monitoring );
875+
876+ // Receive PDO, timer has not expired. Rearm timer.
877+ mock_os_tick_current_result = 50 * 1000 ;
878+ co_pdo_rx (&net, 0x201 , pdo[0 ], sizeof (pdo[0 ]));
879+ EXPECT_EQ (0u , mock_co_emcy_tx_calls);
880+
881+ // Timer has not expired
882+ mock_os_tick_current_result = 149 * 1000 ;
883+ co_pdo_timer (&net, mock_os_tick_current_result);
884+ EXPECT_EQ (0u , mock_co_emcy_tx_calls);
885+
886+ // Timer has expired, should generate EMCY
887+ mock_os_tick_current_result = 150 * 1000 ;
888+ co_pdo_timer (&net, mock_os_tick_current_result);
889+ EXPECT_EQ (1u , mock_co_emcy_tx_calls);
890+ EXPECT_EQ (0x8250 , mock_co_emcy_tx_code);
891+ EXPECT_FALSE (net.pdo_rx [0 ].rpdo_monitoring );
892+
893+ // Timer still expired, should not generate EMCY
894+ mock_os_tick_current_result = 151 * 1000 ;
895+ co_pdo_timer (&net, mock_os_tick_current_result);
896+ EXPECT_EQ (1u , mock_co_emcy_tx_calls);
897+ EXPECT_EQ (0x8250 , mock_co_emcy_tx_code);
898+ EXPECT_FALSE (net.pdo_rx [0 ].rpdo_monitoring );
899+
900+ // Receive PDO. Rearm timer.
901+ mock_os_tick_current_result = 160 * 1000 ;
902+ co_pdo_rx (&net, 0x201 , pdo[0 ], sizeof (pdo[0 ]));
903+ EXPECT_EQ (1u , mock_co_emcy_tx_calls);
904+
905+ // Receive PDO, timer has not expired
906+ mock_os_tick_current_result = 259 * 1000 ;
907+ co_pdo_rx (&net, 0x201 , pdo[0 ], sizeof (pdo[0 ]));
908+ EXPECT_EQ (1u , mock_co_emcy_tx_calls);
909+ }
0 commit comments