C2A_Core
eb90_frame_for_driver_super.c
[詳解]
1 #pragma section REPRO
7 #include "../../Library/endian.h"
8 #include "../../Library/crc.h"
9 
12 
13 
15 {
16  uint16_t length;
17  ENDIAN_memcpy(&length, &(DSSC_get_rx_frame(p_stream_config)[2]), EB90_FRAME_LEN_SIZE);
18  return length;
19 }
20 
21 
22 const uint8_t* EB90_FRAME_get_packet_head_from_dssc(const DS_StreamConfig* p_stream_config)
23 {
24  return &(DSSC_get_rx_frame(p_stream_config)[EB90_FRAME_HEADER_SIZE]);
25 }
26 
27 
28 uint16_t EB90_FRAME_get_crc_from_dssc(const DS_StreamConfig* p_stream_config)
29 {
30  uint16_t crc;
31  uint16_t offset = EB90_FRAME_HEADER_SIZE + EB90_FRAME_get_packet_length_from_dssc(p_stream_config);
32  ENDIAN_memcpy(&crc, &(DSSC_get_rx_frame(p_stream_config)[offset]), EB90_FRAME_CRC_SIZE);
33  return crc;
34 }
35 
36 
37 uint8_t EB90_FRAME_is_valid_crc_of_dssc(const DS_StreamConfig* p_stream_config)
38 {
39  uint16_t len = EB90_FRAME_get_packet_length_from_dssc(p_stream_config);
40  const uint8_t* head = EB90_FRAME_get_packet_head_from_dssc(p_stream_config);
41  return (EB90_FRAME_calc_crc(head, len + EB90_FRAME_CRC_SIZE) == 0) ? 1 : 0;
42 }
43 
44 
45 uint16_t EB90_FRAME_calc_crc(const uint8_t* data, size_t len)
46 {
47  // CRC-16/CCITT-FALSE (CRC-16/AUTOSAR, CRC-16/IBM-3740 とも)
48  // https://reveng.sourceforge.io/crc-catalogue/16.htm
49  return CRC_calc_crc_16_ccitt_left(0xffff, data, len, 0);
50 }
51 
52 #pragma section
uint16_t CRC_calc_crc_16_ccitt_left(uint16_t crc, const uint8_t *c, size_t n, int rev_flag)
CRC-16-CCITT
Definition: crc.c:126
const uint8_t * DSSC_get_rx_frame(const DS_StreamConfig *p_stream_config)
確定したフレームを取得
uint16_t EB90_FRAME_calc_crc(const uint8_t *data, size_t len)
EB90 Frame の CRC の計算
const uint8_t EB90_FRAME_kStx[EB90_FRAME_STX_SIZE]
const uint8_t * EB90_FRAME_get_packet_head_from_dssc(const DS_StreamConfig *p_stream_config)
受信フレームから Packet Field の先頭ポインタを取得する
uint8_t EB90_FRAME_is_valid_crc_of_dssc(const DS_StreamConfig *p_stream_config)
EB90 Frame に付与された CRC が正しいかチェック
uint16_t EB90_FRAME_get_crc_from_dssc(const DS_StreamConfig *p_stream_config)
CRC の取得
const uint8_t EB90_FRAME_kEtx[EB90_FRAME_ETX_SIZE]
uint16_t EB90_FRAME_get_packet_length_from_dssc(const DS_StreamConfig *p_stream_config)
Packet Length の取得
コンポ間通信などで標準的に使う データリンク層 の EB90 Frame
#define EB90_FRAME_STX_1ST_BYTE
EB90 Frame の STX 1st byte
#define EB90_FRAME_HEADER_SIZE
EB90 Frame のヘッダサイズ
#define EB90_FRAME_ETX_1ST_BYTE
EB90 Frame の ETX 1st byte
#define EB90_FRAME_STX_2ND_BYTE
EB90 Frame の STX 2nd byte
#define EB90_FRAME_ETX_2ND_BYTE
EB90 Frame の ETX 2nd byte
#define EB90_FRAME_LEN_SIZE
EB90 Frame の LEN のサイズ
#define EB90_FRAME_ETX_SIZE
EB90 Frame の ETX のサイズ
#define EB90_FRAME_CRC_SIZE
EB90 Frame の CRC のサイズ
#define EB90_FRAME_STX_SIZE
EB90 Frame の STX のサイズ
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
DriverSuperStream の設定
Definition: driver_super.h:281