C2A_Core
obc_time.c
[詳解]
1 #pragma section REPRO
6 #include "obc_time.h"
7 #include "obc_time_config.h"
8 #include "../../Library/print.h"
9 
11  cycle_t mode_cycle,
12  step_t step)
13 {
14  ObcTime time;
15 
16  time.total_cycle = total_cycle;
17  time.mode_cycle = mode_cycle;
18  time.step = step;
19 
20  return time;
21 }
22 
23 void OBCT_clear(ObcTime* time)
24 {
25  time->total_cycle = 0;
26  time->mode_cycle = 0;
27  time->step = 0;
28 }
29 
31 {
32  ++(time->step);
33 
34  if (time->step == OBCT_STEPS_PER_CYCLE)
35  {
36  ++(time->total_cycle);
37 
38  if (time->total_cycle == OBCT_MAX_CYCLE)
39  {
40  time->total_cycle = 0;
41  }
42 
43  ++(time->mode_cycle);
44 
45  if (time->mode_cycle == OBCT_MAX_CYCLE)
46  {
47  time->mode_cycle = 0;
48  }
49 
50  time->step = 0;
51  }
52 }
53 
55 {
57 }
58 
60 {
61  return (cycle_t)time->total_cycle;
62 }
63 
65 {
66  return (cycle_t)time->mode_cycle;
67 }
68 
70 {
71  return (step_t)time->step;
72 }
73 
75 {
76  return OBCT_STEP_IN_MSEC * (OBCT_STEPS_PER_CYCLE * time->total_cycle + time->step);
77 }
78 
79 uint32_t OBCT_get_mode_cycle_in_msec(const ObcTime* time)
80 {
81  return OBCT_STEP_IN_MSEC * (OBCT_STEPS_PER_CYCLE * time->mode_cycle + time->step);
82 }
83 
85 {
86  double cycle_in_sec = (double)(time->total_cycle) / OBCT_CYCLES_PER_SEC;
87  double step_in_sec = 0.001 * time->step * OBCT_STEP_IN_MSEC;
88  return cycle_in_sec + step_in_sec;
89 }
90 
92 {
93  double cycle_in_sec = (double)(time->mode_cycle) / OBCT_CYCLES_PER_SEC;
94  double step_in_sec = 0.001 * time->step * OBCT_STEP_IN_MSEC;
95  return cycle_in_sec + step_in_sec;
96 }
97 
98 cycle_t OBCT_msec2cycle(uint32_t msec)
99 {
100  return (msec) / (OBCT_STEP_IN_MSEC * OBCT_STEPS_PER_CYCLE);
101 }
102 
103 uint32_t OBCT_cycle2msec(cycle_t cycle) {
104  return (OBCT_STEP_IN_MSEC * OBCT_STEPS_PER_CYCLE * cycle);
105 }
106 
107 cycle_t OBCT_sec2cycle(uint32_t sec)
108 {
109  return (1000 * sec) / (OBCT_STEP_IN_MSEC * OBCT_STEPS_PER_CYCLE);
110 }
111 
112 uint32_t OBCT_cycle2sec(cycle_t cycle) {
113  return (OBCT_STEP_IN_MSEC * OBCT_STEPS_PER_CYCLE * cycle) / 1000;
114 }
115 
116 ObcTime OBCT_diff(const ObcTime* before,
117  const ObcTime* after)
118 {
119  ObcTime diff;
120 
121  if (OBCT_compare(after, before) == 1)
122  {
123  return OBCT_create(0, 0, 0); // after < before の場合は結果がマイナスになってしまうため
124  }
125 
126  // まずcycleの差分を計算
127  diff.total_cycle = after->total_cycle - before->total_cycle;
128  diff.mode_cycle = after->mode_cycle - before->mode_cycle;
129 
130  // stepのみで差分を考えればよい場合
131  if (after->step >= before->step)
132  {
133  diff.step = after->step - before->step;
134  }
135  // cycleからの桁借りが必要な場合
136  else
137  {
138  diff.step = OBCT_STEPS_PER_CYCLE - before->step + after->step;
139  --diff.total_cycle;
140  --diff.mode_cycle;
141  }
142 
143  return diff;
144 }
145 
147  const ObcTime* after)
148 {
149  ObcTime diff = OBCT_diff(before, after);
150  return OBCT_STEPS_PER_CYCLE * diff.total_cycle + diff.step;
151 }
152 
153 uint32_t OBCT_diff_in_msec(const ObcTime* before,
154  const ObcTime* after)
155 {
156  return OBCT_STEP_IN_MSEC * OBCT_diff_in_step(before, after);
157 }
158 
159 double OBCT_diff_in_sec(const ObcTime* before,
160  const ObcTime* after)
161 {
162  ObcTime diff = OBCT_diff(before, after);
163  return OBCT_get_total_cycle_in_sec(&diff);
164 }
165 
166 ObcTime OBCT_add(const ObcTime* left, const ObcTime* right)
167 {
168  ObcTime ret;
169 
170  ret.total_cycle = left->total_cycle + right->total_cycle;
171  ret.mode_cycle = left->mode_cycle + right->mode_cycle;
172  ret.step = left->step + right->step;
173 
175  ret.mode_cycle += ret.step / OBCT_STEPS_PER_CYCLE;
176  ret.step %= OBCT_STEPS_PER_CYCLE;
177 
178  return ret;
179 }
180 
181 int OBCT_compare(const ObcTime* t1, const ObcTime* t2)
182 {
183  if (t1->total_cycle == t2->total_cycle)
184  {
185  if (t1->step == t2->step) return 0;
186  return (t1->step < t2->step) ? 1 : -1;
187  }
188 
189  return (t1->total_cycle < t2->total_cycle) ? 1 : -1;
190 }
191 
192 void OBCT_print(const ObcTime* time)
193 {
194  Printf("Time: <total, mode, step> = <%d, %d, %d>\n", time->total_cycle, time->mode_cycle, time->step);
195 }
196 
197 #pragma section
ObcTime OBCT_diff(const ObcTime *before, const ObcTime *after)
ObcTime の引き算を行う
Definition: obc_time.c:116
void OBCT_count_up(ObcTime *time)
ObcTimeをstep刻みでインクリメントする
Definition: obc_time.c:30
cycle_t OBCT_sec2cycle(uint32_t sec)
秒を cycle に変換する
Definition: obc_time.c:107
double OBCT_get_total_cycle_in_sec(const ObcTime *time)
引数で指定した ObcTime の total_cycle を秒単位で返す
Definition: obc_time.c:84
step_t OBCT_diff_in_step(const ObcTime *before, const ObcTime *after)
ObcTime の引き算を step 単位で行う
Definition: obc_time.c:146
step_t OBCT_get_step(const ObcTime *time)
引数で指定した ObcTime の step を返す
Definition: obc_time.c:69
void OBCT_print(const ObcTime *time)
デバッグ出力に ObcTime を表示する
Definition: obc_time.c:192
uint32_t OBCT_cycle2sec(cycle_t cycle)
cycle を秒に変換する
Definition: obc_time.c:112
uint32_t OBCT_diff_in_msec(const ObcTime *before, const ObcTime *after)
ObcTime の引き算をミリ秒単位で行う
Definition: obc_time.c:153
double OBCT_get_mode_cycle_in_sec(const ObcTime *time)
引数で指定した ObcTime の mode_cycle を秒単位で返す
Definition: obc_time.c:91
ObcTime OBCT_get_max(void)
ObcTime が取りうる最大値を返す
Definition: obc_time.c:54
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
double OBCT_diff_in_sec(const ObcTime *before, const ObcTime *after)
ObcTime の引き算を秒単位で行う
Definition: obc_time.c:159
uint32_t OBCT_cycle2msec(cycle_t cycle)
cycle をミリ秒に変換する
Definition: obc_time.c:103
int OBCT_compare(const ObcTime *t1, const ObcTime *t2)
ObcTime の比較
Definition: obc_time.c:181
cycle_t OBCT_msec2cycle(uint32_t msec)
ミリ秒を cycle に変換する
Definition: obc_time.c:98
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
OBCの時刻情報の定義と演算
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_STEP_IN_MSEC
1 step で何 ms か
#define OBCT_STEPS_PER_CYCLE
何 step で 1 cycle か
void Printf(const char *format,...)
Definition: print.c:9
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