C2A_Core
全て データ構造 ファイル 関数 変数 型定義 列挙型 列挙値 マクロ定義
di_gs.c
[詳解]
1 #pragma section REPRO
6 #include "di_gs.h"
11 #include "../../Drivers/Com/gs_validate.h"
12 #include "../../Settings/port_config.h"
13 #include "../../Settings/DriverSuper/driver_buffer_define.h"
14 
15 static RESULT DI_GS_init_(void);
16 
17 // 以下 init と update の定義
18 static void DI_GS_cmd_packet_handler_app_init_(void);
19 static void DI_GS_cmd_packet_handler_app_(void);
20 
22 static void DI_GS_rt_tlm_packet_handler_app_(void);
24 static void DI_GS_rp_tlm_packet_handler_app_(void);
25 
26 static void DI_GS_set_t2m_flush_interval_(cycle_t flush_interval, DI_GS_TlmPacketHandler* gs_tlm_packet_handler);
27 
29 const GS_Driver* const gs_driver = &gs_driver_;
30 
35 
36 // バッファ
41 
42 
43 static RESULT DI_GS_init_(void)
44 {
45  int stream;
46  DS_INIT_ERR_CODE ret;
47  DS_StreamRecBuffer* ccsds_rx_buffers[DS_STREAM_MAX];
48  DS_StreamRecBuffer* uart_rx_buffers[DS_STREAM_MAX];
49  DS_nullify_stream_rec_buffers(ccsds_rx_buffers);
50  DS_nullify_stream_rec_buffers(uart_rx_buffers);
51 
52  // GS_RX_HEADER_NUM > DS_STREAM_MAX のアサーションは gs.c でやっているのでここではしない
53  for (stream = 0; stream < GS_RX_HEADER_NUM; ++stream)
54  {
55  DS_ERR_CODE ret1;
56  DS_ERR_CODE ret2;
59  sizeof(DI_GS_ccsds_rx_buffer_allocation_[stream]));
62  sizeof(DI_GS_uart_rx_buffer_allocation_[stream]));
63  if (ret1 != DS_ERR_CODE_OK || ret2 != DS_ERR_CODE_OK)
64  {
65  Printf("GS buffer init Failed ! %d, %d \n", ret1, ret2);
66  return RESULT_ERR;
67  }
68  ccsds_rx_buffers[stream] = &DI_GS_ccsds_rx_buffer_[stream];
69  uart_rx_buffers[stream] = &DI_GS_uart_rx_buffer_[stream];
70  }
71 
72  ret = GS_init(&gs_driver_, PORT_CH_RS422_MOBC_EXT, ccsds_rx_buffers, uart_rx_buffers);
73 
74  if (ret != DS_INIT_OK)
75  {
76  Printf("!! GS Init Error %d !!\n", ret);
77  return RESULT_ERR;
78  }
79 
80  return RESULT_OK;
81 }
82 
84 {
86 }
87 
89 {
91 }
92 
94 {
96 }
97 
99 {
100  DI_GS_init_();
101 }
102 
104 {
106  // TODO: エラー処理
107 }
108 
110 {
112 }
113 
115 {
116  int i;
117 
118  // 本当なら max(今の FIFO の空き, 残り時間で実行可能な数) とかしたい
119  for (i = 0; i < CCSDS_FIFO_SIZE; ++i)
120  {
124  if (ack != T2M_SUCCESS) return;
125 
126  // Realtime VCDU カウンタの設定
129 
130  // CLCW の設定
131  // CMD の VCID と TLM の VCID は独立で関係がない
132  // TLM の VCID 種別(Realtime, Replay)によらず CLCW を設定して良い
133  // CLCW が対応する CMD の VCID は CLCW の内部で指定される
135 
136  // 完成した VCDU を RT VCDU として送出
138  }
139 }
140 
142 {
144 }
145 
147 {
148  int i;
149 
150  // 本当なら max(今の FIFO の空き, 残り時間で実行可能な数) とかしたい
151  for (i = 0; i < CCSDS_FIFO_SIZE; ++i)
152  {
154  &PH_rp_tlm_list,
156  if (ack != T2M_SUCCESS) return;
157 
158  // Replay VCDU カウンタの設定
161 
162  // CLCW の設定
163  // CMD の VCIDと TLM の VCID は独立で関係がない
164  // TLM の VCID 種別(Realtime, Replay) によらず CLCW を設定して良い
165  // CLCW が対応する CMD の VCID は CLCW の内部で指定される
167 
168  // 完成した VCDU を RP VCDU として送出
170  }
171 }
172 
173 static void DI_GS_set_t2m_flush_interval_(cycle_t flush_interval, DI_GS_TlmPacketHandler* gs_tlm_packet_handler)
174 {
175  gs_tlm_packet_handler->tc_packet_to_m_pdu.flush_interval = flush_interval;
176 }
177 
179 {
180  (void)packet;
182 
184 }
185 
187 {
188  cycle_t flush_interval;
189  ENDIAN_memcpy(&flush_interval, CCP_get_param_head(packet), sizeof(cycle_t));
190 
192 
194 }
195 
197 {
198  cycle_t flush_interval;
199  ENDIAN_memcpy(&flush_interval, CCP_get_param_head(packet), sizeof(cycle_t));
200 
202 
204 }
205 
207 {
208  uint8_t pw = CCP_get_param_head(packet)[0];
209  if (pw < 1 || pw > 127) return CCP_make_cmd_ret_without_err_code(CCP_EXEC_ILLEGAL_PARAMETER);
210  GS_set_farm_pw(pw);
211 
213 }
214 
216 {
217  uint8_t which = CCP_get_param_head(packet)[0];
221 
223 }
224 
226 {
227  (void)packet;
229 
231 }
232 
234 {
235  uint32_t ui_rate = (uint32_t)CCP_get_param_head(packet)[0];
237 
239 
241 }
242 
244 {
245  (void)packet;
247 
249 }
250 
252 {
253  (void)packet;
255 
257 }
258 
259 #pragma section
AppInfo AI_create_app_info(const char *name, void(*initializer)(void), void(*entry_point)(void))
AppInfo を作る
Definition: app_info.c:9
#define CCSDS_FIFO_SIZE
Definition: ccsds_user.h:11
void CCSDS_set_rate(uint32_t ui_rate, CCSDS_Config *config)
CCSDS のレートを設定する API を呼び出す
Definition: ccsds_sils.cpp:73
uint8_t CCSDS_get_buffer_num(void)
CCSDS TX の残り buffer をカウントするAPI を呼びだす
Definition: ccsds_sils.cpp:68
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
const uint8_t * CCP_get_param_head(const CommonCmdPacket *packet)
先頭のパラメタのポインタを取得
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
CCP の汎用 Utility
static RESULT DI_GS_init_(void)
Definition: di_gs.c:43
static void DI_GS_rt_tlm_packet_handler_app_init_(void)
Definition: di_gs.c:109
CCP_CmdRet Cmd_DI_GS_SET_RT_FLUSH_INTERVAL(const CommonCmdPacket *packet)
Definition: di_gs.c:186
AppInfo DI_GS_rt_tlm_packet_handler_app(void)
Definition: di_gs.c:88
const DI_GS_TlmPacketHandler *const DI_GS_rp_tlm_packet_handler
Definition: di_gs.c:34
static void DI_GS_cmd_packet_handler_app_(void)
Definition: di_gs.c:103
CCP_CmdRet Cmd_DI_GS_UART_TLM_ON(const CommonCmdPacket *packet)
Definition: di_gs.c:243
AppInfo DI_GS_rp_tlm_packet_handler_app(void)
Definition: di_gs.c:93
static void DI_GS_set_t2m_flush_interval_(cycle_t flush_interval, DI_GS_TlmPacketHandler *gs_tlm_packet_handler)
Definition: di_gs.c:173
CCP_CmdRet Cmd_DI_GS_SET_FARM_PW(const CommonCmdPacket *packet)
Definition: di_gs.c:206
CCP_CmdRet Cmd_DI_GS_SET_RP_FLUSH_INTERVAL(const CommonCmdPacket *packet)
Definition: di_gs.c:196
const GS_Driver *const gs_driver
Definition: di_gs.c:29
CCP_CmdRet Cmd_DI_GS_CCSDS_SET_RATE(const CommonCmdPacket *packet)
Definition: di_gs.c:233
AppInfo DI_GS_cmd_packet_handler_app(void)
Definition: di_gs.c:83
CCP_CmdRet Cmd_DI_GS_CCSDS_GET_BUFFER(const CommonCmdPacket *packet)
Definition: di_gs.c:225
static uint8_t DI_GS_ccsds_rx_buffer_allocation_[GS_RX_HEADER_NUM][DS_STREAM_REC_BUFFER_SIZE_DEFAULT]
Definition: di_gs.c:38
const DI_GS_TlmPacketHandler *const DI_GS_rt_tlm_packet_handler
Definition: di_gs.c:32
CCP_CmdRet Cmd_DI_GS_SET_INFO(const CommonCmdPacket *packet)
Definition: di_gs.c:215
static uint8_t DI_GS_uart_rx_buffer_allocation_[GS_RX_HEADER_NUM][DS_STREAM_REC_BUFFER_SIZE_DEFAULT]
Definition: di_gs.c:40
static DS_StreamRecBuffer DI_GS_ccsds_rx_buffer_[GS_RX_HEADER_NUM]
Definition: di_gs.c:37
static DI_GS_TlmPacketHandler DI_GS_rt_tlm_packet_handler_
Definition: di_gs.c:31
static DI_GS_TlmPacketHandler DI_GS_rp_tlm_packet_handler_
Definition: di_gs.c:33
static void DI_GS_rp_tlm_packet_handler_app_init_(void)
Definition: di_gs.c:141
static void DI_GS_rp_tlm_packet_handler_app_(void)
Definition: di_gs.c:146
static DS_StreamRecBuffer DI_GS_uart_rx_buffer_[GS_RX_HEADER_NUM]
Definition: di_gs.c:39
static GS_Driver gs_driver_
Definition: di_gs.c:28
CCP_CmdRet Cmd_DI_GS_DRIVER_RESET(const CommonCmdPacket *packet)
Definition: di_gs.c:178
static void DI_GS_cmd_packet_handler_app_init_(void)
Definition: di_gs.c:98
CCP_CmdRet Cmd_DI_GS_UART_TLM_OFF(const CommonCmdPacket *packet)
Definition: di_gs.c:251
static void DI_GS_rt_tlm_packet_handler_app_(void)
Definition: di_gs.c:114
GS Driver のインスタンス化
#define DS_STREAM_REC_BUFFER_SIZE_DEFAULT
DS_ERR_CODE DS_init_stream_rec_buffer(DS_StreamRecBuffer *stream_rec_buffer, uint8_t *buffer, const uint16_t buffer_capacity)
DS_StreamRecBuffer に確保したメモリを与えて初期化する
void DS_nullify_stream_rec_buffers(DS_StreamRecBuffer *rx_buffers[DS_STREAM_MAX])
DS_StreamRecBuffer の要素数 DS_STREAM_MAX の配列を NULL で初期化する
DS_INIT_ERR_CODE
Driver の初期化関数のエラーコード
Definition: driver_super.h:70
@ DS_INIT_OK
OK
Definition: driver_super.h:71
#define DS_STREAM_MAX
Definition: driver_super.h:31
DS_ERR_CODE
DriverSuper の汎用エラーコード
Definition: driver_super.h:116
@ DS_ERR_CODE_OK
返り値は継承先や IF 先で上書きされるため,OK は 0 であることが必須
Definition: driver_super.h:117
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
DS_CMD_ERR_CODE GS_send_vcdu(GS_Driver *gs_driver, const VCDU *vcdu)
地上に向けて TLM を送信. 形式は VCDU
Definition: gs.c:257
DS_REC_ERR_CODE GS_rec_tctf(GS_Driver *gs_driver)
地上から CMD を受信する. 形式は TC Transer Frame
Definition: gs.c:166
DS_INIT_ERR_CODE GS_init(GS_Driver *gs_driver, uint8_t uart_ch, DS_StreamRecBuffer *ccsds_rx_buffers[DS_STREAM_MAX], DS_StreamRecBuffer *uart_rx_buffers[DS_STREAM_MAX])
Driver の初期化
Definition: gs.c:59
GS_PORT_TYPE
GS の通信ポートは CCSDS と UART の 2 つある
Definition: gs.h:24
@ GS_PORT_TYPE_NUM
port 数
Definition: gs.h:27
#define GS_RX_HEADER_NUM
Definition: gs.h:16
GS_VALIDATE_ERR GS_set_farm_pw(uint8_t positive_window_width)
Positive Window Width の設定
Definition: gs_validate.c:288
uint32_t GS_form_clcw(void)
テレメ用の CLCW の作成
Definition: gs_validate.c:250
uint32_t cycle_t
Definition: obc_time.h:10
PacketList PH_rt_tlm_list
C2A 全体を流れる Common Packet の配送を制御する
#define PORT_CH_RS422_MOBC_EXT
RS-422 UART ch1
Definition: port_config.h:7
HW 依存 Print, つまり ログ情報のフォーマット出力(デバッグ出力)
Result enum の定義
RESULT
Rust でいうところの Result<(), ()> のような,汎用的な成功したかどうかだけの返り値用 enum
Definition: result.h:14
@ RESULT_OK
OK (C2A では慣習的に OK 系列挙子は 0 を使うので,万が一他の enum に cast されても事故が起きにくいように)
Definition: result.h:15
@ RESULT_ERR
Error or NG
Definition: result.h:16
void Printf(const char *format,...)
Definition: print.c:9
コマンド返り値
uint8_t buffer_num
送信バッファの残り数. 最大 CCSDS_FIFO_SIZE
Definition: ccsds_user.h:34
Space Packet (コマンド用)
テレメの送信
Definition: di_gs.h:20
uint32_t vcdu_counter
VCDU counter
Definition: di_gs.h:23
VCDU vcdu
送信するVCDU
Definition: di_gs.h:22
TcpToMPdu tc_packet_to_m_pdu
PL から取り出した tc_packet を M_PDU に変換する
Definition: di_gs.h:21
フレーム受信バッファ
Definition: driver_super.h:222
GroundStation Driver
Definition: gs.h:66
struct GS_Driver::@72 driver_ccsds
CCSDS_Config ccsds_config
Definition: gs.h:71
const GS_Info * latest_info
Definition: gs.h:83
GS_Info info[GS_PORT_TYPE_NUM]
CCSDS 用と UART 用 2 つ
Definition: gs.h:82
uint8_t is_tlm_on
UART に TLM を流すかどうか, CCSDS では許容でも UART に TLM を送りすぎると詰まってしまうため
Definition: gs.h:79
CCSDS_Info ccsds_info
Definition: gs.h:84
GS_PORT_TYPE tlm_tx_port_type
Definition: gs.h:85
struct GS_Driver::@73 driver_uart
cycle_t flush_interval
Definition: tcp_to_m_pdu.h:37
M_PDU m_pdu
Definition: vcdu.h:14
void T2M_initialize(TcpToMPdu *tcp_to_m_pdu)
T2M 構造体の初期化
Definition: tcp_to_m_pdu.c:11
T2M_ACK T2M_form_m_pdu(TcpToMPdu *tcp_to_m_pdu, PacketList *pl, M_PDU *m_pdu)
TCPacket を M_PDU に変換する
Definition: tcp_to_m_pdu.c:26
T2M_ACK
T2M 関数の返り値
Definition: tcp_to_m_pdu.h:21
@ T2M_SUCCESS
Definition: tcp_to_m_pdu.h:22
void VCDU_setup_realtime_vcdu_hdr(VCDU *vcdu, uint32_t counter)
Definition: vcdu.c:28
void VCDU_set_clcw(VCDU *vcdu, uint32_t clcw)
Definition: vcdu.c:207
void VCDU_setup_replay_vcdu_hdr(VCDU *vcdu, uint32_t counter)
Definition: vcdu.c:36
uint32_t VCDU_calc_next_counter(uint32_t prev)
Definition: vcdu.c:218