C2A_Core
timeline_command_dispatcher.c
[詳解]
1 #pragma section REPRO
3 #include "../TlmCmd/packet_handler.h"
4 #include "../System/TimeManager/time_manager.h"
5 #include "../System/EventManager/event_logger.h"
6 #include "../TlmCmd/common_cmd_packet_util.h"
7 
8 #include <string.h> // for memset
9 
13 
14 static void TLCD_gs_init_(void);
15 static void TLCD_gs_dispatch_(void);
16 static void TLCD_bc_init_(void);
17 static void TLCD_bc_dispatch_(void);
18 static void TLCD_tlm_init_(void);
19 static void TLCD_tlm_dispatch_(void);
20 #ifdef TLCD_ENABLE_MISSION_TL
21 static void TLCD_mis_init_(void);
22 static void TLCD_mis_dispatch_(void);
23 #endif
24 
30 static void TLCD_tlc_dispatcher_(TLCD_ID id);
31 
40 
42 {
44 }
45 
46 static void TLCD_gs_init_(void)
47 {
49 
50  // タイムラインコマンドのテレメトリ変数初期設定
51  // すべてのタイムラインで共用なので TLCD_gs で代表して初期化
55 
56  memset(&TLCD_null_packet_, 0, sizeof(TLCD_null_packet_));
58 }
59 
60 static void TLCD_gs_dispatch_(void)
61 {
63 }
64 
66 {
68 }
69 
70 static void TLCD_bc_init_(void)
71 {
73 }
74 
75 static void TLCD_bc_dispatch_(void)
76 {
78 }
79 
81 {
83 }
84 
85 static void TLCD_tlm_init_(void)
86 {
88 }
89 
90 static void TLCD_tlm_dispatch_(void)
91 {
93 }
94 
95 #ifdef TLCD_ENABLE_MISSION_TL
96 AppInfo TLCD_mis_create_app(void)
97 {
98  return AI_create_app_info("tlcd_mis", TLCD_mis_init_, TLCD_mis_dispatch_);
99 }
100 
101 static void TLCD_mis_init_(void)
102 {
103  timeline_command_dispatcher_.dispatcher[TLCD_ID_FROM_GS_FOR_MISSION] = CDIS_init(&(PH_tl_cmd_list[TLCD_ID_FROM_GS_FOR_MISSION]));
104 }
105 
106 static void TLCD_mis_dispatch_(void)
107 {
108  TLCD_tlc_dispatcher_(TLCD_ID_FROM_GS_FOR_MISSION);
109 }
110 #endif
111 
113 {
116 
117  switch (ack)
118  {
119  case PL_TLC_ON_TIME:
120  // 実行予定時刻ちょうど
122  break;
123 
124  case PL_TLC_PAST_TIME:
125 
126  // 実行予定時刻超過
128  {
129  // Lockout無効の場合はアノマリーを記録。
130  // Lockout有効の場合はアノマリーの連続生成を防ぐため時刻超過状態でもアノマリーを記録しない。
132  (uint32_t)id,
134  (uint32_t)CCP_get_ti( (const CommonCmdPacket*)(PL_get_head(&PH_tl_cmd_list[id])->packet) ));
135 
137  {
138  // Lockout無効かつSOE有効の場合
139  // Lockout有効とし、タイムラインコマンド処理を停止。
141  }
142  }
143 
144  // コマンド実行処理呼び出し。
145  // Lockoutとなった場合は呼び出してもコマンドは実行されない。
147  break;
148 
149  case PL_TLC_NOT_YET:
150  // 実行すべきコマンドなし。
151  break;
152 
153  default:
154  break;
155  }
156 }
157 
159 {
160  PL_Node* pos;
161  int i;
162 
163  if (id >= TLCD_ID_MAX) return TLCD_ID_MAX;
164 
165  pos = (PL_Node*)PL_get_head(&(PH_tl_cmd_list[id])); // const_cast
166  // テレメ情報生成時刻を記録
168 
169  // 全リスト内容をクリア
170  for (i = 0; i < PH_TLC_GS_LIST_MAX; ++i)
171  {
173  }
174 
175  // 登録されているTLコマンドをリストに書き込み
176  for (i = 0; pos != NULL; ++i)
177  {
179  pos = pos->next;
180  }
181 
182  return id;
183 }
184 
186 {
187  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
188 
189  if (id >= TLCD_ID_MAX)
190  {
191  // 指定されたライン番号が存在しない場合は異常判定
193  }
194 
197 }
198 
200 {
201  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
202  cycle_t time = CCP_get_param_from_packet(packet, 1, cycle_t);
203 
204  if (id >= TLCD_ID_MAX)
205  {
206  // 指定されたライン番号が存在しない場合は異常判定
208  }
209 
210  if (TLCD_drop_tl_cmd_at_(id, time) == PH_ACK_SUCCESS)
211  {
213  }
214  else
215  {
217  }
218 }
219 
221 {
222  int i;
223 
224  PL_Node* prev = NULL;
225  PL_Node* current = (PL_Node*)PL_get_head(&(PH_tl_cmd_list[id])); // const_cast
226  int active_nodes_num = PL_count_active_nodes(&PH_tl_cmd_list[id]);
227 
228  if (current == NULL) return PH_ACK_PACKET_NOT_FOUND;
229 
230  for (i = 0; i < active_nodes_num; ++i)
231  {
232  if (CCP_get_ti( (const CommonCmdPacket*)(current->packet) ) == time)
233  {
234  PL_drop_node(&(PH_tl_cmd_list[id]), prev, current);
235  break;
236  }
237  if (PL_get_next(current) == NULL) return PH_ACK_PACKET_NOT_FOUND;
238 
239  prev = current;
240  current = current->next;
241  }
242 
243  return PH_ACK_SUCCESS;
244 }
245 
247 {
248  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
249  bct_id_t block_no = CCP_get_param_from_packet(packet, 1, bct_id_t);
250  PL_ACK ack;
251 
252  if (CCP_get_param_len(packet) != (1 + SIZE_OF_BCT_ID_T))
253  {
254  // パラメータはTLライン番号(1Byte)とブロック番号。
255  // 一致しない場合は異常判定。
257  }
258 
259  if (id >= TLCD_ID_MAX)
260  {
261  // 指定されたライン番号が存在しない場合は異常判定
263  }
264 
265  if (block_no >= BCT_MAX_BLOCKS)
266  {
267  // 指定されたブロック番号が存在しない場合は異常判定
269  }
270 
272 
273  if (ack == PL_BC_LIST_CLEARED)
274  {
276  (uint32_t)PL_BC_LIST_CLEARED,
278  (uint32_t)( ((0x000000ff & id) << 24) | (0x00ffffff & block_no) ));
279  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
280  }
281  else if (ack != PL_SUCCESS)
282  {
284  (uint32_t)ack,
286  (uint32_t)( ((0x000000ff & id) << 24) | (0x00ffffff & block_no) ));
287  if (ack == PL_BC_TIME_ADJUSTED)
288  {
289  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)ack);
290  }
291  else
292  {
293  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
294  }
295  }
296 
297  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)ack);
298 }
299 
301 {
302  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
303 
304  if (id >= TLCD_ID_MAX)
305  {
306  // ライン番号が不正。
308  }
309 
310  // 当該コマンド処理機能のエラー記録を解除。
313 }
314 
316 {
317  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
318  uint8_t flag = CCP_get_param_from_packet(packet, 1, uint8_t);
319 
320  if (id >= TLCD_ID_MAX)
321  {
322  // 指定されたライン番号が存在しない場合は異常判定
324  }
325 
326  if ((flag != 0) && (flag != 1))
327  {
328  // フラグ内容が0/1でないなら異常判定。
330  }
331 
332  // 異常時実行中断フラグを設定
335 }
336 
338 {
339  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
340  uint8_t flag = CCP_get_param_from_packet(packet, 1, uint8_t);
341 
342  if (id >= TLCD_ID_MAX)
343  {
344  // 指定されたライン番号が存在しない場合は異常判定
346  }
347 
348  if ((flag != 0) && (flag != 1))
349  {
350  // フラグ情報が0/1でない場合は異常判定。
352  }
353 
354  // コマンド実行フラグを設定。
357 }
358 
360 {
361  TLCD_ID id = (TLCD_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
362 
363  if (id >= TLCD_ID_MAX)
364  {
365  // 指定されたライン番号が存在しない場合は異常判定
367  }
368 
370 
372 }
373 
375 {
376  uint8_t page = CCP_get_param_from_packet(packet, 0, uint8_t);
377 
378  if (page >= TL_TLM_PAGE_MAX)
379  {
380  // ページ番号がコマンドテーブル範囲外
382  }
383 
386 }
387 
388 #pragma section
AppInfo AI_create_app_info(const char *name, void(*initializer)(void), void(*entry_point)(void))
AppInfo を作る
Definition: app_info.c:9
#define SIZE_OF_BCT_ID_T
bct_id_t の型サイズ.メモリインパクトがそれなりにあるので,可変に
#define BCT_MAX_BLOCKS
BCのIDの最大数
uint16_t bct_id_t
void CDIS_clear_command_list(CommandDispatcher *cdis)
CDIS に登録されているコマンドキューからコマンドを削除
CommandDispatcher CDIS_init(PacketList *pl)
CDIS の初期化と取得
void CDIS_dispatch_command(CommandDispatcher *cdis)
CDIS に登録されているコマンドキューからコマンドを実行
void CDIS_clear_error_status(CommandDispatcher *cdis)
CDIS に登録されているコマンドキューのコマンド実行エラー情報を削除
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_LENGTH
コマンド実行時のコマンド引数長エラー
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
uint16_t CCP_get_param_len(const CommonCmdPacket *packet)
CMD パラメタ長を取得
cycle_t CCP_get_ti(const CommonCmdPacket *packet)
TI を取得
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 を作成(エラーコード不使用版)
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
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_TLCD_PAST_TIME
Definition: event_logger.h:211
@ EL_CORE_GROUP_TLCD_DEPLOY_BLOCK
Definition: event_logger.h:212
@ 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 定義部分
uint32_t cycle_t
Definition: obc_time.h:10
PacketList PH_tl_cmd_list[TLCD_ID_MAX]
PH_ACK
@ PH_ACK_SUCCESS
OK
@ PH_ACK_PACKET_NOT_FOUND
パケットが無い
#define PH_TLC_GS_LIST_MAX
#define TL_TLM_PAGE_MAX
PL_ACK PL_check_tl_cmd(const PacketList *pl, cycle_t time)
PacketList の先頭と time を比較
Definition: packet_list.c:397
PL_ACK PL_drop_node(PacketList *pl, PL_Node *prev, PL_Node *current)
指定された Node を落とす
Definition: packet_list.c:248
const PL_Node * PL_get_next(const PL_Node *node)
現 Node から次の Node を取得
Definition: packet_list.c:162
const PL_Node * PL_get_head(const PacketList *pl)
PacketList の active な先頭 Node を取得
Definition: packet_list.c:150
PL_ACK PL_deploy_block_cmd(PacketList *pl, const bct_id_t block, cycle_t start_at)
PacketList 上に BC を展開する
Definition: packet_list.c:340
uint16_t PL_count_active_nodes(const PacketList *pl)
PacketList で有効な(実行待ち) Node 数を返す
Definition: packet_list.c:104
PL_ACK
PacketList 関連操作のエラーコード
Definition: packet_list.h:39
@ PL_TLC_NOT_YET
まだ実行時刻ではない
Definition: packet_list.h:47
@ PL_TLC_PAST_TIME
実行時間既に経過
Definition: packet_list.h:44
@ PL_SUCCESS
成功
Definition: packet_list.h:40
@ PL_BC_TIME_ADJUSTED
同時刻に Node があったため調整せれた
Definition: packet_list.h:50
@ PL_TLC_ON_TIME
実行時刻丁度
Definition: packet_list.h:46
@ PL_BC_LIST_CLEARED
PL クリア (初期化, active 全削除) された
Definition: packet_list.h:49
コマンド返り値
Space Packet (コマンド用)
int stop_on_error
異常時実行中断フラグ
int lockout
実行中断フラグ
片方向リストを構成する各 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
Timeline コマンドの実行部と, TLテレメの情報を保持する
CommandDispatcher dispatcher[TLCD_ID_MAX]
struct TimelineCommandDispatcher::@1 tlm_info_
const CommonCmdPacket * tl_list[PH_TLC_GS_LIST_MAX]
cycle_t TMGR_get_master_total_cycle(void)
現在の total_cycle を返す
Definition: time_manager.c:97
CCP_CmdRet Cmd_TLCD_DEPLOY_BLOCK(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLCD_CLEAR_ALL_TIMELINE(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLCD_CLEAR_ERR_LOG(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLCD_SET_LOUT_FLAG(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLCD_SET_PAGE_FOR_TLM(const CommonCmdPacket *packet)
static void TLCD_bc_init_(void)
static CommonCmdPacket TLCD_null_packet_
AppInfo TLCD_tlm_create_app(void)
TL2 (TLM を登録する用の Timeline) の実行 App を作成する
TLCD_ID TLCD_update_tl_list_for_tlm(TLCD_ID id)
テレメの内容を自動更新する.
AppInfo TLCD_bc_create_app(void)
TL1 (BC を展開する用の Timeline) の実行 App を作成する
static void TLCD_gs_dispatch_(void)
static void TLCD_bc_dispatch_(void)
static TimelineCommandDispatcher timeline_command_dispatcher_
CCP_CmdRet Cmd_TLCD_CLEAR_TIMELINE_AT(const CommonCmdPacket *packet)
static void TLCD_tlm_dispatch_(void)
CCP_CmdRet Cmd_TLCD_SET_ID_FOR_TLM(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_TLCD_SET_SOE_FLAG(const CommonCmdPacket *packet)
static void TLCD_tlc_dispatcher_(TLCD_ID id)
指定された lien_no の Timeline コマンドを実行する
static PH_ACK TLCD_drop_tl_cmd_at_(TLCD_ID id, cycle_t time)
指定された時刻, id の TL コマンドを削除する
static void TLCD_tlm_init_(void)
const TimelineCommandDispatcher *const timeline_command_dispatcher
AppInfo TLCD_gs_create_app(void)
TL0 (GS から登録されるバス用の Timeline) の実行 App を作成する
static void TLCD_gs_init_(void)
TLCD_ID
TimeLineを選ぶときに統一的に使うコード