From: Naoya Takamura Date: Thu, 19 Jan 2017 02:57:25 +0000 (+0900) Subject: 記録パス設定 記録CH設定 ファイル書込タイミング X-Git-Url: http://git.osdn.net/view?p=scilog%2Fscilog.git;a=commitdiff_plain;h=12bb2606082256a5d1dab3ccd4e2481f3e632022 記録パス設定 記録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に書込 --- diff --git a/ad_file.c b/ad_file.c index 5b1f004..4b791bd 100644 --- 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++; diff --git a/ad_file.h b/ad_file.h index 5092e8d..a040ca0 100644 --- 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 --- 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 --- a/conf.h +++ b/conf.h @@ -3,6 +3,7 @@ // 設定ファイル #define CONF_FILE "/etc/scilog.conf" +#define CONF_RECPATH_MAX 256 void conf_freq_set(int f); int conf_freq_get(void); @@ -13,6 +14,12 @@ int conf_gain_get(void); void conf_linux_time_set_set(int val); int conf_linux_time_set_get(void); +void conf_recpath_set(char *s); +char* conf_recpath_getp(void); + +void conf_recchn_set(int ch_num); +int conf_recchn_get(void); + int conf_read(void); #endif diff --git a/scilog.c b/scilog.c index 119ac56..2ffd6c8 100644 --- a/scilog.c +++ b/scilog.c @@ -25,6 +25,21 @@ * 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); diff --git a/thread_rec.c b/thread_rec.c index ed228ab..b5bff1f 100644 --- a/thread_rec.c +++ b/thread_rec.c @@ -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()); // ファイルオープン