OSDN Git Service

記録パス設定 記録CH設定 ファイル書込タイミング master
authorNaoya Takamura <ntaka206@users.sourceforge.jp>
Thu, 19 Jan 2017 02:57:25 +0000 (11:57 +0900)
committerNaoya Takamura <ntaka206@users.sourceforge.jp>
Thu, 19 Jan 2017 02:57:25 +0000 (11:57 +0900)
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に書込

ad_file.c
ad_file.h
conf.c
conf.h
scilog.c
thread_rec.c

index 5b1f004..4b791bd 100644 (file)
--- a/ad_file.c
+++ b/ad_file.c
@@ -86,7 +86,7 @@ int sec_file_open(FILE **fp, AdData *D)
        char    path[128];
        
        // サブディレクトリ作成
-       sprintf(szDir, "%s/%04d/%02d", DIR_DATA, D->t.tm_year+1900, D->t.tm_mon+1);
+       sprintf(szDir, "%s/%04d/%02d", conf_recpath_getp(), D->t.tm_year+1900, D->t.tm_mon+1);
        // ディレクトリ存在しなければ作成する
        if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE);
 
@@ -151,7 +151,7 @@ int sec_make_rec_data(AdData *ad, char *buf)
        sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d,%3lu,%02X",
                ad->gps.year, ad->gps.month, ad->gps.day, ad->gps.hour, ad->gps.min, ad->gps.sec,
                ad->gps.tacc, ad->gps.valid);
-       for(ch = 0; ch < AD_CHNUM; ch++) {
+       for(ch = 0; ch < conf_recchn_get(); ch++) {
                sprintf(buf2, ",%+7d", ad->data1sec[ch]);
                strcat(buf, buf2);
        }
@@ -173,7 +173,7 @@ int high_file_open(FILE **fp, AdData *D)
        char    path[128];
        
        // サブディレクトリ作成
-       sprintf(szDir, "%s/%04d/%02d", DIR_DATA, D->t.tm_year+1900, D->t.tm_mon+1);
+       sprintf(szDir, "%s/%04d/%02d", conf_recpath_getp(), D->t.tm_year+1900, D->t.tm_mon+1);
        // ディレクトリ存在しなければ作成する
        if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE);
 
@@ -249,9 +249,9 @@ int high_make_rec_data(AdData *ad, char *ptr)
        
        // 
 //     src = (char*)ad->avg;
