Skip to content

Commit

Permalink
impl register
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed May 28, 2023
1 parent 4388fd3 commit afb5076
Show file tree
Hide file tree
Showing 9 changed files with 700 additions and 530 deletions.
975 changes: 578 additions & 397 deletions Applications/telemetry_manager.c

Large diffs are not rendered by default.

127 changes: 58 additions & 69 deletions Applications/telemetry_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
#include <src_user/Settings/TlmCmd/Ccsds/apid_define.h>


// 以下がともに 10 であることで, (10 - 1 (TLM_MGR_BC_TYPE_MASTER)) x 10 x cycle で 10 秒周期に 100 個の tlm を登録できる.
// 以下がともに 10 であることで, 10 x 10 x cycle で 10 秒周期に最大 100 個の tlm を登録できる.
#define TLM_MGR_USE_BC_NUM (10) //!< 用いる BC の数.基本的に 10 固定を想定
#define TLM_MGR_MAX_TLM_NUM_PER_BC (10) //!< 1 BC に何個のテレメ生成コマンドを登録できるか.基本的に 10 固定を想定
#define TLM_MGR_MAX_CMD_NUM_PER_BC (10) //!< 1 BC に何個のテレメ生成などのコマンドを登録できるか.基本的に 10 固定を想定

#if BCT_MAX_CMD_NUM < TLM_MGR_MAX_TLM_NUM_PER_BC // FIXME: BCT 側が直ったらなおす
#if BCT_MAX_CMD_NUM < TLM_MGR_MAX_CMD_NUM_PER_BC // FIXME: BCT 側が直ったらなおす
#error BCT_MAX_CMD_NUM is not enough for TelemetryManager
#endif

Expand All @@ -31,94 +31,90 @@
typedef enum
{
TLM_MGR_ERR_CODE_OK,
TLM_MGR_ERR_CODE_MASTER_DUPLICATED, //!< BC 実行の masterとなる BC が重複している
TLM_MGR_ERR_CODE_MASTER_IS_ABSENT, //!< BC 実行の masterとなる BC が存在しない
TLM_MGR_ERR_CODE_REGISTER_INFO_BC_FULL, //!< RegisterInfo にこれ以上 BC を登録できない
TLM_MGR_ERR_CODE_CMD_FULL, //!< これ以上テレメ生成コマンドを登録できない
TLM_MGR_ERR_CODE_OTHER_ERR //!< その他のエラー
TLM_MGR_ERR_CODE_CMD_FULL, //!< これ以上テレメ生成コマンドを登録できない
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 関連のエラー
TLM_MGR_ERR_CODE_OTHER_ERR //!< その他のエラー
} TLM_MGR_ERR_CODE;


/**
* @enum TLM_MGR_BC_TYPE
* @enum TLM_MGR_ROLE
* @note uint8_t を想定
* @brief BC のタイプ.これにて実行種別が変わる
* @brief BC の役割.これにて実行種別が変わる
*/
typedef enum
{
TLM_MGR_BC_TYPE_MASTER, //!< 全体の BC を deploy していく BC
TLM_MGR_BC_TYPE_HK_TLM, //!< HK テレメ (or 全系や system で入れておきたい tlm (1 Hz))
TLM_MGR_BC_TYPE_HIGH_FREQ_TLM, //!< User (HIGH_FREQ) テレメ (1 Hz)
TLM_MGR_BC_TYPE_LOW_FREQ_TLM //!< User (LOW_FREQ) テレメ (1/10 Hz)
} TLM_MGR_BC_TYPE;
TLM_MGR_BC_ROLE_HK_TLM, //!< HK テレメ (or 全系や system で入れておきたい tlm (1 Hz))
TLM_MGR_BC_ROLE_HIGH_FREQ_TLM, //!< User (HIGH_FREQ) テレメ (1 Hz)
TLM_MGR_BC_ROLE_LOW_FREQ_TLM //!< User (LOW_FREQ) テレメ (1/10 Hz)
} TLM_MGR_BC_ROLE;


