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