C2A_Core
tlm_space_packet.c
[詳解]
1 #pragma section REPRO
8 #include "tlm_space_packet.h"
9 #include <stddef.h>
10 #include <string.h>
11 
12 #define TSP_CAST_TO_SP(tsp) ((const SpacePacket*)(tsp))
13 #define TSP_CAST_TO_NON_CONST_SP(tsp) ((SpacePacket*)(tsp))
14 
15 
16 static const SP_ParamExtractionInfo TSP_pei_2nd_hdr_ver_ = { 6, 0xff, 0, 1}; // 11111111b
17 static const SP_ParamExtractionInfo TSP_pei_board_time_ = { 7, 0xff, 0, 4}; // 11111111b
18 static const SP_ParamExtractionInfo TSP_pei_tlm_id_ = {11, 0xff, 0, 1}; // 11111111b
19 static const SP_ParamExtractionInfo TSP_pei_global_time_ = {12, 0xff, 0, 8}; // 11111111b
20 static const SP_ParamExtractionInfo TSP_pei_ob_sn_time_ = {20, 0xff, 0, 4}; // 11111111b
21 static const SP_ParamExtractionInfo TSP_pei_dest_flags_ = {24, 0xff, 0, 1}; // 11111111b
22 static const SP_ParamExtractionInfo TSP_pei_dest_info_ = {25, 0x0f, 0, 1}; // 11111111b
23 
24 
25 // ******************************
26 // Primary Header getter/setter
27 // ******************************
28 
30 {
31  return SP_get_ver(TSP_CAST_TO_SP(tsp));
32 }
33 
34 
36 {
38 }
39 
40 
42 {
43  return SP_get_type(TSP_CAST_TO_SP(tsp));
44 }
45 
46 
48 {
50 }
51 
52 
54 {
56 }
57 
58 
60 {
62 }
63 
64 
66 {
67  return SP_get_apid(TSP_CAST_TO_SP(tsp));
68 }
69 
70 
72 {
74 }
75 
76 
78 {
79  return SP_get_seq_flag(TSP_CAST_TO_SP(tsp));
80 }
81 
82 
84 {
86 }
87 
88 
89 uint16_t TSP_get_seq_count(const TlmSpacePacket* tsp)
90 {
91  return SP_get_seq_count(TSP_CAST_TO_SP(tsp));
92 }
93 
94 
95 void TSP_set_seq_count(TlmSpacePacket* tsp, uint16_t count)
96 {
98 }
99 
100 
102 {
104 }
105 
106 
107 void TSP_set_packet_data_len(TlmSpacePacket* tsp, uint16_t len)
108 {
110 }
111 
112 
113 // **************************
114 // 2nd Header getter/setter
115 // **************************
116 
118 {
119  uint8_t tmp;
120  TSP_2ND_HDR_VER ver;
121 
123  ver = (TSP_2ND_HDR_VER)tmp;
124 
125  switch (ver)
126  {
127  case TSP_2ND_HDR_VER_1:
128  return ver;
129  default:
131  }
132 }
133 
134 
136 {
137  uint8_t tmp = (uint8_t)ver;
139 }
140 
141 
142 uint32_t TSP_get_board_time(const TlmSpacePacket* tsp)
143 {
144  uint32_t time;
145 
147  return time;
148 }
149 
150 
151 void TSP_set_board_time(TlmSpacePacket* tsp, uint32_t time)
152 {
154 }
155 
156 
158 {
159  double time;
160 
162  return time;
163 }
164 
165 
166 void TSP_set_global_time(TlmSpacePacket* tsp, double time)
167 {
169 }
170 
171 
173 {
174  uint32_t time;
175 
177  return time;
178 }
179 
180 
182 {
184 }
185 
186 
188 {
189  uint8_t id;
190 
192  return (TLM_CODE)id;
193 }
194 
195 
197 {
198  uint8_t tmp = (uint8_t)id;
200 }
201 
202 
204 {
205  ctp_dest_flags_t flags;
206 
208  return flags;
209 }
210 
211 
213 {
215 }
216 
217 
219 {
220  uint8_t info;
221 
223  return info;
224 }
225 
226 
227 void TSP_set_dest_info(TlmSpacePacket* tsp, uint8_t info)
228 {
230 }
231 
232 
233 // ******************
234 // Utility Function
235 // ******************
236 
237 uint16_t TSP_get_packet_len(const TlmSpacePacket* tsp)
238 {
239  return SP_get_packet_len(TSP_CAST_TO_SP(tsp));
240 }
241 
242 
243 void TSP_set_packet_len(TlmSpacePacket* tsp, uint16_t len)
244 {
246 }
247 
248 
250 {
252 }
253 
254 
256 {
257  return (uint8_t*)&(tsp->packet[SP_PRM_HDR_LEN + TSP_SND_HDR_LEN]); // const_cast
258 }
259 
260 
261 // FIXME: TCP 時代の len と変わってることに注意!!!!!!
262 // これを呼ぶ関数でなおす!!!!
263 void TSP_setup_primary_hdr(TlmSpacePacket* tsp, APID apid, uint16_t seq_count, uint16_t packet_len)
264 {
265  TSP_set_common_hdr(tsp);
266  TSP_set_apid(tsp, apid);
267  TSP_set_seq_count(tsp, seq_count);
268  TSP_set_packet_len(tsp, packet_len);
269 }
270 
271 
273 {
274  // ここでは Version Number は Version-1 固定
275  TSP_set_ver(tsp, SP_VER_1);
276  // Telemetry Packet なので TypeはTelemetry 固定
278  // ここでは Secondary Header は必須
280  // ここでは Sequence Flag は Standalone Packet に固定 // FIXME: きちんとやる
282 }
283 
284 
285 void TSP_setup_fill_packet(TlmSpacePacket* tsp, uint16_t fill_size)
286 {
287  // パケットの内容を0クリア。
288  memset(tsp->packet, 0x00, TSP_MAX_LEN);
289 
290  if (fill_size > SP_PRM_HDR_LEN)
291  {
292  // Fill領域が Packet Primary Header 長より大きい場合
293  // Fill領域に ピッタリハマる Fill Packet を生成する
296  0, // FIXME: これでいいのか確認
297  (uint16_t)fill_size);
298  }
299  else
300  {
301  // Fill領域が Packet Primary Header 長より小さい場合
302  // 領域ピッタリの Fill Packet の生成は不可能なので,データ長 1 のFill Packetを生成する。
305  0, // FIXME: これでいいのか確認
306  SP_PRM_HDR_LEN + 1);
307  }
308 }
309 
310 #pragma section
APID
Application Process ID
Definition: apid_define.h:17
@ APID_FILL_PKT
11111111111b: APID for FILL PACKET
Definition: apid_define.h:26
uint8_t ctp_dest_flags_t
CTP_DEST_FLAG の & をとったフラグのための型
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
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
SP_SEQ_FLAG SP_get_seq_flag(const SpacePacket *sp)
Sequence Flag を取得
Definition: space_packet.c:97
void SP_set_ver(SpacePacket *sp, SP_VER ver)
Version No を設定
Definition: space_packet.c:43
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
SP_VER SP_get_ver(const SpacePacket *sp)
Version No を取得
Definition: space_packet.c:25
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
SP_TYPE
Space Packet Type
Definition: space_packet.h:64
@ SP_TYPE_TLM
0b: TELEMETRY
Definition: space_packet.h:65
SP_2ND_HDR_FLAG
Space Packet Secandary Header Flag
Definition: space_packet.h:76
@ SP_2ND_HDR_FLAG_PRESENT
1b: Secondary Header Present
Definition: space_packet.h:78
SP_SEQ_FLAG
Space Packet Sequence Flag
Definition: space_packet.h:87
@ SP_SEQ_FLAG_SINGLE
11b: Standalone packet
Definition: space_packet.h:91
SP_VER
Space Packet Version Number
Definition: space_packet.h:52
@ SP_VER_1
000b: Version-1
Definition: space_packet.h:53
#define SP_PRM_HDR_LEN
Packet Primary Header 長
Definition: space_packet.h:43
#define TSP_MAX_LEN
TlmSpacePacket の最大パケット長.VCDU 分割しないならこれが最大値
packet からデータを抜き取るときのパラメタ
Definition: space_packet.h:99
Space Packet (テレメ用)
uint8_t packet[TSP_MAX_LEN]
APID TSP_get_apid(const TlmSpacePacket *tsp)
APID を取得
void TSP_set_2nd_hdr_flag(TlmSpacePacket *tsp, SP_2ND_HDR_FLAG flag)
Secondary Header Flag を設定
#define TSP_CAST_TO_NON_CONST_SP(tsp)
SPへのキャスト. SPのほうが広いので,これは可能
void TSP_setup_primary_hdr(TlmSpacePacket *tsp, APID apid, uint16_t seq_count, uint16_t packet_len)
Primary Header を構築
SP_VER TSP_get_ver(const TlmSpacePacket *tsp)
Version No を取得
void TSP_set_type(TlmSpacePacket *tsp, SP_TYPE type)
Packet Type を設定
uint8_t TSP_get_dest_info(const TlmSpacePacket *tsp)
Dest Info を取得
#define TSP_CAST_TO_SP(tsp)
SPへのキャスト. SPのほうが広いので,これは可能
static const SP_ParamExtractionInfo TSP_pei_global_time_
void TSP_set_seq_flag(TlmSpacePacket *tsp, SP_SEQ_FLAG flag)
Sequence Flag を設定
static const SP_ParamExtractionInfo TSP_pei_dest_info_
uint32_t TSP_get_on_board_subnet_time(const TlmSpacePacket *tsp)
On-Board Subnetwork Time を取得
void TSP_set_2nd_hdr_ver(TlmSpacePacket *tsp, TSP_2ND_HDR_VER ver)
Secondary Header Version No を設定
ctp_dest_flags_t TSP_get_dest_flags(const TlmSpacePacket *tsp)
Destination Flags を取得
uint16_t TSP_get_packet_len(const TlmSpacePacket *tsp)
Packet Length を取得
uint16_t TSP_get_seq_count(const TlmSpacePacket *tsp)
Sequence Count を取得
SP_2ND_HDR_FLAG TSP_get_2nd_hdr_flag(const TlmSpacePacket *tsp)
Secondary Header Flag を取得
double TSP_get_global_time(const TlmSpacePacket *tsp)
Global Time を取得
void TSP_set_dest_info(TlmSpacePacket *tsp, uint8_t info)
Dest Info を設定
void TSP_setup_fill_packet(TlmSpacePacket *tsp, uint16_t fill_size)
パケット全体を 0x00 クリアし, fill_size に等しいサイズのパケットを生成する
void TSP_set_ver(TlmSpacePacket *tsp, SP_VER ver)
Version No を設定
void TSP_set_apid(TlmSpacePacket *tsp, APID apid)
APID を設定
static const SP_ParamExtractionInfo TSP_pei_2nd_hdr_ver_
static const SP_ParamExtractionInfo TSP_pei_board_time_
SP_TYPE TSP_get_type(const TlmSpacePacket *tsp)
Packet Type を取得
SP_SEQ_FLAG TSP_get_seq_flag(const TlmSpacePacket *tsp)
Sequence Flag を取得
uint16_t TSP_get_packet_data_len(const TlmSpacePacket *tsp)
Packet Data Length を取得
TLM_CODE TSP_get_tlm_id(const TlmSpacePacket *tsp)
Tlm ID を取得
void TSP_set_global_time(TlmSpacePacket *tsp, double time)
Global Time を設定
void TSP_copy_packet(TlmSpacePacket *dest, const TlmSpacePacket *src)
TlmSpacePacket をコピー
void TSP_set_on_board_subnet_time(TlmSpacePacket *tsp, uint32_t time)
On-Board Subnetwork Time を設定
static const SP_ParamExtractionInfo TSP_pei_tlm_id_
void TSP_set_common_hdr(TlmSpacePacket *tsp)
共通部分の Header を構築
void TSP_set_packet_data_len(TlmSpacePacket *tsp, uint16_t len)
Packet Data Length を設定
uint32_t TSP_get_board_time(const TlmSpacePacket *tsp)
Board Time を取得
void TSP_set_board_time(TlmSpacePacket *tsp, uint32_t time)
Board Time を設定
void TSP_set_packet_len(TlmSpacePacket *tsp, uint16_t len)
Packet Length を設定
void TSP_set_seq_count(TlmSpacePacket *tsp, uint16_t count)
Sequence Count を設定
TSP_2ND_HDR_VER TSP_get_2nd_hdr_ver(const TlmSpacePacket *tsp)
Secondary Header Version No を取得
void TSP_set_dest_flags(TlmSpacePacket *tsp, ctp_dest_flags_t flags)
Destination Flags を設定
static const SP_ParamExtractionInfo TSP_pei_dest_flags_
uint8_t * TSP_get_user_data_head(const TlmSpacePacket *tsp)
User Data Field の先頭ポインタを取得
void TSP_set_tlm_id(TlmSpacePacket *tsp, TLM_CODE id)
Tlm ID を設定
static const SP_ParamExtractionInfo TSP_pei_ob_sn_time_
CCSDS で規定される Space Packet の テレメ版の実装
#define TSP_SND_HDR_LEN
Secondary Header 長
TSP_2ND_HDR_VER
Secondary Header Version No
@ TSP_2ND_HDR_VER_UNKNOWN
バージョン不定
@ TSP_2ND_HDR_VER_1
Version-1