C2A_Core
tc_transfer_frame.c
[詳解]
1 #pragma section REPRO
6 #include "tc_transfer_frame.h"
7 
8 #include <string.h>
9 #include <src_core/Library/crc.h>
10 
12 {
13  uint8_t pos = 0;
14  uint8_t mask = 0xc0; // 1100 0000b
15 
16  TCTF_VER ver = (TCTF_VER)((tctf->packet[pos] & mask) >> 6);
17 
18  switch (ver)
19  {
20  case TCTF_VER_1:
21  return ver;
22 
23  default:
24  return TCTF_VER_UNKNOWN;
25  }
26 }
27 
29 {
30  uint8_t pos = 0;
31  uint8_t mask = 0x30; // 0011 0000b
32 
33  TCTF_TYPE type = (TCTF_TYPE)((tctf->packet[pos] & mask) >> 4);
34 
35  switch (type)
36  {
37  case TCTF_TYPE_AD: // FALL THROUGH
38  case TCTF_TYPE_BD: // FALL THROUGH
39  case TCTF_TYPE_BC:
40  return type;
41 
42  default:
43  return TCTF_TYPE_UNKNOWN;
44  }
45 }
46 
48 {
49  uint8_t pos = 0;
50  uint8_t mask = 0x03; // 0000 0011b
51 
52  // pos = 0の下位2bitsとpos = 1の8bitsを合わせた10bits
53  TCTF_SCID scid = (TCTF_SCID)(tctf->packet[pos] & mask);
54  scid = (TCTF_SCID)(scid << 8);
55  scid = (TCTF_SCID)(scid + tctf->packet[pos + 1]);
56 
57  switch (scid)
58  {
60  return scid;
61 
62  default:
63  return TCTF_SCID_UNKNOWN;
64  }
65 }
66 
68 {
69  uint8_t pos = 2;
70  uint8_t mask = 0xfc; // 1111 1100b
71 
72  TCTF_VCID vcid = (TCTF_VCID)((tctf->packet[pos] & mask) >> 2);
73 
74  switch (vcid)
75  {
76  case TCTF_VCID_REALTIME:
77  return vcid;
78 
79  default:
80  return TCTF_VCID_UNKNOWN;
81  }
82 }
83 
84 uint16_t TCTF_get_frame_len(const TcTransferFrame* tctf)
85 {
86  uint8_t pos = 2;
87  uint8_t mask = 0x03; // 0000 0011b
88 
89  // pos = 0の下位2bitsとpos = 1の8bitsを合わせた10bits
90  uint16_t len = (tctf->packet[pos] & mask);
91  len <<= 8;
92  len += tctf->packet[pos + 1];
93 
94  // TC Frameの長さ表記は0起算なので1起算に変換した値を返す
95  return len + 1;
96 }
97 
99 {
100  return tctf->packet[4];
101 }
102 
104 {
105  return (const TcSegment*)(&tctf->packet[TCTF_HEADER_SIZE]);
106 }
107 
108 uint16_t TCTF_get_fecw(const TcTransferFrame* tctf)
109 {
110  uint16_t length = TCTF_get_frame_len(tctf);
111 
112  uint16_t fecw = tctf->packet[length - 2];
113  fecw <<= 8;
114  fecw += tctf->packet[length - 1];
115 
116  return fecw;
117 }
118 
119 uint8_t TCTF_check_fecw(const TcTransferFrame* tctf)
120 {
121  uint16_t len = TCTF_get_frame_len(tctf);
122  uint16_t result = CRC_calc_crc_16_ccitt_left(0xffff, tctf->packet, len, 0);
123 
124  return !result;
125 }
126 
128 {
129  return (const TcTransferFrame*)byte;
130 }
131 
132 #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
CRC用のライブラリ
TC Segment のパケット構造体
Definition: tc_segment.h:34
TC Transfer Frame のパケット構造体
uint8_t packet[TCTF_MAX_LEN]
const TcSegment * TCTF_get_tc_segment(const TcTransferFrame *tctf)
TC Segment を取得
const TcTransferFrame * TCTF_convert_from_bytes_to_tctf(const uint8_t *byte)
受信 byte 列を TcTransferFrame* に変換
uint16_t TCTF_get_fecw(const TcTransferFrame *tctf)
FECW を取得
uint8_t TCTF_check_fecw(const TcTransferFrame *tctf)
TCTF FECW のチェック
uint16_t TCTF_get_frame_len(const TcTransferFrame *tctf)
Frame Length を取得
TCTF_TYPE TCTF_get_type(const TcTransferFrame *tctf)
command type を取得
TCTF_SCID TCTF_get_scid(const TcTransferFrame *tctf)
SCID を取得
TCTF_VER TCTF_get_ver(const TcTransferFrame *tctf)
version を取得
uint8_t TCTF_get_frame_seq_num(const TcTransferFrame *tctf)
Frame Sequence Number を取得
TCTF_VCID TCTF_get_vcid(const TcTransferFrame *tctf)
VCID を取得
CCSDS で規定される TC Transfer Frame の実装
TCTF_VER
Version
@ TCTF_VER_UNKNOWN
@ TCTF_VER_1
#define TCTF_HEADER_SIZE
TCTF_SCID
Spacecraft ID
@ TCTF_SCID_UNKNOWN
@ TCTF_SCID_SAMPLE_SATELLITE
TCTF_TYPE
Type
@ TCTF_TYPE_BD
@ TCTF_TYPE_AD
@ TCTF_TYPE_UNKNOWN
@ TCTF_TYPE_BC
TCTF_VCID
Virtual Channel ID
@ TCTF_VCID_UNKNOWN
@ TCTF_VCID_REALTIME