OSDN Git Service

check sum calc add
authorNaoya Takamura <ntaka206@users.sourceforge.jp>
Fri, 16 Dec 2011 16:00:44 +0000 (01:00 +0900)
committerNaoya Takamura <ntaka206@users.sourceforge.jp>
Fri, 16 Dec 2011 16:00:44 +0000 (01:00 +0900)
conf.c:
gain関係set/get add
main.c:
 PICへのgain設定送信コード追加
 起動時にGain設定追加
thread_disp.c:
 LCD表示追加

Makefile
conf.c
conf.h
my_thread.h
scilog
scilog.c
spi.c
spi.h
thread_disp.c [new file with mode: 0644]
thread_rcv.c

index 8b06506..309634d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@ INCDIR = ${STAGEDIR}/include
 
 TARGET = scilog
 
-OBJS = scilog.o spi.o thread_rcv.o ring.o ad_ring.o thread_rec.o sts.o ad_file.o conf.o lcd.o
+OBJS = scilog.o spi.o thread_rcv.o ring.o ad_ring.o thread_rec.o sts.o ad_file.o conf.o lcd.o thread_disp.o
 
 HDRS           = mes_print.h debug_print.h spi.h my_thread.h ring.h ad_ring.h thread_rec.h sts.h ad_file.h conf.h lcd.h
 
diff --git a/conf.c b/conf.c
index 31fc2e7..e8272cb 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -30,6 +30,29 @@ pthread_mutex_lock(&mutex_conf);
 pthread_mutex_unlock(&mutex_conf);
        return f;
 }
+//
+/**** Gain ***************************************************
+*/
+/*
+       0=1/8, 1=1/4, 2=1/2, 3=1, 4=2, 5=4
+       6=8, 7=16, 8=32, 9=64, 10=128
+*/
+static int     gain;
+
+void conf_gain_set(int f)
+{
+pthread_mutex_lock(&mutex_conf);
+       gain = f;
+pthread_mutex_unlock(&mutex_conf);
+}
+int conf_gain_get(void)
+{
+       int     f;
+pthread_mutex_lock(&mutex_conf);
+       f = gain;
+pthread_mutex_unlock(&mutex_conf);
+       return f;
+}
 
 //
 /**** 設定ファイル *******************************************
@@ -143,6 +166,11 @@ int conf_read(void)
                        conf_freq_set(f);
                        syslog(LOG_INFO, "freq=%d", conf_freq_get());
                } 
+               // Gain
+               if (sscanf(buf, "gain = %d", &f) == 1) {
+                       conf_gain_set(f);
+                       syslog(LOG_INFO, "gain=%d", conf_gain_get());
+               } 
        }
        fclose(fp);
        return 0;
diff --git a/conf.h b/conf.h
index 41949a5..b55a177 100644 (file)
--- a/conf.h
+++ b/conf.h
@@ -6,6 +6,10 @@
 \r
 void conf_freq_set(int f);\r
 int conf_freq_get(void);\r
+\r
+void conf_gain_set(int f);\r
+int conf_gain_get(void);\r
+\r
 int conf_read(void);\r
 \r
 #endif\r
index 10976f1..08ca0aa 100644 (file)
@@ -2,6 +2,7 @@
 #define        __MY_THREAD_H__
 
 void* thread_rcv(void* pParam);
+void* thread_disp(void* pParam);
 
 #ifdef CUNIT
        #include <CUnit/CUnit.h>
diff --git a/scilog b/scilog
index c1c6997..f15cf32 100755 (executable)
Binary files a/scilog and b/scilog differ
index bc150d3..932fd84 100644 (file)
--- a/scilog.c
+++ b/scilog.c
@@ -46,7 +46,7 @@
 /**** 設定デフォルト値
 */
 #define        CONF_FREQ_DEF   50
