blob: 005350c46632e7d2eac46665b8eb4280eea34995 [file] [log] [blame]
b.liuf9fbfa12024-06-14 15:53:59 +08001/*
2* gnss_hd8122.c
3*
4* HD8122 GNSS source.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/6/14 LiuBin Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <errno.h>
20#include <fcntl.h>
b.liu778645e2024-06-21 16:47:42 +080021#include <pthread.h>
b.liuf9fbfa12024-06-14 15:53:59 +080022
23#include "mbtk_log.h"
24#include "mbtk_type.h"
25#include "mbtk_gpio.h"
b.liu778645e2024-06-21 16:47:42 +080026#include "mbtk_utils.h"
b.liuf9fbfa12024-06-14 15:53:59 +080027#include "gnss_utils.h"
28#include "gnss_hd8122.h"
b.liudbc3f4b2024-06-25 18:22:24 +080029#include "hd8122_dl/hd8040_upgrade.h"
yq.wang99db6f52024-09-12 01:58:48 -070030#include "agps/agnss_http_download.h"
31#include "agps/8122_agnss.h"
b.liuf9fbfa12024-06-14 15:53:59 +080032
33#define UART_BITRATE_NMEA_DEF_FW 115200 // Default bitrate.
34#define GNSS_POWER_GPIO 43
b.liu5f950c52024-06-15 20:13:12 +080035#define GNSS_SET_TIMEOUT 3000 // 3s
36#define GNSS_PACK_BUFF_SIZE 1024
b.liud0ba7152024-06-19 14:47:21 +080037#define GNSS_MSG_NUM_MAX 30
b.liudbc3f4b2024-06-25 18:22:24 +080038#define READ_LEN_MAX 1024 //BOOT_UPGRADE_BUFF_MAX_1
yq.wangaf363dc2024-08-06 20:16:00 -070039#define GNSS_FW_GQALS_PATH "/lib/firmware/HD8122.YIKE.GN3.115200.0035.720e5.53ef0.GQALS.ANT.EPH.CFG.PPS13.240115R1.bin"
40#define GNSS_FW_GAQBS_PATH "/lib/firmware/HD8122.YIKE.GN3.115200.0037.dbd12.53ef0.GAQBS.B1C.ANT.EPH.CFG.PPS13.240416R1.bin"
b.liuf9fbfa12024-06-14 15:53:59 +080041
yq.wang99db6f52024-09-12 01:58:48 -070042//#define AGNSS_TEST_URL "http://aclientt.allystar.com:80/ephemeris/HD_GPS_BDS.hdb"
43#define AGNSS_URL "http://uagnss.allystar.com:80/ephemeris/%s?compid=yikecs1&token=Z38w5urAuawubTxi"
44#define AGNSS_INDIVIDUATION_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rt?"
45#define AGNSS_ALLSTAR_URL_HEAD "http://cagnss.allystar.com/api/v1/eph/rta?"
46#define AGNSS_EPH_FILE_PATH "/lib/firmware/eph_data.txt"
47
48#define AGNSS_EPH_GPS "HD_GPS.hdb"
49#define AGNSS_EPH_BDS "HD_BDS.hdb"
50#define AGNSS_EPH_GLO "HD_GLO.hdb"
51#define AGNSS_EPH_GPS_BDS "HD_GPS_BDS.hdb"
52#define AGNSS_EPH_GPS_GLO "HD_GPS_GLO.hdb"
53
b.liuf9fbfa12024-06-14 15:53:59 +080054static pthread_cond_t read_cond;
55static pthread_mutex_t read_mutex;
b.liud0ba7152024-06-19 14:47:21 +080056static bool setting_waitting = FALSE;
b.liu5f950c52024-06-15 20:13:12 +080057static bool setting_busy = FALSE;
58static void *gnss_set_rsp_ptr = NULL;
59static gnss_err_enum gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +080060static hd8122_msg_id_t msg_array[GNSS_MSG_NUM_MAX];
yq.wangaf363dc2024-08-06 20:16:00 -070061static char gnss_ctrl_path[128] = "/sys/devices/platform/mbtk-gnss/ctrl";
yq.wang9dd771b2024-09-13 23:38:40 -070062static gnss_agps_info_t agps_info;
b.liuf9fbfa12024-06-14 15:53:59 +080063
b.liu5f950c52024-06-15 20:13:12 +080064int gnss_write(int fd, const void *data, int data_len);
b.liudbc3f4b2024-06-25 18:22:24 +080065int OpenUart(char* UART_DEV);
66int uart_close(int fd);
67int fw_update_boot(int uart_fd, uint8_t *data, uint32_t len);
b.liu5f950c52024-06-15 20:13:12 +080068
b.liudbc3f4b2024-06-25 18:22:24 +080069static uint16 fletcher16(const uint8_t* data, int data_len)
70{
b.liud0ba7152024-06-19 14:47:21 +080071 uint32_t sum1 = 0;
72 uint32_t sum2 = 0;
b.liu5f950c52024-06-15 20:13:12 +080073 int index;
74
b.liudbc3f4b2024-06-25 18:22:24 +080075 for (index = 0; index < data_len; ++index )
76 {
b.liud0ba7152024-06-19 14:47:21 +080077 sum1 += data[index];
78 sum2 += sum1;
b.liu5f950c52024-06-15 20:13:12 +080079 }
80
b.liud0ba7152024-06-19 14:47:21 +080081 return ((0xFF & sum2) << 8) | (0xFF & sum1);
b.liu5f950c52024-06-15 20:13:12 +080082}
83
84static void gnss_set_timer_cb(int signo)
85{
b.liudbc3f4b2024-06-25 18:22:24 +080086 if(setting_busy)
87 {
b.liu5f950c52024-06-15 20:13:12 +080088 pthread_mutex_lock(&read_mutex);
89 pthread_cond_signal(&read_cond);
90 pthread_mutex_unlock(&read_mutex);
91 gnss_set_result = GNSS_ERR_TIMEOUT;
92 }
93 return;
94}
95
b.liud0ba7152024-06-19 14:47:21 +080096static void msg_init()
97{
b.liu778645e2024-06-21 16:47:42 +080098 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +080099 while(i < ARRAY_SIZE(msg_array))
100 {
b.liud0ba7152024-06-19 14:47:21 +0800101 msg_array[i].enable = FALSE;
102 i++;
103 }
104}
105
b.liud0ba7152024-06-19 14:47:21 +0800106static int msg_insert(uint8 gid, uint8 sid)
107{
b.liu778645e2024-06-21 16:47:42 +0800108 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800109 while(i < ARRAY_SIZE(msg_array))
110 {
b.liud0ba7152024-06-19 14:47:21 +0800111 if(!msg_array[i].enable)
112 break;
113 i++;
114 }
115
b.liudbc3f4b2024-06-25 18:22:24 +0800116 if(i == ARRAY_SIZE(msg_array))
117 {
b.liud0ba7152024-06-19 14:47:21 +0800118 LOGE("Msg full : %d", i);
119 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800120 }
121 else
122 {
b.liud0ba7152024-06-19 14:47:21 +0800123 msg_array[i].enable = TRUE;
124 msg_array[i].gid = gid;
125 msg_array[i].sid = sid;
126 return 0;
127 }
128}
129
130static int msg_find(uint8 gid, uint8 sid)
131{
b.liu778645e2024-06-21 16:47:42 +0800132 unsigned int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800133 while(i < ARRAY_SIZE(msg_array))
134 {
b.liud0ba7152024-06-19 14:47:21 +0800135 if(msg_array[i].enable && gid == msg_array[i].gid && sid == msg_array[i].sid)
136 break;
137 i++;
138 }
139
b.liudbc3f4b2024-06-25 18:22:24 +0800140 if(i == ARRAY_SIZE(msg_array))
141 {
b.liud0ba7152024-06-19 14:47:21 +0800142 LOGE("No found %d - %d", gid, sid);
143 return -1;
b.liudbc3f4b2024-06-25 18:22:24 +0800144 }
145 else
146 {
b.liud0ba7152024-06-19 14:47:21 +0800147 return i;
148 }
149}
150
151static int msg_remove(uint8 gid, uint8 sid)
152{
153 int i = msg_find(gid, sid);
b.liudbc3f4b2024-06-25 18:22:24 +0800154 if(i >= 0)
155 {
b.liud0ba7152024-06-19 14:47:21 +0800156 msg_array[i].enable = FALSE;
157 msg_array[i].gid = 0;
158 msg_array[i].sid = 0;
159 return 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800160 }
161 else
162 {
b.liud0ba7152024-06-19 14:47:21 +0800163 return -1;
164 }
165}
166
167static int msg_count()
168{
b.liu778645e2024-06-21 16:47:42 +0800169 unsigned int i = 0;
b.liud0ba7152024-06-19 14:47:21 +0800170 int count = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800171 while(i < ARRAY_SIZE(msg_array))
172 {
b.liud0ba7152024-06-19 14:47:21 +0800173 if(msg_array[i].enable)
174 count++;
175 i++;
176 }
177 return count;
178}
b.liu5f950c52024-06-15 20:13:12 +0800179
yq.wangaf363dc2024-08-06 20:16:00 -0700180static int gnss_ctrl_write(char* str)
181{
182 int fd = -1;
183 int ret = -1;
184 fd = open((const char*)gnss_ctrl_path, O_WRONLY);
185 if (fd < 0)
186 {
187 LOGE("open %s fail", gnss_ctrl_path);
188 return -1;
189 }
190 else
191 {
192 ret = write(fd, str, strlen(str));
193 close(fd);
194 if(ret < 0)
195 {
196 LOGE("write %s fail", str);
197 return -1;
198 }
199 }
200 return 0;
201}
202
203static int gnss_fwdl_enable()
204{
205 int ret = -1;
206 ret = gnss_ctrl_write("fdl");
207 if(ret < 0)
208 {
209 LOGE("gnss_ctrl_write fail");
210 return -1;
211 }
212 return 0;
213}
214
b.liudbc3f4b2024-06-25 18:22:24 +0800215static uint32_t read_bin_file(uint8_t *path, uint8_t *buff)
216{
217 int fp = -1;
218 int ret = 0;
219 int i = 0;
220 int size = 0;
221
222 if (NULL == path || NULL == buff)
223 {
224 LOGE("ARG error");
225 return 0;
226 }
227
228 fp = open((char *)path, O_RDONLY);
229 if(fp < 0)
230 {
231 LOGE( "open file failed ! errno is %d", errno);
232 return 0;
233 }
234
235 size = lseek(fp, 0x00, SEEK_END);
236 if(size <= 0)
237 {
238 LOGE( "file is empty.");
239 return 0;
240 }
241
242 LOGD( "file size is:%d", size);
243 lseek(fp, 0x00, SEEK_SET);
244 while(1)
245 {
246 ret = read(fp, buff, READ_LEN_MAX);
247 i += ret;
248 if(ret == READ_LEN_MAX)
249 {
250 buff += READ_LEN_MAX;
251 }
252 else
253 {
254 break;
255 }
256 }
257
258 LOGD("file size is:%d,i:%d", size, i);
259 close(fp);
260 if(size != i)
261 {
262 return 0;
263 }
264 return size;
265}
266
267
b.liu5f950c52024-06-15 20:13:12 +0800268static int pack_create(hd8122_id_type_enum id_type, uint8 id, uint16 data_len, const uint8 *data, uint8 *pack, int pack_len)
269{
b.liudbc3f4b2024-06-25 18:22:24 +0800270 if(pack == NULL || pack_len < HD8122_PACK_LEN_MIN)
271 {
b.liu5f950c52024-06-15 20:13:12 +0800272 return -1;
273 }
274 memset(pack, 0, pack_len);
275 uint8 *data_ptr = pack;
276 data_ptr += uint16_2_byte(HD8122_PACK_HEAD, data_ptr, false);
277 *data_ptr++ = (uint8)id_type;
278 *data_ptr++ = id;
279 data_ptr += uint16_2_byte(data_len, data_ptr, false);
b.liudbc3f4b2024-06-25 18:22:24 +0800280 if(data_len > 0)
281 {
b.liu5f950c52024-06-15 20:13:12 +0800282 memcpy(data_ptr, data, data_len);
283 data_ptr += data_len;
284 }
285 data_ptr += uint16_2_byte(fletcher16(pack + 2, 4 + data_len), data_ptr, false);
286 return (data_ptr - pack);
287}
288
b.liud0ba7152024-06-19 14:47:21 +0800289// f1 d9 05 01 02 00 06 01 0f 38
290// or
291// f1 d9 05 00 02 00 06 01 0f 38
292static int msg_array_change(const uint8 *pack, int pack_len, hd8122_id_ack_enum *ack_nak)
293{
b.liudbc3f4b2024-06-25 18:22:24 +0800294 if(pack_len == 0 || pack_len % 10)
295 {
b.liud0ba7152024-06-19 14:47:21 +0800296 LOGE("pack_len(%d) error.", pack_len);
297 return -1;
298 }
299 int count = pack_len / 10;
300 int i = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800301 while(i < count)
302 {
b.liu778645e2024-06-21 16:47:42 +0800303 const uint8 *ptr = pack + i * 10;
b.liudbc3f4b2024-06-25 18:22:24 +0800304 if(ptr[0] != 0xf1 || ptr[1] != 0xd9)
305 {
b.liud0ba7152024-06-19 14:47:21 +0800306 LOGE("Pack head error : %02x %02x", ptr[0], ptr[1]);
307 return -1;
308 }
309
b.liudbc3f4b2024-06-25 18:22:24 +0800310 if(ptr[2] != 0x05)
311 {
b.liud0ba7152024-06-19 14:47:21 +0800312 LOGE("Type not 0x05 : %02x", ptr[2]);
313 return -1;
314 }
315
316 int index = msg_find(ptr[6], ptr[7]);
b.liudbc3f4b2024-06-25 18:22:24 +0800317 if(index >= 0)
318 {
319 if(ptr[3] == 0x01)
320 {
b.liud0ba7152024-06-19 14:47:21 +0800321 msg_array[index].ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800322 }
323 else if(ptr[3] == 0x00)
324 {
b.liud0ba7152024-06-19 14:47:21 +0800325 msg_array[index].ack_nak = HD8122_ID_ACK_NAK;
326
327 // There is a nak as a failure.
328 *ack_nak = HD8122_ID_ACK_NAK;
b.liudbc3f4b2024-06-25 18:22:24 +0800329 }
330 else
331 {
b.liud0ba7152024-06-19 14:47:21 +0800332 LOGE("ID not 0x00 or 0x01 : %02x", ptr[3]);
333 return -1;
334 }
335
336 msg_array[index].enable = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800337 }
338 else
339 {
b.liud0ba7152024-06-19 14:47:21 +0800340 LOGE("Unknown gid - %d, sid - %d", ptr[6], ptr[7]);
341 return -1;
342 }
343 i++;
344 }
345
346 return 0;
347}
348
b.liudbc3f4b2024-06-25 18:22:24 +0800349static void gnss_cmd_rsp_process(const void *data, int data_len)
350{
b.liu5f950c52024-06-15 20:13:12 +0800351 const char *ptr = (const char*)data;
352 log_hex("RSP", data, data_len);
b.liu5f950c52024-06-15 20:13:12 +0800353
b.liud0ba7152024-06-19 14:47:21 +0800354 hd8122_id_ack_enum ack_nak = HD8122_ID_ACK_ACK;
b.liudbc3f4b2024-06-25 18:22:24 +0800355 if(!msg_array_change((const uint8*)data, data_len, &ack_nak))
356 {
b.liud0ba7152024-06-19 14:47:21 +0800357 if(setting_waitting && msg_count() == 0)
358 {
b.liudbc3f4b2024-06-25 18:22:24 +0800359 if(ack_nak == HD8122_ID_ACK_ACK)
360 {
b.liud0ba7152024-06-19 14:47:21 +0800361 gnss_set_result = GNSS_ERR_OK;
b.liudbc3f4b2024-06-25 18:22:24 +0800362 }
363 else
364 {
b.liud0ba7152024-06-19 14:47:21 +0800365 gnss_set_result = GNSS_ERR_UNKNOWN;
366 }
367
368 mbtk_timer_clear();
369
370 pthread_mutex_lock(&read_mutex);
371 pthread_cond_signal(&read_cond);
372 pthread_mutex_unlock(&read_mutex);
373 setting_waitting = FALSE;
374 }
yq.wang99db6f52024-09-12 01:58:48 -0700375
b.liudbc3f4b2024-06-25 18:22:24 +0800376 }
377 else
378 {
b.liud0ba7152024-06-19 14:47:21 +0800379 LOGW("Unknown rsp data.");
b.liu5f950c52024-06-15 20:13:12 +0800380 }
381}
382
b.liud0ba7152024-06-19 14:47:21 +0800383static gnss_err_enum gnss_8122_reset(int fd, uint8 reset)
b.liu5f950c52024-06-15 20:13:12 +0800384{
385 uint8 buff[GNSS_PACK_BUFF_SIZE];
386 LOGD("RESET");
387 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_SIMPLERST, 1, (uint8*)(&reset), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800388 if(len <= 0)
389 {
b.liu5f950c52024-06-15 20:13:12 +0800390 LOGE("pack_create() fail.");
391 return GNSS_ERR_ARG;
392 }
393 log_hex("PACK", buff, len);
394 gnss_write(fd, buff, len);
395 return GNSS_ERR_OK;
396}
b.liuf9fbfa12024-06-14 15:53:59 +0800397
b.liud0ba7152024-06-19 14:47:21 +0800398static gnss_err_enum gnss_8122_syscfg(int fd, uint32 mode)
399{
400 uint8 buff[GNSS_PACK_BUFF_SIZE];
401 LOGD("SYSCFG");
402 //uint8 mode_str[4];
403 //uint32_2_byte(mode, mode_str, TRUE);
404 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT, 4, (uint8*)(&mode), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800405 if(len <= 0)
406 {
b.liud0ba7152024-06-19 14:47:21 +0800407 LOGE("pack_create() fail.");
408 return GNSS_ERR_ARG;
409 }
410 log_hex("PACK", buff, len);
411 gnss_write(fd, buff, len);
412 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NAVSAT);
413 return GNSS_ERR_OK;
414}
415
yq.wang6a3437f2024-07-27 02:57:20 -0700416static gnss_err_enum gnss_8122_freqcfg(int fd, uint8 mode)
417{
418 uint8 buff[GNSS_PACK_BUFF_SIZE];
419 LOGD("FREQCFG");
420 uint8 data[20];
421 memset(data, 0x00, 20);
422 data[1] = mode;
423 data[2] = 0x66;
424 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL, 20, data, buff, sizeof(buff));
425 if(len <= 0)
426 {
427 LOGE("pack_create() fail.");
428 return GNSS_ERR_ARG;
429 }
430 log_hex("PACK", buff, len);
431 gnss_write(fd, buff, len);
432 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_PWRCTL);
433 return GNSS_ERR_OK;
434}
435
yq.wang012b6522024-09-12 02:36:53 -0700436static gnss_err_enum gnss_8122_cfg_save(int fd)
437{
438 uint8 buff[GNSS_PACK_BUFF_SIZE];
439 LOGD("CFG SAVE");
440 uint8 data[8];
441 memset(data, 0x00, 8);
442 data[4] = 0x0f;
443 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG, 8, data, buff, sizeof(buff));
444 if(len <= 0)
445 {
446 LOGE("pack_create() fail.");
447 return GNSS_ERR_ARG;
448 }
449 log_hex("PACK", buff, len);
450 gnss_write(fd, buff, len);
451 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_CFG);
452 return GNSS_ERR_OK;
453}
454
b.liud0ba7152024-06-19 14:47:21 +0800455static gnss_err_enum gnss_8122_msgcfg(int fd, uint8 type, uint8 id, uint8 period)
456{
457 uint8 buff[GNSS_PACK_BUFF_SIZE];
458 LOGD("MSGCFG");
459 uint8 data[3];
460 data[0] = type;
461 data[1] = id;
462 data[2] = period;
463 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG, 3, data, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800464 if(len <= 0)
465 {
b.liud0ba7152024-06-19 14:47:21 +0800466 LOGE("pack_create() fail.");
467 return GNSS_ERR_ARG;
468 }
469 log_hex("PACK", buff, len);
470 gnss_write(fd, buff, len);
471 msg_insert(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_MSG);
472 return GNSS_ERR_OK;
473}
474
475static gnss_err_enum gnss_8122_minel(int fd, float *elev)
476{
477 uint8 buff[GNSS_PACK_BUFF_SIZE];
478 LOGD("ELEV");
479 //uint8 elev_buff[4];
480 //uint32_2_byte((uint32)elev, elev_buff, TRUE);
481 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_ELEV, 8, (uint8*)elev, buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800482 if(len <= 0)
483 {
b.liud0ba7152024-06-19 14:47:21 +0800484 LOGE("pack_create() fail.");
485 return GNSS_ERR_ARG;
486 }
487 log_hex("PACK", buff, len);
488 gnss_write(fd, buff, len);
489 return GNSS_ERR_OK;
490}
491
492static gnss_err_enum gnss_8122_nmeaver(int fd, uint8 ver)
493{
494 uint8 buff[GNSS_PACK_BUFF_SIZE];
495 LOGD("NMEA-VER");
496 int len = pack_create(HD8122_ID_TYPE_CFG, HD8122_ID_CFG_NMEAVER, 1, (uint8*)(&ver), buff, sizeof(buff));
b.liudbc3f4b2024-06-25 18:22:24 +0800497 if(len <= 0)
498 {
b.liud0ba7152024-06-19 14:47:21 +0800499 LOGE("pack_create() fail.");
500 return GNSS_ERR_ARG;
501 }
502 log_hex("PACK", buff, len);
503 gnss_write(fd, buff, len);
504 return GNSS_ERR_OK;
505}
506
b.liuf9fbfa12024-06-14 15:53:59 +0800507int gnss_8122_dev_open()
508{
yq.wang5fe6e612024-07-17 01:18:12 -0700509 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 1);
510 system("i2cset -y -f 2 0x31 0x15 0x86");
511 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800512}
513
b.liu978f5432024-07-01 18:04:18 +0800514int gnss_8122_dev_close(int fd)
b.liuf9fbfa12024-06-14 15:53:59 +0800515{
yq.wang5fe6e612024-07-17 01:18:12 -0700516 //return mbtk_gpio_value_set(GNSS_POWER_GPIO, MBTK_GPIO_DIRECT_OUT, 0);
517 system("i2cset -y -f 2 0x31 0x15 0x00");
518 return 0;
b.liuf9fbfa12024-06-14 15:53:59 +0800519}
520
521int gnss_8122_open(const char *dev)
522{
523 pthread_mutex_init(&read_mutex, NULL);
524 pthread_cond_init(&read_cond, NULL);
525 return gnss_port_open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY, UART_BITRATE_NMEA_DEF_FW, TRUE);
526}
527
528int gnss_8122_close(int fd)
529{
530 pthread_mutex_destroy(&read_mutex);
531 pthread_cond_destroy(&read_cond);
532 return gnss_port_close(fd);
533}
534
b.liudbc3f4b2024-06-25 18:22:24 +0800535int gnss_8122_fw_dl(int fd, const char *fw_name, const char *dev)
b.liuf9fbfa12024-06-14 15:53:59 +0800536{
b.liudbc3f4b2024-06-25 18:22:24 +0800537 int uart_fd = OpenUart(dev);//PORT_NAME234
538 if (uart_fd < 0)
539 {
540 LOGE("open uart failed %d[%d]", uart_fd, errno);
541 return GNSS_ERR_OPEN_DEV;
542 }
543
yq.wangaf363dc2024-08-06 20:16:00 -0700544 uint8_t fw_path[256] = {0};
545 memset(fw_path, 0x0, 256);
546 if(memcmp(fw_name, "gp_gl_ga", 8) == 0)
547 {
548 memcpy(fw_path, GNSS_FW_GQALS_PATH, strlen(GNSS_FW_GQALS_PATH));
549 }
550 else if(memcmp(fw_name, "gp_bd_ga", 8) == 0)
551 {
552 memcpy(fw_path, GNSS_FW_GAQBS_PATH, strlen(GNSS_FW_GAQBS_PATH));
553 }
554 else
555 {
556 LOGE("fw dl param error");
557 return GNSS_ERR_ARG;
558 }
559
b.liudbc3f4b2024-06-25 18:22:24 +0800560 uint8_t *g_bin_buff = (uint8_t*)malloc(500*1024);
561 if(g_bin_buff == NULL) {
562 LOGE("malloc() fail : %d", errno);
563 return GNSS_ERR_UNKNOWN;
564 }
565 memset(g_bin_buff, 0, 500*1024);
yq.wangaf363dc2024-08-06 20:16:00 -0700566 uint32_t len = read_bin_file(fw_path, g_bin_buff);
b.liudbc3f4b2024-06-25 18:22:24 +0800567 if (len <= 0)
568 {
569 LOGE("Read file failed ,len = %d", len);
yq.wangaf363dc2024-08-06 20:16:00 -0700570 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800571 }
yq.wangaf363dc2024-08-06 20:16:00 -0700572 if(gnss_8122_dev_open())
573 {
b.liudbc3f4b2024-06-25 18:22:24 +0800574 LOGE("open gnss device fail:%d", errno);
yq.wangaf363dc2024-08-06 20:16:00 -0700575 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800576 }
yq.wangaf363dc2024-08-06 20:16:00 -0700577
578 if(gnss_fwdl_enable() < 0)
579 {
580 LOGE("gnss_fwdl_enable fail");
581 goto error;
582 }
583
b.liudbc3f4b2024-06-25 18:22:24 +0800584 int ret = fw_update_boot(uart_fd, g_bin_buff, len);
b.liudbc3f4b2024-06-25 18:22:24 +0800585 if (ret < 0)
586 {
587 LOGE("fw_update_boot() fail : %d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700588 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800589 }
b.liudbc3f4b2024-06-25 18:22:24 +0800590 if(ret == HDBD_UPG_SUCESS)
591 {
592 LOGD("upgrade sucess!");
b.liudbc3f4b2024-06-25 18:22:24 +0800593 }
594 else
595 {
596 LOGD("upgrade FAIL, fail style:%d", ret);
yq.wangaf363dc2024-08-06 20:16:00 -0700597 goto error;
b.liudbc3f4b2024-06-25 18:22:24 +0800598 }
yq.wangaf363dc2024-08-06 20:16:00 -0700599
600 if(gnss_8122_dev_close(0))
601 {
602 LOGE("close gnss device fail:%d", errno);
603 goto error;
604 }
605 free(g_bin_buff);
606 g_bin_buff = NULL;
607 uart_close(uart_fd);
608 return GNSS_ERR_OK;
609error:
610 if(g_bin_buff)
611 {
612 free(g_bin_buff);
613 g_bin_buff = NULL;
614 }
615 if(uart_fd > 0)
616 {
617 uart_close(uart_fd);
618 uart_fd = -1;
619 }
620 return GNSS_ERR_DL_FW;
b.liuf9fbfa12024-06-14 15:53:59 +0800621}
622
yq.wang99db6f52024-09-12 01:58:48 -0700623gnss_err_enum gnss_8122_agnss_get_eph(const char *param)
624{
625 if(param == NULL)
626 {
627 LOGD("gnss_8122_agnss_get_eph param is NULL");
628 return GNSS_ERR_ARG;
629 }
630
631 int eph_type = 0;
632 int alam_flag = 0;
633 int ret = -1;
634 char url[256] = {0};
635 if(2 == sscanf(param, "%d,%d", &eph_type, &alam_flag))
636 {
637 if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS)
638 {
639 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS);
640 }
641 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_BDS)
642 {
643 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_BDS);
644 }
645 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GLO)
646 {
647 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GLO);
648 }
649 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_BDS)
650 {
651 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_BDS);
652 }
653 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_GPS_GLO)
654 {
655 snprintf(url, 256,AGNSS_URL, AGNSS_EPH_GPS_GLO);
656 }
yq.wang9dd771b2024-09-13 23:38:40 -0700657 else if((gnss_eph_data_enum)eph_type == GNSS_EPH_CFG)
658 {
659 snprintf(url, 256,"%s?compid=%s&token=%s", strlen(agps_info.host) > 0 ? agps_info.host : "http://uagnss.allystar.com:80/ephemeris/HD_GPS.hdb",
660 strlen(agps_info.id) > 0 ? agps_info.id : "yikecs1",
661 strlen(agps_info.passwd) > 0 ? agps_info.passwd : "Z38w5urAuawubTxi");
662 }
yq.wang99db6f52024-09-12 01:58:48 -0700663 else
664 {
665 return GNSS_ERR_UNSUPPORT;
666 }
667
668 ret = eph_data_from_http_get(url, AGNSS_EPH_FILE_PATH);
669 if (ret < 0)
670 {
671 LOGD("eph_data_from_http_get fail");
672 return GNSS_ERR_EPH_GET_FAIL;
673 }
674 LOGD("get_eph_data_from_http success");
675 }
676 else
677 {
678 LOGD("param num error");
679 return GNSS_ERR_ARG;
680 }
681 return GNSS_ERR_OK;
682}
683
684
685gnss_err_enum gnss_8122_agnss_inject(int fd)
686{
687 int ret = 0;
688 hd_set_gnss_dev_fd(fd);
689 ret = hd_agnss_inject(AGNSS_EPH_FILE_PATH, 0, 0, 0, 0, NULL);
690 hd_set_gnss_dev_fd(-1);
691 if(ret < 0)
692 {
693 LOGD("hd_agnss_inject fail");
694 return GNSS_ERR_EPH_INJECT_FAIL;
695 }
696 return GNSS_ERR_OK;
697}
698
b.liu5f950c52024-06-15 20:13:12 +0800699void gnss_8122_set_cb(const void *data, int data_len)
700{
701 const char *buff = (const char*)data;
b.liudbc3f4b2024-06-25 18:22:24 +0800702 if(setting_busy) // Has setting cmd process.
703 {
b.liu5f950c52024-06-15 20:13:12 +0800704 gnss_cmd_rsp_process(data, data_len);
705 }
yq.wang99db6f52024-09-12 01:58:48 -0700706
yq.wang9dd771b2024-09-13 23:38:40 -0700707#if 0
yq.wang99db6f52024-09-12 01:58:48 -0700708 if(hd_get_eph_inject_status() == HD_EPH_INJECT_STATUS_WAIT_RETURN)
709 {
710 log_hex("EPH_RSP", (const char*)data, data_len);
711 int ret = hd_eph_inject_result_check(data, data_len);
712 if(ret < 0)
713 {
714 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_FAIL);
715 }
716 else
717 {
718 hd_set_eph_inject_status(HD_EPH_INJECT_STATUS_SUCCESS);
yq.wang9dd771b2024-09-13 23:38:40 -0700719 }
yq.wang99db6f52024-09-12 01:58:48 -0700720 }
yq.wang9dd771b2024-09-13 23:38:40 -0700721#endif
b.liu5f950c52024-06-15 20:13:12 +0800722}
b.liuf9fbfa12024-06-14 15:53:59 +0800723
724gnss_err_enum gnss_8122_set(int fd, const char *cmd, void *cmd_rsp, int cmd_rsp_len)
725{
b.liudbc3f4b2024-06-25 18:22:24 +0800726 if(setting_busy)
727 {
b.liu5f950c52024-06-15 20:13:12 +0800728 return GNSS_ERR_SET_BUSY;
b.liudbc3f4b2024-06-25 18:22:24 +0800729 }
730 else
731 {
b.liu5f950c52024-06-15 20:13:12 +0800732 bool should_wait_rsp = TRUE;
733 setting_busy = TRUE;
734 gnss_set_rsp_ptr = cmd_rsp;
735 gnss_set_result = GNSS_ERR_OK;
b.liud0ba7152024-06-19 14:47:21 +0800736 msg_init();
b.liu5f950c52024-06-15 20:13:12 +0800737 mbtk_timer_set(gnss_set_timer_cb, GNSS_SET_TIMEOUT);
738
b.liudbc3f4b2024-06-25 18:22:24 +0800739 if(memcmp(cmd, "$RESET", 6) == 0) // $RESET,<mode>
740 {
b.liud0ba7152024-06-19 14:47:21 +0800741 gnss_reset_type_enum mode = (gnss_reset_type_enum)atoi(cmd + 7);
yq.wang1ddd1fd2024-07-25 23:00:14 -0700742 LOGD("set reset: %d", mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800743 if(mode == GNSS_RESET_TYPE_HOT)
744 {
b.liud0ba7152024-06-19 14:47:21 +0800745 gnss_set_result = gnss_8122_reset(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +0800746 }
747 else if(mode == GNSS_RESET_TYPE_WARM)
748 {
b.liud0ba7152024-06-19 14:47:21 +0800749 gnss_set_result = gnss_8122_reset(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +0800750 }
751 else if(mode == GNSS_RESET_TYPE_COLD)
752 {
b.liud0ba7152024-06-19 14:47:21 +0800753 gnss_set_result = gnss_8122_reset(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +0800754 }
755 else
756 {
b.liud0ba7152024-06-19 14:47:21 +0800757 gnss_set_result = GNSS_ERR_ARG;
758 goto set_fail;
759 }
b.liudbc3f4b2024-06-25 18:22:24 +0800760 if(gnss_set_result != GNSS_ERR_OK)
761 {
b.liu5f950c52024-06-15 20:13:12 +0800762 goto set_fail;
763 }
764 should_wait_rsp = FALSE;
b.liudbc3f4b2024-06-25 18:22:24 +0800765 }
766 else if(memcmp(cmd, "$SYSCFG", 7) == 0) // $SYSCFG,<mode>
767 {
b.liud0ba7152024-06-19 14:47:21 +0800768 uint32 mode = 0;
769 mode = (uint32)atoi(cmd + 8);
770 uint32 new_mode = 0;
b.liudbc3f4b2024-06-25 18:22:24 +0800771 if(((GNSS_SET_SYSCFG_GPS | GNSS_SET_SYSCFG_BDS | GNSS_SET_SYSCFG_GLO | GNSS_SET_SYSCFG_GAL) & mode) != mode)
772 {
b.liud0ba7152024-06-19 14:47:21 +0800773 gnss_set_result = GNSS_ERR_ARG;
774 goto set_fail;
775 }
776
b.liudbc3f4b2024-06-25 18:22:24 +0800777 if(mode & GNSS_SET_SYSCFG_GPS) // GPS
778 {
b.liud0ba7152024-06-19 14:47:21 +0800779 new_mode |= 0x00000001;
780 }
b.liudbc3f4b2024-06-25 18:22:24 +0800781 if(mode & GNSS_SET_SYSCFG_BDS) // BDS
782 {
b.liud0ba7152024-06-19 14:47:21 +0800783 new_mode |= 0x00000002;
784 }
b.liudbc3f4b2024-06-25 18:22:24 +0800785 if(mode & GNSS_SET_SYSCFG_GLO) // GLO
786 {
b.liud0ba7152024-06-19 14:47:21 +0800787 new_mode |= 0x00000004;
788 }
b.liudbc3f4b2024-06-25 18:22:24 +0800789 if(mode & GNSS_SET_SYSCFG_GAL) // GAL
790 {
b.liud0ba7152024-06-19 14:47:21 +0800791 new_mode |= 0x00000010;
792 }
793
794 gnss_set_result = gnss_8122_syscfg(fd, new_mode);
b.liudbc3f4b2024-06-25 18:22:24 +0800795 if(gnss_set_result != GNSS_ERR_OK)
796 {
b.liud0ba7152024-06-19 14:47:21 +0800797 goto set_fail;
798 }
799 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800800 }
yq.wang6a3437f2024-07-27 02:57:20 -0700801 else if(memcmp(cmd, "$FREQCFG", 8) == 0) //$FREQCFG,<freq>
802 {
803 uint32 freq = 0;
804 freq = (uint32)atoi(cmd + 9);
805 LOGD("set freq: %d", freq);
806 if((GNSS_SET_FREQCFG_1 != freq) && (GNSS_SET_FREQCFG_2 != freq) && (GNSS_SET_FREQCFG_5 != freq))
807 {
808 gnss_set_result = GNSS_ERR_ARG;
809 goto set_fail;
810 }
811 gnss_set_result = gnss_8122_freqcfg(fd, (uint8)freq);
812 if(gnss_set_result != GNSS_ERR_OK)
813 {
814 goto set_fail;
815 }
yq.wang012b6522024-09-12 02:36:53 -0700816
817 gnss_set_result = gnss_8122_cfg_save(fd);
yq.wang6a3437f2024-07-27 02:57:20 -0700818 should_wait_rsp = TRUE;
819 }
b.liudbc3f4b2024-06-25 18:22:24 +0800820 else if(memcmp(cmd, "$MSGCFG", 7) == 0) // $MSGCFG,<mode>,<rate>
821 {
b.liud0ba7152024-06-19 14:47:21 +0800822 uint32 mode;
823 int rate;
b.liudbc3f4b2024-06-25 18:22:24 +0800824 if(2 == sscanf(cmd, "$MSGCFG,%d,%d", &mode, &rate))
825 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700826 LOGD("set msgcfg: %d, %d", mode, rate);
b.liud0ba7152024-06-19 14:47:21 +0800827 int time = rate / 1000; // s
b.liudbc3f4b2024-06-25 18:22:24 +0800828 if(time < 0)
829 {
b.liud0ba7152024-06-19 14:47:21 +0800830 gnss_set_result = GNSS_ERR_ARG;
831 goto set_fail;
832 }
833
834 if(((GNSS_SET_MSGCFG_RMC | GNSS_SET_MSGCFG_VTG | GNSS_SET_MSGCFG_GGA | GNSS_SET_MSGCFG_GSA
b.liudbc3f4b2024-06-25 18:22:24 +0800835 | GNSS_SET_MSGCFG_GRS | GNSS_SET_MSGCFG_GSV | GNSS_SET_MSGCFG_GLL | GNSS_SET_MSGCFG_ZDA
836 | GNSS_SET_MSGCFG_GST | GNSS_SET_MSGCFG_TXT) & mode) != mode)
837 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700838 LOGD("msgcfg not support mode");
b.liud0ba7152024-06-19 14:47:21 +0800839 gnss_set_result = GNSS_ERR_ARG;
840 goto set_fail;
841 }
842
b.liudbc3f4b2024-06-25 18:22:24 +0800843 if(mode & GNSS_SET_MSGCFG_RMC)
844 {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700845 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x05, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800846 if(gnss_set_result != GNSS_ERR_OK)
847 {
b.liud0ba7152024-06-19 14:47:21 +0800848 goto set_fail;
849 }
850 }
851
b.liudbc3f4b2024-06-25 18:22:24 +0800852 if(mode & GNSS_SET_MSGCFG_VTG)
853 {
b.liud0ba7152024-06-19 14:47:21 +0800854 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x06, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800855 if(gnss_set_result != GNSS_ERR_OK)
856 {
b.liud0ba7152024-06-19 14:47:21 +0800857 goto set_fail;
858 }
859 }
860
b.liudbc3f4b2024-06-25 18:22:24 +0800861 if(mode & GNSS_SET_MSGCFG_GGA)
862 {
b.liud0ba7152024-06-19 14:47:21 +0800863 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x00, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800864 if(gnss_set_result != GNSS_ERR_OK)
865 {
b.liud0ba7152024-06-19 14:47:21 +0800866 goto set_fail;
867 }
868 }
869
b.liudbc3f4b2024-06-25 18:22:24 +0800870 if(mode & GNSS_SET_MSGCFG_GSA)
871 {
b.liud0ba7152024-06-19 14:47:21 +0800872 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x02, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800873 if(gnss_set_result != GNSS_ERR_OK)
874 {
b.liud0ba7152024-06-19 14:47:21 +0800875 goto set_fail;
876 }
877 }
878
b.liudbc3f4b2024-06-25 18:22:24 +0800879 if(mode & GNSS_SET_MSGCFG_GRS)
880 {
b.liud0ba7152024-06-19 14:47:21 +0800881 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x03, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800882 if(gnss_set_result != GNSS_ERR_OK)
883 {
b.liud0ba7152024-06-19 14:47:21 +0800884 goto set_fail;
885 }
886 }
887
b.liudbc3f4b2024-06-25 18:22:24 +0800888 if(mode & GNSS_SET_MSGCFG_GSV)
889 {
b.liud0ba7152024-06-19 14:47:21 +0800890 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x04, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800891 if(gnss_set_result != GNSS_ERR_OK)
892 {
b.liud0ba7152024-06-19 14:47:21 +0800893 goto set_fail;
894 }
895 }
896
b.liudbc3f4b2024-06-25 18:22:24 +0800897 if(mode & GNSS_SET_MSGCFG_GLL)
898 {
b.liud0ba7152024-06-19 14:47:21 +0800899 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x01, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800900 if(gnss_set_result != GNSS_ERR_OK)
901 {
b.liud0ba7152024-06-19 14:47:21 +0800902 goto set_fail;
903 }
904 }
905
b.liudbc3f4b2024-06-25 18:22:24 +0800906 if(mode & GNSS_SET_MSGCFG_ZDA)
907 {
b.liud0ba7152024-06-19 14:47:21 +0800908 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x07, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800909 if(gnss_set_result != GNSS_ERR_OK)
910 {
b.liud0ba7152024-06-19 14:47:21 +0800911 goto set_fail;
912 }
913 }
914
b.liudbc3f4b2024-06-25 18:22:24 +0800915 if(mode & GNSS_SET_MSGCFG_GST)
916 {
b.liud0ba7152024-06-19 14:47:21 +0800917 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x08, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800918 if(gnss_set_result != GNSS_ERR_OK)
919 {
b.liud0ba7152024-06-19 14:47:21 +0800920 goto set_fail;
921 }
922 }
923
b.liudbc3f4b2024-06-25 18:22:24 +0800924 if(mode & GNSS_SET_MSGCFG_TXT)
925 {
b.liud0ba7152024-06-19 14:47:21 +0800926 gnss_set_result = gnss_8122_msgcfg(fd, 0xF0, 0x20, time);
b.liudbc3f4b2024-06-25 18:22:24 +0800927 if(gnss_set_result != GNSS_ERR_OK)
928 {
b.liud0ba7152024-06-19 14:47:21 +0800929 goto set_fail;
930 }
931 }
b.liudbc3f4b2024-06-25 18:22:24 +0800932 }
933 else
934 {
b.liud0ba7152024-06-19 14:47:21 +0800935 gnss_set_result = GNSS_ERR_ARG;
936 goto set_fail;
937 }
938
939 should_wait_rsp = TRUE;
b.liudbc3f4b2024-06-25 18:22:24 +0800940 }
yq.wang9dd771b2024-09-13 23:38:40 -0700941 else if(memcmp(cmd, "$AGPSCFG", 8) == 0) // $AGPSCFG,<host>,<id>,<passwd>
942 {
943 char host[GNSS_AGPS_LEN_MAX] = {0};
944 char id[GNSS_AGPS_LEN_MAX] = {0};
945 char passwd[GNSS_AGPS_LEN_MAX] = {0};
946 if(3 == sscanf(cmd, "$AGPSCFG,%[^,],%[^,],%s", host, id, passwd))
947 {
948 LOGD("agps: %s, %s, %s", host, id, passwd);
949 memset(agps_info.host, 0x0, GNSS_AGPS_LEN_MAX);
950 if(memcmp(host, "NULL", 4))
951 {
952 memcpy(agps_info.host, host, strlen(host));
953 }
954
955 memset(agps_info.id, 0x0, GNSS_AGPS_LEN_MAX);
956 if(memcmp(id, "NULL", 4))
957 {
958 memcpy(agps_info.id, id, strlen(id));
959 }
960
961 memset(agps_info.passwd, 0x0, GNSS_AGPS_LEN_MAX);
962 if(memcmp(passwd, "NULL", 4))
963 {
964 memcpy(agps_info.passwd, passwd, strlen(passwd));
965 }
966 }
967 else
968 {
969 gnss_set_result = GNSS_ERR_ARG;
970 goto set_fail;
971 }
972
973 should_wait_rsp = FALSE;
974 }
b.liudbc3f4b2024-06-25 18:22:24 +0800975 else if(memcmp(cmd, "$MINEL", 6) == 0) // $MINEL,<elev>
976 {
b.liud0ba7152024-06-19 14:47:21 +0800977#if 0
978 float elev = 0.0f;
979 elev = (float)atof(cmd + 7);
980// LOGD("ELEV : %f", elev);
981// log_hex("ELEV", &elev, sizeof(double));
b.liudbc3f4b2024-06-25 18:22:24 +0800982 if(elev < -90.0f || elev > 90.0f)
983 {
b.liud0ba7152024-06-19 14:47:21 +0800984 gnss_set_result = GNSS_ERR_ARG;
985 goto set_fail;
986 }
987 float elevs[2];
988 elevs[0] = elev;
989 elevs[1] = elev;
990 gnss_set_result = gnss_8122_minel(fd, elevs);
b.liudbc3f4b2024-06-25 18:22:24 +0800991 if(gnss_set_result != GNSS_ERR_OK)
992 {
b.liud0ba7152024-06-19 14:47:21 +0800993 goto set_fail;
994 }
995 should_wait_rsp = FALSE;
996#else
997 gnss_set_result = GNSS_ERR_UNSUPPORT;
998 goto set_fail;
999#endif
b.liudbc3f4b2024-06-25 18:22:24 +08001000 }
1001 else if(memcmp(cmd, "$NMEACFG", 8) == 0) // $NMEACFG,<ver>
1002 {
b.liud0ba7152024-06-19 14:47:21 +08001003#if 0
1004 gnss_memaver_type_enum version = (gnss_memaver_type_enum)atoi(cmd + 9);
b.liudbc3f4b2024-06-25 18:22:24 +08001005 if(version == GNSS_MEMAVER_TYPE_3_0)
1006 {
b.liud0ba7152024-06-19 14:47:21 +08001007 gnss_set_result = gnss_8122_nmeaver(fd, 1);
b.liudbc3f4b2024-06-25 18:22:24 +08001008 }
1009 else if(version == GNSS_MEMAVER_TYPE_4_0)
1010 {
b.liud0ba7152024-06-19 14:47:21 +08001011 gnss_set_result = gnss_8122_nmeaver(fd, 2);
b.liudbc3f4b2024-06-25 18:22:24 +08001012 }
1013 else if(version == GNSS_MEMAVER_TYPE_4_1)
1014 {
b.liud0ba7152024-06-19 14:47:21 +08001015 gnss_set_result = gnss_8122_nmeaver(fd, 3);
b.liudbc3f4b2024-06-25 18:22:24 +08001016 }
1017 else
1018 {
b.liud0ba7152024-06-19 14:47:21 +08001019 gnss_set_result = GNSS_ERR_ARG;
1020 goto set_fail;
1021 }
b.liudbc3f4b2024-06-25 18:22:24 +08001022 if(gnss_set_result != GNSS_ERR_OK)
1023 {
b.liud0ba7152024-06-19 14:47:21 +08001024 goto set_fail;
1025 }
1026 should_wait_rsp = FALSE;
1027#else
1028 gnss_set_result = GNSS_ERR_UNSUPPORT;
1029 goto set_fail;
1030#endif
b.liu5f950c52024-06-15 20:13:12 +08001031 }
1032 else
1033 {
1034 LOGW("Unknown cmd:%s", cmd);
1035 gnss_set_result = GNSS_ERR_UNSUPPORT;
1036 goto set_fail;
1037 }
1038
b.liudbc3f4b2024-06-25 18:22:24 +08001039 set_success:
1040 if(should_wait_rsp)
1041 {
b.liud0ba7152024-06-19 14:47:21 +08001042 setting_waitting = TRUE;
b.liu5f950c52024-06-15 20:13:12 +08001043 pthread_mutex_lock(&read_mutex);
1044 pthread_cond_wait(&read_cond, &read_mutex);
1045 pthread_mutex_unlock(&read_mutex);
b.liudbc3f4b2024-06-25 18:22:24 +08001046 }
1047 else
1048 {
b.liu5f950c52024-06-15 20:13:12 +08001049 mbtk_timer_clear();
1050 }
1051
1052 setting_busy = FALSE;
1053 return gnss_set_result;
b.liudbc3f4b2024-06-25 18:22:24 +08001054 set_fail:
b.liu5f950c52024-06-15 20:13:12 +08001055 setting_busy = FALSE;
1056 mbtk_timer_clear();
1057 return gnss_set_result;
1058 }
b.liuf9fbfa12024-06-14 15:53:59 +08001059}
1060
b.liu5f950c52024-06-15 20:13:12 +08001061