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);
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);
}
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);
//
// 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++;
#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);
#include "conf.h"
#include "debug_print.h"
+#include "ad_ring.h"
// ミューテックス
static pthread_mutex_t mutex_conf = PTHREAD_MUTEX_INITIALIZER;
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;
+}
+
//
/**** 設定ファイル *******************************************
*/
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);
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;
\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
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
* 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
// ダミーデータを自分で発生するときに定義
//#define DUMMY
-#define VERSION "1.0.3"
+#define VERSION "1.0.4"
#define DEV_SPI "/dev/spikead"
#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 ***********************************************************
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);
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());
// ファイルオープン
/*
パケットバッファにデータたまった?
*/
- 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());
// ファイルオープン