Skip to content

Commit

Permalink
imple delete
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed May 28, 2023
1 parent afb5076 commit ce76d3a
Show file tree
Hide file tree
Showing 7 changed files with 437 additions and 353 deletions.
288 changes: 234 additions & 54 deletions Applications/telemetry_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,7 @@ static TLM_MGR_ERR_CODE TLM_MGR_register_(TLM_MGR_BC_ROLE role,
register_info = TLM_MGR_get_regitster_info_from_bc_role_(role);
if (register_info == NULL) return TLM_MGR_ERR_CIDE_INVALID_BC_ROLE;

ret = TLM_MGR_get_next_register_cmd_pos_(&register_pos, register_info);
if (ret != TLM_MGR_ERR_CODE_OK) return ret;
ret = TLM_MGR_get_next_register_cmd_elem_(register_cmd_elem, register_info);
ret = TLM_MGR_get_next_register_cmd_pos_(&register_pos, register_cmd_elem, register_info);
if (ret != TLM_MGR_ERR_CODE_OK) return ret;

ret = TLM_MGR_form_register_tlc_(&TLM_MGR_packet_,
Expand Down Expand Up @@ -412,57 +410,6 @@ static TLM_MGR_RegisterInfo* TLM_MGR_get_regitster_info_from_bc_role_(TLM_MGR_BC
}


static TLM_MGR_ERR_CODE TLM_MGR_get_next_register_cmd_pos_(BCT_Pos* next,
const TLM_MGR_RegisterInfo* register_info)
{
uint8_t idx_of_cmd_table_idxes;
uint8_t cmd_table_idx;
bct_id_t block;
uint8_t cmd_pos;

if (register_info->cmd_table_idxes_size == 0) return TLM_MGR_ERR_CODE_CMD_FULL;
if (register_info->registered_cmd_num >= register_info->cmd_table_idxes_size * TLM_MGR_MAX_CMD_NUM_PER_BC)
{
return TLM_MGR_ERR_CODE_CMD_FULL;
}

idx_of_cmd_table_idxes = register_info->registered_cmd_num / register_info->cmd_table_idxes_size;
cmd_pos = register_info->registered_cmd_num % register_info->cmd_table_idxes_size;

cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];

block = telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].bc_id;
if (BCT_make_pos(next, block, cmd_pos) != BCT_SUCCESS)
{
return TLM_MGR_ERR_CIDE_BCT_ERR;
}
return TLM_MGR_ERR_CODE_OK;
}


static TLM_MGR_ERR_CODE TLM_MGR_get_next_register_cmd_elem_(TLM_MGR_CmdTableCmdElem* cmd_elem,
const TLM_MGR_RegisterInfo* register_info)
{
uint8_t idx_of_cmd_table_idxes;
uint8_t cmd_table_idx;
uint8_t cmd_pos;

if (register_info->cmd_table_idxes_size == 0) return TLM_MGR_ERR_CODE_CMD_FULL;
if (register_info->registered_cmd_num >= register_info->cmd_table_idxes_size * TLM_MGR_MAX_CMD_NUM_PER_BC)
{
return TLM_MGR_ERR_CODE_CMD_FULL;
}

idx_of_cmd_table_idxes = register_info->registered_cmd_num / register_info->cmd_table_idxes_size;
cmd_pos = register_info->registered_cmd_num % register_info->cmd_table_idxes_size;

cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];

cmd_elem = &telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].cmds[cmd_pos];
return TLM_MGR_ERR_CODE_OK;
}


static void TLM_MGR_update_cmd_elem_of_cmd_table_(TLM_MGR_CmdTableCmdElem* cmd_elem,
TLM_MGR_CMD_TYPE cmd_type,
APID apid,
Expand Down Expand Up @@ -615,6 +562,207 @@ static TLM_MGR_ERR_CODE TLM_MGR_form_dr_replay_tlm_(packet, ti, dr_partition)
}


