[Feature][T108][task-view-1945]Provide complete firmware version and Resolve timeout problems

Only Configure:No
Affected branch:GSW_V1453
Affected module:firmware update
Is it affected on:asr
Doc Update:No

Change-Id: I3505dc78b2dad33aef3685d31682f5bd286f4af2
diff --git a/mbtk/libgsw_lib/gsw_gnss_interface.c b/mbtk/libgsw_lib/gsw_gnss_interface.c
index 73b31d7..5b7f455 100755
--- a/mbtk/libgsw_lib/gsw_gnss_interface.c
+++ b/mbtk/libgsw_lib/gsw_gnss_interface.c
@@ -14,6 +14,7 @@
 #include <dlfcn.h>

 #include <stdint.h>

 #include <stdbool.h>

+#include <ctype.h>

 

 #include "gsw_gnss_interface.h"

 

@@ -124,6 +125,13 @@
     GSW_DEVICE got_hd8;

 } rx_ctx;

 

+typedef struct {

+    int  fd;

+    char *buf_8040_1;

+    char *buf_8040_2;

+    char *buf_8040;

+} rx_ctx_8040;

+

 static GSW_DEVICE gsw_device = NO_DEVICE;

 GSW_GNSS_MODE_CONFIGURATION_HD map_gnss_mode(GSW_GNSS_MODE_CONFIGURATION mode)

 {

@@ -158,13 +166,85 @@
     }

 }  

 

+static void *rx_thread_8040(void *arg)

+{

+    rx_ctx_8040 *c = (rx_ctx_8040 *)arg;

+    char buf[128];

+    ssize_t n;

+    time_t end = time(NULL) + 1;//1s

+    

+    while (time(NULL) < end) {

+        n = read(c->fd, buf, sizeof(buf));

+        if (n > 0 && memmem(buf, n, "HD8040D", 7)) 

+        {

+            int start_index = 6;

+

+            int part1_start = start_index;

+            int part1_end = 19;

+            int part1_len = part1_end - part1_start + 1;

+

+            int part2_start = 22;

+            int part2_end = 37;

+            int part2_len = part2_end - part2_start + 1;

+

+            if (c->buf_8040_1 != NULL)

+            {

+                free(c->buf_8040_1);

+                c->buf_8040_1 = NULL;

+            }

+            

+            c->buf_8040_1 = (char *)malloc(part1_len + 1);

+            if (c->buf_8040_1 != NULL)

+            {

+                memcpy(c->buf_8040_1, buf + part1_start, part1_len);

+                c->buf_8040_1[part1_len] = '\0';

+            }

+

+            if (c->buf_8040_2 != NULL)

+            {

+                free(c->buf_8040_2);

+                c->buf_8040_2 = NULL;

+            }

+            

+            c->buf_8040_2 = (char *)malloc(part2_len + 1);

+            if (c->buf_8040_2 != NULL)

+            {

+                memcpy(c->buf_8040_2, buf + part2_start, part2_len);

+                c->buf_8040_2[part2_len] = '\0';

+            }

+

+            if (c->buf_8040_1 != NULL && c->buf_8040_2 != NULL)

+            {

+                if (c->buf_8040 != NULL)

+                {

+                    free(c->buf_8040);

+                    c->buf_8040 = NULL;

+                }

+

+                int total_len = strlen(c->buf_8040_1) + strlen(c->buf_8040_2) + 1;

+                c->buf_8040 = (char *)malloc(total_len);

+                if (c->buf_8040 != NULL)

+                {

+                    strcpy(c->buf_8040, c->buf_8040_1);

+                    strcat(c->buf_8040, c->buf_8040_2);

+                }

+            }

+            else

+            {

+                LOGE(GSW_GNSS, "Failed to extract version parts");

+            }

+            break;

+        }

+    }

+    return NULL;

+}

+

 static void *rx_thread(void *arg)

 {

     rx_ctx *c = (rx_ctx *)arg;

     char buf[128];

     ssize_t n;

     time_t end = time(NULL) + 1;            /* 1 秒超时 */

-

     while (time(NULL) < end) {

         n = read(c->fd, buf, sizeof(buf));

         if (n > 0 && memmem(buf, n, "HD8040D", 7)) {

@@ -176,6 +256,7 @@
 			break;

 		}

     }

+

     return NULL;

 }

 

@@ -206,6 +287,7 @@
     return gsw_device;

 }

 

+

 int mbtk_gnss_set_VTG()

 {

     int ret;

@@ -736,7 +818,6 @@
     }

 }

 

