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 での rx_buffer を stream ごとに driver instance から設定可能にする #503

Merged
merged 6 commits 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
52 changes: 47 additions & 5 deletions Drivers/Super/driver_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,12 +238,38 @@ void DS_move_forward_frame_head_candidate_of_stream_rec_buffer_(DS_StreamRecBuff

// ###### DriverSuper基本関数 ######

DS_ERR_CODE DS_init(DriverSuper* p_super, void* if_config, DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super))
DS_ERR_CODE DS_init(DriverSuper* p_super,
void* if_config,
DS_StreamRecBuffer* rx_buffer,
DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super))
{
DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX];
DS_nullify_stream_rec_buffers(rx_buffers);
rx_buffers[0] = rx_buffer;
return DS_init_streams(p_super, if_config, rx_buffers, load_init_setting);
}


DS_ERR_CODE DS_init_streams(DriverSuper* p_super,
void* if_config,
DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX],
DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super))
{
uint8_t stream;

if (DS_reset(p_super) != DS_ERR_CODE_OK) return DS_ERR_CODE_ERR;

p_super->if_config = if_config;

// load_init_setting で上書きできるようにここで設定
for (stream = 0; stream < DS_STREAM_MAX; ++stream)
{
if (rx_buffers[stream] != NULL)
{
DSSC_set_rx_buffer(&(p_super->stream_config[stream]), rx_buffers[stream]);
}
}

p_super->config.internal.load_init_setting = load_init_setting;
if (p_super->config.internal.load_init_setting(p_super) != DS_ERR_CODE_OK) return DS_ERR_CODE_ERR;

Expand Down Expand Up @@ -1241,6 +1267,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->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 Down Expand Up @@ -1568,14 +1595,28 @@ DS_ERR_CODE DSSC_get_ret_from_data_analyzer(const DS_StreamConfig* p_stream_conf

// ###### Driver 汎用 Util 関数 ######

void DS_init_stream_rec_buffer(DS_StreamRecBuffer* stream_rec_buffer,
uint8_t* buffer,
const uint16_t buffer_capacity)
DS_ERR_CODE DS_init_stream_rec_buffer(DS_StreamRecBuffer* stream_rec_buffer,
uint8_t* buffer,
const uint16_t buffer_capacity)
{
if (stream_rec_buffer == NULL) return;
if (stream_rec_buffer == NULL) return DS_ERR_CODE_ERR;
if (buffer == NULL) return DS_ERR_CODE_ERR;
stream_rec_buffer->buffer = buffer;
stream_rec_buffer->capacity = buffer_capacity;
DS_clear_stream_rec_buffer_(stream_rec_buffer);
return DS_ERR_CODE_OK;
}


void DS_nullify_stream_rec_buffers(DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX])
{
uint8_t stream;
if (rx_buffers == NULL) return;

for (stream = 0; stream < DS_STREAM_MAX; ++stream)
{
rx_buffers[stream] = NULL;
}
}


Expand Down Expand Up @@ -1644,6 +1685,7 @@ uint16_t DSSC_get_fixed_rx_frame_size(const DS_StreamConfig* p_stream_config)
void DS_clear_stream_rec_buffer_(DS_StreamRecBuffer* stream_rec_buffer)
{
if (stream_rec_buffer == NULL) return;
if (stream_rec_buffer->buffer == NULL) return;

memset(stream_rec_buffer->buffer,
0x00,
Expand Down
44 changes: 36 additions & 8 deletions Drivers/Super/driver_super.h
Original file line number Diff line number Diff line change
Expand Up @@ -410,21 +410,41 @@ struct DriverSuper
// ###### DriverSuper 基本関数 ######

/**
* @brief 継承先の機器より DriverSuper を初期化する
* @brief 継承先の機器より DriverSuper を初期化する(stream 0 のみの使用の場合)
*
* DriverSuper 構造体を継承先 Drive 構造体のメンバとして定義(継承)し,ポインタを渡すことでポートを初期化する.
* DriverSuper 構造体を継承先 Driver 構造体のメンバとして定義(継承)し,ポインタを渡すことでポートを初期化する.
* そして,構造体内の初期化が必要な変数を初期化する.
* デフォルト値の上書きは load_init_setting で行う
* @note DriverSuperを使用する時は起動時に必ず実施すること
* @note DriverSuper を使用する時は起動時に必ず実施すること
* @param p_super: 初期化する DriverSuper 構造体へのポインタ
* @param if_config: 初期化する Driverで用いられている IF の config 構造体
* @param rx_buffer: 初期化する DriverSuper の stream 0 で用いられるフレーム受信バッファ
* @param load_init_setting: DriverSuper の初期設定ロード関数ポインタ
* @return DS_ERR_CODE
*/
DS_ERR_CODE DS_init(DriverSuper* p_super,
void* if_config,
DS_StreamRecBuffer* rx_buffer,
DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super));

/**
* @brief 継承先の機器より DriverSuper を初期化する(複数の stream を使用する場合)
*
* DriverSuper 構造体を継承先 Driver 構造体のメンバとして定義(継承)し,ポインタを渡すことでポートを初期化する.
* そして,構造体内の初期化が必要な変数を初期化する.
* デフォルト値の上書きは load_init_setting で行う
* @note DriverSuper を使用する時は起動時に必ず実施すること
* @param p_super: 初期化する DriverSuper 構造体へのポインタ
* @param if_config: 初期化する Driverで用いられている IF の config 構造体
* @param rx_buffers: 初期化する DriverSuper で用いられるフレーム受信バッファ.使用しない stream は NULL を設定しておく
* @param load_init_setting: DriverSuper の初期設定ロード関数ポインタ
* @return DS_ERR_CODE
*/
DS_ERR_CODE DS_init_streams(DriverSuper* p_super,
void* if_config,
DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX],
DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super));