static TLM_MGR_ERR_CODE TLM_MGR_delete_(TLM_MGR_BC_ROLE role,
TLM_MGR_CMD_TYPE cmd_type,
APID apid,
TLM_CODE tlm_id,
uint8_t dr_partition)
{
TLM_MGR_ERR_CODE ret;
TLM_MGR_RegisterInfo* register_info;
BCT_Pos delete_pos;
BCT_Pos last_pos;
TLM_MGR_CmdTableCmdElem* delete_cmd_elem;
TLM_MGR_CmdTableCmdElem* last_cmd_elem;

register_info = TLM_MGR_get_regitster_info_from_bc_role_(role);
if (register_info == NULL) return TLM_MGR_ERR_CIDE_INVALID_BC_ROLE;

ret = TLM_MGR_find_registered_cmd_pos_(&delete_pos,
delete_cmd_elem,
register_info,
cmd_type,
apid,
tlm_id,
dr_partition);
if (ret != TLM_MGR_ERR_CODE_OK) return ret;
ret = TLM_MGR_get_last_registered_cmd_pos_(&last_pos,
last_cmd_elem,
register_info);
if (ret != TLM_MGR_ERR_CODE_OK) return ret;



register_info->registered_cmd_num--;
return TLM_MGR_ERR_CODE_OK;
}


static TLM_MGR_ERR_CODE TLM_MGR_get_next_register_cmd_pos_(BCT_Pos* next_cmd_pos,
TLM_MGR_CmdTableCmdElem* next_cmd_elem,
const TLM_MGR_RegisterInfo* register_info)
{
uint8_t idx_of_cmd_table_idxes;
uint8_t cmd_table_idx;
bct_id_t block;
uint8_t cmd_pos;

if (register_info->cmd_table_idxes_size == 0) return TLM_MGR_ERR_CODE_CMD_FULL;
if (register_info->registered_cmd_num >= register_info->cmd_table_idxes_size * TLM_MGR_MAX_CMD_NUM_PER_BC)
{
return TLM_MGR_ERR_CODE_CMD_FULL;
}

idx_of_cmd_table_idxes = register_info->registered_cmd_num / register_info->cmd_table_idxes_size;
cmd_pos = register_info->registered_cmd_num % register_info->cmd_table_idxes_size;

cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];

next_cmd_elem = &telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].cmds[cmd_pos];

block = telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].bc_id;
if (BCT_make_pos(next_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
{
return TLM_MGR_ERR_CIDE_BCT_ERR;
}
return TLM_MGR_ERR_CODE_OK;
}


static TLM_MGR_ERR_CODE TLM_MGR_get_last_registered_cmd_pos_(BCT_Pos* last_cmd_pos,
TLM_MGR_CmdTableCmdElem* last_cmd_elem,
const TLM_MGR_RegisterInfo* register_info)
{
uint8_t idx_of_cmd_table_idxes;
uint8_t cmd_table_idx;
bct_id_t block;
uint8_t cmd_pos;

if (register_info->registered_cmd_num == 0)
{
return TLM_MGR_ERR_CODE_CMD_NOT_FOUND;
}

idx_of_cmd_table_idxes = (register_info->registered_cmd_num - 1) / register_info->cmd_table_idxes_size;
cmd_pos = (register_info->registered_cmd_num - 1) % register_info->cmd_table_idxes_size;

cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];

last_cmd_elem = &telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].cmds[cmd_pos];

block = telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].bc_id;
if (BCT_make_pos(last_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
{
return TLM_MGR_ERR_CIDE_BCT_ERR;
}
return TLM_MGR_ERR_CODE_OK;
}


static TLM_MGR_ERR_CODE TLM_MGR_find_registered_cmd_pos_(BCT_Pos* found_cmd_pos,
TLM_MGR_CmdTableCmdElem* found_cmd_elem,
const TLM_MGR_RegisterInfo* register_info,
TLM_MGR_CMD_TYPE cmd_type,
APID apid,
TLM_CODE tlm_id,
uint8_t dr_partition)
{
uint8_t idx_of_cmd_table_idxes;
bct_id_t block;
uint8_t cmd_pos;
uint8_t cmd_table_idx;
TLM_MGR_CmdTableCmdElem* cmd_elem;
uint8_t count = 0;

if (register_info->registered_cmd_num == 0)
{
return TLM_MGR_ERR_CODE_CMD_NOT_FOUND;
}

for (cmd_pos = 0; cmd_pos < TLM_MGR_MAX_CMD_NUM_PER_BC; ++cmd_pos)
{
for (idx_of_cmd_table_idxes = 0; idx_of_cmd_table_idxes < register_info->cmd_table_idxes_size; ++idx_of_cmd_table_idxes)
{
cmd_table_idx = register_info->cmd_table_idxes[idx_of_cmd_table_idxes];
cmd_elem = &telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].cmds[cmd_pos];

RESULT ret = TLM_MGR_check_same_cmd_(cmd_elem,
cmd_type,
apid,
tlm_id,
dr_partition);
// 見つかった!
if (ret == RESULT_OK) break;

count++;
if (count == register_info->registered_cmd_num) return TLM_MGR_ERR_CODE_CMD_NOT_FOUND;
}
}

found_cmd_elem = cmd_elem;

block = telemetry_manager_.cmd_table.cmds_in_block[cmd_table_idx].bc_id;
if (BCT_make_pos(found_cmd_pos, block, cmd_pos) != BCT_SUCCESS)
{
return TLM_MGR_ERR_CIDE_BCT_ERR;
}
return TLM_MGR_ERR_CODE_OK;
}


static RESULT TLM_MGR_check_same_cmd_(const TLM_MGR_CmdTableCmdElem* cmd_elem,
TLM_MGR_CMD_TYPE cmd_type,
APID apid,
TLM_CODE tlm_id,
uint8_t dr_partition)
{
{
switch (cmd_type)
{
case TLM_MGR_CMD_TYPE_TG_GENERATE_MS_TLM:
if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_TG_GENERATE_MS_TLM &&
cmd_elem->tlm_id == tlm_id)
{
return RESULT_OK;
}
break;
case TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM:
if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM &&
cmd_elem->tlm_id == tlm_id &&
cmd_elem->dr_partition == dr_partition)
{
return RESULT_OK;
}
break;
case TLM_MGR_CMD_TYPE_TG_FORWARD_AS_MS_TLM:
if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_TG_FORWARD_AS_MS_TLM &&
cmd_elem->apid == apid &&
cmd_elem->tlm_id == tlm_id)
{
return RESULT_OK;
}
case TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM:
if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM &&
cmd_elem->apid == apid &&
cmd_elem->tlm_id == tlm_id &&
cmd_elem->dr_partition == dr_partition)
{
return RESULT_OK;
}
case TLM_MGR_CMD_TYPE_DR_REPLAY_TLM:
if (cmd_elem->cmd_type == TLM_MGR_CMD_TYPE_DR_REPLAY_TLM &&
cmd_elem->dr_partition == dr_partition)
{
return RESULT_OK;
}
case TLM_MGR_CMD_TYPE_UNREGISTERED: // FALLTHROUGH
default:
return RESULT_ERR;
}
return RESULT_ERR;
}


static void TLM_MGR_load_deploy_bc_(void)
{
BCL_tool_register_deploy(0, telemetry_manager_.master_bc_id, TLCD_ID_DEPLOY_TLM);
Expand Down Expand Up @@ -912,6 +1060,38 @@ CCP_CmdRet Cmd_TLM_MGR_REGISTER_REPLAY_TLM(const CommonCmdPacket* packet)
}


CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_MS_TLM(const CommonCmdPacket* packet)
{
TLM_MGR_ERR_CODE err_code;
TLM_MGR_BC_ROLE bc_role = (TLM_MGR_BC_ROLE)CCP_get_param_from_packet(packet, 0, uint8_t);
TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);

if (telemetry_manager_.is_inited == 0) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

err_code = TLM_MGR_delete_(bc_role, TLM_MGR_CMD_TYPE_TG_GENERATE_MS_TLM, APID_UNKNOWN, tlm_id, 0);
return TLM_MGR_conv_err_code_to_ccp_cmd_ret_(err_code);
}


CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_ST_TLM(const CommonCmdPacket* packet)
{
(void)packet;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_MS_TLM(const CommonCmdPacket* packet)
{
(void)packet;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_ST_TLM(const CommonCmdPacket* packet)
{
(void)packet;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}
CCP_CmdRet Cmd_TLM_MGR_DELETE_REPLAY_TLM(const CommonCmdPacket* packet)
{
(void)packet;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}

#pragma section
1 change: 1 addition & 0 deletions Applications/telemetry_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ typedef enum
{
TLM_MGR_ERR_CODE_OK,
TLM_MGR_ERR_CODE_CMD_FULL, //!< これ以上テレメ生成コマンドを登録できない
TLM_MGR_ERR_CODE_CMD_NOT_FOUND, //!< 登録コマンド消去時に,コマンドが見つからない
TLM_MGR_ERR_CIDE_INVALID_BC_ROLE, //!< 不正な TLM_MGR_BC_ROLE
TLM_MGR_ERR_CIDE_INVALID_CMD_TYPE, //!< 不正な TLM_MGR_CMD_TYPE
TLM_MGR_ERR_CIDE_BCT_ERR, //!< BCT 関連のエラー
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ Comment,,,,,Type,Description,Type,Description,Type,Description,Type,Description,
,TLM_MGR_REGISTER_FORWARD_AS_ST_TLM,OBC,0x007D,4,uint8_t,TLM_MGR_BC_ROLE,uint16_t,apid,uint8_t,tlm id,uint8_t,dr partition (dest info),,,,,,,TG_GENERATE_ST_TLM を登録,
,TLM_MGR_REGISTER_REPLAY_TLM,OBC,0x007E,2,uint8_t,TLM_MGR_BC_ROLE,uint8_t,dr partition (dest info),,,,,,,,,,,DR_REPLAY_TLM を登録,
,TLM_MGR_DELETE_GENERATE_MS_TLM,OBC,0x007F,2,uint8_t,TLM_MGR_BC_ROLE,uint8_t,tlm id,,,,,,,,,,,TG_GENERATE_MS_TLM を削除,
,TLM_MGR_DELETE_GENERATE_ST_TLM,OBC,0x0080,2,uint8_t,TLM_MGR_BC_ROLE,uint8_t,tlm id,,,,,,,,,,,TG_GENERATE_ST_TLM を削除,
,TLM_MGR_DELETE_GENERATE_ST_TLM,OBC,0x0080,3,uint8_t,TLM_MGR_BC_ROLE,uint8_t,tlm id,uint8_t,dr partition (dest info),,,,,,,,,TG_GENERATE_ST_TLM を削除,
,TLM_MGR_DELETE_FORWARD_AS_MS_TLM,OBC,0x0081,3,uint8_t,TLM_MGR_BC_ROLE,uint16_t,apid,uint8_t,tlm id,,,,,,,,,TG_GENERATE_MS_TLM を削除,
,TLM_MGR_DELETE_FORWARD_AS_ST_TLM,OBC,0x0082,3,uint8_t,TLM_MGR_BC_ROLE,uint16_t,apid,uint8_t,tlm id,,,,,,,,,TG_GENERATE_ST_TLM を削除,
,TLM_MGR_DELETE_FORWARD_AS_ST_TLM,OBC,0x0082,4,uint8_t,TLM_MGR_BC_ROLE,uint16_t,apid,uint8_t,tlm id,uint8_t,dr partition (dest info),,,,,,,TG_GENERATE_ST_TLM を削除,
,TLM_MGR_DELETE_REPLAY_TLM,OBC,0x0083,2,uint8_t,TLM_MGR_BC_ROLE,uint8_t,dr partition (dest info),,,,,,,,,,,DR_REPLAY_TLM を削除,
**,Divided Cmd Utility コマンド,,,,,,,,,,,,,,,,,,,
,DCU_ABORT_CMD,OBC,0x0084,1,uint16_t,Cmd ID,,,,,,,,,,,,,実行中の分割コマンドを停止する,
Expand Down
Loading

0 comments on commit ce76d3a

Please sign in to comment.