OSDN Git Service

Initial commit
authorNaoya Takamura <ntaka@nt-sys.jp>
Thu, 8 Dec 2011 11:19:21 +0000 (20:19 +0900)
committerNaoya Takamura <ntaka@nt-sys.jp>
Thu, 8 Dec 2011 11:19:21 +0000 (20:19 +0900)
.gitignore [new file with mode: 0755]
Makefile [new file with mode: 0644]
debug_print.h [new file with mode: 0755]
mes_print.h [new file with mode: 0644]
my_thread.h [new file with mode: 0644]
scilog [new file with mode: 0755]
scilog.c [new file with mode: 0644]
spi.c [new file with mode: 0644]
spi.h [new file with mode: 0644]
thread_rcv.c [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100755 (executable)
index 0000000..d8c6ab2
--- /dev/null
@@ -0,0 +1 @@
+*.o\r
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..cbb33cb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,44 @@
+# Makefile for building with the OE cross tools 
+#
+# OVEROTOP is normally ${HOME}/overo-oe 
+#
+# OETMP is the same as TMPDIR as defined in ${OVEROTOP}/build/conf/site.conf
+#
+
+OETMP = ${OVEROTOP}/tmp
+
+# There were some OE toolchain path changes recently
+   
+# OE prior to around 30July2010 
+# TOOLDIR = ${OETMP}/cross/armv7a/bin
+# STAGEDIR = ${OETMP}/staging/armv7a-angstrom-linux-gnueabi/usr
+   
+# OE after 30July2010
+TOOLDIR = ${OETMP}/sysroots/`uname -m`-linux/usr/armv7a/bin
+STAGEDIR = ${OETMP}/sysroots/armv7a-angstrom-linux-gnueabi/usr
+
+CC = ${TOOLDIR}/arm-angstrom-linux-gnueabi-gcc
+
+# for DEBUG
+#CFLAGS = -Wall -lm -lpthread -DDEBUG_FILE_MIN -DDEBUG_FILE_MIN_PERIOD=1
+
+CFLAGS = -Wall -lm -lpthread
+
+LIBDIR = ${STAGEDIR}/lib
+
+INCDIR = ${STAGEDIR}/include      
+
+TARGET = scilog
+
+OBJS = scilog.o spi.o thread_rcv.o
+
+HDRS           = mes_print.h debug_print.h spi.h my_thread.h
+
+${TARGET} : $(OBJS) $(HDRS) 
+       ${CC} ${CFLAGS} ${OBJS} -L ${LIBDIR} -o ${TARGET}
+
+#meas.o: meas.c 
+#      ${CC} ${CFLAGS} -I ${INCDIR} -c meas.c  
+
+clean:
+       rm -f ${TARGET} ${OBJS} *~
diff --git a/debug_print.h b/debug_print.h
new file mode 100755 (executable)
index 0000000..f09996b
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+       本番では抑制するデバッグメッセージ
+*/
+#undef PDEBUG
+#undef PDEBUGF
+#undef PDEBUGF_ERR
+#undef PDEBUGF_NULL
+
+// リリース時はコメント
+#define        DEBUG_PRINT
+
+#ifdef DEBUG_PRINT
+#  ifdef __KERNEL__
+#    define PDEBUG(fmt, args...) printk(KERN_DEBUG "scull: " fmt, ## args)
+#  else
+// ノーマル
+#    define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
+
+// 関数名付き
+#    define PDEBUGF(fmt, args...) \
+       fprintf(stderr, "%s() ", __FUNCTION__); \
+       fprintf(stderr, fmt, ## args); \
+       fflush(stderr)
+// エラー
+#    define PDEBUGF_ERR(fmt, args...) \
+       fprintf(stderr, "%s() ", __FUNCTION__); \
+       fprintf(stderr, fmt, ## args); \
+               perror("errno string"); \
+       fflush(stderr)
+// NULLチェック
+#define        PDEBUGF_NULL(var) \
+               if (var == NULL) { \
+                       fprintf(stderr, "%s() ", __FUNCTION__); \
+                       fprintf(stderr, "%s==NULL\n", #var); \
+                       fflush(stderr); \
+               }
+#  endif
+       
+
+#else
+#  define PDEBUG(fmt, args...)
+#  define PDEBUGF(fmt, args...)
+#  define PDEBUGF_ERR(fmt, args...)
+#  define      PDEBUGF_NULL(var)
+#endif
+
diff --git a/mes_print.h b/mes_print.h
new file mode 100644 (file)
index 0000000..00d5757
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+       本番でも出力するメッセージ
+*/
+#if !defined(__MES_PRINT_H__)
+#define        __MES_PRINT_H__
+
+#include <stdio.h>
+#include <errno.h>
+
+#define        MES_PRINT
+
+#undef PMES
+#undef PMESF
+#undef PERR
+#undef PERRF
+#undef PMESF_NULL
+
+#ifdef MES_PRINT
+// ノーマル
+#  define PMES(fmt, args...) fprintf(stdout, fmt, ## args)
+
+// 関数名付き
+#  define PMESF(fmt, args...) \
+       fprintf(stdout, "%s() ", __FUNCTION__); \
+       fprintf(stdout, fmt, ## args)
+
+// エラー
+#  define PERR(fmt, args...) \
+       fprintf(stderr, fmt, ## args)
+// エラー 関数名付き
+#  define PERRF(fmt, args...) \
+       fprintf(stderr, "%s() ", __FUNCTION__); \
+       fprintf(stderr, fmt, ## args)
+// NULLチェック
+#define        PMESF_NULL(var) \
+       if (var == NULL) { \
+               fprintf(stderr, "%s() ", __FUNCTION__); \
+               fprintf(stderr, "%s==NULL\n", #var); \
+               fflush(stderr); \
+       }
+#else
+#  define PMES(fmt, args...)
+#  define PMESF(fmt, args...)
+#  define PERR(fmt, args...)
+#  define PERRF(fmt, args...)
+#  define PMESF_NULL(var)
+#endif
+
+#endif
diff --git a/my_thread.h b/my_thread.h
new file mode 100644 (file)
index 0000000..de034b9
--- /dev/null
@@ -0,0 +1,6 @@
+#if    !defined(__MY_THREAD_H__)
+#define        __MY_THREAD_H__
+
+void* thread_rcv(void* pParam);
+
+#endif
diff --git a/scilog b/scilog
new file mode 100755 (executable)
index 0000000..4d6aa72
Binary files /dev/null and b/scilog differ
diff --git a/scilog.c b/scilog.c
new file mode 100644 (file)
index 0000000..756cd89
--- /dev/null
+++ b/scilog.c
@@ -0,0 +1,126 @@
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <math.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdarg.h>
+//#include <getopt.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <signal.h>
+#include <pthread.h>
+#include <syslog.h>
+
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <linux/i2c-dev.h> /* for I2C_SLAVE */
+
+#include <sys/stat.h>
+
+#include "my_thread.h"
+#include "spi.h"
+
+// debug_print.h内で#define  DEBUG_PRINTしているので
+// リリース時は、debug_print.hでコメントする
+#include "debug_print.h"
+
+#define        MES_PRINT
+#include       "mes_print.h"
+
+// ダミーデータを自分で発生するときに定義
+//#define      DUMMY
+
+#define        VERSION "1.0"
+
+#define        DEV_SPI "/dev/spike-ad"
+
+/**** 設定デフォルト値
+*/
+//#define      SID_DEF "DEF"
+
+
+//
+/**** signal ***********************************************************
+*/
+void cleanup(void)
+{
+       spi_close();
+}
+void sig_handler(int sig)
+{
+       char    szBuf[128];
+       static int      busy = 0;
+
+       if (busy) return;
+       busy = 1;
+
+       sprintf(szBuf, "signal trap. signal=%d\n", sig);
+       PDEBUG("%s", szBuf);
+       fflush(stdout);
+       fflush(stderr);
+
+       cleanup();
+       exit(0);
+}
+//
+/**** main
+*/
+int main (int argc, char *argv[])
+{
+       pthread_t       tid_rcv;
+//     char    buf[512];
+       
+       signal(SIGINT, sig_handler);
+       signal(SIGQUIT, sig_handler);
+       signal(SIGKILL, sig_handler);
+       signal(SIGTERM, sig_handler);
+
+//     lcd_init();
+//     lcd_pos(6, 1);
+//     lcd_print("sciLogger");
+//     lcd_pos(0, 3);
+
+       // デフォルト設定
+//     sid_set(SID_DEF);
+       // 設定ファイル読み込み
+//     conf_read();
+//     PDEBUG("sid=%s\n", sid_getp());
+//     lcd_print("*");
+
+       PDEBUG("sciLogger %s START\n", VERSION);
+       sleep(1);
+//
+/**** デバイスOPEN
+*/
+       if (spi_open(DEV_SPI) < 0) {
+               perror("spi_open() ERROR!");
+               goto END;
+       }
+//     lcd_print(fd_lcd0, "*");
+
+//
+/**** スレッド生成
+*/
+       // SPI RCV
+       if (pthread_create(&tid_rcv, NULL, thread_rcv, NULL) != 0) {
+               perror("pthread_create(SPI RCV)");
+               exit(EXIT_FAILURE);
+       } else {
+               PDEBUG("SPI RCV thread create\n");
+       }
+//     lcd_print("*");
+
+//
+/**** メインループ 記録 ************************
+*/
+       while(1) {
+               sleep(1);
+       } // メインループ終わり
+END:
+       sig_handler(0);
+
+       return 0;
+}
diff --git a/spi.c b/spi.c
new file mode 100644 (file)
index 0000000..1ace209
--- /dev/null
+++ b/spi.c
@@ -0,0 +1,68 @@
+#include <stdio.h>\r
+#include <unistd.h>\r
+#include <sys/ioctl.h>\r
+//#include <termios.h>\r
+#include <fcntl.h>\r
+\r
+#include "spi.h"\r
+\r
+static int     fd_spi = -1;\r
+\r
+int spi_get_fd(void)\r
+{\r
+       return fd_spi;\r
+}\r
+int spi_open(char *dev)\r
+{\r
+       fd_spi = open(dev, O_RDWR);\r
+       return fd_spi;\r
+}\r
+/*\r
+       デバイスへのioctl\r
+*/\r
+int spi_ioctl(int cmd, void *p)\r
+{\r
+       return ioctl(fd_spi, cmd, p);\r
+}\r
+\r
+int spi_close(void)\r
+{\r
+       return close(fd_spi);\r
+}\r
+\r
+// 送信データ長セット\r
+void spi_tx_len_set(int len)\r
+{\r
+       spi_ioctl(CMD_TX_LEN, &len);\r
+}\r
+// 同期シリアル受信データ取得\r
+void spi_rx_get(char *p)\r
+{\r
+       spi_ioctl(CMD_RX_GET, p);\r
+}\r
+\r
+// 同期シリアル送信データセット\r
+void spi_tx_set(char *p)\r
+{\r
+       spi_ioctl(CMD_TX_SET, p);\r
+}\r
+// リングバッファクリア\r
+void spi_buf_clear(void)\r
+{\r
+       spi_ioctl(CMD_BUF_CLEAR, NULL);\r
+}\r
+\r
+// リングバッファのデータ数get\r
+int spi_dnum_get(void)\r
+{\r
+       int     i = 0;\r
+       spi_ioctl(CMD_DNUM_GET, &i);\r
+       return i;\r
+}\r
+// SPIで実際に受信したデータ長を取得\r
+int spi_rcvd_len_get(void)\r
+{\r
+       int     i = 0;\r
+       spi_ioctl(CMD_RECEIVED_LEN_GET, &i);\r
+       return i;\r
+}\r
diff --git a/spi.h b/spi.h
new file mode 100644 (file)
index 0000000..be41d62
--- /dev/null
+++ b/spi.h
@@ -0,0 +1,65 @@
+#if    !defined(__SPI_H__)\r
+#define        __SPI_H__\r
+\r
+// SPI受信データ取得\r
+#define        CMD_RX_GET      11\r
+\r
+// SPI送信データ長セット\r
+#define        CMD_TX_LEN      12\r
+// SPI送信データセット\r
+#define        CMD_TX_SET      13\r
+\r
+// リングバッファにあるデータ数を返す\r
+#define        CMD_DNUM_GET    14\r
+\r
+// リングバッファクリア\r
+#define        CMD_BUF_CLEAR   15\r
+\r
+// SPIで実際に受信したデータ長を取得\r
+#define        CMD_RECEIVED_LEN_GET    20\r
+\r
+// SPIで受信するデータ長 固定長\r
+#define        SPI_DATA_LEN    945\r
+// SPI受信データの先頭文字\r
+#define        SPI_HEAD_CHAR   '$'\r
+\r
+// NAV-TIMEUTCパケットのデータ格納\r
+typedef struct {\r
+    unsigned long   tow;    // 0 ms GPS Millisecond Time of Week\r
+    unsigned long   tacc;   // 4 ns Time Accuracy Estimate\r
+    long   nano;            // 8 ns Nanoseconds of second, range -1e9 .. 1e9 (UTC)\r
+    unsigned int    year;   // 12 UTC\r
+    unsigned char   month;     // 16\r
+    unsigned char   day;\r
+    unsigned char   hour;\r
+    unsigned char   min;\r
+    unsigned char   sec;\r
+    unsigned char   valid;  // Validity Flags\r
+                            //  bit0 validTOW 1 = Valid Time of Week\r
+                            //  bit1 validWKN 1 = Valid Week Number\r
+                            //  bit2 validUTC 1 = Valid UTC (Leap Seconds already known)\r
+} UbloxNavTimeUtc;\r
+\r
+#define AD_CHNUM    6\r
+#define AD_SAMPLE  50 // AD ICの出力レート [Hz]\r
+\r
+typedef struct {\r
+       UbloxNavTimeUtc t;  // タイムスタンプ\r
+       long data1sec[AD_CHNUM];  // 1sec平均値\r
+       long data[AD_CHNUM][AD_SAMPLE];  // AD_SAMPLE[Hz]のデータ\r
+} ADbufType;\r
+\r
+\r
+int spi_get_fd(void);\r
+int spi_open(char *dev);\r
+int spi_ioctl(int cmd, void *p);\r
+int spi_close(void);\r
+\r
+void spi_tx_len_set(int len);\r
+void spi_rx_get(char *p);\r
+void spi_tx_set(char *p);\r
+void spi_buf_clear(void);\r
+int spi_dnum_get(void);\r
+int spi_rcvd_len_get(void);\r
+\r
+#endif\r
diff --git a/thread_rcv.c b/thread_rcv.c
new file mode 100644 (file)
index 0000000..daeff85
--- /dev/null
@@ -0,0 +1,84 @@
+#include <stdio.h>\r
+//#include <unistd.h>\r
+//#include <sys/ioctl.h>\r
+//#include <termios.h>\r
+#include <fcntl.h>\r
+#include <syslog.h>\r
+#include <sys/types.h>\r
+\r
+#include "spi.h"\r
+\r
+\r
+static int decode(char *buf, ADbufType *ad)\r
+{\r
+       UbloxNavTimeUtc *gps;\r
+       u_int8_t        *ptr;\r
+       int     ch;\r
+       \r
+       ptr = (u_int8_t*)buf;\r
+       gps = &(ad->t);\r
+\r
+       if (*ptr++ != SPI_HEAD_CHAR) return -1;\r
+       // GPS\r
+       gps->tow = *((int32_t*)ptr); ptr += 4;\r
+       gps->tacc = *((int32_t*)ptr); ptr += 4;\r
+       gps->nano = *((int32_t*)ptr); ptr += 4;\r
+       gps->year = *((int16_t*)ptr); ptr += 2;\r
+       gps->month = *((u_int8_t*)ptr); ptr++;\r
+       gps->day = *((u_int8_t*)ptr); ptr++;\r
+       gps->hour = *((u_int8_t*)ptr); ptr++;\r
+       gps->min = *((u_int8_t*)ptr); ptr++;\r
+       gps->sec = *((u_int8_t*)ptr); ptr++;\r
+       gps->valid = *((u_int8_t*)ptr); ptr++;\r
+       // 1sec平均\r
+       for(ch = 0; ch < AD_CHNUM; ch++) {\r
+               ad->data1sec[ch] = *((int32_t*)ptr);\r
+               ptr += 4;\r
+       }\r
+       // 50Hz data\r
+       \r
+       return 0;\r
+}\r
+void* thread_rcv(void* pParam)\r
+{\r
+       while(1) {\r
+               fd_set  fds;\r
+               char    buf[SPI_DATA_LEN+256];\r
+               int     i;\r
+               int     ch;\r
+               int     fd_spi;\r
+ADbufType      ad;\r
+\r
+               fd_spi = spi_get_fd();\r
+               // select の準備\r
+               FD_ZERO(&fds);\r
+               // FDセット\r
+               FD_SET(fd_spi, &fds);\r
+               // 受信を待つ タイムアウト無し\r
+               i = select(fd_spi + 1, &fds, NULL, NULL, NULL);    // 読みselect\r
+               if(i <= 0) syslog(LOG_ERR, "%s: select returned with signal or error. ret=%d\n", __FUNCTION__, i);\r
+               if(FD_ISSET(fd_spi, &fds)) {\r
+                       // 受信した\r
+                       i = spi_dnum_get();\r
+//printf("thread_rcv(): wakeup dnum=%d rcv_len=%d\n", i, spi_rcvd_len_get());\r
+                       while(i-- > 0) {\r
+                               // バッファ書き込み位置get\r
+//                             d = ring_get(ring_write_get());\r
+//                             ring_zero();\r
+                               // データ取得\r
+                               spi_rx_get(buf);\r
+                               decode(buf, &ad);\r
+printf("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",\r
+       ad.t.year, ad.t.month, ad.t.day, ad.t.hour, ad.t.min, ad.t.sec, ad.t.nano,\r
+       ad.t.tow, ad.t.tacc, ad.t.valid);\r
+for(ch = 0; ch < AD_CHNUM; ch++) {\r
+       printf(",%+7ld", ad.data1sec[ch]);\r
+}\r
+printf("\r\n");\r
+\r
+                       } // while((i = sub_dnum_get()) > 0) {\r
+               } // if(FD_ISSET(fd_sub, &fds)) {\r
+       } //    while(1) {\r
+       return NULL;\r
+}\r
+\r