OSDN Git Service

LCDがリセットされて表示が更新されなくなる問題に対応
[scilog/scilog.git] / scilog.c
1 /*
2  * scilog.c
3  * sciLogger Logger Program
4  * NT System Design
5  * 
6  **** Ver1.0.1
7  * conf_linux_time_set_XXX() add?
8  * thread_disp.cでGPS時刻をlinuxにset
9  * 
10  **** Ver1.0.2
11  * 2015/09/22
12  * lcd.c i2clcd_init() i2cLCD基板のConfig変更 LCD自動初期化ON
13  *
14  **** Ver1.0.3
15  * Kernel 3.18.18 対応
16  * i2cデバイス名変更
17  * spiデバイス名変更 ->/dev/spikead spikeadデバイス側で変更したため
18  * ad_ring.h AdDataのADデータ型をlong->int32_tに変更
19  *      data1sec[]
20  *      data[][]
21  *      avg[][]
22  * thread_rcv.c b3_to_long32() 返り値long->int32_tにした
23  * 
24  * LCDがリセットされて表示が更新されなくなる問題に対応
25  * thread_disp.c 毎分1回 LCD初期化する
26  * i2cLCD基板の自動初期化機能は、2行設定で初期化されるので使用しない
27  * 
28  * ●コンパイル方法
29  * . environment-setup-cortexa8hf-vfp-neon-poky-linux-gnueabi
30  * make
31  * 
32  */
33 #include <stdio.h>
34 #include <string.h>
35 #include <time.h>
36 #include <math.h>
37 #include <sys/types.h>
38 #include <unistd.h>
39 #include <errno.h>
40 #include <stdarg.h>
41 //#include <getopt.h>
42 #include <stdlib.h>
43 #include <assert.h>
44 #include <signal.h>
45 #include <pthread.h>
46 #include <syslog.h>
47
48 #include <stdint.h>
49 #include <sys/ioctl.h>
50 #include <fcntl.h>
51 #include <linux/i2c-dev.h> /* for I2C_SLAVE */
52
53 #include <sys/stat.h>
54
55 #include "my_thread.h"
56 #include "spi.h"
57 #include "ad_ring.h"
58 #include "sts.h"
59 #include "thread_rec.h"
60 #include "conf.h"
61 #include "ad_file.h"
62 #include "lcd.h"
63
64 // debug_print.h内で#define   DEBUG_PRINTしているので
65 // リリース時は、debug_print.hでコメントする
66 #include "debug_print.h"
67
68 #define MES_PRINT
69 #include        "mes_print.h"
70
71 // ダミーデータを自分で発生するときに定義
72 //#define       DUMMY
73
74 #define VERSION "1.0.3"
75
76 #define DEV_SPI "/dev/spikead"
77
78 /**** 設定デフォルト値
79 */
80 #define CONF_FREQ_DEF   50
81 #define CONF_GAIN_DEF   SPI_CMD_GAIN_1P4
82 #define CONF_LINUX_TIME_SET_DEF 1       // ON
83
84 //
85 /**** signal ***********************************************************
86 */
87 void cleanup(void)
88 {
89         spi_close();
90 }
91 void sig_handler(int sig)
92 {
93         char    szBuf[128];
94         static int      busy = 0;
95
96         if (busy) return;
97         busy = 1;
98
99         sprintf(szBuf, "signal trap. signal=%d\n", sig);
100         PDEBUG("%s", szBuf);
101         fflush(stdout);
102         fflush(stderr);
103
104         cleanup();
105         exit(0);
106 }
107 //
108 /**** main
109 */
110 int main (int argc, char *argv[])
111 {
112         pthread_t       tid_rcv, tid_disp;
113 //      char    buf[512];
114         
115         signal(SIGINT, sig_handler);
116         signal(SIGQUIT, sig_handler);
117         signal(SIGKILL, sig_handler);
118         signal(SIGTERM, sig_handler);
119
120         lcd_init();
121         lcd_pos(0, 1);
122         lcd_print("sciLogger ");
123         lcd_print(VERSION);
124         lcd_pos(0, 3);
125
126         ad_ring_init();
127         sts_init();
128
129 //printf("%d\n", sizeof(UbloxNavTimeUtcRecType));
130 //printf("%d\n", sizeof(HighSampleRecType));
131 //goto END;
132
133         // デフォルト設定
134         conf_freq_set(CONF_FREQ_DEF);
135         conf_gain_set(CONF_GAIN_DEF);
136         conf_linux_time_set_set(CONF_LINUX_TIME_SET_DEF);
137         // 設定ファイル読み込み
138         conf_read();
139         PDEBUG("freq=%d\n", conf_freq_get());
140         PDEBUG("gain=%d\n", conf_gain_get());
141         PDEBUG("linux_time_set=%d\n", conf_linux_time_set_get());
142         lcd_print("*");
143
144         PDEBUG("sciLogger %s START\n", VERSION);
145         sleep(1);
146 //
147 /**** デバイスOPEN
148 */
149         if (spi_open(DEV_SPI) < 0) {
150                 perror("spi_open() ERROR!");
151                 goto END;
152         }
153         lcd_print("*");
154
155 //
156 /**** PGA設定
157 */
158         spi_cmd_send_gain(conf_gain_get());
159         lcd_print("*");
160 //
161 /**** スレッド生成
162 */
163         // SPI RCVと平均
164         if (pthread_create(&tid_rcv, NULL, thread_rcv, NULL) != 0) {
165                 perror("pthread_create(SPI RCV)");
166                 goto END;
167         } else {
168                 PDEBUG("SPI RCV thread create\n");
169         }
170         lcd_print("*");
171         // 表示
172         if (pthread_create(&tid_disp, NULL, thread_disp, NULL) != 0) {
173                 perror("pthread_create(DISP)");
174                 goto END;
175         } else {
176                 PDEBUG("DISP thread create\n");
177         }
178         lcd_print("*");
179
180 //
181 /**** メインループ 記録 ************************
182 */
183         // 記録スレッド
184         thread_rec(NULL);
185 END:
186         sig_handler(0);
187
188         return 0;
189 }