C2A_Core
driver_super.c
[詳解]
1 #pragma section REPRO
12 #include "driver_super.h"
13 #include "../../Library/print.h"
14 #include <string.h> // for memset などの mem 系
15 #include <stddef.h> // for NULL
16 #include "../../TlmCmd/common_cmd_packet_util.h"
17 
18 // #define DS_DEBUG // 適切なときにコメントアウトする
19 // #define DS_DEBUG_SHOW_REC_DATA // 適切なときにコメントアウトする
20 
22 
33 static DS_ERR_CODE DS_send_cmd_(DriverSuper* p_super, uint8_t stream);
34 
43 static int DS_tx_(DriverSuper* p_super, uint8_t stream);
44 
52 static int DS_rx_(DriverSuper* p_super);
53 
60 static void DS_analyze_rx_buffer_(DS_StreamConfig* p_stream_config,
61  uint16_t rec_data_len);
62 
72 static void DS_analyze_rx_buffer_prepare_buffer_(DS_StreamConfig* p_stream_config,
73  uint16_t rec_data_len);
74 
82 static void DS_analyze_rx_buffer_pickup_(DS_StreamConfig* p_stream_config);
83 
89 static void DS_analyze_rx_buffer_cueing_buffer_(DS_StreamConfig* p_stream_config);
90 
98 static void DS_analyze_rx_buffer_fixed_pickup_(DS_StreamConfig* p_stream_config);
99 
109 
121 
128 static void DS_analyze_rx_buffer_finding_header_(DS_StreamConfig* p_stream_config);
129 
136 static void DS_analyze_rx_buffer_receiving_header_(DS_StreamConfig* p_stream_config);
137 
146 static void DS_analyze_rx_buffer_receiving_footer_(DS_StreamConfig* p_stream_config,
147  uint16_t rx_frame_size);
148 
155 static uint32_t DS_analyze_rx_buffer_get_framelength_(DS_StreamConfig* p_stream_config);
156 
164 static DS_ERR_CODE DS_reset_stream_config_(DS_StreamConfig* p_stream_config);
165 
172 static DS_ERR_CODE DS_validate_stream_config_(const DriverSuper* p_super, DS_StreamConfig* p_stream_config);
173 
174 // ダミー関数
175 // EQU だと関数ポインタの初期値を NULL にしていたためにぬるぽで事故ったので
177 static DS_ERR_CODE DS_data_analyzer_dummy_(DS_StreamConfig* p_stream_config, void* p_driver);
178 
179 // ###### DS_StreamRecBuffer 関連関数 ######
180 
186 void DS_clear_stream_rec_buffer_(DS_StreamRecBuffer* stream_rec_buffer);
187 
196  uint16_t size);
197 
208  const uint8_t* buffer,
209  uint16_t size);
210 
218 
226 void DS_confirm_stream_rec_buffer_(DS_StreamRecBuffer* stream_rec_buffer,
227  uint16_t size);
228 
237  uint16_t size);
238 
239 
240 // ###### DriverSuper基本関数 ######
241 
243  void* if_config,
244  DS_StreamRecBuffer* rx_buffer,
245  DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super))
246 {
247  DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX];
248  DS_nullify_stream_rec_buffers(rx_buffers);
249  rx_buffers[0] = rx_buffer;
250  return DS_init_streams(p_super, if_config, rx_buffers, load_init_setting);
251 }
252 
253 
255  void* if_config,
256  DS_StreamRecBuffer* rx_buffers[DS_STREAM_MAX],
257  DS_ERR_CODE (*load_init_setting)(DriverSuper* p_super))
258 {
259  uint8_t stream;
260 
261  if (DS_reset(p_super) != DS_ERR_CODE_OK) return DS_ERR_CODE_ERR;
262 
263  p_super->if_config = if_config;
264 
265  // load_init_setting で上書きできるようにここで設定
266  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
267  {
268  if (rx_buffers[stream] != NULL)
269  {
270  DSSC_set_rx_buffer(&(p_super->stream_config[stream]), rx_buffers[stream]);
271  }
272  }
273 
274  p_super->config.internal.load_init_setting = load_init_setting;
275  if (p_super->config.internal.load_init_setting(p_super) != DS_ERR_CODE_OK) return DS_ERR_CODE_ERR;
276 
277  if (DS_validate_config(p_super) != DS_ERR_CODE_OK) return DS_ERR_CODE_ERR;
278 
279  // IF の初期化
280  // 一旦シンプルに IF_init のエラーコードは無視する(実機でここでエラー出る場合はコードがおかしいので.必要があれば将来実装.)
281  if ( (*IF_init[p_super->interface])(p_super->if_config) != 0 ) return DS_ERR_CODE_ERR;
282 
283  return DS_ERR_CODE_OK;
284 }
285 
286 
288 {
289  uint8_t stream;
290 
291  p_super->interface = IF_LIST_MAX; // FIXME: (*IF_init[p_super->interface])(p_super->if_config) の様な使い方をするのでセグフォが起こる可能性があり
292  p_super->if_config = NULL; // FIXME: NULL ポインタはこの関数が Reset 単体で使われるとマズい
293 
296  p_super->config.settings.time_threshold_for_rx_disruption_ = 60 * 1000; // この値はよく考えること
297 
298  p_super->config.info.rec_status_.ret_from_if_rx = 0;
300 
301  p_super->config.info.rx_count_ = 0;
302  p_super->config.info.rx_call_count_ = 0;
304 
306 
307  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
308  {
309  DS_ERR_CODE ret = DS_reset_stream_config_(&p_super->stream_config[stream]);
310  if (ret != DS_ERR_CODE_OK) return ret;
311  }
312 
313  DS_clear_rx_buffer(p_super);
314 
315  return DS_ERR_CODE_OK;
316 }
317 
318 
320 {
321  uint8_t stream;
322 
323  if (p_super->interface < 0 || p_super->interface >= IF_LIST_MAX) return DS_ERR_CODE_ERR;
324  if (p_super->if_config == NULL) return DS_ERR_CODE_ERR;
325 
327 
328  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
329  {
330  DS_ERR_CODE ret = DS_validate_stream_config_(p_super, &p_super->stream_config[stream]);
331  if (ret != DS_ERR_CODE_OK) return ret;
332  }
333 
334  return DS_ERR_CODE_OK;
335 }
336 
338 {
339  uint8_t stream;
340 
341  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
342  {
344  }
345 
346  // FIXME: すべての Driver の初期化で呼ばれ,無駄
347  memset(DS_if_rx_buffer_,
348  0x00,
349  sizeof(DS_if_rx_buffer_));
350 
351  return DS_ERR_CODE_OK;
352 }
353 
354 
356 {
357  uint8_t stream;
358  uint16_t rec_data_len;
359  int ret_rx;
360 
361  p_super->config.info.rx_call_count_++;
362 
363  // 各 Driver で物理的に接続されている wire は1本なので,それをここで受信する.
364  // 後段の stream では,その受信したビット列に対して,複数のフレーム種類に対して,フレーム探索,確定処理を走らす.
365  ret_rx = DS_rx_(p_super);
366  p_super->config.info.rec_status_.ret_from_if_rx = ret_rx;
367 
368  if (ret_rx > 0)
369  {
370  // なにかしらの受信データあり
371  p_super->config.info.rx_count_++;
373  }
374 
375  // 受信途絶判定
376  // テレメなどで見るときにノイズになるので,判定しないときは OK にしておく
379  {
381  uint32_t last_rx_ago = OBCT_diff_in_msec(&p_super->config.info.rx_time_, &now);
382 
383  if (last_rx_ago > p_super->config.settings.time_threshold_for_rx_disruption_)
384  {
386  }
387  }
388 
389  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
390  {
391  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
392  if (!p_stream_config->settings.is_enabled_)
393  {
395  continue;
396  }
397 
398  // setter で validation かけると,初期化などで何度もかかることや,
399  // そもそもこの validation は打ち上げ時というよりむしろ地上試験時に有用なので,ここに置く
400  if (p_stream_config->internal.is_validation_needed_for_rec_)
401  {
402  DS_ERR_CODE ret = DS_validate_stream_config_(p_super, p_stream_config);
403  if (ret != DS_ERR_CODE_OK)
404  {
406  continue;
407  }
408  }
409 
410  if (ret_rx < 0) // この共通処理が for の中にあるの,若干キモい...
411  {
412  // RX失敗
414  // [TODO] ここに DriverSuper としての共通のアノマリ発行を入れるかは要議論
415  // 個別対応なので, Driver に実装する,ないしは, IF 側に実装するのが自然か?
416  continue;
417  }
418  else if (ret_rx == 0)
419  {
420  // 受信データなし
421 
422  // 今回の受信はなくとも,バッファ内部に未処理データがあれば処理する
424  {
425  // 繰越があるので,ここで continue せずへ次へ
426  }
427  else
428  {
429  // rec_status_.status_code 基本は更新せず
430  // FIXED の場合はリセット
432  {
434  }
435  continue;
436  }
437  }
438  else
439  {
440  // 何もしない
441  }
442 
443  // ここまできたら受信データあり
444 
445  rec_data_len = (uint16_t)ret_rx; // ここまでくれば非負数
446  // 受信データ処理
447  DS_analyze_rx_buffer_(p_stream_config, rec_data_len);
448 
449  // フレーム確定処理
451  {
452  p_stream_config->info.rx_frame_fix_count_++;
453  p_stream_config->info.rx_frame_fix_time_ = TMGR_get_master_clock();
454  p_stream_config->info.req_tlm_cmd_tx_count_after_last_tx_ = 0;
455  }
456  }
457 
458  // streamのテレメ途絶判定(テレメフレーム確定途絶判定)
459  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
460  {
461  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
462  ObcTime now;
463  uint32_t last_tlm_fix_ago;
464 
465  // テレメなどで見るときにノイズになるので,判定しないときは OK にしておく
467 
468  if (!p_stream_config->settings.is_enabled_ || !p_stream_config->settings.should_monitor_for_tlm_disruption_)
469  {
470  continue;
471  }
472 
473  now = TMGR_get_master_clock();
474  last_tlm_fix_ago = OBCT_diff_in_msec(&p_stream_config->info.rx_frame_fix_time_, &now);
475 
476  if (last_tlm_fix_ago > p_stream_config->settings.time_threshold_for_tlm_disruption_)
477  {
479  }
480  }
481 
482  return (ret_rx < 0) ? DS_ERR_CODE_ERR : DS_ERR_CODE_OK;
483 }
484 
485 
486 DS_ERR_CODE DS_analyze_rec_data(DriverSuper* p_super, uint8_t stream, void* p_driver)
487 {
488  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
489 
490  p_stream_config->info.ret_from_data_analyzer_ = p_stream_config->settings.data_analyzer_(p_stream_config, p_driver);
491 
492  return p_stream_config->info.ret_from_data_analyzer_;
493 }
494 
495 
496 DS_ERR_CODE DS_send_general_cmd(DriverSuper* p_super, uint8_t stream)
497 {
498  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
499 
500  if (!p_stream_config->settings.is_enabled_)
501  {
503  return DS_ERR_CODE_OK;
504  }
505 
506  p_stream_config->info.general_cmd_tx_count_++;
507  p_stream_config->info.general_cmd_tx_time_ = TMGR_get_master_clock();
508 
509 #ifdef DS_DEBUG
510  Printf("DS: send_general_cmd\n");
511 #endif
512 
513  return DS_send_cmd_(p_super, stream);
514 }
515 
516 
517 DS_ERR_CODE DS_send_req_tlm_cmd(DriverSuper* p_super, uint8_t stream)
518 {
519  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
520 
521  if (!p_stream_config->settings.is_enabled_)
522  {
524  return DS_ERR_CODE_OK;
525  }
526 
527  p_stream_config->info.req_tlm_cmd_tx_count_++;
528  p_stream_config->info.req_tlm_cmd_tx_count_after_last_tx_++;
529  p_stream_config->info.req_tlm_cmd_tx_time_ = TMGR_get_master_clock();
530 
531 #ifdef DS_DEBUG
532  Printf("DS: send_req_tlm_cmd\n");
533 #endif
534 
535  return DS_send_cmd_(p_super, stream);
536 }
537 
538 
539 static DS_ERR_CODE DS_send_cmd_(DriverSuper* p_super, uint8_t stream)
540 {
541  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
542 
543  // setter で validation かけると,初期化などで何度もかかることや,
544  // そもそもこの validation は打ち上げじというよりむしろ地上試験時に有用なので,ここに置く
545  if (p_stream_config->internal.is_validation_needed_for_send_)
546  {
547  DS_ERR_CODE ret = DS_validate_stream_config_(p_super, p_stream_config);
548  if (ret != DS_ERR_CODE_OK)
549  {
551  return DS_ERR_CODE_ERR;
552  }
553  }
554 
555  p_stream_config->info.send_status_.ret_from_if_tx = DS_tx_(p_super, stream);
556 
557  if (p_stream_config->info.send_status_.ret_from_if_tx != 0)
558  {
560  return DS_ERR_CODE_ERR;
561  }
562 
564  return DS_ERR_CODE_OK;
565 }
566 
567 
568 static int DS_tx_(DriverSuper* p_super, uint8_t stream)
569 {
570  int ret;
571  DS_StreamConfig* p_stream_config = &(p_super->stream_config[stream]);
572 
573  if (p_stream_config->settings.tx_frame_size_ == 0) return DS_ERR_CODE_OK;
574  if (p_stream_config->settings.tx_frame_ == NULL) return DS_ERR_CODE_OK;
575 
576 #ifdef DS_DEBUG
577  Printf("DS: tx_\n");
578 #endif
579 
580  ret = (*IF_TX[p_super->interface])(p_super->if_config,
581  p_stream_config->settings.tx_frame_,
582  (int)p_stream_config->settings.tx_frame_size_);
583 
584  if (ret != 0) return ret;
585  return DS_ERR_CODE_OK;
586 }
587 
588 
589 static int DS_rx_(DriverSuper* p_super)
590 {
591  int flag;
592  int rec_data_len;
593  uint8_t stream;
594 #ifdef DS_DEBUG_SHOW_REC_DATA
595  int16_t i;
596 #endif
597 
598  // 少なくとも 1 つの stream が有効でかつ,rx_frame_size_ が 0 以外でないと受信処理はしない
599  flag = 0;
600  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
601  {
602  if (! (p_super->stream_config[stream].settings.is_enabled_) ) continue;
603  if (p_super->stream_config[stream].settings.rx_frame_size_ != 0)
604  {
605  flag = 1;
606  }
607  }
608  if (flag == 0) return 0;
609 
610  rec_data_len = (*IF_RX[p_super->interface])(p_super->if_config,
613 
614 #ifdef DS_DEBUG
615  Printf("DS: rx_\n");
616 #endif
617 
618  if (rec_data_len <= 0) return rec_data_len; // 負数はエラーコード
619 
620 #ifdef DS_DEBUG_SHOW_REC_DATA
621  Printf("DS: Receive data size is %d bytes, as follow:\n", rec_data_len);
622  for (i = 0; i < rec_data_len; i++)
623  {
624  Printf("%02x ", DS_if_rx_buffer_[i]);
625  if (i % 4 == 3) Printf(" ");
626  }
627  Printf("\n");
628 #endif
629 
630  return rec_data_len;
631 }
632 
633 
634 static void DS_analyze_rx_buffer_(DS_StreamConfig* p_stream_config,
635  uint16_t rec_data_len)
636 {
637  DS_analyze_rx_buffer_prepare_buffer_(p_stream_config, rec_data_len);
638 
639  DS_analyze_rx_buffer_pickup_(p_stream_config);
640 
641  // 次回のデータ受信に備えて,バッファの頭出し
642  DS_analyze_rx_buffer_cueing_buffer_(p_stream_config);
643 }
644 
645 
647  uint16_t rec_data_len)
648 {
649  // rx_buffer_ には,前回確定したフレームも残っているので,それは除く
650  // したがって, DS の DSSC_get_rx_frame した frame へのポインタは,次回受信時までしか有効ではない
651  DS_StreamRecBuffer* buffer = p_stream_config->settings.rx_buffer_;
652  DS_ERR_CODE ret;
653 
654  if (buffer->is_frame_fixed)
655  {
656  // ユーザー側ですでにデータを取得したと判断して,バッファから下ろす
657  DS_drop_from_stream_rec_buffer_(buffer, buffer->pos_of_frame_head_candidate); // 念のため
658 
659  if (p_stream_config->settings.is_strict_frame_search_)
660  {
661  // 厳格なフレーム探索なので,1 つの可能性も受信漏らさないように
663  }
664  else
665  {
667  }
668 
669  buffer->is_frame_fixed = 0;
670  }
671 
672  // 新規受信分をバッファへ
673  buffer->pos_of_last_rec = buffer->size; // 最終更新地点を更新
674  ret = DS_push_to_stream_rec_buffer_(buffer, DS_if_rx_buffer_, rec_data_len);
675  if (ret != DS_ERR_CODE_OK)
676  {
677  // バッファがあふれるので,一旦古いバッファのクリア
678  // TODO: この仕様は検討してもよいかも?(ユーザー選択にするとか)
680  DS_push_to_stream_rec_buffer_(buffer, DS_if_rx_buffer_, rec_data_len);
681  p_stream_config->info.rec_status_.count_of_carry_over_failures++;
682  }
683 }
684 
685 
686 static void DS_analyze_rx_buffer_pickup_(DS_StreamConfig* p_stream_config)
687 {
688  DS_StreamRecBuffer* buffer = p_stream_config->settings.rx_buffer_;
689  // 受信バッファのデータを走査し,必要なデータをフレームとして pickup する関数
690  void (*pickup_func)(DS_StreamConfig* p_stream_config);
691 
692  if (p_stream_config->settings.rx_frame_size_ == 0) return;
693 
694  if (p_stream_config->settings.rx_frame_size_ > 0)
695  {
697  }
698  else if (p_stream_config->settings.rx_frame_size_ < 0)
699  {
700  // フレームにフレーム長データが含まれているか?
701  if (p_stream_config->settings.rx_framelength_pos_ >= 0)
702  {
704  }
705  else
706  {
708  }
709  }
710  else
711  {
712  // TODO: ビッグデータ対応
713  pickup_func = NULL;
714  return;
715  }
716 
717  // 受信バッファからデータをピックアップしていく
719  {
720  pickup_func(p_stream_config);
721 
723  {
724  break;
725  }
726 
727  // 不整合が起きたら,現在の frame 候補の先頭 + 1 バイト目に走査場所を戻す
732  {
734 
735  // 他の部分での条件分岐のために,詳細エラー情報を現在のステータスに上書きする
737  }
738  }
739 
741  {
742  buffer->is_frame_fixed = 1;
743  p_stream_config->info.rec_status_.fixed_frame_len = buffer->confirmed_frame_len;
744  // FIXME: is_frame_fixed と DS_STREAM_REC_STATUS_FIXED_FRAME あたいの混在がだるいので直す?
745  // FIXME: confirmed_frame_len と fixed_frame_len も?(これはまあ最後のを残すという意味ではよさそう)
746  }
747 
748  return;
749 }
750 
751 
753 {
754  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
756 
757  // pos_of_frame_head_candidate の頭出しをしておけば OK
759 }
760 
761 
763 {
764  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
766 
767  if (buffer->confirmed_frame_len == 0 && p->settings.rx_header_size_ != 0)
768  {
769  // まだヘッダの先頭すら未発見の場合(ヘッダなし時はここはスキップ)
770  DS_analyze_rx_buffer_finding_header_(p_stream_config);
771  return;
772  }
773  else if (buffer->confirmed_frame_len < p->settings.rx_header_size_)
774  {
775  // ヘッダ受信中
777  return;
778  }
780  {
781  // データ受信中
782  // ここは高速化のために一括処理
783  // ヘッダなしの場合は,ここがフレーム先頭であることに注意
784  const uint16_t unprocessed_data_len = DS_get_unprocessed_size_from_stream_rec_buffer_(buffer);
785  uint16_t pickup_data_len = (uint16_t)(p->settings.rx_frame_size_ - p->settings.rx_footer_size_ - buffer->confirmed_frame_len);
786 
787  // 今回で全部受信しきらない場合
788  if (pickup_data_len > unprocessed_data_len)
789  {
790  pickup_data_len = unprocessed_data_len;
791  }
792 
793  DS_confirm_stream_rec_buffer_(buffer, pickup_data_len); // pickup_data_len byte 確定
795 
796  // フッタがなく,data 受信仕切った場合はフレーム確定
797  // これがないと,DS_analyze_rx_buffer_fixed_ で
798  // 今まさに受信したデータ長がぴったりフレーム末だった場合に,フレーム確定が1周期遅れることになるので
800  {
802  }
803 
804  return;
805  }
806  else
807  {
808  // フッタ受信中 or フッタなしの場合はフレーム確定
810  (uint16_t)(p->settings.rx_frame_size_));
811  return;
812  }
813 }
814 
815 
817 {
818  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
820  const uint16_t unprocessed_data_len = DS_get_unprocessed_size_from_stream_rec_buffer_(buffer);
821  uint32_t rx_frame_size = DS_analyze_rx_buffer_get_framelength_(p_stream_config); // まだ受信していない場合は不定値が入ることに留意すること!!
822 
823  if (buffer->confirmed_frame_len == 0 && p->settings.rx_header_size_ != 0)
824  {
825  // まだヘッダの先頭すら未発見の場合(ヘッダなし時はここはスキップ)
826  DS_analyze_rx_buffer_finding_header_(p_stream_config);
827  return;
828  }
829  else if (buffer->confirmed_frame_len < p->settings.rx_header_size_)
830  {
831  // ヘッダ受信中
833  return;
834  }
836  {
837  // フレームサイズ探索中
838  // ここは高速化のために一括処理
839  // ヘッダなしの場合は,ここがフレーム先頭であることに注意
840  uint16_t pickup_data_len = (uint16_t)(p->settings.rx_framelength_pos_ + p->settings.rx_framelength_type_size_ - buffer->confirmed_frame_len);
841 
842  // 今回で全部受信しきらない場合
843  if (pickup_data_len > unprocessed_data_len)
844  {
845  pickup_data_len = unprocessed_data_len;
846  }
847 
848  DS_confirm_stream_rec_buffer_(buffer, pickup_data_len); // pickup_data_len byte 確定
850 
851  // フレーム長を受信し終わった場合,チェックする
853  {
854  rx_frame_size = DS_analyze_rx_buffer_get_framelength_(p_stream_config);
855 
856  // バッファー超え or 上限値超えはエラーを出す!
857  if (rx_frame_size > buffer->capacity || rx_frame_size > p->settings.max_rx_frame_size_)
858  {
860 #ifdef DS_DEBUG
861  Printf("DS: RX frame size is too long\n");
862 #endif
863  return;
864  }
865 
866  // body サイズがは 0 以上を要請
867  if (rx_frame_size < p->settings.rx_header_size_ + p->settings.rx_footer_size_)
868  {
870 #ifdef DS_DEBUG
871  Printf("DS: RX frame size is too short\n");
872 #endif
873  return;
874  }
875  }
876 
877  return;
878  }
879  else if (buffer->confirmed_frame_len < rx_frame_size - p->settings.rx_footer_size_)
880  {
881  // データ受信中
882  // ここは高速化のために一括処理
883  // TODO: 現在,フレーム長が uint16_t を超えることは想定していない!
884  uint16_t pickup_data_len = (uint16_t)(rx_frame_size - p->settings.rx_footer_size_ - buffer->confirmed_frame_len);
885 
886  // 今回で全部受信しきらない場合
887  if (pickup_data_len > unprocessed_data_len)
888  {
889  pickup_data_len = unprocessed_data_len;
890  }
891 
892  DS_confirm_stream_rec_buffer_(buffer, pickup_data_len); // pickup_data_len byte 確定
894 
895  // フッタがなく,data 受信仕切った場合はフレーム確定
896  // これがないと,DS_analyze_rx_buffer_fixed_ で
897  // 今まさに受信したデータ長がぴったりフレーム末だった場合に,フレーム確定が 1 周期遅れることになるので
898  if (p->settings.rx_footer_size_ == 0 && buffer->confirmed_frame_len == rx_frame_size)
899  {
901  }
902 
903  return;
904  }
905  else
906  {
907  // フッタ受信中 or フッタなしの場合はフレーム確定
909  (uint16_t)rx_frame_size);
910  return;
911  }
912 }
913 
914 
916 {
917  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
919 
920  if (buffer->confirmed_frame_len == 0 && p->settings.rx_header_size_ != 0)
921  {
922  // まだヘッダの先頭すら未発見の場合(ヘッダなし時はここはスキップ)
923  DS_analyze_rx_buffer_finding_header_(p_stream_config);
924  return;
925  }
926  else if (buffer->confirmed_frame_len < p->settings.rx_header_size_)
927  {
928  // ヘッダ受信中
930  return;
931  }
932  else
933  {
934  // 最後まで受信し,フッタの最終文字を探す.フッタなしはありえない.
935  // ヘッダなしの場合は,ここがフレーム先頭
936  const uint16_t unprocessed_data_len = DS_get_unprocessed_size_from_stream_rec_buffer_(buffer);
937  uint8_t* p_footer_last; // inclusive
938  int32_t body_data_len; // サイズ的には u16 でよいが,負数もとりたいので i32 としている
939  uint16_t processed_data_len;
940  uint16_t i;
941  const uint16_t memchr_offset = buffer->pos_of_frame_head_candidate + buffer->confirmed_frame_len;
942  uint16_t estimated_rx_frame_end_pos;
943 
944  // 届いているデータを受信フレームバッファに格納する
945  // ここは高速化のために一括処理
946  // フッタ最終文字を探す
947  p_footer_last = (uint8_t*)memchr(&(buffer->buffer[memchr_offset]),
948  (int)(p->settings.rx_footer_[p->settings.rx_footer_size_ - 1]),
949  (size_t)unprocessed_data_len);
950 
951  if (p_footer_last == NULL)
952  {
953  // まだフッタ候補まで受信していない → 受信データはすべて今回のフレームとして確定
954  processed_data_len = unprocessed_data_len;
955  }
956  else
957  {
958  // フッタ候補発見 → フッタ候補までフレーム確定
959  processed_data_len = (uint16_t)(p_footer_last - &(buffer->buffer[memchr_offset]) + 1);
960  }
961 
962  // ↓ buffer->confirmed_frame_len が更新されることに注意!
963  DS_confirm_stream_rec_buffer_(buffer, processed_data_len); // processed_data_len byte 確定
965  {
967 #ifdef DS_DEBUG
968  Printf("DS: RX frame size is too long\n");
969 #endif
970  return;
971  }
972 
973  // フッタ候補未発見の場合はここで処理を返す
974  if (p_footer_last == NULL)
975  {
977  return;
978  }
979 
980  body_data_len = buffer->confirmed_frame_len - p->settings.rx_header_size_ - p->settings.rx_footer_size_;
981  if (body_data_len < 0)
982  {
983  // これはフッタではないので受信続行
984  // まだまだ受信する
986  return;
987  }
988 
989  // フッタ候補発見
990  // フッタチェックする
991  estimated_rx_frame_end_pos = buffer->pos_of_frame_head_candidate + buffer->confirmed_frame_len;
992  for (i = 0; i < p->settings.rx_footer_size_; i++)
993  {
994  if (buffer->buffer[estimated_rx_frame_end_pos - i - 1] != p->settings.rx_footer_[p->settings.rx_footer_size_ - i - 1])
995  {
996  // これはフッタではないので受信続行
997  // まだまだ受信する
999  return;
1000  }
1001  }
1002 
1003  // フッタ確定 → フレーム確定
1005  return;
1006  }
1007 }
1008 
1009 
1011 {
1012  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
1013  DS_StreamRecBuffer* buffer = p->settings.rx_buffer_;
1014  const uint16_t unprocessed_data_len = DS_get_unprocessed_size_from_stream_rec_buffer_(buffer);
1015  uint8_t* p_header;
1016  uint16_t found_header_offset;
1017 
1018  // コードが正しければ,ヘッダがないケースはここに到達し得ないが,ヌルポ回避をいれておく
1019  if (p_stream_config->settings.rx_header_ == NULL)
1020  {
1021 #ifdef DS_DEBUG
1022  Printf("DS: RX header is invalid\n");
1023 #endif
1025  DS_move_forward_frame_head_candidate_of_stream_rec_buffer_(buffer, unprocessed_data_len);
1026  return;
1027  }
1028 
1029  // まだヘッダの先頭すら未発見の場合
1030  // ここは高速化のために一括処理
1031  p_header = (uint8_t*)memchr(&buffer->buffer[buffer->pos_of_frame_head_candidate],
1032  (int)(p->settings.rx_header_[0]),
1033  (size_t)unprocessed_data_len);
1034 
1035  if (p_header == NULL)
1036  {
1037 #ifdef DS_DEBUG
1038  Printf("DS: RX header not found\n");
1039 #endif
1041  DS_move_forward_frame_head_candidate_of_stream_rec_buffer_(buffer, unprocessed_data_len);
1042  return;
1043  }
1044 
1045  found_header_offset = (uint16_t)(p_header - &buffer->buffer[buffer->pos_of_frame_head_candidate]);
1047  DS_confirm_stream_rec_buffer_(buffer, 1); // ヘッダ 1 byte 目が見つかった
1049  return;
1050 }
1051 
1052 
1054 {
1055  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
1056  DS_StreamRecBuffer* buffer = p->settings.rx_buffer_;
1057  const uint16_t buffer_offset = buffer->pos_of_frame_head_candidate + buffer->confirmed_frame_len;
1058 
1059  // ヘッダ受信中
1060  // 受信が細切れのときなどの処理分岐がめんどくさいので, 1 byte ずつ処理させる
1061 
1062  // ヘッダが正しいか?
1063  if (buffer->buffer[buffer_offset] == p->settings.rx_header_[buffer->confirmed_frame_len])
1064  {
1065  DS_confirm_stream_rec_buffer_(buffer, 1); // ヘッダの次の 1 byte がみつかった
1067  return;
1068  }
1069  else
1070  {
1071  // ヘッダが正しくなかった
1072  // DS_STREAM_REC_STATUS_HEADER_MISMATCH になり,再びバッファを巻き戻してヘッダ探索を始める
1073  // その後 DS_STREAM_REC_STATUS_FINDING_HEADER に戻る
1075 #ifdef DS_DEBUG
1076  Printf("DS: RX header is mismatch\n");
1077 #endif
1078  return;
1079  }
1080 }
1081 
1082 
1084  uint16_t rx_frame_size)
1085 {
1086  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
1087  DS_StreamRecBuffer* buffer = p->settings.rx_buffer_;
1088  const uint16_t buffer_offset = buffer->pos_of_frame_head_candidate + buffer->confirmed_frame_len;
1089  uint16_t rec_footer_pos;
1090 
1091  // フッタなしの場合はフレーム確定
1092  if (p->settings.rx_footer_size_ == 0)
1093  {
1094  // フッタなし
1096  return;
1097  }
1098 
1099  // フッタ受信
1100  // ここも条件分岐がめんどくさいので,1 byte ずつ処理する
1101  rec_footer_pos = (uint16_t)(buffer->confirmed_frame_len - (rx_frame_size - p->settings.rx_footer_size_));
1102 
1103  // 期待されているフッタが受信できたか?
1104  // 受信できなかった場合, DS_STREAM_REC_STATUS_FOOTER_MISMATCH になり,再びバッファを巻き戻してヘッダ探索を始める
1105  // その後 DS_STREAM_REC_STATUS_FINDING_HEADER に戻る
1106  if (buffer->buffer[buffer_offset] != p->settings.rx_footer_[rec_footer_pos])
1107  {
1109 #ifdef DS_DEBUG
1110  Printf("DS: RX footer is mismatch\n");
1111 #endif
1112  return;
1113  }
1114 
1115  // ここまできたら正しいフッタが受信されている
1116  DS_confirm_stream_rec_buffer_(buffer, 1); // ヘッダの次の 1 byte がみつかった
1117 
1118  if (buffer->confirmed_frame_len == rx_frame_size)
1119  {
1120  // フレーム確定
1122  }
1123  else
1124  {
1125  // フレーム確定せず
1127  }
1128 
1129  return;
1130 }
1131 
1132 
1134 {
1135  DS_StreamConfig* p = p_stream_config; // ちょっと変数名が長すぎて配列 index などがみずらいので...
1136  uint32_t len = 0;
1137  uint8_t i;
1139  const uint16_t size = p->settings.rx_framelength_type_size_;
1140 
1142  {
1143  for (i = 0; i < size; ++i)
1144  {
1145  if (i == 0)
1146  {
1147  len = p->settings.rx_buffer_->buffer[pos];
1148  }
1149  else
1150  {
1151  len <<= 8;
1152  len |= p->settings.rx_buffer_->buffer[pos + i];
1153  }
1154  }
1155  }
1156  else
1157  {
1158  for (i = 0; i < size; ++i)
1159  {
1160  if (i == 0)
1161  {
1162  len = p->settings.rx_buffer_->buffer[pos + size - 1];
1163  }
1164  else
1165  {
1166  len <<= 8;
1167  len |= p->settings.rx_buffer_->buffer[pos + size - 1 - i];
1168  }
1169  }
1170  }
1171 
1172  len += p->settings.rx_framelength_offset_;
1173  return len;
1174 }
1175 
1176 
1178 {
1179  DS_StreamConfig* p = p_stream_config;
1180 
1181  p->settings.is_enabled_ = 0;
1183 
1184  p->settings.tx_frame_ = NULL;
1185  p->settings.tx_frame_size_ = 0;
1187 
1188  p->settings.rx_buffer_ = NULL;
1189  p->settings.rx_header_ = NULL;
1190  p->settings.rx_header_size_ = 0;
1191  p->settings.rx_footer_ = NULL;
1192  p->settings.rx_footer_size_ = 0;
1193  p->settings.rx_frame_size_ = 0;
1194  p->settings.max_rx_frame_size_ = 0xffff;
1195 
1196  p->settings.rx_framelength_pos_ = -1;
1200 
1202  p->settings.time_threshold_for_tlm_disruption_ = 60 * 1000; // この値はよく考えること
1203 
1205 
1206  // DS_StreamSendStatus の初期化
1209 
1210  // DS_StreamRecStatus の初期化
1215 
1216  p->info.general_cmd_tx_count_ = 0;
1217  p->info.req_tlm_cmd_tx_count_ = 0;
1219  p->info.rx_frame_fix_count_ = 0;
1220 
1224 
1226 
1229 
1230  return DS_ERR_CODE_OK;
1231 }
1232 
1233 
1234 static DS_ERR_CODE DS_validate_stream_config_(const DriverSuper* p_super, DS_StreamConfig* p_stream_config)
1235 {
1236  DS_StreamConfig* p = p_stream_config;
1237 
1238  if (!p->settings.is_enabled_) return DS_ERR_CODE_OK;
1239 
1240  if (p->settings.tx_frame_size_ != 0 && p->settings.tx_frame_ == NULL) return DS_ERR_CODE_ERR;
1241  if (p->settings.rx_header_size_ != 0 && p->settings.rx_header_ == NULL) return DS_ERR_CODE_ERR;
1242  if (p->settings.rx_footer_size_ != 0 && p->settings.rx_footer_ == NULL) return DS_ERR_CODE_ERR;
1243 
1244  if (p->settings.tx_frame_buffer_size_ >= 0)
1245  {
1247  }
1248 
1249  if (p->settings.rx_frame_size_ < 0)
1250  {
1251  // テレメトリ可変長
1252  if (p->settings.rx_framelength_pos_ < 0)
1253  {
1254  // フレームサイズデータがない場合
1255  // フッタの存在が必須
1256  if (p->settings.rx_footer_size_ == 0) return DS_ERR_CODE_ERR;
1257  }
1258  else
1259  {
1260  if (p->settings.rx_header_size_ == 0) return DS_ERR_CODE_ERR; // 可変長かつヘッダなしは対応しない(固定長のようにして回避する.詳細はヘッダファイル参照)
1261  if (p->settings.rx_framelength_pos_ < p->settings.rx_header_size_) return DS_ERR_CODE_ERR; // フレームサイズがヘッダ(つまり固定値)に含まれることはありえないので
1262  if (!(p->settings.rx_framelength_type_size_ == 1 ||
1265  p->settings.rx_framelength_type_size_ == 4 )) return DS_ERR_CODE_ERR; // 現在は uint8 to uint32 のみ対応
1268  }
1269  }
1270  else if (p->settings.rx_frame_size_ == 0)
1271  {
1272  // テレメなし
1273  }
1274  else
1275  {
1276  // テレメトリ固定長
1277  if ( p->settings.rx_frame_size_ <
1279  {
1280  return DS_ERR_CODE_ERR;
1281  }
1282  }
1283 
1285  {
1286  // ヘッダがあることが前提
1287  if (p->settings.rx_header_size_ == 0) return DS_ERR_CODE_ERR;
1288  }
1289 
1290  if (p->settings.rx_buffer_ == NULL) return DS_ERR_CODE_ERR;
1291  if (p->settings.rx_buffer_->buffer == NULL) return DS_ERR_CODE_ERR;
1295 
1298 
1299  return DS_ERR_CODE_OK;
1300 }
1301 
1302 
1304 {
1305  (void)p_super;
1306  return DS_ERR_CODE_OK;
1307 }
1308 
1309 static DS_ERR_CODE DS_data_analyzer_dummy_(DS_StreamConfig* p_stream_config, void* p_driver)
1310 {
1311  (void)p_stream_config;
1312  (void)p_driver;
1313  return DS_ERR_CODE_OK;
1314 }
1315 
1316 
1317 // ###### DS_Config Getter/Setter of Settings ######
1319 {
1320  return (uint16_t)p_super->config.settings.rx_buffer_size_in_if_rx_;
1321 }
1322 
1324  const uint16_t rx_buffer_size_in_if_rx)
1325 {
1326  if (rx_buffer_size_in_if_rx > DS_IF_RX_BUFFER_SIZE) return DS_ERR_CODE_ERR;
1327  p_super->config.settings.rx_buffer_size_in_if_rx_ = rx_buffer_size_in_if_rx;
1328  return DS_ERR_CODE_OK;
1329 }
1330 
1332 {
1333  return (uint8_t)p_super->config.settings.should_monitor_for_rx_disruption_;
1334 }
1335 
1337 {
1339 }
1340 
1342 {
1344 }
1345 
1347 {
1348  return (uint32_t)p_super->config.settings.time_threshold_for_rx_disruption_;
1349 }
1350 
1352  const uint32_t time_threshold_for_rx_disruption)
1353 {
1354  p_super->config.settings.time_threshold_for_rx_disruption_ = time_threshold_for_rx_disruption;
1355 }
1356 
1357 
1358 // ###### DS_Config Getter/Setter of Info ######
1359 // FIXME: HEW で Warning が出てしまう(gcc ではでない)ので,キャストしている関数がいくつかある
1361 {
1362  return &p_super->config.info.rec_status_;
1363 }
1364 
1365 uint32_t DSC_get_rx_count(const DriverSuper* p_super)
1366 {
1367  return (uint32_t)p_super->config.info.rx_count_;
1368 }
1369 
1370 uint32_t DSC_get_rx_call_count(const DriverSuper* p_super)
1371 {
1372  return (uint32_t)p_super->config.info.rx_call_count_;
1373 }
1374 
1375 const ObcTime* DSC_get_rx_time(const DriverSuper* p_super)
1376 {
1377  return &p_super->config.info.rx_time_;
1378 }
1379 
1381 {
1383 }
1384 
1385 
1386 // ###### DS_StreamConfig Getter/Setter of Settings ######
1387 // FIXME: HEW で Warning が出てしまう(gcc ではでない)ので,キャストしている関数がいくつかある
1388 uint8_t DSSC_get_is_enabled(const DS_StreamConfig* p_stream_config)
1389 {
1390  return (uint8_t)p_stream_config->settings.is_enabled_;
1391 }
1392 
1393 void DSSC_enable(DS_StreamConfig* p_stream_config)
1394 {
1395  p_stream_config->settings.is_enabled_ = 1;
1396  p_stream_config->internal.is_validation_needed_for_send_ = 1;
1397  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1398 }
1399 
1400 void DSSC_disable(DS_StreamConfig* p_stream_config)
1401 {
1402  p_stream_config->settings.is_enabled_ = 0;
1403 }
1404 
1405 uint8_t DSSC_get_is_strict_frame_search(const DS_StreamConfig* p_stream_config)
1406 {
1407  return (uint8_t)p_stream_config->settings.is_strict_frame_search_;
1408 }
1409 
1411 {
1412  p_stream_config->settings.is_strict_frame_search_ = 1;
1413  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1414 }
1415 
1417 {
1418  p_stream_config->settings.is_strict_frame_search_ = 0;
1419 }
1420 
1421 const uint8_t* DSSC_get_tx_frame(DS_StreamConfig* p_stream_config)
1422 {
1423  return p_stream_config->settings.tx_frame_;
1424 }
1425 
1427 {
1428  return p_stream_config->settings.tx_frame_;
1429 }
1430 
1431 void DSSC_set_tx_frame(DS_StreamConfig* p_stream_config,
1432  uint8_t* tx_frame)
1433 {
1434  p_stream_config->settings.tx_frame_ = tx_frame;
1435  p_stream_config->internal.is_validation_needed_for_send_ = 1;
1436 }
1437 
1438 uint16_t DSSC_get_tx_frame_size(const DS_StreamConfig* p_stream_config)
1439 {
1440  return (uint16_t)p_stream_config->settings.tx_frame_size_;
1441 }
1442 
1444  const uint16_t tx_frame_size)
1445 {
1446  p_stream_config->settings.tx_frame_size_ = tx_frame_size;
1447  p_stream_config->internal.is_validation_needed_for_send_ = 1;
1448 }
1449 
1451 {
1452  return (int16_t)p_stream_config->settings.tx_frame_buffer_size_;
1453 }
1454 
1456  const int16_t tx_frame_buffer_size)
1457 {
1458  p_stream_config->settings.tx_frame_buffer_size_ = tx_frame_buffer_size;
1459  p_stream_config->internal.is_validation_needed_for_send_ = 1;
1460 }
1461 
1462 void DSSC_set_rx_buffer(DS_StreamConfig* p_stream_config,
1463  DS_StreamRecBuffer* rx_buffer)
1464 {
1465  p_stream_config->settings.rx_buffer_ = rx_buffer;
1466  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1467 }
1468 
1469 void DSSC_set_rx_header(DS_StreamConfig* p_stream_config,
1470  const uint8_t* rx_header,
1471  const uint16_t rx_header_size)
1472 {
1473  p_stream_config->settings.rx_header_ = rx_header;
1474  p_stream_config->settings.rx_header_size_ = rx_header_size;
1475  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1476 }
1477 
1478 uint16_t DSSC_get_rx_header_size(const DS_StreamConfig* p_stream_config)
1479 {
1480  return (uint16_t)p_stream_config->settings.rx_header_size_;
1481 }
1482 
1483 void DSSC_set_rx_footer(DS_StreamConfig* p_stream_config,
1484  const uint8_t* rx_footer,
1485  const uint16_t rx_footer_size)
1486 {
1487  p_stream_config->settings.rx_footer_ = rx_footer;
1488  p_stream_config->settings.rx_footer_size_ = rx_footer_size;
1489  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1490 }
1491 
1492 uint16_t DSSC_get_rx_footer_size(const DS_StreamConfig* p_stream_config)
1493 {
1494  return (uint16_t)p_stream_config->settings.rx_footer_size_;
1495 }
1496 
1497 int16_t DSSC_get_rx_frame_size(const DS_StreamConfig* p_stream_config)
1498 {
1499  return (int16_t)p_stream_config->settings.rx_frame_size_;
1500 }
1501 
1503  const int16_t rx_frame_size)
1504 {
1505  p_stream_config->settings.rx_frame_size_ = rx_frame_size;
1506  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1507 }
1508 
1509 uint16_t DSSC_get_max_rx_frame_size(const DS_StreamConfig* p_stream_config)
1510 {
1511  return (uint16_t)p_stream_config->settings.max_rx_frame_size_;
1512 }
1513 
1515  const uint16_t max_rx_frame_size)
1516 {
1517  p_stream_config->settings.max_rx_frame_size_ = max_rx_frame_size;
1518  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1519 }
1520 
1522  const int16_t rx_framelength_pos)
1523 {
1524  p_stream_config->settings.rx_framelength_pos_ = rx_framelength_pos;
1525  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1526 }
1527 
1529  const uint16_t rx_framelength_type_size)
1530 {
1531  p_stream_config->settings.rx_framelength_type_size_ = rx_framelength_type_size;
1532  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1533 }
1534 
1536  const uint16_t rx_framelength_offset)
1537 {
1538  p_stream_config->settings.rx_framelength_offset_ = rx_framelength_offset;
1539  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1540 }
1541 
1543  const ENDIAN_TYPE rx_framelength_endian)
1544 {
1545  p_stream_config->settings.rx_framelength_endian_ = rx_framelength_endian;
1546  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1547 }
1548 
1550 {
1551  return (uint8_t)p_stream_config->settings.should_monitor_for_tlm_disruption_;
1552 }
1553 
1555 {
1556  p_stream_config->settings.should_monitor_for_tlm_disruption_ = 1;
1557  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1558 }
1559 
1561 {
1562  p_stream_config->settings.should_monitor_for_tlm_disruption_ = 0;
1563  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1564 }
1565 
1567 {
1568  return (uint32_t)p_stream_config->settings.time_threshold_for_tlm_disruption_;
1569 }
1570 
1572  const uint32_t time_threshold_for_tlm_disruption)
1573 {
1574  p_stream_config->settings.time_threshold_for_tlm_disruption_ = time_threshold_for_tlm_disruption;
1575  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1576 }
1577 
1579  DS_ERR_CODE (*data_analyzer)(DS_StreamConfig* p_stream_config, void* p_driver))
1580 {
1581  p_stream_config->settings.data_analyzer_ = data_analyzer;
1582  p_stream_config->internal.is_validation_needed_for_rec_ = 1;
1583 }
1584 
1585 
1586 // ###### DS_StreamConfig Getter/Setter of Info ######
1588 {
1589  return &p_stream_config->info.send_status_;
1590 }
1591 
1593 {
1594  return &p_stream_config->info.rec_status_;
1595 }
1596 
1597 uint32_t DSSC_get_general_cmd_tx_count(const DS_StreamConfig* p_stream_config)
1598 {
1599  return (uint32_t)p_stream_config->info.general_cmd_tx_count_;
1600 }
1601 
1602 uint32_t DSSC_get_req_tlm_cmd_tx_count(const DS_StreamConfig* p_stream_config)
1603 {
1604  return (uint32_t)p_stream_config->info.req_tlm_cmd_tx_count_;
1605 }
1606 
1608 {
1609  return (uint32_t)p_stream_config->info.req_tlm_cmd_tx_count_after_last_tx_;
1610 }
1611 
1612 uint32_t DSSC_get_rx_frame_fix_count(const DS_StreamConfig* p_stream_config)
1613 {
1614  return (uint32_t)p_stream_config->info.rx_frame_fix_count_;
1615 }
1616 
1618 {
1619  return &p_stream_config->info.general_cmd_tx_time_;
1620 }
1621 
1623 {
1624  return &p_stream_config->info.req_tlm_cmd_tx_time_;
1625 }
1626 
1628 {
1629  return &p_stream_config->info.rx_frame_fix_time_;
1630 }
1631 
1633 {
1635 }
1636 
1638 {
1639  return (DS_ERR_CODE)p_stream_config->info.ret_from_data_analyzer_;
1640 }
1641 
1642 
1643 // ###### Driver 汎用 Util 関数 ######
1644 
1646  uint8_t* buffer,
1647  const uint16_t buffer_capacity)
1648 {
1649  if (stream_rec_buffer == NULL) return DS_ERR_CODE_ERR;
1650  if (buffer == NULL) return DS_ERR_CODE_ERR;
1651  stream_rec_buffer->buffer = buffer;
1652  stream_rec_buffer->capacity = buffer_capacity;
1653  DS_clear_stream_rec_buffer_(stream_rec_buffer);
1654  return DS_ERR_CODE_OK;
1655 }
1656 
1657 
1659 {
1660  uint8_t stream;
1661  if (rx_buffers == NULL) return;
1662 
1663  for (stream = 0; stream < DS_STREAM_MAX; ++stream)
1664  {
1665  rx_buffers[stream] = NULL;
1666  }
1667 }
1668 
1669 
1671 {
1672  switch (code)
1673  {
1676  // 全てこれでいいのかは,要検討
1677  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)code);
1679  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)code);
1681  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_LENGTH, (uint32_t)code);
1682  default:
1683  // ここに来るのは以下
1684  // DS_DRIVER_ERR_CODE_OK
1685  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)code);
1686  }
1687 }
1688 
1689 
1691 {
1692  switch (code)
1693  {
1695  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)code);
1697  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)code);
1698  case DS_CMD_ILLEGAL_LENGTH:
1699  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_LENGTH, (uint32_t)code);
1700  default:
1701  // ここに来るのは以下の 3 つ
1702  // DS_CMD_OK
1703  // DS_CMD_DRIVER_SUPER_ERR
1704  // DS_CMD_UNKNOWN_ERR
1705  // 下 2 つのエラーは Driver 側の問題で,そちらでエラー情報を持つべき
1706  // ここでは SUCCESS を返す
1707  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)code);
1708  }
1709 }
1710 
1711 
1712 const uint8_t* DSSC_get_rx_frame(const DS_StreamConfig* p_stream_config)
1713 {
1714  DS_StreamRecBuffer* buffer = p_stream_config->settings.rx_buffer_;
1715  return &(buffer->buffer[buffer->pos_of_frame_head_candidate]);
1716 }
1717 
1718 
1719 uint16_t DSSC_get_fixed_rx_frame_size(const DS_StreamConfig* p_stream_config)
1720 {
1721  DS_StreamRecBuffer* buffer = p_stream_config->settings.rx_buffer_;
1722  if (buffer->is_frame_fixed)
1723  {
1724  return buffer->confirmed_frame_len;
1725  }
1726  else
1727  {
1728  return 0;
1729  }
1730 }
1731 
1733 {
1734  if (stream_rec_buffer == NULL) return;
1735  if (stream_rec_buffer->buffer == NULL) return;
1736 
1737  memset(stream_rec_buffer->buffer,
1738  0x00,
1739  stream_rec_buffer->capacity);
1740  stream_rec_buffer->size = 0;
1741  stream_rec_buffer->pos_of_frame_head_candidate = 0;
1742  stream_rec_buffer->confirmed_frame_len = 0;
1743  stream_rec_buffer->is_frame_fixed = 0;
1744  stream_rec_buffer->pos_of_last_rec = 0;
1745 }
1746 
1747 
1749  uint16_t size)
1750 {
1751  int32_t move_size = stream_rec_buffer->size - size;
1752 
1753  if (size == 0) return;
1754 
1755  if (move_size > 0)
1756  {
1757  memmove(&stream_rec_buffer->buffer[0],
1758  &stream_rec_buffer->buffer[size],
1759  move_size);
1760  }
1761 
1762  // データ整合
1763  if (stream_rec_buffer->pos_of_frame_head_candidate < size)
1764  {
1765  stream_rec_buffer->confirmed_frame_len = 0;
1766  }
1767 
1768  if (stream_rec_buffer->size > size)
1769  {
1770  stream_rec_buffer->size -= size;
1771  }
1772  else
1773  {
1774  stream_rec_buffer->size = 0;
1775  }
1776 
1777  if (stream_rec_buffer->pos_of_frame_head_candidate >= size)
1778  {
1779  stream_rec_buffer->pos_of_frame_head_candidate -= size;
1780  }
1781  else
1782  {
1783  stream_rec_buffer->pos_of_frame_head_candidate = 0;
1784  stream_rec_buffer->is_frame_fixed = 0;
1785  }
1786 
1787  if (stream_rec_buffer->pos_of_last_rec > size)
1788  {
1789  stream_rec_buffer->pos_of_last_rec -= size;
1790  }
1791  else
1792  {
1793  stream_rec_buffer->pos_of_last_rec = 0;
1794  }
1795 }
1796 
1797 
1799  const uint8_t* buffer,
1800  uint16_t size)
1801 {
1802  uint16_t rest_size = stream_rec_buffer->capacity - stream_rec_buffer->size;
1803  if (rest_size < size) return DS_ERR_CODE_ERR;
1804 
1805  memcpy(&stream_rec_buffer->buffer[stream_rec_buffer->size],
1806  buffer,
1807  size);
1808  stream_rec_buffer->size += size;
1809 
1810  return DS_ERR_CODE_OK;
1811 }
1812 
1813 
1815 {
1816  int32_t len = stream_rec_buffer->size - stream_rec_buffer->pos_of_frame_head_candidate - stream_rec_buffer->confirmed_frame_len;
1817  if (len < 0) return 0; // まああり得ないが
1818  return (uint16_t)len;
1819 }
1820 
1821 
1823  uint16_t size)
1824 {
1825  stream_rec_buffer->confirmed_frame_len += size;
1826  if (stream_rec_buffer->confirmed_frame_len > stream_rec_buffer->size)
1827  {
1828  stream_rec_buffer->confirmed_frame_len = stream_rec_buffer->size;
1829  }
1830 }
1831 
1832 
1834  uint16_t size)
1835 {
1836  stream_rec_buffer->pos_of_frame_head_candidate += size;
1837  if (stream_rec_buffer->pos_of_frame_head_candidate > stream_rec_buffer->size)
1838  {
1839  stream_rec_buffer->pos_of_frame_head_candidate = stream_rec_buffer->size;
1840  }
1841  // head が動くということは,フレーム探索中ということ
1842  stream_rec_buffer->confirmed_frame_len = 0;
1843 }
1844 
1845 #pragma section
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_LENGTH
コマンド実行時のコマンド引数長エラー
@ 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 を作成
uint16_t DSSC_get_max_rx_frame_size(const DS_StreamConfig *p_stream_config)
void DS_clear_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer)
DS_StreamRecBuffer のクリア
void DSSC_enable_strict_frame_search(DS_StreamConfig *p_stream_config)
uint8_t * DSSC_get_tx_frame_as_non_const_pointer(DS_StreamConfig *p_stream_config)
void DSSC_disable(DS_StreamConfig *p_stream_config)
static DS_ERR_CODE DS_data_analyzer_dummy_(DS_StreamConfig *p_stream_config, void *p_driver)
const uint8_t * DSSC_get_tx_frame(DS_StreamConfig *p_stream_config)
static void DS_analyze_rx_buffer_(DS_StreamConfig *p_stream_config, uint16_t rec_data_len)
受信フレーム解析関数
Definition: driver_super.c:634
DS_ERR_CODE DS_init_stream_rec_buffer(DS_StreamRecBuffer *stream_rec_buffer, uint8_t *buffer, const uint16_t buffer_capacity)
DS_StreamRecBuffer に確保したメモリを与えて初期化する
uint8_t DSSC_get_is_strict_frame_search(const DS_StreamConfig *p_stream_config)
uint32_t DSSC_get_req_tlm_cmd_tx_count_after_last_tx(const DS_StreamConfig *p_stream_config)
static void DS_analyze_rx_buffer_fixed_pickup_(DS_StreamConfig *p_stream_config)
固定長フレーム解析関数(バイト列処理)
Definition: driver_super.c:762
DS_ERR_CODE DS_init(DriverSuper *p_super, void *if_config, DS_StreamRecBuffer *rx_buffer, DS_ERR_CODE(*load_init_setting)(DriverSuper *p_super))
継承先の機器より DriverSuper を初期化する(stream 0 のみの使用の場合)
Definition: driver_super.c:242
void DSSC_set_rx_frame_size(DS_StreamConfig *p_stream_config, const int16_t rx_frame_size)
void DSSC_set_rx_framelength_type_size(DS_StreamConfig *p_stream_config, const uint16_t rx_framelength_type_size)
DS_ERR_CODE DS_push_to_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer, const uint8_t *buffer, uint16_t size)
DS_StreamRecBuffer の追記(後ろへの)
uint32_t DSC_get_rx_count(const DriverSuper *p_super)
void DSC_disable_monitor_for_rx_disruption(DriverSuper *p_super)
uint32_t DSSC_get_general_cmd_tx_count(const DS_StreamConfig *p_stream_config)
uint16_t DS_get_unprocessed_size_from_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer)
DS_StreamRecBuffer の未処理バッファサイズの取得
const DS_StreamSendStatus * DSSC_get_send_status(const DS_StreamConfig *p_stream_config)
static void DS_analyze_rx_buffer_receiving_header_(DS_StreamConfig *p_stream_config)
フレーム解析関数(ヘッダ受信中)
const ObcTime * DSSC_get_req_tlm_cmd_tx_time(const DS_StreamConfig *p_stream_config)
uint32_t DSC_get_time_threshold_for_rx_disruption(const DriverSuper *p_super)
void DSSC_set_rx_framelength_endian(DS_StreamConfig *p_stream_config, const ENDIAN_TYPE rx_framelength_endian)
DS_STREAM_TLM_DISRUPTION_STATUS_CODE DSSC_get_tlm_disruption_status(const DS_StreamConfig *p_stream_config)
uint8_t DSC_get_should_monitor_for_rx_disruption(const DriverSuper *p_super)
void DSSC_set_tx_frame(DS_StreamConfig *p_stream_config, uint8_t *tx_frame)
uint16_t DSC_get_rx_buffer_size_in_if_rx(const DriverSuper *p_super)
uint32_t DSSC_get_req_tlm_cmd_tx_count(const DS_StreamConfig *p_stream_config)
uint8_t DSSC_get_should_monitor_for_tlm_disruption(const DS_StreamConfig *p_stream_config)
DS_ERR_CODE DS_analyze_rec_data(DriverSuper *p_super, uint8_t stream, void *p_driver)
data_analyzer_ を呼び出し,受信データを解析する.
Definition: driver_super.c:486
static void DS_analyze_rx_buffer_prepare_buffer_(DS_StreamConfig *p_stream_config, uint16_t rec_data_len)
解析用受信バッファの準備
Definition: driver_super.c:646
void DSSC_set_time_threshold_for_tlm_disruption(DS_StreamConfig *p_stream_config, const uint32_t time_threshold_for_tlm_disruption)
DS_ERR_CODE DS_validate_config(DriverSuper *p_super)
DriverSuper の設定に不整合が生じていないかチェックする
Definition: driver_super.c:319
const DS_StreamRecStatus * DSSC_get_rec_status(const DS_StreamConfig *p_stream_config)
void DS_confirm_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer, uint16_t size)
DS_StreamRecBuffer で指定サイズだけバッファを確定させる
uint16_t DSSC_get_rx_footer_size(const DS_StreamConfig *p_stream_config)
static int DS_rx_(DriverSuper *p_super)
継承先の機器からの受信データがあるか確認し,受信する
Definition: driver_super.c:589
void DS_drop_from_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer, uint16_t size)
DS_StreamRecBuffer の前方要素の削除
uint32_t DSC_get_rx_call_count(const DriverSuper *p_super)
uint16_t DSSC_get_rx_header_size(const DS_StreamConfig *p_stream_config)
void DS_move_forward_frame_head_candidate_of_stream_rec_buffer_(DS_StreamRecBuffer *stream_rec_buffer, uint16_t size)
DS_StreamRecBuffer で指定サイズだけフレーム開始点を前進させる
static void DS_analyze_rx_buffer_cueing_buffer_(DS_StreamConfig *p_stream_config)
フレーム解析関数後の繰越データの頭出し
Definition: driver_super.c:752
static void DS_analyze_rx_buffer_variable_pickup_with_footer_(DS_StreamConfig *p_stream_config)
可変フレーム解析関数(バイト列処理)
Definition: driver_super.c:915
static void DS_analyze_rx_buffer_finding_header_(DS_StreamConfig *p_stream_config)
フレーム解析関数(ヘッダ探索)
const DS_RecStatus * DSC_get_rec_status(const DriverSuper *p_super)
void DSC_enable_monitor_for_rx_disruption(DriverSuper *p_super)
void DSSC_set_tx_frame_buffer_size(DS_StreamConfig *p_stream_config, const int16_t tx_frame_buffer_size)
void DSSC_set_max_rx_frame_size(DS_StreamConfig *p_stream_config, const uint16_t max_rx_frame_size)
static void DS_analyze_rx_buffer_pickup_(DS_StreamConfig *p_stream_config)
フレーム解析関数
Definition: driver_super.c:686
DS_ERR_CODE DS_reset(DriverSuper *p_super)
DriverSuper のリセット
Definition: driver_super.c:287
static DS_ERR_CODE DS_load_init_setting_dummy_(DriverSuper *p_super)
DS_RX_DISRUPTION_STATUS_CODE DSC_get_rx_disruption_status(const DriverSuper *p_super)
uint32_t DSSC_get_time_threshold_for_tlm_disruption(const DS_StreamConfig *p_stream_config)
static DS_ERR_CODE DS_send_cmd_(DriverSuper *p_super, uint8_t stream)
コマンド送信処理
Definition: driver_super.c:539
CCP_CmdRet DS_conv_cmd_err_to_ccp_cmd_ret(DS_CMD_ERR_CODE code)
DS_CMD_ERR_CODE から CCP_CmdRet への変換関数
void DS_nullify_stream_rec_buffers(DS_StreamRecBuffer *rx_buffers[DS_STREAM_MAX])
DS_StreamRecBuffer の要素数 DS_STREAM_MAX の配列を NULL で初期化する
void DSSC_set_rx_buffer(DS_StreamConfig *p_stream_config, DS_StreamRecBuffer *rx_buffer)
static DS_ERR_CODE DS_reset_stream_config_(DS_StreamConfig *p_stream_config)
DS_StreamConfig 構造体の初期化
DS_ERR_CODE DSSC_get_ret_from_data_analyzer(const DS_StreamConfig *p_stream_config)
uint32_t DSSC_get_rx_frame_fix_count(const DS_StreamConfig *p_stream_config)
const ObcTime * DSSC_get_rx_frame_fix_time(const DS_StreamConfig *p_stream_config)
void DSSC_disable_monitor_for_tlm_disruption(DS_StreamConfig *p_stream_config)
void DSSC_set_rx_framelength_offset(DS_StreamConfig *p_stream_config, const uint16_t rx_framelength_offset)
void DSSC_set_tx_frame_size(DS_StreamConfig *p_stream_config, const uint16_t tx_frame_size)
static uint8_t DS_if_rx_buffer_[DS_IF_RX_BUFFER_SIZE]
IF_RX で受信するときの一次バッファ
Definition: driver_super.c:21
CCP_CmdRet DS_conv_driver_err_to_ccp_cmd_ret(DS_DRIVER_ERR_CODE code)
DS_DRIVER_ERR_CODE から CCP_CmdRet への変換関数
const ObcTime * DSC_get_rx_time(const DriverSuper *p_super)
static int DS_tx_(DriverSuper *p_super, uint8_t stream)
継承先の機器にコマンドを発行する
Definition: driver_super.c:568
int16_t DSSC_get_rx_frame_size(const DS_StreamConfig *p_stream_config)
void DSSC_set_rx_header(DS_StreamConfig *p_stream_config, const uint8_t *rx_header, const uint16_t rx_header_size)
void DSSC_enable_monitor_for_tlm_disruption(DS_StreamConfig *p_stream_config)
static void DS_analyze_rx_buffer_variable_pickup_with_rx_frame_size_(DS_StreamConfig *p_stream_config)
可変フレーム解析関数(バイト列処理)
Definition: driver_super.c:816
static void DS_analyze_rx_buffer_receiving_footer_(DS_StreamConfig *p_stream_config, uint16_t rx_frame_size)
フレーム解析関数(フッタ受信中)
DS_ERR_CODE DS_receive(DriverSuper *p_super)
継承先の機器からテレメトリを受信する
Definition: driver_super.c:355
DS_ERR_CODE DS_clear_rx_buffer(DriverSuper *p_super)
受信バッファをクリアする
Definition: driver_super.c:337
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))
継承先の機器より DriverSuper を初期化する(複数の stream を使用する場合)
Definition: driver_super.c:254
void DSSC_set_data_analyzer(DS_StreamConfig *p_stream_config, DS_ERR_CODE(*data_analyzer)(DS_StreamConfig *p_stream_config, void *p_driver))
DS_ERR_CODE DSC_set_rx_buffer_size_in_if_rx(DriverSuper *p_super, const uint16_t rx_buffer_size_in_if_rx)
const ObcTime * DSSC_get_general_cmd_tx_time(const DS_StreamConfig *p_stream_config)
const uint8_t * DSSC_get_rx_frame(const DS_StreamConfig *p_stream_config)
確定したフレームを取得
void DSSC_disable_strict_frame_search(DS_StreamConfig *p_stream_config)
static DS_ERR_CODE DS_validate_stream_config_(const DriverSuper *p_super, DS_StreamConfig *p_stream_config)
DS_StreamConfig 構造体のバリデーション
uint16_t DSSC_get_tx_frame_size(const DS_StreamConfig *p_stream_config)
int16_t DSSC_get_tx_frame_buffer_size(DS_StreamConfig *p_stream_config)
DS_ERR_CODE DS_send_general_cmd(DriverSuper *p_super, uint8_t stream)
継承先の機器に一般コマンドを発行する
Definition: driver_super.c:496
uint8_t DSSC_get_is_enabled(const DS_StreamConfig *p_stream_config)
void DSSC_enable(DS_StreamConfig *p_stream_config)
void DSSC_set_rx_framelength_pos(DS_StreamConfig *p_stream_config, const int16_t rx_framelength_pos)
DS_ERR_CODE DS_send_req_tlm_cmd(DriverSuper *p_super, uint8_t stream)
継承先の機器にテレメ要求コマンドを発行する
Definition: driver_super.c:517
void DSC_set_time_threshold_for_rx_disruption(DriverSuper *p_super, const uint32_t time_threshold_for_rx_disruption)
uint16_t DSSC_get_fixed_rx_frame_size(const DS_StreamConfig *p_stream_config)
確定したフレームのサイズを取得
static uint32_t DS_analyze_rx_buffer_get_framelength_(DS_StreamConfig *p_stream_config)
フレーム解析中に受信したフレームからフレーム長を取得する関数
void DSSC_set_rx_footer(DS_StreamConfig *p_stream_config, const uint8_t *rx_footer, const uint16_t rx_footer_size)
各制御センサ・アクチュエータ等とのインターフェースドライバ群のスーパークラス
@ DS_STREAM_REC_STATUS_OTHER_ERR
Definition: driver_super.h:187
@ DS_STREAM_REC_STATUS_RX_ERR
IF_RX でエラー
Definition: driver_super.h:185
@ DS_STREAM_REC_STATUS_FOOTER_MISMATCH
Definition: driver_super.h:182
@ DS_STREAM_REC_STATUS_RX_FRAME_TOO_SHORT
Definition: driver_super.h:184
@ DS_STREAM_REC_STATUS_FINDING_HEADER
Definition: driver_super.h:174
@ DS_STREAM_REC_STATUS_RECEIVING_FOOTER
Definition: driver_super.h:178
@ DS_STREAM_REC_STATUS_VALIDATE_ERR
受信前に validate_config でエラー
Definition: driver_super.h:186
@ DS_STREAM_REC_STATUS_HEADER_MISMATCH
Definition: driver_super.h:181
@ DS_STREAM_REC_STATUS_RX_FRAME_TOO_LONG
Definition: driver_super.h:183
@ DS_STREAM_REC_STATUS_RECEIVING_HEADER
Definition: driver_super.h:175
@ DS_STREAM_REC_STATUS_RECEIVING_DATA
Definition: driver_super.h:177
@ DS_STREAM_REC_STATUS_FIXED_FRAME
Definition: driver_super.h:179
@ DS_STREAM_REC_STATUS_RECEIVING_FRAMELENGTH
可変長フレームでの,フレーム長データを受信中
Definition: driver_super.h:176
@ DS_STREAM_REC_STATUS_DISABLE
Definition: driver_super.h:180
DS_STREAM_TLM_DISRUPTION_STATUS_CODE
Definition: driver_super.h:196
@ DS_STREAM_TLM_DISRUPTION_STATUS_LOST
テレメ途絶検出
Definition: driver_super.h:198
@ DS_STREAM_TLM_DISRUPTION_STATUS_OK
テレメ途絶していない or テレメ途絶判定をしない状態
Definition: driver_super.h:197
#define DS_STREAM_MAX
Definition: driver_super.h:31
DS_CMD_ERR_CODE
各DIが Driver にコマンドを送るときに,統一的に使うコード
Definition: driver_super.h:100
@ DS_CMD_ILLEGAL_PARAMETER
CCP_EXEC_ILLEGAL_PARAMETER に対応.ヒーターの個数など,HW 依存部は Driver でみる
Definition: driver_super.h:103
@ DS_CMD_ILLEGAL_LENGTH
CCP_EXEC_ILLEGAL_LENGTH に対応.これは基本的にはDIで見るはずなので,使われないことを想定
Definition: driver_super.h:104
@ DS_CMD_ILLEGAL_CONTEXT
CCP_EXEC_ILLEGAL_CONTEXT に対応.DIでみることも多いはず.HW依存部は Driver でみる
Definition: driver_super.h:102
DS_DRIVER_ERR_CODE
Driver の汎用エラーコード
Definition: driver_super.h:56
@ DS_DRIVER_ERR_CODE_ILLEGAL_PARAMETER
CCP_EXEC_ILLEGAL_PARAMETER に対応
Definition: driver_super.h:59
@ DS_DRIVER_ERR_CODE_ILLEGAL_LENGTH
CCP_EXEC_ILLEGAL_PARAMETER に対応
Definition: driver_super.h:60
@ DS_DRIVER_ERR_CODE_ILLEGAL_CONTEXT
CCP_EXEC_ILLEGAL_CONTEXT に対応
Definition: driver_super.h:58
@ DS_DRIVER_ERR_CODE_UNKNOWN_ERR
UNKNOWN ERR
Definition: driver_super.h:61
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
@ DS_STREAM_SEND_STATUS_VALIDATE_ERR
送信前に validate_config でエラー
Definition: driver_super.h:152
@ DS_STREAM_SEND_STATUS_DISABLE
Definition: driver_super.h:150
@ DS_STREAM_SEND_STATUS_OK
Definition: driver_super.h:149
@ DS_STREAM_SEND_STATUS_TX_ERR
IF_TX でエラー
Definition: driver_super.h:151
DS_RX_DISRUPTION_STATUS_CODE
受信途絶判定コード
Definition: driver_super.h:127
@ DS_RX_DISRUPTION_STATUS_LOST
受信途絶検出
Definition: driver_super.h:129
@ DS_RX_DISRUPTION_STATUS_OK
受信途絶していない or 受信途絶判定をしない状態
Definition: driver_super.h:128
#define DS_IF_RX_BUFFER_SIZE
Definition: driver_super.h:33
ENDIAN_TYPE
エンディアンを定義するため
Definition: endian.h:16
@ ENDIAN_TYPE_BIG
big-endian
Definition: endian.h:17
@ ENDIAN_TYPE_LITTLE
little-endian
Definition: endian.h:18
int(* IF_RX[])(void *my_if, void *data_v, int buffer_size)
Definition: if_list.c:8
int(* IF_init[])(void *my_if)
Definition: if_list.c:6
int(* IF_TX[])(void *my_if, void *data_v, int data_size)
Definition: if_list.c:10
@ IF_LIST_MAX
Definition: if_list.h:12
void * memchr(const void *buf, int c, size_t n)
Definition: memchr.c:10
uint32_t OBCT_diff_in_msec(const ObcTime *before, const ObcTime *after)
ObcTime の引き算をミリ秒単位で行う
Definition: obc_time.c:153
void Printf(const char *format,...)
Definition: print.c:9
コマンド返り値
DS_ERR_CODE(* load_init_setting)(DriverSuper *p_super)
Definition: driver_super.h:268
uint8_t should_monitor_for_rx_disruption_
Definition: driver_super.h:250
ObcTime rx_time_
なにかしらのデータの受信時刻
Definition: driver_super.h:263
struct DS_Config::@4 internal
内部処理用
uint32_t time_threshold_for_rx_disruption_
Definition: driver_super.h:252
DS_RecStatus rec_status_
IF受信状況
Definition: driver_super.h:258
uint32_t rx_count_
なにかしらのデータの受信回数
Definition: driver_super.h:260
uint32_t rx_call_count_
DS_receive 呼び出し回数
Definition: driver_super.h:261
struct DS_Config::@3 info
取得値(メトリクス)
uint16_t rx_buffer_size_in_if_rx_
Definition: driver_super.h:243
struct DS_Config::@2 settings
設定値
IF 受信状況
Definition: driver_super.h:137
DS_RX_DISRUPTION_STATUS_CODE rx_disruption_status
受信途絶判定
Definition: driver_super.h:139
int ret_from_if_rx
IF_RX の返り値
Definition: driver_super.h:138
DriverSuperStream の設定
Definition: driver_super.h:281
uint8_t is_validation_needed_for_rec_
受信前に設定値の Validation が必要か?
Definition: driver_super.h:396
uint32_t req_tlm_cmd_tx_count_
テレメ要求コマンド送信回数
Definition: driver_super.h:381
uint16_t rx_framelength_type_size_
Definition: driver_super.h:348
struct DS_StreamConfig::@7 internal
内部処理用
struct DS_StreamConfig::@6 info
取得値(メトリクス)
uint8_t should_monitor_for_tlm_disruption_
Definition: driver_super.h:363
DS_StreamRecBuffer * rx_buffer_
Definition: driver_super.h:312
int16_t rx_framelength_pos_
Definition: driver_super.h:338
uint32_t general_cmd_tx_count_
通常コマンド送信回数
Definition: driver_super.h:380
DS_ERR_CODE ret_from_data_analyzer_
data_analyzer_ の返り値
Definition: driver_super.h:390
int16_t rx_frame_size_
Definition: driver_super.h:329
uint16_t rx_framelength_offset_
Definition: driver_super.h:352
int16_t tx_frame_buffer_size_
Definition: driver_super.h:306
DS_StreamSendStatus send_status_
フレーム送信状況
Definition: driver_super.h:377
uint8_t is_enabled_
Definition: driver_super.h:284
const uint8_t * rx_footer_
Definition: driver_super.h:324
DS_StreamRecStatus rec_status_
フレーム受信状況
Definition: driver_super.h:378
ObcTime req_tlm_cmd_tx_time_
テレメ要求コマンド最終送信時刻
Definition: driver_super.h:387
uint16_t rx_footer_size_
Definition: driver_super.h:326
ObcTime general_cmd_tx_time_
通常コマンド最終送信時刻
Definition: driver_super.h:386
uint8_t * tx_frame_
Definition: driver_super.h:299
uint16_t tx_frame_size_
Definition: driver_super.h:302
uint8_t is_validation_needed_for_send_
送信前に設定値の Validation が必要か?
Definition: driver_super.h:395
DS_ERR_CODE(* data_analyzer_)(DS_StreamConfig *p_stream_config, void *p_driver)
Definition: driver_super.h:368
const uint8_t * rx_header_
Definition: driver_super.h:315
ENDIAN_TYPE rx_framelength_endian_
Definition: driver_super.h:359
uint16_t max_rx_frame_size_
Definition: driver_super.h:333
uint32_t req_tlm_cmd_tx_count_after_last_tx_
Definition: driver_super.h:382
ObcTime rx_frame_fix_time_
フレーム確定時刻
Definition: driver_super.h:388
uint32_t time_threshold_for_tlm_disruption_
Definition: driver_super.h:365
struct DS_StreamConfig::@5 settings
設定値
uint16_t rx_header_size_
Definition: driver_super.h:317
uint8_t is_strict_frame_search_
Definition: driver_super.h:287
uint32_t rx_frame_fix_count_
フレーム受信確定回数
Definition: driver_super.h:384
フレーム受信バッファ
Definition: driver_super.h:222
uint8_t * buffer
バッファ本体となる uint8_t 配列.外部から与える
Definition: driver_super.h:223
uint16_t pos_of_frame_head_candidate
フレーム開始点の候補
Definition: driver_super.h:226
uint16_t pos_of_last_rec
最後に受信したデータを格納した位置
Definition: driver_super.h:229
uint16_t confirmed_frame_len
受信フレームとして受理された pos_of_frame_head_candidate からの長さ(フレーム確定後,これがフレーム長になる)
Definition: driver_super.h:227
uint16_t capacity
buffer のメモリ確保量
Definition: driver_super.h:224
uint8_t is_frame_fixed
このバッファ上でフレームが確定してるか?
Definition: driver_super.h:228
uint16_t size
現在使われているサイズ
Definition: driver_super.h:225
フレーム受信状況
Definition: driver_super.h:206
DS_STREAM_REC_STATUS_CODE status_code
status
Definition: driver_super.h:207
uint32_t count_of_carry_over_failures
Definition: driver_super.h:210
uint16_t fixed_frame_len
フレーム確定したときのフレーム長さ
Definition: driver_super.h:208
DS_STREAM_TLM_DISRUPTION_STATUS_CODE tlm_disruption_status
テレメ途絶判定
Definition: driver_super.h:209
フレーム送信状況
Definition: driver_super.h:161
int ret_from_if_tx
IF_TX の返り値
Definition: driver_super.h:163
DS_STREAM_SEND_STATUS_CODE status_code
status
Definition: driver_super.h:162
DriverSuper の設定 各 IF はこれを継承してつかう.
Definition: driver_super.h:407
IF_LIST_ENUM interface
継承先の機器の使用 IF
Definition: driver_super.h:409
DS_StreamConfig stream_config[DS_STREAM_MAX]
Definition: driver_super.h:414
DS_Config config
DriverSuper の設定
Definition: driver_super.h:412
void * if_config
IF 設定
Definition: driver_super.h:410
OBCの時刻情報を保持する構造体
Definition: obc_time.h:18
ObcTime TMGR_get_master_clock(void)
現在の master_clock_ を取得する
Definition: time_manager.c:80