[Feature][T8TSK-289]merge old platform branch, add meta to public rep
Only Configure: No
Affected branch: MR3.0-Merge-v2.0
Affected module: all lynq
Is it affected on both ZXIC and MTK: only MTK
Self-test: No
Doc Update: No
diff --git a/common_src/lib/liblynq-at-fota/lynq_at_fota.cpp b/common_src/lib/liblynq-at-fota/lynq_at_fota.cpp
new file mode 100755
index 0000000..148214c
--- /dev/null
+++ b/common_src/lib/liblynq-at-fota/lynq_at_fota.cpp
@@ -0,0 +1,300 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "include/libat/lynq_at_fota.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <log/log.h>
+#include "mtk_device_wrap.h"
+#include "include/iot_rock.h"
+
+#define UPDATA_ADDR "/tmp/fota.delta"
+#define READ_BLOCK_SIZE 0x40000
+#define FLASH_DEV_DELTA "/dev/mtd41"
+#define LOG_TAG "AT-FOTA"
+
+lynq_atsvc_outcb g_handle_output;
+char str[128];
+char g_buffer[128] = {0};
+int Response = 0;
+int g_lynq_fota_md5_flag = -1;
+char g_put_addr[64];
+char g_put_path[35];
+char g_cmd[128];
+
+void *deal_download()
+{
+ int ret;
+ RLOGD("start deal_download !!!\n");
+ ret = system(g_cmd);
+ RLOGD("ret:%d \n", ret);
+ if(ret != 0)
+ {
+ strcpy(str, "+FOTA: fota download fail\n");
+ g_handle_output(str, strlen(str), Response);
+ return NULL;
+ }
+ else
+ {
+ strcpy(str, "+FOTA: fota download success\n");
+ g_handle_output(str, strlen(str), Response);
+ }
+ return NULL;
+}
+
+
+int lynq_download_package(char (*string)[35])
+{
+ int ret = 0;
+ int str_num = -1;
+ pthread_t tid;
+
+ RLOGD("function %s start\n", __FUNCTION__);
+ for(int i = 0; i < 9; i++)
+ {
+ if(string[i] == NULL)
+ {
+ strcpy(str, "+FOTA: download data null\n");
+ g_handle_output(str, strlen(str), Response);
+ return 1;
+ }
+ }
+
+ if(strlen(string[9]) == 0)
+ {
+ ret = chdir("/tmp/");
+ if( 0 != ret)
+ {
+ RLOGD("/tmp/ is error\n");
+ strcpy(str, "+FOTA: the tmp is error\n");
+ g_handle_output(str, strlen(str), Response);
+ return ret;
+ }
+ strcpy(g_put_path, "/tmp/");
+ }
+ else
+ {
+ ret = chdir(string[9]);
+ if( 0 != ret)
+ {
+ RLOGD("%s is error directory \n", string[9]);
+ strcpy(str, "+FOTA: NO such directory\n");
+ g_handle_output(str, strlen(str), Response);
+ return ret;
+ }
+ strcpy(g_put_path, string[9]);
+ }
+
+ sprintf(g_cmd,"wget ftp://%s:%s@%s:%s%s%s",string[2],string[3],string[0],string[1],string[7],string[8]);
+ RLOGD("g_cmd:%s\n", g_cmd);
+ str_num = strlen(g_put_path);
+
+ if(g_put_path[str_num - 1] == '/')
+ {
+ sprintf(g_put_addr,"%s%s", g_put_path, string[8]);
+ }
+ else
+ {
+ sprintf(g_put_addr,"%s/%s", g_put_path, string[8]);
+ }
+ RLOGD("g_put_addr: %s\n", g_put_addr);
+ if(lynq_fota_set_addr_value(g_put_addr,strlen(g_put_addr)))
+ {
+ strcpy(str, "+FOTA: set fota addr fail\n");
+ g_handle_output(str, strlen(str), Response);
+ }
+
+ pthread_create(&tid,NULL,deal_download,NULL);
+ pthread_detach(tid);
+
+ return ret;
+}
+
+/*
+ * @brief Differential subcontracting MD5 check
+ *
+ * @param string:MD5 value,Subcontracting address,Refer to the fota documentation
+ */
+
+int lynq_md5_package(char (*string)[35])
+{
+ char input_md5_data[64] = {0};
+ RLOGD("function %s start\n", __FUNCTION__);
+ for(int i = 0; i < 2; i++)
+ {
+ if(string[i] == NULL)
+ {
+ strcpy(str, "+FOTA: md5 value null\n");
+ g_handle_output(str, strlen(str), Response);
+ return 1;
+ }
+ }
+
+ sprintf(input_md5_data,"%s",string[0]);
+ RLOGD("input_md5_data: %s\n", string[0]);
+ g_lynq_fota_md5_flag = lynq_md5_file_verfy(g_put_addr, input_md5_data);
+ if(g_lynq_fota_md5_flag != 0)
+ {
+ strcpy(str, "+FOTA: md5 fail\n");
+ g_handle_output(str, strlen(str), Response);
+ return 1;
+ }
+ return 0;
+}
+
+/**
+ * @brief fota
+ *
+ * @param void
+ */
+int lynq_fota_try(void)
+{
+ RLOGD("function %s start\n", __FUNCTION__);
+ if(g_lynq_fota_md5_flag == 0) //upgrade success ,device reboot ,lynq_fota_md5_flag no need to reset
+ {
+ if(0 != lynq_rock_main(1))
+ {
+ g_lynq_fota_md5_flag = -1;
+ strcpy(str, "+FOTA: update fail\n");
+ g_handle_output(str, strlen(str), Response);
+ return 1;
+ }
+ }
+ else
+ {
+ strcpy(str, "+FOTA: md5 verify fail\n");
+ g_handle_output(str, strlen(str), Response);
+ return 1;
+ }
+
+ return 0;
+}
+
+void lynq_at_fota(char (*argv)[35])
+{
+ int result;
+ RLOGD("function %s start\n", __FUNCTION__);
+ RLOGD("buffer: %s",g_buffer);
+ if(!(strcmp(argv[0], "AT+FOTA?")))
+ {
+ if(strlen(g_buffer) == 0)
+ {
+ strcpy(str, "+FOTA: OK\n");
+ }
+ else
+ {
+ sprintf(str, "+FOTA: %s\n",g_buffer);
+
+ }
+ g_handle_output(str, strlen(str), Response);
+ return ;
+ }
+ else if(!(strcmp(argv[0], "AT+FOTA=?")))
+ {
+ strcpy(str, "+FOTA:(0-2),""\n");
+ g_handle_output(str, strlen(str), Response);
+ return ;
+
+ }
+ if(!(strcmp(argv[0], "AT+FOTA=0")) || !(strcmp(argv[0], "AT+LYNQFOTA=download")))
+ {
+ RLOGD("argv[0]: %s\n", argv[0]);
+ if(!(strcmp(argv[1], "ftp")))
+ {
+ result = lynq_download_package(&argv[2]);
+ if(result != 0)
+ {
+ strcpy(str, "+FOTA: DOWNLOAD FAIL\n");
+ }
+ else
+ {
+ strcpy(str, "+FOTA: DOWNLOAD START\n");
+ }
+ }
+ else
+ {
+ strcpy(str, "+FOTA: NO FTP DOWNLOAD\n");
+ }
+ }
+
+ else if(!(strcmp(argv[0], "AT+FOTA=1")) || !(strcmp(argv[0], "AT+LYNQFOTA=md5")))
+ {
+ RLOGD("argv[0]: %s\n", argv[0]);
+ result = lynq_md5_package(&argv[1]);
+ if(result != 0)
+ {
+ strcpy(str, "+FOTA: MD5 FAIL\n");
+ }
+ else
+ {
+ strcpy(str, "+FOTA: MD5 SUCCESS\n");
+ }
+ }
+ else if(!(strcmp(argv[0], "AT+FOTA=2")) || !(strcmp(argv[0], "AT+LYNQFOTA=upgrade")))
+ {
+ RLOGD("argv[0]: %s\n", argv[0]);
+ result = lynq_fota_try();
+ if(result == 0)
+ {
+ strcpy(str, "+FOTA: UPDATE SUCCESS\n");
+ }
+ else
+ {
+ strcpy(str, "+FOTA: UPDATE FAIL\n");
+ }
+ }
+ else
+ {
+ strcpy(str, "+CME: ERROR: 100\n");
+
+ }
+ g_handle_output(str, strlen(str), Response);
+
+}
+
+void lynq_at_fota_cb(char *input, int input_max_size)
+{
+ char arry[20][35]={};
+ char *p = NULL;
+ int i = 0;
+
+ if(input[8] == '0')
+ {
+ strcpy(g_buffer, input);
+ }
+ if(g_handle_output != NULL)
+ {
+ RLOGD("function %s start,input: %s \n", __FUNCTION__, input);
+ if(input != NULL)
+ {
+ while(( p = strsep(&input,",")) != NULL)
+ {
+ strcpy(arry[i],p);
+ i++;
+ }
+ lynq_at_fota(arry);
+ }
+ }
+
+}
+
+
+lynq_atsvc_incb lynq_register_fota(lynq_atsvc_outcb out_cb)
+{
+ if(out_cb != NULL)
+ {
+ g_handle_output = out_cb;
+ RLOGD("function %s start\n", __FUNCTION__);
+ return lynq_at_fota_cb;
+ }
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+