C2A_Core
telemetry_manager.c
[詳解]
1 #pragma section REPRO
7 #include "telemetry_manager.h"
8 
9 #include <string.h> // for memsetなどのmem系
10 
11 #include "./divided_cmd_utility.h"
12 #include "../TlmCmd/block_command_loader.h"
13 #include "../TlmCmd/block_command_executor.h"
14 #include "../TlmCmd/command_analyze.h"
15 #include "../Library/print.h"
16 #include "../Library/endian.h"
17 #include "../Library/result.h"
18 #include "../TlmCmd/common_cmd_packet_util.h"
22 
23 // default 設定
24 // BC にどの TLM_MGR_BC_ROLE を割り当てるか
25 #define TLM_MGR_BC_ROLE_AT_BC_0 (TLM_MGR_BC_ROLE_HK_TLM)
26 #define TLM_MGR_BC_ROLE_AT_BC_1 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
27 #define TLM_MGR_BC_ROLE_AT_BC_2 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
28 #define TLM_MGR_BC_ROLE_AT_BC_3 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
29 #define TLM_MGR_BC_ROLE_AT_BC_4 (TLM_MGR_BC_ROLE_LOW_FREQ_TLM) // TLM_MGR_BC_ROLE_HIGH_FREQ_TLM が固まらないようにここに入れている
30 #define TLM_MGR_BC_ROLE_AT_BC_5 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
31 #define TLM_MGR_BC_ROLE_AT_BC_6 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
32 #define TLM_MGR_BC_ROLE_AT_BC_7 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
33 #define TLM_MGR_BC_ROLE_AT_BC_8 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
34 #define TLM_MGR_BC_ROLE_AT_BC_9 (TLM_MGR_BC_ROLE_LOW_FREQ_TLM) // TLM_MGR_BC_ROLE_HIGH_FREQ_TLM が固まらないようにここに入れている
35 
36 // user 設定
39 
40 // 現状, BC#9 は low ではないとだめ (deploy と combine するため)
41 #if !(TLM_MGR_BC_ROLE_AT_BC_9 == TLM_MGR_BC_ROLE_LOW_FREQ_TLM)
42 #error TLM_MGR_BC_ROLE_AT_BC_9 should be TLM_MGR_BC_ROLE_LOW_FREQ_TLM
43 #endif
44 
50 static void TLM_MGR_init_by_am_(void);
51 
58 static RESULT TLM_MGR_init_1_(void);
59 
66 static RESULT TLM_MGR_init_2_(void);
67 
73 static RESULT TLM_MGR_clear_info_(void);
74 
82 static RESULT TLM_MGR_regigster_bc_settings(uint8_t cmd_table_idx,
83  bct_id_t bc_id,
84  TLM_MGR_BC_ROLE bc_role);
85 
92 static RESULT TLM_MGR_add_bc_settings_to_register_info_(uint8_t cmd_table_idx,
93  TLM_MGR_RegisterInfo* register_info);
94 
105  TLM_MGR_BC_ROLE bc_role,
106  TLM_MGR_RegisterInfo* register_info);
107 
118  TLM_MGR_CMD_TYPE cmd_type,
119  APID apid,
120  TLM_CODE tlm_id,
121  uint8_t dr_partition);
122 
134  cycle_t ti,
135  TLM_MGR_CMD_TYPE cmd_type,
136  APID apid,
137  TLM_CODE tlm_id,
138  uint8_t dr_partition);
139 
148  cycle_t ti,
149  TLM_CODE tlm_id);
150 
160  cycle_t ti,
161  TLM_CODE tlm_id,
162  uint8_t dr_partition);
163 
173  cycle_t ti,
174  APID apid,
175  TLM_CODE tlm_id);
176 
187  cycle_t ti,
188  APID apid,
189  TLM_CODE tlm_id,
190  uint8_t dr_partition);
191 
199 static TLM_MGR_ERR_CODE TLM_MGR_form_dr_replay_tlm_(CommonCmdPacket* packet, cycle_t ti, uint8_t dr_partition);
200 
211  TLM_MGR_CMD_TYPE cmd_type,
212  APID apid,
213  TLM_CODE tlm_id,
214  uint8_t dr_partition);
215 
223 
230 
241  TLM_MGR_CMD_TYPE cmd_type,
242  APID apid,
243  TLM_CODE tlm_id,
244  uint8_t dr_partition);
245 
253 
262  TLM_MGR_CmdElem** next_cmd_elem,
263  const TLM_MGR_RegisterInfo* register_info);
264 
273  TLM_MGR_CmdElem** last_cmd_elem,
274  const TLM_MGR_RegisterInfo* register_info);
275 
288  TLM_MGR_CmdElem** found_cmd_elem,
289  const TLM_MGR_RegisterInfo* register_info,
290  TLM_MGR_CMD_TYPE cmd_type,
291  APID apid,
292  TLM_CODE tlm_id,
293  uint8_t dr_partition);
294 
304 static RESULT TLM_MGR_check_same_cmd_(const TLM_MGR_CmdElem* cmd_elem,
305  TLM_MGR_CMD_TYPE cmd_type,
306  APID apid,
307  TLM_CODE tlm_id,
308  uint8_t dr_partition);
309 
315 static void TLM_MGR_load_deploy_bc_(void);
316 
322 static void TLM_MGR_load_master_bc_(void);
323 
329 static void TLM_MGR_load_nop_bc_(void);
330 
336 static void TLM_MGR_clear_bc_to_nop_(bct_id_t bc_id);
337 
344 
345 
348 
350 
352 {
353  return AI_create_app_info("telemetry_manager", TLM_MGR_init_by_am_, NULL);
354 }
355 
356 
357 static void TLM_MGR_init_by_am_(void)
358 {
360 }
361 
362 
363 // BCT の初期化より前なので,AppInit にできない.
365 {
366  return TLM_MGR_clear_info_();
367 }
368 
369 
371 {
373  if (ret.exec_sts != CCP_EXEC_SUCCESS) return RESULT_ERR;
374  return RESULT_OK;
375 }
376 
377 
379 {
380  RESULT ret;
381  memset(&telemetry_manager_, 0x00, sizeof(telemetry_manager_));
382 
384 
385  // TOOD: TLM_MGR_USE_BC_NUM が 10 であることを想定したコードになってる
387  if (ret != RESULT_OK) return RESULT_ERR;
389  if (ret != RESULT_OK) return RESULT_ERR;
391  if (ret != RESULT_OK) return RESULT_ERR;
393  if (ret != RESULT_OK) return RESULT_ERR;
395  if (ret != RESULT_OK) return RESULT_ERR;
397  if (ret != RESULT_OK) return RESULT_ERR;
399  if (ret != RESULT_OK) return RESULT_ERR;
401  if (ret != RESULT_OK) return RESULT_ERR;
403  if (ret != RESULT_OK) return RESULT_ERR;
405  if (ret != RESULT_OK) return RESULT_ERR;
406 
407  // deploy とあわせる最後は LOW であることが必須
408  // 今後 ROLE を動的に変更可能なようにすることを見据えて
410  {
411  return RESULT_ERR;
412  }
413 
416  return RESULT_OK;
417 }
418 
419 
420 static RESULT TLM_MGR_regigster_bc_settings(uint8_t cmd_table_idx,
421  bct_id_t bc_id,
422  TLM_MGR_BC_ROLE bc_role)
423 {
424  TLM_MGR_CmdBlock* cmd_block;
425  TLM_MGR_RegisterInfo* register_info;
426  if (cmd_table_idx >= TLM_MGR_USE_BC_NUM) return RESULT_ERR;
427 
428  cmd_block = &telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx];
429  cmd_block->bc_role = bc_role;
430  cmd_block->bc_id = bc_id;
431 
432  register_info = TLM_MGR_get_regitster_info_from_bc_role_(bc_role);
433  if (register_info == NULL) return RESULT_ERR;
434  return TLM_MGR_add_bc_settings_to_register_info_(cmd_table_idx, register_info);
435 }
436 
437 
439  TLM_MGR_RegisterInfo* register_info)
440 {
441  if (cmd_table_idx >= TLM_MGR_USE_BC_NUM) return RESULT_ERR;
442  if (register_info->cmd_table_idxes_size >= TLM_MGR_USE_BC_NUM) return RESULT_ERR;
443 
444  register_info->cmd_table_idxes[register_info->cmd_table_idxes_size] = cmd_table_idx;
445  register_info->cmd_table_idxes_size++;
446 
447  return RESULT_OK;
448 }
449 
450 
452  TLM_MGR_BC_ROLE bc_role,
453  TLM_MGR_RegisterInfo* register_info)
454 {
455  uint16_t exec_counter;
456  uint8_t cmd_table_idx;
457  uint8_t bc_num = register_info->cmd_table_idxes_size;
458 
459  switch (DCU_check_in(cmd_code, &exec_counter))
460  {
461  case DCU_STATUS_FINISHED: // FALLTHROUGH
462  case DCU_STATUS_PROGRESS:
463  break;
464  default:
465  // DCU_STATUS_ABORTED_BY_ERR
466  // DCU_STATUS_ABORTED_BY_CMD
467  // がここに
469  }
470 
471  if (exec_counter == bc_num)
472  {
473  register_info->registered_cmd_num = 0;
476  }
477 
478  cmd_table_idx = register_info->cmd_table_idxes[exec_counter];
480  memset(telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].cmds,
481  0x00,
483 
484  // 再帰実行
485  if (DCU_register_next(cmd_code, NULL, 0) != DCU_ACK_OK)
486  {
489  }
490 
492 }
493 
494 
496  TLM_MGR_CMD_TYPE cmd_type,
497  APID apid,
498  TLM_CODE tlm_id,
499  uint8_t dr_partition)
500 {
501  TLM_MGR_ERR_CODE ret;
502  TLM_MGR_RegisterInfo* register_info = NULL;
503  BCT_Pos register_pos;
504  TLM_MGR_CmdElem* register_cmd_elem = NULL;
505  BCT_ACK bct_ack;
506 
507  register_info = TLM_MGR_get_regitster_info_from_bc_role_(role);
508  if (register_info == NULL) return TLM_MGR_ERR_CODE_INVALID_BC_ROLE;
509 
510  ret = TLM_MGR_get_next_register_cmd_pos_(&register_pos, &register_cmd_elem, register_info);
511  if (ret != TLM_MGR_ERR_CODE_OK) return ret;
512 
514  (cycle_t)register_pos.cmd,
515  cmd_type,
516  apid,
517  tlm_id,
518  dr_partition);
519  if (ret != TLM_MGR_ERR_CODE_OK) return ret;
520 
521  // すでに NOP で埋められており,かつ activate 済なので,直接 BCT にコマンドを挿入できる.
522  bct_ack = BCT_overwrite_cmd(&register_pos, &TLM_MGR_packet_);
523  if (bct_ack != BCT_SUCCESS) return TLM_MGR_ERR_CODE_OTHER_ERR;
524 
525  // cmd_table の更新
526  TLM_MGR_update_cmd_elem_of_cmd_table_(register_cmd_elem,
527  cmd_type,
528  apid,
529  tlm_id,
530  dr_partition);
531 
532  register_info->registered_cmd_num++;
533  return TLM_MGR_ERR_CODE_OK;
534 }
535 
536 
538  cycle_t ti,
539  TLM_MGR_CMD_TYPE cmd_type,
540  APID apid,
541  TLM_CODE tlm_id,
542  uint8_t dr_partition)
543 {
544  switch (cmd_type)
545  {
547  return TLM_MGR_form_tg_generate_rt_tlm_(packet, ti, tlm_id);
549  return TLM_MGR_form_tg_generate_st_tlm_(packet, ti, tlm_id, dr_partition);
551  return TLM_MGR_form_tg_forward_as_rt_tlm_(packet, ti, apid, tlm_id);
553  return TLM_MGR_form_tg_forward_as_st_tlm_(packet, ti, apid, tlm_id, dr_partition);
555  return TLM_MGR_form_dr_replay_tlm_(packet, ti, dr_partition);
556  case TLM_MGR_CMD_TYPE_UNREGISTERED: // FALLTHROUGH
557  default:
559  }
560 }
561 
562 
564  cycle_t ti,
565  TLM_CODE tlm_id)
566 {
567  CCP_UTIL_ACK ret;
568  uint8_t param[1];
569 
570  param[0] = (uint8_t)tlm_id;
571 
572  ret = CCP_form_tlc(packet,
573  ti,
575  param,
576  1);
577  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
578  return TLM_MGR_ERR_CODE_OK;
579 }
580 
581 
583  cycle_t ti,
584  TLM_CODE tlm_id,
585  uint8_t dr_partition)
586 {
587  CCP_UTIL_ACK ret;
588  uint8_t param[2];
589 
590  param[0] = (uint8_t)tlm_id;
591  param[1] = dr_partition;
592 
593  ret = CCP_form_tlc(packet,
594  ti,
596  param,
597  2);
598  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
599  return TLM_MGR_ERR_CODE_OK;
600 }
601 
602 
604  cycle_t ti,
605  APID apid,
606  TLM_CODE tlm_id)
607 {
608  CCP_UTIL_ACK ret;
609  uint16_t temp;
610  uint8_t param[3];
611 
612  temp = (uint16_t)apid;
613  ENDIAN_memcpy(&param[0], &temp, sizeof(temp));
614  param[2] = (uint8_t)tlm_id;
615 
616  ret = CCP_form_tlc(packet,
617  ti,
619  param,
620  3);
621  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
622  return TLM_MGR_ERR_CODE_OK;
623 }
624 
625 
627  cycle_t ti,
628  APID apid,
629  TLM_CODE tlm_id,
630  uint8_t dr_partition)
631 {
632  CCP_UTIL_ACK ret;
633  uint16_t temp;
634  uint8_t param[4];
635 
636  temp = (uint16_t)apid;
637  ENDIAN_memcpy(&param[0], &temp, sizeof(temp));
638  param[2] = (uint8_t)tlm_id;
639  param[3] = dr_partition;
640 
641  ret = CCP_form_tlc(packet,
642  ti,
644  param,
645  4);
646  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
647  return TLM_MGR_ERR_CODE_OK;
648 }
649 
650 
651 static TLM_MGR_ERR_CODE TLM_MGR_form_dr_replay_tlm_(CommonCmdPacket* packet, cycle_t ti, uint8_t dr_partition)
652 {
653 #ifdef TLM_MGR_ENABLE_DR_REPLAY_TLM
654  CCP_UTIL_ACK ret;
655  uint8_t param[2];
656 
657  param[0] = dr_partition;
658  param[1] = 1;
659 
660  ret = CCP_form_tlc(packet,
661  ti,
662  Cmd_CODE_DR_REPLAY_TLM,
663  param,
664  2);
665  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
666  return TLM_MGR_ERR_CODE_OK;
667 #else
668  (void)packet;
669  (void)ti;
670  (void)dr_partition;
672 #endif
673 }
674 
675 
677  TLM_MGR_CMD_TYPE cmd_type,
678  APID apid,
679  TLM_CODE tlm_id,
680  uint8_t dr_partition)
681 {
682  TLM_MGR_ERR_CODE ret;
683  TLM_MGR_RegisterInfo* register_info = NULL;
684  BCT_Pos delete_pos;
685  BCT_Pos last_pos;
686  TLM_MGR_CmdElem* delete_cmd_elem = NULL;
687  TLM_MGR_CmdElem* last_cmd_elem = NULL;
688  BCT_ACK bct_ack;
689 
690  register_info = TLM_MGR_get_regitster_info_from_bc_role_(role);
691  if (register_info == NULL) return TLM_MGR_ERR_CODE_INVALID_BC_ROLE;
692 
693  ret = TLM_MGR_find_registered_cmd_pos_(&delete_pos,
694  &delete_cmd_elem,
695  register_info,
696  cmd_type,
697  apid,
698  tlm_id,
699  dr_partition);
700  if (ret != TLM_MGR_ERR_CODE_OK) return ret;
701  ret = TLM_MGR_get_last_registered_cmd_pos_(&last_pos,
702  &last_cmd_elem,
703  register_info);
704  if (ret != TLM_MGR_ERR_CODE_OK) return ret;
705 
706  if (delete_cmd_elem == last_cmd_elem)
707  {
708  // 消す対象が末端
709  // なにもしない
710  }
711  else
712  {
713  // 消す対象が末端ではない
714  // 末尾で消す対象を上書き
715  bct_ack = BCT_load_cmd(&last_pos, &TLM_MGR_packet_);
716  if (bct_ack != BCT_SUCCESS) return TLM_MGR_ERR_CODE_OTHER_ERR;
717  bct_ack = BCT_overwrite_cmd(&delete_pos, &TLM_MGR_packet_);
718  if (bct_ack != BCT_SUCCESS) return TLM_MGR_ERR_CODE_OTHER_ERR;
719 
721  last_cmd_elem->cmd_type,
722  last_cmd_elem->apid,
723  last_cmd_elem->tlm_id,
724  last_cmd_elem->dr_partition);
725  }
726 
727  // 末尾の削除
728  // TODO: TI が正しいかテストでチェック
730  if (ret != TLM_MGR_ERR_CODE_OK) return ret;
731 
732  // すでに NOP で埋められており,かつ activate 済なので,直接 BCT にコマンドを挿入できる.
733  bct_ack = BCT_overwrite_cmd(&last_pos, &TLM_MGR_packet_);
734  if (bct_ack != BCT_SUCCESS) return TLM_MGR_ERR_CODE_OTHER_ERR;
735 
737 
738  register_info->registered_cmd_num--;
739  return TLM_MGR_ERR_CODE_OK;
740 }
741 
742 
744 {
745  CCP_UTIL_ACK ret;
746  ret = CCP_form_tlc(packet, ti, Cmd_CODE_NOP, NULL, 0);
747  if (ret != CCP_UTIL_ACK_OK) return TLM_MGR_ERR_CODE_OTHER_ERR;
748  return TLM_MGR_ERR_CODE_OK;
749 }
750 
751 
753 {
754  switch (bc_role)
755  {
762  default:
763  return NULL;
764  }
765 }
766 
767 
769  TLM_MGR_CMD_TYPE cmd_type,
770  APID apid,
771  TLM_CODE tlm_id,
772  uint8_t dr_partition)
773 {
774  if (cmd_elem == NULL) return;
775  cmd_elem->cmd_type = cmd_type;
776  cmd_elem->apid = apid;
777  cmd_elem->tlm_id = tlm_id;
778  cmd_elem->dr_partition = dr_partition;
779 }
780 
781 
783 {
784  if (cmd_elem == NULL) return;
785  // クリアは 0 埋めでよい
786  memset(cmd_elem, 0x00, sizeof(*cmd_elem));
787 }
788 
789 
791  TLM_MGR_CmdElem** next_cmd_elem,
792  const TLM_MGR_RegisterInfo* register_info)
793 {
794  uint8_t idx_of_cmd_table_idxes;
795  uint8_t cmd_table_idx;
796  bct_id_t block;
797  uint8_t cmd_pos;
798 
799  if (register_info->cmd_table_idxes_size == 0) return TLM_MGR_ERR_CODE_CMD_FULL;
800  if (register_info->registered_cmd_num >= register_info->cmd_table_idxes_size * TLM_MGR_MAX_CMD_NUM_PER_BC)
801  {
803  }
804 
805  idx_of_cmd_table_idxes = register_info->registered_cmd_num % register_info->cmd_table_idxes_size;
806  cmd_pos = register_info->registered_cmd_num / register_info->cmd_table_idxes_size;
807 
808  cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];
809 
810  *next_cmd_elem = &telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].cmds[cmd_pos];
811 
812  block = telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].bc_id;
813  if (BCT_make_pos(next_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
814  {
816  }
817  return TLM_MGR_ERR_CODE_OK;
818 }
819 
820 
822  TLM_MGR_CmdElem** last_cmd_elem,
823  const TLM_MGR_RegisterInfo* register_info)
824 {
825  uint8_t idx_of_cmd_table_idxes;
826  uint8_t cmd_table_idx;
827  bct_id_t block;
828  uint8_t cmd_pos;
829 
830  if (register_info->registered_cmd_num == 0)
831  {
833  }
834 
835  idx_of_cmd_table_idxes = (register_info->registered_cmd_num - 1) % register_info->cmd_table_idxes_size;
836  cmd_pos = (register_info->registered_cmd_num - 1) / register_info->cmd_table_idxes_size;
837 
838  cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];
839 
840  *last_cmd_elem = &telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].cmds[cmd_pos];
841 
842  block = telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].bc_id;
843  if (BCT_make_pos(last_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
844  {
846  }
847  return TLM_MGR_ERR_CODE_OK;
848 }
849 
850 
852  TLM_MGR_CmdElem** found_cmd_elem,
853  const TLM_MGR_RegisterInfo* register_info,
854  TLM_MGR_CMD_TYPE cmd_type,
855  APID apid,
856  TLM_CODE tlm_id,
857  uint8_t dr_partition)
858 {
859  uint8_t idx_of_cmd_table_idxes;
860  bct_id_t block;
861  uint8_t cmd_pos;
862  uint8_t cmd_table_idx;
863  TLM_MGR_CmdElem* cmd_elem;
864  uint8_t count = 0;
865 
866  if (register_info->registered_cmd_num == 0)
867  {
869  }
870 
871  for (cmd_pos = 0; cmd_pos < TLM_MGR_MAX_CMD_NUM_PER_BC; ++cmd_pos)
872  {
873  RESULT ret = RESULT_ERR;
874  for (idx_of_cmd_table_idxes = 0; idx_of_cmd_table_idxes < register_info->cmd_table_idxes_size; ++idx_of_cmd_table_idxes)
875  {
876  cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];
877  cmd_elem = &telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].cmds[cmd_pos];
878 
879  ret = TLM_MGR_check_same_cmd_(cmd_elem, cmd_type, apid, tlm_id, dr_partition);
880  // 見つかった!
881  if (ret == RESULT_OK) break;
882 
883  count++;
884  if (count == register_info->registered_cmd_num) return TLM_MGR_ERR_CODE_CMD_NOT_FOUND;
885  }
886  if (ret == RESULT_OK) break;
887  }
888 
889  *found_cmd_elem = cmd_elem;
890 
891  block = telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx].bc_id;
892  if (BCT_make_pos(found_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
893  {
895  }
896  return TLM_MGR_ERR_CODE_OK;
897 }
898 
899 
901  TLM_MGR_CMD_TYPE cmd_type,
902  APID apid,
903  TLM_CODE tlm_id,
904  uint8_t dr_partition)
905 {
906  switch (cmd_type)
907  {
910  cmd_elem->tlm_id == tlm_id)
911  {
912  return RESULT_OK;
913  }
914  break;
917  cmd_elem->tlm_id == tlm_id &&
918  cmd_elem->dr_partition == dr_partition)
919  {
920  return RESULT_OK;
921  }
922  break;
925  cmd_elem->apid == apid &&
926  cmd_elem->tlm_id == tlm_id)
927  {
928  return RESULT_OK;
929  }
932  cmd_elem->apid == apid &&
933  cmd_elem->tlm_id == tlm_id &&
934  cmd_elem->dr_partition == dr_partition)
935  {
936  return RESULT_OK;
937  }
939  if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_DR_REPLAY_TLM &&
940  cmd_elem->dr_partition == dr_partition)
941  {
942  return RESULT_OK;
943  }
944  case TLM_MGR_CMD_TYPE_UNREGISTERED: // FALLTHROUGH
945  default:
946  return RESULT_ERR;
947  }
948  return RESULT_ERR;
949 }
950 
951 
952 static void TLM_MGR_load_deploy_bc_(void)
953 {
955  // BC#9 は TLM_MGR_BC_ROLE_LOW_FREQ_TLM なはず
957 }
958 
959 
960 static void TLM_MGR_load_master_bc_(void)
961 {
962  // 1 - TLM_MGR_USE_BC_NUM までの TLM_MGR_USE_BC_NUM 個登録する. TLM_MGR_USE_BC_NUM は deploy も一緒に
963  uint8_t cmd_table_idx;
964 
965  for (cmd_table_idx = 0; cmd_table_idx < (TLM_MGR_USE_BC_NUM - 1); ++cmd_table_idx)
966  {
967  TLM_MGR_CmdBlock* cmd_block = &telemetry_manager_.cmd_table.cmd_blocks[cmd_table_idx];
968  switch (cmd_block->bc_role)
969  {
970  case TLM_MGR_BC_ROLE_HK_TLM: // FALLTHROUGH
972  BCL_tool_register_combine(cmd_table_idx + 1, cmd_block->bc_id);
973  break;
975  BCL_tool_register_rotate(cmd_table_idx + 1, cmd_block->bc_id);
976  break;
977  default:
978  break;
979  }
980  }
981 
982  // TLM_MGR_USE_BC_NUM 番目は deploy も一緒に
984 }
985 
986 
987 static void TLM_MGR_load_nop_bc_(void)
988 {
989  cycle_t ti;
990 
991  for (ti = 0; ti < TLM_MGR_MAX_CMD_NUM_PER_BC; ++ti)
992  {
994  }
995 }
996 
997 
999 {
1001  // この中で BCT_activate_block() もされることに注意
1002 }
1003 
1004 
1006 {
1007  switch (code)
1008  {
1009  case TLM_MGR_ERR_CODE_OK:
1011  case TLM_MGR_ERR_CODE_INVALID_BC_ROLE: // FALLTHROUGH
1013  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)code);
1014  case TLM_MGR_ERR_CODE_CMD_FULL: // FALLTHROUGH
1015  case TLM_MGR_ERR_CODE_BCT_ERR: // FALLTHROUGH
1017  default:
1018  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)code);
1019  }
1020 }
1021 
1022 
1024 {
1025  RESULT ret;
1026  uint16_t exec_counter;
1027  const uint16_t exec_counter_offset = 2;
1028  (void)packet;
1029 
1030  switch (DCU_check_in(Cmd_CODE_TLM_MGR_INIT, &exec_counter))
1031  {
1032  case DCU_STATUS_FINISHED: // FALLTHROUGH
1033  case DCU_STATUS_PROGRESS:
1034  break;
1035  default:
1036  // DCU_STATUS_ABORTED_BY_ERR
1037  // DCU_STATUS_ABORTED_BY_CMD
1038  // がここに
1040  }
1041 
1042  if (exec_counter == 0)
1043  {
1044  ret = TLM_MGR_init_1_();
1045  }
1046  else if (exec_counter == 1)
1047  {
1048  ret = TLM_MGR_init_2_();
1049  }
1050  else if (exec_counter >= exec_counter_offset + TLM_MGR_USE_BC_NUM)
1051  {
1052  ret = RESULT_ERR;
1053  }
1054  else
1055  {
1056  TLM_MGR_clear_bc_to_nop_(telemetry_manager_.cmd_table.cmd_blocks[exec_counter - exec_counter_offset].bc_id);
1057  ret = RESULT_OK;
1058  }
1059 
1060  if (ret != RESULT_OK)
1061  {
1064  }
1065 
1066  if (exec_counter == exec_counter_offset + TLM_MGR_USE_BC_NUM - 1)
1067  {
1071  }
1072 
1073  // 再帰実行
1075  {
1078  }
1079 
1081 }
1082 
1083 
1085 {
1086  (void)packet;
1087 
1090 
1092 }
1093 
1094 
1096 {
1097  (void)packet;
1098 
1099  // DCU を使う
1103 }
1104 
1105 
1107 {
1108  (void)packet;
1109 
1110  // DCU を使う
1114 }
1115 
1116 
1118 {
1119  (void)packet;
1120 
1121  // DCU を使う
1125 }
1126 
1127 
1129 {
1130  (void)packet;
1131 
1132  // NOTE: DCU を多重で使っている! (つまり, DCU_LOG_MAX が 2 以上でないとだめ)
1135 
1137 }
1138 
1139 
1141 {
1142  CCP_CmdRet cmd_ret;
1143  (void)packet;
1144 
1146 
1148  if (cmd_ret.exec_sts != CCP_EXEC_SUCCESS)
1149  {
1151  }
1152 
1154  if (cmd_ret.exec_sts != CCP_EXEC_SUCCESS)
1155  {
1157  }
1158 
1160 }
1161 
1162 
1164 {
1165  uint8_t param[1];
1166  (void)packet;
1168 
1169  param[0] = TLCD_ID_DEPLOY_TLM;
1171 }
1172 
1173 
1175 {
1176  TLM_MGR_ERR_CODE err_code;
1177  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1178  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
1179 
1181 
1182  err_code = TLM_MGR_register_(bc_role, TLM_MGR_CMD_TYPE_TG_GENERATE_RT_TLM, APID_UNKNOWN, tlm_id, 0);
1183  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1184 }
1185 
1186 
1188 {
1189  TLM_MGR_ERR_CODE err_code;
1190  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1191  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
1192  uint8_t dr_partition = CCP_get_param_from_packet(packet, 2, uint8_t);
1193 
1195 
1196  err_code = TLM_MGR_register_(bc_role, TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM, APID_UNKNOWN, tlm_id, dr_partition);
1197  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1198 }
1199 
1200 
1202 {
1203  TLM_MGR_ERR_CODE err_code;
1204  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1205  APID apid = (APID)CCP_get_param_from_packet(packet, 1, uint16_t);
1206  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 2, uint8_t);
1207 
1209 
1210  err_code = TLM_MGR_register_(bc_role, TLM_MGR_CMD_TYPE_TG_FORWARD_AS_RT_TLM, apid, tlm_id, 0);
1211  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1212 }
1213 
1214 
1216 {
1217  TLM_MGR_ERR_CODE err_code;
1218  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1219  APID apid = (APID)CCP_get_param_from_packet(packet, 1, uint16_t);
1220  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 2, uint8_t);
1221  uint8_t dr_partition = CCP_get_param_from_packet(packet, 3, uint8_t);
1222 
1224 
1225  err_code = TLM_MGR_register_(bc_role, TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM, apid, tlm_id, dr_partition);
1226  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1227 }
1228 
1229 
1231 {
1232  TLM_MGR_ERR_CODE err_code;
1233  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1234  uint8_t dr_partition = CCP_get_param_from_packet(packet, 1, uint8_t);
1235 
1237 
1238  err_code = TLM_MGR_register_(bc_role, TLM_MGR_CMD_TYPE_DR_REPLAY_TLM, APID_UNKNOWN, TLM_CODE_MAX, dr_partition);
1239  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1240 }
1241 
1242 
1244 {
1245  TLM_MGR_ERR_CODE err_code;
1246  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1247  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
1248 
1250 
1251  err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_TG_GENERATE_RT_TLM, APID_UNKNOWN, tlm_id, 0);
1252  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1253 }
1254 
1255 
1257 {
1258  TLM_MGR_ERR_CODE err_code;
1259  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1260  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
1261  uint8_t dr_partition = CCP_get_param_from_packet(packet, 2, uint8_t);
1262 
1264 
1265  err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM, APID_UNKNOWN, tlm_id, dr_partition);
1266  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1267 }
1268 
1269 
1271 {
1272  TLM_MGR_ERR_CODE err_code;
1273  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1274  APID apid = (APID)CCP_get_param_from_packet(packet, 1, uint16_t);
1275  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 2, uint8_t);
1276 
1278 
1279  err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_TG_FORWARD_AS_RT_TLM, apid, tlm_id, 0);
1280  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1281 }
1282 
1283 
1285 {
1286  TLM_MGR_ERR_CODE err_code;
1287  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1288  APID apid = (APID)CCP_get_param_from_packet(packet, 1, uint16_t);
1289  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 2, uint8_t);
1290  uint8_t dr_partition = CCP_get_param_from_packet(packet, 3, uint8_t);
1291 
1293 
1294  err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM, apid, tlm_id, dr_partition);
1295  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1296 }
1297 
1298 
1300 {
1301  TLM_MGR_ERR_CODE err_code;
1302  TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
1303  uint8_t dr_partition = CCP_get_param_from_packet(packet, 1, uint8_t);
1304 
1306 
1307  err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_DR_REPLAY_TLM, APID_UNKNOWN, TLM_CODE_MAX, dr_partition);
1308  return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
1309 }
1310 
1311 #pragma section
APID
Application Process ID
Definition: apid_define.h:17
@ APID_UNKNOWN
Definition: apid_define.h:27
AppInfo AI_create_app_info(const char *name, void(*initializer)(void), void(*entry_point)(void))
AppInfo を作る
Definition: app_info.c:9
ブロックコマンド定義
void BCL_tool_register_rotate(cycle_t ti, bct_id_t bct_id)
ブロックコマンドの最後にローテーターの実行コマンドを追加する
void BCL_load_bc(bct_id_t pos, void(*BCL_load_func)(void))
指定されたブロックコマンドIDへの登録を安全に行うためのwrapper関数
void BCL_tool_register_deploy(cycle_t ti, bct_id_t bct_id, TLCD_ID tlcd_id)
ブロックコマンドの最後にブロックコマンドの展開コマンドを追加する
void BCL_tool_register_combine(cycle_t ti, bct_id_t bct_id)
ブロックコマンドの最後にコンバイナーの実行コマンドを追加する
void BCL_tool_register_cmd(cycle_t ti, CMD_CODE cmd_id)
ブロックコマンドの最後にコマンドを追加する
BCT_ACK BCT_overwrite_cmd(const BCT_Pos *pos, const CommonCmdPacket *packet)
既に登録されている BC の Cmd の中身を外部から上書きする
BCT_ACK BCT_make_pos(BCT_Pos *pos, const bct_id_t block, const uint8_t cmd)
BCT_Pos* を引数から作る
BCT_ACK BCT_load_cmd(const BCT_Pos *pos, CommonCmdPacket *packet)
保存データを CCP にコピーする.
uint16_t bct_id_t
BCT_ACK
BCT 関係の関数のエラーステータス
@ BCT_SUCCESS
コマンド定義
@ Cmd_CODE_TG_GENERATE_ST_TLM
@ Cmd_CODE_TLM_MGR_INIT
@ Cmd_CODE_TG_FORWARD_AS_ST_TLM
@ Cmd_CODE_TLM_MGR_CLEAR_LOW_FREQ_TLM
@ Cmd_CODE_TLM_MGR_CLEAR_HIGH_FREQ_TLM
@ Cmd_CODE_TG_GENERATE_RT_TLM
@ Cmd_CODE_TG_FORWARD_AS_RT_TLM
@ Cmd_CODE_TLM_MGR_STOP_TLM
@ Cmd_CODE_TLM_MGR_INIT_MASTER_AND_DEPLOY_BC
@ Cmd_CODE_TLCD_CLEAR_ALL_TIMELINE
@ Cmd_CODE_NOP
@ Cmd_CODE_TLM_MGR_CLEAR_HK_TLM
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
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_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 を生成し,即時実行する
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 を作成(エラーコード不使用版)
CCP_UTIL_ACK
CCP Utility の汎用返り値
@ CCP_UTIL_ACK_OK
正常終了
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
void DCU_report_err(CMD_CODE cmd_code, CCP_EXEC_STS last_exec_sts)
DCUに,途中でエラーが発生したことを伝える
DCU_ACK DCU_register_next(CMD_CODE cmd_code, const uint8_t *param, uint16_t len)
次の分割の実行を登録
DCU_STATUS DCU_check_in(CMD_CODE cmd_code, uint16_t *exec_counter)
DCUにチェックインする.分割コマンド実行時,最初に呼び出す関数.
void DCU_report_finish(CMD_CODE cmd_code, CCP_EXEC_STS last_exec_sts)
DCUに,分割コマンドが実行終了したことを伝える
コマンド分割をサポートするUtil
@ DCU_ACK_OK
正常終了
@ DCU_STATUS_PROGRESS
実行中
@ DCU_STATUS_FINISHED
実行終了 or 未実行
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
RESULT
Rust でいうところの Result<(), ()> のような,汎用的な成功したかどうかだけの返り値用 enum
Definition: result.h:14
@ RESULT_OK
OK (C2A では慣習的に OK 系列挙子は 0 を使うので,万が一他の enum に cast されても事故が起きにくいように)
Definition: result.h:15
@ RESULT_ERR
Error or NG
Definition: result.h:16
BCT内での作業中の位置情報
uint8_t cmd
そのブロック内でどのコマンドを指すか
コマンド返り値
CCP_EXEC_STS exec_sts
CCP_EXEC_STS.Cmd の統一的なエラーコード
Space Packet (コマンド用)
BC に登録された(テレメ生成などの)コマンドの情報(BC の block ごと)
TLM_MGR_CmdElem cmds[TLM_MGR_MAX_CMD_NUM_PER_BC]
bct_id_t bc_id
使う BC ID
TLM_MGR_BC_ROLE bc_role
その BC の役割
TLM_MGR_CmdBlock の 1 cmd の情報
TLM_MGR_CMD_TYPE cmd_type
BC に登録された(テレメ生成などの)コマンドのタイプ (未登録は TLM_MGR_CMD_TYPE_UNREGISTERED (0))
uint8_t dr_partition
登録された tlm 生成コマンドの dr_partition (未登録は 0)
APID apid
登録された tlm 生成コマンドの APID (未登録は 0)
TLM_CODE tlm_id
登録された tlm 生成コマンドの生成 tlm id (未登録は 0)
TLM_MGR_CmdBlock cmd_blocks[TLM_MGR_USE_BC_NUM]
BC の各 Block ごとの情報
どう BC を管理し,テレメ生成コマンドを登録し,動かしていくかの情報.途中計算などに使う
uint8_t cmd_table_idxes_size
cmd_table_idxes の配列数
uint8_t cmd_table_idxes[TLM_MGR_USE_BC_NUM]
TLM_MGR_CmdTable.cmd_blocks のどの idx を使うか.static 確保のため,最大数 TLM_MGR_USE_BC_NUM の配列を確保
TelemetryManager の AppInfo構造体
TLM_MGR_CmdTable cmd_table
現在 BC に登録された(テレメ生成などの)コマンド
uint8_t is_inited
初期化されているか?
TLM_MGR_RegisterInfo low_freq
TLM_MGR_BC_ROLE_LOW_FREQ_TLM; User テレメ (1/10 Hz)
TLM_MGR_RegisterInfo hk
TLM_MGR_RegisterInfo high_freq
TLM_MGR_BC_ROLE_HIGH_FREQ_TLM; User テレメ (1 Hz)
bct_id_t deploy_bc_id
master BC を deploy する BC の ID
bct_id_t master_bc_id
TLM_MGR_USE_BC_NUM 個の tlm bc を順次実行していく master BC の ID
struct TelemetryManager::@0 register_info
テレメトリ定義
@ TLM_CODE_MAX
CCP_CmdRet Cmd_TLM_MGR_CLEAR_USER_TLM(const CommonCmdPacket *packet)
User テレメ (HIGH_FREQ, LOW_FREQ) を初期化
static TLM_MGR_ERR_CODE TLM_MGR_form_register_tlc_(CommonCmdPacket *packet, cycle_t ti, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
TLM_MGR_CMD_TYPE に応じて, TLM MGR に登録する TLC を生成する
static void TLM_MGR_load_deploy_bc_(void)
master BC を deploy する BC の構築
static TLM_MGR_ERR_CODE TLM_MGR_form_tg_forward_as_rt_tlm_(CommonCmdPacket *packet, cycle_t ti, APID apid, TLM_CODE tlm_id)
TLM MGR に登録する TLC (TLM_MGR_CMD_TYPE_TG_FORWARD_AS_RT_TLM) を生成する
#define TLM_MGR_BC_ROLE_AT_BC_7
static CommonCmdPacket TLM_MGR_packet_
CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_ST_TLM(const CommonCmdPacket *packet)
static TLM_MGR_ERR_CODE TLM_MGR_form_dr_replay_tlm_(CommonCmdPacket *packet, cycle_t ti, uint8_t dr_partition)
TLM MGR に登録する TLC (TLM_MGR_CMD_TYPE_DR_REPLAY_TLM) を生成する
static RESULT TLM_MGR_clear_info_(void)
AppInfo 構造体のクリア
#define TLM_MGR_BC_ROLE_AT_BC_8
static RESULT TLM_MGR_init_1_(void)
初期化(分割 1/2)
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_ST_TLM(const CommonCmdPacket *packet)
static void TLM_MGR_init_by_am_(void)
App初期化関数
static TLM_MGR_ERR_CODE TLM_MGR_form_tg_forward_as_st_tlm_(CommonCmdPacket *packet, cycle_t ti, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
TLM MGR に登録する TLC (TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM) を生成する
static TLM_MGR_ERR_CODE TLM_MGR_find_registered_cmd_pos_(BCT_Pos *found_cmd_pos, TLM_MGR_CmdElem **found_cmd_elem, const TLM_MGR_RegisterInfo *register_info, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
すでに登録されているコマンドのから,指定したコマンドを検索し,その BCT_Pos と TLM_MGR_CmdElem を取得する
CCP_CmdRet Cmd_TLM_MGR_CLEAR_LOW_FREQ_TLM(const CommonCmdPacket *packet)
LOW_FREQ テレメを初期化
CCP_CmdRet Cmd_TLM_MGR_STOP_TLM(const CommonCmdPacket *packet)
TLM 送出一時停止
static TelemetryManager telemetry_manager_
static TLM_MGR_ERR_CODE TLM_MGR_get_next_register_cmd_pos_(BCT_Pos *next_cmd_pos, TLM_MGR_CmdElem **next_cmd_elem, const TLM_MGR_RegisterInfo *register_info)
次に TLM MGR に登録するコマンドの BCT_Pos と TLM_MGR_CmdElem を取得する
static RESULT TLM_MGR_check_same_cmd_(const TLM_MGR_CmdElem *cmd_elem, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
TLM_MGR_CmdElem が指定したものと等しいかチェックする
static RESULT TLM_MGR_regigster_bc_settings(uint8_t cmd_table_idx, bct_id_t bc_id, TLM_MGR_BC_ROLE bc_role)
BC の設定を登録する
#define TLM_MGR_BC_ROLE_AT_BC_4
const TelemetryManager *const telemetry_manager
static TLM_MGR_RegisterInfo * TLM_MGR_get_regitster_info_from_bc_role_(TLM_MGR_BC_ROLE bc_role)
TLM_MGR_BC_ROLE に応じた TLM_MGR_RegisterInfo を取得する
CCP_CmdRet Cmd_TLM_MGR_INIT_MASTER_AND_DEPLOY_BC(const CommonCmdPacket *packet)
master bc の初期化
static TLM_MGR_ERR_CODE TLM_MGR_form_nop_tlc_(CommonCmdPacket *packet, cycle_t ti)
TLM MGR に上書きして削除するための NOP TLC を生成する
#define TLM_MGR_BC_ROLE_AT_BC_0
static TLM_MGR_ERR_CODE TLM_MGR_register_(TLM_MGR_BC_ROLE role, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
テレメ生成などのコマンドを TLM MGR に登録する
#define TLM_MGR_BC_ROLE_AT_BC_2
#define TLM_MGR_BC_ROLE_AT_BC_3
CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_RT_TLM(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLM_MGR_CLEAR_HK_TLM(const CommonCmdPacket *packet)
HK テレメを初期化
static void TLM_MGR_update_cmd_elem_of_cmd_table_(TLM_MGR_CmdElem *cmd_elem, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
TLM_MGR_CmdElem を更新する
static RESULT TLM_MGR_init_2_(void)
初期化(分割 2/2)
static TLM_MGR_ERR_CODE TLM_MGR_get_last_registered_cmd_pos_(BCT_Pos *last_cmd_pos, TLM_MGR_CmdElem **last_cmd_elem, const TLM_MGR_RegisterInfo *register_info)
すでに登録されているコマンドのうち,末尾にあるコマンドの BCT_Pos と TLM_MGR_CmdElem を取得する
static CCP_CmdRet TLM_MGR_clear_cmds_based_on_role_(CMD_CODE cmd_code, TLM_MGR_BC_ROLE bc_role, TLM_MGR_RegisterInfo *register_info)
TLM_MGR_BC_ROLE に応じて TLM_MGR_CmdTable から 1 BC の 1 block から全 cmd を消す (NPO 埋めする)
static TLM_MGR_ERR_CODE TLM_MGR_form_tg_generate_st_tlm_(CommonCmdPacket *packet, cycle_t ti, TLM_CODE tlm_id, uint8_t dr_partition)
TLM MGR に登録する TLC (TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM) を生成する
CCP_CmdRet Cmd_TLM_MGR_REGISTER_FORWARD_AS_RT_TLM(const CommonCmdPacket *packet)
#define TLM_MGR_BC_ROLE_AT_BC_1
static void TLM_MGR_load_nop_bc_(void)
NOP で埋められた BC の構築
#define TLM_MGR_BC_ROLE_AT_BC_5
static void TLM_MGR_clear_cmd_elem_of_cmd_table_(TLM_MGR_CmdElem *cmd_elem)
TLM_MGR_CmdElem をクリアする
CCP_CmdRet Cmd_TLM_MGR_REGISTER_FORWARD_AS_ST_TLM(const CommonCmdPacket *packet)
AppInfo TLM_MGR_create_app(void)
static void TLM_MGR_load_master_bc_(void)
BC 全体を展開していく master BC の構築
static CCP_CmdRet TLM_MGR_conv_err_code_to_ccp_cmd_ret_(TLM_MGR_ERR_CODE code)
TLM_MGR_ERR_CODE から CCP_CmdRet に変換する
static TLM_MGR_ERR_CODE TLM_MGR_form_tg_generate_rt_tlm_(CommonCmdPacket *packet, cycle_t ti, TLM_CODE tlm_id)
TLM MGR に登録する TLC (TLM_MGR_CMD_TYPE_TG_GENERATE_RT_TLM) を生成する
static void TLM_MGR_clear_bc_to_nop_(bct_id_t bc_id)
指定した BC を NOP x TLM_MGR_MAX_CMD_NUM_PER_BC で埋める
CCP_CmdRet Cmd_TLM_MGR_INIT(const CommonCmdPacket *packet)
初期化
#define TLM_MGR_BC_ROLE_AT_BC_6
#define TLM_MGR_BC_ROLE_AT_BC_9
static RESULT TLM_MGR_add_bc_settings_to_register_info_(uint8_t cmd_table_idx, TLM_MGR_RegisterInfo *register_info)
TLM_MGR_RegisterInfo に BC 情報を追加
CCP_CmdRet Cmd_TLM_MGR_START_TLM(const CommonCmdPacket *packet)
TLM 送出開始
CCP_CmdRet Cmd_TLM_MGR_REGISTER_GENERATE_ST_TLM(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLM_MGR_REGISTER_GENERATE_RT_TLM(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLM_MGR_CLEAR_HIGH_FREQ_TLM(const CommonCmdPacket *packet)
HIGH_FREQ テレメを初期化
CCP_CmdRet Cmd_TLM_MGR_DELETE_REPLAY_TLM(const CommonCmdPacket *packet)
static TLM_MGR_ERR_CODE TLM_MGR_delete_(TLM_MGR_BC_ROLE role, TLM_MGR_CMD_TYPE cmd_type, APID apid, TLM_CODE tlm_id, uint8_t dr_partition)
テレメ生成などのコマンドを TLM MGR から削除する
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_RT_TLM(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLM_MGR_REGISTER_REPLAY_TLM(const CommonCmdPacket *packet)
userがテレメトリ詰まりをやTL溢れを防ぎつつ,またCDHなどがテレメトリを管理しやすくするためのApp
#define TLM_MGR_MAX_CMD_NUM_PER_BC
1 BC に何個のテレメ生成などのコマンドを登録できるか.基本的に 10 固定を想定
#define TLM_MGR_USE_BC_NUM
用いる BC の数.基本的に 10 固定を想定
TLM_MGR_CMD_TYPE
BC に登録された(テレメ生成などの)コマンドのタイプ
@ TLM_MGR_CMD_TYPE_TG_GENERATE_RT_TLM
@ TLM_MGR_CMD_TYPE_TG_FORWARD_AS_RT_TLM
@ TLM_MGR_CMD_TYPE_DR_REPLAY_TLM
@ TLM_MGR_CMD_TYPE_UNREGISTERED
まだ使われていない (これは 0 であることが必要)
@ TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM
@ TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM
TLM_MGR_BC_ROLE
BC の役割.これにて実行種別が変わる
@ TLM_MGR_BC_ROLE_HK_TLM
HK テレメ (or 全系や system で入れておきたい tlm (1 Hz))
@ TLM_MGR_BC_ROLE_LOW_FREQ_TLM
User (LOW_FREQ) テレメ (1/10 Hz)
@ TLM_MGR_BC_ROLE_HIGH_FREQ_TLM
User (HIGH_FREQ) テレメ (1 Hz)
TLM_MGR_ERR_CODE
汎用エラーコード
@ TLM_MGR_ERR_CODE_CMD_NOT_FOUND
登録コマンド消去時に,コマンドが見つからない
@ TLM_MGR_ERR_CODE_CMD_FULL
これ以上テレメ生成コマンドを登録できない
@ TLM_MGR_ERR_CODE_INVALID_CMD_TYPE
不正な TLM_MGR_CMD_TYPE
@ TLM_MGR_ERR_CODE_OTHER_ERR
その他のエラー
@ TLM_MGR_ERR_CODE_BCT_ERR
BCT 関連のエラー
@ TLM_MGR_ERR_CODE_OK
@ TLM_MGR_ERR_CODE_INVALID_BC_ROLE
不正な TLM_MGR_BC_ROLE
Telemetry Manager の各種定義
Telemetry Manager のパラメタのオーバーライド用ヘッダー