Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

任意の Component Driver に対して,任意バイト列の送受信と HAL init, reopen Cmd を提供する #273

Merged
merged 22 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- [#256](https://github.com/arkedge/c2a-core/pull/256): code-generator: MOBC が定義を持っていない Sub OBC の tlm でも GS に Forward できるようにする
- [#263](https://github.com/arkedge/c2a-core/pull/263): CDIS や BCT に保存された CCP をダンプする App を追加
- [#268](https://github.com/arkedge/c2a-core/pull/268): GS と FSW 側での同期のために,BCT, TL のダイジェスト (CRC) を下ろせるようにする App の追加
- [#237](https://github.com/arkedge/c2a-core/pull/237): 任意の Component Driver に対して,任意バイト列の送受信と HAL init, reopen Cmd を提供する

### Breaking Changes

Expand Down Expand Up @@ -73,7 +74,14 @@
- ComponentDriverUtility App を追加したため,この App を利用する user は,`applications/component_driver_utility.c` をビルド対象に加え,App 登録する.
- `examples/mobc/tlm-cmd-db/TLM_DB/SAMPLE_MOBC_TLM_DB_CDRV_UTIL.csv` を user 側の tlm db に追加し,コード生成をする.
- `examples/mobc/tlm-cmd-db/CMD_DB/SAMPLE_MOBC_CMD_DB_CMD_DB.csv` の `CDRV_UTIL_*` コマンドを user 側の cmd db に追加し,コード生成をする.

- [#237](https://github.com/arkedge/c2a-core/pull/237): user 側でのコードレベルでの対応は不要
- ComponentDriverUtility App の更新
- すでに user 側に ComponentDriverUtility App が追加されていなければ,[#270](https://github.com/arkedge/c2a-core/pull/270) での差分を適用する.
- `examples/mobc/tlm-cmd-db/TLM_DB/SAMPLE_MOBC_TLM_DB_CDRV_UTIL_HAL_RX_DATA.csv` を user 側の tlm db に追加し,コード生成をする.
- `examples/mobc/tlm-cmd-db/CMD_DB/SAMPLE_MOBC_CMD_DB_CMD_DB.csv` の `CDRV_UTIL_*` コマンドを user 側の cmd db に追加し,コード生成をする.
- `examples/mobc/src/src_user/settings/applications/component_driver_utility_params.h` を参考に, user 側でもこのコードを配置する.
- pytest の追加
- もし, user 側で subobc ありの pytest を扱っている場合, `examples/subobc/src/src_user/test/test/applications/test_component_driver_utility.py` を user 側の test にも加える.

## v4.1.0 (2023-12-11)

Expand Down
177 changes: 177 additions & 0 deletions applications/component_driver_utility.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,32 @@
*/
static RESULT CDRV_UTIL_init_(void);

/**
* @brief CDS_hal_rx の wrapper
* @param[in] p_super: ComponentDriverSuper 構造体へのポインタ
* @param[out] buffer: 受信データ格納先へのポインタ
* @param[in] buffer_size: 受信データ格納先のデータサイズ
* @return CCP_CmdRet
*/
static CCP_CmdRet CDRV_UTIL_hal_rx_(ComponentDriverSuper* cds, uint8_t* buffer, int buffer_size);

/**
* @brief CDS_hal_tx の wrapper
* @param[in] p_super: ComponentDriverSuper 構造体へのポインタ
* @param[in] buffer: 送信データ格納先へのポインタ
* @param[in] buffer_size: 送信データサイズ
* @return CCP_CmdRet
*/
static CCP_CmdRet CDRV_UTIL_hal_tx_(ComponentDriverSuper* cds, const uint8_t* data, int data_size);

/**
* @brief hal handler の返り値 int を uint32_t に "適当に" 変換する
* @note hal handler の返り値は user 依存なので,あくまで適当な変換であることに注意する
* @param hal_handler_ret: hal handler の返り値
* @return uint32_t に変換された値
*/
static uint32_t CDRV_UTIL_conv_hal_handler_ret_to_u32_(int hal_handler_ret);

static ComponentDriverUtility component_driver_utility_;
const ComponentDriverUtility* const component_driver_utility = &component_driver_utility_;

Expand Down Expand Up @@ -174,6 +200,115 @@ CCP_CmdRet Cmd_CDRV_UTIL_CDSSC_SET_TIME_THRESHOLD_FOR_TLM_DISRUPTION(const Commo
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_INIT(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

component_driver_utility_.hal.last.ret_from_hal_handler = CDS_hal_init(cds);
if (component_driver_utility_.hal.last.ret_from_hal_handler != 0)
{
return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT,
CDRV_UTIL_conv_hal_handler_ret_to_u32_(component_driver_utility_.hal.last.ret_from_hal_handler));
}

return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_RX(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

return CDRV_UTIL_hal_rx_(cds, component_driver_utility_.hal.rx_buffer, CDRV_UTIL_HAX_RX_BUFFER_SIZE);
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_TX(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
uint16_t data_len = CCP_get_raw_param_len(packet);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

return CDRV_UTIL_hal_tx_(cds, CCP_get_raw_param_head(packet), data_len);
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_REOPEN(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
int32_t reason = CCP_get_param_from_packet(packet, 0, int32_t);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

component_driver_utility_.hal.last.ret_from_hal_handler = CDS_hal_reopen(cds, reason);
if (component_driver_utility_.hal.last.ret_from_hal_handler != 0)
{
return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT,
CDRV_UTIL_conv_hal_handler_ret_to_u32_(component_driver_utility_.hal.last.ret_from_hal_handler));
}

return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_RX_TO_RAM(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
uint32_t buffer_adr = CCP_get_param_from_packet(packet, 0, uint32_t);
int32_t buffer_size = CCP_get_param_from_packet(packet, 0, int32_t);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
if (buffer_size <= 0) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 2);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

return CDRV_UTIL_hal_rx_(cds, (uint8_t*)buffer_adr, buffer_size);
}



CCP_CmdRet Cmd_CDRV_UTIL_HAL_TX_FROM_RAM(const CommonCmdPacket* packet)
{
ComponentDriverSuper* cds;
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
uint32_t data_adr = CCP_get_param_from_packet(packet, 0, uint32_t);
int32_t data_size = CCP_get_param_from_packet(packet, 0, int32_t);

if (cdrv_id >= CDRV_ID_MAX) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 1);
if (data_size <= 0) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, 2);
cds = (ComponentDriverSuper*)CDRV_get_cds(cdrv_id); // const_cast
if (cds == NULL) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_CONTEXT);

return CDRV_UTIL_hal_tx_(cds, (uint8_t*)data_adr, data_size);
}


CCP_CmdRet Cmd_CDRV_UTIL_HAL_CLEAR_RX_BUFFER(const CommonCmdPacket* packet)
{
(void)packet;
memset(component_driver_utility_.hal.rx_buffer, 0x00, CDRV_UTIL_HAX_RX_BUFFER_SIZE);
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}


CCP_CmdRet Cmd_CDRV_UTIL_SET_TLM(const CommonCmdPacket* packet)
{
CDRV_ID cdrv_id = (CDRV_ID)CCP_get_param_from_packet(packet, 0, uint8_t);
Expand All @@ -188,4 +323,46 @@ CCP_CmdRet Cmd_CDRV_UTIL_SET_TLM(const CommonCmdPacket* packet)
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}


static CCP_CmdRet CDRV_UTIL_hal_rx_(ComponentDriverSuper* cds, uint8_t* buffer, int buffer_size)
{
component_driver_utility_.hal.last.data = buffer;
component_driver_utility_.hal.last.data_size = buffer_size;
component_driver_utility_.hal.last.ret_from_hal_handler = CDS_hal_rx(cds, buffer, buffer_size);

if (component_driver_utility_.hal.last.ret_from_hal_handler < 0)
{
return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT,
CDRV_UTIL_conv_hal_handler_ret_to_u32_(component_driver_utility_.hal.last.ret_from_hal_handler));
}

return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)component_driver_utility_.hal.last.ret_from_hal_handler);
}


static CCP_CmdRet CDRV_UTIL_hal_tx_(ComponentDriverSuper* cds, const uint8_t* data, int data_size)
{
component_driver_utility_.hal.last.data = data;
component_driver_utility_.hal.last.data_size = data_size;
component_driver_utility_.hal.last.ret_from_hal_handler = CDS_hal_tx(cds, data, data_size);

if (component_driver_utility_.hal.last.ret_from_hal_handler != 0)
{
return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT,
CDRV_UTIL_conv_hal_handler_ret_to_u32_(component_driver_utility_.hal.last.ret_from_hal_handler));
}

return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);
}


