OSDN Git Service

記録パス設定 記録CH設定 ファイル書込タイミング
[scilog/scilog.git] / thread_rec.c
1
2 #include <stdio.h>
3 #include <syslog.h>
4 #include <unistd.h>
5 #include <string.h>
6
7 #include "ad_ring.h"
8 #include "sts.h"
9 #include "debug_print.h"
10 #include "ad_file.h"
11
12 // 1secファイル書き込み間隔 sec
13 //#define       SEC_FLUSH_NUM   1
14 #define SEC_FLUSH_NUM   60
15
16 // 高速サンプルファイル書き込み間隔 sec
17 //#define       HIGH_FLUSH_NUM  1
18 #define HIGH_FLUSH_NUM  10
19
20 // 日付変化検出用
21 static struct tm        high_tm;
22 static struct tm        sec_tm;
23
24 //
25 /**** 時刻校正待ち
26         パケット中の時刻が有効になるのを待つ
27
28         Return:
29                 次の状態
30 */
31 int ProcTimeFix(void)
32 {
33         AdData  *d;
34         static int      latest = -1;
35         /*
36                 時刻校正終わったら、記録開始
37         */
38         if (latest == ad_ring_latest_get()) return STS_TIME_FIX;
39         latest = ad_ring_latest_get();
40         if (latest >= 0) {
41                 // 最新データの時刻取得
42                 d = ad_ring_get(latest);
43                 // GPS Validチェック, tacc < 1000nsec
44                 if (((d->gps.valid & 0x07) == 0x07) && (d->gps.tacc < 1000)) {
45                         PDEBUG("ProcTimeFix: rec init.\n");
46                         return STS_REC_INIT;
47                 }
48         }
49         return STS_TIME_FIX;
50 }
51
52 //
53 /**** 記録初期化
54
55         Return:
56                 次の状態
57 */
58 int ProcRecInit(void)
59 {
60         AdData  *d;
61         
62         if (ad_ring_latest_get() >= 0) {
63                 // 記録開始
64                 ad_ring_clear_sec();
65                 ad_ring_clear_high();
66
67                 // 最新データの時刻取得
68                 d = ad_ring_get(ad_ring_latest_get());
69                 // 日付変化検出用変数初期化
70                 high_tm = d->t;
71                 sec_tm = d->t;
72         
73                 PDEBUG("ProcRecInit: rec start.\n");
74                 return STS_REC;
75         }
76         return STS_REC_INIT;
77 }
78
79 /**** 記録中
80         定期的にカードに書き込み
81
82         Return:
83                 次の状態
84 */
85 int ProcRec(void)
86 {
87         AdData  *d;
88         FILE    *fp = NULL;
89         char    buf[HIGH_WRITE_LEN_MAX+128];
90         static int i = -1;
91         int     secw = 0;
92         int highw = 0;
93
94         // 書込タイミングを制御する
95         if (i != ad_ring_latest_get()) {
96                 i = ad_ring_latest_get();
97                 // データ取得
98                 d = ad_ring_get(i);
99                 if (d->t.tm_sec == 0) secw = 1;
100                 if (d->t.tm_sec % HIGH_FLUSH_NUM == 0) highw = 1;
101         }
102 //
103 /**** 1secデータ記録
104 */
105         /*
106                 パケットバッファにデータたまった? or 書込タイミング?
107         */
108         if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM || secw) {
109                 // データ取り出し
110                 d = ad_ring_get(ad_ring_read_get_sec());
111                 // ファイルオープン
112                 sec_file_open(&fp, d);
113
114                 // 書き込みループ
115                 while(ad_ring_num_get_sec() > 0) {
116                         // データ取り出し
117                         d = ad_ring_get(ad_ring_read_get_sec());
118 #if 0
119 PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",
120         d->gps.year, d->gps.month, d->gps.day, d->gps.hour, d->gps.min, d->gps.sec, d->gps.nano,
121         d->gps.tow, d->gps.tacc, d->gps.valid);
122 int ch;
123 for(ch = 0; ch < AD_CHNUM; ch++) {
124         PDEBUG(",%+7ld", d->data1sec[ch]);
125 }
126 PDEBUG("\r\n");
127 #endif
128
129                         // 日にち変わった ファイル切換する
130 #ifdef  DEBUG_FILE_MIN
131                         // デバッグ用 ?分ごとファイル切り替え
132                         if ((d->t.tm_min % DEBUG_FILE_MIN_PERIOD) == 0 && (d->t.tm_sec == 0) && (d->t.tm_min != sec_tm.tm_min)) {
133 #else
134                         if (d->t.tm_year != sec_tm.tm_year || d->t.tm_mon != sec_tm.tm_mon || d->t.tm_mday != sec_tm.tm_mday) {
135 #endif
136                                 // 日付変わったのでファイル切り替える
137                                 // 前のファイル閉じる
138                                 if (fp != NULL) sec_file_close(fp);
139                                 // ファイルオープン
140                                 if (sec_file_open(&fp, d)) {
141                                         PDEBUG("REC: FG file change ERROR\n");
142                                         syslog(LOG_INFO, "REC: FG file change ERROR\n");
143                                 } else {
144                                         PDEBUG("REC: FG file change OK\n");
145                                         syslog(LOG_INFO, "REC: FG file change OK\n");
146                                 }
147                         }
148                         // ファイルに書き込むデータ作成
149                         sec_make_rec_data(d, buf);
150                         // ファイルに1データ書き込み Open/Closeなし
151                         if (sec_file_out(fp, buf, strlen(buf))) {
152                                 /*      書き込みエラー */
153                                 // 読み出し位置クリア
154                                 ad_ring_clear_sec();
155                                 // ファイル閉じる
156                                 sec_file_close(fp);
157                                 //
158                                 PDEBUG("ProcRec: 1sec file write err\n");
159                                 syslog(LOG_INFO, "REC: 1sec file write error\n");
160                                 return STS_FILE_ERR;
161                         }
162                         // 読み込み位置進める
163                         ad_ring_read_plus_sec();
164                         // タイムスタンプ記録
165                         sec_tm = d->t;
166                 }
167                 // ファイル閉じる
168                 sec_file_close(fp);
169                 //
170                 PDEBUG("ProcRec: 1sec file write.\n");
171         }
172 //
173 /**** 高速サンプルデータ記録
174 */
175         /*
176                 パケットバッファにデータたまった?
177         */
178         if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM || highw) {
179                 // データ取り出し
180                 d = ad_ring_get(ad_ring_read_get_high());
181                 // ファイルオープン
182                 high_file_open(&fp, d);
183
184                 // 書き込みループ
185                 while(ad_ring_num_get_high() > 0) {
186                         // データ取り出し
187                         d = ad_ring_get(ad_ring_read_get_high());
188                         // 時が変わった ファイル切換する
189 #ifdef  DEBUG_FILE_MIN
190                         // デバッグ用 ?分ごとファイル切り替え
191                         if ((d->t.tm_min % DEBUG_FILE_MIN_PERIOD) == 0 && (d->t.tm_high == 0) && (d->t.tm_min != hightm.tm_min)) {
192 #else
193                         if (d->t.tm_year != high_tm.tm_year || d->t.tm_mon != high_tm.tm_mon || d->t.tm_mday != high_tm.tm_mday
194                         || d->t.tm_hour != high_tm.tm_hour) {
195 #endif
196                                 // 時が変わったのでファイル切り替える
197                                 // 前のファイル閉じる
198                                 if (fp != NULL) high_file_close(fp);
199                                 // ファイルオープン
200                                 if (high_file_open(&fp, d)) {
201                                         PDEBUG("REC: FG file change ERROR\n");
202                                         syslog(LOG_INFO, "REC: HIGH file change ERROR\n");
203                                 } else {
204                                         PDEBUG("REC: FG file change OK\n");
205                                         syslog(LOG_INFO, "REC: HIGH file change OK\n");
206                                 }
207                         }
208                         // ファイルに書き込むデータ作成
209                         high_make_rec_data(d, buf);
210                         // ファイルに1データ書き込み Open/Closeなし
211                         if (high_file_out(fp, buf, HIGH_WRITE_LEN)) {
212                                 /*      書き込みエラー */
213                                 // 読み出し位置クリア
214                                 ad_ring_clear_high();
215                                 // ファイル閉じる
216                                 high_file_close(fp);
217                                 //
218                                 PDEBUG("ProcRec: HIGH file write err\n");
219                                 syslog(LOG_INFO, "REC: HIGH file write error\n");
220                                 return STS_FILE_ERR;
221                         }
222                         // 読み込み位置進める
223                         ad_ring_read_plus_high();
224                         // タイムスタンプ記録
225                         high_tm = d->t;
226                 }
227                 // ファイル閉じる
228                 high_file_close(fp);
229                 //
230                 PDEBUG("ProcRec: HIGH file write.\n");
231         }
232
233         return STS_REC;
234 }
235
236 void* thread_rec(void* pParam)
237 {
238         while(1) {
239                 usleep(10*1000);
240                 switch (sts_get()) {
241                         /*      時刻校正中 */
242                         case STS_TIME_FIX:
243                                 sts_set(ProcTimeFix());
244                                 break;
245                         /*      記録初期化 */
246                         case STS_REC_INIT:
247                                 sts_set(ProcRecInit());
248                                 break;
249                         /*      記録中 */
250                         case STS_REC:
251                                 sts_set(ProcRec());
252                                 break;
253                         /*      記録OFF中 */
254                         case STS_REC_OFF:
255 //                              sts_set(ProcRecOff());
256                                 break;
257                         /*      ファイルエラー発生中 */
258                         case STS_FILE_ERR:
259 //                              sts_set(ProcErr());
260                                 break;
261                         default:
262                                 break;
263                 }
264         } // メインループ終わり
265 }