/**
* @enum TLM_MGR_REGISTERED_CMD_TYPE
* @enum TLM_MGR_CMD_TYPE
* @note uint8_t を想定
* @brief BC に登録された(テレメ生成などの)コマンドのタイプ
*/
typedef enum
{
TLM_MGR_REGISTERED_CMD_TYPE_UNREGISTERED = 0, //!< まだ使われていない (これは 0 であることが必要)
TLM_MGR_REGISTERED_CMD_TYPE_TG_GENERATE_MS_TLM,
TLM_MGR_REGISTERED_CMD_TYPE_TG_GENERATE_ST_TLM,
TLM_MGR_REGISTERED_CMD_TYPE_TG_GENERATE_MS_TLM,
TLM_MGR_REGISTERED_CMD_TYPE_TG_GENERATE_ST_TLM,
TLM_MGR_REGISTERED_CMD_TYPE_DR_REPLAY_TLM
} TLM_MGR_REGISTERED_CMD_TYPE;
TLM_MGR_CMD_TYPE_UNREGISTERED = 0, //!< まだ使われていない (これは 0 であることが必要)
TLM_MGR_CMD_TYPE_TG_GENERATE_MS_TLM,
TLM_MGR_CMD_TYPE_TG_GENERATE_ST_TLM,
TLM_MGR_CMD_TYPE_TG_FORWARD_AS_MS_TLM,
TLM_MGR_CMD_TYPE_TG_FORWARD_AS_ST_TLM,
TLM_MGR_CMD_TYPE_DR_REPLAY_TLM
} TLM_MGR_CMD_TYPE;


/**
* @struct TLM_MGR_BcInfo
* @brief BC の情報
* @struct TLM_MGR_RegisterInfo
* @brief どう BC を管理し,テレメ生成コマンドを登録し,動かしていくかの情報.途中計算などに使う
*/
typedef struct
{
bct_id_t bc_id;
TLM_MGR_BC_TYPE bc_type;
} TLM_MGR_BcInfo;
uint8_t cmd_table_idxes[TLM_MGR_USE_BC_NUM]; //!< TLM_MGR_CmdTable.cmds_in_block のどの idx を使うか.static 確保のため,最大数 TLM_MGR_USE_BC_NUM の配列を確保
uint8_t cmd_table_idxes_size; //!< cmd_table_idxes の配列数
uint8_t registered_cmd_num; /*!< すでに登録されているテレメ数.この値から一意に次にコマンドを登録する BCT_Pos.cmd が決まる
コマンドは隙間なく前から詰め込まれている,という想定 */
} TLM_MGR_RegisterInfo;


/**
* @struct TLM_MGR_RegisterInfo
* @brief どう BC を管理し,テレメ生成コマンドを登録し,動かしていくかの情報
* @note TLM_MGR_BcInfo の情報から生成される
* @struct TLM_MGR_CmdTableCmdElem
* @brief TLM_MGR_CmdTableInBlock の 1 cmd の情報
*/
typedef struct
{
uint8_t bc_info_idxes[TLM_MGR_USE_BC_NUM]; //!< bc_infos のどの idx の BC を使うか.static 確保のため,最大数 TLM_MGR_USE_BC_NUM の配列を確保
uint8_t bc_info_idxes_size; //!< bc_info_idxes の配列数
uint8_t registered_tlm_num; /*!< すでに登録されているテレメ数.この値から一意に次にコマンドを生成する BCT_Pos.cmd が決まる
コマンドは隙間なく前から詰め込まれている,という想定 */
} TLM_MGR_RegisterInfo;
TLM_MGR_CMD_TYPE cmd_type; //!< BC に登録された(テレメ生成などの)コマンドのタイプ (未登録は TLM_MGR_CMD_TYPE_UNREGISTERED (0))
APID apid; //!< 登録された tlm 生成コマンドの APID (未登録は 0)
TLM_CODE tlm_id; //!< 登録された tlm 生成コマンドの生成 tlm id (未登録は 0)
uint8_t dr_partition; //!< 登録された tlm 生成コマンドの dr_partition (未登録は 0)
} TLM_MGR_CmdTableCmdElem;


/**
* @struct TLM_MGR_RegisteredCmdTableInBlock
* @struct TLM_MGR_CmdTableInBlock
* @brief BC に登録された(テレメ生成などの)コマンドの情報(BC の block ごと)
* @note コマンドは隙間なく前から詰め込まれている,という想定
*/
typedef struct
{
struct
{
TLM_MGR_REGISTERED_CMD_TYPE cmd_type; //!< BC に登録された(テレメ生成などの)コマンドのタイプ (未登録は TLM_MGR_REGISTERED_CMD_TYPE_UNREGISTERED (0))
APID apid; //!< 登録された tlm 生成コマンドの APID (未登録は 0)
TLM_CODE tlm_id; /*!< 登録された tlm 生成コマンドの生成 tlm id (未登録は 0)
なお, DR 再生 Cmd_DR_REPLAY_TLM のときは, dr_partition がはいる */
} register_infos[TLM_MGR_MAX_TLM_NUM_PER_BC];
} TLM_MGR_RegisteredCmdTableInBlock;
TLM_MGR_CmdTableCmdElem cmds[TLM_MGR_MAX_CMD_NUM_PER_BC];
bct_id_t bc_id; //!< 使う BC ID
TLM_MGR_BC_ROLE bc_role; //!< その BC の役割
} TLM_MGR_CmdTableInBlock;