-
+#define        CONF_GAIN_DEF   SPI_CMD_GAIN_1P4
 
 //
 /**** signal ***********************************************************
@@ -76,7 +76,7 @@ void sig_handler(int sig)
 */
 int main (int argc, char *argv[])
 {
-       pthread_t       tid_rcv;
+       pthread_t       tid_rcv, tid_disp;
 //     char    buf[512];
        
        signal(SIGINT, sig_handler);
@@ -98,9 +98,11 @@ int main (int argc, char *argv[])
 
        // デフォルト設定
        conf_freq_set(CONF_FREQ_DEF);
+       conf_gain_set(CONF_GAIN_DEF);
        // 設定ファイル読み込み
        conf_read();
        PDEBUG("freq=%d\n", conf_freq_get());
+       PDEBUG("gain=%d\n", conf_gain_get());
        lcd_print("*");
 
        PDEBUG("sciLogger %s START\n", VERSION);
@@ -115,20 +117,34 @@ int main (int argc, char *argv[])
        lcd_print("*");
 
 //
+/**** PGA設定
+*/
+       spi_cmd_send_gain(conf_gain_get());
+       lcd_print("*");
+//
 /**** スレッド生成
 */
-       // SPI RCV
+       // SPI RCVと平均
        if (pthread_create(&tid_rcv, NULL, thread_rcv, NULL) != 0) {
                perror("pthread_create(SPI RCV)");
-               exit(EXIT_FAILURE);
+               goto END;
        } else {
                PDEBUG("SPI RCV thread create\n");
        }
        lcd_print("*");
+       // 表示
+       if (pthread_create(&tid_disp, NULL, thread_disp, NULL) != 0) {
+               perror("pthread_create(DISP)");
+               goto END;
+       } else {
+               PDEBUG("DISP thread create\n");
+       }
+       lcd_print("*");
 
 //
 /**** メインループ 記録 ************************
 */
+       // 記録スレッド
        thread_rec(NULL);
 END:
        sig_handler(0);
diff --git a/spi.c b/spi.c
index 1ace209..a6f745b 100644 (file)
--- a/spi.c
+++ b/spi.c
@@ -3,8 +3,10 @@
 #include <sys/ioctl.h>\r
 //#include <termios.h>\r
 #include <fcntl.h>\r
+#include <string.h>\r
 \r
 #include "spi.h"\r
+#include "ad_ring.h"\r
 \r
 static int     fd_spi = -1;\r
 \r
@@ -66,3 +68,34 @@ int spi_rcvd_len_get(void)
        spi_ioctl(CMD_RECEIVED_LEN_GET, &i);\r
        return i;\r
 }\r
+// コマンド送信\r
+void spi_cmd_send(char cmd_code, char *cmd_data, int data_len)\r
+{\r
+       char    cmd[SPI_CMD_LEN];\r
+       \r
+       memset(cmd, 0, SPI_CMD_LEN);\r
+\r
+       cmd[SPI_CMD_OFS_HEAD] = SPI_HEAD_CHAR;\r
+       cmd[SPI_CMD_OFS_CMDCODE] = cmd_code;\r
+\r
+       // data\r
+       if (data_len > (SPI_CMD_LEN - SPI_CMD_OFS_CMDDATA)) {\r
+               data_len = SPI_CMD_LEN - SPI_CMD_OFS_CMDDATA;\r
+       }\r
+       memcpy(&cmd[SPI_CMD_OFS_CMDDATA], cmd_data, data_len);\r
+\r
+       spi_tx_set(cmd);\r
+}\r
+// Gainコマンド送信\r
+void spi_cmd_send_gain(int gain)\r
+{\r
+       char    cmd[SPI_CMD_LEN];\r
+       int     i;\r
+       \r
+       memset(cmd, 0, SPI_CMD_LEN);\r
+\r
+       for(i = 0; i < AD_CHNUM; i++)\r
+               cmd[i] = gain;\r
+       spi_cmd_send(SPI_CMDCODE_GAIN, cmd, AD_CHNUM);\r
+}\r
+\r
diff --git a/spi.h b/spi.h
index da14418..3e33a99 100644 (file)
--- a/spi.h
+++ b/spi.h
@@ -1,9 +1,9 @@
 #if    !defined(__SPI_H__)\r
 #define        __SPI_H__\r
 \r
+// ioctlコマンド\r
 // SPI受信データ取得\r
 #define        CMD_RX_GET      11\r
-\r
 // SPI送信データ長セット\r
 #define        CMD_TX_LEN      12\r
 // SPI送信データセット PICへのコマンド\r
@@ -16,7 +16,7 @@
 #define        CMD_RECEIVED_LEN_GET    20\r
 \r
 // SPIで受信するデータ長 固定長 $含む\r
-#define        SPI_DATA_LEN    965\r
+#define        SPI_DATA_LEN    (965)\r
 // SPI受信データの先頭文字 送信コマンドでも使用\r
 #define        SPI_HEAD_CHAR   '$'\r
 \r
 // SPI受信データ Checksum 長さ\r
 #define        SPI_CHECKSUM_LEN        2\r
 \r
