SCOM Serial Communication Protocol  0.5.2
scom_ack_frame.c
Go to the documentation of this file.
1 
10 #define HAL_LOG_CHANNEL SCOM
11 #define HAL_LOG_SUBCHANNEL FRAME
12 
13 #include "hal.h"
14 #include "scom_ack_frame.h"
15 #include "scom_crc.h"
16 
17 // --------------------------------------------------------------------------------------
18 // SCOMFrame_GetTotalFrameSize
19 // --------------------------------------------------------------------------------------
20 bool SCOMAckFrame_Initialize(SCOMAckFrame* const ackFrame, const SCOMFrame* const frame) {
21  HAL_ASSERT_AND_EXECUTE(ackFrame != NULL) {
22  HAL_ASSERT_AND_EXECUTE(frame != NULL) {
23  *ackFrame = (SCOMAckFrame) {
24  .sync = 0xFF,
25  .soack = 0x3b,
26  .ctrl = frame->ctrl,
27  .type = frame->type,
28  .frame_crc = frame->crc
29  };
30  return true;
31  }
32  }
33  return false;
34 } /* SCOMAckFrame_Initialize */
35 
36 // --------------------------------------------------------------------------------------
37 // SCOMAckFrame_IsValidAck
38 // --------------------------------------------------------------------------------------
39 bool SCOMAckFrame_IsValidAck(const SCOMAckFrame* const ackFrame, const SCOMFrame* const frame) {
40  HAL_ASSERT_AND_EXECUTE(ackFrame != NULL) {
41  HAL_ASSERT_AND_EXECUTE(frame != NULL) {
42  if((ackFrame->type == frame->type) && ((ackFrame->ctrl & SCOM_FRAME_CTRL_FRAME_NUMBER_MASK) == (frame->ctrl & SCOM_FRAME_CTRL_FRAME_NUMBER_MASK)) && (ackFrame->frame_crc == frame->crc)) {
43  // this ACK was expected
44  return true;
45  }
46  }
47  }
48  return false;
49 } /* SCOMAckFrame_IsValidAck */
50 
51 // --------------------------------------------------------------------------------------
52 // SCOMAckFrame_CalculateCRC
53 // --------------------------------------------------------------------------------------
54 uint16_t SCOMAckFrame_CalculateCRC(const SCOMAckFrame* const ackFrame) {
55  HAL_ASSERT_AND_EXECUTE(ackFrame != NULL) {
56  uint16_t crc = CRC16_InitCRC();
57  for(uint_fast8_t i = 0; i < (sizeof(SCOMAckFrame) - sizeof(ackFrame->sync) - sizeof(ackFrame->crc)); ++i) {
58  crc = CRC16_UpdateCRC_Byte(*(&ackFrame->soack + i), crc);
59  }
60  return crc;
61  }
62  return -1;
63 } /* SCOMAckFrame_CalculateCRC */
64 
uint16_t SCOMAckFrame_CalculateCRC(const SCOMAckFrame *const ackFrame)
uint8_t sync
synchronization field: always 0xFF
struct HAL_PACKED SCOMAckFrame
Definition of an SCOM acknowledgment frame.
SCOM version record.
Definition: scom.h:81
#define SCOM_FRAME_CTRL_FRAME_NUMBER_MASK
Definition: scom_frame.h:39
bool SCOMAckFrame_Initialize(SCOMAckFrame *const ackFrame, const SCOMFrame *const frame)
SCOMAckFrame definition.
#define CRC16_UpdateCRC_Byte
Definition of CRC16 byte update function.
Definition: scom_crc.h:23
Definition of SCOM CRC functions.
uint8_t type
frame type field
uint8_t soack
start of ACK frame field
bool SCOMAckFrame_IsValidAck(const SCOMAckFrame *const ackFrame, const SCOMFrame *const frame)
uint8_t ctrl
frame control field
uint16_t crc
crc field
#define CRC16_InitCRC
Definition of CRC16 initialization function.
Definition: scom_crc.h:17
uint16_t frame_crc
frame crc field