OSDN Git Service

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