Skip to content

Commit

Permalink
Merge pull request #597 from ut-issl/feature/update_tlm_mgr_for_new_tg
Browse files Browse the repository at this point in the history
Tlm Manager の 新 GENERATE_TLM 対応と,リファクタリング
  • Loading branch information
meltingrabbit authored Jun 1, 2023
2 parents aedb983 + 504929a commit f5a2571
Show file tree
Hide file tree
Showing 17 changed files with 3,725 additions and 1,638 deletions.
1,350 changes: 981 additions & 369 deletions Applications/telemetry_manager.c

Large diffs are not rendered by default.

198 changes: 114 additions & 84 deletions Applications/telemetry_manager.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* @file
* @brief userがテレメトリ詰まりをやTL溢れを防ぎつつ,またCDHなどがテレメトリを管理しやすくするためのApp
* @note https://gitlab.com/ut_issl/c2a/c2a_core_oss/-/issues/81 や telemetry_manager.h の最下部を参照(FIXME: あとでdocumentに移す)
* @note 利用方法は telemetry_manager.h の最下部を参照(FIXME: あとでdocumentに移す)
*/
#ifndef TELEMETRY_MANAGER_H_
#define TELEMETRY_MANAGER_H_
Expand All @@ -10,13 +10,15 @@
#include "../TlmCmd/common_cmd_packet.h"
#include "../TlmCmd/common_cmd_packet_util.h"
#include "../TlmCmd/block_command_table.h"
#include <src_user/TlmCmd/telemetry_definitions.h>
#include <src_user/Settings/TlmCmd/Ccsds/apid_define.h>


#define TLM_MGR_USE_BC_NUM (10) //!< 用いるBCの数.基本的に10固定を想定
#define TLM_MGR_MAX_TLM_NUM_PER_BC (10) //!< 1BCに何個のテレメ生成コマンドを登録できるか.基本的に10固定を想定
// 以下がともに 10 であることで, 10 x 10 x cycle で 10 秒周期に最大 100 個の tlm を登録できる.
#define TLM_MGR_USE_BC_NUM (10) //!< 用いる 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 @@ -29,75 +31,111 @@
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_CODE_CMD_NOT_FOUND, //!< 登録コマンド消去時に,コマンドが見つからない
TLM_MGR_ERR_CODE_INVALID_BC_ROLE, //!< 不正な TLM_MGR_BC_ROLE
TLM_MGR_ERR_CODE_INVALID_CMD_TYPE, //!< 不正な TLM_MGR_CMD_TYPE
TLM_MGR_ERR_CODE_BCT_ERR, //!< BCT 関連のエラー
TLM_MGR_ERR_CODE_OTHER_ERR //!< その他のエラー
} TLM_MGR_ERR_CODE;


/**
* @enum TLM_MGR_BC_TYPE
* @enum TLM_MGR_BC_ROLE
* @note uint8_t を想定
* @brief BCのタイプ.これにて実行種別が変わる
* @brief BC の役割.これにて実行種別が変わる
*/
typedef enum
{
TLM_MGR_BC_TYPE_MASTER,
TLM_MGR_BC_TYPE_HK_TLM,
TLM_MGR_BC_TYPE_SYSTEM_TLM,
TLM_MGR_BC_TYPE_HIGH_FREQ_TLM,
TLM_MGR_BC_TYPE_LOW_FREQ_TLM,
TLM_MGR_BC_TYPE_RESERVE
} 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;