-// SPI送信するコマンド長 固定長 $含む\r
-#define        SPI_CMD_LEN     20\r
-\r
-\r
 // SPI受信データの先頭からのオフセット\r
-#define        SPI_OFS_GPS     (19)\r
+#define        SPI_OFS_RESCODE 1\r
+#define        SPI_OFS_RESDATA 2\r
+#define        SPI_OFS_GPS             (19)\r
 #define        SPI_OFS_1SEC    (39)\r
 #define        SPI_OFS_DATA    (63)\r
+#define        SPI_OFS_SUM             963\r
 \r
+// SPI送信コマンド長 固定長 $含む\r
+#define        SPI_CMD_LEN     20\r
+\r
+// SPI送信コマンド フィールドのオフセット位置\r
+#define        SPI_CMD_OFS_HEAD        0\r
+#define        SPI_CMD_OFS_CMDCODE     1\r
+#define        SPI_CMD_OFS_CMDDATA     2\r
 \r
+// SPIコマンドコード\r
+#define        SPI_CMDCODE_GAIN        1\r
+\r
+// SPIコマンドGainの設定値\r
+#define        SPI_CMD_GAIN_1P8        0       // 1/8\r
+#define        SPI_CMD_GAIN_1P4        1       // 1/4\r
+#define        SPI_CMD_GAIN_1P2        2       // 1/2\r
+#define        SPI_CMD_GAIN_1          3\r
+#define        SPI_CMD_GAIN_2          4\r
+#define        SPI_CMD_GAIN_4          5\r
+#define        SPI_CMD_GAIN_8          6\r
+#define        SPI_CMD_GAIN_16         7\r
+#define        SPI_CMD_GAIN_32         8\r
+#define        SPI_CMD_GAIN_64         9\r
+#define        SPI_CMD_GAIN_128        10\r
 \r
 \r
 int spi_get_fd(void);\r
@@ -50,4 +71,7 @@ void spi_buf_clear(void);
 int spi_dnum_get(void);\r
 int spi_rcvd_len_get(void);\r
 \r
+void spi_cmd_send(char cmd_code, char *cmd_data, int data_len);\r
+void spi_cmd_send_gain(int gain);\r
+\r
 #endif\r
diff --git a/thread_disp.c b/thread_disp.c
new file mode 100644 (file)
index 0000000..fcd49e4
--- /dev/null
@@ -0,0 +1,94 @@
+#include <stdio.h>
+
+#include "ad_ring.h"
+#include "lcd.h"
+
+static void scr_init(void)
+{
+       int     iLeft = 0;
+       int     iY = 0;
+       
+       lcd_clear();
+
+       lcd_pos(iLeft, iY);
+       lcd_print("TIME:");
+       iY++;
+//     lcd_pos(iLeft, iY);
+//     lcd_print("STS:");
+//     iY++;
+       lcd_pos(iLeft, iY);
+       lcd_print("HX:");
+       iY++;
+       lcd_pos(iLeft, iY);
+       lcd_print("HY:");
+       iY++;
+       lcd_pos(iLeft, iY);
+       lcd_print("HZ:");
+       iY++;
+}
+
+/*
+
+*/
+static void scr_disp_time(AdData *d)
+{
+       int     iLeft, iY;
+       char    buf[128];
+       struct tm *t;
+       
+       t = &(d->t);
+       iLeft = 0;
+       iY = 0;
+       /*      Time */
+       lcd_pos(iLeft, iY++);
+       sprintf(buf, "%02d/%02d/%02d %02d:%02d:%02d %02X",
+               t->tm_year % 100, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec,
+               d->gps.valid);
+       lcd_print(buf);
+}
+/*
+
+*/
+static void scr_disp_ad(AdData *d)
+{
+       int     iLeft, iY;
+       char    buf[128];
+       int     ch = 0;
+       
+       iLeft = 0;
+       iY = 1;
+       for(ch = 0; ch < 3; ch++) {
+               sprintf(buf, "%d% 8ld", ch+1, d->data1sec[ch]);
+               lcd_pos(iLeft, iY++);
+               lcd_print(buf);
+       }
+       iLeft = 10;
+       iY = 1;
+       for(ch = 3; ch < 6; ch++) {
+               sprintf(buf, "%d% 8ld", ch+1, d->data1sec[ch]);
+               lcd_pos(iLeft, iY++);
+               lcd_print(buf);
+       }
+}
+
+void* thread_disp(void* pParam)
+{
+       int     i;
+       AdData *d;
+
+       i = ad_ring_latest_get();
+//     scr_init();
+       lcd_clear();
+       while(1) {
+               // FG表示
+               if (i != ad_ring_latest_get()) {
+                       i = ad_ring_latest_get();
+                       // データ取得
+                       d = ad_ring_get(i);
+                       // 時刻表示
+                       scr_disp_time(d);
+                       // AD表示
+                       scr_disp_ad(d);
+               }
+       }
+}
index 78452f9..eaf1bf1 100644 (file)
@@ -70,7 +70,7 @@ static int decode(char *buf, AdData *ad)
                }\r
        }\r
        // Checksum\r