/**
* @brief DriverSuper のリセット
* @note DS_init 内で呼ばれている.
Expand All @@ -436,7 +456,7 @@ DS_ERR_CODE DS_reset(DriverSuper* p_super);
/**
* @brief DriverSuper の設定に不整合が生じていないかチェックする
*
* Driverの 設定を変えた場合は毎回呼び出すことを推奨する
* Driver の設定を変えた場合は毎回呼び出すことを推奨する
* @note DS_init 内で呼ばれている.
* @note 内部の管理フラグを変更しているので, p_super に厳密な const 性はない
* @param p_super: DriverSuper 構造体へのポインタ
Expand All @@ -448,7 +468,7 @@ DS_ERR_CODE DS_validate_config(DriverSuper* p_super);
* @brief 受信バッファをクリアする
*
* 例えば,ヘッダなしテレメの場合,途中でゴミデータが入ると以後すべてのフレームがずれてしまう.
* そのようなとき( CRC エラーがでるとか,受信データが明らかにおかしい場合)に,buffer を一度クリアし,
* そのようなとき(CRC エラーがでるとか,受信データが明らかにおかしい場合)に,buffer を一度クリアし,
* 次に届くデータからフレーム解析を先頭から行うようにするために用いる.
* @param p_super: DriverSuper 構造体へのポインタ
* @return DS_ERR_CODE
Expand Down Expand Up @@ -605,11 +625,19 @@ DS_ERR_CODE DSSC_get_ret_from_data_analyzer(const DS_StreamConfig* p_stream_conf
* @param[out] stream_rec_buffer: 初期化する DS_StreamRecBuffer
* @param[in] buffer: 与えるメモリ領域
* @param[in] buffer_capacity: 与えるメモリサイズ
* @return DS_ERR_CODE
*/
DS_ERR_CODE DS_init_stream_rec_buffer(DS_StreamRecBuffer* stream_rec_buffer,
uint8_t* buffer,
const uint16_t buffer_capacity);

/**
* @brief DS_StreamRecBuffer の要素数 DS_STREAM_MAX の配列を NULL で初期化する
* @note DS_init_streams の引数を作るのに使う
* @param[out] rx_buffers: 初期化する DS_StreamRecBuffer の配列
* @return void
*/
void DS_init_stream_rec_buffer(DS_StreamRecBuffer* stream_rec_buffer,
uint8_t* buffer,
const uint16_t buffer_capacity);
void DS_nullify_stream_rec_buffers(DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX]);

