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
16 3byte -> signed long(4byte)
\r
18 static long b3_to_long32(unsigned char *ptr)
\r
30 return *((long*)buf);
\r
32 static int decode(char *buf, AdData *ad)
\r
34 UbloxNavTimeUtc *gps;
\r
39 ptr = (u_int8_t*)buf;
\r
42 if (*ptr++ != SPI_HEAD_CHAR) return -1;
\r
44 gps->tow = *((int32_t*)ptr); ptr += 4;
\r
45 gps->tacc = *((int32_t*)ptr); ptr += 4;
\r
46 gps->nano = *((int32_t*)ptr); ptr += 4;
\r
47 gps->year = *((int16_t*)ptr); ptr += 2;
\r
48 gps->month = *((u_int8_t*)ptr); ptr++;
\r
49 gps->day = *((u_int8_t*)ptr); ptr++;
\r
50 gps->hour = *((u_int8_t*)ptr); ptr++;
\r
51 gps->min = *((u_int8_t*)ptr); ptr++;
\r
52 gps->sec = *((u_int8_t*)ptr); ptr++;
\r
53 gps->valid = *((u_int8_t*)ptr); ptr++;
\r
55 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
56 ad->data1sec[ch] = *((int32_t*)ptr);
\r
60 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
61 for(i = 0; i < AD_SAMPLE; i++) {
\r
62 ad->data[ch][i] = b3_to_long32(ptr);
\r
69 ad->t.tm_year = gps->year - 1900;
\r
70 ad->t.tm_mon = gps->month - 1; // struct tmの月は(0〜11)なので注意
\r
71 ad->t.tm_mday = gps->day;
\r
72 ad->t.tm_hour = gps->hour;
\r
73 ad->t.tm_min = gps->min;
\r
74 ad->t.tm_sec = gps->sec;
\r
82 static void do_avg(int freq, AdData *ad)
\r
89 avg_freq = conf_freq_get();
\r
90 avg_num = AD_SAMPLE/avg_freq;
\r
91 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
92 for(i = 0; i < avg_freq; i++) {
\r
94 for(j = 0; j < avg_num; j++) {
\r
95 add += ad->data[ch][i*avg_num + j];
\r
97 ad->avg[ch][i] = add / avg_num;
\r
101 void* thread_rcv(void* pParam)
\r
105 char buf[SPI_DATA_LEN+256];
\r
109 AdData ad, *ad_ptr;
\r
111 fd_spi = spi_get_fd();
\r
115 FD_SET(fd_spi, &fds);
\r
117 i = select(fd_spi + 1, &fds, NULL, NULL, NULL); // 読みselect
\r
118 if(i <= 0) syslog(LOG_ERR, "%s: select returned with signal or error. ret=%d\n", __FUNCTION__, i);
\r
119 if(FD_ISSET(fd_spi, &fds)) {
\r
121 i = spi_dnum_get();
\r
122 //printf("thread_rcv(): wakeup dnum=%d rcv_len=%d\n", i, spi_rcvd_len_get());
\r
124 memset(&ad, 0, sizeof(ad));
\r
129 ad.freq = conf_freq_get();
\r
131 do_avg(AD_SAMPLE, &ad);
\r
133 printf("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",
\r
134 ad.t.year, ad.t.month, ad.t.day, ad.t.hour, ad.t.min, ad.t.sec, ad.t.nano,
\r
135 ad.t.tow, ad.t.tacc, ad.t.valid);
\r
136 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
137 printf(",%+7ld", ad.data1sec[ch]);
\r
140 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
141 printf(",%+7ld", ad.data[ch][0]);
\r
144 for(ch = 0; ch < AD_CHNUM; ch++) {
\r
145 printf(",%+7ld", ad.data[ch][49]);
\r
150 ad_ptr = ad_ring_get(ad_ring_write_get());
\r
153 ad_ring_latest_set(ad_ring_write_get());
\r
155 ad_ring_write_plus();
\r
157 } // while((i = sub_dnum_get()) > 0) {
\r
158 } // if(FD_ISSET(fd_sub, &fds)) {
\r
167 #include <CUnit/CUnit.h>
\r
169 static void test_b3_to_long32(void)
\r
172 char buf[SPI_DATA_LEN+256];
\r
179 l = b3_to_long32(buf);
\r
180 CU_ASSERT(l == 0x00123456);
\r
185 l = b3_to_long32(buf);
\r
186 CU_ASSERT(l == (long)0xFF823456);
\r
191 l = b3_to_long32(buf);
\r
192 CU_ASSERT(l == -1);
\r
200 CU_ASSERT(ad.data[0][0] == 0x123456);
\r
203 i = SPI_OFS_DATA + AD_CHNUM * AD_SAMPLE * 3;
\r
209 CU_ASSERT(ad.data[AD_CHNUM-1][AD_SAMPLE-1] == 0x123456);
\r
212 void thread_rcv_test(CU_pSuite test_suite)
\r
215 CU_add_test(test_suite, "test_b3_to_long32", test_b3_to_long32);
\r