C2A_Core
telemetry_generator.c
[詳解]
1 #pragma section REPRO
2 #include "telemetry_generator.h"
3 
4 #include <stddef.h> // for NULL
5 
6 #include "telemetry_frame.h"
7 #include "packet_handler.h"
8 #include "../System/TimeManager/time_manager.h"
9 #include "common_cmd_packet.h"
10 #include "common_cmd_packet_util.h"
14 #include "./Ccsds/tlm_space_packet.h" // FIXME: TSP 依存性はNGなので, TCP → SP 大工事終わったら直す
15 
16 
27  ctp_dest_flags_t dest_flags,
28  uint8_t dest_info,
29  uint8_t num_dumps);
30 
41 static CCP_CmdRet TG_forward_tlm_(APID apid,
42  TLM_CODE tlm_id,
43  ctp_dest_flags_t dest_flags,
44  uint8_t dest_info,
45  uint8_t dump_num);
46 
52 static uint16_t TG_get_next_seq_count_(void);
53 
55 
56 
57 // FIXME: 現在のコードは,MOBC と 2nd OBC の Tlm id がユニークであることを想定している
58 // 本来被っても良いはず
59 // DEPRECATED!!!!!
61 {
62  uint8_t category = CCP_get_param_from_packet(packet, 0, uint8_t);
63  TLM_CODE id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
64  uint8_t num_dumps = CCP_get_param_from_packet(packet, 2, uint8_t);
65  uint16_t len;
66  TF_TLM_FUNC_ACK ack;
67  uint8_t dr_partition_mask = 0x1f; // 00011111b // FIXME: 一時的な対応
68  uint8_t dest_flags_mask = 0xe0; // 11100000b // FIXME: 一時的な対応
69  uint8_t dr_partition;
70  ctp_dest_flags_t dest_flags;
71 
72  if (num_dumps >= 8)
73  {
74  // パケット生成回数の上限は8回とする。
75  // 32kbpsでのDL時に8VCDU/secで1秒分の通信量。
76  // これを超える場合は複数回コマンドを送信して対応する。
78  }
79 
80  // ctp の ヘッダ部分の APID をクリア
81  // この後で, 配送元 OBC が自身か 2nd obc かを割り出せるように
82  CTP_set_apid(&TG_ctp_, (APID)(APID_UNKNOWN & 0x7ff)); // FIXME: APID_UNKNOWN = APID_FILL_PKT + 1 だと 11 bit から溢れてる...
83 
84  // ADU生成
85  // ADU分割が発生しない場合に限定したコードになっている。
86  // TLM定義シート上で定義するADUはADU長をADU分割が発生しない長さに制限する。
87  ack = TF_generate_contents(id,
89  &len,
90  TSP_MAX_LEN);
91 
92  // 範囲外のTLM IDを除外
95 
96  // Header
97  if ((APID)(CTP_get_apid(&TG_ctp_) & 0x7ff) != (APID)(APID_UNKNOWN & 0x7ff)) // FIXME: APID_UNKNOWN = APID_FILL_PKT + 1 だと 11 bit から溢れてる...
98  {
99  // 2nd OBC で生成された TLM の primary header, secondary header の board time はそのまま維持
100  }
101  else
102  {
103  // Primary Header
104  // FIXME: Space Packet 依存を直す
106 
107  // Secondary Header
109  }
110 
111  // FIXME: 他の時刻も入れる
113  TSP_set_on_board_subnet_time(&TG_ctp_, (uint32_t)(TMGR_get_master_total_cycle())); // FIXME: 暫定
114 
115  // FIXME: 他 OBC からのパケットは別処理する
116  // FIXME: 一旦雑に category を処理してるが後でちゃんと直す
117  dr_partition = (uint8_t)(category & dr_partition_mask);
118  dest_flags = (uint8_t)( (category & dest_flags_mask) >> 5 );
119  if (dest_flags == 0)
120  {
121  dest_flags = CTP_DEST_FLAG_RP_TLM;
122  }
123  TSP_set_dest_flags(&TG_ctp_, dest_flags);
124  TSP_set_dest_info(&TG_ctp_, dr_partition); // FIXME: もはや dr partition ですらない
125  TSP_set_tlm_id(&TG_ctp_, id);
127 
128  // 生成したパケットを指定された回数配送処理へ渡す
129  while (num_dumps != 0)
130  {
132  --num_dumps;
133  }
134 
136 }
137 
138 
140 {
141  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 0, uint8_t);
142  ctp_dest_flags_t dest_flags = (ctp_dest_flags_t)CCP_get_param_from_packet(packet, 1, uint8_t);
143  uint8_t dest_info = CCP_get_param_from_packet(packet, 2, uint8_t);
144  uint8_t dump_num = CCP_get_param_from_packet(packet, 3, uint8_t);
145 
146  return TG_generate_tlm_(tlm_id, dest_flags, dest_info, dump_num);
147 }
148 
149 
151 {
152  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 0, uint8_t);
153 
155 }
156 
157 
159 {
160  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 0, uint8_t);
161 
163 }
164 
165 
167 {
168  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 0, uint8_t);
169  uint8_t dr_partition = CCP_get_param_from_packet(packet, 1, uint8_t);
170 
171  return TG_generate_tlm_(tlm_id, (ctp_dest_flags_t)CTP_DEST_FLAG_ST_TLM, dr_partition, 1);
172 }
173 
174 
176 {
177  APID apid = APID_get_apid_from_uint16(CCP_get_param_from_packet(packet, 0, uint16_t));
178  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
179  ctp_dest_flags_t dest_flags = (ctp_dest_flags_t)CCP_get_param_from_packet(packet, 2, uint8_t);
180  uint8_t dest_info = CCP_get_param_from_packet(packet, 3, uint8_t);
181  uint8_t dump_num = CCP_get_param_from_packet(packet, 4, uint8_t);
182 
183  return TG_forward_tlm_(apid, tlm_id, dest_flags, dest_info, dump_num);
184 }
185 
186 
188 {
189  APID apid = APID_get_apid_from_uint16(CCP_get_param_from_packet(packet, 0, uint16_t));
190  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
191 
192  return TG_forward_tlm_(apid, tlm_id, (ctp_dest_flags_t)CTP_DEST_FLAG_HP_TLM, 0, 1);
193 }
194 
195 
197 {
198  APID apid = APID_get_apid_from_uint16(CCP_get_param_from_packet(packet, 0, uint16_t));
199  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
200 
201  return TG_forward_tlm_(apid, tlm_id, (ctp_dest_flags_t)CTP_DEST_FLAG_RT_TLM, 0, 1);
202 }
203 
204 
206 {
207  APID apid = APID_get_apid_from_uint16(CCP_get_param_from_packet(packet, 0, uint16_t));
208  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 1, uint8_t);
209  uint8_t dr_partition = CCP_get_param_from_packet(packet, 2, uint8_t);
210 
211  return TG_forward_tlm_(apid, tlm_id, (ctp_dest_flags_t)CTP_DEST_FLAG_ST_TLM, dr_partition, 1);
212 }
213 
214 
216  ctp_dest_flags_t dest_flags,
217  uint8_t dest_info,
218  uint8_t dump_num)
219 {
220  TF_TLM_FUNC_ACK ack;
221  uint16_t packet_len;
222 
223  if (dump_num >= 8)
224  {
225  // FIXME: 要検討?
226  // パケット生成回数の上限は 8 回とする。
227  // 32 kbpsでの DL 時に 8 VCDU / sec で 1 秒分の通信量。
228  // これを超える場合は複数回コマンドを送信して対応する。
230  }
231 
232  // ADU 生成
233  // ADU 分割が発生しない場合に限定したコードになっている
234  // TLM 定義シート上で定義する ADU は ADU 長を ADU 分割が発生しない長さに制限する
235  // FIXME: ↑ ADU,今の TSP では存在しない? 文面見直してなおす
236  // https://github.com/ut-issl/c2a-core/issues/222
237  ack = TF_generate_contents(tlm_id,
238  TG_ctp_.packet,
239  &packet_len,
240  TSP_MAX_LEN);
241 
242  // 範囲外のTLM IDを除外
244  if (ack != TF_TLM_FUNC_ACK_SUCCESS) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
245 
246  // 自身の OBC のテレメ生成を前提としているので, Cmd_GENERATE_TLM のように 2nd OBC 判定はいれない
247 
248  // Primary Header
250 
251  // Secondary Header
254  TSP_set_tlm_id(&TG_ctp_, tlm_id);
255  // FIXME: 他の時刻も入れる
258  TSP_set_dest_flags(&TG_ctp_, dest_flags);
259  TSP_set_dest_info(&TG_ctp_, dest_info);
260 
261  // 生成したパケットを指定された回数配送処理へ渡す
262  while (dump_num != 0)
263  {
265  --dump_num;
266  }
267 
269 }
270 
271 
273  TLM_CODE tlm_id,
274  ctp_dest_flags_t dest_flags,
275  uint8_t dest_info,
276  uint8_t dump_num)
277 {
278  TF_TLM_FUNC_ACK ack;
279  uint16_t packet_len;
280 
281  if (dump_num >= 8)
282  {
283  // FIXME: TG_generate_tlm_ とともに要検討
285  }
286 
287  ack = PH_user_telemetry_router(apid,
288  tlm_id,
289  TG_ctp_.packet,
290  &packet_len,
291  TSP_MAX_LEN);
292 
293  if (ack == TF_TLM_FUNC_ACK_NOT_DEFINED) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, ( ((uint16_t)apid << 16) | (0x0000ffff & tlm_id) ));
294  if (ack != TF_TLM_FUNC_ACK_SUCCESS) return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
295 
296  // 2nd OBC なので, Header は可能な限り維持
297  // Primary Header → 維持
298 
299  // Secondary Header
300  // FIXME: 方針を決めて直す(また, `(uint64_t)` へのキャストは不適切そう)
301  // if ((uint64_t)TSP_get_global_time(&TG_ctp_) == 0xffffffffffffffffULL)
302  // {
303  // CTP_set_global_time(&TG_ctp_);
304  // }
305  if (CTP_get_on_board_subnet_time(&TG_ctp_) == 0xffffffff)
306  {
307  // FIXME: 本当は Driver で受信時に上書きするべき? 一応 CTP_get_ctp_from_dssc でも対応
308  // MOBC - 2nd OBC - 3rd OBC というとき, 2nd OBC でも 0xffffffff ができるようにしている
310  }
311 
312  TSP_set_dest_flags(&TG_ctp_, dest_flags);
313  TSP_set_dest_info(&TG_ctp_, dest_info);
314 
315  // 生成したパケットを指定された回数配送処理へ渡す
316  while (dump_num != 0)
317  {
319  --dump_num;
320  }
321 
323 }
324 
325 
326 static uint16_t TG_get_next_seq_count_(void)
327 {
328  // インクリメントした値を返すため初期値は 0xffff とする
329  static uint16_t adu_counter_ = 0xffff;
330  ++adu_counter_;
331  // Sequence Count は 14 bit
332  return 0x3fff & adu_counter_;
333 }
334 
335 #pragma section
APID APID_get_apid_from_uint16(uint16_t apid)
バイト列から APID を取得
Definition: apid_define.c:10
APID
Application Process ID
Definition: apid_define.h:17
@ APID_UNKNOWN
Definition: apid_define.h:27
CCP 関連基本関数の宣言
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
CCP_CmdRet CCP_make_cmd_ret(CCP_EXEC_STS exec_sts, uint32_t err_code)
コマンド返り値である CCP_CmdRet を作成
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
CCP の汎用 Utility
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
void CTP_set_apid(CommonTlmPacket *packet, APID apid)
APID を設定
void CTP_set_global_time(CommonTlmPacket *packet)
現在の Global Time を設定
uint8_t ctp_dest_flags_t
CTP_DEST_FLAG の & をとったフラグのための型
uint32_t CTP_get_on_board_subnet_time(const CommonTlmPacket *packet)
On-Board Subnetwork Time を取得
@ CTP_DEST_FLAG_RT_TLM
00000010b: Realtime Telemetry
@ CTP_DEST_FLAG_HP_TLM
00000001b: High Priority Realtime Telemetry
@ CTP_DEST_FLAG_ST_TLM
00000100b: Stored Telemetry
@ CTP_DEST_FLAG_RP_TLM
00001000b: Replay Telemetry
void CTP_set_on_board_subnet_time(CommonTlmPacket *packet)
現在の On-Board Subnetwork Time を設定
APID CTP_get_apid(const CommonTlmPacket *packet)
APID を取得
#define CTP_APID_FROM_ME
PH_ACK PH_analyze_tlm_packet(const CommonTlmPacket *packet)
CTP を解析する
C2A 全体を流れる Common Packet の配送を制御する
#define TSP_MAX_LEN
TlmSpacePacket の最大パケット長.VCDU 分割しないならこれが最大値
コマンド返り値
Space Packet (コマンド用)
Space Packet (テレメ用)
uint8_t packet[TSP_MAX_LEN]
テレメトリ定義
@ TLM_CODE_MAX
TF_TLM_FUNC_ACK TF_generate_contents(TLM_CODE tlm_id, uint8_t *packet, uint16_t *len, uint16_t max_len)
テレメを実際に生成する関数
テレメトリの登録,テレメトリ関連処理
TF_TLM_FUNC_ACK
tlm_func の返り値につかう
@ TF_TLM_FUNC_ACK_SUCCESS
成功
@ TF_TLM_FUNC_ACK_NOT_DEFINED
定義されてないテレメ
CCP_CmdRet Cmd_TG_FORWARD_AS_RT_TLM(const CommonCmdPacket *packet)
RT テレメとして 2nd OBC のテレメを転送
CCP_CmdRet Cmd_TG_FORWARD_TLM(const CommonCmdPacket *packet)
2nd OBC のテレメを転送
CCP_CmdRet Cmd_GENERATE_TLM(const CommonCmdPacket *packet)
static CCP_CmdRet TG_forward_tlm_(APID apid, TLM_CODE tlm_id, ctp_dest_flags_t dest_flags, uint8_t dest_info, uint8_t dump_num)
2nd OBC のテレメを転送
CCP_CmdRet Cmd_TG_GENERATE_ST_TLM(const CommonCmdPacket *packet)
ST テレメを生成
static uint16_t TG_get_next_seq_count_(void)
次のパケットで用いる Sequence Count を取得
CCP_CmdRet Cmd_TG_FORWARD_AS_HP_TLM(const CommonCmdPacket *packet)
HP テレメとして 2nd OBC のテレメを転送
CCP_CmdRet Cmd_TG_FORWARD_AS_ST_TLM(const CommonCmdPacket *packet)
ST テレメとして 2nd OBC のテレメを転送
CCP_CmdRet Cmd_TG_GENERATE_RT_TLM(const CommonCmdPacket *packet)
RT テレメを生成
CCP_CmdRet Cmd_TG_GENERATE_HP_TLM(const CommonCmdPacket *packet)
HP テレメを生成
static CCP_CmdRet TG_generate_tlm_(TLM_CODE tlm_id, ctp_dest_flags_t dest_flags, uint8_t dest_info, uint8_t num_dumps)
自身のテレメを生成
static CommonTlmPacket TG_ctp_
CCP_CmdRet Cmd_TG_GENERATE_TLM(const CommonCmdPacket *packet)
自身の OBC のテレメを生成
cycle_t TMGR_get_master_total_cycle(void)
現在の total_cycle を返す
Definition: time_manager.c:97
void TSP_setup_primary_hdr(TlmSpacePacket *tsp, APID apid, uint16_t seq_count, uint16_t packet_len)
Primary Header を構築
void TSP_set_2nd_hdr_ver(TlmSpacePacket *tsp, TSP_2ND_HDR_VER ver)
Secondary Header Version No を設定
void TSP_set_dest_info(TlmSpacePacket *tsp, uint8_t info)
Dest Info を設定
void TSP_set_on_board_subnet_time(TlmSpacePacket *tsp, uint32_t time)
On-Board Subnetwork Time を設定
void TSP_set_board_time(TlmSpacePacket *tsp, uint32_t time)
Board Time を設定
void TSP_set_dest_flags(TlmSpacePacket *tsp, ctp_dest_flags_t flags)
Destination Flags を設定
void TSP_set_tlm_id(TlmSpacePacket *tsp, TLM_CODE id)
Tlm ID を設定
CCSDS で規定される Space Packet の テレメ版の実装
@ TSP_2ND_HDR_VER_1
Version-1
TF_TLM_FUNC_ACK PH_user_telemetry_router(APID apid, TLM_CODE tlm_id, uint8_t *packet, uint16_t *len, uint16_t max_len)
2nd OBC のテレメを転送するために, APID からテレメを判定してルーティングする // FIXME: 命名, router ではない?
packet_handlerのコマンドルーター,コマンドアナライザのユーザー定義部分