3 //#include <sys/ioctl.h>
11 #include "debug_print.h"
18 3byte -> signed long(4byte)
20 static int32_t b3_to_long32(unsigned char *ptr)
32 return *((int32_t*)buf);
34 static int decode(char *buf, AdData *ad)
44 if (*ptr++ != SPI_HEAD_CHAR) return -1;
48 memcpy(ad->resdata, ptr, SPI_RESDATA_LEN);
49 ptr += SPI_RESDATA_LEN;
51 gps->tow = *((int32_t*)ptr); ptr += 4;
52 gps->tacc = *((int32_t*)ptr); ptr += 4;
53 gps->nano = *((int32_t*)ptr); ptr += 4;
54 gps->year = *((int16_t*)ptr); ptr += 2;
55 gps->month = *((u_int8_t*)ptr); ptr++;
56 gps->day = *((u_int8_t*)ptr); ptr++;
57 gps->hour = *((u_int8_t*)ptr); ptr++;
58 gps->min = *((u_int8_t*)ptr); ptr++;
59 gps->sec = *((u_int8_t*)ptr); ptr++;
60 gps->valid = *((u_int8_t*)ptr); ptr++;
62 for(ch = 0; ch < AD_CHNUM; ch++) {
63 ad->data1sec[ch] = *((int32_t*)ptr);
67 u_int8_t *ptrsave = ptr;
68 for(i = 0; i < AD_SAMPLE; i++) {
76 for(ch = 0; ch < AD_CHNUM; ch++) {
77 for(i = 0; i < AD_SAMPLE; i++) {
78 ad->data[ch][i] = b3_to_long32(ptr);
82 // DEBUG!!!!!!!!!!!!!!!!!!!!!!!
83 //for(i = 0; i < AD_SAMPLE; i++) {
84 // ad->data[0][i] = i;
88 ad->checksum = *((u_int16_t*)ptr);
91 ad->t.tm_year = gps->year - 1900;
92 ad->t.tm_mon = gps->month - 1; // struct tmの月は(0〜11)なので注意
93 ad->t.tm_mday = gps->day;
94 ad->t.tm_hour = gps->hour;
95 ad->t.tm_min = gps->min;
96 ad->t.tm_sec = gps->sec;
98 if (gps->year == 0) return -1;
106 static void do_avg(int freq, AdData *ad)
113 avg_freq = conf_freq_get();
114 avg_num = AD_SAMPLE/avg_freq;
115 for(ch = 0; ch < AD_CHNUM; ch++) {
116 for(i = 0; i < avg_freq; i++) {
118 for(j = 0; j < avg_num; j++) {
119 add += ad->data[ch][i*avg_num + j];
121 ad->avg[ch][i] = add / avg_num;
125 static unsigned int sum_calc(char *buf)
132 for(i = SPI_OFS_RESCODE; i < SPI_OFS_SUM; i++) {
133 suma += (u_int8_t)buf[i];
136 uint_sum = ((sumb << 8) & 0xFF00U) | suma;
140 void* thread_rcv(void* pParam)
144 char buf[SPI_DATA_LEN+256];
150 char cmd[SPI_CMD_LEN];
154 // spiドライバのリングバッファクリア
157 spi_tx_len_set(SPI_CMD_LEN);
160 fd_spi = spi_get_fd();
164 FD_SET(fd_spi, &fds);
166 i = select(fd_spi + 1, &fds, NULL, NULL, NULL); // 読みselect
167 if(i <= 0) syslog(LOG_ERR, "%s: select returned with signal or error. ret=%d\n", __FUNCTION__, i);
168 if(FD_ISSET(fd_spi, &fds)) {
172 memset(cmd, 0, SPI_CMD_LEN);
173 for(i = 0; i < AD_CHNUM; i++)
174 cmd[i] = SPI_CMD_GAIN_128;
175 spi_cmd_send(SPI_CMDCODE_GAIN, cmd, AD_CHNUM);
180 PDEBUG("thread_rcv(): wakeup dnum=%d rcv_len=%d\n", i, spi_rcvd_len_get());
182 memset(&ad, 0, sizeof(ad));
186 if (decode(buf, &ad)) continue;
189 if (sum != ad.checksum) {
190 PDEBUG("thread_rcv(): SUM ERR! CALC=%04X RCV=%04X\r\n", sum, ad.checksum);
193 ad.freq = conf_freq_get();
194 do_avg(AD_SAMPLE, &ad);
197 PDEBUG("%04d/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X,%d",
198 ad.gps.year, ad.gps.month, ad.gps.day, ad.gps.hour, ad.gps.min, ad.gps.sec, ad.gps.nano,
199 ad.gps.tow, ad.gps.tacc, ad.gps.valid, ad.rescode);
200 for(ch = 0; ch < AD_CHNUM; ch++) {
201 PDEBUG(",%+7ld", ad.data1sec[ch]);
206 for(ch = 0; ch < AD_CHNUM; ch++) {
207 PDEBUG(",%+7ld", ad.data[ch][0]);
210 for(ch = 0; ch < AD_CHNUM; ch++) {
211 PDEBUG(",%+7ld", ad.data[ch][49]);
216 ad_ptr = ad_ring_get(ad_ring_write_get());
219 ad_ring_latest_set(ad_ring_write_get());
221 ad_ring_write_plus();
223 } // while((i = sub_dnum_get()) > 0) {
224 } // if(FD_ISSET(fd_sub, &fds)) {
233 #include <CUnit/CUnit.h>
235 static void test_b3_to_long32(void)
238 char buf[SPI_DATA_LEN+256];
245 l = b3_to_long32(buf);
246 CU_ASSERT(l == 0x00123456);
251 l = b3_to_long32(buf);
252 CU_ASSERT(l == (long)0xFF823456);
257 l = b3_to_long32(buf);
266 CU_ASSERT(ad.data[0][0] == 0x123456);
269 i = SPI_OFS_DATA + AD_CHNUM * AD_SAMPLE * 3;
275 CU_ASSERT(ad.data[AD_CHNUM-1][AD_SAMPLE-1] == 0x123456);
278 void thread_rcv_test(CU_pSuite test_suite)
281 CU_add_test(test_suite, "test_b3_to_long32", test_b3_to_long32);