Overoで動作するデータ収録プログラム
サブCPUからGPS時刻付きADデータを取得してSDに記録する。
| Revision | 12bb2606082256a5d1dab3ccd4e2481f3e632022 (tree) |
|---|---|
| Time | 2017-01-19 11:57:25 |
| Author | Naoya Takamura <ntaka206@user...> |
| Commiter | Naoya Takamura |
記録パス設定 記録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に書込
| @@ -86,7 +86,7 @@ int sec_file_open(FILE **fp, AdData *D) | ||
| 86 | 86 | char path[128]; |
| 87 | 87 | |
| 88 | 88 | // サブディレクトリ作成 |
| 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); | |
| 90 | 90 | // ディレクトリ存在しなければ作成する |
| 91 | 91 | if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE); |
| 92 | 92 |
| @@ -151,7 +151,7 @@ int sec_make_rec_data(AdData *ad, char *buf) | ||
| 151 | 151 | sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d,%3lu,%02X", |
| 152 | 152 | ad->gps.year, ad->gps.month, ad->gps.day, ad->gps.hour, ad->gps.min, ad->gps.sec, |
| 153 | 153 | ad->gps.tacc, ad->gps.valid); |
| 154 | - for(ch = 0; ch < AD_CHNUM; ch++) { | |
| 154 | + for(ch = 0; ch < conf_recchn_get(); ch++) { | |
| 155 | 155 | sprintf(buf2, ",%+7d", ad->data1sec[ch]); |
| 156 | 156 | strcat(buf, buf2); |
| 157 | 157 | } |
| @@ -173,7 +173,7 @@ int high_file_open(FILE **fp, AdData *D) | ||
| 173 | 173 | char path[128]; |
| 174 | 174 | |
| 175 | 175 | // サブディレクトリ作成 |
| 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); | |
| 177 | 177 | // ディレクトリ存在しなければ作成する |
| 178 | 178 | if (stat(szDir, &st) == -1) mkdir_p(szDir, MKDIR_MODE); |
| 179 | 179 |
| @@ -249,9 +249,9 @@ int high_make_rec_data(AdData *ad, char *ptr) | ||
| 249 | 249 | |
| 250 | 250 | // |
| 251 | 251 | // src = (char*)ad->avg; |
| 252 | - for(ch = 0; ch < AD_CHNUM; ch++) { | |
| 252 | + for(ch = 0; ch < conf_recchn_get(); ch++) { | |
| 253 | 253 | 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 | |
| 255 | 255 | ptr += AD_BYTES; |
| 256 | 256 | // for(j = 0; j < AD_BYTES; j++) { |
| 257 | 257 | // *ptr++ = *src++; |
| @@ -4,42 +4,9 @@ | ||
| 4 | 4 | #include "ad_ring.h" |
| 5 | 5 | #include "conf.h" |
| 6 | 6 | |
| 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 | |
| 40 | 7 | #define HIGH_HEADER_LEN 14 |
| 41 | 8 | #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数で変わる | |
| 43 | 10 | |
| 44 | 11 | int sec_file_open(FILE **fp, AdData *D); |
| 45 | 12 | int sec_file_out(FILE *fp, char *out, int len); |
| @@ -6,6 +6,7 @@ | ||
| 6 | 6 | |
| 7 | 7 | #include "conf.h" |
| 8 | 8 | #include "debug_print.h" |
| 9 | +#include "ad_ring.h" | |
| 9 | 10 | |
| 10 | 11 | // ミューテックス |
| 11 | 12 | static pthread_mutex_t mutex_conf = PTHREAD_MUTEX_INITIALIZER; |
| @@ -67,6 +68,28 @@ int conf_linux_time_set_get(void) | ||
| 67 | 68 | return linux_time_set; |
| 68 | 69 | } |
| 69 | 70 | |
| 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 | + | |
| 70 | 93 | // |
| 71 | 94 | /**** 設定ファイル ******************************************* |
| 72 | 95 | */ |
| @@ -159,9 +182,10 @@ int conf_read(void) | ||
| 159 | 182 | FILE *fp; |
| 160 | 183 | char buf[256]; |
| 161 | 184 | // char buf2[256]; |
| 185 | + char buf2[CONF_RECPATH_MAX]; | |
| 162 | 186 | int f; |
| 163 | 187 | int val; |
| 164 | - | |
| 188 | + | |
| 165 | 189 | fp = fopen(CONF_FILE, "rt"); |
| 166 | 190 | if (fp == NULL) { |
| 167 | 191 | syslog(LOG_ERR, "conf_read(): conf file not found. %s", CONF_FILE); |
| @@ -190,6 +214,17 @@ int conf_read(void) | ||
| 190 | 214 | conf_linux_time_set_set(val); |
| 191 | 215 | syslog(LOG_INFO, "linux_time_set=%d", conf_linux_time_set_get()); |
| 192 | 216 | } |
| 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 | + } | |
| 193 | 228 | } |
| 194 | 229 | fclose(fp); |
| 195 | 230 | return 0; |
| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | |
| 4 | 4 | // 設定ファイル |
| 5 | 5 | #define CONF_FILE "/etc/scilog.conf" |
| 6 | +#define CONF_RECPATH_MAX 256 | |
| 6 | 7 | |
| 7 | 8 | void conf_freq_set(int f); |
| 8 | 9 | int conf_freq_get(void); |
| @@ -13,6 +14,12 @@ int conf_gain_get(void); | ||
| 13 | 14 | void conf_linux_time_set_set(int val); |
| 14 | 15 | int conf_linux_time_set_get(void); |
| 15 | 16 | |
| 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 | + | |
| 16 | 23 | int conf_read(void); |
| 17 | 24 | |
| 18 | 25 | #endif |
| @@ -25,6 +25,21 @@ | ||
| 25 | 25 | * thread_disp.c 毎分1回 LCD初期化する |
| 26 | 26 | * i2cLCD基板の自動初期化機能は、2行設定で初期化されるので使用しない |
| 27 | 27 | * |
| 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 | + * | |
| 28 | 43 | * ●コンパイル方法 |
| 29 | 44 | * . environment-setup-cortexa8hf-vfp-neon-poky-linux-gnueabi |
| 30 | 45 | * make |
| @@ -71,7 +86,7 @@ | ||
| 71 | 86 | // ダミーデータを自分で発生するときに定義 |
| 72 | 87 | //#define DUMMY |
| 73 | 88 | |
| 74 | -#define VERSION "1.0.3" | |
| 89 | +#define VERSION "1.0.4" | |
| 75 | 90 | |
| 76 | 91 | #define DEV_SPI "/dev/spikead" |
| 77 | 92 |
| @@ -80,6 +95,9 @@ | ||
| 80 | 95 | #define CONF_FREQ_DEF 50 |
| 81 | 96 | #define CONF_GAIN_DEF SPI_CMD_GAIN_1P4 |
| 82 | 97 | #define CONF_LINUX_TIME_SET_DEF 1 // ON |
| 98 | +// データ記録用dir 末尾に/付けない | |
| 99 | +#define CONF_RECPATH_DEF "/home/data" | |
| 100 | +#define CONF_RECCHN_DEF 6 | |
| 83 | 101 | |
| 84 | 102 | // |
| 85 | 103 | /**** signal *********************************************************** |
| @@ -134,11 +152,15 @@ int main (int argc, char *argv[]) | ||
| 134 | 152 | conf_freq_set(CONF_FREQ_DEF); |
| 135 | 153 | conf_gain_set(CONF_GAIN_DEF); |
| 136 | 154 | conf_linux_time_set_set(CONF_LINUX_TIME_SET_DEF); |
| 155 | + conf_recpath_set(CONF_RECPATH_DEF); | |
| 156 | + conf_recchn_set(CONF_RECCHN_DEF); | |
| 137 | 157 | // 設定ファイル読み込み |
| 138 | 158 | conf_read(); |
| 139 | 159 | PDEBUG("freq=%d\n", conf_freq_get()); |
| 140 | 160 | PDEBUG("gain=%d\n", conf_gain_get()); |
| 141 | 161 | 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()); | |
| 142 | 164 | lcd_print("*"); |
| 143 | 165 | |
| 144 | 166 | PDEBUG("sciLogger %s START\n", VERSION); |
| @@ -87,14 +87,25 @@ int ProcRec(void) | ||
| 87 | 87 | AdData *d; |
| 88 | 88 | FILE *fp = NULL; |
| 89 | 89 | 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 | + } | |
| 91 | 102 | // |
| 92 | 103 | /**** 1secデータ記録 |
| 93 | 104 | */ |
| 94 | 105 | /* |
| 95 | - パケットバッファにデータたまった? | |
| 106 | + パケットバッファにデータたまった? or 書込タイミング? | |
| 96 | 107 | */ |
| 97 | - if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM) { | |
| 108 | + if (ad_ring_num_get_sec() >= SEC_FLUSH_NUM || secw) { | |
| 98 | 109 | // データ取り出し |
| 99 | 110 | d = ad_ring_get(ad_ring_read_get_sec()); |
| 100 | 111 | // ファイルオープン |
| @@ -164,7 +175,7 @@ PDEBUG("\r\n"); | ||
| 164 | 175 | /* |
| 165 | 176 | パケットバッファにデータたまった? |
| 166 | 177 | */ |
| 167 | - if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM) { | |
| 178 | + if (ad_ring_num_get_high() >= HIGH_FLUSH_NUM || highw) { | |
| 168 | 179 | // データ取り出し |
| 169 | 180 | d = ad_ring_get(ad_ring_read_get_high()); |
| 170 | 181 | // ファイルオープン |