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

DS_IF_RX_BUFFER_SIZE の可変長化 #506

Merged
merged 1 commit into from
Mar 4, 2023
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
31 changes: 24 additions & 7 deletions Drivers/Super/driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,11 @@ static DS_ERR_CODE DS_reset_stream_config_(DS_StreamConfig* p_stream_config);

/**
* @brief DS_StreamConfig 構造体のバリデーション
* @param p_super: DriverSuper 構造体へのポインタ
* @param p_stream_config: DriverSuper 構造体の DS_StreamConfig
* @return DS_ERR_CODE
*/
static DS_ERR_CODE DS_validate_stream_config_(DS_StreamConfig* p_stream_config);
static DS_ERR_CODE DS_validate_stream_config_(const DriverSuper* p_super, DS_StreamConfig* p_stream_config);

// ダミー関数
// EQU だと関数ポインタの初期値を NULL にしていたためにぬるぽで事故ったので
Expand Down Expand Up @@ -290,6 +291,7 @@ DS_ERR_CODE DS_reset(DriverSuper* p_super)
p_super->interface = IF_LIST_MAX; // FIXME: (*IF_init[p_super->interface])(p_super->if_config) の様な使い方をするのでセグフォが起こる可能性があり
p_super->if_config = NULL; // FIXME: NULL ポインタはこの関数が Reset 単体で使われるとマズい

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

Expand Down Expand Up @@ -321,9 +323,11 @@ DS_ERR_CODE DS_validate_config(DriverSuper* p_super)
if (p_super->interface < 0 || p_super->interface >= IF_LIST_MAX) return DS_ERR_CODE_ERR;
if (p_super->if_config == NULL) return DS_ERR_CODE_ERR;

if (p_super->config.settings.rx_buffer_size_in_if_rx_ > DS_IF_RX_BUFFER_SIZE) return DS_ERR_CODE_ERR;

for (stream = 0; stream < DS_STREAM_MAX; ++stream)
{
DS_ERR_CODE ret = DS_validate_stream_config_(&p_super->stream_config[stream]);
DS_ERR_CODE ret = DS_validate_stream_config_(p_super, &p_super->stream_config[stream]);
if (ret != DS_ERR_CODE_OK) return ret;
}

