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
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;
+}
//
/**** 設定ファイル *******************************************
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;
\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
#define __MY_THREAD_H__
void* thread_rcv(void* pParam);
+void* thread_disp(void* pParam);
#ifdef CUNIT
#include <CUnit/CUnit.h>
/**** 設定デフォルト値
*/
#define CONF_FREQ_DEF 50
-
+#define CONF_GAIN_DEF SPI_CMD_GAIN_1P4
//
/**** signal ***********************************************************
*/
int main (int argc, char *argv[])
{
- pthread_t tid_rcv;
+ pthread_t tid_rcv, tid_disp;
// char buf[512];
signal(SIGINT, sig_handler);
// デフォルト設定
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);
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);
#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
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
#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
#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
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
--- /dev/null
+#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);
+ }
+ }
+}
}\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
}\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
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
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
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