C2A_Core
block_command_table.h
[詳解]
1 
5 #ifndef BLOCK_COMMAND_TABLE_H_
6 #define BLOCK_COMMAND_TABLE_H_
7 
8 #include <stdint.h>
9 
10 #define BCT_CMD_MAX_LENGTH (64)
13 #define BCT_MAX_CMD_NUM (32)
14 
15 #define BCT_MAX_BLOCKS (383)
16 // ここ変えたら,Cmd_RESET_(RE)STORE_BCT* も変える!
17 // 2019/07/19 コメント追加
18 // MM_NOT_DEFINEDにBCT_MAX_BLOCKS が使われているので,-1されてる.
19 // けど,まあ-1する必要もあまりなさそう?
20 
21 
22 // 今後,BCTのサイズ変更がしやすいように定義する
23 // コマンドの引数長チェックもこれを用いる
24 #define SIZE_OF_BCT_ID_T (2)
25 
27 
28 #if SIZE_OF_BCT_ID_T == 1
29 typedef uint8_t bct_id_t;
30 #elif SIZE_OF_BCT_ID_T == 2
31 typedef uint16_t bct_id_t;
32 #elif SIZE_OF_BCT_ID_T == 4
33 typedef uint32_t bct_id_t;
34 #else
35 #error Illegal value for SIZE_OF_BCT_ID_T
36 #endif
37 
38 #include "common_cmd_packet.h" // bct_id_t の定義よりあとにinclude
39 
40 /*
41 Block Command Table は
42 BCT_MAX_BLOCKS x BCT_MAX_CMD_NUM
43 のテーブルであり,
44 BCT_Pos.block がブロック番号,
45 BCT_Pos.cmd がそのブロック内での位置
46 を保持している.
47 コマンドの実データを保存している本体は
48 
49 [構造体定義] [サイズ Byte]
50 BlockCommandTable 7668 at 383
51  BCT_Pos 8 : 4 * 2
52  block 2
53  cmd 1
54  BCT_Func[BCT_MAX_BLOCKS] 6128 : 4 * 4 * 383 at 383
55  BCT_Table*[BCT_MAX_BLOCKS] 1532 : 4 * 383 at 383
56 
57 BCT_Table 784767 at 383
58  length 1
59  BCT_CmdData[BCT_MAX_CMD_NUM] 2048 : 64 * 32
60  data[BCT_CMD_MAX_LENGTH] 64
61 
62 Sum 792435 : 784767 + 7668
63 なお,構造体のサイズは,そのメンバのサイズの和になるとは限らないことに注意.
64 この値は目安である.(データの効率化のために,パディングされることがあるため.)
65 */
66 
71 typedef struct
72 {
74  uint8_t cmd;
75 } BCT_Pos;
76 
83 typedef struct
84 {
85  uint8_t data[BCT_CMD_MAX_LENGTH];
86 } BCT_CmdData;
87 
92 typedef struct
93 {
94  uint8_t length;
96 } BCT_Table;
97 
104 typedef struct
105 {
106  BCT_CmdData* (*get_bc_cmd_data_)(const BCT_Pos* pos);
107  uint8_t (*get_bc_length_)(const bct_id_t block);
108  void (*set_bc_cmd_data_)(const BCT_Pos* pos, const BCT_CmdData* value);
109  void (*set_bc_length_)(const bct_id_t block, uint8_t length);
110 } BCT_Func;
111 
116 typedef struct
117 {
124 
130 typedef enum
131 {
142 
143 extern const BlockCommandTable* const block_command_table;
144 
149 void BCT_initialize(void);
150 
157 const BCT_CmdData* BCT_get_bc_cmd_data(const BCT_Pos* pos);
158 
165 uint8_t BCT_get_bc_length(const bct_id_t block);
166 
172 BCT_ACK BCT_clear_block(const bct_id_t block);
173 
180 void BCT_store_pos(void);
181 
187 void BCT_restore_pos(void);
188 
195 
203 BCT_ACK BCT_make_pos(BCT_Pos* pos, const bct_id_t block, const uint8_t cmd);
204 
213 BCT_ACK BCT_load_cmd(const BCT_Pos* pos, CommonCmdPacket* packet);
214 
221 
228 BCT_ACK BCT_overwrite_cmd(const BCT_Pos* pos, const CommonCmdPacket* packet);
229 
236 BCT_ACK BCT_copy_bct(const bct_id_t dst_block, const bct_id_t src_block);
237 
238 // 以下3つは BCT に登録されている Cmd からその内容を取り出すgetter
246 CMD_CODE BCT_get_id(const bct_id_t block, const uint8_t cmd);
247 
255 cycle_t BCT_get_ti(const bct_id_t block, const uint8_t cmd);
256 
264 const uint8_t* BCT_get_param_head(const bct_id_t block, const uint8_t cmd);
265 
275 BCT_ACK BCT_swap_address(const bct_id_t block_a, const bct_id_t block_b);
276 
286 BCT_ACK BCT_swap_contents(const bct_id_t block_a, const bct_id_t block_b);
287 
294 
300 
301 #endif
BCT_ACK BCT_copy_bct(const bct_id_t dst_block, const bct_id_t src_block)
BCT の中身を 他の BCT に COPY する
const uint8_t * BCT_get_param_head(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の param_head の getter
BCT_ACK BCT_overwrite_cmd(const BCT_Pos *pos, const CommonCmdPacket *packet)
既に登録されている BC の Cmd の中身を外部から上書きする
CCP_CmdRet Cmd_BCT_FILL_NOP(const CommonCmdPacket *packet)
BCT_ACK BCT_clear_block(const bct_id_t block)
指定された block の BCT を初期化する
cycle_t BCT_get_ti(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の TI の getter
void BCT_restore_pos(void)
pos を pos_stored から復旧
BCT_ACK BCT_make_pos(BCT_Pos *pos, const bct_id_t block, const uint8_t cmd)
BCT_Pos* を引数から作る
CCP_CmdRet Cmd_BCT_OVERWRITE_CMD(const CommonCmdPacket *packet)
CCP_CmdRet Cmd_BCT_SET_BLOCK_POSITION(const CommonCmdPacket *packet)
BCT_ACK BCT_load_cmd(const BCT_Pos *pos, CommonCmdPacket *packet)
保存データを CCP にコピーする.
void BCT_initialize(void)
BCT の初期化関数
#define BCT_CMD_MAX_LENGTH
const BCT_CmdData * BCT_get_bc_cmd_data(const BCT_Pos *pos)
BCT_CmdData の const pointer getter
const BlockCommandTable *const block_command_table
CCP_CmdRet Cmd_BCT_CLEAR_BLOCK(const CommonCmdPacket *packet)
CMD_CODE BCT_get_id(const bct_id_t block, const uint8_t cmd)
BCT 内の Cmd の CMD_CODE の getter
void BCT_store_pos(void)
pos を pos_stored に保存
#define BCT_MAX_BLOCKS
BCのIDの最大数
CCP_CmdRet BCT_convert_bct_ack_to_ccp_cmd_ret(BCT_ACK ack)
返り値用 enum 変換用関数
uint16_t bct_id_t
BCT_ACK BCT_swap_contents(const bct_id_t block_a, const bct_id_t block_b)
BCT の block の指す中身を入れ替える
BCT_ACK BCT_swap_address(const bct_id_t block_a, const bct_id_t block_b)
BCT の block の指すポインタ & func を入れ替える
CCP_CmdRet Cmd_BCT_COPY_BCT(const CommonCmdPacket *packet)
uint8_t BCT_get_bc_length(const bct_id_t block)
BCT の length の getter
BCT_ACK BCT_check_position(const BCT_Pos *pos)
BCT_Pos* の validate
BCT_ACK
BCT 関係の関数のエラーステータス
@ BCT_UNKNOWN
@ BCT_SUCCESS
@ BCT_CMD_TOO_LONG
@ BCT_INVALID_BLOCK_NO
@ BCT_ZERO_PERIOD
@ BCT_INVALID_CMD_NO
@ BCT_DEFECTIVE_BLOCK
@ BCT_BC_FULL
@ BCT_ISORATED_CMD
BCT_ACK BCT_register_cmd(const CommonCmdPacket *packet)
Cmd を block_command_table->pos に登録する
#define BCT_MAX_CMD_NUM
1つのBCに最大何個のコマンドを挿入できるか
BCTのCoreTlmパラメタのオーバーライド用ヘッダー
CCP 関連基本関数の宣言
uint32_t cycle_t
Definition: obc_time.h:10
C89 環境用 stdint.h
Cmd の保存場所
各setter, getter が入る
BCT内での作業中の位置情報
uint8_t cmd
そのブロック内でどのコマンドを指すか
bct_id_t block
ブロックの位置情報
BCT の本体. 実際に BC の cmd が確保されている
uint8_t length
cmds に保存されているコマンド数
BCT 全体の構造体
BCT_Pos pos
登録などの作業中の位置情報
コマンド返り値
Space Packet (コマンド用)