--- /dev/null
+# 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} *~
--- /dev/null
+/*
+ 本番では抑制するデバッグメッセージ
+*/
+#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
+
--- /dev/null
+/*
+ 本番でも出力するメッセージ
+*/
+#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
--- /dev/null
+#if !defined(__MY_THREAD_H__)
+#define __MY_THREAD_H__
+
+void* thread_rcv(void* pParam);
+
+#endif
--- /dev/null
+#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;
+}
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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