Skip to content

Commit

Permalink
create command_dispatcher_manager
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed Jul 20, 2023
1 parent 6521bc2 commit 21cd1d3
Show file tree
Hide file tree
Showing 7 changed files with 167 additions and 6 deletions.
1 change: 1 addition & 0 deletions Applications/divided_cmd_utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#define DCU_LOG_MAX (16) //!< 保存するログの最大数

// DCU_LOG_MAX の user オーバーライド
#include <src_user/Settings/Applications/divided_cmd_utility_params.h>

// key が uint8_t なので,それ以下を要請する
Expand Down
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ set(C2A_SRCS
TlmCmd/block_command_executor.c
TlmCmd/command_analyze.c
TlmCmd/command_dispatcher.c
TlmCmd/command_dispatcher_manager.c
TlmCmd/common_cmd_packet_util.c
TlmCmd/packet_handler.c
TlmCmd/packet_list_util.c
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/**
* @file
* @brief Command Dispatcher Manager のパラメタのオーバーライド用ヘッダー
*/
#ifndef COMMAND_DISPATCHER_MANAGER_PARAMS_H_
#define COMMAND_DISPATCHER_MANAGER_PARAMS_H_

#undef CDIS_MGR_MAX_NUM_OF_CDIS

#define CDIS_MGR_MAX_NUM_OF_CDIS (8) // core + AOBC

#endif
17 changes: 13 additions & 4 deletions TlmCmd/command_dispatcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
* @brief 各種コマンドの実行管理
*/
#include "command_dispatcher.h"
#include <src_user/TlmCmd/command_definitions.h>
#include "command_dispatcher_manager.h"
#include "../System/TimeManager/time_manager.h"
#include "../System/EventManager/event_logger.h"
#include "packet_handler.h"
#include <src_user/TlmCmd/command_definitions.h>

// TODO: 本当は,不正な CDISは pl == NULL などにしておくのが良さそうだが,
// 現状 PL が NULL チェックをしてないので,できない
Expand Down Expand Up @@ -35,10 +36,18 @@ static void CDIS_clear_exec_info_(CDIS_ExecInfo* exec_info);
CommandDispatcher CDIS_init(PacketList* pl)
{
CommandDispatcher cdis;
static uint8_t init_counter = 0;
static uint8_t is_first_call = 1;
static uint8_t init_counter_ = 0;

if (is_first_call)
{
CDIS_MGR_initialize();
}
is_first_call = 0;

cdis.idx = init_counter;
init_counter++;
// FIXME: カウンタやめる. mgr に登録されるものは再利用に
cdis.idx = init_counter_;
init_counter_++;

// コマンド実行情報を初期化
CDIS_clear_exec_info_(&cdis.prev);
Expand Down
4 changes: 2 additions & 2 deletions TlmCmd/command_dispatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ typedef struct
*/
typedef struct
{
uint8_t idx; //!< CDIS のインデックス. EL で用いる
uint8_t idx; //!< CDIS のインデックス. EL, command_dispatcher_manager で用いる
CDIS_ExecInfo prev; //!< 前回のコマンド実行情報
CDIS_ExecInfo prev_err; //!< 最後にエラーが出たコマンド実行情報
uint32_t error_counter; //!< エラーカウンタ
int lockout; //!< 実行中断フラグ
int stop_on_error; //!< 異常時実行中断フラグ
int stop_on_error; //!< 異常時実行中断フラグ // FIXME: きちんと実装する
PacketList* pl; //!< コマンドキュー
} CommandDispatcher;

Expand Down
74 changes: 74 additions & 0 deletions TlmCmd/command_dispatcher_manager.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#pragma section REPRO
/**
* @file
* @brief Command Dispatcher Manager
* @note 様々な CDIS を一括管理する
* @note 例えば,様々な CDIS のテレメトリをいちいち作るのはめんどくさい(とくに MOBC にある sub OBC 用の CDIS)ため,それを一括で提供する
*/
#include "command_dispatcher_manager.h"
#include <stddef.h>
#include <string.h>
#include "./common_cmd_packet_util.h"

static CommandDispatcherManager command_dispatcher_manager_;
const CommandDispatcherManager* const command_dispatcher_manager = &command_dispatcher_manager_;


static void CDIS_MGR_initialize(void)
{
uint8_t idx;
memset(&command_dispatcher_manager_, 0x00, sizeof(command_dispatcher_manager_));
for (idx = 0; idx < CDIS_MGR_MAX_NUM_OF_CDIS; ++idx)
{
command_dispatcher_manager_.cdises[idx] = NULL;
}
}


RESULT CDIS_MGR_register_cdis(const CommandDispatcher* cdis)
{
if (CDIS_MGR_find_cdis_(cdis) == RESULT_OK)
{
return RESULT_OK;
}

if (command_dispatcher_manager_.num_of_cdis >= CDIS_MGR_MAX_NUM_OF_CDIS)
{
return RESULT_ERR;
}

command_dispatcher_manager_.cdises[command_dispatcher_manager_.num_of_cdis] = cdis;
command_dispatcher_manager_.num_of_cdis++;

return RESULT_OK;
}


RESULT CDIS_MGR_find_cdis(const CommandDispatcher* cdis, uint8_t* idx)
{
uint8_t i;
for (i = 0; i < command_dispatcher_manager_.num_of_cdis; ++i)
{
if (command_dispatcher_manager_.cdises[i] == cdis)
{
*idx = i;
return RESULT_OK;
}
}
return RESULT_ERR;
}


CCP_CmdRet Cmd_CDIS_MGR_SET_IDX_FOR_TLM(const CommonCmdPacket* packet)
{
uint8_t idx_for_tlm = CCP_get_param_from_packet(packet, 0, uint8_t);
if (idx_for_tlm >= command_dispatcher_manager_.num_of_cdis)
{
CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, idx_for_tlm);
}

command_dispatcher_manager_.idx_for_tlm = idx_for_tlm;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}

#pragma section
64 changes: 64 additions & 0 deletions TlmCmd/command_dispatcher_manager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/**
* @file
* @brief Command Dispatcher Manager
* @note 様々な CDIS を一括管理する
* @note 例えば,様々な CDIS のテレメトリをいちいち作るのはめんどくさい(とくに MOBC にある sub OBC 用の CDIS)ため,それを一括で提供する
*/
#ifndef COMMAND_DISPATCHER_MANAGER_H_
#define COMMAND_DISPATCHER_MANAGER_H_

#include "./common_cmd_packet.h"
#include "./command_dispatcher.h"
#include "../Library/result.h"

#define CDIS_MGR_MAX_NUM_OF_CDIS (7) /*!< 保持する CDIS の最大数
RT, TL * 4, GS, TDSP */

// CDIS_MGR_MAX_NUM_OF_CDIS の user オーバーライド
#include <src_user/Settings/TlmCmd/command_dispatcher_manager_params.h>

/**
* @struct CommandDispatcherManager
* @brief CommandDispatcherManager の AppInfo 構造体
*/
typedef struct
{
const CommandDispatcher* cdises[CDIS_MGR_MAX_NUM_OF_CDIS];
uint8_t num_of_cdis;
uint8_t idx_for_tlm;
} CommandDispatcherManager;

extern const CommandDispatcherManager* const command_dispatcher_manager;


/**
* @brief Command Dispatcher Manager の初期化
* @param void
* @return void
*/
void CDIS_MGR_initialize(void);

// FIXME: きちんとテストする
/**
* @brief cdis を cdis mgr に登録されているか探し,見つかった場合は idx を返す
* @note CDIS_init から呼ばれることを想定
* @param[in] cdis: 探す cdis のポインタ
* @param[out] cdis: 見つかった idx
* @retval RESULT_OK: 見つかった(登録されている)
* @retval RESULT_ERR: 見つからず(登録されていない)
*/
RESULT CDIS_MGR_find_cdis(const CommandDispatcher* cdis, uint8_t* idx);

/**
* @brief cdis を cdis mgr に登録する
* @note CDIS_init から呼ばれることを想定
* @note 同じアプリ内でも CDIS_init は複数回呼ばれる可能性があるので,重複登録はケアされる
* @param cdis: 登録する cdis のポインタ
* @retval RESULT_OK: 登録に成功 or すでに登録されている
* @retval RESULT_ERR: 登録に失敗(サイズオーバー)
*/
RESULT CDIS_MGR_register_cdis(const CommandDispatcher* cdis);

CCP_CmdRet Cmd_CDIS_MGR_SET_IDX_FOR_TLM(const CommonCmdPacket* packet);

#endif

0 comments on commit 21cd1d3

Please sign in to comment.