2 //#include <unistd.h>
\r
3 //#include <sys/ioctl.h>
\r
4 //#include <termios.h>
\r
7 #include <sys/types.h>
\r
11 #include "ad_ring.h"
\r
15 3byte -> signed long(4byte)
\r
17 static long b3_to_long32(unsigned char *ptr)
\r
29 return *((long*)buf);
\r
31 static int decode(char *buf, AdData *ad)
\r
33 UbloxNavTimeUtc *gps;
\r
38 ptr = (u_int8_t*)buf;
\r
41 if (*ptr++ != SPI_HEAD_CHAR) return -1;
\r
43 gps->tow = *((int32_t*)ptr); ptr += 4;
\r
44 gps->tacc = *((int32_t*)ptr); ptr += 4;
\r
45 gps->nano = *((int32_t*)ptr); ptr += 4;
\r
46 gps->year = *((int16_t*)ptr); ptr += 2;
\r
47 gps->month = *((u_int8_t*)ptr); ptr++;
\r
48 gps->day = *((u_int8_t*)ptr); ptr++;
\r
49 gps->hour = *((u_int8_t*)ptr); ptr++;
\r
50 gps->min = *((u_int8_t*)ptr); ptr++;
\r
51 gps->sec = *((u_int8_t*)ptr); ptr++;
\r
52 gps->valid = *((u_int8_t*)ptr); ptr++;
\r
54 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
55 ad->data1sec[ch] = *((int32_t*)ptr);
\r
59 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
60 for(i = 0; i < AD_SAMPLE; i++) {
\r
61 ad->data[ch][i] = b3_to_long32(ptr);
\r
68 ad->t.tm_year = gps->year - 1900;
\r
69 ad->t.tm_mon = gps->month - 1; // struct tmの月は(0〜11)なので注意
\r
70 ad->t.tm_mday = gps->day;
\r
71 ad->t.tm_hour = gps->hour;
\r
72 ad->t.tm_min = gps->min;
\r
73 ad->t.tm_sec = gps->sec;
\r
81 static void do_avg(int freq, AdData *ad)
\r
84 memcpy(ad->avg, ad->data, AD_CHNUM*AD_SAMPLE*AD_BYTES);
\r
86 void* thread_rcv(void* pParam)
\r
90 char buf[SPI_DATA_LEN+256];
\r
96 fd_spi = spi_get_fd();
\r
100 FD_SET(fd_spi, &fds);
\r
102 i = select(fd_spi + 1, &fds, NULL, NULL, NULL); // 読みselect
\r
103 if(i <= 0) syslog(LOG_ERR, "%s: select returned with signal or error. ret=%d\n", __FUNCTION__, i);
\r
104 if(FD_ISSET(fd_spi, &fds)) {
\r
106 i = spi_dnum_get();
\r
107 //printf("thread_rcv(): wakeup dnum=%d rcv_len=%d\n", i, spi_rcvd_len_get());
\r
110 // d = ring_get(ring_write_get());
\r
117 do_avg(AD_SAMPLE, &ad);
\r
119 printf("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",
\r
120 ad.t.year, ad.t.month, ad.t.day, ad.t.hour, ad.t.min, ad.t.sec, ad.t.nano,
\r
121 ad.t.tow, ad.t.tacc, ad.t.valid);
\r
122 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
123 printf(",%+7ld", ad.data1sec[ch]);
\r
126 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
127 printf(",%+7ld", ad.data[ch][0]);
\r
130 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
131 printf(",%+7ld", ad.data[ch][49]);
\r
136 ad_ptr = ad_ring_get(ad_ring_write_get());
\r
139 ad_ring_latest_set(ad_ring_write_get());
\r
141 ad_ring_write_plus();
\r
143 } // while((i = sub_dnum_get()) > 0) {
\r
144 } // if(FD_ISSET(fd_sub, &fds)) {
\r
153 #include <CUnit/CUnit.h>
\r
155 static void test_b3_to_long32(void)
\r
158 char buf[SPI_DATA_LEN+256];
\r
165 l = b3_to_long32(buf);
\r
166 CU_ASSERT(l == 0x00123456);
\r
171 l = b3_to_long32(buf);
\r
172 CU_ASSERT(l == (long)0xFF823456);
\r
177 l = b3_to_long32(buf);
\r
178 CU_ASSERT(l == -1);
\r
186 CU_ASSERT(ad.data[0][0] == 0x123456);
\r
189 i = SPI_OFS_DATA + AD_CHNUM * AD_SAMPLE * 3;
\r
195 CU_ASSERT(ad.data[AD_CHNUM-1][AD_SAMPLE-1] == 0x123456);
\r
198 void thread_rcv_test(CU_pSuite test_suite)
\r
201 CU_add_test(test_suite, "test_b3_to_long32", test_b3_to_long32);
\r