C2A_Core
aobc_telemetry_buffer.c
[詳解]
1 #pragma section REPRO
10 #include "./aobc.h"
11 #include <string.h>
12 
15 
17 
19 {
20  // packet などは,上位の driver の初期化で driver もろとも memset 0x00 されていると期待して,ここではしない
21  int i = 0;
22  for (i = 0; i < AOBC_MAX_TLM_NUM; ++i)
23  {
25  }
26 }
27 
29 {
30  AOBC_TLM_CODE tlm_id;
31  DS_ERR_CODE ret;
32 
33  ret = CTP_get_ctp_from_dssc(p_stream_config, &AOBC_ctp_);
34  if (ret != DS_ERR_CODE_OK) return ret;
35 
37 
38  switch (tlm_id)
39  {
44  default:
46  return DS_ERR_CODE_ERR;
47  }
48 }
49 
51 {
52  const uint8_t* f = packet->packet;
53  int8_t temp_i8 = 0;
54  int16_t temp_i16 = 0;
55  int32_t temp_i32 = 0;
56  uint8_t temp_u8 = 0;
57  uint16_t temp_u16 = 0;
58  uint32_t temp_u32 = 0;
59  float temp_f = 0.0f;
60  double temp_d = 0.0;
61 
62  // GS へのテレメ中継のためのバッファーへのコピー
63  CTP_copy_packet(&(aobc_driver->tlm_buffer.tlm[tlm_id].packet), packet);
65  // TODO: CRC チェック
66 
67  // MOBC 内部でテレメデータへアクセスしやすいようにするための構造体へのパース
68  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
69  temp_u16 >>= 13;
70  temp_u16 &= 0x7;
71  aobc_driver->tlm_data.aobc_aobc.ph.ver = temp_u16;
72  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
73  temp_u16 >>= 12;
74  temp_u16 &= 0x1;
75  aobc_driver->tlm_data.aobc_aobc.ph.type = temp_u16;
76  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
77  temp_u16 >>= 11;
78  temp_u16 &= 0x1;
79  aobc_driver->tlm_data.aobc_aobc.ph.sh_flag = temp_u16;
80  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
81  temp_u16 >>= 0;
82  temp_u16 &= 0x7ff;
83  aobc_driver->tlm_data.aobc_aobc.ph.apid = temp_u16;
84  ENDIAN_memcpy(&temp_u16, &(f[2]), 2);
85  temp_u16 >>= 14;
86  temp_u16 &= 0x3;
87  aobc_driver->tlm_data.aobc_aobc.ph.seq_flag = temp_u16;
88  ENDIAN_memcpy(&temp_u16, &(f[2]), 2);
89  temp_u16 >>= 0;
90  temp_u16 &= 0x3fff;
91  aobc_driver->tlm_data.aobc_aobc.ph.seq_count = temp_u16;
92  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.ph.packet_len), &(f[4]), 2);
93  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.ver), &(f[6]), 1);
94  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.ti), &(f[7]), 4);
95  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.tlm_id), &(f[11]), 1);
96  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.global_time), &(f[12]), 8);
97  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.on_board_subnet_time), &(f[20]), 4);
98  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.dest_flags), &(f[24]), 1);
99  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.sh.dest_info), &(f[25]), 1);
106  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.current_id), &(f[49]), 1);
107  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.last_err.time.total_cycle), &(f[50]), 4);
108  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.last_err.time.step), &(f[54]), 1);
109  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.last_err.id), &(f[55]), 2);
110  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.last_err.exec_sts), &(f[57]), 1);
111  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tdsp.last_err.err_code), &(f[58]), 4);
112  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.counter), &(f[62]), 4);
113  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_exec.time), &(f[66]), 4);
114  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_exec.id), &(f[70]), 2);
115  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_exec.exec_sts), &(f[72]), 1);
116  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_exec.err_code), &(f[73]), 4);
117  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_err.time), &(f[77]), 4);
118  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_err.id), &(f[81]), 2);
119  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_err.exec_sts), &(f[83]), 1);
120  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.last_err.err_code), &(f[84]), 4);
121  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.gs_cmd.err_counter), &(f[88]), 4);
122  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.counter), &(f[92]), 4);
123  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_exec.time), &(f[96]), 4);
124  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_exec.id), &(f[100]), 2);
125  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_exec.exec_sts), &(f[102]), 1);
126  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_exec.err_code), &(f[103]), 4);
127  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_err.time), &(f[107]), 4);
128  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_err.id), &(f[111]), 2);
129  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_err.exec_sts), &(f[113]), 1);
130  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.last_err.err_code), &(f[114]), 4);
131  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.rt_cmd.err_counter), &(f[118]), 4);
132  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.counter), &(f[122]), 4);
133  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.queued), &(f[126]), 1);
134  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_exec.time), &(f[127]), 4);
135  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_exec.id), &(f[131]), 2);
136  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_exec.exec_sts), &(f[133]), 1);
137  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_exec.err_code), &(f[134]), 4);
138  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_err.time), &(f[138]), 4);
139  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_err.id), &(f[142]), 2);
140  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_err.exec_sts), &(f[144]), 1);
141  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.last_err.err_code), &(f[145]), 4);
142  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.err_counter), &(f[149]), 4);
143  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.soe_flag), &(f[153]), 1);
144  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.lockout_flag), &(f[154]), 1);
145  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.next_time), &(f[155]), 4);
146  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_gs.next_id), &(f[159]), 2);
147  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.counter), &(f[161]), 4);
148  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.queued), &(f[165]), 1);
149  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_exec.time), &(f[166]), 4);
150  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_exec.id), &(f[170]), 2);
151  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_exec.exec_sts), &(f[172]), 1);
152  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_exec.err_code), &(f[173]), 4);
153  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_err.time), &(f[177]), 4);
154  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_err.id), &(f[181]), 2);
155  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_err.exec_sts), &(f[183]), 1);
156  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.last_err.err_code), &(f[184]), 4);
157  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.err_counter), &(f[188]), 4);
158  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.soe_flag), &(f[192]), 1);
159  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.lockout_flag), &(f[193]), 1);
160  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.next_time), &(f[194]), 4);
161  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_bc.next_id), &(f[198]), 2);
162  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.counter), &(f[200]), 4);
163  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.queued), &(f[204]), 1);
164  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_exec.time), &(f[205]), 4);
165  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_exec.id), &(f[209]), 2);
166  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_exec.exec_sts), &(f[211]), 1);
167  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_exec.err_code), &(f[212]), 4);
168  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_err.time), &(f[216]), 4);
169  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_err.id), &(f[220]), 2);
170  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_err.exec_sts), &(f[222]), 1);
171  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.last_err.err_code), &(f[223]), 4);
172  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.err_counter), &(f[227]), 4);
173  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.soe_flag), &(f[231]), 1);
174  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.lockout_flag), &(f[232]), 1);
175  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.next_time), &(f[233]), 4);
176  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_aobc.tlc_tlm.next_id), &(f[237]), 2);
183  // TODO: ビットフィールドをつかっている系は,様々なパターンがあり得るので,今後,バグが出ないか注視する
184 
185  // ワーニング回避
186  (void)temp_i8;
187  (void)temp_i16;
188  (void)temp_i32;
189  (void)temp_u8;
190  (void)temp_u16;
191  (void)temp_u32;
192  (void)temp_f;
193  (void)temp_d;
194 
195  return DS_ERR_CODE_OK;
196 }
197 
199 {
200  const uint8_t* f = packet->packet;
201  int8_t temp_i8 = 0;
202  int16_t temp_i16 = 0;
203  int32_t temp_i32 = 0;
204  uint8_t temp_u8 = 0;
205  uint16_t temp_u16 = 0;
206  uint32_t temp_u32 = 0;
207  float temp_f = 0.0f;
208  double temp_d = 0.0;
209 
210  // GS へのテレメ中継のためのバッファーへのコピー
211  CTP_copy_packet(&(aobc_driver->tlm_buffer.tlm[tlm_id].packet), packet);
213  // TODO: CRC チェック
214 
215  // MOBC 内部でテレメデータへアクセスしやすいようにするための構造体へのパース
216  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
217  temp_u16 >>= 13;
218  temp_u16 &= 0x7;
219  aobc_driver->tlm_data.aobc_hk.ph.ver = temp_u16;
220  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
221  temp_u16 >>= 12;
222  temp_u16 &= 0x1;
223  aobc_driver->tlm_data.aobc_hk.ph.type = temp_u16;
224  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
225  temp_u16 >>= 11;
226  temp_u16 &= 0x1;
227  aobc_driver->tlm_data.aobc_hk.ph.sh_flag = temp_u16;
228  ENDIAN_memcpy(&temp_u16, &(f[0]), 2);
229  temp_u16 >>= 0;
230  temp_u16 &= 0x7ff;
231  aobc_driver->tlm_data.aobc_hk.ph.apid = temp_u16;
232  ENDIAN_memcpy(&temp_u16, &(f[2]), 2);
233  temp_u16 >>= 14;
234  temp_u16 &= 0x3;
235  aobc_driver->tlm_data.aobc_hk.ph.seq_flag = temp_u16;
236  ENDIAN_memcpy(&temp_u16, &(f[2]), 2);
237  temp_u16 >>= 0;
238  temp_u16 &= 0x3fff;
239  aobc_driver->tlm_data.aobc_hk.ph.seq_count = temp_u16;
240  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.ph.packet_len), &(f[4]), 2);
241  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.ver), &(f[6]), 1);
242  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.ti), &(f[7]), 4);
243  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.tlm_id), &(f[11]), 1);
244  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.global_time), &(f[12]), 8);
245  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.on_board_subnet_time), &(f[20]), 4);
246  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.dest_flags), &(f[24]), 1);
247  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.sh.dest_info), &(f[25]), 1);
248  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tm_mode_time), &(f[26]), 4);
249  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tm_unixtime_at_ti0), &(f[30]), 8);
250  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.mm_opsmode), &(f[38]), 1);
251  ENDIAN_memcpy(&temp_u8, &(f[39]), 1);
252  temp_u8 >>= 7;
253  temp_u8 &= 0x1;
254  aobc_driver->tlm_data.aobc_hk.obc.mm_sts = temp_u8;
255  ENDIAN_memcpy(&temp_u8, &(f[39]), 1);
256  temp_u8 >>= 0;
257  temp_u8 &= 0x7f;
258  aobc_driver->tlm_data.aobc_hk.obc.mm_opsmode_prev = temp_u8;
259  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tdsp.current_id), &(f[40]), 2);
260  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.counter), &(f[42]), 4);
261  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_exec.time), &(f[46]), 4);
262  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_exec.id), &(f[50]), 2);
263  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_exec.exec_sts), &(f[52]), 1);
264  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_exec.err_code), &(f[53]), 4);
265  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_err.time), &(f[57]), 4);
266  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_err.id), &(f[61]), 2);
267  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_err.exec_sts), &(f[63]), 1);
268  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.last_err.err_code), &(f[64]), 4);
269  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.gs_cmd.err_counter), &(f[68]), 4);
270  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.counter), &(f[72]), 4);
271  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_exec.time), &(f[76]), 4);
272  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_exec.id), &(f[80]), 2);
273  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_exec.exec_sts), &(f[82]), 1);
274  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_err.err_code), &(f[83]), 4);
275  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_err.time), &(f[87]), 4);
276  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_err.id), &(f[91]), 2);
277  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_err.exec_sts), &(f[93]), 1);
278  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.last_exec.err_code), &(f[94]), 4);
279  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.rt_cmd.err_counter), &(f[98]), 4);
280  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.counter), &(f[102]), 4);
281  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.queued), &(f[106]), 1);
282  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_exec.time), &(f[107]), 4);
283  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_exec.id), &(f[111]), 2);
284  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_exec.exec_sts), &(f[113]), 1);
285  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_exec.err_code), &(f[114]), 4);
286  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_err.time), &(f[118]), 4);
287  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_err.id), &(f[122]), 2);
288  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_err.exec_sts), &(f[124]), 1);
289  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.last_err.err_code), &(f[125]), 4);
290  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.err_counter), &(f[129]), 1);
291  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.next_time), &(f[130]), 4);
292  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.next_id), &(f[134]), 2);
293  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_bc.counter), &(f[136]), 4);
294  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_bc.queued), &(f[140]), 1);
295  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_tlm.counter), &(f[141]), 4);
296  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.tlc_tlm.queued), &(f[145]), 1);
297  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
298  temp_u8 >>= 7;
299  temp_u8 &= 0x1;
300  aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.soe_flag = temp_u8;
301  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
302  temp_u8 >>= 6;
303  temp_u8 &= 0x1;
304  aobc_driver->tlm_data.aobc_hk.obc.tlc_gs.lockout_flag = temp_u8;
305  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
306  temp_u8 >>= 5;
307  temp_u8 &= 0x1;
308  aobc_driver->tlm_data.aobc_hk.obc.tlc_bc.soe_flag = temp_u8;
309  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
310  temp_u8 >>= 4;
311  temp_u8 &= 0x1;
312  aobc_driver->tlm_data.aobc_hk.obc.tlc_bc.lockout_flag = temp_u8;
313  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
314  temp_u8 >>= 3;
315  temp_u8 &= 0x1;
316  aobc_driver->tlm_data.aobc_hk.obc.tlc_tlm.soe_flag = temp_u8;
317  ENDIAN_memcpy(&temp_u8, &(f[146]), 1);
318  temp_u8 >>= 2;
319  temp_u8 &= 0x1;
320  aobc_driver->tlm_data.aobc_hk.obc.tlc_tlm.lockout_flag = temp_u8;
321  ENDIAN_memcpy(&temp_u8, &(f[147]), 1);
322  temp_u8 >>= 7;
323  temp_u8 &= 0x1;
324  aobc_driver->tlm_data.aobc_hk.wdt.is_enable = temp_u8;
325  ENDIAN_memcpy(&temp_u8, &(f[147]), 1);
326  temp_u8 >>= 6;
327  temp_u8 &= 0x1;
328  aobc_driver->tlm_data.aobc_hk.wdt.is_clear_enable = temp_u8;
329  ENDIAN_memcpy(&temp_u8, &(f[147]), 1);
330  temp_u8 >>= 0;
331  temp_u8 &= 0x3f;
333  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.bct_blk_ptr), &(f[148]), 2);
334  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.bct_cmd_ptr), &(f[150]), 1);
335  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.bct_regd_time), &(f[151]), 4);
336  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.obc.bct_regd_id), &(f[155]), 2);
337  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counter_total), &(f[157]), 4);
338  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counters_high), &(f[161]), 2);
339  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counters_middle), &(f[163]), 2);
340  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counters_low), &(f[165]), 2);
341  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counters_el), &(f[167]), 2);
342  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.statistics.record_counters_eh), &(f[169]), 2);
343  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.group), &(f[171]), 1);
344  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.local), &(f[172]), 4);
345  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.err_level), &(f[176]), 1);
346  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.time.total_cycle), &(f[177]), 4);
347  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.time.step), &(f[181]), 1);
348  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_event.note), &(f[182]), 4);
349  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_high_event.group), &(f[186]), 1);
350  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_high_event.local), &(f[187]), 4);
351  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_high_event.time.total_cycle), &(f[191]), 4);
352  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_high_event.time.step), &(f[195]), 1);
353  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.el.latest_high_event.note), &(f[196]), 2);
354  ENDIAN_memcpy(&(aobc_driver->tlm_data.aobc_hk.eh.log_table.respond_counter), &(f[198]), 4);
412  // TODO: ビットフィールドをつかっている系は,様々なパターンがあり得るので,今後,バグが出ないか注視する
413 
414  // ワーニング回避
415  (void)temp_i8;
416  (void)temp_i16;
417  (void)temp_i32;
418  (void)temp_u8;
419  (void)temp_u16;
420  (void)temp_u32;
421  (void)temp_f;
422  (void)temp_d;
423 
424  return DS_ERR_CODE_OK;
425 }
426 
427 TF_TLM_FUNC_ACK AOBC_pick_up_tlm_buffer(const AOBC_Driver* aobc_driver, AOBC_TLM_CODE tlm_id, uint8_t* packet, uint16_t* len, uint16_t max_len)
428 {
429  const CommonTlmPacket* buffered_packet;
430 
431  if (tlm_id >= AOBC_MAX_TLM_NUM) return TF_TLM_FUNC_ACK_NOT_DEFINED;
433 
434  buffered_packet = &(aobc_driver->tlm_buffer.tlm[tlm_id].packet);
435  *len = CTP_get_packet_len(buffered_packet);
436 
437  if (*len > max_len) return TF_TLM_FUNC_ACK_TOO_SHORT_LEN;
438 
439  memcpy(packet, &buffered_packet->packet, (size_t)(*len));
441 }
442 
443 #pragma section
AOBC の Driver
@ AOBC_RX_ERR_CODE_TLM_NOT_FOUND
Definition: aobc.h:34
TF_TLM_FUNC_ACK AOBC_pick_up_tlm_buffer(const AOBC_Driver *aobc_driver, AOBC_TLM_CODE tlm_id, uint8_t *packet, uint16_t *len, uint16_t max_len)
static CommonTlmPacket AOBC_ctp_
static DS_ERR_CODE AOBC_analyze_tlm_aobc_hk_(const CommonTlmPacket *packet, AOBC_TLM_CODE tlm_id, AOBC_Driver *aobc_driver)
void AOBC_init_tlm_buffer(AOBC_Driver *aobc_driver)
static DS_ERR_CODE AOBC_analyze_tlm_aobc_aobc_(const CommonTlmPacket *packet, AOBC_TLM_CODE tlm_id, AOBC_Driver *aobc_driver)
DS_ERR_CODE AOBC_buffer_tlm_packet(DS_StreamConfig *p_stream_config, AOBC_Driver *aobc_driver)
テレメトリバッファー(テレメ中継)
#define AOBC_MAX_TLM_NUM
テレメトリ定義
@ AOBC_Tlm_CODE_AOBC_AOBC
@ AOBC_Tlm_CODE_AOBC_HK
DS_ERR_CODE CTP_get_ctp_from_dssc(const DS_StreamConfig *p_stream_config, CommonTlmPacket *received_packet)
CommonTlmPacket を受信データからコピーして取得する
コンポ間通信などで標準的に使う ネットワーク層 の Common Tlm Cmd Packet (概ね Space Packet)
void CTP_copy_packet(CommonTlmPacket *dest, const CommonTlmPacket *src)
CommonTlmPacket をコピー
uint16_t CTP_get_packet_len(const CommonTlmPacket *packet)
パケット長を取得
TLM_CODE CTP_get_id(const CommonTlmPacket *packet)
TLM ID を取得
const AOBC_Driver *const aobc_driver
AOBC driver
Definition: di_aobc.c:23
DS_ERR_CODE
DriverSuper の汎用エラーコード
Definition: driver_super.h:116
@ DS_ERR_CODE_ERR
Definition: driver_super.h:118
@ 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
AOBC_TlmData tlm_data
Definition: aobc.h:71
AOBC_TlmBuffer tlm_buffer
Definition: aobc.h:72
AOBC_Info info
Definition: aobc.h:70
struct AOBC_Info::@21 comm
通信情報
AOBC_RX_ERR_CODE rx_err_code
Definition: aobc.h:55
CommonTlmPacket packet
最新のテレメパケットを保持
uint8_t is_null_packet
一度でもテレメを受信しているか?(空配列が読み出されるのを防ぐため)
AOBC_TlmBufferElem tlm[AOBC_MAX_TLM_NUM]
TLM ID ごとに保持
struct AOBC_TlmData::@24 aobc_hk
struct AOBC_TlmData::@24::@47 obc
struct AOBC_TlmData::@23::@26 sh
struct AOBC_TlmData::@23::@29 rt_cmd
struct AOBC_TlmData::@23::@28 gs_cmd
struct AOBC_TlmData::@24::@48 wdt
struct AOBC_TlmData::@23::@27 tdsp
struct AOBC_TlmData::@23 aobc_aobc
struct AOBC_TlmData::@23::@31 tlc_bc
struct AOBC_TlmData::@23::@30 tlc_gs
struct AOBC_TlmData::@24::@50 eh
struct AOBC_TlmData::@23::@25 ph
struct AOBC_TlmData::@23::@32 tlc_tlm
struct AOBC_TlmData::@24::@49 el
DriverSuperStream の設定
Definition: driver_super.h:281
Space Packet (テレメ用)
uint8_t packet[TSP_MAX_LEN]
TF_TLM_FUNC_ACK
tlm_func の返り値につかう
@ TF_TLM_FUNC_ACK_NULL_PACKET
2nd OBC などのテレメを生成する時,まだ1つもそのテレメパケットを 2nd OBC から受信していない
@ TF_TLM_FUNC_ACK_TOO_SHORT_LEN
CommonTlmPacket が,生成されるテレメに比べて小さすぎる(定義されたテレメが大きすぎる)
@ TF_TLM_FUNC_ACK_SUCCESS
成功
@ TF_TLM_FUNC_ACK_NOT_DEFINED
定義されてないテレメ