Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/test/libql_lib_v2/ql_gnss_test.c b/mbtk/test/libql_lib_v2/ql_gnss_test.c
new file mode 100755
index 0000000..dc766a9
--- /dev/null
+++ b/mbtk/test/libql_lib_v2/ql_gnss_test.c
@@ -0,0 +1,725 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_gnss_test.c
+  @brief GNSS service API 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
+  mobiletek Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---------    -----------------------------------------------------------------
+  20241022    yq.wang      Created .
+-------------------------------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "ql_test_utils.h"
+#include "ql_type.h"
+#include "ql_gnss.h"
+
+#define IS_DIGIT(x)    ( ((x-'0')>=0) && ((x-'0')<=9) )
+
+
+static void gnss_ind_cb(void *msg)
+{
+    uint8_t *msg_id = NULL; 
+    msg_id = msg;
+    if(*msg_id == QL_GNSS_NMEA_MSG)
+    {
+        nmea_srv_ind_msg *data = (nmea_srv_ind_msg *)msg;
+        printf("time=%d %s",data->time,data->nmea_sentence);
+    }
+    else if (*msg_id == QL_GNSS_STATUS_MSG)
+    {
+        gnss_status_ind_msg *data = (gnss_status_ind_msg *)msg;
+        switch(data->g_status)
+        {
+            case QL_GNSS_STATUS_FOTA_START:
+                printf("gnss engine fota req\n");
+                break;    
+            case QL_GNSS_STATUS_FOTA_BOOT:
+                printf("gnss engine fota bootloader\n");
+                break;    
+            case  QL_GNSS_STATUS_FOTA_FIRM:
+                printf("gnss engine fota firmware\n");
+                break;    
+            case  QL_GNSS_STATUS_WORKING:
+                printf("gnss engine working\n");
+                break;    
+            default:
+                break;
+        };
+    }
+    else
+    {
+      printf("Invalue msg !!!");
+    }
+}
+
+#if 0
+static void gnss_service_error_cb(int error)
+{
+    printf("===== GNSS Service Abort =====\n");
+}
+#endif
+
+static void item_ql_gnss_init(void)
+{
+    int err = QL_ERR_OK;
+    printf("Start to ql_gnss_init\n");
+    err = ql_gnss_init();
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_gnss_init, err=%d\n", err);
+    }
+}
+
+
+static void item_ql_gnss_set_ind_cb(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_set_ind_cb\n");
+    err = ql_gnss_set_ind_cb(gnss_ind_cb);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to ql_gnss_set_ind_cb, err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static void item_ql_gnss_set_service_error_cb(void)
+{
+    int err = QL_ERR_OK;
+    printf("Start to item_ql_gnss_set_service_error_cb\n");
+    err = ql_gnss_set_service_error_cb(gnss_service_error_cb);
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to item_ql_gnss_set_service_error_cb, err=%d\n", err);
+    }
+
+}
+#endif
+
+static void item_ql_gnss_start(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_start\n");
+    err = ql_gnss_start();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to start gnss , err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_stop(void)
+{
+    int err = QL_ERR_OK;
+    
+    printf("Start to ql_gnss_stop\n");
+    err = ql_gnss_stop();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to stop gnss, err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static void item_ql_gnss_get_engine_state(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_ENGINE_STATE_E state = 0;
+
+    printf("Start ql_gnss_get_engine_state : \n");
+    err = ql_gnss_get_engine_state(&state);
+    if(err != QL_ERR_OK)
+    {
+        printf("Get engine state  faild %d\n",err);
+    }
+    else
+    {
+        if(state)
+        {
+            printf("Engine state is on\n");
+        }
+        else
+        {
+            printf("Engine state is off\n");
+        }
+    }
+}
+#endif
+
+#if 0
+static void ql_gnss_get_constellation_show(char *str_p, QL_GNSS_CONSTELLATION_MASK_E mask)
+{
+    switch (mask)
+    {
+    case GPS_ONLY:
+        snprintf(str_p, 100, "%s", "GPS");
+        break;
+    case BDS_ONLY:
+        snprintf(str_p, 100, "%s", "BDS_ONLY");
+        break;
+    case GPS_BDS:
+        snprintf(str_p, 100, "%s", "GPS+BDS");
+        break;
+    case GLONASS_ONLY:
+        snprintf(str_p, 100, "%s", "GLONASS_ONLY");
+        break;
+    case GPS_GLONASS:
+        snprintf(str_p, 100, "%s", "GPS+GLONASS");
+        break; 
+    case BDS_GLONASS:
+        snprintf(str_p, 100, "%s", "BDS+GLONASS");
+        break;
+    case GPS_BDS_GLONASS:
+        snprintf(str_p, 100, "%s", "GPS+BDS+GLONASS");
+        break;
+    case GPS_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+SBAS+QZSS");
+        break;
+    case GPS_BDS_GALILEO_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+BDS+GALILEO+SBAS+QZSS");
+        break;
+    case GPS_GLONASS_GALILEO_SBAS_QZSS:
+        snprintf(str_p, 100, "%s", "GPS+GLONASS+GALILEO+SBAS+QZSS");
+        break;
+    default:
+        snprintf(str_p, 100, "%s", "error");
+        break;
+    };
+}
+
+static void item_ql_gnss_get_constellation(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_CONSTELLATION_MASK_E mask = 0;
+    printf("Start ql_gnss_get_constellation : \n");
+    err = ql_gnss_get_constellation(&mask);
+    if (err != QL_ERR_OK)
+    {
+        printf("Set Constellation  faild %d\n", err);
+    }
+    else
+    {
+        switch (mask)
+        {
+        case GPS_SBAS_QZSS:
+            printf("GPS+SBAS+QZSS\n");
+            break;
+        case BDS_ONLY:
+            printf("BDS_ONLY\n");
+            break;
+        case GPS_BDS_GALILEO_SBAS_QZSS:
+            printf("GPS+BDS+GALILEO+SBAS+QZSS\n");
+            break;
+        case GPS_GLONASS_GALILEO_SBAS_QZSS:
+            printf("GPS+GLONASS+GALILEO+SBAS+QZSS\n");
+            break;
+        case GPS_ONLY:
+            printf("GPS_ONLY\n");
+            break;
+        case GPS_BDS:
+            printf("GPS_BDS\n");
+            break;
+        case GLONASS_ONLY:
+            printf("GLONASS_ONLY\n");
+            break;
+        case GPS_GLONASS:
+            printf("GPS+GLONASS\n");
+            break;
+        case BDS_GLONASS:
+            printf("BDS+GLONASS\n");
+            break;
+        case GPS_BDS_GLONASS:
+            printf("GPS+BDS+GLONASS\n");
+            break;
+        default:
+            break;
+        };
+    }
+}
+
+/*
+EC200 Supported constellations
+(GPS+SBAS+QZSS--0x08|BDS_ONLY--0x10|GPS+BDS+GALILEO+SBAS+QZSS--0x11|GPS+GLONASS+GALILEO+SBAS+QZSS--0x101)");
+
+AG35CET  Supported constellations
+(GPS_ONLY--0x01|BDS_ONLY--0x02|GPS_BDS--0x03|GLONASS_ONLY--0x04)|GPS_GLONASS--0x05|BDS_GLONASS--0x06|GPS_BDS_GLONASS--0x07")
+
+AG35EUT  Supported constellations
+(GPS_ONLY--0x01|BDS_ONLY--0x02|GPS_BDS--0x03|GLONASS_ONLY--0x04)|GPS_GLONASS--0x05|BDS_GLONASS--0x06|GPS_BDS_GLONASS--0x07|
+GALILEO_ONLY--0x08|GPS_GALILEO--0x09|BD_GALILEO--0x10|GPS_BDS_GLONASS_GALILEO--0x11")
+*/
+static void item_ql_gnss_set_constellation(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input = 0;
+    QL_GNSS_CONSTELLATION_MASK_E constellation = 0;
+    printf("Please input gnss constellation:\n");
+    scanf("%x",&input);
+    printf("input=%x\n",input);
+    constellation = (QL_GNSS_CONSTELLATION_MASK_E)input;
+    err = ql_gnss_set_constellation(constellation);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set gnss constellation mask:%x err=%d\n",constellation,err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static void item_ql_gnss_set_nmea_type(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input = 0;
+
+    printf("Please input nmea type bitmask:\n");
+    printf("(GST|ZDA|VTG|RMC|GSV|GSA|GLL|GGA)(HEX Base, i.e.0xff)\n");
+    scanf("%x",&input);
+    printf("input=%x\n",input);
+    err = ql_gnss_set_nmea_type(input);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set nmea type with type:%x: err=%d\n",input,err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+static void item_ql_gnss_get_nmea_version(void)
+{
+    int err = QL_ERR_OK;
+    QL_GNSS_NMEA_VERSION_ID_E version = 0;
+
+    printf("Start to get nmea_version \n");
+    err = ql_gnss_get_nmea_version(&version);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to get nmea_version with version:%d, err=%d\n",version, err);
+    }
+    else
+    {
+        printf("Successful\n");
+        if(QL_GNSS_NMEA_VERSION_V30 == version)
+        {
+            printf("Nmea_version is 3.0\n");
+        }
+        else if(QL_GNSS_NMEA_VERSION_V41 == version)
+        {
+            printf("Nmea_version is 4.0\n");
+        }
+    }
+    
+}
+
+
+static void item_ql_gnss_set_nmea_version(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+    QL_GNSS_NMEA_VERSION_ID_E version;
+    
+    printf("Please input nmea verson : 0--nema v3.0|1--nema v4.1\n");
+    scanf("%d",&input);
+    printf("Start to set nmea_version with version:%d\n",input);
+    version = (QL_GNSS_NMEA_VERSION_ID_E)input;
+    err = ql_gnss_set_nmea_version(version);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set nmea_version with version:%d, err=%d\n",version, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+#endif
+
+static void item_ql_gnss_set_start_mode(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+    QL_GNSS_START_MODE_E mode;
+
+    printf("Please input mode : 0--cold start|1--warm start|2--hot start\n");
+    scanf("%d",&input);
+    printf("Start to ql_set_start_mode with modem:%d\n",input);
+    mode = (QL_GNSS_START_MODE_E)input;
+    err = ql_gnss_set_start_mode(mode);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Start to ql_set_start_mode with modem:%d, err=%d\n",mode, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_set_agnss_mode(void)
+{
+    int err = QL_ERR_OK;
+    uint32_t input=0;
+
+    printf("Please input mode : 0x01--GPS| 0x02--BD| 0x04--GLONASS| 0x08--GALILEO| 0x10--QZSS \n");
+    scanf("%x",&input);
+    printf("Start to ql_set_agnss_mode with modem:%x\n",input);
+    err = ql_gnss_set_agnss_mode(input);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Start to ql_set_agnss_mode with modem:%d, err=%d\n",input, err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+
+}
+
+static void item_ql_gnss_inject_agnss_data(void)
+{
+    int err = QL_ERR_OK;
+
+    err = ql_gnss_inject_agnss_data();
+    if (err != QL_ERR_OK)
+    {
+        printf("Failed to inject agnss  err=%d\n", err);
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+#if 0
+static int convertUtcTimeMsec(char *utc_str,uint64_t *msec)
+{
+    int i =0;
+    int temp =0;
+    int date[6] = {0};
+    char ch;
+    unsigned char field = 0;
+    struct tm t;
+    while(1)
+    {
+        ch = utc_str[i++];
+
+        if(IS_DIGIT(ch))
+        {
+            temp *= 10;
+            temp += ch - '0';
+        }
+        else if(ch == ' ')
+        {
+            continue;
+        }
+        else if(ch == '-' || ch == ' ' || ch == ':' || ch == '\0')
+        {
+            date[field] = temp;
+            field++;
+            temp = 0;
+
+            if(ch == '\0')
+            {
+                printf("parse char success\n");
+                break;
+            }
+        }
+        else
+        {
+            printf("ch=%c,ch=%d,invalid char\n",ch,ch);
+            return -1;
+        }
+    }
+
+    if(date[0] < 1900
+        || date[1] < 1 || date[1] > 12
+        || date[2] < 1 || date[2] > 31
+        || date[3] < 0 || date[3] > 23
+        || date[4] < 0 || date[4] > 59
+        || date[5] < 0 || date[5] > 59
+         ) 
+     {
+         return -1;
+     }
+
+     t.tm_sec = date[5];
+     t.tm_min = date[4];
+     t.tm_hour = date[3];
+     t.tm_mday = date[2];
+     t.tm_mon = date[1] -1;
+     t.tm_year = date[0] - 1900;
+     t.tm_isdst = 0;
+
+     *msec = (uint64_t)1000 * (uint64_t)mktime(&t);
+     return 0;
+
+}
+
+static void item_ql_gnss_inject_utc_time(void)
+{
+    int err = QL_ERR_OK;
+    int input = 0;
+    uint64_t utc_time;
+    char buff[128]={0};
+    printf("Start ql_inject_utc_time : \n");
+    printf("Please Select Time:\n1-Current System time\n2-Input Time,Format:YYYY-MM-DD hh:mm:ss\n:");
+    scanf("%d",&input);
+    if(err !=0)
+    {
+        printf("Input error\n");
+        return ;
+    }
+    switch(input)
+    {
+        case 1:
+            utc_time=(uint64_t)time(NULL)*1000;
+            system("date");
+            break;
+        case 2:
+            err = t_get_string(buff, sizeof(buff));
+            if(err !=0)
+            {
+                printf("Input error\n");
+                return ;
+            }
+            convertUtcTimeMsec(buff,&utc_time);
+            break;
+            default:
+                printf("Not select!!!\n");
+                return ;
+    }
+    err = ql_gnss_inject_utc_time(utc_time);
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to Inject Utc Time  %d\n",err);
+    }
+    else
+    {
+        printf("Successful!\n");
+    }
+}
+
+
+
+
+static void item_ql_gnss_suspend(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_suspend\n");
+    err = ql_gnss_suspend();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set ql_gnss_suspend\n");
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+
+
+static void item_ql_gnss_resume(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_resume\n");
+    err = ql_gnss_resume();
+    if(err != QL_ERR_OK)
+    {
+        printf("Failed to set ql_gnss_resume\n");
+    }
+    else
+    {
+        printf("Successful\n");
+    }
+}
+#endif
+
+static void item_ql_gnss_deinit(void)
+{
+    int err = QL_ERR_OK;
+
+    printf("Start to ql_gnss_deinit\n");
+    err = ql_gnss_deinit();
+    if(err == QL_ERR_OK)
+    {
+        printf("Successful\n");
+    }
+    else
+    {
+        printf("Failed to ql_gnss_deinit, err=%d\n", err);
+    }
+}
+
+static t_item_t ql_gnss_items[] = 
+{
+    {"ql_gnss_init", item_ql_gnss_init},
+    {"ql_gnss_nmea_ind_cb", item_ql_gnss_set_ind_cb},
+//    {"ql_gnss_get_engine_state",item_ql_gnss_get_engine_state},
+    {"ql_gnss_start",item_ql_gnss_start},
+    {"ql_gnss_stop", item_ql_gnss_stop},
+//    {"ql_gnss_get_nmea_version",item_ql_gnss_get_nmea_version},
+//    {"ql_gnss_set_nmea_version",item_ql_gnss_set_nmea_version},
+//    {"ql_gnss_set_nmea_type",item_ql_gnss_set_nmea_type},
+//    {"ql_gnss_get_constellation",item_ql_gnss_get_constellation},
+//    {"ql_gnss_set_constellation",item_ql_gnss_set_constellation},  
+    {"ql_gnss_set_start_mode",item_ql_gnss_set_start_mode},
+    {"ql_gnss_set_agnss_mode",item_ql_gnss_set_agnss_mode},
+    {"ql_gnss_inject_agnss_data",item_ql_gnss_inject_agnss_data},
+//    {"ql_gnss_inject_utc_time",item_ql_gnss_inject_utc_time},
+//    {"ql_gnss_suspend", item_ql_gnss_suspend},
+//    {"ql_gnss_resume", item_ql_gnss_resume},
+//    {"ql_gnss_set_service_error_cb",item_ql_gnss_set_service_error_cb},
+    {"ql_gnss_deinit", item_ql_gnss_deinit},
+};
+
+t_module_t ql_gnss_module =
+{
+    "gnss",
+    T_ARRAY_SIZE(ql_gnss_items),
+    ql_gnss_items
+};
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief Read a int value from stdin 
+  @param[out] val, Return read data
+  @return 
+  0 - successful
+  1 - read an enter 
+  -1 - invalid input
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int t_get_int(int *val)
+{
+    int dat;
+    char *ptr_end = NULL;
+    char buf[256] = {0};
+
+    if(NULL == fgets(buf, sizeof(buf)-1, stdin))
+    {
+        return -1;
+    }
+#if 0    
+    if(0 == buf[0])
+    {
+        return -1;
+    }
+#endif
+    if(buf[0] == '\n')
+    {
+        return 1;
+    }
+
+    dat = strtol(buf, &ptr_end, 10);
+    if(ptr_end!=NULL && ptr_end[0]!='\n')
+    {
+        return -1;
+    }
+
+    if(val)
+    {
+        val[0] = dat;
+    }
+
+    return 0;
+}
+
+void dump_items()
+{
+    int i;
+
+    printf("\n");
+    printf("The current module is: \n");
+
+    for(i=0; i< ql_gnss_module.item_len; i++)
+    {
+        printf("%d\t%s\n", i, ql_gnss_module.item_list[i].name);
+    }
+    printf("-1\texit\n");
+}
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int idx;
+
+    dump_items();
+
+    while(1)
+    {
+        printf("Please enter your choice: ");
+        ret = t_get_int(&idx);
+        printf("\n");
+        if(ret < 0)
+        {
+            printf("Invalid input\n");
+            continue;
+        }
+        else if(ret == 1)
+        {
+            dump_items();
+            continue;
+        }
+
+        if(idx == -1)
+        {
+            break;
+        }
+
+        if(idx<0 || idx>=ql_gnss_module.item_len)
+        {
+            printf("Not support idx: %d\n", idx);
+            continue;
+        }
+
+        printf("->Item : %s\n", ql_gnss_module.item_list[idx].name);
+        ql_gnss_module.item_list[idx].handle();
+    }
+
+    return 0;
+}
+