/**
* @struct TLM_MGR_BcInfo
* @brief BCの情報
* @enum TLM_MGR_CMD_TYPE
* @note uint8_t を想定
* @brief BC に登録された(テレメ生成などの)コマンドのタイプ
*/
typedef struct
typedef enum
{
bct_id_t bc_id;
TLM_MGR_BC_TYPE bc_type;
} TLM_MGR_BcInfo;
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_RegisterInfo
* @brief どうBCを管理し,テレメ生成コマンドを登録し,動かしていくかの情報
* @note TLM_MGR_BcInfo の情報から生成される
* @brief どう BC を管理し,テレメ生成コマンドを登録し,動かしていくかの情報.途中計算などに使う
*/
typedef struct
{
uint8_t bc_info_idx[TLM_MGR_USE_BC_NUM]; //!< bc_info のどの idx の BC を使うか.static確保のため,最大数 TLM_MGR_USE_BC_NUM の配列を確保
uint8_t bc_info_idx_used_num; //!< 使用している BC 数
uint8_t tlm_register_pointer_to_idx_of_bc_info_idx; //!< 次にテレメ生成コマンドを登録した場合に使用される bc_info_idx の配列 idx
uint8_t tlm_register_pointer_to_bc_cmd_idx; //!< 次にテレメ生成コマンドを登録した場合に登録するBC pos.cmd
uint8_t cmd_table_idxes[TLM_MGR_USE_BC_NUM]; //!< TLM_MGR_CmdTable.cmd_blocks のどの 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_CmdElem
* @brief TLM_MGR_CmdBlock の 1 cmd の情報
*/
typedef struct
{
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_CmdElem;


/**
* @struct TLM_MGR_CmdBlock
* @brief BC に登録された(テレメ生成などの)コマンドの情報(BC の block ごと)
* @note コマンドは隙間なく前から詰め込まれている,という想定
*/
typedef struct
{
TLM_MGR_CmdElem cmds[TLM_MGR_MAX_CMD_NUM_PER_BC];
bct_id_t bc_id; //!< 使う BC ID
TLM_MGR_BC_ROLE bc_role; //!< その BC の役割
} TLM_MGR_CmdBlock;


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


/**
* @struct TelemetryManager
* @brief TelemetryManager の AppInfo構造体
*/
typedef struct
{
TLM_MGR_BcInfo bc_info[TLM_MGR_USE_BC_NUM];
struct
{
TLM_MGR_RegisterInfo master; //!< BC全体を展開していく master BC
TLM_MGR_RegisterInfo hk_tlm; //!< HK テレメ(1 Hz)
TLM_MGR_RegisterInfo system_tlm; /*!< 全系やsystemで入れておきたいtlm(1 Hz)
userのtlm消去.追加の影響を受けない
これによって,tlmの全体管理が容易になる */
TLM_MGR_RegisterInfo high_freq_tlm; //!< user テレメ(1 Hz)
TLM_MGR_RegisterInfo low_freq_tlm; //!< user テレメ(1/10 Hz)
TLM_MGR_RegisterInfo reserve; //!< 現状使ってないBC.浮くのが嫌なので,メンバは作るがテレメ生成コマンドは登録されない
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_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;
uint8_t is_inited; //!< 初期化されているか?
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 @@ -108,71 +146,64 @@ AppInfo TLM_MGR_create_app(void);

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

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

/**
* @brief high_freq_tlm, low_freq_tlm を初期化
* @note 便宜上 TLM_MGR_BC_TYPE_RESERVE の BC も初期化してしまう
* @brief LOW_FREQ テレメを初期化
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_CLEAR_USER_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_CLEAR_LOW_FREQ_TLM(const CommonCmdPacket* packet);

/**
* @brief TLM送出開始
* @note master bc の末尾を Cmd_TLCD_DEPLOY_BLOCK にして deploy block しているだけ
* @brief User テレメ (HIGH_FREQ, LOW_FREQ) を初期化
* @note DCU を使っているので,完了に最大 1 秒ほどかかる
*/
CCP_CmdRet Cmd_TLM_MGR_START_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_CLEAR_USER_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 のほうが適切な場合もあるのでよく考えること
* @brief TLM 送出開始
* @note master bc の末尾を Cmd_TLCD_DEPLOY_BLOCK にして deploy block しているだけ
*/
CCP_CmdRet Cmd_TLM_MGR_STOP_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_START_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);

/**
* @brief HKテレメを登録
*/
CCP_CmdRet Cmd_TLM_MGR_REGISTER_HK_TLM(const CommonCmdPacket* packet);

/**
* @brief systemテレメを登録
*/
CCP_CmdRet Cmd_TLM_MGR_REGISTER_SYSTEM_TLM(const CommonCmdPacket* packet);

/**
* @brief high_freq_tlm を登録
*/
CCP_CmdRet Cmd_TLM_MGR_REGISTER_HIGH_FREQ_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_STOP_TLM(const CommonCmdPacket* packet);

/**
* @brief low_freq_tlm を登録
*/
CCP_CmdRet Cmd_TLM_MGR_REGISTER_LOW_FREQ_TLM(const CommonCmdPacket* packet);
// 以下,コマンド登録コマンド
CCP_CmdRet Cmd_TLM_MGR_REGISTER_GENERATE_MS_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_REGISTER_GENERATE_ST_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_REGISTER_FORWARD_AS_MS_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_REGISTER_FORWARD_AS_ST_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_REGISTER_REPLAY_TLM(const CommonCmdPacket* packet);

CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_MS_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_DELETE_GENERATE_ST_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_MS_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_DELETE_FORWARD_AS_ST_TLM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_TLM_MGR_DELETE_REPLAY_TLM(const CommonCmdPacket* packet);

// TODO: いきなり設定が変わるのではなく,設定変更 → 反映,にしたい.
// CCP_CmdRet Cmd_TLM_MGR_APPLY(const CommonCmdPacket* packet);
Expand All @@ -182,17 +213,16 @@ CCP_CmdRet Cmd_TLM_MGR_REGISTER_LOW_FREQ_TLM(const CommonCmdPacket* packet);
/*
1. 初期化:Cmd_TLM_MGR_INIT
- BCをいじるため,Appの初期化では現時点でできないので,明示的に初期化する必要あり
- initial SLにいれてもいいかも
- initial SLにいれてもいいかも. DCU を使ってるので, 1 秒ほどかかる
2. 非ユーザーテレメの登録
- HK, SYSTEM TLMを登録しておく ( Cmd_TLM_MGR_REGISTER_HOGE で )
- HK TLMを登録しておく ( Cmd_TLM_MGR_REGISTER_HOGE で )
3. テレメ送出開始
- 初回は念の為 Cmd_TLM_MGR_CLEAR_TLM_TL をして,既存のTL2を消す
- Cmd_TLM_MGR_START_TLM にてテレメ送出開始
- 止めるのは Cmd_TLM_MGR_STOP_TLM
4. Cmd_TLM_MGR_REGISTER_HIGH_FREQ_TLM / Cmd_TLM_MGR_REGISTER_LOW_FREQ_TLM にて,1 Hz, 1/10 Hz のユーザーテレメを各人が好きに登録できる
5. 試験が終わったら Cmd_TLM_MGR_CLEAR_USER_TLM をして,ユーザーテレメを消す
4. Cmd_TLM_MGR_REGISTER_HOGE にて,1 Hz, 1/10 Hz のユーザーテレメを各人が好きに登録できる
5. 試験などが終わったら Cmd_TLM_MGR_CLEAR_USER_TLM をして,ユーザーテレメを消す
6. 次に使う人がいたら,4.から繰り返す
7. Cmd_TLM_MGR_DELETE_HOGE で登録したコマンドを指定して削除可能
*/

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/**
* @file
* @brief Telemetry Manager の各種定義
*/
#ifndef TELEMETRY_MANAGER_DEFINE_H_
#define TELEMETRY_MANAGER_DEFINE_H_

// 将来的に DR は C2A Core App に移植される予定
// DR 再生コマンドは 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
@@ -0,0 +1,30 @@
/**
* @file
* @brief Telemetry Manager のパラメタのオーバーライド用ヘッダー
*/
#ifndef TELEMETRY_MANAGER_PARAMS_H_
#define TELEMETRY_MANAGER_PARAMS_H_

#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_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,16 +25,18 @@ Comment,Name,ShortName,BCID,エイリアス,,,,,Danger Flag,Description,Note
*,C2Aでは使用しない,,,,,,,,,,
**,==== 追加領域 ====,,,,,,,,,,
**,Telemetry Manager,,,,,,,,,,
,BC_TLM_MGR0,,350,,,,,,,,
,BC_TLM_MGR1,,351,,,,,,,,
,BC_TLM_MGR2,,352,,,,,,,,
,BC_TLM_MGR3,,353,,,,,,,,
,BC_TLM_MGR4,,354,,,,,,,,
,BC_TLM_MGR5,,355,,,,,,,,
,BC_TLM_MGR6,,356,,,,,,,,
,BC_TLM_MGR7,,357,,,,,,,,
,BC_TLM_MGR8,,358,,,,,,,,
,BC_TLM_MGR9,,359,,,,,,,,
,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,,,,,,,,
,BC_TLM_MGR_3,,353,,,,,,,,
,BC_TLM_MGR_4,,354,,,,,,,,
,BC_TLM_MGR_5,,355,,,,,,,,
,BC_TLM_MGR_6,,356,,,,,,,,
,BC_TLM_MGR_7,,357,,,,,,,,
,BC_TLM_MGR_8,,358,,,,,,,,
,BC_TLM_MGR_9,,359,,,,,,,,
**,Test,,,,,,,,,,
,BC_TEST_EH_RESPOND,,360,,,,,,,,
,BC_TEST_BCL,,361,,,,,,,,
Expand Down Expand Up @@ -296,5 +298,3 @@ Comment,Name,ShortName,BCID,エイリアス,,,,,Danger Flag,Description,Note
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
Loading

0 comments on commit f5a2571

Please sign in to comment.