-       memcpy(&(ad->checksum), ptr, SPI_CHECKSUM_LEN);\r
+       ad->checksum = *((u_int16_t*)ptr);\r
        \r
        // gps->struct tm\r
        ad->t.tm_year = gps->year - 1900;\r
@@ -105,6 +105,21 @@ static void do_avg(int freq, AdData *ad)
                }\r
        }\r
 }\r
+static unsigned int sum_calc(char *buf)\r
+{\r
+       int     i;\r
+       u_int8_t        suma = 0;\r
+       u_int8_t        sumb = 0;\r
+       u_int16_t       uint_sum;\r
+\r
+       for(i = SPI_OFS_RESCODE; i < SPI_OFS_SUM; i++) {\r
+               suma += (u_int8_t)buf[i];\r
+               sumb += suma;\r
+       }\r
+       uint_sum = ((sumb << 8) & 0xFF00U) | suma;\r
+       return uint_sum;\r
+}\r
+\r
 void* thread_rcv(void* pParam)\r
 {\r
 \r
@@ -113,6 +128,7 @@ void* thread_rcv(void* pParam)
        int     i;\r
        int     fd_spi;\r
        AdData  ad, *ad_ptr;\r
+       unsigned int    sum;\r
 #if 0\r
 char   cmd[SPI_CMD_LEN];\r
 char   c;\r
@@ -135,12 +151,12 @@ c=0;
                if(FD_ISSET(fd_spi, &fds)) {\r
 #if 0\r
 // SPI送信データセット\r
-memset(cmd, 0, SPI_CMD_LEN);\r
-cmd[0] = SPI_HEAD_CHAR;\r
-cmd[1] = 1;\r
-cmd[2] = 2;\r
-cmd[3] = c++;\r
-spi_tx_set(cmd);\r
+if (c++ % 5 == 0) {\r
+       memset(cmd, 0, SPI_CMD_LEN);\r
+       for(i = 0; i < AD_CHNUM; i++)\r
+               cmd[i] = SPI_CMD_GAIN_128;\r
+       spi_cmd_send(SPI_CMDCODE_GAIN, cmd, AD_CHNUM);\r
+}\r
 #endif\r
                        // 受信した\r
                        i = spi_dnum_get();\r
@@ -151,14 +167,19 @@ spi_tx_set(cmd);
                                spi_rx_get(buf);\r
                                // デコード\r
                                decode(buf, &ad);\r
+                               // chekcsum check\r
+                               sum = sum_calc(buf);\r
+                               if (sum != ad.checksum) {\r
+                                       PDEBUG("thread_rcv(): SUM ERR! CALC=%04X RCV=%04X\r\n", sum, ad.checksum);\r
+                               }\r
+                               // 平均\r
                                ad.freq = conf_freq_get();\r
-                               // 平均 仮コード 要変更\r
                                do_avg(AD_SAMPLE, &ad);\r
 #if 1\r
 int    ch;\r
-PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",\r
+PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X,%d",\r
        ad.gps.year, ad.gps.month, ad.gps.day, ad.gps.hour, ad.gps.min, ad.gps.sec, ad.gps.nano,\r
-       ad.gps.tow, ad.gps.tacc, ad.gps.valid);\r
+       ad.gps.tow, ad.gps.tacc, ad.gps.valid, ad.rescode);\r
 for(ch = 0; ch < AD_CHNUM; ch++) {\r
        PDEBUG(",%+7ld", ad.data1sec[ch]);\r
 }\r