C2A_Core
block_command_table.c
[詳解]
1 #pragma section REPRO
7 #include "block_command_table.h"
8 
9 #include "string.h" // for memcpy
10 
11 #include "block_command_executor.h"
12 
15 #include "packet_handler.h"
16 #include "command_analyze.h"
18 #include "../System/TimeManager/time_manager.h"
19 #include "../Library/endian.h"
20 #include "../System/WatchdogTimer/watchdog_timer.h"
21 #include "common_cmd_packet_util.h"
22 
23 // FIXME: この include は依存的にダメなので, TCP → Space Packet 大工事が終わったら直す
24 #include "./Ccsds/space_packet.h"
26 
29 
33 static void BCT_load_default_func_pointer_(void);
34 
35 // 以下4つは default (SRAM, 冗長無し) の getter, setter
37 static uint8_t BC_get_bc_length_default_(const bct_id_t block);
38 static void BC_set_bc_cmd_data_default_(const BCT_Pos* pos, const BCT_CmdData* value);
39 static void BC_set_bc_length_default_(const bct_id_t block, uint8_t length);
40 
41 // BCT_Func をラップした static な getter, setter. なので 返り値に const がつかない
42 static BCT_CmdData* BCT_get_bc_cmd_data_(const BCT_Pos* pos);
43 static void BCT_set_bc_cmd_data_(const BCT_Pos* pos, const BCT_CmdData* value);
44 static void BCT_set_bc_length_(const bct_id_t block, uint8_t length);
45 
49 static void BCT_clear_pos_(void);
50 
51 static BCT_ACK BCT_set_position_(const BCT_Pos* pos);
52 
56 static BCT_ACK BCT_save_cmd_(const BCT_Pos* pos, const CommonCmdPacket* packet);
57 
58 void BCT_initialize(void)
59 {
60  bct_id_t i;
61 
65 
66  for (i = 0; i < BCT_MAX_BLOCKS; ++i)
67  {
68  if (!BCUS_bc_should_clear(i)) continue;
69 
70  BCT_clear_block(i);
71  WDT_clear_wdt(); // 念の為?
72  }
73 
75 
77 }
78 
80 {
81  bct_id_t block;
82  for (block = 0; block < BCT_MAX_BLOCKS; ++block)
83  {
86 
89  }
90 }
91 
93 {
94  return &block_command_table_.blocks[pos->block]->cmds[pos->cmd];
95 }
96 
97 static void BC_set_bc_cmd_data_default_(const BCT_Pos* pos, const BCT_CmdData* value)
98 {
99  BCT_CmdData* cmd_data = &block_command_table_.blocks[pos->block]->cmds[pos->cmd];
100  if ((unsigned char*)cmd_data == (const unsigned char*)value) return;
101  memcpy(cmd_data, value, sizeof(BCT_CmdData));
102 }
103 
104 static uint8_t BC_get_bc_length_default_(const bct_id_t block)
105 {
106  return block_command_table_.blocks[block]->length;
107 }
108 
109 static void BC_set_bc_length_default_(const bct_id_t block, uint8_t length)
110 {
111  block_command_table_.blocks[block]->length = length;
112 }
113 
115 {
117 }
118 
119 static void BCT_set_bc_cmd_data_(const BCT_Pos* pos, const BCT_CmdData* value)
120 {
122 }
123 
124 static void BCT_set_bc_length_(const bct_id_t block, uint8_t length)
125 {
126  block_command_table_.func[block].set_bc_length_(block, length);
127 }
128 
130 {
132 }
133 
134 uint8_t BCT_get_bc_length(const bct_id_t block)
135 {
136  if (block >= BCT_MAX_BLOCKS) return 0;
137  return block_command_table_.func[block].get_bc_length_(block);
138 }
139 
140 static void BCT_clear_pos_(void)
141 {
146 }
147 
149 {
150  BCT_ACK ack = BCT_check_position(pos);
151 
152  if (ack != BCT_SUCCESS) return ack;
153 
154  block_command_table_.pos = *pos;
155 
156  return BCT_SUCCESS;
157 }
158 
160 {
161  if (pos->block >= BCT_MAX_BLOCKS)
162  {
163  return BCT_INVALID_BLOCK_NO;
164  }
165  if (pos->cmd >= BCT_MAX_CMD_NUM)
166  {
167  return BCT_INVALID_CMD_NO;
168  }
169 
170  return BCT_SUCCESS;
171 }
172 
174 {
176  uint8_t length;
177 
178  if (ack != BCT_SUCCESS) return ack;
179 
181 
182  // 現在登録されているコマンド数よりも大きければエラー
183  // つまり,登録されているテーブルの上書きはできるが,
184  // 未登録のセルを飛ばして,不連続に登録することはできない,はず.
185  if (block_command_table_.pos.cmd > length)
186  {
187  return BCT_ISORATED_CMD;
188  }
189 
190  ack = BCT_save_cmd_(&block_command_table_.pos, packet);
191 
192  if (ack != BCT_SUCCESS)
193  {
194  return ack;
195  }
196 
197  // 連続登録に備え、ポインタ位置を進める。上限超過は次回登録時リジェクトされる。
199 
200  // ブロック末尾へのコマンド追加の場合はブロック長を更新する
201  if (length < block_command_table_.pos.cmd)
202  {
203  length = block_command_table_.pos.cmd;
205  }
206 
207  return BCT_SUCCESS;
208 }
209 
211 {
212  BCT_ACK ack = BCT_check_position(pos);
213 
214  if (ack != BCT_SUCCESS) return ack;
215  if (BCT_get_bc_length(pos->block) <= pos->cmd) return BCT_ISORATED_CMD;
216 
217  return BCT_save_cmd_(pos, packet);
218 }
219 
220 // FIXME: 以下複数関数にわたって BlockCmdCmdData と CommonCmdPacket の変換が,現在 cast によって行われているが,
221 // CommonCmdPacket はユーザー定義なため,それ(= CmdSpacePacket (旧 TCP)以外)に対応できるようにする
222 // 同様の理由で memcpy なども対応する必要がある.
223 // FIXME: CTCP, SpacePacket 整理で直す
224 static BCT_ACK BCT_save_cmd_(const BCT_Pos* pos, const CommonCmdPacket* packet)
225 {
226  // FIXME: TCPに依存しない,つまりCTCPに依存するコードにする
227  BCT_ACK ack = BCT_check_position(pos);
228  if (ack != BCT_SUCCESS) return ack;
229 
230  // パケット全長が想定最大長を超えている場合は異常判定
232 
233  // 格納可能なパケットなら内容をコピーし保存
234  BCT_set_bc_cmd_data_(pos, (BCT_CmdData*)packet->packet); // const_cast
235 
236  return BCT_SUCCESS;
237 }
238 
240 {
241  BCT_ACK ack = BCT_check_position(pos);
242  BCT_CmdData* bc_cmddata;
243 
244  if (ack != BCT_SUCCESS) return ack;
245  bc_cmddata = BCT_get_bc_cmd_data_(pos);
246  memcpy(&packet->packet, bc_cmddata, BCT_CMD_MAX_LENGTH); // FIXME: CTCPがTCP依存なので直す
247 
248  return BCT_SUCCESS;
249 }
250 
251 BCT_ACK BCT_copy_bct(const bct_id_t dst_block, const bct_id_t src_block)
252 {
253  uint8_t cmd;
254  uint8_t length = BCT_get_bc_length(src_block);
255 
256  if (dst_block >= BCT_MAX_BLOCKS || src_block >= BCT_MAX_BLOCKS) return BCT_INVALID_BLOCK_NO;
257  if (BCE_is_active(dst_block)) return BCT_INVALID_BLOCK_NO;
258 
259  BCT_clear_block(dst_block);
260  BCT_set_bc_length_(dst_block, BCT_get_bc_length(src_block));
261  for (cmd = 0; cmd < length; ++cmd)
262  {
263  BCT_Pos dst_pos, src_pos;
264  BCT_make_pos(&dst_pos, dst_block, cmd);
265  BCT_make_pos(&src_pos, src_block, cmd);
266  BCT_set_bc_cmd_data_(&dst_pos, BCT_get_bc_cmd_data(&src_pos));
267  }
268 
269  return BCT_SUCCESS;
270 }
271 
272 CMD_CODE BCT_get_id(const bct_id_t block, const uint8_t cmd)
273 {
274  BCT_Pos pos;
275  BCT_make_pos(&pos, block, cmd);
276  if (BCT_check_position(&pos) != BCT_SUCCESS) return Cmd_CODE_MAX;
277 
279 }
280 
281 cycle_t BCT_get_ti(const bct_id_t block, const uint8_t cmd)
282 {
283  BCT_Pos pos;
284  BCT_make_pos(&pos, block, cmd);
285  if (BCT_check_position(&pos) != BCT_SUCCESS) return 0;
286 
288 }
289 
290 const uint8_t* BCT_get_param_head(const bct_id_t block, const uint8_t cmd)
291 {
292  BCT_Pos pos;
293  BCT_make_pos(&pos, block, cmd);
294  if (BCT_check_position(&pos) != BCT_SUCCESS)
295  {
296  BCT_make_pos(&pos, 0, 0);
298  }
299 
301 }
302 
303 /* 2018/11/27
304  * 地上局とOBC内部のBCのポインタが混ざっておかしくならないようにするための改修
305  * 詳細はC2Aドキュメント 「ブロックコマンド追加方法.md」
306  */
307 void BCT_store_pos(void)
308 {
311  return;
312 }
313 
314 void BCT_restore_pos(void)
315 {
318  return;
319 }
320 
321 BCT_ACK BCT_make_pos(BCT_Pos* pos, const bct_id_t block, const uint8_t cmd)
322 {
323  pos->block = block;
324  pos->cmd = cmd;
325 
326  return BCT_check_position(pos);
327 }
328 
329 BCT_ACK BCT_swap_address(const bct_id_t block_a, const bct_id_t block_b)
330 {
331  BCT_Table* tmp_bct_table;
332  BCT_Func tmp_bct_func;
333 
334  if (block_a >= BCT_MAX_BLOCKS || block_b >= BCT_MAX_BLOCKS) return BCT_INVALID_BLOCK_NO;
335  if (BCE_is_active(block_a) || BCE_is_active(block_b)) return BCT_DEFECTIVE_BLOCK;
336 
337  tmp_bct_table = block_command_table_.blocks[block_a];
339  block_command_table_.blocks[block_b] = tmp_bct_table;
340 
341  memcpy(&tmp_bct_func, &block_command_table_.func[block_a], sizeof(BCT_Func));
342  memcpy(&block_command_table_.func[block_a], &block_command_table_.func[block_b], sizeof(BCT_Func));
343  memcpy(&block_command_table_.func[block_b], &tmp_bct_func, sizeof(BCT_Func));
344 
345  return BCT_SUCCESS;
346 }
347 
348 BCT_ACK BCT_swap_contents(const bct_id_t block_a, const bct_id_t block_b)
349 {
350  int i;
351 
352  uint8_t tmp_length, length_a, length_b;
353  BCT_CmdData tmp_bct_cmddata;
354 
355  if (block_a >= BCT_MAX_BLOCKS || block_b >= BCT_MAX_BLOCKS) return BCT_INVALID_BLOCK_NO;
356  if (BCE_is_active(block_a) || BCE_is_active(block_b)) return BCT_DEFECTIVE_BLOCK;
357 
358  length_a = BCT_get_bc_length(block_a);
359  length_b = BCT_get_bc_length(block_b);
360  BCT_set_bc_length_(block_a, length_b);
361  BCT_set_bc_length_(block_b, length_a);
362 
363  tmp_length = (uint8_t)((length_a >= length_b) ? length_a : length_b);
364 
365  for (i = 0; i < tmp_length; ++i)
366  {
367  BCT_Pos pos_a, pos_b;
368  BCT_CmdData* cmd_a;
369  BCT_CmdData* cmd_b;
370 
371  BCT_make_pos(&pos_a, block_a, (uint8_t)i);
372  BCT_make_pos(&pos_b, block_b, (uint8_t)i);
373 
374  cmd_a = BCT_get_bc_cmd_data_(&pos_a);
375  cmd_b = BCT_get_bc_cmd_data_(&pos_b);
376  memcpy(&tmp_bct_cmddata, cmd_a, sizeof(BCT_CmdData));
377  BCT_set_bc_cmd_data_(&pos_a, cmd_b);
378  BCT_set_bc_cmd_data_(&pos_b, &tmp_bct_cmddata);
379 
380  WDT_clear_wdt(); // 時間がかかるので
381  }
382 
383  return BCT_SUCCESS;
384 }
385 
387 {
388  switch (ack)
389  {
390  case BCT_SUCCESS:
391  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)ack);
392 
393  // FIXME: これだめじゃん?
395  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)ack);
396 
397  case BCT_INVALID_CMD_NO:
398  return CCP_make_cmd_ret(CCP_EXEC_CMD_NOT_DEFINED, (uint32_t)ack);
399 
400  case BCT_DEFECTIVE_BLOCK:
401  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
402 
403  case BCT_CMD_TOO_LONG:
404  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)ack);
405 
406  case BCT_BC_FULL:
407  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
408 
409  case BCT_ZERO_PERIOD:
410  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)ack);
411 
412  // FIXME: これだめじゃん?
413  default:
414  return CCP_make_cmd_ret(CCP_EXEC_UNKNOWN, (uint32_t)ack);
415  }
416 }
417 
419 {
420  bct_id_t block;
421  BCT_ACK ack;
422 
423  if (CCP_get_param_len(packet) != SIZE_OF_BCT_ID_T)
424  {
425  // パラメータはブロック番号
427  }
428 
429  // パラメータを読み出し。
431 
432  // 指定されたブロック番号のクリアを実行。
433  ack = BCT_clear_block(block);
434 
436 }
437 
439 {
440  if (block >= BCT_MAX_BLOCKS) return BCT_INVALID_BLOCK_NO;
441 
444  BCT_set_bc_length_(block, 0);
445 
446  BCE_clear_block(block);
447 
448  return BCT_SUCCESS;
449 }
450 
452 {
453  const unsigned char* param = CCP_get_param_head(packet);
454  BCT_Pos pos;
455  BCT_ACK ack;
456 
457  if (CCP_get_param_len(packet) != (SIZE_OF_BCT_ID_T + 1))
458  {
459  // パラメータはブロック番号とコマンド番号1Byte。
461  }
462 
463  // パラメータを読み出し
464  ENDIAN_memcpy(&pos.block, param, SIZE_OF_BCT_ID_T);
465  pos.cmd = param[SIZE_OF_BCT_ID_T];
466 
467  ack = BCT_set_position_(&pos);
468 
470 }
471 
473 {
474  const unsigned char* param = CCP_get_param_head(packet);
475  uint16_t dst_block, src_block;
476  BCT_ACK ack;
477 
479  ENDIAN_memcpy(&dst_block, param, SIZE_OF_BCT_ID_T);
480  ENDIAN_memcpy(&src_block, param + SIZE_OF_BCT_ID_T, SIZE_OF_BCT_ID_T);
481 
482  ack = BCT_copy_bct(dst_block, src_block);
484 }
485 
487 {
488  CMD_CODE cmd_id = (CMD_CODE)CCP_get_param_from_packet(packet, 0, uint16_t);
489  cycle_t ti = (cycle_t)CCP_get_param_from_packet(packet, 1, uint32_t);
491  uint8_t cmd = CCP_get_param_from_packet(packet, 3, uint8_t);
492 
493  BCT_Pos pos;
494  BCT_CmdData new_bct_cmddata; // FIXME: BCT_CmdData <-> CTCP
495  // FIXME: TCP → SpacePacket 大工事が終わったら直す
496  // CCP ならまだしも CSP 依存はやばい
497  uint8_t new_cmd_param[BCT_CMD_MAX_LENGTH - SP_PRM_HDR_LEN - CSP_SND_HDR_LEN]; // いったんここにparamをコピーする
498  uint16_t real_param_len = CCP_get_param_len(packet);
499  uint16_t min_cmd_param_len = CA_get_cmd_param_min_len(Cmd_CODE_BCT_OVERWRITE_CMD);
500  uint16_t max_cmd_param_len = min_cmd_param_len + sizeof(new_cmd_param);
501  uint16_t cmd_param_len;
502 
503  // raw なので引数長チェック
504  if (real_param_len < min_cmd_param_len || real_param_len > max_cmd_param_len) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_LENGTH);
505 
506  cmd_param_len = real_param_len - min_cmd_param_len;
507  CCP_get_raw_param_from_packet(packet, new_cmd_param, cmd_param_len);
508 
509  BCT_make_pos(&pos, block, cmd);
510  CCP_form_tlc((CommonCmdPacket*)&new_bct_cmddata, ti, cmd_id, new_cmd_param, cmd_param_len);
511  BCT_overwrite_cmd(&pos, (CommonCmdPacket*)&new_bct_cmddata);
512 
514 }
515 
516 // 長さ 10 の BC に NOP を登録するコマンド. 使用前提が狭すぎるか??
517 // パス運用時に使用するので, 一応厳密にしておいたほうがいい気もする.
519 {
520  static CommonCmdPacket temp_packet_;
521  cycle_t ti;
522  uint8_t num_nop = CCP_get_param_from_packet(packet, 0, uint8_t);
523 
524  if (num_nop > 10 || num_nop < 1) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_PARAMETER);
526 
527  for (ti = 11 - (cycle_t)num_nop; ti < 11; ++ti)
528  {
529  CCP_form_tlc(&temp_packet_, ti, Cmd_CODE_NOP, NULL, 0);
530  BCT_register_cmd(&temp_packet_);
531  }
532 
534 }
535 
536 #pragma section
void BC_load_defaults(void)
各ブロックコマンドIDに中身の初期値をロードしていく
ブロックコマンド定義
BCT_ACK BCE_clear_block(const bct_id_t block)
指定された block の BCE を初期化
const BlockCommandExecutor *const block_command_executor
uint8_t BCE_is_active(const bct_id_t block)
BCT の length の getter
void BCE_load_default_func_pointer(void)
BCE_Params にデフォルトの関数ポインタを入れる
BCTの実行周りの関数, パラメーター
static void BCT_load_default_func_pointer_(void)
BCT_Func にデフォルトの関数ポインタを入れる
BCT_ACK BCT_copy_bct(const bct_id_t dst_block, const bct_id_t src_block)
BCT の中身を 他の BCT に COPY する
const uint8_t * BCT_get_param_head(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の param_head の getter
BCT_ACK BCT_overwrite_cmd(const BCT_Pos *pos, const CommonCmdPacket *packet)
既に登録されている BC の Cmd の中身を外部から上書きする
CCP_CmdRet Cmd_BCT_FILL_NOP(const CommonCmdPacket *packet)
BCT_ACK BCT_clear_block(const bct_id_t block)
指定された block の BCT を初期化する
cycle_t BCT_get_ti(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の TI の getter
void BCT_restore_pos(void)
pos を pos_stored から復旧
BCT_ACK BCT_make_pos(BCT_Pos *pos, const bct_id_t block, const uint8_t cmd)
BCT_Pos* を引数から作る
CCP_CmdRet Cmd_BCT_OVERWRITE_CMD(const CommonCmdPacket *packet)
static uint8_t BC_get_bc_length_default_(const bct_id_t block)
CCP_CmdRet Cmd_BCT_SET_BLOCK_POSITION(const CommonCmdPacket *packet)
static void BC_set_bc_cmd_data_default_(const BCT_Pos *pos, const BCT_CmdData *value)
static void BCT_set_bc_cmd_data_(const BCT_Pos *pos, const BCT_CmdData *value)
BCT_ACK BCT_load_cmd(const BCT_Pos *pos, CommonCmdPacket *packet)
保存データを CCP にコピーする.
void BCT_initialize(void)
BCT の初期化関数
const BCT_CmdData * BCT_get_bc_cmd_data(const BCT_Pos *pos)
BCT_CmdData の const pointer getter
static void BCT_set_bc_length_(const bct_id_t block, uint8_t length)
static void BCT_clear_pos_(void)
pos, pos_stored を initialize
const BlockCommandTable *const block_command_table
CCP_CmdRet Cmd_BCT_CLEAR_BLOCK(const CommonCmdPacket *packet)
CMD_CODE BCT_get_id(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の CMD_CODE の getter
static BCT_ACK BCT_save_cmd_(const BCT_Pos *pos, const CommonCmdPacket *packet)
pos の指す場所に packet の内容を保存 (TCP_PRM_HDR_LEN の長さも考慮)
static BCT_CmdData * BCT_get_bc_cmd_data_(const BCT_Pos *pos)
void BCT_store_pos(void)
pos を pos_stored に保存
static void BC_set_bc_length_default_(const bct_id_t block, uint8_t length)
CCP_CmdRet BCT_convert_bct_ack_to_ccp_cmd_ret(BCT_ACK ack)
返り値用 enum 変換用関数
static BCT_CmdData * BC_get_bc_cmd_data_default_(const BCT_Pos *pos)
BCT_ACK BCT_swap_contents(const bct_id_t block_a, const bct_id_t block_b)
BCT の block の指す中身を入れ替える
BCT_ACK BCT_swap_address(const bct_id_t block_a, const bct_id_t block_b)
BCT の block の指すポインタ & func を入れ替える
CCP_CmdRet Cmd_BCT_COPY_BCT(const CommonCmdPacket *packet)
static BCT_ACK BCT_set_position_(const BCT_Pos *pos)
uint8_t BCT_get_bc_length(const bct_id_t block)
BCT の length の getter
BCT_ACK BCT_check_position(const BCT_Pos *pos)
BCT_Pos* の validate
static BlockCommandTable block_command_table_
BCT_ACK BCT_register_cmd(const CommonCmdPacket *packet)
Cmd を block_command_table->pos に登録する
BCTの定義, BCT周りの関数
#define SIZE_OF_BCT_ID_T
bct_id_t の型サイズ.メモリインパクトがそれなりにあるので,可変に
#define BCT_CMD_MAX_LENGTH
#define BCT_MAX_BLOCKS
BCのIDの最大数
uint16_t bct_id_t
BCT_ACK
BCT 関係の関数のエラーステータス
@ BCT_SUCCESS
@ BCT_CMD_TOO_LONG
@ BCT_INVALID_BLOCK_NO
@ BCT_ZERO_PERIOD
@ BCT_INVALID_CMD_NO
@ BCT_DEFECTIVE_BLOCK
@ BCT_BC_FULL
@ BCT_ISORATED_CMD
#define BCT_MAX_CMD_NUM
1つのBCに最大何個のコマンドを挿入できるか
void BCUS_load_user_settings(BlockCommandTable *block_command_table, BlockCommandExecutor *block_command_executor)
BCT, BCE に関してのメモリ確保や getter, setter を user settings として上書きする
int BCUS_bc_should_clear(const bct_id_t block)
その block をクリアすべきかどうか判別する
CCSDS で規定される Space Packet の コマンド版の実装
#define CSP_SND_HDR_LEN
Secondary Header 長
uint16_t CA_get_cmd_param_min_len(CMD_CODE cmd_code)
最小コマンドパラメタ長を取得する
コマンドの実行・登録,コマンド関連処理
コマンド定義
@ Cmd_CODE_BCT_OVERWRITE_CMD
@ Cmd_CODE_MAX
@ Cmd_CODE_NOP
uint16_t CCP_get_packet_len(const CommonCmdPacket *packet)
パケット長を取得
@ CCP_EXEC_UNKNOWN
内部処理用.使わない.
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_LENGTH
コマンド実行時のコマンド引数長エラー
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_CMD_NOT_DEFINED
CA_execute_cmd で用いる
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
CMD_CODE CCP_get_id(const CommonCmdPacket *packet)
CMD ID を取得
uint16_t CCP_get_param_len(const CommonCmdPacket *packet)
CMD パラメタ長を取得
const uint8_t * CCP_get_param_head(const CommonCmdPacket *packet)
先頭のパラメタのポインタを取得
cycle_t CCP_get_ti(const CommonCmdPacket *packet)
TI を取得
CCP_UTIL_ACK CCP_form_tlc(CommonCmdPacket *packet, cycle_t ti, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
Timeline command を生成
CCP_CmdRet CCP_make_cmd_ret(CCP_EXEC_STS exec_sts, uint32_t err_code)
コマンド返り値である CCP_CmdRet を作成
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
uint16_t CCP_get_raw_param_from_packet(const CommonCmdPacket *packet, void *dest, uint16_t max_copy_len)
CCP packet から,RAW コマンド引数を取得する
CCP の汎用 Utility
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
uint32_t cycle_t
Definition: obc_time.h:10
C2A 全体を流れる Common Packet の配送を制御する
CCSDS で規定される Space Packet の実装
#define SP_PRM_HDR_LEN
Packet Primary Header 長
Definition: space_packet.h:43
Cmd の保存場所
各setter, getter が入る
void(* set_bc_length_)(const bct_id_t block, uint8_t length)
length の setter
void(* set_bc_cmd_data_)(const BCT_Pos *pos, const BCT_CmdData *value)
cmd_data の setter
uint8_t(* get_bc_length_)(const bct_id_t block)
length の getter
BCT_CmdData *(* get_bc_cmd_data_)(const BCT_Pos *pos)
cmd_data の getter
BCT内での作業中の位置情報
uint8_t cmd
そのブロック内でどのコマンドを指すか
bct_id_t block
ブロックの位置情報
BCT の本体. 実際に BC の cmd が確保されている
uint8_t length
cmds に保存されているコマンド数
BCT_CmdData cmds[BCT_MAX_CMD_NUM]
各 cmd が保存される配列
実行周り全体の struct
BCT 全体の構造体
BCT_Table * blocks[BCT_MAX_BLOCKS]
BCTの各BC.好きな場所で確保できる様にポインタにしている
BCT_Pos pos
登録などの作業中の位置情報
BCT_Func func[BCT_MAX_BLOCKS]
BCT関係の関数
コマンド返り値
Space Packet (コマンド用)
uint8_t packet[CSP_MAX_LEN]
void WDT_clear_wdt(void)
WDTのクリア