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

CDS: ComponentDriverSuper の整理(コードに変更なし) #271

Merged
merged 2 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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
- [#261](https://github.com/arkedge/c2a-core/pull/261): TL TLM に TL に登録された cmd 数を追加
- [#265](https://github.com/arkedge/c2a-core/pull/265): code-generator: subobc の MD5 の計算のバグ修正
- [#267](https://github.com/arkedge/c2a-core/pull/267): core tlm の tlm id の再採番 (CDIS, CA)
- [#271](https://github.com/arkedge/c2a-core/pull/271): CDS: ComponentDriverSuper の整理(コードに変更なし)

### Documentation

Expand Down
157 changes: 87 additions & 70 deletions component_driver/driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

static uint8_t CDS_hal_rx_buffer_[CDS_HAL_RX_BUFFER_SIZE]; //!< HAL_rx_handlers で受信するときの一次バッファ


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

/**
* @brief コマンド送信処理
*
Expand Down Expand Up @@ -176,7 +179,8 @@ static CDS_ERR_CODE CDS_validate_stream_config_(const ComponentDriverSuper* p_su
static CDS_ERR_CODE CDS_load_init_setting_dummy_(ComponentDriverSuper* p_super);
static CDS_ERR_CODE CDS_data_analyzer_dummy_(CDS_StreamConfig* p_stream_config, void* p_driver);

// ###### CDS_StreamRecBuffer 関連関数 ######

// ###### CDS_StreamRecBuffer 関連 static 関数 ######

/**
* @brief CDS_StreamRecBuffer のクリア
Expand Down Expand Up @@ -284,74 +288,6 @@ CDS_ERR_CODE CDS_init_streams(ComponentDriverSuper* p_super,
}


CDS_ERR_CODE CDS_reset(ComponentDriverSuper* p_super)
{
uint8_t stream;

p_super->hal_handler_id = HAL_HANDLER_ID_MAX; // FIXME: (*HAL_init_handlers[p_super->hal_handler_id])(p_super->hal_config) の様な使い方をするのでセグフォが起こる可能性があり
p_super->hal_config = NULL; // FIXME: NULL ポインタはこの関数が Reset 単体で使われるとマズい

p_super->config.settings.hal_rx_buffer_size_ = CDS_HAL_RX_BUFFER_SIZE;
p_super->config.settings.should_monitor_for_rx_disruption_ = 0;
p_super->config.settings.time_threshold_for_rx_disruption_ = 60 * 1000; // この値はよく考えること

p_super->config.info.rec_status_.ret_from_hal_rx = 0;
p_super->config.info.rec_status_.rx_disruption_status = CDS_RX_DISRUPTION_STATUS_OK;

p_super->config.info.rx_count_ = 0;
p_super->config.info.rx_call_count_ = 0;
p_super->config.info.rx_time_ = TMGR_get_master_clock();

p_super->config.internal.load_init_setting = CDS_load_init_setting_dummy_;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_ERR_CODE ret = CDS_reset_stream_config_(&p_super->stream_config[stream]);
if (ret != CDS_ERR_CODE_OK) return ret;
}

CDS_clear_rx_buffer(p_super);

return CDS_ERR_CODE_OK;
}


CDS_ERR_CODE CDS_validate_config(ComponentDriverSuper* p_super)
{
uint8_t stream;

if (p_super->hal_handler_id < 0 || p_super->hal_handler_id >= HAL_HANDLER_ID_MAX) return CDS_ERR_CODE_ERR;
if (p_super->hal_config == NULL) return CDS_ERR_CODE_ERR;

if (p_super->config.settings.hal_rx_buffer_size_ > CDS_HAL_RX_BUFFER_SIZE) return CDS_ERR_CODE_ERR;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_ERR_CODE ret = CDS_validate_stream_config_(p_super, &p_super->stream_config[stream]);
if (ret != CDS_ERR_CODE_OK) return ret;
}

return CDS_ERR_CODE_OK;
}

CDS_ERR_CODE CDS_clear_rx_buffer(ComponentDriverSuper* p_super)
{
uint8_t stream;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_clear_stream_rec_buffer_(p_super->stream_config[stream].settings.rx_buffer_);
}

// FIXME: すべての ComponentDriver の初期化で呼ばれ,無駄
memset(CDS_hal_rx_buffer_,
0x00,
sizeof(CDS_hal_rx_buffer_));

return CDS_ERR_CODE_OK;
}


CDS_ERR_CODE CDS_receive(ComponentDriverSuper* p_super)
{
uint8_t stream;
Expand Down Expand Up @@ -536,6 +472,78 @@ CDS_ERR_CODE CDS_send_req_tlm_cmd(ComponentDriverSuper* p_super, uint8_t stream)
}


// ###### ComponentDriverSuper 低レベル関数(デバッグ用, ComponentDriverUtility 用など) ######

CDS_ERR_CODE CDS_reset(ComponentDriverSuper* p_super)
{
uint8_t stream;

p_super->hal_handler_id = HAL_HANDLER_ID_MAX; // FIXME: (*HAL_init_handlers[p_super->hal_handler_id])(p_super->hal_config) の様な使い方をするのでセグフォが起こる可能性があり
p_super->hal_config = NULL; // FIXME: NULL ポインタはこの関数が Reset 単体で使われるとマズい

p_super->config.settings.hal_rx_buffer_size_ = CDS_HAL_RX_BUFFER_SIZE;
p_super->config.settings.should_monitor_for_rx_disruption_ = 0;
p_super->config.settings.time_threshold_for_rx_disruption_ = 60 * 1000; // この値はよく考えること

p_super->config.info.rec_status_.ret_from_hal_rx = 0;
p_super->config.info.rec_status_.rx_disruption_status = CDS_RX_DISRUPTION_STATUS_OK;

p_super->config.info.rx_count_ = 0;
p_super->config.info.rx_call_count_ = 0;
p_super->config.info.rx_time_ = TMGR_get_master_clock();

p_super->config.internal.load_init_setting = CDS_load_init_setting_dummy_;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_ERR_CODE ret = CDS_reset_stream_config_(&p_super->stream_config[stream]);
if (ret != CDS_ERR_CODE_OK) return ret;
}

CDS_clear_rx_buffer(p_super);

return CDS_ERR_CODE_OK;
}


CDS_ERR_CODE CDS_validate_config(ComponentDriverSuper* p_super)
{
uint8_t stream;

if (p_super->hal_handler_id < 0 || p_super->hal_handler_id >= HAL_HANDLER_ID_MAX) return CDS_ERR_CODE_ERR;
if (p_super->hal_config == NULL) return CDS_ERR_CODE_ERR;

if (p_super->config.settings.hal_rx_buffer_size_ > CDS_HAL_RX_BUFFER_SIZE) return CDS_ERR_CODE_ERR;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_ERR_CODE ret = CDS_validate_stream_config_(p_super, &p_super->stream_config[stream]);
if (ret != CDS_ERR_CODE_OK) return ret;
}

return CDS_ERR_CODE_OK;
}

CDS_ERR_CODE CDS_clear_rx_buffer(ComponentDriverSuper* p_super)
{
uint8_t stream;

for (stream = 0; stream < CDS_STREAM_MAX; ++stream)
{
CDS_clear_stream_rec_buffer_(p_super->stream_config[stream].settings.rx_buffer_);
}

// FIXME: すべての ComponentDriver の初期化で呼ばれ,無駄
memset(CDS_hal_rx_buffer_,
0x00,
sizeof(CDS_hal_rx_buffer_));

return CDS_ERR_CODE_OK;
}


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

static CDS_ERR_CODE CDS_send_cmd_(ComponentDriverSuper* p_super, uint8_t stream)
{
CDS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
Expand Down Expand Up @@ -1315,6 +1323,7 @@ static CDS_ERR_CODE CDS_data_analyzer_dummy_(CDS_StreamConfig* p_stream_config,


// ###### CDS_Config Getter/Setter of Settings ######

uint16_t CDSC_get_hal_rx_buffer_size(const ComponentDriverSuper* p_super)
{
return (uint16_t)p_super->config.settings.hal_rx_buffer_size_;
Expand Down Expand Up @@ -1357,6 +1366,7 @@ void CDSC_set_time_threshold_for_rx_disruption(ComponentDriverSuper* p_super,

// ###### CDS_Config Getter/Setter of Info ######
// FIXME: HEW で Warning が出てしまう(gcc ではでない)ので,キャストしている関数がいくつかある

const CDS_RecStatus* CDSC_get_rec_status(const ComponentDriverSuper* p_super)
{
return &p_super->config.info.rec_status_;
Expand Down Expand Up @@ -1385,6 +1395,7 @@ CDS_RX_DISRUPTION_STATUS_CODE CDSC_get_rx_disruption_status(const ComponentDrive

// ###### CDS_StreamConfig Getter/Setter of Settings ######
// FIXME: HEW で Warning が出てしまう(gcc ではでない)ので,キャストしている関数がいくつかある

uint8_t CDSSC_get_is_enabled(const CDS_StreamConfig* p_stream_config)
{
return (uint8_t)p_stream_config->settings.is_enabled_;
Expand Down Expand Up @@ -1584,6 +1595,7 @@ void CDSSC_set_data_analyzer(CDS_StreamConfig* p_stream_config,


// ###### CDS_StreamConfig Getter/Setter of Info ######

const CDS_StreamSendStatus* CDSSC_get_send_status(const CDS_StreamConfig* p_stream_config)
{
return &p_stream_config->info.send_status_;
Expand Down Expand Up @@ -1640,7 +1652,7 @@ CDS_ERR_CODE CDSSC_get_ret_from_data_analyzer(const CDS_StreamConfig* p_stream_c
}


// ###### ComponentDriver 汎用 Util 関数 ######
// ###### ComponentDriverSuper 汎用 Util 関数 ######

CDS_ERR_CODE CDS_init_stream_rec_buffer(CDS_StreamRecBuffer* stream_rec_buffer,
uint8_t* buffer,
Expand Down Expand Up @@ -1709,6 +1721,8 @@ CCP_CmdRet CDS_conv_cmd_err_to_ccp_cmd_ret(CDS_CMD_ERR_CODE code)
}


// ###### ComponentDriverSuper Stream Config 汎用 Util 関数 ######

const uint8_t* CDSSC_get_rx_frame(const CDS_StreamConfig* p_stream_config)
{
CDS_StreamRecBuffer* buffer = p_stream_config->settings.rx_buffer_;
Expand All @@ -1729,6 +1743,9 @@ uint16_t CDSSC_get_fixed_rx_frame_size(const CDS_StreamConfig* p_stream_config)
}
}


// ###### CDS_StreamRecBuffer 関連 static 関数 ######

void CDS_clear_stream_rec_buffer_(CDS_StreamRecBuffer* stream_rec_buffer)
{
if (stream_rec_buffer == NULL) return;
Expand Down
69 changes: 37 additions & 32 deletions component_driver/driver_super.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,36 +457,6 @@ CDS_ERR_CODE CDS_init_streams(ComponentDriverSuper* p_super,
CDS_StreamRecBuffer* rx_buffers[CDS_STREAM_MAX],
CDS_ERR_CODE (*load_init_setting)(ComponentDriverSuper* p_super));

/**
* @brief ComponentDriverSuper のリセット
* @note CDS_init 内で呼ばれている.
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_reset(ComponentDriverSuper* p_super);

/**
* @brief ComponentDriverSuper の設定に不整合が生じていないかチェックする
*
* ComponentDriver の設定を変えた場合は毎回呼び出すことを推奨する
* @note CDS_init 内で呼ばれている.
* @note 内部の管理フラグを変更しているので, p_super に厳密な const 性はない
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_validate_config(ComponentDriverSuper* p_super);

/**
* @brief 受信バッファをクリアする
*
* 例えば,ヘッダなしテレメの場合,途中でゴミデータが入ると以後すべてのフレームがずれてしまう.
* そのようなとき(CRC エラーがでるとか,受信データが明らかにおかしい場合)に,buffer を一度クリアし,
* 次に届くデータからフレーム解析を先頭から行うようにするために用いる.
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_clear_rx_buffer(ComponentDriverSuper* p_super);

/**
* @brief 継承先の機器からテレメトリを受信する
*
Expand Down Expand Up @@ -540,6 +510,41 @@ CDS_ERR_CODE CDS_send_general_cmd(ComponentDriverSuper* p_super, uint8_t stream)
CDS_ERR_CODE CDS_send_req_tlm_cmd(ComponentDriverSuper* p_super, uint8_t stream);


// ###### ComponentDriverSuper 低レベル関数(デバッグ用, ComponentDriverUtility 用など) ######
// user 側で直接呼ばれることはあまり想定していない.

/**
* @brief ComponentDriverSuper のリセット
* @note CDS_init 内で呼ばれている.
* @note hal_config などもすべてリセットされるので,外部からこの関数が単体で用いられることはないはず
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_reset(ComponentDriverSuper* p_super);

/**
* @brief ComponentDriverSuper の設定に不整合が生じていないかチェックする
*
* ComponentDriver の設定を変えた場合は毎回呼び出すことを推奨する
* @note CDS_init 内で呼ばれている.
* @note 内部の管理フラグを変更しているので, p_super に厳密な const 性はない
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_validate_config(ComponentDriverSuper* p_super);

/**
* @brief 受信バッファをクリアする
*
* 例えば,ヘッダなしテレメの場合,途中でゴミデータが入ると以後すべてのフレームがずれてしまう.
* そのようなとき(CRC エラーがでるとか,受信データが明らかにおかしい場合)に,buffer を一度クリアし,
* 次に届くデータからフレーム解析を先頭から行うようにするために用いる.
* @param p_super: ComponentDriverSuper 構造体へのポインタ
* @return CDS_ERR_CODE
*/
CDS_ERR_CODE CDS_clear_rx_buffer(ComponentDriverSuper* p_super);


// ###### CDS_Config Getter/Setter of Settings ######
uint16_t CDSC_get_hal_rx_buffer_size(const ComponentDriverSuper* p_super);
CDS_ERR_CODE CDSC_set_hal_rx_buffer_size(ComponentDriverSuper* p_super,
Expand Down Expand Up @@ -636,7 +641,7 @@ CDS_STREAM_TLM_DISRUPTION_STATUS_CODE CDSSC_get_tlm_disruption_status(const CDS_
CDS_ERR_CODE CDSSC_get_ret_from_data_analyzer(const CDS_StreamConfig* p_stream_config);


// ###### ComponentDriver 汎用 Util 関数 ######
// ###### ComponentDriverSuper 汎用 Util 関数 ######

/**
* @brief CDS_StreamRecBuffer に確保したメモリを与えて初期化する
Expand Down Expand Up @@ -678,7 +683,7 @@ CCP_CmdRet CDS_conv_driver_err_to_ccp_cmd_ret(CDS_DRIVER_ERR_CODE code);
CCP_CmdRet CDS_conv_cmd_err_to_ccp_cmd_ret(CDS_CMD_ERR_CODE code);


// ###### ComponentDriver Stream Config 汎用 Util 関数 ######
// ###### ComponentDriverSuper Stream Config 汎用 Util 関数 ######

/**
* @brief 確定したフレームを取得
Expand Down
Loading