C2A_Core
common_cmd_packet_util.c
[詳解]
1 #pragma section REPRO
7 #include "command_analyze.h"
8 #include "../Library/endian.h"
9 #include <stddef.h> // for NULL
10 #include <string.h>
11 
16 typedef struct
17 {
19  uint8_t err_flag;
20  uint8_t param_idx;
21  uint16_t len;
24 
27 
28 
35 
45 static void CCP_form_rtc_(CommonCmdPacket* packet, CMD_CODE cmd_id, const uint8_t* param, uint16_t len);
46 
54 static CCP_UTIL_ACK CCP_calc_param_offset_(CMD_CODE cmd_id, uint8_t n, uint16_t* offset);
55 
62 
70 static CCP_UTIL_ACK CCP_prepare_param_for_packet_(void* param, uint8_t byte);
71 
72 
73 CCP_CmdRet CCP_make_cmd_ret(CCP_EXEC_STS exec_sts, uint32_t err_code)
74 {
75  CCP_CmdRet ret;
76  ret.exec_sts = exec_sts;
77  ret.err_code = err_code;
78  return ret;
79 }
80 
81 
83 {
84  return CCP_make_cmd_ret(exec_sts, 0);
85 }
86 
87 
89 {
90  CCP_form_rtc(packet, Cmd_CODE_NOP, NULL, 0);
91 }
92 
93 
95 {
96  // FIXME: この uint32_t は環境依存なので,依存しないように直す
97  // 適切に直すことで, CCP_form_tlc の返り値をみなくて良くなるはず.
98  // Cmd_AM_EXECUTE_APP の引数取得部分と同時に直すべきだが,パラメタサイズは CmdDB から取得可能なはず.
99  const uint8_t* param;
100  uint16_t len;
101 
104  CCP_get_prepared_param_for_packet(&param, &len);
105 
106  CCP_form_tlc(packet, ti, Cmd_CODE_AM_EXECUTE_APP, param, len);
107 }
108 
109 
110 CCP_UTIL_ACK CCP_form_rtc(CommonCmdPacket* packet, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
111 {
112  if (packet == NULL)
113  {
114  return CCP_UTIL_ACK_PARAM_ERR;
115  }
116 
117  if (param == NULL && len != 0)
118  {
119  CCP_form_nop_rtc_(packet);
120  return CCP_UTIL_ACK_PARAM_ERR;
121  }
122 
123  if (CA_ckeck_cmd_param_len(cmd_id, len) != CA_ACK_OK)
124  {
125  CCP_form_nop_rtc_(packet);
126  return CCP_UTIL_ACK_PARAM_ERR;
127  }
128 
129  CCP_form_rtc_(packet, cmd_id, param, len);
130 
131  return CCP_UTIL_ACK_OK;
132 }
133 
134 
135 CCP_UTIL_ACK CCP_form_tlc(CommonCmdPacket* packet, cycle_t ti, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
136 {
137  if (packet == NULL)
138  {
139  return CCP_UTIL_ACK_PARAM_ERR;
140  }
141 
142  if (param == NULL && len != 0)
143  {
144  CCP_form_nop_rtc_(packet);
145  CCP_convert_rtc_to_tlc(packet, ti);
146  return CCP_UTIL_ACK_PARAM_ERR;
147  }
148 
149  if (CA_ckeck_cmd_param_len(cmd_id, len) != CA_ACK_OK)
150  {
151  CCP_form_nop_rtc_(packet);
152  CCP_convert_rtc_to_tlc(packet, ti);
153  return CCP_UTIL_ACK_PARAM_ERR;
154  }
155 
156  CCP_form_rtc_(packet, cmd_id, param, len);
157  CCP_convert_rtc_to_tlc(packet, ti);
158 
159  return CCP_UTIL_ACK_OK;
160 }
161 
162 
163 CCP_UTIL_ACK CCP_form_rtc_to_other_obc(CommonCmdPacket* packet, APID apid, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
164 {
165  if (packet == NULL)
166  {
167  return CCP_UTIL_ACK_PARAM_ERR;
168  }
169 
170  if (param == NULL && len != 0)
171  {
172  CCP_form_nop_rtc_(packet);
173  return CCP_UTIL_ACK_PARAM_ERR;
174  }
175 
176  // NOTE: 他の OBC のコマンドは cmd_table に保存されていないので param チェックできない
177 
178  CCP_form_rtc_(packet, cmd_id, param, len);
179  CCP_set_apid(packet, apid);
180 
181  return CCP_UTIL_ACK_OK;
182 }
183 
184 
185 CCP_UTIL_ACK CCP_form_tlc_to_other_obc(CommonCmdPacket* packet, cycle_t ti, APID apid, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
186 {
187  if (packet == NULL)
188  {
189  return CCP_UTIL_ACK_PARAM_ERR;
190  }
191 
192  if (param == NULL && len != 0)
193  {
194  CCP_form_nop_rtc_(packet);
195  CCP_convert_rtc_to_tlc(packet, ti);
196  return CCP_UTIL_ACK_PARAM_ERR;
197  }
198 
199  // NOTE: 他の OBC のコマンドは cmd_table に保存されていないので param チェックできない
200 
201  CCP_form_rtc_(packet, cmd_id, param, len);
202  CCP_convert_rtc_to_tlc(packet, ti);
203  CCP_set_apid(packet, apid);
204 
205  return CCP_UTIL_ACK_OK;
206 }
207 
208 
210 {
211  const uint8_t* param;
212  uint16_t len;
213 
214  if (packet == NULL)
215  {
216  return CCP_UTIL_ACK_PARAM_ERR;
217  }
218 
219  if ((tl_no >= TLCD_ID_MAX) || (block_no >= BCT_MAX_BLOCKS))
220  {
221  // タイムラインのline番号、ブロックコマンド番号が範囲外の場合異常判定
222  CCP_form_nop_rtc_(packet);
223  return CCP_UTIL_ACK_PARAM_ERR;
224  }
225 
229  CCP_get_prepared_param_for_packet(&param, &len);
230 
231  return CCP_form_rtc(packet, Cmd_CODE_TLCD_DEPLOY_BLOCK, param, len);
232 }
233 
234 
235 static void CCP_form_rtc_(CommonCmdPacket* packet, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
236 {
237  CCP_set_common_hdr(packet);
238  CCP_set_id(packet, cmd_id);
241  CCP_set_ti(packet, 0); // RTの場合、TIは0固定
242  CCP_set_param(packet, param, len);
243 }
244 
245 
247 {
248  if (packet == NULL) return;
249  CCP_set_exec_type(packet, CCP_EXEC_TYPE_TL_FROM_GS); // TL なので,一旦仮で入れる
250  CCP_set_ti(packet, ti);
251 }
252 
253 
254 PH_ACK CCP_register_rtc(CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
255 {
256  if (CCP_form_rtc(&CCP_util_packet_, cmd_id, param, len) != CCP_UTIL_ACK_OK)
257  {
258  return PH_ACK_INVALID_PACKET;
259  }
260 
262 }
263 
264 
265 PH_ACK CCP_register_tlc(cycle_t ti, TLCD_ID tlcd_id, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
266 {
268 
269  if (type == CCP_EXEC_TYPE_UNKNOWN)
270  {
271  return PH_ACK_INVALID_PACKET;
272  }
273 
274  if (CCP_form_tlc(&CCP_util_packet_, ti, cmd_id, param, len) != CCP_UTIL_ACK_OK)
275  {
276  return PH_ACK_INVALID_PACKET;
277  }
278 
281 }
282 
283 
284 PH_ACK CCP_register_tlc_asap(cycle_t ti, TLCD_ID tlcd_id, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
285 {
288 
289  if (pl == NULL) return PH_ACK_INVALID_PACKET;
290  if (PL_is_full(pl)) return PH_ACK_PL_LIST_FULL;
291 
292  if (!PL_is_empty(pl))
293  {
294  cycle_t head = CCP_get_ti((const CommonCmdPacket*)(PL_get_head(pl)->packet));
295  cycle_t tail = CCP_get_ti((const CommonCmdPacket*)(PL_get_tail(pl)->packet));
296 
297  if (head <= ti && ti <= tail)
298  {
299  uint16_t i;
300  uint16_t active_nodes = PL_count_active_nodes(pl);
301  const PL_Node* current = PL_get_head(pl);
302 
303  for (i = 0; i < active_nodes; ++i)
304  {
305  cycle_t current_ti;
306 
307  if (current == NULL) break;
308  current_ti = CCP_get_ti((const CommonCmdPacket*)(current->packet));
309  if (current_ti < ti)
310  {
311  // do nothing
312  }
313  else if (current_ti == ti)
314  {
315  ++ti;
316  }
317  else
318  {
319  break;
320  }
321 
322  current = current->next;
323  }
324  }
325  }
326 
327  if (CCP_form_tlc(&CCP_util_packet_, ti, cmd_id, param, len) != CCP_UTIL_ACK_OK)
328  {
329  return PH_ACK_INVALID_PACKET;
330  }
333 }
334 
335 
336 CCP_CmdRet CCP_form_and_exec_rtc(CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
337 {
338  CCP_UTIL_ACK ret = CCP_form_rtc(&CCP_util_packet_, cmd_id, param, len);
339  if (ret != CCP_UTIL_ACK_OK)
340  {
342  }
343 
345 }
346 
347 
348 CCP_CmdRet CCP_form_and_exec_rtc_to_other_obc(APID apid, CMD_CODE cmd_id, const uint8_t* param, uint16_t len)
349 {
350  CCP_UTIL_ACK ret = CCP_form_rtc_to_other_obc(&CCP_util_packet_, apid, cmd_id, param, len);
351  if (ret != CCP_UTIL_ACK_OK)
352  {
354  }
355 
357 }
358 
359 
361 {
363  if (ret != CCP_UTIL_ACK_OK)
364  {
366  }
367 
369 }
370 
371 
373 {
374  switch (tlcd_id)
375  {
376  case TLCD_ID_FROM_GS:
378 
379  case TLCD_ID_DEPLOY_BC:
381 
382  case TLCD_ID_DEPLOY_TLM:
384 
385 #ifdef TLCD_ENABLE_MISSION_TL
386  case TLCD_ID_FROM_GS_FOR_MISSION:
387  return CCP_EXEC_TYPE_TL_FOR_MISSION;
388 #endif
389 
390  default:
391  return CCP_EXEC_TYPE_UNKNOWN;
392  }
393 }
394 
395 
396 uint8_t* CCP_get_1byte_param_from_packet(const CommonCmdPacket* packet, uint8_t n)
397 {
398  static uint8_t ret;
399  uint16_t offset = 0;
400  CMD_CODE cmd_id = CCP_get_id(packet);
401  uint8_t param_size = 1;
402  CCP_UTIL_ACK ack;
403 
404  ret = 0;
405 
406  ack = CCP_calc_param_offset_(cmd_id, n, &offset);
407  if (ack != CCP_UTIL_ACK_OK) return &ret;
408 
409  if (CA_get_cmd_param_size(cmd_id, n) != param_size) return &ret;
410 
411  ENDIAN_memcpy(&ret, CCP_get_param_head(packet) + offset, (size_t)param_size);
412  return &ret;
413 }
414 
415 
416 uint16_t* CCP_get_2byte_param_from_packet(const CommonCmdPacket* packet, uint8_t n)
417 {
418  static uint16_t ret;
419  uint16_t offset = 0;
420  CMD_CODE cmd_id = CCP_get_id(packet);
421  uint8_t param_size = 2;
422  CCP_UTIL_ACK ack;
423 
424  ret = 0;
425 
426  ack = CCP_calc_param_offset_(cmd_id, n, &offset);
427  if (ack != CCP_UTIL_ACK_OK) return &ret;
428 
429  if (CA_get_cmd_param_size(cmd_id, n) != param_size) return &ret;
430 
431  ENDIAN_memcpy(&ret, CCP_get_param_head(packet) + offset, (size_t)param_size);
432  return &ret;
433 }
434 
435 
436 uint32_t* CCP_get_4byte_param_from_packet(const CommonCmdPacket* packet, uint8_t n)
437 {
438  static uint32_t ret;
439  uint16_t offset = 0;
440  CMD_CODE cmd_id = CCP_get_id(packet);
441  uint8_t param_size = 4;
442  CCP_UTIL_ACK ack;
443 
444  ret = 0;
445 
446  ack = CCP_calc_param_offset_(cmd_id, n, &offset);
447  if (ack != CCP_UTIL_ACK_OK) return &ret;
448 
449  if (CA_get_cmd_param_size(cmd_id, n) != param_size) return &ret;
450 
451  ENDIAN_memcpy(&ret, CCP_get_param_head(packet) + offset, (size_t)param_size);
452  return &ret;
453 }
454 
455 
456 uint64_t* CCP_get_8byte_param_from_packet(const CommonCmdPacket* packet, uint8_t n)
457 {
458  static uint64_t ret;
459  uint16_t offset = 0;
460  CMD_CODE cmd_id = CCP_get_id(packet);
461  uint8_t param_size = 8;
462  CCP_UTIL_ACK ack;
463 
464  ret = 0;
465 
466  ack = CCP_calc_param_offset_(cmd_id, n, &offset);
467  if (ack != CCP_UTIL_ACK_OK) return &ret;
468 
469  if (CA_get_cmd_param_size(cmd_id, n) != param_size) return &ret;
470 
471  ENDIAN_memcpy(&ret, CCP_get_param_head(packet) + offset, (size_t)param_size);
472  return &ret;
473 }
474 
475 
476 uint16_t CCP_get_raw_param_from_packet(const CommonCmdPacket* packet, void* dest, uint16_t max_copy_len)
477 {
478  uint16_t offset = 0;
479  CMD_CODE cmd_id = CCP_get_id(packet);
480  CCP_UTIL_ACK ack;
481  int32_t copy_len;
482 
483  if (!CA_has_raw_param(cmd_id)) return 0;
484 
485  ack = CCP_calc_param_offset_(cmd_id, (uint8_t)(CA_get_cmd_param_num(cmd_id) - 1), &offset);
486  if (ack != CCP_UTIL_ACK_OK) return 0;
487 
488  copy_len = CCP_get_param_len(packet) - offset;
489  if (copy_len < 0) return 0;
490  if (max_copy_len != 0 && copy_len > max_copy_len)
491  {
492  copy_len = max_copy_len;
493  }
494 
495  memcpy(dest, CCP_get_param_head(packet) + offset, (size_t)copy_len);
496  return (uint16_t)copy_len;
497 }
498 
499 
500 const uint8_t* CCP_get_raw_param_head(const CommonCmdPacket* packet)
501 {
502  uint16_t offset;
503  CMD_CODE cmd_id = CCP_get_id(packet);
504 
505  if (!CA_has_raw_param(cmd_id)) return NULL;
506 
507  offset = CA_get_cmd_param_min_len(cmd_id);
508  return CCP_get_param_head(packet) + offset;
509 }
510 
511 
512 uint16_t CCP_get_raw_param_len(const CommonCmdPacket* packet)
513 {
514  int32_t len;
515  CMD_CODE cmd_id = CCP_get_id(packet);
516 
517  if (!CA_has_raw_param(cmd_id)) return 0;
518 
519  len = CCP_get_param_len(packet) - CA_get_cmd_param_min_len(cmd_id);
520  return (len < 0) ? 0 : (uint16_t)len;
521 }
522 
523 
524 static CCP_UTIL_ACK CCP_calc_param_offset_(CMD_CODE cmd_id, uint8_t n, uint16_t* offset)
525 {
526  uint8_t i;
527  if (cmd_id >= CA_MAX_CMDS) return CCP_UTIL_ACK_PARAM_ERR;
528  if (CA_get_cmd_param_num(cmd_id) <= n) return CCP_UTIL_ACK_PARAM_ERR;
529 
530  *offset = 0;
531  for (i = 0; i < n; ++i)
532  {
533  (*offset) += CA_get_cmd_param_size(cmd_id, i);
534  }
535  return CCP_UTIL_ACK_OK;
536 }
537 
538 
540 {
544  CCP_param_generator_.cmd_id = cmd_id;
545 
547 }
548 
549 
550 CCP_UTIL_ACK CCP_get_prepared_param_for_packet(const uint8_t** param_head, uint16_t* len)
551 {
553  *len = 0;
554  *param_head = CCP_get_param_head(&(p_pg->packet));
555 
556  if (p_pg->err_flag) return CCP_UTIL_ACK_PARAM_ERR;
557  if (CA_get_cmd_param_num(p_pg->cmd_id) != p_pg->param_idx) return CCP_UTIL_ACK_PARAM_ERR;
558 
559  *len = p_pg->len;
560  return CCP_UTIL_ACK_OK;
561 }
562 
563 
565 {
566  return CCP_prepare_param_for_packet_(&param, 1);
567 }
568 
569 
571 {
572  return CCP_prepare_param_for_packet_(&param, 1);
573 }
574 
575 
577 {
578  return CCP_prepare_param_for_packet_(&param, 2);
579 }
580 
581 
583 {
584  return CCP_prepare_param_for_packet_(&param, 2);
585 }
586 
587 
589 {
590  return CCP_prepare_param_for_packet_(&param, 4);
591 }
592 
593 
595 {
596  return CCP_prepare_param_for_packet_(&param, 4);
597 }
598 
599 
601 {
602  return CCP_prepare_param_for_packet_(&param, 8);
603 }
604 
605 
607 {
608  return CCP_prepare_param_for_packet_(&param, 8);
609 }
610 
611 
613 {
614  return CCP_prepare_param_for_packet_(&param, 4);
615 }
616 
617 
619 {
620  return CCP_prepare_param_for_packet_(&param, 8);
621 }
622 
623 
625 {
627 }
628 
629 
630 CCP_UTIL_ACK CCP_prepare_raw_param_for_packet(const uint8_t* param, uint16_t len)
631 {
633  uint16_t offset = CA_get_cmd_param_min_len(p_pg->cmd_id);
634 
635  if (p_pg->err_flag) return CCP_raise_err_at_param_generator_();
637  if (CA_get_cmd_param_num(p_pg->cmd_id) != p_pg->param_idx + 1)
638  {
640  }
641  if (CCP_get_max_param_len() < offset + len) return CCP_raise_err_at_param_generator_();
642  if (p_pg->len != offset) return CCP_raise_err_at_param_generator_();
643 
644  memcpy((void*)(CCP_get_param_head(&(p_pg->packet)) + offset), param, len); // const_cast
645  p_pg->len += len;
646  p_pg->param_idx++;
647  return CCP_UTIL_ACK_OK;
648 }
649 
650 
652 {
654  return CCP_UTIL_ACK_PARAM_ERR;
655 }
656 
657 
658 static CCP_UTIL_ACK CCP_prepare_param_for_packet_(void* param, uint8_t byte)
659 {
661  uint16_t offset = 0;
662 
663  if (p_pg->err_flag) return CCP_raise_err_at_param_generator_();
664  if (CA_get_cmd_param_size(p_pg->cmd_id, p_pg->param_idx) != byte)
665  {
667  }
668  if (CCP_calc_param_offset_(p_pg->cmd_id, p_pg->param_idx, &offset) != CCP_UTIL_ACK_OK)
669  {
671  }
672  if (p_pg->len != offset) return CCP_raise_err_at_param_generator_();
673 
674  ENDIAN_memcpy((void*)(CCP_get_param_head(&(p_pg->packet)) + offset), param, byte); // const_cast
675  p_pg->len += byte;
676  p_pg->param_idx++;
677  return CCP_UTIL_ACK_OK;
678 }
679 
680 #pragma section
APID
Application Process ID
Definition: apid_define.h:17
AR_APP_ID
Definition: app_registry.h:7
#define SIZE_OF_BCT_ID_T
bct_id_t の型サイズ.メモリインパクトがそれなりにあるので,可変に
#define BCT_MAX_BLOCKS
BCのIDの最大数
uint16_t bct_id_t
uint8_t CA_get_cmd_param_num(CMD_CODE cmd_code)
コマンドパラメタ数を取得する
uint8_t CA_get_cmd_param_size(CMD_CODE cmd_code, uint8_t n)
コマンドパラメタサイズを取得する
int CA_has_raw_param(CMD_CODE cmd_code)
RAW パラメタを持っているか?
uint16_t CA_get_cmd_param_min_len(CMD_CODE cmd_code)
最小コマンドパラメタ長を取得する
CA_ACK CA_ckeck_cmd_param_len(CMD_CODE cmd_code, uint16_t param_len)
コマンドパラメタ長をチェックする
コマンドの実行・登録,コマンド関連処理
#define CA_MAX_CMDS
コマンドテーブルサイズ.すなわち登録できる最大コマンド数
@ CA_ACK_OK
正常終了
@ Cmd_CODE_TLCD_DEPLOY_BLOCK
@ Cmd_CODE_NOP
@ Cmd_CODE_AM_EXECUTE_APP
void CCP_set_param(CommonCmdPacket *packet, const uint8_t *param, uint16_t len)
パラメタを設定
uint16_t CCP_get_max_param_len(void)
CMD パラメタ長の最大値を取得
void CCP_set_apid(CommonCmdPacket *packet, APID apid)
APID を設定
void CCP_set_ti(CommonCmdPacket *packet, cycle_t ti)
TI を設定
void CCP_set_common_hdr(CommonCmdPacket *packet)
共通部分の Header を構築
CCP_EXEC_STS
コマンド実行結果コード
@ CCP_EXEC_PACKET_FMT_ERR
packet handler, ccp util で用いる
CMD_CODE CCP_get_id(const CommonCmdPacket *packet)
CMD ID を取得
void CCP_set_dest_type(CommonCmdPacket *packet, CCP_DEST_TYPE type)
DEST_TYPE を設定
uint16_t CCP_get_param_len(const CommonCmdPacket *packet)
CMD パラメタ長を取得
void CCP_set_exec_type(CommonCmdPacket *packet, CCP_EXEC_TYPE type)
EXEC_TYPE を設定
const uint8_t * CCP_get_param_head(const CommonCmdPacket *packet)
先頭のパラメタのポインタを取得
cycle_t CCP_get_ti(const CommonCmdPacket *packet)
TI を取得
void CCP_set_id(CommonCmdPacket *packet, CMD_CODE id)
CMD ID を設定
CCP_EXEC_TYPE
コマンド実行種別
@ CCP_EXEC_TYPE_UNKNOWN
@ CCP_EXEC_TYPE_TL_DEPLOY_BC
@ CCP_EXEC_TYPE_RT
RT : Realtime Command
@ CCP_EXEC_TYPE_TL_DEPLOY_TLM
@ CCP_EXEC_TYPE_TL_FROM_GS
TL : Timeline Command
@ CCP_DEST_TYPE_TO_ME
uint64_t * CCP_get_8byte_param_from_packet(const CommonCmdPacket *packet, uint8_t n)
CCP packet から,サイズが 8 byte のコマンド引数を取得する
void CCP_form_nop_rtc_(CommonCmdPacket *packet)
NOP cmd の RTC CCP を作る
static CommonCmdPacket CCP_util_packet_
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_UTIL_ACK CCP_prepare_int64_param_for_packet(int64_t param)
Param Generator で int64_t のパラメタを登録
CCP_UTIL_ACK CCP_prepare_uint32_param_for_packet(uint32_t param)
Param Generator で uint32_t のパラメタを登録
CCP_UTIL_ACK CCP_prepare_int8_param_for_packet(int8_t param)
Param Generator で int8_t のパラメタを登録
CCP_UTIL_ACK CCP_prepare_uint8_param_for_packet(uint8_t param)
Param Generator で uint8_t のパラメタを登録
CCP_UTIL_ACK CCP_prepare_int16_param_for_packet(int16_t param)
Param Generator で int16_t のパラメタを登録
static void CCP_form_rtc_(CommonCmdPacket *packet, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
RealTime Command を生成する. CCP_form_* の実体.
CCP_UTIL_ACK CCP_prepare_uint64_param_for_packet(uint64_t param)
Param Generator で uint64_t のパラメタを登録
uint16_t * CCP_get_2byte_param_from_packet(const CommonCmdPacket *packet, uint8_t n)
CCP packet から,サイズが 2 byte のコマンド引数を取得する
CCP_UTIL_ACK CCP_prepare_int32_param_for_packet(int32_t param)
Param Generator で int32_t のパラメタを登録
CCP_UTIL_ACK CCP_form_tlc_to_other_obc(CommonCmdPacket *packet, cycle_t ti, APID apid, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
他の OBC のコマンドを TL として生成
CCP_CmdRet CCP_form_and_exec_rtc(CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
Realtime command を生成し,即時実行する
CCP_CmdRet CCP_form_and_exec_block_deploy_cmd(TLCD_ID tl_no, bct_id_t block_no)
BC展開 command を生成し,即時実行する
void CCP_form_app_cmd(CommonCmdPacket *packet, cycle_t ti, AR_APP_ID id)
App 実行 TL コマンドを生成
CCP_UTIL_ACK CCP_prepare_uint16_param_for_packet(uint16_t param)
Param Generator で uint16_t のパラメタを登録
static CCP_ParamGenerator CCP_param_generator_
uint32_t * CCP_get_4byte_param_from_packet(const CommonCmdPacket *packet, uint8_t n)
CCP packet から,サイズが 4 byte のコマンド引数を取得する
PH_ACK CCP_register_tlc_asap(cycle_t ti, TLCD_ID tlcd_id, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
Timeline command を登録 (ASAP 版)
PH_ACK CCP_register_tlc(cycle_t ti, TLCD_ID tlcd_id, 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_UTIL_ACK CCP_prepare_bct_id_param_for_packet(bct_id_t param)
Param Generator で bct_id_t のパラメタを登録
CCP_EXEC_TYPE CCP_get_exec_type_from_tlcd_id(TLCD_ID tlcd_id)
TLCD ID から CCP_EXEC_TYPE を取得する
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
CCP_UTIL_ACK CCP_prepare_double_param_for_packet(double param)
Param Generator で double のパラメタを登録
static CCP_UTIL_ACK CCP_raise_err_at_param_generator_(void)
Param Generator でエラーを発生した際に呼ぶエラー保存関数
void CCP_init_param_for_packet(CMD_CODE cmd_id)
Param Generator を初期化
uint8_t * CCP_get_1byte_param_from_packet(const CommonCmdPacket *packet, uint8_t n)
CCP packet から,サイズが 1 byte のコマンド引数を取得する
CCP_UTIL_ACK CCP_prepare_float_param_for_packet(float param)
Param Generator で float のパラメタを登録
CCP_CmdRet CCP_form_and_exec_rtc_to_other_obc(APID apid, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
他の OBC のコマンドを RT として生成し,即時実行する
uint16_t CCP_get_raw_param_from_packet(const CommonCmdPacket *packet, void *dest, uint16_t max_copy_len)
CCP packet から,RAW コマンド引数を取得する
CCP_UTIL_ACK CCP_form_block_deploy_cmd(CommonCmdPacket *packet, TLCD_ID tl_no, bct_id_t block_no)
BC展開 Realtime command を生成
static CCP_UTIL_ACK CCP_calc_param_offset_(CMD_CODE cmd_id, uint8_t n, uint16_t *offset)
CCP パラメタ開始位置に対する n 番目の引数の offset を計算する
const uint8_t * CCP_get_raw_param_head(const CommonCmdPacket *packet)
CCP packet から,RAW コマンド引数の先頭ポインタを取得する
CCP_UTIL_ACK CCP_get_prepared_param_for_packet(const uint8_t **param_head, uint16_t *len)
Param Generator から完成した param を取得する
void CCP_convert_rtc_to_tlc(CommonCmdPacket *packet, cycle_t ti)
Realtime Command から Timeline Command へ変換
CCP_UTIL_ACK CCP_form_rtc_to_other_obc(CommonCmdPacket *packet, APID apid, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
他の OBC のコマンドを RT として生成
CCP_UTIL_ACK CCP_prepare_raw_param_for_packet(const uint8_t *param, uint16_t len)
Param Generator で raw パラメタを登録
PH_ACK CCP_register_rtc(CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
Realtime command を登録
static CCP_UTIL_ACK CCP_prepare_param_for_packet_(void *param, uint8_t byte)
Param Generator で n byte のパラメタを登録
CCP_UTIL_ACK CCP_form_rtc(CommonCmdPacket *packet, CMD_CODE cmd_id, const uint8_t *param, uint16_t len)
Realtime command を生成
uint16_t CCP_get_raw_param_len(const CommonCmdPacket *packet)
CCP packet から,RAW コマンド引数の長さを返す
CCP の汎用 Utility
CCP_UTIL_ACK
CCP Utility の汎用返り値
@ CCP_UTIL_ACK_OK
正常終了
@ CCP_UTIL_ACK_PARAM_ERR
パラメタエラー
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
const PacketList * PH_get_packet_list_from_exec_type(CCP_EXEC_TYPE type)
CCP_EXEC_TYPE から PacketList を取得する
PH_ACK PH_analyze_cmd_packet(const CommonCmdPacket *packet)
CCP を解析する
CCP_CmdRet PH_dispatch_command(const CommonCmdPacket *packet)
CCP をコマンドとして解釈して実行,ないしは別機器へ配送する
PH_ACK
@ PH_ACK_INVALID_PACKET
無効な Packet
@ PH_ACK_PL_LIST_FULL
PL が一杯だった
const PL_Node * PL_get_tail(const PacketList *pl)
PacketList の active な末端 Node を取得
Definition: packet_list.c:156
const PL_Node * PL_get_head(const PacketList *pl)
PacketList の active な先頭 Node を取得
Definition: packet_list.c:150
uint16_t PL_count_active_nodes(const PacketList *pl)
PacketList で有効な(実行待ち) Node 数を返す
Definition: packet_list.c:104
int PL_is_full(const PacketList *pl)
PacketList が満杯かどうか
Definition: packet_list.c:144
int PL_is_empty(const PacketList *pl)
PacketList が空かどうか
Definition: packet_list.c:138
コマンド返り値
uint32_t err_code
各 Cmd ユニークなエラーコード.各 App で定義する enum などを入れることを想定.
CCP_EXEC_STS exec_sts
CCP_EXEC_STS.Cmd の統一的なエラーコード
param を構築するための一時領域
uint8_t err_flag
エラーが発生したか
uint8_t param_idx
今どこまでの param を作ったか
CommonCmdPacket packet
作成する CCP の param を保存するためのバッファ
CMD_CODE cmd_id
どのコマンドの param か
Space Packet (コマンド用)
片方向リストを構成する各 Node
Definition: packet_list.h:59
void * packet
片方向リストに格納される packet. どのような型でも良いように, void.(基本的には CTCP, CTP, CCP を想定)
Definition: packet_list.h:60
struct PL_Node * next
次の Node (片方向リスト)
Definition: packet_list.h:61
パケットリスト本体
Definition: packet_list.h:73
TLCD_ID
TimeLineを選ぶときに統一的に使うコード