/**
* @brief DS_DRIVER_ERR_CODE から CCP_CmdRet への変換関数
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,22 @@
#include <src_core/TlmCmd/packet_handler.h>
#include <src_core/Library/print.h>
#include "../../Settings/port_config.h"

static MOBC_Driver mobc_driver_;
const MOBC_Driver* const mobc_driver = &mobc_driver_;

static const uint8_t DI_MOBC_kMsTlmPhMaxNumOfProc_ = 4; //!< 一度に送出する最大テレメ数
#include "../../Settings/DriverSuper/driver_buffer_define.h"

static void DI_MOBC_init_(void);
static void DI_MOBC_update_(void);
static void DI_MOBC_ms_tlm_packet_handler_init_(void);
static void DI_MOBC_ms_tlm_packet_handler_(void);

static MOBC_Driver mobc_driver_;
const MOBC_Driver* const mobc_driver = &mobc_driver_;

// バッファ
static DS_StreamRecBuffer DI_MOBC_rx_buffer_;
static uint8_t DI_MOBC_rx_buffer_allocation_[DS_STREAM_REC_BUFFER_SIZE_DEFAULT];

static const uint8_t DI_MOBC_kMsTlmPhMaxNumOfProc_ = 4; //!< 一度に送出する最大テレメ数


AppInfo DI_MOBC_update(void)
{
Expand All @@ -27,11 +32,21 @@ AppInfo DI_MOBC_update(void)

static void DI_MOBC_init_(void)
{
DS_INIT_ERR_CODE ret = MOBC_init(&mobc_driver_, PORT_CH_UART_MOBC);
DS_ERR_CODE ret1;
DS_INIT_ERR_CODE ret2;

ret1 = DS_init_stream_rec_buffer(&DI_MOBC_rx_buffer_,
DI_MOBC_rx_buffer_allocation_,
sizeof(DI_MOBC_rx_buffer_allocation_));
if (ret1 != DS_ERR_CODE_OK)
{
Printf("MOBC buffer init Failed ! %d \n", ret1);
}

if (ret != DS_INIT_OK)
ret2 = MOBC_init(&mobc_driver_, PORT_CH_UART_MOBC, &DI_MOBC_rx_buffer_);
if (ret2 != DS_INIT_OK)
{
Printf("MOBC init Failed ! %d \n", ret);
Printf("MOBC init Failed ! %d \n", ret2);
}
}

Expand Down
12 changes: 2 additions & 10 deletions Examples/2nd_obc_user/src/src_user/Drivers/Etc/mobc.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,19 @@
#include <src_core/Drivers/Protocol/eb90_frame_for_driver_super.h>
#include <src_core/Drivers/Protocol/common_tlm_cmd_packet_for_driver_super.h>
#include <string.h>
#include "../../Settings/DriverSuper/driver_buffer_define.h"

#define MOBC_STREAM_TLM_CMD (0) //!< テレコマで使うストリーム

static uint8_t MOBC_tx_frame_[EB90_FRAME_HEADER_SIZE +
CTCP_MAX_LEN +
EB90_FRAME_FOOTER_SIZE];

// バッファ
static uint8_t MOBC_rx_buffer_allocation_[DS_STREAM_REC_BUFFER_SIZE_DEFAULT];
static DS_StreamRecBuffer MOBC_rx_buffer_;

static DS_ERR_CODE MOBC_load_driver_super_init_settings_(DriverSuper* p_super);
static DS_ERR_CODE MOBC_analyze_rec_data_(DS_StreamConfig* p_stream_config,
void* p_driver);


DS_INIT_ERR_CODE MOBC_init(MOBC_Driver* mobc_driver, uint8_t ch)
DS_INIT_ERR_CODE MOBC_init(MOBC_Driver* mobc_driver, uint8_t ch, DS_StreamRecBuffer* rx_buffer)
{
DS_ERR_CODE ret;

Expand All @@ -42,6 +37,7 @@ DS_INIT_ERR_CODE MOBC_init(MOBC_Driver* mobc_driver, uint8_t ch)

ret = DS_init(&(mobc_driver->driver.super),
&(mobc_driver->driver.uart_config),
rx_buffer,
MOBC_load_driver_super_init_settings_);
if (ret != DS_ERR_CODE_OK) return DS_INIT_DS_INIT_ERR;
return DS_INIT_OK;
Expand All @@ -58,10 +54,6 @@ static DS_ERR_CODE MOBC_load_driver_super_init_settings_(DriverSuper* p_super)
p_stream_config = &(p_super->stream_config[MOBC_STREAM_TLM_CMD]);

CTCP_init_dssc(p_stream_config, MOBC_tx_frame_, sizeof(MOBC_tx_frame_), MOBC_analyze_rec_data_);
DS_init_stream_rec_buffer(&MOBC_rx_buffer_,
MOBC_rx_buffer_allocation_,
sizeof(MOBC_rx_buffer_allocation_));
DSSC_set_rx_buffer(p_stream_config, &MOBC_rx_buffer_);

// 定期 TLM の監視機能の有効化しない → ので設定上書きなし

Expand Down
13 changes: 7 additions & 6 deletions Examples/2nd_obc_user/src/src_user/Drivers/Etc/mobc.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,25 +77,26 @@ typedef struct
* @brief MOBC初期化
*
* MOBC_Driver 構造体のポインタを渡すことでポートを初期化し, MOBC_Driver の各メンバも初期化する
* @param *mobc_driver : 初期化する MOBC_Driver 構造体へのポインタ
* @param ch : MOBCが接続されている UART ポート番号
* @param mobc_driver: 初期化する MOBC_Driver 構造体へのポインタ
* @param ch: MOBC が接続されている UART ポート番号
* @param rx_buffer: 受信バッファ
* @return DS_INIT_ERR_CODE
*/
DS_INIT_ERR_CODE MOBC_init(MOBC_Driver* mobc_driver, uint8_t ch);
DS_INIT_ERR_CODE MOBC_init(MOBC_Driver* mobc_driver, uint8_t ch, DS_StreamRecBuffer* rx_buffer);


