diff --git a/Drivers/Super/driver_super.c b/Drivers/Super/driver_super.c index d873f6170..26649aaa3 100644 --- a/Drivers/Super/driver_super.c +++ b/Drivers/Super/driver_super.c @@ -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 にしていたためにぬるぽで事故ったので @@ -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; // この値はよく考えること @@ -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; } @@ -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; @@ -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; @@ -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"); @@ -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; @@ -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; @@ -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_; diff --git a/Drivers/Super/driver_super.h b/Drivers/Super/driver_super.h index f59e6f9e4..84bb9067d 100644 --- a/Drivers/Super/driver_super.h +++ b/Drivers/Super/driver_super.h @@ -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_ @@ -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] @@ -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); @@ -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); @@ -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);