/**
* @struct TLM_MGR_RegisteredCmdTable
* @struct TLM_MGR_CmdTable
* @brief BC に登録された(テレメ生成などの)コマンドの情報
*/
typedef struct
{
TLM_MGR_RegisteredCmdTableInBlock cmd_infos[TLM_MGR_USE_BC_NUM]; //!< BC の各 Block ごとの情報
} TLM_MGR_RegisteredCmdTable;
TLM_MGR_CmdTableInBlock cmds_in_block[TLM_MGR_USE_BC_NUM]; //!< BC の各 Block ごとの情報
} TLM_MGR_CmdTable;


/**
Expand All @@ -127,19 +123,17 @@ typedef struct
*/
typedef struct
{
TLM_MGR_BcInfo bc_infos[TLM_MGR_USE_BC_NUM]; //!< TLM_MGR_BcInfo 配列.利用する BC の情報.
struct
{
// FIXME: master 入らないのでは? 追加登録されるわけでもないし ということで.消す.
TLM_MGR_RegisterInfo master; //!< TLM_MGR_BC_TYPE_MASTER; 全体の BC を deploy していく BC
TLM_MGR_RegisterInfo hk; /*!< TLM_MGR_BC_TYPE_HK_TLM; HK テレメ (or 全系や system で入れておきたい tlm (1 Hz))
TLM_MGR_RegisterInfo hk; /*!< TLM_MGR_BC_ROLE_HK_TLM; HK テレメ (or 全系や system で入れておきたい tlm (1 Hz))
userのtlm消去.追加の影響を受けない
これによって,tlmの全体管理が容易になる */
TLM_MGR_RegisterInfo high_freq; //!< TLM_MGR_BC_TYPE_HIGH_FREQ_TLM; User テレメ (1 Hz)
TLM_MGR_RegisterInfo low_freq; //!< TLM_MGR_BC_TYPE_LOW_FREQ_TLM; User テレメ (1/10 Hz)
TLM_MGR_RegisterInfo high_freq; //!< TLM_MGR_BC_ROLE_HIGH_FREQ_TLM; User テレメ (1 Hz)
TLM_MGR_RegisterInfo low_freq; //!< TLM_MGR_BC_ROLE_LOW_FREQ_TLM; User テレメ (1/10 Hz)
} register_info;
bct_id_t master_bc_id; //!< TLM_MGR_BC_TYPE_MASTER に登録されている BC ID
TLM_MGR_RegisteredCmdTable registered_cmd_table; //!< 現在 BC に登録された(テレメ生成などの)コマンド
TLM_MGR_CmdTable cmd_table; //!< 現在 BC に登録された(テレメ生成などの)コマンド
bct_id_t master_bc_id; //!< TLM_MGR_USE_BC_NUM 個の tlm bc を順次実行していく master BC の ID
bct_id_t deploy_bc_id; //!< master BC を deploy する BC の ID
uint8_t is_inited; //!< 初期化されているか?
} TelemetryManager;