-

 /**

 * @brief Start install gnss software

 * @param  [in] char* file_path

@@ -745,24 +826,31 @@
 */

 int gsw_update_gnss_start(const char *fw_path)

 {

-    int ret;

-    mbtk_gnss_dl_ptr = (int(*)(const char *, int))dlsym(dlHandle_gnss, "mbtk_gnss_dl");

-    if (!mbtk_gnss_dl_ptr) 

+    if (fw_path == NULL)

     {

-        LOGE(GSW_GNSS,"[qser_gnss] dlsym failed for mbtk_gnss_dl: %s", dlerror());

+        LOGE(GSW_GNSS, "[qser_gnss] Input fw_path is null");

         return GSW_HAL_NORMAL_FAIL;

     }

 

-    ret = mbtk_gnss_dl_ptr(fw_path, QSER_GNSS_TIMEOUT);

+    int ret;

+    mbtk_gnss_dl_ptr = (int(*)(const char *, int))dlsym(dlHandle_gnss, "mbtk_gnss_dl");

+

+    ret = mbtk_gnss_dl_ptr(fw_path, 60);

     if(ret != 0)

     {

-        LOGE(GSW_GNSS,"[qser_gnss] Firmware download failed. ret = [%d]", ret);

-        return GSW_HAL_NORMAL_FAIL;

+        if(ret != 4)

+        {

+            LOGE(GSW_GNSS,"[qser_gnss] Firmware download failed. ret = [%d]", ret);

+            return GSW_HAL_NORMAL_FAIL;

+        }

+        else

+        {

+            LOGW(GSW_GNSS,"[qser_gnss] Firmware download warning (ignored). ret = [%d]", ret);

+        }

     }

     return GSW_HAL_SUCCESS;

 }

 

-

 /**

 * @brief get gnss version info

 * @param  [in] NULL

@@ -771,31 +859,57 @@
 */

 int32_t gsw_get_gnss_version_info(char* version_info)

 {

-    if (!version_info)

+    if (version_info == NULL)

     {

-        LOGE(GSW_GNSS, "[GSW_gnss] version_info is NULL");

-        return GSW_HAL_NORMAL_FAIL;

+        LOGE(GSW_GNSS, "version_info is NULL");

+        return GSW_HAL_ERROR_GNSS_FAIL;

     }

 

-    GSW_DEVICE dev_type = get_gnss_device_version();

-    switch (dev_type)

+    int fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY);

+    if (fd < 0)

     {

-        case HD8122:

-            strncpy(version_info, "HD8122", 255);

-            break;

-        case HD8040D:

-            strncpy(version_info, "HD8040D", 255);

-            break;

-        case NO_DEVICE:

-        default:

-            LOGE(GSW_GNSS, "[GSW_gnss] Failed to detect GNSS device");

-            return GSW_HAL_NORMAL_FAIL;

+        LOGE(GSW_GNSS, "Failed to open /dev/ttyS3: %s", strerror(errno));

+        return GSW_HAL_ERROR_GNSS_FAIL;

     }

 

-    version_info[255] = '\0';

-    LOGE(GSW_GNSS, "[GSW_gnss] Retrieved GNSS version: %s", version_info);

-    return GSW_HAL_SUCCESS;

+    rx_ctx_8040 thread_args = {

+        .fd = fd,

+        .buf_8040 = NULL

+    };

+

+    pthread_t read_thread_8040;

+    if (pthread_create(&read_thread_8040, NULL, rx_thread_8040, &thread_args) != 0)

+    {

+        LOGE(GSW_GNSS, "Failed to create read thread");

+        close(fd);

+        return GSW_HAL_ERROR_GNSS_FAIL;

+    }

+

+    unsigned char tx_cmd[] = {0xF1, 0xD9, 0x0A, 0x04, 0x00, 0x00, 0x0E, 0x34};

+    int ret = write(fd, tx_cmd, sizeof(tx_cmd));

+    if (ret != sizeof(tx_cmd))

+    {

+        LOGE(GSW_GNSS, "[GSW_gnss] send_and_wait write fail.ret = [%d]", ret);

+        pthread_cancel(read_thread_8040);

+        close(fd);

+        return GSW_HAL_ERROR_GNSS_FAIL;

+    }

+

+    pthread_join(read_thread_8040, NULL);

+    close(fd);

+    if (thread_args.buf_8040 != NULL)

+    {

+        strncpy(version_info, thread_args.buf_8040, 128);

+        version_info[127] = '\0';

+        free(thread_args.buf_8040);

+        LOGE(GSW_GNSS, "Final version info: %s", version_info);

+        return GSW_HAL_SUCCESS;

+    }

+    else

+    {

+        LOGE(GSW_GNSS, "No data received or HD8040 not found");

+        return GSW_HAL_ERROR_GNSS_FAIL;

+    }

 }

 

 

-