summaryrefslogtreecommitdiff
path: root/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c')
-rw-r--r--lcmodule/source/cnh1605205_ldr_network_layer/source/a2_network.c83
1 files changed, 62 insertions, 21 deletions
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;