• R/O
  • HTTP
  • SSH
  • HTTPS

scilog: Commit

Overoで動作するデータ収録プログラム
サブCPUからGPS時刻付きADデータを取得してSDに記録する。


Commit MetaInfo

Revision12bb2606082256a5d1dab3ccd4e2481f3e632022 (tree)
Time2017-01-19 11:57:25
AuthorNaoya Takamura <ntaka206@user...>
CommiterNaoya Takamura

Log Message

記録パス設定 記録CH設定 ファイル書込タイミング

2017/1
設定ファイルに記録先パス設定を追加
rec_path= Default /home/data

記録するCH数設定を追加
sec/high両方のファイルで有効
rec_chn= Default 6
CH1から指定した番号のCHまでを記録する
highファイルのヘッダにCH数を入れてないので、デコード時に指定する必要あり

sec/highファイルの書込タイミングを制御するようにした
secファイルは毎分00secに書込
highファイルは、00,10,20,30,40,50secに書込

Change Summary

Incremental Difference

--- a/ad_file.c
+++ b/ad_file.c
@@ -86,7 +86,7 @@ int sec_file_open(FILE **fp, AdData *D)
8686 char path[128];
8787
8888 // サブディレクトリ作成
89- sprintf(szDir, "%s/%04d/%02d", DIR_DATA, D->t.tm_year+1900, D->t.tm_mon+1);
89+ sprintf(szDir, "%s/%04d/%02d", conf_recpath_getp(), D->t.tm_year+1900, D->t.tm_mon+1);
9090 // ディレクトリ存在しなければ作成する
9191 if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE);
9292
@@ -151,7 +151,7 @@ int sec_make_rec_data(AdData *ad, char *buf)
151151 sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d,%3lu,%02X",
152152 ad->gps.year, ad->gps.month, ad->gps.day, ad->gps.hour, ad->gps.min, ad->gps.sec,
153153 ad->gps.tacc, ad->gps.valid);
154- for(ch = 0; ch < AD_CHNUM; ch++) {
154+ for(ch = 0; ch < conf_recchn_get(); ch++) {
155155 sprintf(buf2, ",%+7d", ad->data1sec[ch]);
156156 strcat(buf, buf2);
157157 }
@@ -173,7 +173,7 @@ int high_file_open(FILE **fp, AdData *D)
173173 char path[128];
174174
175175 // サブディレクトリ作成
176- sprintf(szDir, "%s/%04d/%02d", DIR_DATA, D->t.tm_year+1900, D->t.tm_mon+1);
176+ sprintf(szDir, "%s/%04d/%02d", conf_recpath_getp(), D->t.tm_year+1900, D->t.tm_mon+1);
177177 // ディレクトリ存在しなければ作成する
178178 if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE);
179179
@@ -249,9 +249,9 @@ int high_make_rec_data(AdData *ad, char *ptr)
249249
250250 //
251251 // src = (char*)ad->avg;
252- for(ch = 0; ch < AD_CHNUM; ch++) {
252+ for(ch = 0; ch < conf_recchn_get(); ch++) {
253253 for(i = 0; i < ad->freq; i++) {
254- memcpy(ptr, &(ad->avg[ch][i]), AD_BYTES);
254+ memcpy(ptr, &(ad->avg[ch][i]), AD_BYTES); // 1sample data
255255 ptr += AD_BYTES;
256256 // for(j = 0; j < AD_BYTES; j++) {
257257 // *ptr++ = *src++;
--- a/ad_file.h
+++ b/ad_file.h
@@ -4,42 +4,9 @@
44 #include "ad_ring.h"
55 #include "conf.h"
66
7-// データ記録用dir 末尾に/付けない
8-#ifdef DUMMY
9- #define DIR_DATA "/home/ntaka/dev/arm2011n/data"
10-#else
11- #define DIR_DATA "/home/data"
12-#endif
13-
14-#if 0
15-// NAV-TIMEUTCパケットのファイル記録用データタイプ
16-typedef struct {
17- unsigned long tow; // ms GPS Millisecond Time of Week
18- unsigned long tacc; // ns Time Accuracy Estimate
19- long nano; // ns Nanoseconds of second, range -1e9 .. 1e9 (UTC)
20- unsigned int year __attribute__((aligned(1))); // 12 UTC
21- unsigned char month __attribute__((aligned(1))); // 16
22- unsigned char day __attribute__((aligned(1)));
23- unsigned char hour __attribute__((aligned(1)));
24- unsigned char min __attribute__((aligned(1)));
25- unsigned char sec __attribute__((aligned(1)));
26- unsigned char valid __attribute__((aligned(1))); // Validity Flags
27- // bit0 validTOW 1 = Valid Time of Week
28- // bit1 validWKN 1 = Valid Week Number
29- // bit2 validUTC 1 = Valid UTC (Leap Seconds already known)
30-} UbloxNavTimeUtcRecType __attribute__((aligned(1)));
31-
32-// 高速サンプルデータ記録用データタイプ
33-typedef struct {
34- UbloxNavTimeUtcRecType gps; // GPSタイムスタンプ
35- unsigned char data[AD_CHNUM][AD_SAMPLE][AD_BYTES]; // AD
36-} HighSampleRecType;
37-
38-#define HIGH_WRITE_LEN szieof(HighSampleRecType)
39-#endif
407 #define HIGH_HEADER_LEN 14
418 #define HIGH_WRITE_LEN_MAX (HIGH_HEADER_LEN + AD_CHNUM*AD_SAMPLE*AD_BYTES)
42-#define HIGH_WRITE_LEN (HIGH_HEADER_LEN + AD_CHNUM*conf_freq_get()*AD_BYTES) // 記録周波数で変わる
9+#define HIGH_WRITE_LEN (HIGH_HEADER_LEN + conf_recchn_get()*conf_freq_get()*AD_BYTES) // 記録周波数と記録CH数で変わる
4310
4411 int sec_file_open(FILE **fp, AdData *D);
4512 int sec_file_out(FILE *fp, char *out, int len);
--- a/conf.c
+++ b/conf.c
@@ -6,6 +6,7 @@
66
77 #include "conf.h"
88 #include "debug_print.h"
9+#include "ad_ring.h"
910
1011 // ミューテックス
1112 static pthread_mutex_t mutex_conf = PTHREAD_MUTEX_INITIALIZER;
@@ -67,6 +68,28 @@ int conf_linux_time_set_get(void)
6768 return linux_time_set;
6869 }
6970
71+// 記録パス
72+static char recpath[CONF_RECPATH_MAX];
73+void conf_recpath_set(char *s)
74+{
75+ strncpy(recpath, s, sizeof(recpath));
76+}
77+char* conf_recpath_getp(void)
78+{
79+ return recpath;
80+}
81+
82+// 記録CH
83+static int recchnum;
84+void conf_recchn_set(int chn)
85+{
86+ recchnum = chn;
87+}
88+int conf_recchn_get(void)
89+{
90+ return recchnum;
91+}
92+
7093 //
7194 /**** 設定ファイル *******************************************
7295 */
@@ -159,9 +182,10 @@ int conf_read(void)
159182 FILE *fp;
160183 char buf[256];
161184 // char buf2[256];
185+ char buf2[CONF_RECPATH_MAX];
162186 int f;
163187 int val;
164-
188+
165189 fp = fopen(CONF_FILE, "rt");
166190 if (fp == NULL) {
167191 syslog(LOG_ERR, "conf_read(): conf file not found. %s", CONF_FILE);
@@ -190,6 +214,17 @@ int conf_read(void)
190214 conf_linux_time_set_set(val);
191215 syslog(LOG_INFO, "linux_time_set=%d", conf_linux_time_set_get());
192216 }
217+ // 記録パス
218+ if (sscanf(buf, "rec_path = %s", buf2) == 1) {
219+ trim_space(buf2);
220+ conf_recpath_set(buf2);
221+ syslog(LOG_INFO, "rec_path=%s", conf_recpath_getp());
222+ }
223+ // 記録CH
224+ if (sscanf(buf, "rec_chn = %d", &f) == 1) {
225+ if (f < 1 || f > AD_CHNUM) f = AD_CHNUM;
226+ conf_recchn_set(f);
227+ }
193228 }
194229 fclose(fp);
195230 return 0;
--- a/conf.h
+++ b/conf.h
@@ -3,6 +3,7 @@
33
44 // 設定ファイル
55 #define CONF_FILE "/etc/scilog.conf"
6+#define CONF_RECPATH_MAX 256
67
78 void conf_freq_set(int f);
89 int conf_freq_get(void);
@@ -13,6 +14,12 @@ int conf_gain_get(void);
1314 void conf_linux_time_set_set(int val);
1415 int conf_linux_time_set_get(void);
1516
17+void conf_recpath_set(char *s);
18+char* conf_recpath_getp(void);
19+
20+void conf_recchn_set(int ch_num);
21+int conf_recchn_get(void);
22+
1623 int conf_read(void);
1724
1825 #endif
--- a/scilog.c
+++ b/scilog.c
@@ -25,6 +25,21 @@
2525 * thread_disp.c 毎分1回 LCD初期化する
2626 * i2cLCD基板の自動初期化機能は、2行設定で初期化されるので使用しない
2727 *
28+ **** Ver1.0.4
29+ * 2017/1
30+ * 設定ファイルに記録先パス設定を追加
31+ * rec_path= Default /home/data
32+ *
33+ * 記録するCH数設定を追加
34+ * sec/high両方のファイルで有効
35+ * rec_chn= Default 6
36+ * CH1から指定した番号のCHまでを記録する
37+ * highファイルのヘッダにCH数を入れてないので、デコード時に指定する必要あり
38+ *
39+ * sec/highファイルの書込タイミングを制御するようにした
40+ * secファイルは毎分00secに書込
41+ * highファイルは、00,10,20,30,40,50secに書込
42+ *
2843 * ●コンパイル方法
2944 * . environment-setup-cortexa8hf-vfp-neon-poky-linux-gnueabi
3045 * make
@@ -71,7 +86,7 @@
7186 // ダミーデータを自分で発生するときに定義
7287 //#define DUMMY
7388
74-#define VERSION "1.0.3"
89+#define VERSION "1.0.4"
7590
7691 #define DEV_SPI "/dev/spikead"
7792
@@ -80,6 +95,9 @@
8095 #define CONF_FREQ_DEF 50
8196 #define CONF_GAIN_DEF SPI_CMD_GAIN_1P4
8297 #define CONF_LINUX_TIME_SET_DEF 1 // ON
98+// データ記録用dir 末尾に/付けない
99+#define CONF_RECPATH_DEF "/home/data"
100+#define CONF_RECCHN_DEF 6
83101
84102 //
85103 /**** signal ***********************************************************
@@ -134,11 +152,15 @@ int main (int argc, char *argv[])
134152 conf_freq_set(CONF_FREQ_DEF);
135153 conf_gain_set(CONF_GAIN_DEF);
136154 conf_linux_time_set_set(CONF_LINUX_TIME_SET_DEF);
155+ conf_recpath_set(CONF_RECPATH_DEF);
156+ conf_recchn_set(CONF_RECCHN_DEF);
137157 // 設定ファイル読み込み
138158 conf_read();
139159 PDEBUG("freq=%d\n", conf_freq_get());
140160 PDEBUG("gain=%d\n", conf_gain_get());
141161 PDEBUG("linux_time_set=%d\n", conf_linux_time_set_get());
162+ PDEBUG("rec_path=%s\n", conf_recpath_getp());
163+ PDEBUG("rec_chn=%d\n", conf_recchn_get());
142164 lcd_print("*");
143165
144166 PDEBUG("sciLogger %s START\n", VERSION);
--- a/thread_rec.c
+++ b/thread_rec.c
@@ -87,14 +87,25 @@ int ProcRec(void)
8787 AdData *d;
8888 FILE *fp = NULL;
8989 char buf[HIGH_WRITE_LEN_MAX+128];
90-
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+ }
91102 //
92103 /**** 1secデータ記録
93104 */
94105 /*
95- パケットバッファにデータたまった?
106+ パケットバッファにデータたまった? or 書込タイミング?
96107 */
97- if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM) {
108+ if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM || secw) {
98109 // データ取り出し
99110 d = ad_ring_get(ad_ring_read_get_sec());
100111 // ファイルオープン
@@ -164,7 +175,7 @@ PDEBUG("\r\n");
164175 /*
165176 パケットバッファにデータたまった?
166177 */
167- if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM) {
178+ if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM || highw) {
168179 // データ取り出し
169180 d = ad_ring_get(ad_ring_read_get_high());
170181 // ファイルオープン
Show on old repository browser