Expand Down Expand Up @@ -395,7 +399,7 @@ DS_ERR_CODE DS_receive(DriverSuper* p_super)
// そもそもこの validation は打ち上げ時というよりむしろ地上試験時に有用なので,ここに置く
if (p_stream_config->internal.is_validation_needed_for_rec_)
{
DS_ERR_CODE ret = DS_validate_stream_config_(p_stream_config);
DS_ERR_CODE ret = DS_validate_stream_config_(p_super, p_stream_config);
if (ret != DS_ERR_CODE_OK)
{
p_stream_config->info.rec_status_.status_code = DS_STREAM_REC_STATUS_VALIDATE_ERR;
Expand Down Expand Up @@ -540,7 +544,7 @@ static DS_ERR_CODE DS_send_cmd_(DriverSuper* p_super, uint8_t stream)
// そもそもこの validation は打ち上げじというよりむしろ地上試験時に有用なので,ここに置く
if (p_stream_config->internal.is_validation_needed_for_send_)
{
DS_ERR_CODE ret = DS_validate_stream_config_(p_stream_config);
DS_ERR_CODE ret = DS_validate_stream_config_(p_super, p_stream_config);
if (ret != DS_ERR_CODE_OK)
{
p_stream_config->info.send_status_.status_code = DS_STREAM_SEND_STATUS_VALIDATE_ERR;
Expand Down Expand Up @@ -603,10 +607,9 @@ static int DS_rx_(DriverSuper* p_super)
}
if (flag == 0) return 0;

// FIXME: DS_IF_RX_BUFFER_SIZE を可変に
rec_data_len = (*IF_RX[p_super->interface])(p_super->if_config,
DS_if_rx_buffer_,
DS_IF_RX_BUFFER_SIZE);
p_super->config.settings.rx_buffer_size_in_if_rx_);

#ifdef DS_DEBUG
Printf("DS: rx_\n");
Expand Down Expand Up @@ -1210,7 +1213,7 @@ static DS_ERR_CODE DS_reset_stream_config_(DS_StreamConfig* p_stream_config)
}


static DS_ERR_CODE DS_validate_stream_config_(DS_StreamConfig* p_stream_config)
static DS_ERR_CODE DS_validate_stream_config_(const DriverSuper* p_super, DS_StreamConfig* p_stream_config)
{
DS_StreamConfig* p = p_stream_config;

Expand Down Expand Up @@ -1268,6 +1271,7 @@ static DS_ERR_CODE DS_validate_stream_config_(DS_StreamConfig* p_stream_config)

if (p->settings.rx_buffer_ == NULL) return DS_ERR_CODE_ERR;
if (p->settings.rx_buffer_->buffer == NULL) return DS_ERR_CODE_ERR;
if (p->settings.rx_buffer_->capacity < p_super->config.settings.rx_buffer_size_in_if_rx_) return DS_ERR_CODE_ERR;
if (p->settings.rx_buffer_->capacity < p->settings.rx_frame_size_) return DS_ERR_CODE_ERR;
if (p->settings.rx_buffer_->capacity < p->settings.rx_header_size_ + p->settings.rx_footer_size_) return DS_ERR_CODE_ERR;

Expand All @@ -1293,6 +1297,19 @@ static DS_ERR_CODE DS_data_analyzer_dummy_(DS_StreamConfig* p_stream_config, voi


// ###### DS_Config Getter/Setter of Settings ######
uint16_t DSC_get_rx_buffer_size_in_if_rx(const DriverSuper* p_super)
{
return (uint16_t)p_super->config.settings.rx_buffer_size_in_if_rx_;
}

DS_ERR_CODE DSC_set_rx_buffer_size_in_if_rx(DriverSuper* p_super,
const uint16_t rx_buffer_size_in_if_rx)
{
if (rx_buffer_size_in_if_rx > DS_IF_RX_BUFFER_SIZE) return DS_ERR_CODE_ERR;
p_super->config.settings.rx_buffer_size_in_if_rx_ = rx_buffer_size_in_if_rx;
return DS_ERR_CODE_OK;
}

uint8_t DSC_get_should_monitor_for_rx_disruption(const DriverSuper* p_super)
{
return (uint8_t)p_super->config.settings.should_monitor_for_rx_disruption_;
Expand Down
23 changes: 17 additions & 6 deletions Drivers/Super/driver_super.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
* - 同期通信の場合: 受信フレーム最大長 以上
* が望ましい.
* メモリに余力がある場合,さらに
* - DS_IF_RX_BUFFER_SIZE x 2 以上 FIXME: これは可変になるので直す
* - rx_buffer_size_in_if_rx_ (or DS_IF_RX_BUFFER_SIZE) x 2 以上
* があると,さらに受信漏れを防ぐことができる.
* @note バッファのサイズ設定について FIXME: 直す.DS_IF_RX_BUFFER_SIZE の可変化など
* メモ
* IF_RX での最大サイズは規定したとして, DS ごとに小さくすることは可能にする
* で,小さくしたものよりも rx_buffer がデカくないとだめにする!!!
* @note バッファのサイズ設定について
* - DS_StreamRecBuffer のサイズは rx_buffer_size_in_if_rx_ よりも大きい必要がある
* - rx_buffer_size_in_if_rx_ のサイズは,実際の OBC のハードウェアバッファサイズと等しくすると最も効率が良い
* - DS_IF_RX_BUFFER_SIZE はすべてのドライバの rx_buffer_size_in_if_rx_ 以上の値にする(最大値にすると良い)
*/
#ifndef DRIVER_SUPER_H_
#define DRIVER_SUPER_H_
Expand Down Expand Up @@ -240,6 +240,13 @@ typedef struct
{
struct
{
uint16_t rx_buffer_size_in_if_rx_; /*!< IF_RX で受信するときの一次バッファのサイズ
DS ではまず IF_RX を全 Driver 共通の一次バッファにコピーした後,
DS_StreamRecBuffer に push して解析していく.
IF_RX で読み込む量が多すぎると,DS_StreamRecBuffer に収まりきらないことがあるので,
DS_StreamRecBuffer のサイズが小さい場合は,IF_RX で読み込むサイズも小さくする必要がある.
最大値: DS_IF_RX_BUFFER_SIZE
初期値: DS_IF_RX_BUFFER_SIZE */
uint8_t should_monitor_for_rx_disruption_; /*!< 受信途絶判定をするか?
初期値: 0 */
uint32_t time_threshold_for_rx_disruption_; /*!< 受信途絶判定の閾値 [ms]
Expand Down Expand Up @@ -529,6 +536,9 @@ DS_ERR_CODE DS_send_req_tlm_cmd(DriverSuper* p_super, uint8_t stream);


// ###### DS_Config Getter/Setter of Settings ######
uint16_t DSC_get_rx_buffer_size_in_if_rx(const DriverSuper* p_super);
DS_ERR_CODE DSC_set_rx_buffer_size_in_if_rx(DriverSuper* p_super,
const uint16_t rx_buffer_size_in_if_rx);
uint8_t DSC_get_should_monitor_for_rx_disruption(const DriverSuper* p_super);
void DSC_enable_monitor_for_rx_disruption(DriverSuper* p_super);
void DSC_disable_monitor_for_rx_disruption(DriverSuper* p_super);
Expand All @@ -555,6 +565,7 @@ uint8_t DSSC_get_is_strict_frame_search(const DS_StreamConfig* p_stream_config);
void DSSC_enable_strict_frame_search(DS_StreamConfig* p_stream_config);
void DSSC_disable_strict_frame_search(DS_StreamConfig* p_stream_config);

// FIXME: get, set 順番逆?
void DSSC_set_tx_frame(DS_StreamConfig* p_stream_config,
uint8_t* tx_frame);
const uint8_t* DSSC_get_tx_frame(DS_StreamConfig* p_stream_config);
Expand Down Expand Up @@ -600,7 +611,7 @@ void DSSC_set_data_analyzer(DS_StreamConfig* p_stream_config,
DS_ERR_CODE (*data_analyzer)(DS_StreamConfig* p_stream_config, void* p_driver));


// ###### DS_StreamConfig Getter/Setter of Info ######
// ###### DS_StreamConfig Getter of Info ######
const DS_StreamSendStatus* DSSC_get_send_status(const DS_StreamConfig* p_stream_config);
const DS_StreamRecStatus* DSSC_get_rec_status(const DS_StreamConfig* p_stream_config);

Expand Down