Skip to content

Commit

Permalink
change DS_IF_RX_BUFFER_SIZE to variable length
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed Mar 4, 2023
1 parent 27fb5f9 commit cbb6530
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 13 deletions.
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

0 comments on commit cbb6530

Please sign in to comment.