[Feature][S300][task-view-902][project] add s300 common project
Change-Id: I5e0ce7e50fb0b968befef03ad42bae55f43287d6
diff --git a/lynq/S300_COMMON/ap/app/wefota/wefota_device.c b/lynq/S300_COMMON/ap/app/wefota/wefota_device.c
new file mode 100755
index 0000000..b294271
--- /dev/null
+++ b/lynq/S300_COMMON/ap/app/wefota/wefota_device.c
@@ -0,0 +1,242 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "wefota_device.h"
+
+static int g_first_check_tesk = 0;
+
+int get_iccid(char *iccid)
+{
+ if (iccid == NULL) {
+ return -1;
+ }
+ char buf[32] = {0} ;
+ cfg_get_item("sim_iccid", buf, sizeof(buf));
+ strcpy(iccid, buf);
+ return 0;
+}
+
+int get_imei(char *imei)
+{
+ if (imei == NULL) {
+ return -1;
+ }
+ char buf[32] = {0};
+ cfg_get_item("imei", buf, sizeof(buf));
+ strcpy(imei, buf);
+ return 0;
+}
+
+int get_version(char *version)
+{
+ if (version == NULL) {
+ return -1;
+ }
+ char buf[30] = {0};
+ cfg_get_item("wa_version", buf, sizeof(buf));
+ strcpy(version, buf);
+ return 0;
+}
+
+int is_data_connected(void)
+{
+ char buf[32] = {0};
+ cfg_get_item("ppp_status", buf, sizeof(buf));
+ if (strcmp(buf, "ppp_connected") == 0) {
+ return 1;
+ }
+ return 0;
+}
+
+int get_wefota_server1_cfg(char *ip, int *port)
+{
+ if (ip == NULL || port == NULL) {
+ return -1;
+ }
+ char buf[32] = {0};
+ cfg_get_item("wefota_server1_ip", buf, sizeof(buf));
+ strcpy(ip, buf);
+ cfg_get_item("wefota_server1_port", buf, sizeof(buf));
+ *port = atoi(buf);
+ return 0;
+}
+
+int set_wefota_server2_cfg(const char *ip, int port)
+{
+ if (ip == NULL) {
+ return -1;
+ }
+ cfg_set("wefota_server2_ip", ip);
+ char buf[32] = {0};
+ sprintf(buf, "%d", port);
+ cfg_set("wefota_server2_port", buf);
+ return 0;
+}
+
+int get_last_work_time(int *time, int *interval)
+{
+ if (time == NULL || interval == NULL) {
+ return -1;
+ }
+ char buf[32] = {0};
+ cfg_get_item("wefota_last_work_time", buf, sizeof(buf));
+ *time = atoi(buf);
+ cfg_get_item("wefota_last_work_interval", buf, sizeof(buf));
+ *interval = atoi(buf);
+ return 0;
+}
+
+int set_last_work_time(int time, int interval)
+{
+ char buf[32] = {0};
+ sprintf(buf, "%d", time);
+ cfg_set("wefota_last_work_time", buf);
+ sprintf(buf, "%d", interval);
+ cfg_set("wefota_last_work_interval", buf);
+ return 0;
+}
+
+static int fota_is_file_exist(const char* path)
+{
+ if ( (path == NULL) || (*path == '\0') )
+ return 0;
+ if (access(path, R_OK) != 0)
+ return 0;
+
+ return 1;
+}
+
+static int fota_read_file(const char*path, char*buf, size_t sz)
+{
+ int fd = -1;
+ size_t cnt;
+
+ fd = open(path, O_RDONLY, 0);
+ if(fd < 0)
+ {
+ printf("fota_read_file failed to open %s\n", path);
+ cnt = -1;
+ return cnt;
+ }
+ cnt = read(fd, buf, sz - 1);
+ if(cnt <= 0)
+ {
+ printf("failed to read %s\n", path);
+ close(fd);
+ cnt = -1;
+ return cnt;
+ }
+ buf[cnt] = '\0';
+ if(buf[cnt - 1] == '\n')
+ {
+ cnt--;
+ buf[cnt] = '\0';
+ }
+ close(fd);
+
+ return cnt;
+}
+
+static int fota_read_file_int(const char* path, int *val)
+{
+ char buf[32];
+ char *end;
+ int ret;
+ int tmp;
+
+ ret = fota_read_file(path, buf, sizeof(buf));
+ if(ret < 0)
+ return -1;
+
+ tmp = strtol(buf, &end, 0);
+ if ((end == buf) || ((end < buf + sizeof(buf)) && (*end != '\0')))
+ {
+ return -1;
+ }
+
+ *val = tmp;
+
+ return 0;
+}
+
+static int fota_get_update_status(int *fota_status)
+{
+
+ int status = 0;
+ int ret = 0;
+ if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE))
+ {
+ *fota_status = -1;
+ return -1;
+ }
+ ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);
+ if(ret < 0) {
+ *fota_status = -1;
+ return -1;
+ }
+ *fota_status = status;
+ return 0;
+}
+
+int start_wefota_install(void)
+{
+ int upgradeStatus = 0;
+ int result = 0;
+
+ system("fota_upi -u verify");
+ result = fota_get_update_status(&upgradeStatus);
+ if(result < 0)
+ {
+ printf("failed to read the update_status file\n");
+ return -1;
+ }
+ else if(upgradeStatus != 0)
+ {
+ printf("verify failed\n");
+ return -1;
+ }
+ else
+ {
+ printf("verify success, start upgrade!\n");
+ system("fota_upi -u recovery");
+ }
+
+ return 0;
+}
+
+int wait_fota_conditions(void)
+{
+ // wait for data connected
+ while (1) {
+ if (is_data_connected()) {
+ break;
+ }
+ sleep(10);
+ }
+
+ // wait for sntp time sync
+ sleep(10);
+ srand(time(NULL));
+
+ // wait for fota time
+ while (1) {
+ int last_time = 0;
+ int interval = 0;
+ get_last_work_time(&last_time, &interval);
+ int cur_time = time(NULL);
+ if ((last_time + interval < cur_time) || g_first_check_tesk == 0) {
+ break;
+ }
+ sleep(10);
+ }
+
+ g_first_check_tesk = 1;
+ //set last work time
+ int interval = FOTA_INTERVAL_MIN + rand() % FOTA_INTERVAL_RANDOM;
+ set_last_work_time(time(NULL), interval);
+
+ return 0;
+}