Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
meltingrabbit committed Dec 17, 2023
1 parent f3975d4 commit 324833a
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 60 deletions.
133 changes: 75 additions & 58 deletions applications/memory_dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@

#include "../system/time_manager/time_manager.h"
#include "../tlm_cmd/packet_handler.h"
#include "../library/endian.h"
#include "../tlm_cmd/common_cmd_packet_util.h"
#include "../tlm_cmd/common_tlm_packet.h"
// TODO: いずれは Space Packet への依存をなくしたい (CTP の依存だけにしたい)
#include "../tlm_cmd/ccsds/space_packet_protocol/space_packet.h"
#include "../tlm_cmd/ccsds/space_packet_protocol/tlm_space_packet.h"
#include "../library/endian.h"
#include "../library/result.h"

// #define MEM_TLM_ID (0xff)
Expand Down Expand Up @@ -52,25 +56,29 @@ static CCP_CmdRet MEM_dump_as_blob_tlm_(ctp_dest_flags_t dest_flags,
*/
static MEM_ACK MEM_form_packet_(CommonTlmPacket* ctp,
ctp_dest_flags_t dest_flags,
uint8_t dest_info)
uint8_t dest_info);

static uint8_t MEM_get_next_adu_counter_(void);
/**
* @brief 生成するパケットの Sequence Flag を判定
* @param[in] internal: 内部状態変数
* @return SP_SEQ_FLAG
*/
static SP_SEQ_FLAG MEM_judge_seq_flag_(const MEM_Internal* internal);


// static uint8_t MEM_get_next_adu_counter_(void);

static TCP_SEQ_FLAG MEM_judge_seq_flag_(uint32_t rp,
size_t len);

static void MEM_setup_header_(TCP* packet,
size_t data_len,
uint8_t category,
uint8_t adu_cnt,
TCP_SEQ_FLAG adu_seq_flag,
uint16_t adu_seq_cnt,
uint32_t adu_len);
// static void MEM_setup_header_(TCP* packet,
// size_t data_len,
// uint8_t category,
// uint8_t adu_cnt,
// TCP_SEQ_FLAG adu_seq_flag,
// uint16_t adu_seq_cnt,
// uint32_t adu_len);

static void MEM_send_packet_(const CommonTlmPacket* packet,
uint8_t num_dumps);
// static void MEM_send_packet_(const CommonTlmPacket* packet,
// uint8_t num_dumps);


static MemoryDump memory_dump_;
Expand Down Expand Up @@ -101,9 +109,7 @@ static CCP_CmdRet MEM_dump_as_blob_tlm_(ctp_dest_flags_t dest_flags,
if (dump_num >= 8)
{
// FIXME: 要検討?
// パケット生成回数の上限は 8 回とする。
// 32 kbpsでの DL 時に 8 AOSTF / sec で 1 秒分の通信量。
// これを超える場合は複数回コマンドを送信して対応する。
// TG_generate_tlm_ と合わせる?
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_PARAMETER);
}