/**
* @brief MOBC からのデータ( MOBC → AOBC のコマンド)受信
* @param *mobc_driver : MOBC_Driver 構造体へのポインタ
* @param mobc_driver: MOBC_Driver 構造体へのポインタ
* @return DS_REC_ERR_CODE
*/
DS_REC_ERR_CODE MOBC_rec(MOBC_Driver* mobc_driver);


/**
* @brief MOBC へのデータ(MOBC → AOBCのテレメ)送信
* @param *mobc_driver : MOBC_Drive r構造体へのポインタ
* @param *packet : 送信する CTP packet
* @param mobc_driver: MOBC_Driver 構造体へのポインタ
* @param packet: 送信する CTP packet
* @return DS_CMD_ERR_CODE
*/
DS_CMD_ERR_CODE MOBC_send(MOBC_Driver* mobc_driver, const CommonTlmPacket* packet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
#ifndef DRIVER_BUFFER_DEFINE_H_
#define DRIVER_BUFFER_DEFINE_H_

#define DS_STREAM_REC_BUFFER_SIZE_DEFAULT (1024 * 2) //!< DS_StreamRecBuffer のバッファサイズのデフォルト値
#include "./driver_super_params.h"

#define DS_STREAM_REC_BUFFER_SIZE_DEFAULT (DS_IF_RX_BUFFER_SIZE * 2) /*!< DS_StreamRecBuffer のバッファサイズのデフォルト値
UART などの非同期通信はメモリに余力があれば DS_IF_RX_BUFFER_SIZE * 2 を推奨
詳細は dirver_super.c の @note を参照 */

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,23 @@
#include <src_core/Library/print.h>
#include <src_core/TlmCmd/common_cmd_packet_util.h>
#include "../../Settings/port_config.h"
#include "../../Settings/DriverSuper/driver_buffer_define.h"

static void DI_AOBC_init_(void);
static void DI_AOBC_update_(void);

static void DI_AOBC_cmd_dispatcher_init_(void);
static void DI_AOBC_cmd_dispatcher_(void);

static AOBC_Driver aobc_driver_;
const AOBC_Driver* const aobc_driver = &aobc_driver_;

static CommandDispatcher DI_AOBC_cdis_;
const CommandDispatcher* const DI_AOBC_cdis = &DI_AOBC_cdis_;

static void DI_AOBC_init_(void);
static void DI_AOBC_update_(void);

static void DI_AOBC_cmd_dispatcher_init_(void);
static void DI_AOBC_cmd_dispatcher_(void);
// バッファ
static DS_StreamRecBuffer DI_AOBC_rx_buffer_;
static uint8_t DI_AOBC_rx_buffer_allocation_[DS_STREAM_REC_BUFFER_SIZE_DEFAULT];


AppInfo DI_AOBC_update(void)
Expand All @@ -34,11 +38,21 @@ AppInfo DI_AOBC_update(void)

static void DI_AOBC_init_(void)
{
int ret = AOBC_init(&aobc_driver_, PORT_CH_RS422_AOBC);
DS_ERR_CODE ret1;
DS_INIT_ERR_CODE ret2;

ret1 = DS_init_stream_rec_buffer(&DI_AOBC_rx_buffer_,
DI_AOBC_rx_buffer_allocation_,
sizeof(DI_AOBC_rx_buffer_allocation_));
if (ret1 != DS_ERR_CODE_OK)
{
Printf("AOBC buffer init Failed ! %d \n", ret1);
}

if (ret != 0)
ret2 = AOBC_init(&aobc_driver_, PORT_CH_RS422_AOBC, &DI_AOBC_rx_buffer_);
if (ret2 != DS_INIT_OK)
{
Printf("AOBC init Failed ! %d \n", ret);
Printf("AOBC init Failed ! %d \n", ret2);
}
}

Expand Down
Loading