OSDN Git Service

PDEBUG() disable.
[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 && 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         
91 //
92 /**** 1secデータ記録
93 */
94         /*
95                 パケットバッファにデータたまった?
96         */
97         if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM) {
98                 // データ取り出し
99                 d = ad_ring_get(ad_ring_read_get_sec());
100                 // ファイルオープン
101                 sec_file_open(&fp, d);
102
103                 // 書き込みループ
104                 while(ad_ring_num_get_sec() > 0) {
105                         // データ取り出し
106                         d = ad_ring_get(ad_ring_read_get_sec());
107 #if 0
108 PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",
109         d->gps.year, d->gps.month, d->gps.day, d->gps.hour, d->gps.min, d->gps.sec, d->gps.nano,
110         d->gps.tow, d->gps.tacc, d->gps.valid);
111 int ch;
112 for(ch = 0; ch < AD_CHNUM; ch++) {
113         PDEBUG(",%+7ld", d->data1sec[ch]);
114 }
115 PDEBUG("\r\n");
116 #endif
117
118                         // 日にち変わった ファイル切換する
119 #ifdef  DEBUG_FILE_MIN
120                         // デバッグ用 ?分ごとファイル切り替え
121                         if ((d->t.tm_min % DEBUG_FILE_MIN_PERIOD) == 0 && (d->t.tm_sec == 0) && (d->t.tm_min != sec_tm.tm_min)) {
122 #else
123                         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) {
124 #endif
125                                 // 日付変わったのでファイル切り替える
126                                 // 前のファイル閉じる
127                                 if (fp != NULL) sec_file_close(fp);
128                                 // ファイルオープン
129                                 if (sec_file_open(&fp, d)) {
130                                         PDEBUG("REC: FG file change ERROR\n");
131                                         syslog(LOG_INFO, "REC: FG file change ERROR\n");
132                                 } else {
133                                         PDEBUG("REC: FG file change OK\n");
134                                         syslog(LOG_INFO, "REC: FG file change OK\n");
135                                 }
136                         }
137                         // ファイルに書き込むデータ作成
138                         sec_make_rec_data(d, buf);
139                         // ファイルに1データ書き込み Open/Closeなし
140                         if (sec_file_out(fp, buf, strlen(buf))) {
141                                 /*      書き込みエラー */
142                                 // 読み出し位置クリア
143                                 ad_ring_clear_sec();
144                                 // ファイル閉じる
145                                 sec_file_close(fp);
146                                 //
147                                 PDEBUG("ProcRec: 1sec file write err\n");
148                                 syslog(LOG_INFO, "REC: 1sec file write error\n");
149                                 return STS_FILE_ERR;
150                         }
151                         // 読み込み位置進める
152                         ad_ring_read_plus_sec();
153                         // タイムスタンプ記録
154                         sec_tm = d->t;
155                 }
156                 // ファイル閉じる
157                 sec_file_close(fp);
158                 //
159                 PDEBUG("ProcRec: 1sec file write.\n");
160         }
161 //
162 /**** 高速サンプルデータ記録
163 */
164         /*
165                 パケットバッファにデータたまった?
166         */
167         if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM) {
168                 // データ取り出し
169                 d = ad_ring_get(ad_ring_read_get_high());
170                 // ファイルオープン
171                 high_file_open(&fp, d);
172
173                 // 書き込みループ
174                 while(ad_ring_num_get_high() > 0) {
175                         // データ取り出し
176                         d = ad_ring_get(ad_ring_read_get_high());
177                         // 時が変わった ファイル切換する
178 #ifdef  DEBUG_FILE_MIN
179                         // デバッグ用 ?分ごとファイル切り替え
180                         if ((d->t.tm_min % DEBUG_FILE_MIN_PERIOD) == 0 && (d->t.tm_high == 0) && (d->t.tm_min != hightm.tm_min)) {
181 #else
182                         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
183                         || d->t.tm_hour != high_tm.tm_hour) {
184 #endif
185                                 // 時が変わったのでファイル切り替える
186                                 // 前のファイル閉じる
187                                 if (fp != NULL) high_file_close(fp);
188                                 // ファイルオープン
189                                 if (high_file_open(&fp, d)) {
190                                         PDEBUG("REC: FG file change ERROR\n");
191                                         syslog(LOG_INFO, "REC: HIGH file change ERROR\n");
192                                 } else {
193                                         PDEBUG("REC: FG file change OK\n");
194                                         syslog(LOG_INFO, "REC: HIGH file change OK\n");
195                                 }
196                         }
197                         // ファイルに書き込むデータ作成
198                         high_make_rec_data(d, buf);
199                         // ファイルに1データ書き込み Open/Closeなし
200                         if (high_file_out(fp, buf, HIGH_WRITE_LEN)) {
201                                 /*      書き込みエラー */
202                                 // 読み出し位置クリア
203                                 ad_ring_clear_high();
204                                 // ファイル閉じる
205                                 high_file_close(fp);
206                                 //
207                                 PDEBUG("ProcRec: HIGH file write err\n");
208                                 syslog(LOG_INFO, "REC: HIGH file write error\n");
209                                 return STS_FILE_ERR;
210                         }
211                         // 読み込み位置進める
212                         ad_ring_read_plus_high();
213                         // タイムスタンプ記録
214                         high_tm = d->t;
215                 }
216                 // ファイル閉じる
217                 high_file_close(fp);
218                 //
219                 PDEBUG("ProcRec: HIGH file write.\n");
220         }
221
222         return STS_REC;
223 }
224
225 void* thread_rec(void* pParam)
226 {
227         while(1) {
228                 usleep(10*1000);
229                 switch (sts_get()) {
230                         /*      時刻校正中 */
231                         case STS_TIME_FIX:
232                                 sts_set(ProcTimeFix());
233                                 break;
234                         /*      記録初期化 */
235                         case STS_REC_INIT:
236                                 sts_set(ProcRecInit());
237                                 break;
238                         /*      記録中 */
239                         case STS_REC:
240                                 sts_set(ProcRec());
241                                 break;
242                         /*      記録OFF中 */
243                         case STS_REC_OFF:
244 //                              sts_set(ProcRecOff());
245                                 break;
246                         /*      ファイルエラー発生中 */
247                         case STS_FILE_ERR:
248 //                              sts_set(ProcErr());
249                                 break;
250                         default:
251                                 break;
252                 }
253         } // メインループ終わり
254 }