C2A_Core
telemetry_frame.c
[詳解]
1 #pragma section REPRO
6 #include "telemetry_frame.h"
7 
8 #include <stdint.h>
9 #include "../Library/print.h"
10 #include "../Library/endian.h"
12 
13 static void initialize_tlm_table_(void);
14 
17 
18 
20  uint8_t* packet,
21  uint16_t* len,
22  uint16_t max_len)
23 {
24  TF_TLM_FUNC_ACK (*tlm_func)(uint8_t*, uint16_t*, uint16_t) = telemetry_frame->tlm_table[tlm_id].tlm_func;
25 
26  if (tlm_func != NULL)
27  {
28  return tlm_func(packet, len, max_len);
29  }
30  else
31  {
33  }
34 }
35 
36 void TF_initialize(void)
37 {
38  // tlm_table_を初期化
40 
42  {
43  Printf("TF: init error!!!\n");
44  return;
45  }
46 
48 }
49 
50 static void initialize_tlm_table_(void)
51 {
52  int i;
53  for (i = 0; i < TF_MAX_TLMS; ++i)
54  {
56  }
57 
58  // ページ番号の初期値は0に設定
60 }
61 
62 void TF_copy_u8(uint8_t* ptr, uint8_t data)
63 {
64  ptr[0] = data;
65 }
66 
67 void TF_copy_u16(uint8_t* ptr, uint16_t data)
68 {
69  ENDIAN_memcpy(ptr, &data, 2);
70 }
71 
72 void TF_copy_u32(uint8_t* ptr, uint32_t data)
73 {
74  ENDIAN_memcpy(ptr, &data, 4);
75 }
76 
77 void TF_copy_i8(uint8_t* ptr, int8_t data)
78 {
79  ptr[0] = (uint8_t)data;
80 }
81 
82 void TF_copy_i16(uint8_t* ptr, int16_t data)
83 {
84  ENDIAN_memcpy(ptr, &data, 2);
85 }
86 
87 void TF_copy_i32(uint8_t* ptr, int32_t data)
88 {
89  ENDIAN_memcpy(ptr, &data, 4);
90 }
91 
92 void TF_copy_float(uint8_t* ptr, float data)
93 {
94  ENDIAN_memcpy(ptr, &data, sizeof(float));
95 }
96 
97 void TF_copy_double(uint8_t* ptr, double data)
98 {
99  ENDIAN_memcpy(ptr, &data, sizeof(double));
100 }
101 
103 {
104  (void)packet;
105  TF_initialize();
107 }
108 
110 {
111  TLM_CODE tlm_id = (TLM_CODE)CCP_get_param_from_packet(packet, 0, uint8_t);
112  uint32_t tlm_func = CCP_get_param_from_packet(packet, 1, uint32_t);
113 
114  if (tlm_id >= TF_MAX_TLMS)
115  {
116  // 登録指定位置がテレメトリ数上限を超えている場合は異常判定
118  }
119 
120  telemetry_frame_.tlm_table[tlm_id].tlm_func = (TF_TLM_FUNC_ACK (*)(uint8_t*, uint16_t*, uint16_t))tlm_func;
122 }
123 
125 {
126  uint8_t page = CCP_get_param_from_packet(packet, 0, uint8_t);
127 
128  if (page >= TF_TLM_PAGE_MAX)
129  {
130  // ページ番号がコマンドテーブル範囲外
132  }
133 
136 }
137 
138 #pragma section
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
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 * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
void Printf(const char *format,...)
Definition: print.c:9
C89 環境用 stdint.h
コマンド返り値
Space Packet (コマンド用)
TF_TLM_FUNC_ACK(* tlm_func)(uint8_t *, uint16_t *, uint16_t)
tlm packet の中身を生成する関数
TelemetryFrame の Info 構造体
TF_TlmInfo tlm_table[TF_MAX_TLMS]
テレメトリテーブル
uint8_t tlm_page_no
テレメで使うページ数
@ TLM_CODE_MAX
void TF_copy_i16(uint8_t *ptr, int16_t data)
void TF_copy_u8(uint8_t *ptr, uint8_t data)
void TF_copy_u32(uint8_t *ptr, uint32_t data)
void TF_copy_double(uint8_t *ptr, double data)
CCP_CmdRet Cmd_TF_INIT(const CommonCmdPacket *packet)
TF_TLM_FUNC_ACK TF_generate_contents(TLM_CODE tlm_id, uint8_t *packet, uint16_t *len, uint16_t max_len)
テレメを実際に生成する関数
CCP_CmdRet Cmd_TF_SET_PAGE_FOR_TLM(const CommonCmdPacket *packet)
void TF_initialize(void)
TF の初期化
void TF_copy_u16(uint8_t *ptr, uint16_t data)
CCP_CmdRet Cmd_TF_REGISTER_TLM(const CommonCmdPacket *packet)
static void initialize_tlm_table_(void)
void TF_copy_i8(uint8_t *ptr, int8_t data)
void TF_copy_float(uint8_t *ptr, float data)
const TelemetryFrame *const telemetry_frame
void TF_copy_i32(uint8_t *ptr, int32_t data)
static TelemetryFrame telemetry_frame_
テレメトリの登録,テレメトリ関連処理
#define TF_TLM_PAGE_MAX
テレメテーブルページ数(ページネーション用)
#define TF_MAX_TLMS
テレメテーブルサイズ.すなわち登録できる最大テレメ数
void TF_load_tlm_table(TF_TlmInfo tlm_table[TF_MAX_TLMS])
Tlm Tableのロード
TF_TLM_FUNC_ACK
tlm_func の返り値につかう
@ TF_TLM_FUNC_ACK_NOT_DEFINED
定義されてないテレメ