C2A_Core
block_command_loader.c
[詳解]
1 #pragma section REPRO
10 #include <string.h>
11 #include "block_command_loader.h"
12 #include "../Applications/timeline_command_dispatcher_id_define.h"
13 #include "block_command_executor.h"
14 #include <src_user/TlmCmd/command_definitions.h> // for rotate/combine block
15 #include "common_cmd_packet_util.h"
16 #include "../Library/endian.h"
17 
18 #define BCL_PARAM_MAX_LENGTH BCT_CMD_MAX_LENGTH
19 
20 static void BCL_register_cmd_(cycle_t ti, CMD_CODE cmd_id);
21 static void BCL_register_cmd_to_other_obc_(cycle_t ti, APID apid, CMD_CODE cmd_id);
22 static void BCL_register_app_(cycle_t ti, AR_APP_ID app_id);
23 static void BCL_clear_info_(void);
24 
25 
29 typedef struct
30 {
32  uint8_t params[BCL_PARAM_MAX_LENGTH];
35  int param_idx;
37 
39 
40 
41 void BCL_load_bc(bct_id_t pos, void (*BCL_load_func)(void))
42 {
43  if (pos >= BCT_MAX_BLOCKS) return;
44 
45  // 最初にゴミデータを消しておく
47 
48  BCT_store_pos();
49  BCT_clear_block(pos);
50 
51  BCL_load_func();
52 
53  // TODO: load内容の検証を入れる
54  // 実行時エラーなので,多少変なのはとりあえず起動させてアノマリで確認か?
55 
58 }
59 
60 #if 0
61 void BCL_safe_load_tl(bct_id_t pos, void (*BCL_load_func)(void))
62 {
63  // pass
64 }
65 
66 void BCL_safe_load_sl(bct_id_t pos, void (*BCL_load_func)(void))
67 {
68  // pass
69 }
70 #endif
71 
73 {
74  BCL_register_cmd_(ti, cmd_id);
76 }
77 
79 {
80  BCL_register_cmd_to_other_obc_(ti, apid, cmd_id);
82 }
83 
85 {
86 #if SIZE_OF_BCT_ID_T == 1
88 #elif SIZE_OF_BCT_ID_T == 2
90 #elif SIZE_OF_BCT_ID_T == 4
92 #else
93 #error Illegal value for SIZE_OF_BCT_ID_T
94 #endif
95 
98 }
99 
101 {
102 #if SIZE_OF_BCT_ID_T == 1
104 #elif SIZE_OF_BCT_ID_T == 2
106 #elif SIZE_OF_BCT_ID_T == 4
108 #else
109 #error Illegal value for SIZE_OF_BCT_ID_T
110 #endif
111 
113  BCL_clear_info_();
114 }
115 
117 {
118 #if SIZE_OF_BCT_ID_T == 1
120 #elif SIZE_OF_BCT_ID_T == 2
122 #elif SIZE_OF_BCT_ID_T == 4
124 #else
125 #error Illegal value for SIZE_OF_BCT_ID_T
126 #endif
127 
128  BCL_tool_prepare_param_uint8((uint8_t)limit_step);
129 
131  BCL_clear_info_();
132 }
133 
135 {
136  BCL_tool_prepare_param_uint8((uint8_t)tlcd_id);
137 
138 #if SIZE_OF_BCT_ID_T == 1
140 #elif SIZE_OF_BCT_ID_T == 2
142 #elif SIZE_OF_BCT_ID_T == 4
144 #else
145 #error Illegal value for SIZE_OF_BCT_ID_T
146 #endif
147 
149  BCL_clear_info_();
150 }
151 
153 {
154  BCL_register_app_(ti, app_id);
155  BCL_clear_info_();
156 }
157 
158 // TODO: prepare_param系の関数にidx超過のassertionを入れる
160 {
162  block_command_loader_.param_idx += sizeof(val);
163 }
164 
166 {
168  block_command_loader_.param_idx += sizeof(val);
169 }
170 
172 {
174  block_command_loader_.param_idx += sizeof(val);
175 }
176 
178 {
180  block_command_loader_.param_idx += sizeof(val);
181 }
182 
184 {
186  block_command_loader_.param_idx += sizeof(val);
187 }
188 
190 {
192  block_command_loader_.param_idx += sizeof(val);
193 }
194 
196 {
198  block_command_loader_.param_idx += sizeof(val);
199 }
200 
202 {
204  block_command_loader_.param_idx += sizeof(val);
205 }
206 
208 {
210  block_command_loader_.param_idx += sizeof(val);
211 }
212 
214 {
216  block_command_loader_.param_idx += sizeof(val);
217 }
218 
219 
221 {
223  ti,
224  cmd_id,
226  (uint16_t)block_command_loader_.param_idx);
228 }
229 
231 {
233  ti,
234  apid,
235  cmd_id,
237  (uint16_t)block_command_loader_.param_idx);
239 }
240 
242 {
245 }
246 
247 static void BCL_clear_info_(void)
248 {
249  memset(&block_command_loader_, 0, sizeof(block_command_loader_));
250 }
251 
252 #pragma section
APID
Application Process ID
Definition: apid_define.h:17
AR_APP_ID
Definition: app_registry.h:7
BCT_ACK BCE_activate_block(void)
block_command_table->pos の BC を activate する
BCTの実行周りの関数, パラメーター
void BCL_tool_register_rotate(cycle_t ti, bct_id_t bct_id)
ブロックコマンドの最後にローテーターの実行コマンドを追加する
static void BCL_register_cmd_to_other_obc_(cycle_t ti, APID apid, CMD_CODE cmd_id)
#define BCL_PARAM_MAX_LENGTH
void BCL_tool_prepare_param_uint32(uint32_t val)
コマンド登録前にコマンドの引数としてuint32のパラメータを追加する
void BCL_tool_register_cmd_to_other_obc(cycle_t ti, APID apid, CMD_CODE cmd_id)
ブロックコマンドの最後に他の OBC のコマンドを追加する
static void BCL_register_cmd_(cycle_t ti, CMD_CODE cmd_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_prepare_param_uint16(uint16_t val)
コマンド登録前にコマンドの引数としてuint16のパラメータを追加する
void BCL_tool_register_limit_combine(cycle_t ti, bct_id_t bct_id, step_t limit_step)
ブロックコマンドの最後にタイムリミットコンバイナーの実行コマンドを追加する
void BCL_tool_prepare_param_int32(int32_t val)
コマンド登録前にコマンドの引数としてint32のパラメータを追加する
static BlockCommandLoader block_command_loader_
void BCL_tool_register_app(cycle_t ti, AR_APP_ID app_id)
ブロックコマンドの最後にアプリの実行コマンドを追加する
void BCL_tool_prepare_param_float(float val)
コマンド登録前にコマンドの引数としてfloatのパラメータを追加する
void BCL_tool_prepare_param_int64(int64_t val)
コマンド登録前にコマンドの引数としてint64のパラメータを追加する
static void BCL_register_app_(cycle_t ti, AR_APP_ID app_id)
void BCL_tool_register_combine(cycle_t ti, bct_id_t bct_id)
ブロックコマンドの最後にコンバイナーの実行コマンドを追加する
void BCL_tool_prepare_param_int16(int16_t val)
コマンド登録前にコマンドの引数としてint16のパラメータを追加する
void BCL_tool_prepare_param_uint8(uint8_t val)
コマンド登録前にコマンドの引数としてuint8のパラメータを追加する
void BCL_tool_prepare_param_int8(int8_t val)
コマンド登録前にコマンドの引数としてint8のパラメータを追加する
void BCL_tool_register_cmd(cycle_t ti, CMD_CODE cmd_id)
ブロックコマンドの最後にコマンドを追加する
static void BCL_clear_info_(void)
void BCL_tool_prepare_param_uint64(uint64_t val)
コマンド登録前にコマンドの引数としてuint64のパラメータを追加する
void BCL_tool_prepare_param_double(double val)
コマンド登録前にコマンドの引数としてdoubleのパラメータを追加する
ブロックコマンド登録関連のユーティリティ
BCT_ACK BCT_clear_block(const bct_id_t block)
指定された block の BCT を初期化する
void BCT_restore_pos(void)
pos を pos_stored から復旧
void BCT_store_pos(void)
pos を pos_stored に保存
BCT_ACK BCT_register_cmd(const CommonCmdPacket *packet)
Cmd を block_command_table->pos に登録する
#define BCT_MAX_BLOCKS
BCのIDの最大数
uint16_t bct_id_t
コマンド定義
@ Cmd_CODE_TLCD_DEPLOY_BLOCK
@ Cmd_CODE_BCE_COMBINE_BLOCK
@ Cmd_CODE_BCE_ROTATE_BLOCK
@ Cmd_CODE_BCE_TIMELIMIT_COMBINE_BLOCK
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_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 として生成
void CCP_form_app_cmd(CommonCmdPacket *packet, cycle_t ti, AR_APP_ID id)
App 実行 TL コマンドを生成
CCP の汎用 Utility
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
uint32_t step_t
Definition: obc_time.h:11
uint32_t cycle_t
Definition: obc_time.h:10
ブロックコマンド登録中の情報を一時保存するためのバッファ
int param_idx
params配列の中で次にパラメータを登録する予定のindex
CommonCmdPacket packet
登録中のコマンドを一時保存するためのバッファ
uint8_t params[BCL_PARAM_MAX_LENGTH]
Space Packet (コマンド用)
TLCD_ID
TimeLineを選ぶときに統一的に使うコード