Expand All @@ -158,49 +152,44 @@ CCP_CmdRet Cmd_TLM_MGR_INIT(const CommonCmdPacket* packet);
/**
* @brief master bc の初期化
*/
CCP_CmdRet Cmd_TLM_MGR_INIT_MASTER_BC(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_INIT_MASTER_AND_DEPLOY_BC(const CommonCmdPacket* packet);

/**
* @brief HK テレメを初期化
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_HK_TLM(const CommonCmdPacket* packet);

/**
* @brief HIGH_FREQ テレメを初期化
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_HIGH_FREQ_TLM(const CommonCmdPacket* packet);

/**
* @brief LOW_FREQ テレメを初期化
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_LOW_FREQ_TLM(const CommonCmdPacket* packet);

/**
* @brief User テレメ (HIGH_FREQ, LOW_FREQ) を初期化
* @note DCU を使っているので,完了に 0.2 秒ほどかかる
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_USER_TLM(const CommonCmdPacket* packet);

/**
* @brief TLM送出開始
* @brief TLM 送出開始
* @note master bc の末尾を Cmd_TLCD_DEPLOY_BLOCK にして deploy block しているだけ
*/
CCP_CmdRet Cmd_TLM_MGR_START_TLM(const CommonCmdPacket* packet);

/**
* @brief TLM送出一時停止
* @note master bc の末尾の Cmd_TLCD_DEPLOY_BLOCK を NOP に差し替えているだけ
* @note Cmd_TLCD_CLEAR_ALL_TIMELINE / Cmd_TLM_MGR_CLEAR_TLM_TL だと他のものも消えてしまう
* @note Cmd_TLCD_CLEAR_ALL_TIMELINE / Cmd_TLM_MGR_CLEAR_TLM_TL のほうが適切な場合もあるのでよく考えること
*/
CCP_CmdRet Cmd_TLM_MGR_STOP_TLM(const CommonCmdPacket* packet);

/**
* @brief TLM送出用TLをクリア
* @brief TLM 送出一時停止
* @note Cmd_TLCD_CLEAR_ALL_TIMELINE しているだけ
* @note Cmd_TLCD_CLEAR_ALL_TIMELINE をGSから送ってもいいが, TL No がマジックナンバーになるので.
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_TLM_TL(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_STOP_TLM(const CommonCmdPacket* packet);

// 以下,コマンド登録コマンド
CCP_CmdRet Cmd_TLM_MGR_REGISTER_GENERATE_MS_TLM(const CommonCmdPacket* packet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@

// 将来的に DR は C2A Core App に移植される予定
// DR 再生コマンドは Cmd_DR_REPLAY_TLM を仮定
#define TLM_MGR_ENABLE_DR_REPLAY_TLM //!< Telemetry Manager にて Cmd_DR_REPLAY_TLM を有効にするかどうか
// #define TLM_MGR_ENABLE_DR_REPLAY_TLM //!< Telemetry Manager にて Cmd_DR_REPLAY_TLM を有効にするかどうか

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,26 @@
#ifndef TELEMETRY_MANAGER_PARAMS_H_
#define TELEMETRY_MANAGER_PARAMS_H_

#undef TLM_MGR_BC_TYPE_AT_BC_0
#undef TLM_MGR_BC_TYPE_AT_BC_1
#undef TLM_MGR_BC_TYPE_AT_BC_2
#undef TLM_MGR_BC_TYPE_AT_BC_3
#undef TLM_MGR_BC_TYPE_AT_BC_4
#undef TLM_MGR_BC_TYPE_AT_BC_5
#undef TLM_MGR_BC_TYPE_AT_BC_6
#undef TLM_MGR_BC_TYPE_AT_BC_7
#undef TLM_MGR_BC_TYPE_AT_BC_8
#undef TLM_MGR_BC_TYPE_AT_BC_9
#undef TLM_MGR_BC_ROLE_AT_BC_0
#undef TLM_MGR_BC_ROLE_AT_BC_1
#undef TLM_MGR_BC_ROLE_AT_BC_2
#undef TLM_MGR_BC_ROLE_AT_BC_3
#undef TLM_MGR_BC_ROLE_AT_BC_4
#undef TLM_MGR_BC_ROLE_AT_BC_5
#undef TLM_MGR_BC_ROLE_AT_BC_6
#undef TLM_MGR_BC_ROLE_AT_BC_7
#undef TLM_MGR_BC_ROLE_AT_BC_8
#undef TLM_MGR_BC_ROLE_AT_BC_9

#define TLM_MGR_BC_TYPE_AT_BC_0 (TLM_MGR_BC_TYPE_MASTER)
#define TLM_MGR_BC_TYPE_AT_BC_1 (TLM_MGR_BC_TYPE_HK_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_2 (TLM_MGR_BC_TYPE_LOW_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_3 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_4 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_5 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_6 (TLM_MGR_BC_TYPE_LOW_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_7 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_8 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_TYPE_AT_BC_9 (TLM_MGR_BC_TYPE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_0 (TLM_MGR_BC_ROLE_HK_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_1 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_2 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_3 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_4 (TLM_MGR_BC_ROLE_LOW_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_5 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_6 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_7 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_8 (TLM_MGR_BC_ROLE_HIGH_FREQ_TLM)
#define TLM_MGR_BC_ROLE_AT_BC_9 (TLM_MGR_BC_ROLE_LOW_FREQ_TLM)

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ Comment,Name,ShortName,BCID,エイリアス,,,,,Danger Flag,Description,Note
*,C2Aでは使用しない,,,,,,,,,,
**,==== 追加領域 ====,,,,,,,,,,
**,Telemetry Manager,,,,,,,,,,
,BC_TLM_MGR_MASTER,,348,,,,,,,,
,BC_TLM_MGR_DEPLOY,,349,,,,,,,,
,BC_TLM_MGR_0,,350,,,,,,,,
,BC_TLM_MGR_1,,351,,,,,,,,
,BC_TLM_MGR_2,,352,,,,,,,,
Expand Down Expand Up @@ -296,5 +298,3 @@ Comment,Name,ShortName,BCID,エイリアス,,,,,Danger Flag,Description,Note
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
Loading

0 comments on commit afb5076

Please sign in to comment.