%assign message = LibBlockOutputSignal(1, "", "", 1)
{
- struct rpp_can_pdu pdu;
+ struct can_frame sc_frame;
int ret;
-
- ret = rpp_can_read(%<RppRxInfo.HwObj>, &pdu);
- switch (ret) {
- case -RPP_EINVAL:
- rpp_sci_printf("Receiving CAN message failed (%s).\n", "%<RppRxInfo.Name>");
- break;
- case -RPP_ENODATA:
+ int dlc;
+ int recv_len = -1;
+
+ /* TODO decide what is desired behavior if there are more pendind messages */
+ do {
+ ret = recv(can_rx_handles[%<RppRxInfo.HwObj>], &sc_frame, sizeof(sc_frame), 0);
+ if (ret == -1) {
+ if (errno == EAGAIN)
break;
- case SUCCESS: {
- %if %<data_type_par>==4
- // CAN_MESSAGE
- %<message>.Length = pdu.dlc;
- %<message>.ID = pdu.id;
- int i;
- for (i = 0; i < pdu.dlc; i++ ) {
- %<message>.Data[i] = pdu.data[i];
- %%rpp_sci_printf("%X ", pdu.data[i]);
- }
- %elseif %<data_type_par>==3
- // uint32
- int msg = (pdu.data[0]) |
- (pdu.data[1]<<8) |
- (pdu.data[2]<<16) |
- (pdu.data[3]<<24);
- %<message> = msg;
- %%rpp_sci_printf("32b: %X ", msg);
- %elseif %<data_type_par>==2
- // uint16
- int msg = (pdu.data[0]) |
- (pdu.data[1]<<8);
- %<message> = msg;
- %%rpp_sci_printf("16b: %X ", msg);
- %else
- // uint8
- int msg = pdu.data[0];
- %<message> = msg;
- %%rpp_sci_printf("8b: %X ", msg);
- %endif
- %%rpp_sci_printf("\n");
-
- %% Call a function to process the received message via function-call subsystem
- %foreach callIdx = NumSFcnSysOutputCalls
- %if LibIsEqual(SFcnSystemOutputCall[callIdx].BlockToCall,"unconnected")
- %continue
- %endif
- %% call the downstream system
- %<LibBlockExecuteFcnCall(block, callIdx)>\
- %endforeach
- break;
+ printf("Receiving CAN message failed (%s).\n", "%<RppRxInfo.Name>");
+ break;
+ } else {
+ recv_len = ret;
}
+ } while (ret > 0);
+
+ if (recv_len < sizeof(sc_frame)) {
+ if (recv_len >= 0)
+ printf("Receiving CAN message (%s) returns truncated length %d.\n", "%<RppRxInfo.Name>", ret);
+ } else {
+ dlc = sc_frame.can_dlc;
+ if (dlc > 8)
+ dlc = 8;
+ %if %<data_type_par>==4
+ // CAN_MESSAGE
+ %<message>.Length = dlc;
+ %<message>.ID = sc_frame.can_id & CAN_EFF_MASK;
+ int i;
+ for (i = 0; i < dlc; i++ ) {
+ %<message>.Data[i] = sc_frame.data[i];
+ %%printf("%X ", sc_frame.data[i]);
+ }
+ %elseif %<data_type_par>==3
+ // uint32
+ unsigned int msg = (sc_frame.data[0]) |
+ (sc_frame.data[1]<<8) |
+ (sc_frame.data[2]<<16) |
+ (sc_frame.data[3]<<24);
+ if (dlc < 4)
+ msg &= 0xffffffff << (8 * dlc);
+ %<message> = msg;
+ %%printf("32b: %X ", msg);
+ %elseif %<data_type_par>==2
+ // uint16
+ unsigned int msg = (sc_frame.data[0]) |
+ (sc_frame.data[1]<<8);
+ if (dlc < 2)
+ msg &= 0xffffffff << (8 * dlc);
+ %<message> = msg;
+ %%printf("16b: %X ", msg);
+ %else
+ // uint8
+ unsigned int msg = sc_frame.data[0];
+ %<message> = msg;
+ %%printf("8b: %X ", msg);
+ %endif
+ %%printf("\n");
+
+ %% Call a function to process the received message via function-call subsystem
+ %foreach callIdx = NumSFcnSysOutputCalls
+ %if LibIsEqual(SFcnSystemOutputCall[callIdx].BlockToCall,"unconnected")
+ %continue
+ %endif
+ %% call the downstream system
+ %<LibBlockExecuteFcnCall(block, callIdx)>\
+ %endforeach
}
}
%endif