C2A_Core
time_manager.c
[詳解]
1 #pragma section REPRO
6 #include "time_manager.h"
7 #include "obc_time_config.h"
8 #include <string.h>
9 #include "../../Library/c2a_round.h"
10 #include "../TaskManager/task_dispatcher.h"
11 #include "../../TlmCmd/common_cmd_packet_util.h"
12 
15 
22 
28 static TMGR_ACK TMGR_set_utl_unixtime_epoch_(double utl_unixtime_epoch);
29 
35 static TMGR_ACK TMGR_set_cycle_correction_(double cycle_correction);
36 
43 
44 void TMGR_init(void)
45 {
48  TMGR_clear();
49 }
50 
51 void TMGR_clear(void)
52 {
55 }
56 
58 {
60 }
61 
62 #pragma section _FIX_TMGR
63 // Pセクションしか割り当てていないので,
64 // D, Bセクションに乗るような変数定義は禁止!!!
66 {
68 }
69 #pragma section
70 #pragma section REPRO
71 
73 {
76 
77  TMGR_clear();
78 }
79 
81 {
83  {
84  return OBCT_create(0, 0, 0);
85  }
86  else
87  {
89  }
90 }
91 
93 {
95 }
96 
99 }
100 
103 }
104 
107 }
108 
110 {
112 }
113 
115 {
117 }
118 
120 {
121  if (total_cycle >= OBCT_MAX_CYCLE) return TMGR_ACK_PARAM_ERR;
122 
125  return TMGR_ACK_OK;
126 }
127 
129 {
134 }
135 
136 TMGR_ACK TMGR_update_unixtime(const double unixtime, const ObcTime* time)
137 {
138  double ti_sec = TMGR_get_precise_ti_in_sec(time);
139 
140  // unixtime が ti より小さいと困る
141  if (unixtime < ti_sec) return TMGR_ACK_PARAM_ERR;
142 
143  time_manager_.unixtime_info_.unixtime_at_ti0 = unixtime - ti_sec;
145  return TMGR_ACK_OK;
146 }
147 
149 {
151 }
152 
154 {
156 }
157 
159 {
161 }
162 
164 {
165  double cycle = time->total_cycle + (double)time->step / OBCT_STEPS_PER_CYCLE;
166  return cycle / TMGR_get_precise_cycles_per_sec();
167 }
168 
170 {
172 }
173 
175 {
177 }
178 
180 {
181  return TMGR_get_utl_unixtime_epoch() + (double)utl_unixtime / OBCT_CYCLES_PER_SEC;
182 }
183 
184 double TMGR_get_precise_ti_from_unixtime(const double unixtime)
185 {
186  double ti = (unixtime - TMGR_get_unixtime_at_ti0()) * TMGR_get_precise_cycles_per_sec();
187 
188  // unixtime_at_ti0 より小さい引数は無効なのでゼロを返す
189  if (ti < 0) return 0;
190 
191  return ti;
192 }
193 
195 {
196  double diff_in_cycle = TMGR_get_precise_ti_from_unixtime(unixtime);
197  cycle_t cycle;
198  step_t step;
199  ObcTime res;
200 
201  cycle = (cycle_t)diff_in_cycle; // cycle未満は切り捨て
202  step = (step_t)((diff_in_cycle - cycle) * OBCT_STEPS_PER_CYCLE); // step未満は切り捨て
203 
204  res.total_cycle = cycle;
205  res.mode_cycle = 0; // 取得出来ないので0とする
206  res.step = step;
207 
208  return res;
209 }
210 
212 {
213  double unixtime = TMGR_get_unixtime_from_utl_unixtime(utl_unixtime);
214  double ti = TMGR_get_precise_ti_from_unixtime(unixtime);
215 
216  return (cycle_t)c2a_round(ti);
217 }
218 
219 static TMGR_ACK TMGR_set_utl_unixtime_epoch_(double utl_unixtime_epoch)
220 {
221  if (utl_unixtime_epoch < 0) return TMGR_ACK_PARAM_ERR;
222 
223  time_manager_.unixtime_info_.utl_unixtime_epoch = utl_unixtime_epoch;
224  return TMGR_ACK_OK;
225 }
226 
227 static TMGR_ACK TMGR_set_cycle_correction_(double cycle_correction)
228 {
229  // 比なので、負数はおかしい
230  if (cycle_correction <= 0) return TMGR_ACK_PARAM_ERR;
231 
232  time_manager_.unixtime_info_.cycle_correction = cycle_correction;
233  return TMGR_ACK_OK;
234 }
235 
237 {
238  switch (ack)
239  {
240  case TMGR_ACK_OK:
241  return CCP_make_cmd_ret(CCP_EXEC_SUCCESS, (uint32_t)ack);
242  case TMGR_ACK_PARAM_ERR:
243  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_PARAMETER, (uint32_t)ack);
244  default:
245  return CCP_make_cmd_ret(CCP_EXEC_ILLEGAL_CONTEXT, (uint32_t)ack);
246  }
247 }
248 
250 {
251  cycle_t set_value = CCP_get_param_from_packet(packet, 0, cycle_t);
252  TMGR_ACK ack = TMGR_set_master_total_cycle_(set_value);
253 
255 }
256 
258 {
259  ObcTime time;
260  double unixtime = CCP_get_param_from_packet(packet, 0, double);
261  cycle_t total_cycle = CCP_get_param_from_packet(packet, 1, cycle_t);
262  step_t step = CCP_get_param_from_packet(packet, 2, cycle_t);
263  TMGR_ACK ack;
264 
268 
269  time.total_cycle = total_cycle;
270  time.step = step;
271  time.mode_cycle = 0; // 必要ないので0とする
272 
273  ack = TMGR_update_unixtime(unixtime, &time);
274 
276 }
277 
279 {
280  double utl_unixtime_epoch = CCP_get_param_from_packet(packet, 0, double);
281  TMGR_ACK ack = TMGR_set_utl_unixtime_epoch_(utl_unixtime_epoch);
282 
284 }
285 
287 {
288  double cycle_correction = CCP_get_param_from_packet(packet, 0, double);
289  TMGR_ACK ack = TMGR_set_cycle_correction_(cycle_correction);
290 
292 }
293 
295 {
296  (void)packet;
298 
300 }
301 
303 {
304  (void)packet;
306 
308 }
309 
310 #pragma section
int c2a_round(double input)
Definition: c2a_round.c:9
@ 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 を作成(エラーコード不使用版)
#define CCP_get_param_from_packet(packet, n, type)
CCP packet から,n番目のコマンド引数を取得する
void OBCT_count_up(ObcTime *time)
ObcTimeをstep刻みでインクリメントする
Definition: obc_time.c:30
step_t OBCT_get_step(const ObcTime *time)
引数で指定した ObcTime の step を返す
Definition: obc_time.c:69
ObcTime OBCT_add(const ObcTime *left, const ObcTime *right)
ObcTime の足し算を行う
Definition: obc_time.c:166
ObcTime OBCT_create(cycle_t total_cycle, cycle_t mode_cycle, step_t step)
引数から ObcTime を作成する
Definition: obc_time.c:10
cycle_t OBCT_get_total_cycle(const ObcTime *time)
引数で指定した ObcTime の total_cycle を返す
Definition: obc_time.c:59
cycle_t OBCT_get_mode_cycle(const ObcTime *time)
引数で指定した ObcTime の mode_cycle を返す
Definition: obc_time.c:64
uint32_t OBCT_get_mode_cycle_in_msec(const ObcTime *time)
引数で指定した ObcTime の mode_cycle をミリ秒単位で返す
Definition: obc_time.c:79
void OBCT_clear(ObcTime *time)
ObcTime をクリアし全てゼロにする
Definition: obc_time.c:23
uint32_t OBCT_get_total_cycle_in_msec(const ObcTime *time)
引数で指定した ObcTime の total_cycle をミリ秒単位で返す
Definition: obc_time.c:74
uint32_t step_t
Definition: obc_time.h:11
uint32_t cycle_t
Definition: obc_time.h:10
#define OBCT_MAX_CYCLE
最大 cycle 数.つまり TI がいくつでオーバーフローするか
#define OBCT_CYCLES_PER_SEC
1 s で何 cycle か
#define OBCT_STEPS_PER_CYCLE
何 step で 1 cycle か
コマンド返り値
Space Packet (コマンド用)
OBCの時刻情報を保持する構造体
Definition: obc_time.h:18
cycle_t total_cycle
TI のこと. OBC が起動してから(正確には,構造体が初期化されてから)の経過時間
Definition: obc_time.h:19
cycle_t mode_cycle
最後に mode を変えてからの経過時間
Definition: obc_time.h:20
step_t step
内部 step. TimeLine での処理時間分割に使われる
Definition: obc_time.h:21
master_clock_ で OBC 時刻情報を保持するとともに, unixtime との紐づけや初期化情報の記録を行う
Definition: time_manager.h:30
uint8_t initializing_flag
Definition: time_manager.h:46
cycle_t ti_at_last_update
"unixtime_info_ を最後に更新した (GPSなどの) 時刻情報" を観測した時点の total_cycle
Definition: time_manager.h:35
double unixtime_at_ti0
master_clock が {0, 0, 0} の時の unixtime
Definition: time_manager.h:34
ObcTime initializing_time
Definition: time_manager.h:45
struct TimeManager::@15 unixtime_info_
double utl_unixtime_epoch
Definition: time_manager.h:36
struct TimeManager::@16 init_info_
double cycle_correction
Definition: time_manager.h:39
ObcTime master_clock_
Definition: time_manager.h:31
void TDSP_resync_internal_counter(void)
タスクリストの展開時サイクル数を現在のサイクル数に強制的に合わせる
static CCP_CmdRet TMGR_conv_tmgr_ack_to_ccp_cmd_ret_(TMGR_ACK ack)
enum 変換用関数
Definition: time_manager.c:236
double TMGR_get_utl_unixtime_epoch(void)
utl_unixtime_epoch を取得する
Definition: time_manager.c:153
double TMGR_get_precise_ti_from_unixtime(const double unixtime)
unixtime を TI (cycle単位) に変換する
Definition: time_manager.c:184
static TMGR_ACK TMGR_set_master_total_cycle_(cycle_t total_cycle)
TI (master_clock_.total_cycle) の setter
Definition: time_manager.c:119
TMGR_ACK TMGR_update_unixtime(const double unixtime, const ObcTime *time)
unixtime と TI の紐づき情報を更新する
Definition: time_manager.c:136
uint32_t TMGR_get_master_total_cycle_in_msec(void)
現在の total_cycle をミリ秒単位で返す
Definition: time_manager.c:109
double TMGR_get_unixtime_at_ti0(void)
unixtime_at_ti0 を取得する
Definition: time_manager.c:148
CCP_CmdRet Cmd_TMGR_CLEAR_UNIXTIME_INFO(const CommonCmdPacket *packet)
Definition: time_manager.c:302
const TimeManager *const time_manager
Definition: time_manager.c:14
CCP_CmdRet Cmd_TMGR_SET_CYCLE_CORRECTION(const CommonCmdPacket *packet)
Definition: time_manager.c:286
uint32_t TMGR_get_master_mode_cycle_in_msec(void)
現在の mode_cycle をミリ秒単位で返す
Definition: time_manager.c:114
static TMGR_ACK TMGR_set_utl_unixtime_epoch_(double utl_unixtime_epoch)
time_manager_.unixtime_info_.utl_unixtime_epoch の setter
Definition: time_manager.c:219
static TimeManager time_manager_
Definition: time_manager.c:13
cycle_t TMGR_get_master_mode_cycle(void)
現在の mode_cycle を返す
Definition: time_manager.c:101
void TMGR_init(void)
TimeManager 構造体を初期化する
Definition: time_manager.c:44
double TMGR_get_precise_cycles_per_sec(void)
OBC のクロック誤差を反映した cycles_per_sec を返す
Definition: time_manager.c:158
void TMGR_count_up_master_clock(void)
master_clock_ をstep刻みでインクリメントする
Definition: time_manager.c:65
cycle_t TMGR_get_master_total_cycle(void)
現在の total_cycle を返す
Definition: time_manager.c:97
ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime)
unixtime を ObcTime に変換する
Definition: time_manager.c:194
void TMGR_down_initializing_flag(void)
C2Aの初期化終了時に呼び出し, 初期化flagを下げ, TMGRをもう一度クリアする
Definition: time_manager.c:72
CCP_CmdRet Cmd_TMGR_UPDATE_UNIXTIME(const CommonCmdPacket *packet)
Definition: time_manager.c:257
CCP_CmdRet Cmd_TMGR_SET_TIME(const CommonCmdPacket *packet)
Definition: time_manager.c:249
CCP_CmdRet Cmd_TMGR_SET_UTL_UNIXTIME_EPOCH(const CommonCmdPacket *packet)
Definition: time_manager.c:278
void TMGR_clear(void)
master_clock_ と unixtime_info_ をクリアし全てゼロにする
Definition: time_manager.c:51
double TMGR_get_unixtime_from_obc_time(const ObcTime *time)
ObcTime を unixtime に変換する
Definition: time_manager.c:174
ObcTime TMGR_get_master_clock(void)
現在の master_clock_ を取得する
Definition: time_manager.c:80
double TMGR_get_unixtime_from_utl_unixtime(const cycle_t utl_unixtime)
UTL_cmdで用いる utl_unixtime を 一般的なunixtimeに変換する
Definition: time_manager.c:179
void TMGR_clear_master_mode_cycle(void)
master_clock_ の mode_cycle をゼロにする
Definition: time_manager.c:57
ObcTime TMGR_get_master_clock_from_boot(void)
初期化にかかった時間も加算した master_clock_ を返す
Definition: time_manager.c:92
void TMGR_clear_unixtime_info(void)
unixtime_info_ を初期化する
Definition: time_manager.c:128
CCP_CmdRet Cmd_TMGR_RESET_CYCLE_CORRECTION(const CommonCmdPacket *packet)
Definition: time_manager.c:294
step_t TMGR_get_master_step(void)
現在の step を返す
Definition: time_manager.c:105
cycle_t TMGR_get_ti_from_utl_unixtime(const cycle_t utl_unixtime)
引数で指定された utl_unixtime に対応する TI を返す
Definition: time_manager.c:211
static TMGR_ACK TMGR_set_cycle_correction_(double cycle_correction)
time_manager_.unixtime_info_.cycle_correction の setter
Definition: time_manager.c:227
double TMGR_get_precise_ti_in_sec(const ObcTime *time)
OBC のクロック誤差を反映した正確な ti を秒単位で返す
Definition: time_manager.c:163
double TMGR_get_current_unixtime(void)
現在の unixtime を OBC の ti をもとに計算して返す
Definition: time_manager.c:169
OBC時刻のカウントアップと,各種衛星時刻関連処理
#define TMGR_DEFAULT_UNIXTIME_EPOCH_FOR_UTL
Definition: time_manager.h:11
TMGR_ACK
Time Manager の汎用返り値
Definition: time_manager.h:20
@ TMGR_ACK_PARAM_ERR
パラメタエラー
Definition: time_manager.h:22
@ TMGR_ACK_OK
正常終了
Definition: time_manager.h:21