we try to implement AGPS , hot start mode to fix the GPS in seconds. but the GPS not getting fix. what was the issue ?
static void ql_gnss_demo_thread(void *param)
{
ql_event_t event;
char *start, *end;
struct nmea_s *nmea = NULL;
unsigned char *recbuff=NULL;
ql_gnss_apflashdatarecv_e datarecv_status=0;
//ql_uart_config_s uart_cfg = {0};
// ql_LvlMode gpio_lvl;
// ql_uart_set_dcbconfig(QL_UART_PORT_1, &uart_cfg);
// ql_pin_set_func(QUEC_PIN_UART1_TXD, QL_UART1_TX_FUNC);
// ql_pin_set_func(QUEC_PIN_UART1_RXD, QL_UART1_RX_FUNC);
// ql_uart_open(QL_UART_PORT_1);
//APP_DEBUG(“\nGNSS THREAD”);
/gnss config/
while (registered != 1) // registered set from network callback
{
APP_DEBUG("Waiting for network registration...\n");
ql_rtos_task_sleep_ms(1000);
}
agps_ret = ql_gnss_agps_cfg(AGPS_GNSS_ENABLE);
if(agps_ret == QL_GNSS_SUCCESS)
{
APP_DEBUG("AGPS Enable...\n");
}
if(agps_ret == 0)
agps_set = 1;
agps_ret = ql_gnss_agps_param_cfg(1,QL_AGPS_URL_STR,QL_AGPS_VENDORID_STR,QL_AGPS_MODELID_STR,QL_AGPS_PASSWORD_STR);
if(agps_ret == QL_GNSS_SUCCESS)
{
APP_DEBUG("AGPS URL...\n");
}
if(agps_ret == 0)
agps_set = 1;
APP_DEBUG("AGPS = %d\n",agps_set);
tm.tm_year = 2000+gps_yr;
tm.tm_mon = gps_mn;
tm.tm_mday = gps_dt;
tm.tm_hour = gps_hh;
tm.tm_min = gps_mm;
tm.tm_sec = gps_ss;
ql_rtc_set_time(&tm);
gnss_ret = ql_gnss_switch(GNSS_ENABLE);
if(gnss_ret == QL_GNSS_SUCCESS)
{
APP_DEBUG("GNSS Boot...\n");
}
while(ql_gnss_state_info_get()==GNSS_FIRMWARE_UPDATE)
{
//APP_DEBUG("\nGNSS_FIRMWARE_UPDATE");
ql_rtos_task_sleep_ms(1000);
}
ql_gnss_callback_register(ql_gnss_notify_cb);
ql_gnss_device_info_request();
ql_gnss_apflash_getpvdata(&g_gps_data);
ql_rtos_timer_create(&gnss_timer,NULL,gnss_timer_callback,NULL);
ql_rtos_timer_start(gnss_timer,10,1);
while(1)
{
//APP_DEBUG("\nql_event_try_wait");
if( ql_event_try_wait(&event) != 0 )
{
continue;
}
if( event.id == QUEC_UART_RX_RECV_DATA_IND || agps_set == 1)
{
recbuff=calloc(1,2*QUEC_GPS_RECBUF_LEN_MAX);
ql_gnss_nmea_get( event.param1,recbuff, event.param2);
ql_gnss_apflash_get_recv_status(&datarecv_status);
if(datarecv_status == APFLASH_DATA_SET_RECV)
{
uint32 u32flag=0;
u32flag=ql_gnss_apflash_data_parse(recbuff, event.param2);
if(NULL != recbuff)
{
free(recbuff);
recbuff=NULL;
}
switch (u32flag)
{
case QL_GNSS_APFLASH_NO_ERR:
continue;
case QL_GNSS_APFLASH_MALLOC_ERR:
ql_gnss_apflash_retry_enable(APFLASH_RETRY_ENABLE);
ql_gnss_apflash_set_recv_status(APFLASH_DATA_NOT_RECV);
continue;
case QL_GNSS_APFLASH_OVERFLOW_ERR:
case QL_GNSS_APFLASH_HEAD_ERR:
case QL_GNSS_APFLASH_RX_ERR:
ql_gnss_apflash_retry_enable(APFLASH_RETRY_ENABLE);
ql_gnss_apflash_set_recv_status(APFLASH_DATA_NOT_RECV);
continue;
case QL_GNSS_APFLASH_RX_GOING:
continue;
case QL_GNSS_APFLASH_RX_PASS:
ql_gnss_apflash_retry_enable(APFLASH_RETRY_DISABLE);
ql_gnss_apflash_set_recv_status(APFLASH_DATA_NOT_RECV);
continue;
default:
gnss_ret = 0;
continue;
}
}
total_bytes += event.param2;
if (total_bytes > sizeof(buffer)-150)
{
total_bytes = 0;
if(NULL != recbuff)
{
free(recbuff);
recbuff=NULL;
}
continue;
}
memcpy(buffer+total_bytes-event.param2, recbuff, event.param2);
if(NULL != recbuff)
{
free(recbuff);
recbuff=NULL;
}
if(event.param2>0)
{
end=buffer;
while(1)
{
start = memchr(end, '$', total_bytes-(end-buffer));
if (NULL == start) {
total_bytes = 0;
break;
}
end = memchr(start, NMEA_END_CHAR_1, total_bytes-(start-buffer));
if (NULL==end || NMEA_END_CHAR_2 != *(++end)) {
if (buffer != memmove(buffer, start, total_bytes-(start-buffer))) {
total_bytes = 0;
}
total_bytes = total_bytes-(start-buffer);
break;
}
memset(nmea_buff, 0, sizeof(nmea_buff));
memcpy(nmea_buff, start, jmin(sizeof(nmea_buff)-1, end-start-1));
nmea = nmea_parse(start, end-start+1, 1);
if (nmea)
{
nmea_value_update(nmea, &g_gps_data);
free(nmea->data);
nmea->data = NULL;
free(nmea);
nmea = NULL;
}
if(end==buffer+total_bytes)
{
total_bytes=0;
break;
}
end=end+1;
}
}
}
}
ql_rtos_task_sleep_ms(1000);
}