Expand All @@ -116,7 +122,7 @@ static CCP_CmdRet MEM_dump_as_blob_tlm_(ctp_dest_flags_t dest_flags,
{
case MEM_ACK_SUCCESS:
// 生成したパケットを送出し、ADU Sequence Counterの値を更新
MEM_send_packet_(&MEM_ctp_, num_dumps);
MEM_send_packet_(&MEM_ctp_, dump_num);
++memory_dump_.adu_seq;
return CCP_make_cmd_ret_without_err_code(CCP_EXEC_SUCCESS);

Expand All @@ -135,39 +141,54 @@ static MEM_ACK MEM_form_packet_(CommonTlmPacket* ctp,
ctp_dest_flags_t dest_flags,
uint8_t dest_info)
{
uint32_t rp;
const MEM_Settings* settings = &memory_dump_.settings;
uint32_t rp; //!< Read Pointer
uint32_t len;
SP_SEQ_FLAG seq_flag;
// uint8_t* data;

rp = memory_dump_.begin + (memory_dump_.adu_seq * MEM_MAX_CTP_DATA_SIZE);
if (rp >= memory_dump_.end)
rp = settings->begin + (memory_dump_.internal.data_seq * MEM_MAX_CTP_DATA_SIZE);
memory_dump_.internal.max_data_seq = (uint16_t)(memory_dump_.internal.data_size / MEM_MAX_CTP_DATA_SIZE);
if (rp >= settings->end)
{
// Read Pointerが終端に達していれば何もせず終了
// RP が終端に達していれば何もせず終了
return MEM_ACK_NO_DATA;
}

// 残りダンプ長を計算
len = memory_dump_.end - rp;
len = settings->end - rp;
if (len > MEM_MAX_CTP_DATA_SIZE)
{
// 1 パケットのダンプ幅を超える場合はダンプ幅に押さえる
len = MEM_MAX_CTP_DATA_SIZE;
}

// Sequence Flag の種別判定
seq_flag = MEM_judge_seq_flag_(&memory_dump_.internal);

// ヘッダ設定
// Primary Header
TSP_setup_primary_hdr(&MEM_ctp_, CTP_APID_TLM_FROM_ME, TG_get_next_seq_count_(), packet_len);

// Secondary Header
TSP_set_2nd_hdr_ver(&MEM_ctp_, TSP_2ND_HDR_VER_1);
TSP_set_board_time(&MEM_ctp_, (uint32_t)(TMGR_get_master_total_cycle()));
TSP_set_tlm_id(&MEM_ctp_, tlm_id);
// FIXME: 他の時刻も入れる
CTP_set_global_time(&MEM_ctp_);
CTP_set_on_board_subnet_time(&MEM_ctp_);
TSP_set_dest_flags(&MEM_ctp_, dest_flags);
TSP_set_dest_info(&MEM_ctp_, dest_info);

// Packet Sequence Flagの種別判定
seq_flag = MEM_judge_seq_flag_(rp, len);

// メモリダンプパケットのヘッダを設定
MEM_setup_header_(&MEM_ctp_,
len,
category,
memory_dump_.adu_counter,
settings->adu_counter,
seq_flag,
memory_dump_.adu_seq,
memory_dump_.adu_size);
settings->adu_seq,
settings->adu_size);

// ダンプデータを設定
data = TCP_TLM_get_user_data_head(packet) + 5; // ADU分割によりヘッダ長が5Bytes増える
Expand All @@ -177,6 +198,32 @@ static MEM_ACK MEM_form_packet_(CommonTlmPacket* ctp,
}


static SP_SEQ_FLAG MEM_judge_seq_flag_(const MEM_Internal* internal)
{
if (internal-> max_data_seq == 0)
{
// ダンプ幅が最大パケット長以下なら Standalone packet
return SP_SEQ_FLAG_SINGLE;
}

// ダンプ幅が最大パケット長を超えるなら複数パケット
if (internal->data_seq == 0)
{
return SP_SEQ_FLAG_FIRST;
}
else if (internal->data_seq == internal->max_data_seq)
{
return SP_SEQ_FLAG_LAST;
}
else
{
return SP_SEQ_FLAG_CONT;
}
}






CCP_CmdRet Cmd_MEM_SET_REGION(const CommonCmdPacket* packet)
Expand Down Expand Up @@ -389,36 +436,6 @@ static uint8_t MEM_get_next_adu_counter_(void)



static TCP_SEQ_FLAG MEM_judge_seq_flag_(uint32_t rp,
size_t len)
{
if (memory_dump_.adu_size < MEM_MAX_CTP_DATA_SIZE)
{
// ADUが単パケットに収まる場合
return TCP_SEQ_SINGLE;
}
else
{
// ADUが複数パケットにまたがる場合
if (rp == memory_dump_.begin)
{
// Read Pointerが読み出し領域先頭に一致するなら開始パケット
return TCP_SEQ_FIRST;
}
else if (len < MEM_MAX_CTP_DATA_SIZE)
{
// ダンプ残量が1パケット以内に収まるなら終了パケット
return TCP_SEQ_LAST;
}
else
{
// それ以外の場合は中間パケット
return TCP_SEQ_CONT;
}
}
}


static void MEM_setup_header_(TCP* packet,
size_t data_len,
uint8_t category,
Expand Down
27 changes: 25 additions & 2 deletions applications/memory_dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,36 @@
#include "../system/application_manager/app_info.h"
#include "../tlm_cmd/common_cmd_packet.h"


/**
* @struct MEM_Settings
* @brief 設定値
*/
typedef struct
{
uint32_t begin; //!< 操作アドレス範囲の先頭アドレス
uint32_t end; //!< 操作アドレス範囲の末尾アドレス
uint32_t data_size; //!< 操作データサイズ
uint16_t data_seq; //!< 操作データシーケンス番号
} MEM_Settings;

/**
* @struct MEM_Internal
* @brief 内部状態変数
*/
typedef struct
{
uint32_t data_size; //!< 操作データサイズ
uint16_t data_seq; //!< 操作データシーケンス番号
uint16_t max_data_seq; //!< 最大シーケンス番号(分割数 - 1)
} MEM_Internal;

/**
* @struct MemoryDump
* @brief MemoryDump の AppInfo 構造体
*/
typedef struct
{
MEM_Settings settings; //!< 設定値
MEM_Internal internal; //!< 内部状態変数


uint32_t adu_size;
Expand Down

0 comments on commit 324833a

Please sign in to comment.