-       for(ch = 0; ch < AD_CHNUM; ch++) {
+       for(ch = 0; ch < conf_recchn_get(); ch++) {
                for(i = 0; i < ad->freq; i++) {
-                       memcpy(ptr, &(ad->avg[ch][i]), AD_BYTES);
+                       memcpy(ptr, &(ad->avg[ch][i]), AD_BYTES); // 1sample data
                        ptr += AD_BYTES;
 //                     for(j = 0; j < AD_BYTES; j++) {
 //                             *ptr++ = *src++;
index 5092e8d..a040ca0 100644 (file)
--- a/ad_file.h
+++ b/ad_file.h
@@ -4,42 +4,9 @@
 #include "ad_ring.h"
 #include "conf.h"
 
-// データ記録用dir 末尾に/付けない
-#ifdef DUMMY
-       #define DIR_DATA                "/home/ntaka/dev/arm2011n/data"
-#else
-       #define DIR_DATA                "/home/data"
-#endif
-
-#if 0
-// NAV-TIMEUTCパケットのファイル記録用データタイプ
-typedef struct {
-    unsigned long   tow;    // ms GPS Millisecond Time of Week
-    unsigned long   tacc;   // ns Time Accuracy Estimate
-    long   nano;            // ns Nanoseconds of second, range -1e9 .. 1e9 (UTC)
-    unsigned int    year __attribute__((aligned(1)));   // 12 UTC
-    unsigned char   month __attribute__((aligned(1))); // 16
-    unsigned char   day __attribute__((aligned(1)));
-    unsigned char   hour __attribute__((aligned(1)));
-    unsigned char   min __attribute__((aligned(1)));
-    unsigned char   sec __attribute__((aligned(1)));
-    unsigned char   valid __attribute__((aligned(1)));  // Validity Flags
-                            //  bit0 validTOW 1 = Valid Time of Week
-                            //  bit1 validWKN 1 = Valid Week Number
-                            //  bit2 validUTC 1 = Valid UTC (Leap Seconds already known)
-} UbloxNavTimeUtcRecType __attribute__((aligned(1)));
-
-// 高速サンプルデータ記録用データタイプ
-typedef struct {
-       UbloxNavTimeUtcRecType  gps;                    // GPSタイムスタンプ
-       unsigned char   data[AD_CHNUM][AD_SAMPLE][AD_BYTES];    // AD
-} HighSampleRecType;
-
-#define        HIGH_WRITE_LEN  szieof(HighSampleRecType)
-#endif
 #define        HIGH_HEADER_LEN 14
 #define        HIGH_WRITE_LEN_MAX      (HIGH_HEADER_LEN + AD_CHNUM*AD_SAMPLE*AD_BYTES)
-#define        HIGH_WRITE_LEN  (HIGH_HEADER_LEN + AD_CHNUM*conf_freq_get()*AD_BYTES)   // 記録周波数で変わる
+#define        HIGH_WRITE_LEN  (HIGH_HEADER_LEN + conf_recchn_get()*conf_freq_get()*AD_BYTES)  // 記録周波数と記録CH数で変わる
 
 int sec_file_open(FILE **fp, AdData *D);
 int sec_file_out(FILE *fp, char *out, int len);
diff --git a/conf.c b/conf.c
index c26f16e..ce7fc5e 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -6,6 +6,7 @@
 
 #include "conf.h"
 #include "debug_print.h"
+#include "ad_ring.h"
 
 // ミューテックス
 static pthread_mutex_t mutex_conf = PTHREAD_MUTEX_INITIALIZER;
@@ -67,6 +68,28 @@ int conf_linux_time_set_get(void)
        return linux_time_set;
 }
 
+// 記録パス
+static char    recpath[CONF_RECPATH_MAX];
+void conf_recpath_set(char *s)
+{
+       strncpy(recpath, s, sizeof(recpath));
+}
+char* conf_recpath_getp(void)
+{
+       return recpath;
+}
+
+// 記録CH
+static int     recchnum;
+void conf_recchn_set(int chn)
+{
+       recchnum = chn;
+}
+int conf_recchn_get(void)
+{
+       return recchnum;
+}
+
 //
 /**** 設定ファイル *******************************************
 */
@@ -159,9 +182,10 @@ int conf_read(void)
        FILE    *fp;
        char    buf[256];
 //     char    buf2[256];
+       char    buf2[CONF_RECPATH_MAX];
        int     f;
        int     val;
-       
+
        fp = fopen(CONF_FILE, "rt");
        if (fp == NULL) {
                syslog(LOG_ERR, "conf_read(): conf file not found. %s", CONF_FILE);
@@ -190,6 +214,17 @@ int conf_read(void)
                        conf_linux_time_set_set(val);
                        syslog(LOG_INFO, "linux_time_set=%d", conf_linux_time_set_get());
                } 
+               // 記録パス
+               if (sscanf(buf, "rec_path = %s", buf2) == 1) {
+                       trim_space(buf2);
+                       conf_recpath_set(buf2);
+                       syslog(LOG_INFO, "rec_path=%s", conf_recpath_getp());
+               } 
+               // 記録CH
+               if (sscanf(buf, "rec_chn = %d", &f) == 1) {
+                       if (f < 1 || f > AD_CHNUM) f = AD_CHNUM;
+                       conf_recchn_set(f);
+               }
        }
        fclose(fp);
        return 0;
diff --git a/conf.h b/conf.h
index 866f889..544ba48 100644 (file)
--- a/conf.h
+++ b/conf.h
@@ -3,6 +3,7 @@
 \r
 // 設定ファイル\r
 #define        CONF_FILE       "/etc/scilog.conf"\r
+#define        CONF_RECPATH_MAX        256\r
 \r
 void conf_freq_set(int f);\r
 int conf_freq_get(void);\r
@@ -13,6 +14,12 @@ int conf_gain_get(void);
 void conf_linux_time_set_set(int val);\r
 int conf_linux_time_set_get(void);\r
 \r
+void conf_recpath_set(char *s);\r
+char* conf_recpath_getp(void);\r
+\r
+void conf_recchn_set(int ch_num);\r
+int conf_recchn_get(void);\r
+\r
 int conf_read(void);\r
 \r
 #endif\r
index 119ac56..2ffd6c8 100644 (file)
--- a/scilog.c
+++ b/scilog.c
  * thread_disp.c 毎分1回 LCD初期化する
  * i2cLCD基板の自動初期化機能は、2行設定で初期化されるので使用しない
  * 
+ **** Ver1.0.4
+ * 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に書込
+ * 
  * ●コンパイル方法
  * . environment-setup-cortexa8hf-vfp-neon-poky-linux-gnueabi
  * make
@@ -71,7 +86,7 @@
 // ダミーデータを自分で発生するときに定義
 //#define      DUMMY
 
-#define        VERSION "1.0.3"
+#define        VERSION "1.0.4"
 
 #define        DEV_SPI "/dev/spikead"
 
@@ -80,6 +95,9 @@
 #define        CONF_FREQ_DEF   50
 #define        CONF_GAIN_DEF   SPI_CMD_GAIN_1P4
 #define        CONF_LINUX_TIME_SET_DEF 1       // ON
+// データ記録用dir 末尾に/付けない
+#define        CONF_RECPATH_DEF        "/home/data"
+#define        CONF_RECCHN_DEF 6
 
 //
 /**** signal ***********************************************************
@@ -134,11 +152,15 @@ int main (int argc, char *argv[])
        conf_freq_set(CONF_FREQ_DEF);
        conf_gain_set(CONF_GAIN_DEF);
        conf_linux_time_set_set(CONF_LINUX_TIME_SET_DEF);
+       conf_recpath_set(CONF_RECPATH_DEF);
+       conf_recchn_set(CONF_RECCHN_DEF);
        // 設定ファイル読み込み
        conf_read();
        PDEBUG("freq=%d\n", conf_freq_get());
        PDEBUG("gain=%d\n", conf_gain_get());
        PDEBUG("linux_time_set=%d\n", conf_linux_time_set_get());
+       PDEBUG("rec_path=%s\n", conf_recpath_getp());
+       PDEBUG("rec_chn=%d\n", conf_recchn_get());
        lcd_print("*");
 
        PDEBUG("sciLogger %s START\n", VERSION);
index ed228ab..b5bff1f 100644 (file)
@@ -87,14 +87,25 @@ int ProcRec(void)
        AdData  *d;
        FILE    *fp = NULL;
        char    buf[HIGH_WRITE_LEN_MAX+128];
-       
+       static int i = -1;
+       int     secw = 0;
+       int highw = 0;
+
+       // 書込タイミングを制御する
+       if (i != ad_ring_latest_get()) {
+               i = ad_ring_latest_get();
+               // データ取得
+               d = ad_ring_get(i);
+               if (d->t.tm_sec == 0) secw = 1;
+               if (d->t.tm_sec % HIGH_FLUSH_NUM == 0) highw = 1;
+       }
 //
 /**** 1secデータ記録
 */
        /*
-               パケットバッファにデータたまった?
+               パケットバッファにデータたまった? or 書込タイミング?
        */
-       if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM) {
+       if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM || secw) {
                // データ取り出し
                d = ad_ring_get(ad_ring_read_get_sec());
                // ファイルオープン
@@ -164,7 +175,7 @@ PDEBUG("\r\n");
        /*
                パケットバッファにデータたまった?
        */
-       if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM) {
+       if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM || highw) {
                // データ取り出し
                d = ad_ring_get(ad_ring_read_get_high());
                // ファイルオープン