C2A_Core
全て データ構造 ファイル 関数 変数 型定義 列挙型 列挙値 マクロ定義
packet_handler.c
[詳解]
1 #pragma section REPRO
6 #include "packet_handler.h"
7 
8 #include <stddef.h>
9 #include <string.h>
10 
11 #include "../System/TimeManager/time_manager.h"
12 #include "command_analyze.h"
13 #include "block_command_table.h"
15 #include "packet_list_util.h"
16 
21 #ifdef DR_ENABLE
22 PacketList PH_st_tlm_list;
23 PacketList PH_rp_tlm_list;
24 #endif
25 
31 #ifdef TLCD_ENABLE_MISSION_TL
32 static PL_Node PH_tl_cmd_mis_stock_[PH_TLC_MIS_LIST_MAX];
33 #endif
35 #ifdef DR_ENABLE
36 static PL_Node PH_st_tlm_stock_[PH_ST_TLM_LIST_MAX];
37 static PL_Node PH_rp_tlm_stock_[PH_RP_TLM_LIST_MAX];
38 #endif
39 
45 #ifdef TLCD_ENABLE_MISSION_TL
46 static CommonCmdPacket PH_tl_cmd_mis_ccp_stock_[PH_TLC_MIS_LIST_MAX];
47 #endif
49 #ifdef DR_ENABLE
50 static CommonTlmPacket PH_st_tlm_ctp_stock_[PH_ST_TLM_LIST_MAX];
51 static CommonTlmPacket PH_rp_tlm_ctp_stock_[PH_RP_TLM_LIST_MAX];
52 #endif
53 
54 static PH_ACK PH_add_block_cmd_(const CommonCmdPacket* packet);
55 static PH_ACK PH_add_gs_cmd_(const CommonCmdPacket* packet);
56 static PH_ACK PH_add_rt_cmd_(const CommonCmdPacket* packet);
57 static PH_ACK PH_add_tl_cmd_(TLCD_ID id,
58  const CommonCmdPacket* packet,
59  cycle_t now);
66 static PH_ACK PH_add_utl_cmd_(TLCD_ID id, const CommonCmdPacket* packet);
67 static PH_ACK PH_add_tlm_to_pl(const CommonTlmPacket* packet, PacketList* pl, CTP_DEST_FLAG dest_flag);
68 static PH_ACK PH_add_rt_tlm_(const CommonTlmPacket* packet);
69 #ifdef DR_ENABLE
70 static PH_ACK PH_add_st_tlm_(const CommonTlmPacket* packet);
71 static PH_ACK PH_add_rp_tlm_(const CommonTlmPacket* packet);
72 #endif
73 
74 
75 void PH_init(void)
76 {
79 
83 #ifdef TLCD_ENABLE_MISSION_TL
84  PL_initialize_with_ccp(PH_tl_cmd_mis_stock_, PH_tl_cmd_mis_ccp_stock_, PH_TLC_TLM_LIST_MAX, &PH_tl_cmd_list[TLCD_ID_FROM_GS_FOR_MISSION]);
85 #endif
86 
88 #ifdef DR_ENABLE
89  PL_initialize_with_ctp(PH_st_tlm_stock_, PH_st_tlm_ctp_stock_, PH_ST_TLM_LIST_MAX, &PH_st_tlm_list);
90  PL_initialize_with_ctp(PH_rp_tlm_stock_, PH_rp_tlm_ctp_stock_, PH_RP_TLM_LIST_MAX, &PH_rp_tlm_list);
91 #endif
92 
93  PH_user_init();
94 }
95 
96 
98 {
99  if (!CTCP_is_valid_packet(packet)) return PH_ACK_INVALID_PACKET;
100 
101  switch (CTCP_get_packet_type(packet))
102  {
104  // CTP 変換の NULL チェックは PH_analyze_tlm_packet 内で
106 
108  // CCP 変換の NULL チェックは PH_analyze_cmd_packet 内で
110 
111  default:
112  return PH_ACK_INVALID_PACKET;
113  }
114 
115  return PH_ACK_UNKNOWN;
116 }
117 
118 
120 {
121  PH_ACK ack;
122  if (!CCP_is_valid_packet(packet)) return PH_ACK_INVALID_PACKET;
123 
124  // ユーザー定義部
125  // 基本的には,接続されているC2Aを搭載したボードに
126  // この段階(キューイングされ,時刻調整され, PH_user_cmd_router で実行されるのではなく,この段階)で転送したいときに使う
127  ack = PH_user_analyze_cmd(packet);
128  if (ack != PH_ACK_UNKNOWN)
129  {
130  return ack;
131  }
132 
133  // ここまで来たら自分宛て
134  // 例えば以下のどれか
135  // - CCP_DEST_TYPE_TO_ME
136  // - CCP_DEST_TYPE_TO_APID でかつ, APID が自分宛てのもの
137  // - CCP_DEST_TYPE_TO_MOBC などの自分宛
138  // 統一するため上書きする
139  CCP_set_dest_type((CommonCmdPacket*)packet, CCP_DEST_TYPE_TO_ME); // const_cast
140 
141  switch (CCP_get_exec_type(packet))
142  {
143  case CCP_EXEC_TYPE_GS:
144  return PH_add_gs_cmd_(packet);
145 
148 
149  case CCP_EXEC_TYPE_BC:
150  return PH_add_block_cmd_(packet);
151 
152  case CCP_EXEC_TYPE_RT:
153  return PH_add_rt_cmd_(packet);
154 
155  case CCP_EXEC_TYPE_UTL:
156  return PH_add_utl_cmd_(TLCD_ID_FROM_GS, packet);
157 
160 
163 
164 #ifdef TLCD_ENABLE_MISSION_TL
165  case CCP_EXEC_TYPE_TL_FOR_MISSION:
166  return PH_add_tl_cmd_(TLCD_ID_FROM_GS_FOR_MISSION, packet, TMGR_get_master_total_cycle());
167 
168  case CCP_EXEC_TYPE_UTL_FOR_MISSION:
169  return PH_add_utl_cmd_(TLCD_ID_FROM_GS_FOR_MISSION, packet);
170 #endif
171 
172  default:
173  return PH_ACK_UNKNOWN;
174  }
175 }
176 
177 
179 {
180  switch (BCT_register_cmd(packet))
181  {
182  case BCT_SUCCESS:
183  return PH_ACK_BC_SUCCESS;
184 
187 
188  case BCT_INVALID_CMD_NO:
189  return PH_ACK_INVALID_PACKET;
190 
191  case BCT_ISORATED_CMD:
192  return PH_ACK_BC_ISORATED_CMD;
193 
194  case BCT_CMD_TOO_LONG:
195  return PH_ACK_BC_CMD_TOO_LONG;
196 
197  default:
198  return PH_ACK_UNKNOWN;
199  }
200 }
201 
202 
204 {
205  ctp_dest_flags_t flags;
206  if (!CTP_is_valid_packet(packet)) return PH_ACK_UNKNOWN; // FIXME: 返り値変えたい
207 
208  flags = CTP_get_dest_flags(packet);
209 
210  // FIXME: flag の match は関数化したい
211 
212  // High Priority Realtime Telemetry
213  if (flags & CTP_DEST_FLAG_HP_TLM) PH_add_rt_tlm_(packet); // hp_tlm のフラグが立っていても,RT_TLMとして処理する方針にした
214 
215  // Realtime Telemetry
216  if (flags & CTP_DEST_FLAG_RT_TLM) PH_add_rt_tlm_(packet);
217 
218 #ifdef DR_ENABLE
219  // Stored Telemetry
220  if (flags & CTP_DEST_FLAG_ST_TLM) PH_add_st_tlm_(packet);
221 
222  // Replay Telemetry
223  if (flags & CTP_DEST_FLAG_RP_TLM) PH_add_rp_tlm_(packet);
224 #endif
225 
226  // [TODO] 要検討:各Queue毎の登録エラー判定は未実装
227  return PH_ACK_SUCCESS;
228 }
229 
230 
232 {
233  if (!CCP_is_valid_packet(packet))
234  {
235  return CCP_make_cmd_ret_without_err_code(CCP_EXEC_UNKNOWN); // FIXME: 返り値変えたい
236  }
237 
238  // FIXME: CTCP, SpacePacket 整理で直す
239  if (CCP_get_apid(packet) == CCP_APID_TO_ME)
240  {
241  // 自分宛てのコマンドの場合は対応処理を呼び出し。
242  return CA_execute_cmd(packet);
243  }
244  else
245  {
246  // 別機器宛コマンドの場合はパケット分配処理へ
247  return PH_user_cmd_router(packet);
248  }
249 }
250 
251 
252 static PH_ACK PH_add_gs_cmd_(const CommonCmdPacket* packet)
253 {
254  PL_ACK ack = PL_push_back(&PH_gs_cmd_list, packet);
255 
256  if (ack != PL_SUCCESS) return PH_ACK_PL_LIST_FULL;
257 
258  return PH_ACK_SUCCESS;
259 }
260 
261 
262 static PH_ACK PH_add_rt_cmd_(const CommonCmdPacket* packet)
263 {
264  PL_ACK ack = PL_push_back(&PH_rt_cmd_list, packet);
265 
266  if (ack != PL_SUCCESS) return PH_ACK_PL_LIST_FULL;
267 
268  return PH_ACK_SUCCESS;
269 }
270 
271 
273  const CommonCmdPacket* packet,
274  cycle_t now)
275 {
276  PL_ACK ack = PL_insert_tl_cmd(&(PH_tl_cmd_list[id]), packet, now);
277 
278  switch (ack)
279  {
280  case PL_SUCCESS:
281  return PH_ACK_TLC_SUCCESS;
282 
283  case PL_LIST_FULL:
284  return PH_ACK_PL_LIST_FULL;
285 
286  case PL_TLC_PAST_TIME:
287  return PH_ACK_TLC_PAST_TIME;
288 
291 
292  default:
293  return PH_ACK_UNKNOWN;
294  }
295 }
296 
297 
299 {
300  static CommonCmdPacket temp_; // サイズが大きいため静的領域に確保
301 
302  // utl_unixtime : time_manager.h の utl_unixtime_epoch_ を参照
303  // UTL_cmd ではパケットヘッダーの ti の部分に utl_unixtime が格納されている
304  cycle_t utl_unixtime = CCP_get_ti(packet);
305  cycle_t ti = TMGR_get_ti_from_utl_unixtime(utl_unixtime);
306 
307  // TL_cmd に変換して tl_cmd_list に追加する
308  CCP_copy_packet(&temp_, packet);
309  CCP_set_ti(&temp_, ti);
310  CCP_set_exec_type(&temp_, CCP_EXEC_TYPE_TL_FROM_GS); // UTL -> TL
311 
312  return PH_add_tl_cmd_(id, &temp_, TMGR_get_master_total_cycle());
313 }
314 
315 
316 static PH_ACK PH_add_tlm_to_pl(const CommonTlmPacket* packet, PacketList* pl, CTP_DEST_FLAG dest_flag)
317 {
318  PL_Node* tail;
319  PL_ACK ack = PL_push_back(pl, packet);
320 
321  if (ack != PL_SUCCESS) return PH_ACK_PL_LIST_FULL;
322 
323  // 複数の配送先に配送されるパケットの分岐は終わっているため, dest flag を配送先のもののみにする.
324  // こうすることで, GS SW 側でのデータベース格納の処理がシンプルになる.
325  // PL_SUCCESS の場合,かならず tail に格納した packet がある.
326  // TODO: メモリコピーをなくすためにだいぶやんちゃな実装なので,ぱっといい方法が思いつくなら直す
327  tail = (PL_Node*)PL_get_tail(pl); // const_cast
329 
330  return PH_ACK_SUCCESS;
331 }
332 
333 
334 static PH_ACK PH_add_rt_tlm_(const CommonTlmPacket* packet)
335 {
337 }
338 
339 
340 #ifdef DR_ENABLE
341 static PH_ACK PH_add_st_tlm_(const CommonTlmPacket* packet)
342 {
343  return PH_add_tlm_to_pl(packet, &PH_st_tlm_list, CTP_DEST_FLAG_ST_TLM);
344 }
345 #endif
346 
347 
348 #ifdef DR_ENABLE
349 static PH_ACK PH_add_rp_tlm_(const CommonTlmPacket* packet)
350 {
351  return PH_add_tlm_to_pl(packet, &PH_rp_tlm_list, CTP_DEST_FLAG_RP_TLM);
352 }
353 #endif
354 
356 {
357  switch (type)
358  {
359  case CCP_EXEC_TYPE_GS:
360  return &PH_gs_cmd_list;
361 
363  case CCP_EXEC_TYPE_UTL:
365 
366  case CCP_EXEC_TYPE_RT:
367  return &PH_rt_cmd_list;
368 
371 
374 
375 #ifdef TLCD_ENABLE_MISSION_TL
376  case CCP_EXEC_TYPE_TL_FOR_MISSION:
377  case CCP_EXEC_TYPE_UTL_FOR_MISSION:
378  return &PH_tl_cmd_list[TLCD_ID_FROM_GS_FOR_MISSION];
379 #endif
380 
381  default:
382  break;
383  }
384 
385  return NULL;
386 }
387 
388 #pragma section
BCT_ACK BCT_register_cmd(const CommonCmdPacket *packet)
Cmd を block_command_table->pos に登録する
BCTの定義, BCT周りの関数
@ BCT_SUCCESS
@ BCT_CMD_TOO_LONG
@ BCT_INVALID_BLOCK_NO
@ BCT_INVALID_CMD_NO
@ BCT_ISORATED_CMD
CCP_CmdRet CA_execute_cmd(const CommonCmdPacket *packet)
コマンド実行の本体
コマンドの実行・登録,コマンド関連処理
void CCP_set_ti(CommonCmdPacket *packet, cycle_t ti)
TI を設定
@ CCP_EXEC_UNKNOWN
内部処理用.使わない.
CCP_EXEC_TYPE CCP_get_exec_type(const CommonCmdPacket *packet)
EXEC_TYPE を取得
void CCP_set_dest_type(CommonCmdPacket *packet, CCP_DEST_TYPE type)
DEST_TYPE を設定
APID CCP_get_apid(const CommonCmdPacket *packet)
APID を取得
void CCP_set_exec_type(CommonCmdPacket *packet, CCP_EXEC_TYPE type)
EXEC_TYPE を設定
cycle_t CCP_get_ti(const CommonCmdPacket *packet)
TI を取得
CCP_EXEC_TYPE
コマンド実行種別
@ CCP_EXEC_TYPE_TL_DEPLOY_BC
@ CCP_EXEC_TYPE_GS
GS : Ground Station Command
@ CCP_EXEC_TYPE_RT
RT : Realtime Command
@ CCP_EXEC_TYPE_BC
BC : Block Command
@ CCP_EXEC_TYPE_TL_DEPLOY_TLM
@ CCP_EXEC_TYPE_UTL
UTL: Unixtime Timeline Command
@ CCP_EXEC_TYPE_TL_FROM_GS
TL : Timeline Command
int CCP_is_valid_packet(const CommonCmdPacket *packet)
有効なパケットかチェックする
void CCP_copy_packet(CommonCmdPacket *dest, const CommonCmdPacket *src)
CommonCmdPacket をコピー
#define CCP_APID_TO_ME
@ CCP_DEST_TYPE_TO_ME
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
@ CTCP_PACKET_TYPE_TLM
@ CTCP_PACKET_TYPE_CMD
const CommonTlmPacket * CTCP_convert_to_ctp(const CommonTlmCmdPacket *ctcp)
CTCP を CTP に変換(キャスト)
int CTCP_is_valid_packet(const CommonTlmCmdPacket *packet)
有効なパケットかチェックする
CTCP_PACKET_TYPE CTCP_get_packet_type(const CommonTlmCmdPacket *packet)
tlm か cmd かを判断
const CommonCmdPacket * CTCP_convert_to_ccp(const CommonTlmCmdPacket *ctcp)
CTCP を CCP に変換(キャスト)
int CTP_is_valid_packet(const CommonTlmPacket *packet)
有効なパケットかチェックする
ctp_dest_flags_t CTP_get_dest_flags(const CommonTlmPacket *packet)
CTP_DEST_FLAG の & を取った flags を取得
uint8_t ctp_dest_flags_t
CTP_DEST_FLAG の & をとったフラグのための型
CTP_DEST_FLAG
配送先指定.テレメのキューを指定するフラグ.
@ CTP_DEST_FLAG_RT_TLM
00000010b: Realtime Telemetry
@ CTP_DEST_FLAG_HP_TLM
00000001b: High Priority Realtime Telemetry
@ CTP_DEST_FLAG_ST_TLM
00000100b: Stored Telemetry
@ CTP_DEST_FLAG_RP_TLM
00001000b: Replay Telemetry
void CTP_set_dest_flags(CommonTlmPacket *packet, ctp_dest_flags_t flags)
CTP_DEST_FLAG の & を取った flags を設定
uint32_t cycle_t
Definition: obc_time.h:10
static CommonTlmPacket PH_rt_tlm_ctp_stock_[PH_RT_TLM_LIST_MAX]
const PacketList * PH_get_packet_list_from_exec_type(CCP_EXEC_TYPE type)
CCP_EXEC_TYPE から PacketList を取得する
static PH_ACK PH_add_tlm_to_pl(const CommonTlmPacket *packet, PacketList *pl, CTP_DEST_FLAG dest_flag)
static PL_Node PH_rt_tlm_stock_[PH_RT_TLM_LIST_MAX]
PH_ACK PH_analyze_tlm_packet(const CommonTlmPacket *packet)
CTP を解析する
PacketList PH_rt_cmd_list
static PL_Node PH_tl_cmd_gs_stock_[PH_TLC_GS_LIST_MAX]
static CommonCmdPacket PH_tl_cmd_bc_ccp_stock_[PH_TLC_BC_LIST_MAX]
PacketList PH_tl_cmd_list[TLCD_ID_MAX]
static PH_ACK PH_add_block_cmd_(const CommonCmdPacket *packet)
static PL_Node PH_gs_cmd_stock_[PH_GSC_LIST_MAX]
static PH_ACK PH_add_gs_cmd_(const CommonCmdPacket *packet)
static CommonCmdPacket PH_gs_cmd_ccp_stock_[PH_GSC_LIST_MAX]
static PH_ACK PH_add_rt_cmd_(const CommonCmdPacket *packet)
static PH_ACK PH_add_rt_tlm_(const CommonTlmPacket *packet)
PacketList PH_rt_tlm_list
PH_ACK PH_analyze_cmd_packet(const CommonCmdPacket *packet)
CCP を解析する
CCP_CmdRet PH_dispatch_command(const CommonCmdPacket *packet)
CCP をコマンドとして解釈して実行,ないしは別機器へ配送する
static CommonCmdPacket PH_tl_cmd_gs_ccp_stock_[PH_TLC_GS_LIST_MAX]
PH_ACK PH_analyze_packet(const CommonTlmCmdPacket *packet)
CTCP を解析する
void PH_init(void)
Packet Handler を初期化
static PH_ACK PH_add_tl_cmd_(TLCD_ID id, const CommonCmdPacket *packet, cycle_t now)
static PL_Node PH_rt_cmd_stock_[PH_RTC_LIST_MAX]
static PH_ACK PH_add_utl_cmd_(TLCD_ID id, const CommonCmdPacket *packet)
UTL_cmd を TL_cmd に変換して tl_cmd_list に追加する
static PL_Node PH_tl_cmd_tlm_stock_[PH_TLC_TLM_LIST_MAX]
static PL_Node PH_tl_cmd_bc_stock_[PH_TLC_BC_LIST_MAX]
PacketList PH_gs_cmd_list
static CommonCmdPacket PH_tl_cmd_tlm_ccp_stock_[PH_TLC_TLM_LIST_MAX]
static CommonCmdPacket PH_rt_cmd_ccp_stock_[PH_RTC_LIST_MAX]
C2A 全体を流れる Common Packet の配送を制御する
#define PH_RP_TLM_LIST_MAX
PH_ACK
@ PH_ACK_TLC_ALREADY_EXISTS
同 TI に既に packet がいる
@ PH_ACK_TLC_PAST_TIME
既に実行時刻を過ぎている
@ PH_ACK_INVALID_PACKET
無効な Packet
@ PH_ACK_SUCCESS
OK
@ PH_ACK_TLC_SUCCESS
TL 登録に成功した
@ PH_ACK_PL_LIST_FULL
PL が一杯だった
@ PH_ACK_BC_CMD_TOO_LONG
CMD が BC には長すぎる
@ PH_ACK_BC_INVALID_BLOCK_NO
無効な BC 番号だった
@ PH_ACK_BC_SUCCESS
BC 登録に成功した
@ PH_ACK_BC_ISORATED_CMD
飛ばして BC 登録しようとした
@ PH_ACK_UNKNOWN
#define PH_GSC_LIST_MAX
#define PH_TLC_GS_LIST_MAX
#define PH_RTC_LIST_MAX
#define PH_TLC_BC_LIST_MAX
#define PH_TLC_MIS_LIST_MAX
#define PH_RT_TLM_LIST_MAX
#define PH_ST_TLM_LIST_MAX
#define PH_TLC_TLM_LIST_MAX
const PL_Node * PL_get_tail(const PacketList *pl)
PacketList の active な末端 Node を取得
Definition: packet_list.c:156
PL_ACK PL_insert_tl_cmd(PacketList *pl, const CommonCmdPacket *packet, cycle_t now)
CCP が時系列に並ぶように CCP を挿入する
Definition: packet_list.c:279
PL_ACK PL_push_back(PacketList *pl, const void *packet)
PacketList の末尾に packet を挿入
Definition: packet_list.c:189
PL_ACK
PacketList 関連操作のエラーコード
Definition: packet_list.h:39
@ PL_TLC_PAST_TIME
実行時間既に経過
Definition: packet_list.h:44
@ PL_SUCCESS
成功
Definition: packet_list.h:40
@ PL_LIST_FULL
PacketList が満杯 (inactive 無し)
Definition: packet_list.h:41
@ PL_TLC_ALREADY_EXISTS
同時刻に既に Node が存在
Definition: packet_list.h:45
PL_ACK PL_initialize_with_ctp(PL_Node *pl_node_stock, CommonTlmPacket *packet_stock, uint16_t node_num, PacketList *pl)
static に確保された PL_Node 配列と CTP 配列を受け取りその領域を使用して PL を初期化
PL_ACK PL_initialize_with_ccp(PL_Node *pl_node_stock, CommonCmdPacket *packet_stock, uint16_t node_num, PacketList *pl)
static に確保された PL_Node 配列と CCP 配列を受け取りその領域を使用して PL を初期化
PacketList の Util.User は基本こちらを使い, PL を直接使わない.
コマンド返り値
Space Packet (コマンド用)
片方向リストを構成する各 Node
Definition: packet_list.h:59
void * packet
片方向リストに格納される packet. どのような型でも良いように, void.(基本的には CTCP, CTP, CCP を想定)
Definition: packet_list.h:60
パケットリスト本体
Definition: packet_list.h:73
Space Packet
Space Packet (テレメ用)
cycle_t TMGR_get_master_total_cycle(void)
現在の total_cycle を返す
Definition: time_manager.c:97
cycle_t TMGR_get_ti_from_utl_unixtime(const cycle_t utl_unixtime)
引数で指定された utl_unixtime に対応する TI を返す
Definition: time_manager.c:211
TLCD_ID
TimeLineを選ぶときに統一的に使うコード
CCP_CmdRet PH_user_cmd_router(const CommonCmdPacket *packet)
PH の PH_dispatch_command のユーザー処理関数
PH_ACK PH_user_analyze_cmd(const CommonCmdPacket *packet)
PH の analyze_cmd_ のユーザー処理関数
void PH_user_init(void)
PH のユーザー固有部初期化処理
packet_handlerのコマンドルーター,コマンドアナライザのユーザー定義部分