diff options
Diffstat (limited to 'lcmodule/source/cnh1605205_ldr_network_layer')
10 files changed, 283 insertions, 110 deletions
diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_header.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_header.h index cefb39f..d750063 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_header.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_header.h @@ -9,7 +9,9 @@ * @{ * @addtogroup a2_family * @{ - * @addtogroup ldr_header + * @addtogroup ldr_header A2 Header + * Functionalities for serialization and de-serialization A2 header. + * * @{ */ diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_network.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_network.h index e97a3e7..fd6efb7 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_network.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_a2_network.h @@ -9,7 +9,9 @@ * @{ * @addtogroup a2_family * @{ - * @addtogroup ldr_network_layer + * @addtogroup ldr_network_layer A2 Network Layer + * A2 network layer support receiving and sending A2 packets. + * * @{ */ diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_r15_header.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_r15_header.h index fc05539..0011bc3 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/r_r15_header.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/r_r15_header.h @@ -63,9 +63,9 @@ void R15_SerializeHeader(void *Data_p, const R15_Header_t *Header_p); /** * Deserialize the extended header stored in network format to a structure. * - * @param [out] Header_p Pointer to the extended header structure where the - * header data should be placed. - * @param [in] Data_p Pointer to the buffer with received header. + * @param [out] ExtendedHeader_p Pointer to the extended header structure where the + * header data should be placed. + * @param [in] Data_p Pointer to the buffer with received header. * * @return none. */ diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_a2_network.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_a2_network.h index cdc71d4..d91b2f0 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_a2_network.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_a2_network.h @@ -98,7 +98,7 @@ typedef struct A2_PacketMeta { corresponding buffer used in the packet. */ A2_Header_t Header; /**< Structure of the header. */ - uint32 Resend; /**< Resend counter. */ + uint32 Resend; /**< Re-send counter. */ Timer_t *Timer_p; /**< Timer data used for sending/receiving packet. */ uint8 *Payload_p; /**< Pointer to the payload data @@ -137,7 +137,7 @@ typedef struct { A2_Header_t Header; /** Pointer to meta data for allocated buffer for handling A2 packet.*/ A2_PacketMeta_t *Packet_p; - /** Number of packets before receiver is stoped. */ + /** Number of packets before receiver is stopped. */ uint8 PacketsBeforeReceiverStop; /** Indicator for stopping the receiver. */ boolean StopTransfer; @@ -148,7 +148,7 @@ typedef struct { /** A2_Outbound_t*/ /** Structure for handling outgoing A2 packets.*/ typedef struct { - /**< State of the state machine for handling outgoing A2 packets. */ + /** State of the state machine for handling outgoing A2 packets. */ A2_OutboundState_t State; /** Temporary pointer for handling PROTROM packet.*/ A2_PacketMeta_t *Packet_p; diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_protrom_network.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_protrom_network.h index 955b589..b29a65a 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_protrom_network.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_protrom_network.h @@ -34,7 +34,7 @@ typedef enum { PROTROM_RECEIVE_HEADER, /**< State for receiving Header.*/ PROTROM_RECEIVE_PAYLOAD, /**< State for receiving Payload.*/ PROTROM_RECEIVE_ERROR, /**< State for error handling.*/ - PROTROM_RECEIVE_IDLE /**< State for receiver idele.*/ + PROTROM_RECEIVE_IDLE /**< State for receiver idle.*/ } Protrom_InboundState_t; /** Defined state of the transmitter */ diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_r15_network_layer.h b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_r15_network_layer.h index 5e78ddd..3d48957 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/include/t_r15_network_layer.h +++ b/lcmodule/source/cnh1605205_ldr_network_layer/include/t_r15_network_layer.h @@ -286,13 +286,13 @@ typedef struct { PacketMeta_t *MetaInfoList[COMMAND_BUFFER_COUNT+BULK_BUFFER_COUNT]; /**< List of meta data for used packets. */ RetransmissionContext_t *RetransmissionList[MAX_SIZE_RETRANSMISSION_LIST]; - /**< List of packet for retransmision */ + /**< List of packet for retransmission */ uint32 RetransmissionListCount; - /**< Counter for packets retransmision */ + /**< Counter for packets retransmission */ R15_Inbound_t Inbound; /**< Context for receiver. */ R15_Outbound_t Outbound; - /**< Context for transmiter. */ + /**< Context for transmitter. */ } R15_NetworkContext_t; /* diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c index 886ee46..cfbf592 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c @@ -70,7 +70,7 @@ ErrorCode_e A2_Network_Initialize(Communication_t *Communication_p) memset(A2_NETWORK(Communication_p), 0, sizeof(A2_NetworkContext_t)); /* Simulate a finished read to get the inbound state-machine going. */ - A2_Network_ReadCallback(NULL, 0, Communication_p); + A2_Network_ReadCallback(NULL, 0, Communication_p->CommunicationDevice_p); A2_NETWORK(Communication_p)->Outbound.TxCriticalSection = Do_CriticalSection_Create(); #ifdef CFG_ENABLE_LOADER_TYPE @@ -123,7 +123,7 @@ ErrorExit: /* - * Handler for received packets in A2 protocl family. + * Handler for received packets in A2 protocol family. * * This callback function handles the received packets. * @@ -136,7 +136,7 @@ ErrorExit: void A2_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Param_p) { IDENTIFIER_NOT_USED(Data_p); - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); C_(printf("a2_network.c (%d) RecLength(%d) RecBackupData (%d)\n", __LINE__, Length, A2_NETWORK(Communication_p)->Inbound.RecBackupData);) A2_NETWORK(Communication_p)->Inbound.RecData += Length + A2_NETWORK(Communication_p)->Inbound.RecBackupData; @@ -186,46 +186,87 @@ void A2_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Para ErrorCode_e A2_Network_ReceiverHandler(Communication_t *Communication_p) { uint32 ReqData; + uint32 ReqBufferOffset; A2_Inbound_t *In_p = &(A2_NETWORK(Communication_p)->Inbound); if (In_p->ReqData > 0) { if (Communication_p->BackupCommBufferSize != 0) { if (Communication_p->BackupCommBufferSize < In_p->ReqData) { memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBufferSize); - In_p->RecBackupData = Communication_p->BackupCommBufferSize; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + In_p->ReqBuffOffset + Communication_p->BackupCommBufferSize, - In_p->ReqData - Communication_p->BackupCommBufferSize, - A2_Network_ReadCallback, Communication_p); - C_(printf("a2_network.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, In_p->ReqData, In_p->RecData);) - C_(printf("a2_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) - In_p->RecData = 0; + ReqData = In_p->ReqData; + In_p->ReqData = 0; + ReqBufferOffset = In_p->ReqBuffOffset; In_p->ReqBuffOffset = 0; + In_p->RecBackupData = Communication_p->BackupCommBufferSize; Communication_p->BackupCommBufferSize = 0; - In_p->ReqData = 0; + In_p->RecData = 0; + + C_(printf("a2_network.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, ReqData, In_p->RecData);) + C_(printf("a2_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, A2_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + Communication_p->BackupCommBufferSize = In_p->RecBackupData; + In_p->RecBackupData = 0; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, A2_Network_ReadCallback, + Communication_p->CommunicationDevice_p); +#endif } else { + /* Copy content of backup buffer into receive buffer */ memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, In_p->ReqData); + /* Move rest of backup data at the beginning of the backup buffer. */ + memcpy(Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBuffer_p + In_p->ReqData, Communication_p->BackupCommBufferSize - In_p->ReqData); + /* Update the size of the backup buffer to handle only unprocessed data. */ Communication_p->BackupCommBufferSize = Communication_p->BackupCommBufferSize - In_p->ReqData; + ReqData = In_p->ReqData; In_p->ReqData = 0; - A2_Network_ReadCallback(In_p->Target_p + In_p->ReqBuffOffset, ReqData, Communication_p); + ReqBufferOffset = In_p->ReqBuffOffset; + In_p->ReqBuffOffset = 0; In_p->RecData = 0; + A2_Network_ReadCallback(In_p->Target_p + ReqBufferOffset, ReqData, Communication_p->CommunicationDevice_p); } } else { ReqData = In_p->ReqData; In_p->ReqData = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + In_p->ReqBuffOffset, ReqData, A2_Network_ReadCallback, Communication_p); - C_(printf("a2_network.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, In_p->ReqData, In_p->RecData);) - C_(printf("a2_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) - In_p->RecData = 0; + ReqBufferOffset = In_p->ReqBuffOffset; In_p->ReqBuffOffset = 0; + In_p->RecData = 0; + + C_(printf("a2_network.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, ReqData, In_p->RecData);) + C_(printf("a2_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, A2_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, A2_Network_ReadCallback, + Communication_p->CommunicationDevice_p); +#endif } } - /* check for receiver sinhronization */ + /* check for receiver synchronization */ if (In_p->State == A2_RECEIVE_ERROR) { A2_RESET_INBOUND(In_p, A2_RECEIVE_HEADER); A2_SYNC_HEADER(In_p, A2_HEADER_LENGTH, In_p->Scratch); - //(void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, A2_HEADER_LENGTH, A2_Network_ReadCallback, Communication_p); + //(void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, A2_HEADER_LENGTH, A2_Network_ReadCallback, Communication_p->CommunicationDevice_p); } return A2_NETWORK(Communication_p)->Inbound.LCM_Error; @@ -369,7 +410,7 @@ void A2_Network_WriteCallback(const void *Data_p, const uint32 Length, void *Par { IDENTIFIER_NOT_USED(Data_p); IDENTIFIER_NOT_USED(Length); - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); A2_Outbound_t *Out_p = &(A2_NETWORK(Communication_p)->Outbound); if (A2_SENDING_PAYLOAD == Out_p->State) { @@ -512,7 +553,7 @@ ErrorCode_e A2_Network_TransmiterHandler(Communication_t *Communication_p) } if (E_SUCCESS == Communication_p->CommunicationDevice_p->Write((Out_p->Packet_p->Buffer_p), - A2_HEADER_LENGTH, A2_Network_WriteCallback, Communication_p)) { + A2_HEADER_LENGTH, A2_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { C_(printf("a2_network.c (%d) Header Sent to comm device! \n", __LINE__);) } else { Out_p->State = A2_SEND_HEADER; @@ -529,7 +570,7 @@ ErrorCode_e A2_Network_TransmiterHandler(Communication_t *Communication_p) if (E_SUCCESS == Communication_p->CommunicationDevice_p->Write( (Out_p->Packet_p->Buffer_p + A2_HEADER_LENGTH), Out_p->Packet_p->Header.DataLength + A2_CRC_LENGTH, - A2_Network_WriteCallback, Communication_p)) { + A2_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { C_(printf("a2_network.c (%d) Payload Sent to comm device! \n", __LINE__);) } else { Out_p->State = A2_SEND_PAYLOAD; diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_network.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_network.c index 0e52519..7b264e1 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_network.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_network.c @@ -67,7 +67,7 @@ ErrorCode_e Protrom_Network_Initialize(Communication_t *Communication_p) PROTROM_NETWORK(Communication_p)->Outbound.TxCriticalSection = Do_CriticalSection_Create(); /* Simulate a finished read to get the inbound state-machine going. */ - Protrom_Network_ReadCallback(NULL, 0, Communication_p); + Protrom_Network_ReadCallback(NULL, 0, Communication_p->CommunicationDevice_p); (void)QUEUE(Communication_p, Fifo_SetCallback_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Outbound_p, QUEUE_NONEMPTY, Protrom_QueueCallback, Communication_p); return E_SUCCESS; @@ -109,13 +109,13 @@ ErrorCode_e Protrom_Network_Shutdown(const Communication_t *const Communication_ * * @param [in] Data_p Pointer to the received data. * @param [in] Length Length of the received data. - * @param [in] Param_p Extra parameteres. + * @param [in] Param_p Extra parameters. * * @return none. */ void Protrom_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Param_p) { - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); A_(printf("protrom_family.c (%d) RecLength(%d) RecBackupData (%d)\n", __LINE__, Length, PROTROM_NETWORK(Communication_p)->Inbound.RecBackupData);) PROTROM_NETWORK(Communication_p)->Inbound.RecData = Length + PROTROM_NETWORK(Communication_p)->Inbound.RecBackupData; @@ -175,6 +175,7 @@ void Protrom_Network_ReadCallback(const void *Data_p, const uint32 Length, void void Protrom_Network_ReceiverHandler(Communication_t *Communication_p) { uint32 ReqData; + uint32 ReqBufferOffset; Protrom_Inbound_t *In_p = &(PROTROM_NETWORK(Communication_p)->Inbound); /* new data for receiving ? */ @@ -182,42 +183,91 @@ void Protrom_Network_ReceiverHandler(Communication_t *Communication_p) if (Communication_p->BackupCommBufferSize != 0) { if (Communication_p->BackupCommBufferSize < In_p->ReqData) { memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBufferSize); - In_p->RecBackupData = Communication_p->BackupCommBufferSize; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + In_p->ReqBuffOffset + Communication_p->BackupCommBufferSize, - In_p->ReqData - Communication_p->BackupCommBufferSize, - Protrom_Network_ReadCallback, Communication_p); - C_(printf("protrom_network.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, In_p->ReqData, In_p->RecData);) - C_(printf("protrom_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) - In_p->RecData = 0; + ReqData = In_p->ReqData; + In_p->ReqData = 0; + ReqBufferOffset = In_p->ReqBuffOffset; In_p->ReqBuffOffset = 0; + In_p->RecBackupData = Communication_p->BackupCommBufferSize; Communication_p->BackupCommBufferSize = 0; - In_p->ReqData = 0; + In_p->RecData = 0; + + C_(printf("protrom_network.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, ReqData, In_p->RecData);) + C_(printf("protrom_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + Communication_p->BackupCommBufferSize = In_p->RecBackupData; + In_p->RecBackupData = 0; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p); +#endif } else { + /* Copy content of backup buffer into receive buffer */ memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, In_p->ReqData); + /* Move rest of backup data at the beginning of the backup buffer */ + memcpy(Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBuffer_p + In_p->ReqData, Communication_p->BackupCommBufferSize - In_p->ReqData); + /* Update the size of the backup buffer */ Communication_p->BackupCommBufferSize = Communication_p->BackupCommBufferSize - In_p->ReqData; + ReqData = In_p->ReqData; In_p->ReqData = 0; - Protrom_Network_ReadCallback(In_p->Target_p + In_p->ReqBuffOffset, ReqData, Communication_p); + ReqBufferOffset = In_p->ReqBuffOffset; + In_p->ReqBuffOffset = 0; In_p->RecData = 0; + Protrom_Network_ReadCallback(In_p->Target_p + ReqBufferOffset, ReqData, Communication_p->CommunicationDevice_p); } } else { ReqData = In_p->ReqData; In_p->ReqData = 0; + ReqBufferOffset = In_p->ReqBuffOffset; + In_p->ReqBuffOffset = 0; In_p->RecData = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + In_p->ReqBuffOffset, ReqData, Protrom_Network_ReadCallback, Communication_p); - C_(printf("protrom_network.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, In_p->ReqData, In_p->RecData);) + C_(printf("protrom_network.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, ReqData, In_p->RecData);) C_(printf("protrom_network.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) - In_p->ReqBuffOffset = 0; + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p); +#endif } } - /* check for receiver sinhronization */ + /* check for receiver synchronization */ if (In_p->State == PROTROM_RECEIVE_ERROR) { In_p->ReqData = 0; In_p->RecData = 0; In_p->ReqBuffOffset = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, PROTROM_HEADER_LENGTH, Protrom_Network_ReadCallback, Communication_p); +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS == Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + PROTROM_HEADER_LENGTH, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + In_p->State = PROTROM_RECEIVE_HEADER; + } +#else + (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + PROTROM_HEADER_LENGTH, Protrom_Network_ReadCallback, + Communication_p->CommunicationDevice_p); In_p->State = PROTROM_RECEIVE_HEADER; +#endif } } @@ -236,7 +286,7 @@ void Protrom_Network_ReceiverHandler(Communication_t *Communication_p) */ void Protrom_Network_WriteCallback(const void *Data_p, const uint32 Length, void *Param_p) { - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); Protrom_Outbound_t *Out_p = &(PROTROM_NETWORK(Communication_p)->Outbound); if (Out_p->State == PROTROM_SENDING_PAYLOAD) { if (NULL != Out_p->Packet_p) { @@ -341,12 +391,11 @@ static ErrorCode_e Protrom_Network_TransmiterHandler(Communication_t *Communicat } /* FALLTHROUGH */ - case PROTROM_SEND_HEADER: Out_p->State = PROTROM_SENDING_HEADER; if (E_SUCCESS != Communication_p->CommunicationDevice_p->Write(Out_p->Packet_p->Buffer_p, - PROTROM_HEADER_LENGTH, Protrom_Network_WriteCallback, Communication_p)) { + PROTROM_HEADER_LENGTH, Protrom_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { Out_p->State = PROTROM_SEND_HEADER; break; } @@ -357,7 +406,7 @@ static ErrorCode_e Protrom_Network_TransmiterHandler(Communication_t *Communicat Out_p->State = PROTROM_SENDING_PAYLOAD; if (E_SUCCESS != Communication_p->CommunicationDevice_p->Write(Out_p->Packet_p->Buffer_p + PROTROM_HEADER_LENGTH, Out_p->Packet_p->Header.PayloadLength + PROTROM_CRC_LENGTH, - Protrom_Network_WriteCallback, Communication_p)) { + Protrom_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { Out_p->State = PROTROM_SEND_PAYLOAD; break; } diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c index 85be0a2..1ae4d2e 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c @@ -23,7 +23,6 @@ #include "c_system.h" #include "r_r15_transport_layer.h" #include "r_r15_family.h" -#include "r_communication_service.h" #include "r_r15_header.h" #include "r_bulk_protocol.h" #include "r_command_protocol.h" @@ -41,7 +40,7 @@ extern Measurement_t *Measurement_p; #endif -static PacketMeta_t PacketMetaInfo[COMMAND_BUFFER_COUNT + BULK_BUFFER_COUNT] ; /* Packet Meta Info vector*/ +static PacketMeta_t PacketMetaInfo[COMMAND_BUFFER_COUNT + BULK_BUFFER_COUNT] = {{0}}; /* Packet Meta Info vector*/ /******************************************************************************* * Declaration of file local functions @@ -86,7 +85,7 @@ ErrorCode_e R15_Network_Initialize(Communication_t *Communication_p) R15_NETWORK(Communication_p)->Outbound.TxCriticalSection = Do_CriticalSection_Create(); /* Simulate a finished read to get the inbound state-machine going. */ - R15_Network_ReadCallback(NULL, 0, Communication_p); + R15_Network_ReadCallback(NULL, 0, Communication_p->CommunicationDevice_p); #ifdef CFG_ENABLE_LOADER_TYPE (void)QUEUE(Communication_p, Fifo_SetCallback_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Outbound_p, QUEUE_NONEMPTY, R15_QueueOutCallback, Communication_p); (void)QUEUE(Communication_p, Fifo_SetCallback_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Inbound_p, QUEUE_NONEMPTY, R15_QueueInCallback, Communication_p); @@ -98,7 +97,7 @@ ErrorCode_e R15_Network_Initialize(Communication_t *Communication_p) } /* - * Shut down the r15 network layer. + * Shutdown the R15 Network layer. * * @param [in,out] Communication_p Communication module context. * @@ -152,7 +151,7 @@ ErrorExit: */ void R15_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Param_p) { - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); C_(printf("r15_network_layer.c (%d) RecLength(%d) RecBackupData (%d)\n", __LINE__, Length, R15_NETWORK(Communication_p)->Inbound.RecBackupData);) R15_NETWORK(Communication_p)->Inbound.RecData = Length + R15_NETWORK(Communication_p)->Inbound.RecBackupData; @@ -208,7 +207,7 @@ void R15_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Par ErrorCode_e R15_Network_ReceiverHandler(Communication_t *Communication_p) { uint32 ReqData; - uint32 ReqBuffOffset = 0; + uint32 ReqBufferOffset; R15_Inbound_t *In_p = &(R15_NETWORK(Communication_p)->Inbound); /* new data for receiving ? */ @@ -216,43 +215,93 @@ ErrorCode_e R15_Network_ReceiverHandler(Communication_t *Communication_p) if (Communication_p->BackupCommBufferSize != 0) { if (Communication_p->BackupCommBufferSize < In_p->ReqData) { memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBufferSize); - In_p->RecBackupData = Communication_p->BackupCommBufferSize; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + In_p->ReqBuffOffset + Communication_p->BackupCommBufferSize, - In_p->ReqData - Communication_p->BackupCommBufferSize, - R15_Network_ReadCallback, Communication_p); - C_(printf("r15_network_layer.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, In_p->ReqData, In_p->RecData);) - C_(printf("r15_network_layer.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) - In_p->RecData = 0; + ReqData = In_p->ReqData; + In_p->ReqData = 0; + ReqBufferOffset = In_p->ReqBuffOffset; In_p->ReqBuffOffset = 0; + In_p->RecBackupData = Communication_p->BackupCommBufferSize; Communication_p->BackupCommBufferSize = 0; - In_p->ReqData = 0; + In_p->RecData = 0; + + C_(printf("r15_network_layer.c (%d) ReqData(%d) RecData(%d)\n", __LINE__, ReqData, In_p->RecData);) + C_(printf("r15_network_layer.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + Communication_p->BackupCommBufferSize = In_p->RecBackupData; + In_p->RecBackupData = 0; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset + In_p->RecBackupData, + ReqData - In_p->RecBackupData, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p); + +#endif } else { + /* Copy content of backup buffer into receive buffer */ memcpy(In_p->Target_p + In_p->ReqBuffOffset, Communication_p->BackupCommBuffer_p, In_p->ReqData); + /* Move rest of backup data at the beginning of the backup buffer */ + memcpy(Communication_p->BackupCommBuffer_p, Communication_p->BackupCommBuffer_p + In_p->ReqData, Communication_p->BackupCommBufferSize - In_p->ReqData); + /* Update the size of the backup buffer */ Communication_p->BackupCommBufferSize = Communication_p->BackupCommBufferSize - In_p->ReqData; + ReqData = In_p->ReqData; In_p->ReqData = 0; - R15_Network_ReadCallback(In_p->Target_p + In_p->ReqBuffOffset, ReqData, Communication_p); + ReqBufferOffset = In_p->ReqBuffOffset; + In_p->ReqBuffOffset = 0; In_p->RecData = 0; + R15_Network_ReadCallback(In_p->Target_p + ReqBufferOffset, ReqData, Communication_p->CommunicationDevice_p); } } else { ReqData = In_p->ReqData; - ReqBuffOffset = (uint32)(In_p->ReqBuffOffset); - In_p->ReqBuffOffset = 0; In_p->ReqData = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p + ReqBuffOffset, ReqData, R15_Network_ReadCallback, Communication_p); - C_(printf("r15_network_layer.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, In_p->ReqData, In_p->RecData);) - C_(printf("r15_network_layer.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + ReqBufferOffset = In_p->ReqBuffOffset; + In_p->ReqBuffOffset = 0; In_p->RecData = 0; + + C_(printf("r15_network_layer.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, ReqData, In_p->RecData);) + C_(printf("r15_network_layer.c (%d) Communication_p->BackupCommBufferSize(%d) RecBackupData (%d)\n", __LINE__, Communication_p->BackupCommBufferSize, In_p->RecBackupData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + In_p->ReqBuffOffset = ReqBufferOffset; + } +#else + (void)Communication_p->CommunicationDevice_p->Read( + In_p->Target_p + ReqBufferOffset, ReqData, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p); +#endif } } - /* check for receiver sinhronization */ + /* check for receiver synchronization */ if (In_p->State == RECEIVE_ERROR) { In_p->ReqData = 0; In_p->RecData = 0; In_p->ReqBuffOffset = 0; +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS == Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + ALIGNED_HEADER_LENGTH, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p)){ + In_p->State = RECEIVE_HEADER; + } +#else + (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + ALIGNED_HEADER_LENGTH, R15_Network_ReadCallback, + Communication_p->CommunicationDevice_p); In_p->State = RECEIVE_HEADER; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, ALIGNED_HEADER_LENGTH, R15_Network_ReadCallback, Communication_p); +#endif } return R15_NETWORK(Communication_p)->Inbound.LCM_Error; @@ -323,7 +372,7 @@ ErrorCode_e R15_Network_TransmiterHandler(Communication_t *Communication_p) if (E_SUCCESS == Communication_p->CommunicationDevice_p->Write((Out_p->Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER), ContinuousBufferLength, - R15_Network_WriteCallback, Communication_p)) { + R15_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { C_(printf("r15_network_layer.c (%d) Header Sent to comm device! \n", __LINE__);) } else { Out_p->State = SEND_HEADER; @@ -342,7 +391,7 @@ ErrorCode_e R15_Network_TransmiterHandler(Communication_t *Communication_p) if (E_SUCCESS == Communication_p->CommunicationDevice_p->Write(Out_p->Packet_p->Payload_p, Aligned_Length, - R15_Network_WriteCallback, Communication_p)) { + R15_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { RegisterRetransmission = TRUE; C_(printf("r15_network_layer.c (%d) Payload Sent to comm device! \n", __LINE__);) } else { @@ -421,7 +470,7 @@ ErrorCode_e R15_Network_CancelRetransmission(const Communication_t *const Commun * combination of protocol type, session number and command. * * @param [in] Packet_p Pointer to the packet. - * @param [in] ExternalKey External key for marking the packet for retransmision. + * @param [in] ExternalKey External key for marking the packet for retransmission. * * @return Unique key. */ @@ -473,7 +522,6 @@ PacketMeta_t *R15_Network_PacketAllocate(const Communication_t *const Communicat /* packet meta info setup */ C_( - if (BULK_BUFFER_SIZE > BufferSize) printf("CmdBuffGet:%x\n", Buffer_p); else { @@ -562,7 +610,7 @@ ErrorExit: */ void R15_Network_WriteCallback(const void *Data_p, const uint32 Length, void *Param_p) { - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); R15_Outbound_t *Out_p = &(R15_NETWORK(Communication_p)->Outbound); BulkExtendedHeader_t ExtendedHeader = {0}; B_(printf("r15_network_layer.c (%d): Device write finished!! \n", __LINE__);) @@ -605,12 +653,14 @@ static ErrorCode_e R15_Network_ReceiveHeader(const Communication_t *const Commun if (In_p->RecData == 0) { In_p->ReqData = ALIGNED_HEADER_LENGTH; In_p->Target_p = In_p->Scratch; + In_p->ReqBuffOffset = 0; } else { if (R15_IsReceivedHeader(In_p)) { if (R15_IsValidHeader(In_p->Scratch)) { R15_DeserializeHeader(&In_p->Header, In_p->Scratch); In_p->Target_p += ALIGNED_HEADER_LENGTH; + if (In_p->Header.ExtendedHeaderLength == COMMAND_EXTENDED_HEADER_LENGTH) { SET_INBOUND(In_p, RECEIVE_EXTENDED_HEADER, ALIGNED_COMMAND_EXTENDED_HEADER_LENGTH); } else { @@ -625,14 +675,16 @@ static ErrorCode_e R15_Network_ReceiveHeader(const Communication_t *const Commun } else { - uint32 Counter = 0; - - A_(printf("Invalid header! ");) - for (Counter = 0; Counter < 16; Counter++) - { - A_(printf(" %02X", In_p->Scratch[Counter]);) - } - A_(printf("\n\n");) + A_( + uint32 Counter = 0; + + printf("Invalid header! "); + for (Counter = 0; Counter < 16; Counter++) + { + printf(" %02X", In_p->Scratch[Counter]); + } + printf("\n\n"); + ) } } @@ -669,11 +721,13 @@ static ErrorCode_e R15_Network_ReceiveExtendedHeader(Communication_t *Communicat In_p->Packet_p->Header = R15Header; In_p->Packet_p->ExtendedHeader_p = In_p->Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER + ALIGNED_HEADER_LENGTH; SET_PACKET_FLAGS(In_p->Packet_p, PACKET_RX_STATE_MASK, BUF_HDR_CRC_OK); + if (In_p->Packet_p->Header.ExtendedHeaderLength == COMMAND_EXTENDED_HEADER_LENGTH) { In_p->Packet_p->Payload_p = In_p->Packet_p->ExtendedHeader_p + ALIGNED_COMMAND_EXTENDED_HEADER_LENGTH; } else { In_p->Packet_p->Payload_p = In_p->Packet_p->ExtendedHeader_p + ALIGNED_BULK_EXTENDED_HEADER_LENGTH; } + memcpy(In_p->Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER, &In_p->Packet_p->Header, HEADER_LENGTH); memcpy(In_p->Packet_p->ExtendedHeader_p, In_p->Target_p, In_p->Header.ExtendedHeaderLength); @@ -731,14 +785,16 @@ static ErrorCode_e R15_Network_ReceivePayload(Communication_t *Communication_p) if (HASH_NONE != Packet_p->Header.Flags) { #ifdef CFG_ENABLE_MEASUREMENT_TOOL - if(In_p->Packet_p->Header.Protocol == BULK_PROTOCOL){ - BulkExtendedHeader_t ExtendedHeader = {0}; - R15_DeserializeBulkExtendedHeader(&ExtendedHeader, Packet_p->ExtendedHeader_p); - if ((ExtendedHeader.TypeFlags & MASK_BULK_COMMAND_SELECT) == CMD_BULK_DATA){ - (void)MP(Measurement_p, ExtendedHeader.AcksChunk, START_HASHINGCHUNK_TIME); - } - } + if (In_p->Packet_p->Header.Protocol == BULK_PROTOCOL) { + BulkExtendedHeader_t ExtendedHeader = {0}; + R15_DeserializeBulkExtendedHeader(&ExtendedHeader, Packet_p->ExtendedHeader_p); + + if ((ExtendedHeader.TypeFlags & MASK_BULK_COMMAND_SELECT) == CMD_BULK_DATA) { + (void)MP(Measurement_p, ExtendedHeader.AcksChunk, START_HASHINGCHUNK_TIME); + } + } + #endif Communication_p->HashDevice_p->Calculate(OBJECT_HASH(Communication_p), Communication_p->CurrentFamilyHash, @@ -807,7 +863,7 @@ static ErrorCode_e R15_Network_RegisterRetransmission(Communication_t *Communica } } while (Index < MAX_SIZE_RETRANSMISSION_LIST); } else { - A_(printf("r15_network_layer.c (%d) ** Err: Retransmision List is full! ** \n", __LINE__);) + A_(printf("r15_network_layer.c (%d) ** Err: Retransmission List is full! ** \n", __LINE__);) } return ReturnValue; @@ -845,14 +901,16 @@ static void R15_InHashCallback(const void *const Data_p, uint32 Length, const ui PacketMeta_t *Packet_p = (PacketMeta_t *)Param_p; #ifdef CFG_ENABLE_MEASUREMENT_TOOL - if(Packet_p->Header.Protocol == BULK_PROTOCOL){ - BulkExtendedHeader_t ExtendedHeader = {0}; - R15_DeserializeBulkExtendedHeader(&ExtendedHeader, Packet_p->ExtendedHeader_p); - if ((ExtendedHeader.TypeFlags & MASK_BULK_COMMAND_SELECT) == CMD_BULK_DATA){ - (void)MP(Measurement_p, ExtendedHeader.AcksChunk, END_HASHINGCHUNK_TIME); - } + if (Packet_p->Header.Protocol == BULK_PROTOCOL) { + BulkExtendedHeader_t ExtendedHeader = {0}; + R15_DeserializeBulkExtendedHeader(&ExtendedHeader, Packet_p->ExtendedHeader_p); + + if ((ExtendedHeader.TypeFlags & MASK_BULK_COMMAND_SELECT) == CMD_BULK_DATA) { + (void)MP(Measurement_p, ExtendedHeader.AcksChunk, END_HASHINGCHUNK_TIME); + } } + #endif if (memcmp(Hash_p, &Packet_p->Header.PayloadChecksum, 4) == 0) { diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/z_network.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/z_network.c index 8d7ef09..99551f5 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/z_network.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/z_network.c @@ -56,7 +56,7 @@ ErrorCode_e Z_Network_Initialize(Communication_t *Communication_p) Z_NETWORK(Communication_p)->Outbound.TxCriticalSection = Do_CriticalSection_Create(); /* Simulate a finished read to get the inbound state-machine going. */ - Z_Network_ReadCallback(NULL, 0, Communication_p); + Z_Network_ReadCallback(NULL, 0, Communication_p->CommunicationDevice_p); return E_SUCCESS; } @@ -70,7 +70,7 @@ ErrorCode_e Z_Network_Shutdown(const Communication_t *const Communication_p) void Z_Network_ReadCallback(const void *Data_p, const uint32 Length, void *Param_p) { - Communication_t *Communication_p = (Communication_t *)Param_p; + Communication_t *Communication_p = (Communication_t*)(((CommunicationDevice_t*)Param_p)->Object_p); CommandData_t CmdData; Z_NETWORK(Communication_p)->Inbound.RecData += Length; @@ -100,15 +100,36 @@ void Z_Network_ReceiverHandler(Communication_t *Communication_p) ReqData = In_p->ReqData; In_p->ReqData = 0; In_p->RecData = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, ReqData, Z_Network_ReadCallback, Communication_p); C_(printf("z_network.c (%d) ReqData(%d) RecData(%d) \n", __LINE__, ReqData, In_p->RecData);) + +#ifdef CFG_ENABLE_LOADER_TYPE + if (E_SUCCESS != Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + ReqData, Z_Network_ReadCallback, Communication_p->CommunicationDevice_p)) { + /* Read failed! Return to previous state. */ + In_p->ReqData = ReqData; + } +#else + (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + ReqData, Z_Network_ReadCallback, Communication_p->CommunicationDevice_p); +#endif } - /* check for receiver sinhronization */ + /* check for receiver synchronization */ if (In_p->State == Z_RECEIVE_ERROR) { In_p->ReqData = 0; In_p->RecData = 0; - (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, Z_HEADER_LENGTH, Z_Network_ReadCallback, Communication_p); +#ifdef CFG_ENABLE_LOADER_TYPE + if (TRUE == Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + Z_HEADER_LENGTH, Z_Network_ReadCallback, + Communication_p->CommunicationDevice_p)) { + In_p->State = Z_RECEIVE_HEADER; + } +#else + (void)Communication_p->CommunicationDevice_p->Read(In_p->Target_p, + Z_HEADER_LENGTH, Z_Network_ReadCallback, + Communication_p->CommunicationDevice_p); + In_p->State = Z_RECEIVE_HEADER; +#endif } } @@ -130,7 +151,7 @@ ErrorCode_e Z_Network_TransmiterHandler(Communication_t *Communication_p, Z_Send switch (Out_p->State) { case Z_SEND_IDLE: - /* get next packet for transmiting */ + /* get next packet for transmitting */ Out_p->State = Z_SEND_PACKET; /* FALLTHROUGH */ @@ -138,7 +159,7 @@ ErrorCode_e Z_Network_TransmiterHandler(Communication_t *Communication_p, Z_Send if (E_SUCCESS == Communication_p->CommunicationDevice_p->Write(Data_p, Size, - Z_Network_WriteCallback, Communication_p)) { + Z_Network_WriteCallback, Communication_p->CommunicationDevice_p)) { Out_p->State = Z_SENDING_PACKET; } else { /* error state ?*/ |