C2A_Core
mode_manager.c
[詳解]
1 #pragma section REPRO
6 #include "mode_manager.h"
7 
8 #include <string.h>
9 
10 #include "../TimeManager/time_manager.h"
11 #include "../TaskManager/task_dispatcher.h"
12 #include "../EventManager/event_logger.h"
13 #include "../../TlmCmd/block_command_executor.h"
14 #include "../../TlmCmd/common_cmd_packet_util.h"
16 #include "../../TlmCmd/packet_handler.h"
17 #include "../../Applications/timeline_command_dispatcher_id_define.h"
18 #include "../../Library/endian.h"
19 
26 
32 static MM_ACK MM_finish_transition_(void);
33 
39 static void MM_deploy_block_cmd_(bct_id_t index);
40 
45 static void MM_clear_transition_table_(void);
46 
49 
50 void MM_initialize(void)
51 {
52  // 各モード・モード遷移に対応するブロックコマンドの読み込み
54 
57 
58  // 起動直後かつモード遷移実行中ではないとして初期化
62 
63  // 起動直後に一度のみ実行したいコマンドはこのモード遷移で実行する
65 }
66 
68 {
69  int from, to;
70 
71  // 初期化 全てを未定義に設定。
72  for (from = 0; from < MD_MODEID_MODE_MAX; ++from)
73  {
74  for (to = 0; to < MD_MODEID_MODE_MAX; ++to)
75  {
77  }
78  }
79 }
80 
86 {
87  MD_MODEID mode;
88  bct_id_t bc_index;
89  const uint8_t* param = CCP_get_param_head(packet);
90 
91  if (CCP_get_param_len(packet) != (1 + SIZE_OF_BCT_ID_T))
92  {
93  // パラメータはパケットヘッダとuint8_t 2個(mode, index)。
95  }
96 
97  // どのモードにどのブロックコマンドを登録するかを引数から読み出す
98  mode = (MD_MODEID)param[0];
99  ENDIAN_memcpy(&bc_index, param + 1, SIZE_OF_BCT_ID_T);
100 
101  mode_manager_.mm_ack = MM_set_mode_list(mode, bc_index);
103  {
105  }
107 }
108 
110 {
111  if (mode >= MD_MODEID_MODE_MAX)
112  {
113  // 定義されていないモード番号が指定された場合
114  return MM_BAD_ID;
115  }
116  else if (bc_index > MM_NOT_DEFINED)
117  {
118  // 範囲外のブロックコマンド番号が指定された場合
119  return MM_BAD_BC_INDEX;
120  }
121  else if (bc_index != MM_NOT_DEFINED && BCE_is_active(bc_index) != 1)
122  {
123  // 無効化されているブロック番号が指定された場合
124  // 定義なし用の値を特別扱いしている。
125  return MM_INACTIVE_BLOCK;
126  }
127 
128  mode_manager_.mode_list[mode] = bc_index;
129 
130  return MM_SUCCESS;
131 }
132 
138 {
139  unsigned char from, to;
140  bct_id_t bc_index;
141  const uint8_t* param = CCP_get_param_head(packet);
142 
143  if (CCP_get_param_len(packet) != 1 + 1 + SIZE_OF_BCT_ID_T)
144  {
145  // コマンドはパケットヘッダとuint8_t 3個(from, to, index)。
147  }
148 
149  // どのモード遷移にどのブロックコマンドを登録するかを引数から読み出す
150  from = param[0];
151  to = param[1];
152  ENDIAN_memcpy(&bc_index, param + 2, SIZE_OF_BCT_ID_T);
153 
156  {
158  }
160 }
161 
163  MD_MODEID to,
164  bct_id_t bc_index)
165 {
166  if ((from >= MD_MODEID_MODE_MAX) || (to >= MD_MODEID_MODE_MAX))
167  {
168  // 定義されていないモード番号が指定された場合
169  return MM_BAD_ID;
170  }
171  else if (bc_index > MM_NOT_DEFINED)
172  {
173  // 範囲外のブロックコマンド番号が指定された場合
174  return MM_BAD_BC_INDEX;
175  }
176  else if (bc_index != MM_NOT_DEFINED && BCE_is_active(bc_index) != 1)
177  {
178  // 無効化されているブロック番号が指定された場合
179  // 定義なし用の値を特別扱いしている。
180  return MM_INACTIVE_BLOCK;
181  }
182 
183  mode_manager_.transition_table[from][to] = bc_index;
184 
185  return MM_SUCCESS;
186 }
187 
193 {
194  MD_MODEID id;
195 
196  // どのモードに遷移するかを引数から読み出す
197  id = (MD_MODEID)CCP_get_param_head(packet)[0];
198 
199  // エラー情報を保存
202  {
204  }
206 }
207 
209 {
210  size_t bc_index = MM_NOT_DEFINED;
211 
212  if (id >= MD_MODEID_MODE_MAX)
213  {
214  // 定義されていないモード番号が指定された場合
216  return MM_BAD_ID;
217  }
219  {
220  // 別のモード遷移を実行中の場合
222  return MM_OVERWRITE;
223  }
224 
225  // 実行するブロックコマンドを読み込んでみる
227 
228  if (bc_index == MM_NOT_DEFINED)
229  {
230  // 実行したいモード遷移に対応するブロックコマンドが登録されていない場合
232  return MM_ILLEGAL_MOVE;
233  }
234 
235  // ここまでくればモード遷移を実行
241 
242  return MM_SUCCESS;
243 }
244 
252 {
253  (void)packet;
254 
257  {
259  }
261 }
262 
264 {
265  TDSP_ACK ack = TDSP_UNKNOWN;
266 
268  {
269  // モード遷移が実行中でない場合
271  return MM_NOT_IN_PROGRESS;
272  }
273 
274  TMGR_clear_master_mode_cycle(); // これをstart/finish両方でしているのはなぜ?
275 
276  // タスクリストを、遷移後のモードに登録されたブロックコマンドへ更新
278 
279  switch (ack)
280  {
281  case TDSP_SUCCESS:
282  break;
283 
284  default:
286  break;
287  }
288 
290 
291  return MM_SUCCESS;
292 }
293 
294 static void MM_deploy_block_cmd_(bct_id_t bc_index)
295 {
297 }
298 
300 {
301  (void)packet;
303 
305 }
306 
308 {
309  uint8_t from, to;
310  uint16_t idx = 0;
311 
313 
314  for (from = 0; from < MD_MODEID_MODE_MAX; ++from)
315  {
316  for (to = 0; to < MD_MODEID_MODE_MAX; ++to)
317  {
318  if (mode_manager_.transition_table[from][to] == MM_NOT_DEFINED) continue;
319 
323  ++idx;
324  }
325  }
326 
327  return idx;
328 }
329 
331 {
332  if (mode >= MD_MODEID_MODE_MAX) return 0;
333  return mode_manager_.mode_list[mode];
334 }
335 
336 #pragma section
uint8_t BCE_is_active(const bct_id_t block)
BCT の length の getter
#define SIZE_OF_BCT_ID_T
bct_id_t の型サイズ.メモリインパクトがそれなりにあるので,可変に
uint16_t bct_id_t
コマンド定義
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_LENGTH
コマンド実行時のコマンド引数長エラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
uint16_t CCP_get_param_len(const CommonCmdPacket *packet)
CMD パラメタ長を取得
const uint8_t * CCP_get_param_head(const CommonCmdPacket *packet)
先頭のパラメタのポインタを取得
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_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
EL_ACK EL_record_event(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
イベント (EL_Event) を記録
Definition: event_logger.c:269
@ EL_CORE_GROUP_MODE_MANAGER
Definition: event_logger.h:208
@ EL_ERROR_LEVEL_HIGH
Definition: event_logger.h:262
@ EL_ERROR_LEVEL_LOW
Definition: event_logger.h:266
EL_GROUP
event_logger の Event Group の user 定義部分
void MD_load_transition_table(void)
void MD_load_mode_list(void)
MD_MODEID
@ MD_MODEID_START_UP
@ MD_MODEID_INITIAL
@ MD_MODEID_MODE_MAX
CCP_CmdRet Cmd_MM_SET_MODE_LIST(const CommonCmdPacket *packet)
モード遷移後にタスクリストとして実行するブロックコマンドを設定するコマンド
Definition: mode_manager.c:85
CCP_CmdRet Cmd_MM_FINISH_TRANSITION(const CommonCmdPacket *packet)
モード遷移終了を示すコマンド モード遷移のブロックコマンドの最後に入れて使う 入っていない場合、タスクリストが遷移先のモードに置き換わらないので注意
Definition: mode_manager.c:251
CCP_CmdRet Cmd_MM_UPDATE_TRANSITION_TABLE_FOR_TLM(const CommonCmdPacket *packet)
Definition: mode_manager.c:299
static MM_ACK MM_finish_transition_(void)
Cmd_MM_FINISH_TRANSITIONの実体
Definition: mode_manager.c:263
MM_ACK MM_set_mode_list(MD_MODEID mode, bct_id_t bc_index)
Cmd_MM_SET_MODE_LISTの実体
Definition: mode_manager.c:109
static void MM_deploy_block_cmd_(bct_id_t index)
(モード遷移に対応する)ブロックコマンドのタイムラインへの展開を行う
Definition: mode_manager.c:294
CCP_CmdRet Cmd_MM_START_TRANSITION(const CommonCmdPacket *packet)
モード遷移を開始するコマンド
Definition: mode_manager.c:192
const ModeManager *const mode_manager
Definition: mode_manager.c:48
static void MM_clear_transition_table_(void)
モード遷移テーブルをすべて未定義に初期化する
Definition: mode_manager.c:67
void MM_initialize(void)
モード遷移を管理する ModeManager 構造体 (mode_manager_) の初期化
Definition: mode_manager.c:50
static ModeManager mode_manager_
Definition: mode_manager.c:47
CCP_CmdRet Cmd_MM_SET_TRANSITION_TABLE(const CommonCmdPacket *packet)
モード遷移時に実行するブロックコマンドを設定するコマンド
Definition: mode_manager.c:137
MM_ACK MM_set_transition_table(MD_MODEID from, MD_MODEID to, bct_id_t bc_index)
Cmd_MM_SET_TRANSITION_TABLEの実体
Definition: mode_manager.c:162
static MM_ACK MM_start_transition_(MD_MODEID id)
Cmd_MM_START_TRANSITIONの実体
Definition: mode_manager.c:208
uint16_t MM_update_transition_table_for_tlm(void)
TLM 用情報の生成
Definition: mode_manager.c:307
bct_id_t MM_get_tasklist_id_of_mode(MD_MODEID mode)
mode に対応した TL の BCT ID を取得する
Definition: mode_manager.c:330
モード遷移の制御の定義
@ MM_STATUS_FINISHED
モード遷移終了
Definition: mode_manager.h:41
@ MM_STATUS_IN_PROGRESS
モード遷移実行中
Definition: mode_manager.h:42
#define MM_NOT_DEFINED
Definition: mode_manager.h:13
MM_ACK
ModeManager 関連関数の返り値
Definition: mode_manager.h:23
@ MM_TL_LOAD_FAILED
Task List へのモード BC 登録失敗
Definition: mode_manager.h:31
@ MM_BAD_BC_INDEX
モード用の BC の ID 異常
Definition: mode_manager.h:26
@ MM_INACTIVE_BLOCK
モード用 BC が 無効
Definition: mode_manager.h:27
@ MM_NOT_IN_PROGRESS
モード遷移中ではない
Definition: mode_manager.h:30
@ MM_OVERWRITE
別のモード遷移実行中
Definition: mode_manager.h:28
@ MM_SUCCESS
成功
Definition: mode_manager.h:24
@ MM_BAD_ID
モード番号異常
Definition: mode_manager.h:25
@ MM_ILLEGAL_MOVE
モード遷移用の BC が存在しない
Definition: mode_manager.h:29
コマンド返り値
Space Packet (コマンド用)
uint8_t to
モード遷移先
Definition: mode_manager.h:53
uint8_t from
モード遷移元
Definition: mode_manager.h:52
bct_id_t bc_index
モード遷移に該当する bc id
Definition: mode_manager.h:54
ModeManager 本体
Definition: mode_manager.h:62
MM_TransitionEdge transition_table_for_tlm[MD_MODEID_MODE_MAX *MD_MODEID_MODE_MAX]
テレメ用のテーブル
Definition: mode_manager.h:70
MD_MODEID current_id
現在のモードID
Definition: mode_manager.h:67
bct_id_t transition_table[MD_MODEID_MODE_MAX][MD_MODEID_MODE_MAX]
各モード遷移(あるモードIDからあるモードIDへの遷移)に対応するブロックコマンドを保存する
Definition: mode_manager.h:64
bct_id_t mode_list[MD_MODEID_MODE_MAX]
各モードIDに対応するブロックコマンドIDを保存する
Definition: mode_manager.h:63
MD_MODEID previous_id
ひとつ前のモードID
Definition: mode_manager.h:66
MM_STATUS stat
モード遷移状態
Definition: mode_manager.h:65
MM_ACK mm_ack
エラー情報保存用
Definition: mode_manager.h:68
TDSP_ACK TDSP_set_task_list_id(bct_id_t id)
指定した BC を TaskList に展開するものとして登録
TDSP_ACK
TDSPのエラーステータス
@ TDSP_UNKNOWN
@ TDSP_SUCCESS
void TMGR_clear_master_mode_cycle(void)
master_clock_ の mode_cycle をゼロにする
Definition: time_manager.c:57