Skip to content

Commit

Permalink
clean up cds
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed Jan 4, 2024
1 parent bf9b0ab commit 34a1da5
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 102 deletions.
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

0 comments on commit 34a1da5

Please sign in to comment.