C2A_Core
space_packet.c
[詳解]
1 #pragma section REPRO
7 #include "space_packet.h"
8 #include "../../Library/endian.h"
9 #include <string.h>
10 
11 
12 static const SP_ParamExtractionInfo SP_pei_ver_ = { 0, 0xe0, 5, 1}; // 11100000b
13 static const SP_ParamExtractionInfo SP_pei_type_ = { 0, 0x10, 4, 1}; // 00010000b
14 static const SP_ParamExtractionInfo SP_pei_2nd_hdr_flag_ = { 0, 0x08, 3, 1}; // 00001000b
15 static const SP_ParamExtractionInfo SP_pei_apid_ = { 0, 0x07, 0, 2}; // 00000111b
16 static const SP_ParamExtractionInfo SP_pei_seq_flag_ = { 2, 0xc0, 6, 1}; // 11000000b
17 static const SP_ParamExtractionInfo SP_pei_seq_count_ = { 2, 0x3f, 0, 2}; // 00111111b
18 static const SP_ParamExtractionInfo SP_pei_pckt_data_len_ = { 4, 0xff, 0, 2}; // 11111111b
19 
20 
21 // ******************************
22 // Primary Header getter/setter
23 // ******************************
24 
26 {
27  uint8_t tmp;
28  SP_VER ver;
29 
31  ver = (SP_VER)tmp;
32 
33  switch (ver)
34  {
35  case SP_VER_1:
36  return ver;
37  default:
38  return SP_VER_UNKNOWN;
39  }
40 }
41 
42 
44 {
45  uint8_t tmp = (uint8_t)ver;
47 }
48 
49 
51 {
52  uint8_t type;
53 
55  return (SP_TYPE)type;
56 }
57 
58 
60 {
61  uint8_t tmp = (uint8_t)type;
63 }
64 
65 
67 {
68  uint8_t flag;
69 
71  return (SP_2ND_HDR_FLAG)flag;
72 }
73 
74 
76 {
77  uint8_t tmp = (uint8_t)flag;
79 }
80 
81 
83 {
84  uint16_t apid;
86  return APID_get_apid_from_uint16(apid);
87 }
88 
89 
90 void SP_set_apid(SpacePacket* sp, APID apid)
91 {
92  uint16_t tmp = (uint16_t)apid;
94 }
95 
96 
98 {
99  uint8_t flag;
100 
102  return (SP_SEQ_FLAG)flag;
103 }
104 
105 
107 {
108  uint8_t tmp = (uint8_t)flag;
110 }
111 
112 
113 uint16_t SP_get_seq_count(const SpacePacket* sp)
114 {
115  uint16_t count;
116 
118  return count;
119 }
120 
121 
122 void SP_set_seq_count(SpacePacket* sp, uint16_t count)
123 {
125 }
126 
127 
129 {
130  uint16_t len;
131 
133  // Data Length は 0 起算表記なので 1 起算に変換して返す
134  return (uint16_t)(len + 1);
135 }
136 
137 
138 void SP_set_packet_data_len(SpacePacket* sp, uint16_t len)
139 {
140  if (len == 0) return;
141 
142  // Data Length は 0 起算表記なので 1 起算を変換
143  len--;
145 }
146 
147 
148 // ******************
149 // Utility Function
150 // ******************
151 
152 uint16_t SP_get_packet_len(const SpacePacket* sp)
153 {
154  return (uint16_t)(SP_get_packet_data_len(sp) + SP_PRM_HDR_LEN);
155 }
156 
157 
158 void SP_set_packet_len(SpacePacket* sp, uint16_t len)
159 {
160  if (len <= SP_PRM_HDR_LEN) return;
161  SP_set_packet_data_len(sp, (uint16_t)(len - SP_PRM_HDR_LEN));
162 }
163 
164 
165 void SP_copy_packet(SpacePacket* dest, const SpacePacket* src)
166 {
167  memcpy(dest->packet, src->packet, (size_t)SP_get_packet_len(src));
168 }
169 
170 
172  const SP_ParamExtractionInfo* pei,
173  void* dst)
174 {
175  uint8_t buffer[8];
176  uint8_t i;
177 
178  if (pei->byte_len == 0) return;
179  if (pei->byte_len > 8) return;
180  if (pei->offset > 7) return;
181 
182  // offset あり
183  if (pei->offset)
184  {
185  // offset されるのは, 1byte の中で格納される時
186  if (pei->byte_len != 1) return;
187 
188  buffer[0] = (sp->packet[pei->pos] & pei->mask) >> pei->offset;
189  }
190  else
191  {
192  // offset なし
193  // 最初の 1byte
194  buffer[0] = sp->packet[pei->pos] & pei->mask;
195 
196  // 2byte 目以降
197  for (i = 1; i < pei->byte_len; ++i)
198  {
199  buffer[i] = sp->packet[pei->pos + i];
200  }
201  }
202 
203  ENDIAN_memcpy(dst, buffer, pei->byte_len);
204 }
205 
206 
208  const SP_ParamExtractionInfo* pei,
209  const void* src)
210 {
211  uint8_t buffer[8];
212  uint8_t i;
213 
214  if (pei->byte_len == 0) return;
215  if (pei->byte_len > 8) return;
216  if (pei->offset > 7) return;
217 
218  ENDIAN_memcpy(buffer, src, pei->byte_len);
219 
220  // offset あり
221  if (pei->offset)
222  {
223  // offset されるのは, 1byte の中で格納される時
224  if (pei->byte_len != 1) return;
225 
226  buffer[0] <<= pei->offset;
227 
228  sp->packet[pei->pos] &= (uint8_t)(~pei->mask);
229  sp->packet[pei->pos] |= (uint8_t)(buffer[0] & pei->mask);
230  }
231  else
232  {
233  // offset なし
234  // 最初の 1byte
235  sp->packet[pei->pos] &= (uint8_t)(~pei->mask);
236  sp->packet[pei->pos] |= (uint8_t)(buffer[0] & pei->mask);
237 
238  // 2byte 目以降
239  for (i = 1; i < pei->byte_len; ++i)
240  {
241  sp->packet[pei->pos + i] = buffer[i];
242  }
243  }
244 }
245 
246 #pragma section
APID APID_get_apid_from_uint16(uint16_t apid)
バイト列から APID を取得
Definition: apid_define.c:10
APID
Application Process ID
Definition: apid_define.h:17
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
void SP_set_packet_data_len(SpacePacket *sp, uint16_t len)
Packet Data Length を設定
Definition: space_packet.c:138
SP_2ND_HDR_FLAG SP_get_2nd_hdr_flag(const SpacePacket *sp)
Secondary Header Flag を取得
Definition: space_packet.c:66
static const SP_ParamExtractionInfo SP_pei_type_
Definition: space_packet.c:13
uint16_t SP_get_seq_count(const SpacePacket *sp)
Sequence Count を取得
Definition: space_packet.c:113
uint16_t SP_get_packet_len(const SpacePacket *sp)
Packet Length を取得
Definition: space_packet.c:152
void SP_extract_param_from_packet(const SpacePacket *sp, const SP_ParamExtractionInfo *pei, void *dst)
packet に格納された param を取得
Definition: space_packet.c:171
static const SP_ParamExtractionInfo SP_pei_ver_
Definition: space_packet.c:12
SP_SEQ_FLAG SP_get_seq_flag(const SpacePacket *sp)
Sequence Flag を取得
Definition: space_packet.c:97
static const SP_ParamExtractionInfo SP_pei_pckt_data_len_
Definition: space_packet.c:18
void SP_set_ver(SpacePacket *sp, SP_VER ver)
Version No を設定
Definition: space_packet.c:43
static const SP_ParamExtractionInfo SP_pei_2nd_hdr_flag_
Definition: space_packet.c:14
static const SP_ParamExtractionInfo SP_pei_seq_flag_
Definition: space_packet.c:16
void SP_set_seq_flag(SpacePacket *sp, SP_SEQ_FLAG flag)
Sequence Flag を設定
Definition: space_packet.c:106
void SP_set_seq_count(SpacePacket *sp, uint16_t count)
Sequence Count を設定
Definition: space_packet.c:122
APID SP_get_apid(const SpacePacket *sp)
APID を取得
Definition: space_packet.c:82
void SP_insert_param_to_packet(SpacePacket *sp, const SP_ParamExtractionInfo *pei, const void *src)
packet に param を格納
Definition: space_packet.c:207
void SP_set_2nd_hdr_flag(SpacePacket *sp, SP_2ND_HDR_FLAG flag)
Secondary Header Flag を設定
Definition: space_packet.c:75
uint16_t SP_get_packet_data_len(const SpacePacket *sp)
Packet Data Length を取得
Definition: space_packet.c:128
void SP_set_type(SpacePacket *sp, SP_TYPE type)
Packet Type を設定
Definition: space_packet.c:59
void SP_set_packet_len(SpacePacket *sp, uint16_t len)
Packet Length を設定
Definition: space_packet.c:158
static const SP_ParamExtractionInfo SP_pei_apid_
Definition: space_packet.c:15
SP_VER SP_get_ver(const SpacePacket *sp)
Version No を取得
Definition: space_packet.c:25
static const SP_ParamExtractionInfo SP_pei_seq_count_
Definition: space_packet.c:17
void SP_copy_packet(SpacePacket *dest, const SpacePacket *src)
SpacePacket をコピー
Definition: space_packet.c:165
void SP_set_apid(SpacePacket *sp, APID apid)
APID を設定
Definition: space_packet.c:90
SP_TYPE SP_get_type(const SpacePacket *sp)
Packet Type を取得
Definition: space_packet.c:50
CCSDS で規定される Space Packet の実装
SP_TYPE
Space Packet Type
Definition: space_packet.h:64
SP_2ND_HDR_FLAG
Space Packet Secandary Header Flag
Definition: space_packet.h:76
SP_SEQ_FLAG
Space Packet Sequence Flag
Definition: space_packet.h:87
SP_VER
Space Packet Version Number
Definition: space_packet.h:52
@ SP_VER_UNKNOWN
Definition: space_packet.h:54
@ SP_VER_1
000b: Version-1
Definition: space_packet.h:53
#define SP_PRM_HDR_LEN
Packet Primary Header 長
Definition: space_packet.h:43
packet からデータを抜き取るときのパラメタ
Definition: space_packet.h:99
uint16_t pos
位置
Definition: space_packet.h:100
uint8_t mask
1 byte 目にあてるマスク
Definition: space_packet.h:101
uint8_t offset
bit offset (bit が左シフトされて格納されている場合)
Definition: space_packet.h:102
uint8_t byte_len
パケット octet 列の何 byte にわたるか.最大 8 (64bit)
Definition: space_packet.h:103
Space Packet
uint8_t packet[SP_MAX_LEN]