2 //#include <unistd.h>
\r
3 //#include <sys/ioctl.h>
\r
4 //#include <termios.h>
\r
7 #include <sys/types.h>
\r
10 #include "debug_print.h"
\r
12 #include "ad_ring.h"
\r
17 3byte -> signed long(4byte)
\r
19 static long b3_to_long32(unsigned char *ptr)
\r
31 return *((long*)buf);
\r
33 static int decode(char *buf, AdData *ad)
\r
35 UbloxNavTimeUtc *gps;
\r
40 ptr = (u_int8_t*)buf;
\r
43 if (*ptr++ != SPI_HEAD_CHAR) return -1;
\r
45 ad->rescode = *ptr++;
\r
47 memcpy(ad->resdata, ptr, SPI_RESDATA_LEN);
\r
48 ptr += SPI_RESDATA_LEN;
\r
50 gps->tow = *((int32_t*)ptr); ptr += 4;
\r
51 gps->tacc = *((int32_t*)ptr); ptr += 4;
\r
52 gps->nano = *((int32_t*)ptr); ptr += 4;
\r
53 gps->year = *((int16_t*)ptr); ptr += 2;
\r
54 gps->month = *((u_int8_t*)ptr); ptr++;
\r
55 gps->day = *((u_int8_t*)ptr); ptr++;
\r
56 gps->hour = *((u_int8_t*)ptr); ptr++;
\r
57 gps->min = *((u_int8_t*)ptr); ptr++;
\r
58 gps->sec = *((u_int8_t*)ptr); ptr++;
\r
59 gps->valid = *((u_int8_t*)ptr); ptr++;
\r
61 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
62 ad->data1sec[ch] = *((int32_t*)ptr);
\r
66 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
67 for(i = 0; i < AD_SAMPLE; i++) {
\r
68 ad->data[ch][i] = b3_to_long32(ptr);
\r
73 ad->checksum = *((u_int16_t*)ptr);
\r
76 ad->t.tm_year = gps->year - 1900;
\r
77 ad->t.tm_mon = gps->month - 1; // struct tmの月は(0〜11)なので注意
\r
78 ad->t.tm_mday = gps->day;
\r
79 ad->t.tm_hour = gps->hour;
\r
80 ad->t.tm_min = gps->min;
\r
81 ad->t.tm_sec = gps->sec;
\r
83 if (gps->year == 0) return -1;
\r
91 static void do_avg(int freq, AdData *ad)
\r
98 avg_freq = conf_freq_get();
\r
99 avg_num = AD_SAMPLE/avg_freq;
\r
100 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
101 for(i = 0; i < avg_freq; i++) {
\r
103 for(j = 0; j < avg_num; j++) {
\r
104 add += ad->data[ch][i*avg_num + j];
\r
106 ad->avg[ch][i] = add / avg_num;
\r
110 static unsigned int sum_calc(char *buf)
\r
115 u_int16_t uint_sum;
\r
117 for(i = SPI_OFS_RESCODE; i < SPI_OFS_SUM; i++) {
\r
118 suma += (u_int8_t)buf[i];
\r
121 uint_sum = ((sumb << 8) & 0xFF00U) | suma;
\r
125 void* thread_rcv(void* pParam)
\r
129 char buf[SPI_DATA_LEN+256];
\r
132 AdData ad, *ad_ptr;
\r
135 char cmd[SPI_CMD_LEN];
\r
139 // spiドライバのリングバッファクリア
\r
142 spi_tx_len_set(SPI_CMD_LEN);
\r
145 fd_spi = spi_get_fd();
\r
149 FD_SET(fd_spi, &fds);
\r
151 i = select(fd_spi + 1, &fds, NULL, NULL, NULL); // 読みselect
\r
152 if(i <= 0) syslog(LOG_ERR, "%s: select returned with signal or error. ret=%d\n", __FUNCTION__, i);
\r
153 if(FD_ISSET(fd_spi, &fds)) {
\r
156 if (c++ % 5 == 0) {
\r
157 memset(cmd, 0, SPI_CMD_LEN);
\r
158 for(i = 0; i < AD_CHNUM; i++)
\r
159 cmd[i] = SPI_CMD_GAIN_128;
\r
160 spi_cmd_send(SPI_CMDCODE_GAIN, cmd, AD_CHNUM);
\r
164 i = spi_dnum_get();
\r
165 //PDEBUG("thread_rcv(): wakeup dnum=%d rcv_len=%d\n", i, spi_rcvd_len_get());
\r
167 memset(&ad, 0, sizeof(ad));
\r
171 if (decode(buf, &ad)) continue;
\r
173 sum = sum_calc(buf);
\r
174 if (sum != ad.checksum) {
\r
175 PDEBUG("thread_rcv(): SUM ERR! CALC=%04X RCV=%04X\r\n", sum, ad.checksum);
\r
178 ad.freq = conf_freq_get();
\r
179 do_avg(AD_SAMPLE, &ad);
\r
182 PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X,%d",
\r
183 ad.gps.year, ad.gps.month, ad.gps.day, ad.gps.hour, ad.gps.min, ad.gps.sec, ad.gps.nano,
\r
184 ad.gps.tow, ad.gps.tacc, ad.gps.valid, ad.rescode);
\r
185 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
186 PDEBUG(",%+7ld", ad.data1sec[ch]);
\r
191 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
192 PDEBUG(",%+7ld", ad.data[ch][0]);
\r
195 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
196 PDEBUG(",%+7ld", ad.data[ch][49]);
\r
201 ad_ptr = ad_ring_get(ad_ring_write_get());
\r
204 ad_ring_latest_set(ad_ring_write_get());
\r
206 ad_ring_write_plus();
\r
208 } // while((i = sub_dnum_get()) > 0) {
\r
209 } // if(FD_ISSET(fd_sub, &fds)) {
\r
218 #include <CUnit/CUnit.h>
\r
220 static void test_b3_to_long32(void)
\r
223 char buf[SPI_DATA_LEN+256];
\r
230 l = b3_to_long32(buf);
\r
231 CU_ASSERT(l == 0x00123456);
\r
236 l = b3_to_long32(buf);
\r
237 CU_ASSERT(l == (long)0xFF823456);
\r
242 l = b3_to_long32(buf);
\r
243 CU_ASSERT(l == -1);
\r
251 CU_ASSERT(ad.data[0][0] == 0x123456);
\r
254 i = SPI_OFS_DATA + AD_CHNUM * AD_SAMPLE * 3;
\r
260 CU_ASSERT(ad.data[AD_CHNUM-1][AD_SAMPLE-1] == 0x123456);
\r
263 void thread_rcv_test(CU_pSuite test_suite)
\r
266 CU_add_test(test_suite, "test_b3_to_long32", test_b3_to_long32);
\r