static uint32_t CDRV_UTIL_conv_hal_handler_ret_to_u32_(int hal_handler_ret)
{
if (hal_handler_ret < 0)
{
hal_handler_ret = 0x10000000 - hal_handler_ret;
}
return (uint32_t)hal_handler_ret;
}

#pragma section
22 changes: 22 additions & 0 deletions applications/component_driver_utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,27 @@
#include "../tlm_cmd/common_cmd_packet.h"
#include "../component_driver/component_driver.h"

#define CDRV_UTIL_HAX_RX_BUFFER_SIZE (256) //!< Cmd_CDRV_UTIL_HAL_RX で受信するデータのバッファサイズ

// CDRV_UTIL_HAX_RX_BUFFER_SIZE の user オーバーライド
#include <src_user/settings/applications/component_driver_utility_params.h>

/**
* @struct ComponentDriverUtility
* @brief ComponentDriverUtility の AppInfo 構造体
*/
typedef struct
{
struct
{
uint8_t rx_buffer[CDRV_UTIL_HAX_RX_BUFFER_SIZE]; //!< Cmd_CDRV_UTIL_HAL_RX で受信するデータのバッファ
struct
{
const uint8_t* data; //!< データアクセスのポインタ
int32_t data_size; //!< data size
int32_t ret_from_hal_handler; //!< hal handler の返り値
} last; //!< 最後の hal 操作の情報
} hal; //!< HAL low level cmd 用
struct
{
CDRV_ID cdrv_id; //!< CDRV_ID
Expand All @@ -38,6 +52,14 @@ CCP_CmdRet Cmd_CDRV_UTIL_CDSSC_ENABLE_MONITOR_FOR_TLM_DISRUPTION(const CommonCmd
CCP_CmdRet Cmd_CDRV_UTIL_CDSSC_DISABLE_MONITOR_FOR_TLM_DISRUPTION(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_CDSSC_SET_TIME_THRESHOLD_FOR_TLM_DISRUPTION(const CommonCmdPacket* packet);

CCP_CmdRet Cmd_CDRV_UTIL_HAL_INIT(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_RX(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_TX(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_REOPEN(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_RX_TO_RAM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_TX_FROM_RAM(const CommonCmdPacket* packet);
CCP_CmdRet Cmd_CDRV_UTIL_HAL_CLEAR_RX_BUFFER(const CommonCmdPacket* packet);

CCP_CmdRet Cmd_CDRV_UTIL_SET_TLM(const CommonCmdPacket* packet);

#endif
41 changes: 32 additions & 9 deletions component_driver/driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static int CDS_tx_(ComponentDriverSuper* p_super, uint8_t stream);
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @retval 0: 受信データなし
* @retval 正数: 受信データ長 [Byte]
* @retval 負数: HAL_rx_handlersのエラー
* @retval 負数: HAL_rx_handlers のエラー
*/
static int CDS_rx_(ComponentDriverSuper* p_super);

Expand Down Expand Up @@ -280,9 +280,9 @@ CDS_ERR_CODE CDS_init_streams(ComponentDriverSuper* p_super,

if (CDS_validate_config(p_super) != CDS_ERR_CODE_OK) return CDS_ERR_CODE_ERR;

// IF の初期化
// HAL の初期化
// 一旦シンプルに HAL_init_handlers のエラーコードは無視する(実機でここでエラー出る場合はコードがおかしいので.必要があれば将来実装.)
if ( (*HAL_init_handlers[p_super->hal_handler_id])(p_super->hal_config) != 0 ) return CDS_ERR_CODE_ERR;
if (CDS_hal_init(p_super) != 0 ) return CDS_ERR_CODE_ERR;

return CDS_ERR_CODE_OK;
}
Expand Down Expand Up @@ -542,6 +542,33 @@ CDS_ERR_CODE CDS_clear_rx_buffer(ComponentDriverSuper* p_super)
}


int CDS_hal_init(ComponentDriverSuper* p_super)
{
// HAL の初期化
// 一旦シンプルに HAL_init_handlers のエラーコードは無視する(実機でここでエラー出る場合はコードがおかしいので.必要があれば将来実装.)
return (*HAL_init_handlers[p_super->hal_handler_id])(p_super->hal_config);
}


int CDS_hal_rx(ComponentDriverSuper* p_super, void* buffer, int buffer_size)
{
return (*HAL_rx_handlers[p_super->hal_handler_id])(p_super->hal_config, buffer, buffer_size);
}


int CDS_hal_tx(ComponentDriverSuper* p_super, const void* data, int data_size)
{
// FIXME; HAL_tx_handlers の第二引数は const つけるべき
return (*HAL_tx_handlers[p_super->hal_handler_id])(p_super->hal_config, (void*)data, data_size); // FIXME: const_cast
}


int CDS_hal_reopen(ComponentDriverSuper* p_super, int reason)
{
return (*HAL_reopen_handlers[p_super->hal_handler_id])(p_super->hal_config, reason);
}


// ###### 送受信関連 static 関数 ######

static CDS_ERR_CODE CDS_send_cmd_(ComponentDriverSuper* p_super, uint8_t stream)
Expand Down Expand Up @@ -585,9 +612,7 @@ static int CDS_tx_(ComponentDriverSuper* p_super, uint8_t stream)
Printf("DS: tx_\n");
#endif

ret = (*HAL_tx_handlers[p_super->hal_handler_id])(p_super->hal_config,
p_stream_config->settings.tx_frame_,
(int)p_stream_config->settings.tx_frame_size_);
ret = CDS_hal_tx(p_super, p_stream_config->settings.tx_frame_, (int)p_stream_config->settings.tx_frame_size_);

if (ret != 0) return ret;
return CDS_ERR_CODE_OK;
Expand Down Expand Up @@ -615,9 +640,7 @@ static int CDS_rx_(ComponentDriverSuper* p_super)
}
if (flag == 0) return 0;

rec_data_len = (*HAL_rx_handlers[p_super->hal_handler_id])(p_super->hal_config,
CDS_hal_rx_buffer_,
p_super->config.settings.hal_rx_buffer_size_);
rec_data_len = CDS_hal_rx(p_super, CDS_hal_rx_buffer_, p_super->config.settings.hal_rx_buffer_size_);

#ifdef CDS_DEBUG
Printf("DS: rx_\n");
Expand Down
Loading
Loading