[Feature][R305][task-view-1233][webui] add r305 v2 app

Change-Id: I8c2d738b1cb7f8384bc4f0731986f4f0308d6c67
diff --git a/lynq/R305/ap/app/Script/Makefile b/lynq/R305/ap/app/Script/Makefile
index 2065e63..7bde2a3 100755
--- a/lynq/R305/ap/app/Script/Makefile
+++ b/lynq/R305/ap/app/Script/Makefile
@@ -40,7 +40,8 @@
 endif

 wifi:

 	@echo "copying wifi script"

-	

+

+	$(CP) -rf ./wifi_script/realtek/zte_qrcode_create.sh  $(ROMFS_DIR)/sbin/

 ifeq ($(CONFIG_WIFI_MODULE), realtek)

 	@echo "copying wifi realtek script"

 	mkdir -p $(ROMFS_DIR)/etc_ro/ 

diff --git a/lynq/R305/ap/app/cgi/Makefile b/lynq/R305/ap/app/cgi/Makefile
new file mode 100755
index 0000000..935f4b4
--- /dev/null
+++ b/lynq/R305/ap/app/cgi/Makefile
@@ -0,0 +1,55 @@
+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+include $(zte_app_mak)

+include $(COMMON_MK)

+

+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub

+##############USER COMIZE BEGIN################

+EXEC = upload.cgi

+OBJS = cgi.o

+

+#*******************************************************************************

+# include path

+#*******************************************************************************

+CFLAGS += -I./

+CFLAGS += -I../include

+CFLAGS += -I../zte_comm/nvserver

+CFLAGS += -I$(LIB_DIR)/libnvram

+CFLAGS += -I$(APP_DIR)/include                                                   

+CFLAGS += -g -Werror=implicit-function-declaration 

+

+CFLAGS += -I$(zte_app_path)/include

+CFLAGS += -I$(zte_lib_path)/libnvram

+CFLAGS += -I$(LINUX_DIR)

+CFLAGS += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv

+CFLAGS += -O -Dlinux=1 -DHIGH_SPEED=1

+

+CFLAGS += -I$(zte_lib_path)/libsoftap

+CFLAGS += -I$(zte_lib_path)/libsoft_timer

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+ifeq ($(LINUX_TYPE),uClinux)

+LDFLAGS += -Wl,--allow-multiple-definition,-elf2flt=-s131072

+endif

+

+LDLIBS  += -latutils -L$(zte_lib_path)/libatutils

+LDLIBS  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+

+##############USER COMIZE END##################

+

+all: $(EXEC)

+

+$(EXEC): $(OBJS) 

+	$(CC) $(LDFLAGS) -o $@ $(OBJS)  -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+

+romfs:

+	$(ROMFSINST)  /sbin/$(EXEC)

+

+clean:

+	-rm -f $(EXEC) *.elf *.gdb *.o
\ No newline at end of file
diff --git a/lynq/R305/ap/app/cgi/cgi.c b/lynq/R305/ap/app/cgi/cgi.c
new file mode 100755
index 0000000..b026367
--- /dev/null
+++ b/lynq/R305/ap/app/cgi/cgi.c
@@ -0,0 +1,350 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include <errno.h>

+

+#define BUFFER_SIZE (1024 * 20) // Define the buffer size for each read

+#define FIND_STR_LEN 128 // Define the length of the string to find

+#define FOTA_UPDATE_STATUS_FILE "/cache/zte_fota/update_status"

+

+// Custom memmem function

+static void* custom_memmem(const void* haystack, size_t haystack_len, const void* needle, size_t needle_len)

+{

+    if (needle_len == 0 || haystack_len < needle_len)

+    {

+        return NULL;

+    }

+

+    size_t i = 0;

+    const unsigned char* h = (const unsigned char*)haystack;

+    const unsigned char* n = (const unsigned char*)needle;

+

+    for (i = 0; i <= haystack_len - needle_len; ++i)

+    {

+        if (memcmp(h + i, n, needle_len) == 0)

+        {

+            return (void*)(h + i);

+        }

+    }

+

+    return NULL;

+}

+

+// Remove the last boundary marker from the file

+static int remove_last_boundary(const char *filename, const char *boundary_marker, int boundary_marker_len)

+{

+    int fd = open(filename, O_RDWR);

+    if (fd == -1)

+    {

+        perror("Unable to open file for reading and writing");

+        return 1;

+    }

+

+    // Get the file size

+    off_t file_size = lseek(fd, 0, SEEK_END);

+    if (file_size == -1)

+    {

+        perror("Unable to get file size");

+        close(fd);

+        return 1;

+    }

+

+    // Search for the boundary_marker from the end of the file

+    off_t search_start = file_size - FIND_STR_LEN;

+    if (search_start < 0)

+    {

+        search_start = 0;

+    }

+

+    lseek(fd, search_start, SEEK_SET);

+

+    char buffer[FIND_STR_LEN + 1]; // +1 for storing '\0'

+    int bytes_read = read(fd, buffer, FIND_STR_LEN);

+    if (bytes_read <= 0)

+    {

+        perror("Unable to read file");

+        close(fd);

+        return 1;

+    }

+    buffer[bytes_read] = '\0'; // Ensure the string is null-terminated

+

+    // Find the boundary_marker

+    char *boundary = custom_memmem(buffer, bytes_read, boundary_marker, boundary_marker_len);

+    if (boundary)

+    {

+        // Found boundary_marker, calculate the truncate position

+        off_t truncate_pos = search_start + (boundary - buffer);

+        if (ftruncate(fd, truncate_pos) == -1)

+        {

+            perror("Unable to truncate file");

+            close(fd);

+            return 1;

+        }

+    }

+

+    close(fd);

+    return 0;

+}

+

+// Function to handle file upload

+static int handle_file_upload(const char *source_filename, const char *target_filename, int content_length)

+{

+    char buffer[BUFFER_SIZE];

+    int bytes_read;

+    int target_fd = -1;

+    int source_fd = -1; // Source file descriptor

+    char *content_start_ptr = NULL;

+    int content_start = 0;

+    const char *boundary_marker = "\r\n------WebKitFormBoundary"; // Boundary marker

+    int boundary_marker_len = strlen(boundary_marker);

+

+    // Open the target file

+    target_fd = open(target_filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);

+    if (target_fd == -1)

+    {

+        perror("Unable to open target file");

+        return 1;

+    }

+

+    // Open the source file

+    source_fd = open(source_filename, O_RDONLY);

+    if (source_fd == -1)

+    {

+        perror("Unable to open source file");

+        close(target_fd);

+        return 1;

+    }

+

+    // Read the request header to find the start position of file content

+    bytes_read = read(source_fd, buffer, BUFFER_SIZE);

+    if (bytes_read <= 0)

+    {

+        printf("Content-type: text/html\r\n\r\n");

+        printf("<h1>Error: Failed to read data</h1>");

+        printf("<p>Error number: %d - %s</p>", errno, strerror(errno));

+        close(target_fd);

+        close(source_fd);

+        return 1;

+    }

+

+    // Find the start position of the file content (usually after \r\n\r\n)

+    content_start_ptr = strstr(buffer, "\r\n\r\n");

+    if (!content_start_ptr)

+    {

+        printf("Content-type: text/html\r\n\r\n");

+        printf("<h1>Error: Unable to find the start position of file content</h1>");

+        close(target_fd);

+        close(source_fd);

+        return 1;

+    }

+

+    // Calculate the actual start position of the file content

+    content_start = content_start_ptr - buffer + 4;

+

+    // Write the first part of the file content

+    if (content_start < bytes_read)

+    {

+        if (write(target_fd, buffer + content_start, bytes_read - content_start) == -1)

+        {

+            perror("Unable to write to target file");

+            close(target_fd);

+            close(source_fd);

+            return 1;

+        }

+    }

+

+    // Update the remaining content length

+    content_length -= (bytes_read - content_start);

+

+    // Continue reading and writing the file in segments

+    while (content_length > 0)

+    {

+        bytes_read = read(source_fd, buffer, BUFFER_SIZE);

+        if (bytes_read <= 0)

+        {

+            // If reading is complete, normally break out of the loop

+            break;

+        }

+

+        // Write the file content

+        if (write(target_fd, buffer, bytes_read) == -1)

+        {

+            perror("Unable to write to target file");

+            close(target_fd);

+            close(source_fd);

+            return 1;

+        }

+

+        // Update the remaining content length

+        content_length -= bytes_read;

+    }

+

+    // Close file descriptors

+    close(target_fd);

+    close(source_fd);

+

+    // Remove the last boundary marker from the file

+    return remove_last_boundary(target_filename, boundary_marker, boundary_marker_len);

+}

+

+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: %s\n", path, strerror(errno));

+		cnt = -1;

+		return cnt;

+	}

+	cnt = read(fd, buf, sz - 1);

+	if(cnt <= 0)

+	{

+		printf("failed to read %s: %s\n", path, strerror(errno));

+		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;

+

+	errno = 0;

+	tmp = strtol(buf, &end, 0);

+	if (errno == ERANGE)

+    {

+		printf("strtol errno %d: %s\n", errno, strerror(errno));

+	}

+

+	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;

+}

+

+static void print_json_response(int success, const char* message)

+{

+    printf("Content-type: application/json\r\n\r\n");

+    printf("{\"success\": %d, \"message\": \"%s\"}\n", success, message);

+}

+

+static void cgi_fota_update_progress()

+{

+    int upgradeStatus, result;

+

+    system("fota_upi -u verify > /dev/null 2>&1");

+    result = fota_get_update_status(&upgradeStatus);

+    if(result < 0)

+    {

+        print_json_response(0, "Fail to read update file");

+    }

+    else if(upgradeStatus != 0)

+    {

+        print_json_response(0, "Verify update file failed");

+    }

+    else

+    {

+        print_json_response(1, "File verification successful, start updating...");

+        sleep(1);

+        system("fota_upi -u recovery > /dev/null 2>&1 &");

+    }

+}

+

+int main()

+{

+    const char *source_filename = "/tmp/firmware_tmp_file"; // Source file path

+    const char *target_filename = "/cache/zte_fota/delta.package";  // Target file path

+    const char *content_length_str = NULL;

+    int content_length = 0;

+

+    system("rm -rf /cache/zte_fota");

+	system("mkdir -p /cache/zte_fota");

+

+    // Get environment variables

+    content_length_str = getenv("CONTENT_LENGTH");

+    if (!content_length_str)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "Missing CONTENT_LENGTH environment variable");

+        return 1;

+    }

+

+    content_length = atoi(content_length_str);

+    if (content_length <= 0)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "Invalid CONTENT_LENGTH");

+        return 1;

+    }

+

+    // Call the file upload handling function

+    if (handle_file_upload(source_filename, target_filename, content_length) != 0)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "File upload failed");

+        return 1;

+    }

+

+    // Output success information

+    //print_json_response(1, "File upload successful");

+    system("rm -rf /tmp/firmware_tmp_file");

+

+    cgi_fota_update_progress();

+

+    return 0;

+}

diff --git a/lynq/R305/ap/app/goahead/interface5.0/wifi/zte_web_lan.c b/lynq/R305/ap/app/goahead/interface5.0/wifi/zte_web_lan.c
index 6d93328..769d598 100755
--- a/lynq/R305/ap/app/goahead/interface5.0/wifi/zte_web_lan.c
+++ b/lynq/R305/ap/app/goahead/interface5.0/wifi/zte_web_lan.c
@@ -293,8 +293,10 @@
 	wifi_on = websGetVar(wp, T("wifiEnabled"), NULL);
 	if (wifi_on != NULL) {
 		if (STR_EQUAL(wifi_on, "0")) {
+			NV_WRITE("wifi_switch_status", "web_close", nv_ret);
 			slog(MISC_PRINT, SLOG_ERR, T("UFIx User disable WIFI swtich!\n"));
 		} else if (STR_EQUAL(wifi_on, "1")) {
+			NV_WRITE("wifi_switch_status", "web_open", nv_ret);
 			slog(MISC_PRINT, SLOG_ERR, T("UFIx User enable WIFI swtich!\n"));
 		}
 		NV_READ("wifiEnabled", old_wifi_on, nv_ret);
diff --git a/lynq/R305/ap/app/goahead/interface5.0/zte_web_interface.h b/lynq/R305/ap/app/goahead/interface5.0/zte_web_interface.h
index c8d9c11..3212b47 100755
--- a/lynq/R305/ap/app/goahead/interface5.0/zte_web_interface.h
+++ b/lynq/R305/ap/app/goahead/interface5.0/zte_web_interface.h
@@ -383,6 +383,7 @@
 
 #define GOFORM_SET_NETWORK_ADB "NETWORK_ADB"
 #define GOFORM_COMMAND "COMMAND"
+#define GOFORM_NETWORK_INFO "NETWORK_INFO"
 
 /****************************All the web pages' URL************************************/
 #define ZTE_WEB_PAGE_LOGIN_NAME   			"index.html"
@@ -1086,6 +1087,7 @@
 
 extern void zte_goform_set_network_adb(webs_t wp);
 extern void zte_goform_set_command(webs_t wp);
+extern void zte_goform_get_network_info(webs_t wp);
 
 /**
 * @brief Data to be decoded.
diff --git a/lynq/R305/ap/app/goahead/interface5.0/zte_web_mgmt.c b/lynq/R305/ap/app/goahead/interface5.0/zte_web_mgmt.c
index bbb685a..538cf26 100755
--- a/lynq/R305/ap/app/goahead/interface5.0/zte_web_mgmt.c
+++ b/lynq/R305/ap/app/goahead/interface5.0/zte_web_mgmt.c
@@ -569,6 +569,7 @@
 	}
 
 	cfg_set("mgmt_quicken_power_on", mgmt_quicken_power_on);
+	cfg_save();
 
 	zte_write_result_to_web(wp, SUCCESS);
 }
@@ -2833,7 +2834,7 @@
 	*dst = '\0';
 }
 
-static void executeCommand(const char *command, char *result)
+static void executeCommand(const char *command, char *result, int size)
 {
 	if (command == NULL || strlen(command) == 0)
 	{
@@ -2847,7 +2848,7 @@
 		perror("popen failed");
 		return;
 	}
-	int nread = fread(result, 1, 256, pipe);
+	int nread = fread(result, 1, size, pipe);
 	if (nread > 0)
 	{
 		result[nread - 1] = '\0';
@@ -2874,6 +2875,141 @@
 	}
 }
 
+static void parse_at_response(const char *response, char **params, int *param_count, char *at, int count)
+{
+	const char *start = strstr(response, at);
+	if (start == NULL)
+	{
+		printf("Response does not contain the expected prefix.\n");
+		return;
+	}
+
+	start += strlen(at);
+	char *token = strtok((char *)start, ",");
+	*param_count = 0;
+
+	while (token != NULL && *param_count < count)
+	{
+		params[(*param_count)++] = token;
+		token = strtok(NULL, ",");
+	}
+}
+
+#define MIN_RSRQ_VALUE -19.5  // „1¤7„1¤7§³dB0ö5
+#define STEP_SIZE 0.5          // 0‹7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤704„1¤7„1¤7„1¤7
+#define MAX_RSRQ_INDEX 34      // „1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7
+
+static float get_rsrq_db_value(int rsrq_index)
+{
+    if (rsrq_index < 0 || rsrq_index > MAX_RSRQ_INDEX)
+	{
+        return -1000.0;
+    }
+
+    float lower_bound = MIN_RSRQ_VALUE + rsrq_index * STEP_SIZE;
+
+    return lower_bound;
+}
+
+void zte_goform_get_network_info(webs_t wp)
+{
+	char response[1024];
+	char tmp[16] = {0};
+	char plmn[16] = {0};
+	char *params[15];
+	int param_count = 0;
+	int i = 0;
+	char rsrp[16] = {0};
+	char cell_id[16] = {0};
+
+	executeCommand("at at+ZSINR 2>&1", response, sizeof(response));
+	const char *start = strstr(response, "+ZSINR: ");
+	if (start != NULL)
+	{
+		start += strlen("+ZSINR: ");
+		char *sinr = strtok((char *)start, ",");
+		if (atoi(sinr) == -20)
+		{
+			cfg_set("lte_sinr", "--");
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+		}
+		else
+		{
+			cfg_set("lte_sinr", sinr);
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s dB\","), "lte_sinr", sinr);
+		}
+	}
+	else
+	{
+		cfg_set("lte_sinr", "--");
+		web_feedback_header(wp);
+		(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+	}
+
+	executeCommand("at at+ZEMSCIQ=1 2>&1", response, sizeof(response));
+	if (strstr(response, "+CME ERROR:") != NULL)
+	{
+		printf("----No network\n");
+		cfg_set("lte_plmn", "--");
+		cfg_set("lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_band", "--");
+	}
+	else
+	{
+		parse_at_response(response, params, &param_count, "+ZEMSCIQ: ", 12);
+		for (i = 0; i < param_count; i++)
+		{
+			printf("Parameter[%d]: %s\n", i, params[i]);
+		}
+		printf("======set lte_plmn=%s lte_pci=%s lte_band=%s lte_rsrq=%s\n", params[5], params[6], params[8], params[10]);
+		float db_value = get_rsrq_db_value(atoi(params[10]));
+		if (db_value == -1000.0)
+		{
+			cfg_set("lte_rsrq", " ");
+		}
+		else
+		{
+			sprintf(tmp, "%d", (int)db_value);
+			cfg_set("lte_rsrq", tmp);
+		}
+
+		snprintf(plmn, strlen(params[5]) - 1, "%s", params[5] + 1);
+		cfg_set("lte_plmn", plmn);
+		cfg_set("lte_pci", params[6]);
+		cfg_get_item("cell_id", cell_id, sizeof(cell_id));
+		cfg_get_item("lte_rsrp", rsrp, sizeof(rsrp));
+		if (strlen(rsrp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dBm\","), "lte_rsrp", rsrp);
+		}
+		if (strlen(tmp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dB\","), "lte_rsrq", tmp);
+		}
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", plmn);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", cell_id);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_band", params[8]);
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_pci", params[6]);
+	}
+
+	return;
+}
+
 void zte_goform_set_command(webs_t wp)
 {
 	MSG_BUF stMsg = {0};
@@ -2917,7 +3053,7 @@
 				replace_slash_with_backslash(value);
 				printf("replace value:%s\n", value);
 			}
-			executeCommand(value, result);
+			executeCommand(value, result, sizeof(result));
 			printf("Command Output:\n%s\n", result);
 			zte_write_result_to_web(wp, result);
 			return;
diff --git a/lynq/R305/ap/app/goahead/interface5.0/zte_web_util.c b/lynq/R305/ap/app/goahead/interface5.0/zte_web_util.c
index cee52d0..ade98ec 100755
--- a/lynq/R305/ap/app/goahead/interface5.0/zte_web_util.c
+++ b/lynq/R305/ap/app/goahead/interface5.0/zte_web_util.c
@@ -127,6 +127,7 @@
 	{CMD_HTTPSHARE_GETCARD_VAULE, zte_httpShare_getcard_value},
 	{CMD_HTTPSHARE_GETCARD_NMEA, zte_httpShare_getcard_name},
 	{CMD_HTTPSHARE_AUTH_GET, zte_httpShare_auth_get},
+	{GOFORM_NETWORK_INFO, zte_goform_get_network_info},
 };
 
 
diff --git a/lynq/R305/ap/app/goahead/server/cgi.c b/lynq/R305/ap/app/goahead/server/cgi.c
index c9286c6..8bf5bb3 100755
--- a/lynq/R305/ap/app/goahead/server/cgi.c
+++ b/lynq/R305/ap/app/goahead/server/cgi.c
@@ -59,10 +59,11 @@
 		}
 	//	fmtAlloc(&cgiPath, FNAMESIZE, T("%s/%s/%s"), websGetDefaultDir(),
 	//		CGI_BIN, cgiName);
-		fmtAlloc(&cgiPath, FNAMESIZE, T("%s/%s"),"/etc_ro/cgi-bin", cgiName);
+		fmtAlloc(&cgiPath, FNAMESIZE, T("%s/%s"),"/sbin", cgiName);
 		{
 			gstat_t 	sbuf;
 			if (gstat(cgiPath, &sbuf) != 0 || (sbuf.st_mode & S_IFREG) == 0) {
+				system("rm -rf /tmp/firmware_tmp_file");
 				websError(wp, 200, T("CGI process file does not exist"));
 				bfree(B_L, cgiPath);
 				return 1;
@@ -162,6 +163,7 @@
 	
 		if ((pHandle = websLaunchCgiProc(cgiPath, argp, envp, stdIn, stdOut)) 
 			== -1) {
+			system("rm -rf /tmp/firmware_tmp_file");
 			websError(wp, 200, T("failed to spawn CGI task"));
 			for (ep = envp; *ep != NULL; ep++) {
 				bfreeSafe(B_L, *ep);
diff --git a/lynq/R305/ap/app/goahead/server/goahead.c b/lynq/R305/ap/app/goahead/server/goahead.c
index 680db6a..3fe84c3 100755
--- a/lynq/R305/ap/app/goahead/server/goahead.c
+++ b/lynq/R305/ap/app/goahead/server/goahead.c
@@ -110,7 +110,7 @@
 	zte_httpshare_init();//httpshare
 	websUrlHandlerDefine(T("/"), NULL, 0, websHomePageHandler, 0); 
 
-	system("rm -rf /firmware_tmp_file");
+	system("rm -rf /tmp/firmware_tmp_file");
 	return 0;
 }
 
diff --git a/lynq/R305/ap/app/goahead/server/webs.c b/lynq/R305/ap/app/goahead/server/webs.c
index b0238e1..93d50e0 100755
--- a/lynq/R305/ap/app/goahead/server/webs.c
+++ b/lynq/R305/ap/app/goahead/server/webs.c
@@ -731,7 +731,7 @@
 		{
 			if(gstrstr(url, CGI_FIRMWARE_UPLOAD) != NULL){
 				wp->flags |= WEBS_CGI_FIRMWARE_UPLOAD;
-				system("rm -rf  /firmware_tmp_file");
+				system("rm -rf /tmp/firmware_tmp_file");
 				zte_mgmt_login_timemark_set();
 				printf("[goahead]set WEBS_CGI_FIRMWARE_UPLOAD \n");
 			}
diff --git a/lynq/R305/ap/app/goahead/server/webs.h b/lynq/R305/ap/app/goahead/server/webs.h
index 9dcb6af..ed80948 100755
--- a/lynq/R305/ap/app/goahead/server/webs.h
+++ b/lynq/R305/ap/app/goahead/server/webs.h
@@ -72,8 +72,8 @@
 #define CGI_FIRMWARE_WRITE      T("upload.write")
 #define CGI_HTTPSHARE_UPLOAD      T("httpshare.up")
 
-//#define FIRMWARE_TMP_FILE                  T("/var/firmware_tmp_file")
-#define FIRMWARE_TMP_FILE                  T("/firmware_tmp_file")
+#define FIRMWARE_TMP_FILE                  T("/tmp/firmware_tmp_file")
+//#define FIRMWARE_TMP_FILE                  T("/firmware_tmp_file")
 
 //added by liuyingnan for PC Client begin, 20120829
 #define WEBS_REST_CLIENT_REQUEST       0x200000
diff --git a/lynq/R305/ap/app/zte_comm/at_ctl/inc/ps_normal.h b/lynq/R305/ap/app/zte_comm/at_ctl/inc/ps_normal.h
index c3b81f4..78df499 100755
--- a/lynq/R305/ap/app/zte_comm/at_ctl/inc/ps_normal.h
+++ b/lynq/R305/ap/app/zte_comm/at_ctl/inc/ps_normal.h
@@ -454,6 +454,7 @@
     {ZAT_SYSINFORES_SYSMODE_TDD_LTE,        "4G"     }

 };

 

+#if 0

 static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_SET_SUBNETTYPE[] =

 {

     {1,        "GSM" },

@@ -468,6 +469,22 @@
     {10,       "FDD_LTE" },

     {11,       "HSPA+" },  //utran

 };

+#endif

+

+static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_SET_SUBNETTYPE[] =

+{

+    {1,        "2G" },

+    {2,        "2G" },

+    {3,        "2G" },

+    {4,        "3G" },  //WCDMA

+    {5,        "3G" },  //utran

+    {6,        "3G" },  //utran

+    {7,        "3G" },  //utran

+    {8,        "3G" },

+    {9,        "4G" },

+    {10,       "4G" },

+    {11,       "3G" },  //utran

+};

 

 static const T_zAt_QualcommListNode  G_ZAT_QUALCOMMLISTNODE[]=

 {

diff --git a/lynq/R305/ap/app/zte_comm/wlan/src/wlan_config_ssid.c b/lynq/R305/ap/app/zte_comm/wlan/src/wlan_config_ssid.c
index 4d61610..ca89d23 100755
--- a/lynq/R305/ap/app/zte_comm/wlan/src/wlan_config_ssid.c
+++ b/lynq/R305/ap/app/zte_comm/wlan/src/wlan_config_ssid.c
@@ -259,6 +259,32 @@
 #endif
 	return;
 }
+static void generate_random_string(char *str, int seed) 
+{
+	int i = 0;
+	int random_index = 0;
+    const char charset[] = "abcdefghjkmnpqrstuwxyzACDEFGHJKLMNPQRSTUWXYZ2345679!@#%";
+    const int charsetSize = sizeof(charset) - 1; 
+
+    if (str == NULL)
+	{
+        wf_log("Provided string does not have enough space to store the result.\n");
+        return;
+    }
+
+	srand(seed);
+
+    for (i = 0; i < 8; i++) 
+	{
+        random_index = rand() % charsetSize;
+        str[i] = charset[random_index];
+    }
+
+    str[8] = '\0';
+
+	return;
+}
+
 
 static int make_wifikey (CHAR * key, CHAR * m_key)
 {
@@ -476,6 +502,10 @@
 	INT  i = 0;
 	INT  valid_mac = 0;
 	INT  len = 0, len1 = 0;
+	char generate_seed[32] = {0};
+	char m_generate_seed[32] = {0};
+	int seed = 0;
+	int m_seed = 0;
 
 	ret = cfg_get_item ("wifi_mac_num", wifi_mac_num_str, sizeof (wifi_mac_num_str));
 	if (ret == 0) {
@@ -531,8 +561,16 @@
 
 //    setWifiWpsDefPin();
 
-	generate_ascii_password (read_mac, outpassword, sizeof (outpassword));
-	generate_ascii_password (m_read_mac, m_outpassword, sizeof (m_outpassword));
+	// generate_ascii_password (read_mac, outpassword, sizeof (outpassword));
+	// generate_ascii_password (m_read_mac, m_outpassword, sizeof (m_outpassword));
+	strncpy(generate_seed, &read_mac[6], 6);
+	sscanf(generate_seed, "%X", &seed);
+	strncpy(m_generate_seed, &m_read_mac[6], 6);
+	sscanf(m_generate_seed, "%X", &m_seed);
+	wf_log("generate_seed = %s, m_generate_seed = %s", generate_seed, m_generate_seed);
+	wf_log("seed = %d, m_seed = %d", seed, m_seed);
+	generate_random_string(outpassword, seed);
+	generate_random_string(m_outpassword, m_seed);
 	make_wifikey (outpassword, m_outpassword);
 	make_user_mac (read_mac);
 
diff --git a/lynq/R305/ap/app/zte_comm/wlan/src/wlan_main.c b/lynq/R305/ap/app/zte_comm/wlan/src/wlan_main.c
index cb43bef..41aba2c 100755
--- a/lynq/R305/ap/app/zte_comm/wlan/src/wlan_main.c
+++ b/lynq/R305/ap/app/zte_comm/wlan/src/wlan_main.c
@@ -246,6 +246,7 @@
 static void sleep_wifi()

 {

 	cfg_set ("wifiSleep", "1");

+	cfg_set("wifiEnabled", "0");

 	cancel_all_timer();

 	ap_server->basic_deal (ap_server, WIFI_CFG_SLEEP); //sleep no real action meaning,just readable

 	

diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery.c
index 330b954..e7f40ad 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery.c
@@ -28,15 +28,15 @@
                             È«¾Ö±äÁ¿¶¨Òå
 ***********************************************************************************/
 
-static UINT32 s_mmi_poweroff_voltage_num = 0;//¶Áµ½µÍµç¹Ø»úµçѹµÄ´ÎÊý£¬Á¬ÐøÈý´Î×Ô¶¯¹Ø»ú
-static SINT32 g_mmi_voltageEx = 0;//ÿ20s²éѯµçѹʱ£¬±£´æÉÏÒ»´ÎµÄµçѹ
-static E_zMmi_Charge_State s_mmi_charge_state = STATE_CHARGE_MAX; //ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æµ±Ç°µÄ³äµç״̬
-static E_zMmi_Charge_State s_mmi_charge_stateEx = STATE_CHARGE_MAX;//ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æÉÏÒ»´ÎµÄ³äµç״̬
-static E_zMmi_Voltage_level s_mmi_voltage_level = VOLT_MAX;//²éѯµçѹʱ£¬¸ù¾Ýµçѹֵ±£´æµ±Ç°µçÁ¿·¶Î§
+static volatile UINT32 s_mmi_poweroff_voltage_num = 0;//¶Áµ½µÍµç¹Ø»úµçѹµÄ´ÎÊý£¬Á¬ÐøÈý´Î×Ô¶¯¹Ø»ú
+static volatile SINT32 g_mmi_voltageEx = 0;//ÿ20s²éѯµçѹʱ£¬±£´æÉÏÒ»´ÎµÄµçѹ
+static volatile E_zMmi_Charge_State s_mmi_charge_state = STATE_CHARGE_MAX; //ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æµ±Ç°µÄ³äµç״̬
+static volatile E_zMmi_Charge_State s_mmi_charge_stateEx = STATE_CHARGE_MAX;//ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æÉÏÒ»´ÎµÄ³äµç״̬
+static volatile E_zMmi_Voltage_level s_mmi_voltage_level = VOLT_MAX;//²éѯµçѹʱ£¬¸ù¾Ýµçѹֵ±£´æµ±Ç°µçÁ¿·¶Î§
 
-static BOOL g_mmi_chg_switch_off = FALSE;//¼Ç¼³äµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí³äµç
-static BOOL s_mmi_usb_insert_status = FALSE;//0:USB²åÈë״̬ 1:USB δ²åÈë״̬
-static SINT32 s_mmi_battery_pers = 0;//µçÁ¿°Ù·Ö±ÈÇø¼ä
+static volatile BOOL g_mmi_chg_switch_off = FALSE;//¼Ç¼³äµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí³äµç
+static volatile BOOL s_mmi_usb_insert_status = FALSE;//0:USB²åÈë״̬ 1:USB δ²åÈë״̬
+static volatile SINT32 s_mmi_battery_pers = 0;//µçÁ¿°Ù·Ö±ÈÇø¼ä
 
 static MMI_TEMP_DETECT last_temp = MMI_TEMP_DETECT_MAX;//µç³ØÉÏÒ»´ÎζÈ״̬
 static SINT32 s_mmi_temp_count = 0;//ζÈÒ쳣ʱ¼ÆÊýÆ÷£¬Á¬Ðø3´Îºó½øÐÐÏàÓ¦´¦Àí
@@ -132,10 +132,35 @@
 ***********************************************************************************/
 static void mmi_lowbattery_shutdown(UINT32 voltagepower)
 {
-	if (voltagepower < POWEROFFLEVEL) {
+	FILE *fp;
+	char buff[16];
+	int ret;
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_lowbattery_shutdown %d %d\n", s_mmi_poweroff_voltage_num, voltagepower);
+	if (voltagepower < POWEROFFLEVEL && s_mmi_charge_state != STATE_CHARGING) {
 		s_mmi_poweroff_voltage_num ++ ;
-		if (s_mmi_poweroff_voltage_num == 3) {
+		if (s_mmi_poweroff_voltage_num >= 3) {
 			s_mmi_poweroff_voltage_num = 0;
+			fp = fopen("/sys/class/power_supply/boost/boost_enabled", "r");
+			buff[0] = '\0';
+			if (fp != NULL && (ret=fread(buff, 1, 16, fp)) > 0 && buff[0] == '1')
+			{
+				fclose(fp);
+				buff[ret]='\0';
+				slog(MMI_PRINT, SLOG_NORMAL, "enable flag %s\n", buff);
+				system(MMI_TURN_OFF_DISCHG);
+				if (0 == ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_ADVANCED, 2, "0", 0))
+				{
+					slog(MMI_PRINT, SLOG_NORMAL, "suspend,lowerbattery!!!\n");
+					get_modem_info("AT+CFUN=0\r", NULL,  NULL);
+					system("echo mmi_main_lock > /sys/power/wake_unlock");
+					system("echo ufiwakelock > /sys/power/wake_unlock");
+					system("echo mem > /sys/power/autosleep");
+					return;
+				}
+				return;
+			}
+			if (fp != NULL)
+				fclose(fp);
 			mmi_set_abnormal_poweroff_flag();
 
 			slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI poweroff,lowerbattery!!!\n");
@@ -154,7 +179,9 @@
 {
 	int cur_power = 0;
 	int bat_level = 0;
-	if (g_mmi_voltageEx != 0) {
+	if (g_mmi_voltageEx != 0 && s_mmi_charge_state == STATE_CHARGING) {
+		cur_power = voltagepower > g_mmi_voltageEx ? voltagepower : g_mmi_voltageEx;
+	} else if (g_mmi_voltageEx != 0) {
 		cur_power = voltagepower < g_mmi_voltageEx ? voltagepower : g_mmi_voltageEx;
 	} else {
 		cur_power = voltagepower;
@@ -236,8 +263,13 @@
 	if (chg_sta == STATE_CHARGING) {
 		s_mmi_charge_state = STATE_CHARGING;
 		mmi_set_webUI_batterycharge(WEBUICHARGING, FALSE);
-		g_mmi_voltageEx = 0;
+		//g_mmi_voltageEx = 0;
 		mmi_set_mode_fast_poweron(TRUE);
+
+		power = mmi_voltage_state_read();
+		if (power > 0 && power < INT_MAX) {//kw 3
+			mmi_battery_capacity_compare(power);
+		}
 	} else if (chg_sta == STATE_FULL) {
 		s_mmi_charge_state = STATE_FULL;
 		g_mmi_voltageEx = 0;
@@ -349,6 +381,32 @@
 	}
 	return NULL;
 }
+static void update_charge_state_only(void)
+{
+	E_zMmi_Charge_State chg_sta = STATE_CHARGE_MAX;
+	chg_sta = mmi_get_charge_status();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI update_charge_state_only chg_sta = %d!!\n", chg_sta);
+	s_mmi_charge_stateEx = STATE_CHARGE_MAX;
+	s_mmi_poweroff_voltage_num = 0;
+	if (chg_sta == STATE_CHARGING) {
+		s_mmi_charge_state = STATE_CHARGING;
+		mmi_set_webUI_batterycharge(WEBUICHARGING, FALSE);
+	} else if (chg_sta == STATE_FULL) {
+		s_mmi_charge_state = STATE_FULL;
+		g_mmi_voltageEx = 0;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, TRUE);
+	} else if (chg_sta == STATE_DISCHARGE) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+	} else if (chg_sta == STATE_CHARGERROR) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_set_battery_info invalid charge state!! power=%d\n");
+	}
+	
+	mmi_set_battery_update();
+}
 
 /**********************************************************************************
 *º¯Êý˵Ã÷£º´Ónetlink¼àÌýµ½µÄÏûÏ¢×Ö·û´®´¦Àí³äµçÏûÏ¢
@@ -399,6 +457,36 @@
 			}
 		}
 	}
+	else if ((subsys != NULL) && (action != NULL)) {
+		if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "remove")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			system(MMI_TURN_OFF_CHG);
+			system(MMI_TURN_OFF_DISCHG);
+			update_charge_state_only();
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event remove %d\n",s_mmi_voltage_level);
+			//if (s_mmi_voltage_level > VOLT_20PERCENTLEVEL)
+				//system(USB_SET_ROLE_DEF_SRC);
+			//else
+				//system(USB_SET_ROLE_DEF_SNK);
+		}
+		else if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "add")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			update_charge_state_only();
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event add %d\n",s_mmi_voltage_level);
+			/*
+			if (system(USB_TYPE_AC_PC_CHECK) == 1) {
+				if (s_mmi_voltage_level <= VOLT_50PERCENTLEVEL)
+					system(MMI_TURN_OFF_DISCHG);
+				if (s_mmi_voltage_level <= VOLT_20PERCENTLEVEL)
+					system(USB_SET_ROLE_DEF_SNK);
+				else if (s_mmi_voltage_level > VOLT_50PERCENTLEVEL)
+					system(USB_SET_ROLE_DEF_SRC);
+			}*/
+
+		}
+	}
 }
 
 int battery_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)
@@ -440,6 +528,35 @@
 			}
 		}
 	}
+	else if ((subsys != NULL) && (action != NULL)) {
+		if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "remove")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			system(MMI_TURN_OFF_CHG);
+			system(MMI_TURN_OFF_DISCHG);
+			update_charge_state_only();
+		    slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event2 remove %d\n",s_mmi_voltage_level);
+			
+			//if (s_mmi_voltage_level > VOLT_20PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SRC);
+			//else
+				//system(USB_SET_ROLE_DEF_SNK);
+		}
+		else if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "add")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			update_charge_state_only();
+		    slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event2 add %d\n",s_mmi_voltage_level);
+			/*
+			if (s_mmi_voltage_level <= VOLT_50PERCENTLEVEL)
+				system(MMI_TURN_OFF_DISCHG);
+			if (s_mmi_voltage_level < VOLT_20PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SNK);
+			else if (s_mmi_voltage_level > VOLT_50PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SRC);*/
+
+		}
+	}
 	return -1;
 }
 
@@ -462,7 +579,7 @@
 				mmi_set_battery_update();
 			}
 		} else {
-			if (mmi_get_charge_state() == STATE_DISCHARGE) {
+			if (mmi_get_charge_state() == STATE_DISCHARGE || mmi_get_charge_state() == STATE_CHARGING) {
 				voltagepower = mmi_voltage_state_read();
 				if (voltagepower > 0 && voltagepower < INT_MAX) {//kw 3
 					mmi_battery_capacity_compare(voltagepower);
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c
index 88f71ee..d13c65b 100755
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c
@@ -52,10 +52,25 @@
 SINT32 mmi_voltage_state_read(VOID)
 {
 	char buf_volt[CHARGE_VOLTAGE_LENGTH] = {0};
+	char buf_online[8] = {0};
 	FILE* fd_voltage = NULL;
+	FILE* fd_bat = NULL;
 	int len = 0;
 	int voltagepower = 0;
 
+	fd_bat = fopen(CHARGE_BAT_STATUS_PATH, "r");
+	if (fd_bat == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI open bat status file fail!\n");
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		return -1;
+	}
+	len = fread(buf_online, 1, 1, fd_bat);
+	if (len < 0 || atoi(buf_online) != 1 ) {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		fclose(fd_bat);
+		return -1;
+	}
+	fclose(fd_bat);
 	fd_voltage = fopen(CHARGE_VOLTAGE_PATH, "r");
 	if (fd_voltage == NULL) {
 		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI open voltage file fail!\n");
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.c
index c2bd235..e220464 100755
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.c
@@ -38,7 +38,7 @@
 };
 
 T_zMmiBatteryLedConfig g_mmi_batled_config_tab[] = {
-	{{STATE_CHARGING, 0, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_CHARGING, 0, 0, 0}, {LED_BATTERY, LED_STATE_BLINK, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
 	{{STATE_FULL, 0, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
 	{{STATE_DISCHARGE, VOLT_5PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
 	{{STATE_DISCHARGE, VOLT_10PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.h b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.h
index 1bb23bb..1a28572 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.h
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_cfg.h
@@ -140,6 +140,11 @@
 #define LED_BATTERY_GREEN_BLINKTIMEON	"/sys/class/leds/battery_g_led/delay_on"
 #define LED_BATTERY_GREEN_BLINKTIMEOFF	"/sys/class/leds/battery_g_led/delay_off"
 
+#define LED_BATTERY_BLUE_BRIGHTNESS	"/sys/class/leds/battery_b_led/brightness"
+#define LED_BATTERY_BLUE_BLINKSWITCH	"/sys/class/leds/battery_b_led/trigger"
+#define LED_BATTERY_BLUE_BLINKTIMEON	"/sys/class/leds/battery_b_led/delay_on"
+#define LED_BATTERY_BLUE_BLINKTIMEOFF	"/sys/class/leds/battery_b_led/delay_off"
+
 #define LED_BATTERY_RED_BRIGHTNESS		"/sys/class/leds/battery_r_led/brightness"
 #define LED_BATTERY_RED_BLINKSWITCH		"/sys/class/leds/battery_r_led/trigger"
 #define LED_BATTERY_RED_BLINKTIMEON		"/sys/class/leds/battery_r_led/delay_on"
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_common.h b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_common.h
index 27d7e75..f432e84 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_common.h
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_common.h
@@ -125,6 +125,7 @@
 #define CHARGE_VOLTAGE_PATH				"/sys/class/power_supply/battery/voltage_now"
 #define CHARGE_BAT_TEMP_PATH 			"/sys/class/power_supply/battery/temp"
 #define CHARGE_BAT_HEALTH_PATH 			"/sys/class/power_supply/battery/health"
+#define CHARGE_BAT_STATUS_PATH 			"/sys/class/power_supply/battery/online"
 
 #define MMI_SET_FAKEPOWEROFF_CHARGER    "echo 1 > /sys/class/power_supply/charger/quick_power_on"
 #define MMI_CAN_FAKEPOWEROFF_CHARGER    "echo 0 > /sys/class/power_supply/charger/quick_power_on"
@@ -139,6 +140,12 @@
 #define MMI_DISCHG_LOW_CURRENT  	    "echo 5 > /sys/class/power_supply/boost/current_now"
 #define MMI_DISCHG_HIGH_CURRENT	        "echo 15 > /sys/class/power_supply/boost/current_now"
 
+#define USB_SET_ROLE_DEF_SRC		"echo 4 > /sys/class/tcpc/type_c_port0/role_def"
+#define USB_SET_ROLE_DEF_SNK		"echo 5 > /sys/class/tcpc/type_c_port0/role_def"
+
+#define USB_TYPE_AC_PC_CHECK		"cat /sys/class/power_supply/charger/pc1_ac2 | grep PC"
+#define USB_PE_READY_CHECK			"cat /sys/class/tcpc/type_c_port0/pe_ready | grep yes"
+
 #define CHARGE_STATUS_CHARGING		 	"Charging"
 #define CHARGE_STATUS_FULL		 	 	"Full"
 #define CHARGE_STATUS_NOTCHARGING		"Not charging"
@@ -840,6 +847,8 @@
 	KEY_STATUS_UP,                  /*°´¼üËÉ¿ª*/
 	KEY_STATUS_DOWN,                /*°´¼ü°´ÏÂ*/
 	KEY_STATUS_LONGPRESS,            /*°´¼ü³¤°´*/
+	KEY_STATUS_POWER_DOUBLE,
+	KEY_STATUS_WPS_DOUBLE,
 } KEY_STATUS;
 
 typedef enum {
@@ -1095,6 +1104,8 @@
 
 VOID mmi_reset_idle_timer(VOID);
 
+VOID mmi_close_lcd_led_timer(VOID);
+
 /**
  * <mmi_reset_idle_timer>
  *¿ìËÙ¿ª¹Ø»úʱʡµçÏà¹Ø¶¨Ê±Æ÷ÖØÖÃ
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_ctrl.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_ctrl.c
index b210be3..a45c04b 100755
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_ctrl.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_ctrl.c
@@ -269,6 +269,21 @@
 	mmi_idle_timer_create();
 }
 
+static VOID mmi_close_lcd_led_timer_create(VOID)
+{
+	int ret = -1;
+	ret = CreateSoftTimer(SET_MMI_IDLE_TIMER, TIMER_FLAG_ONCE, 1, &mmi_idle_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_idle_timer_create FAILED !!");
+	}
+}
+
+VOID mmi_close_lcd_led_timer(VOID)
+{
+	mmi_idle_timer_stop();
+	mmi_close_lcd_led_timer_create();
+}
+
 /**********************************************************************************
 º¯Êý×÷ÓÃ:¿ìËٹػúʱÈôÓа´¼ü²Ù×÷£¬MMIÊ¡µçʱµÄÏà¹Ø¶¨Ê±Æ÷reset£¬°´¼üʱµ÷ÓÃ
 ***********************************************************************************/
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c
index 1bb015c..47db4dd 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c
@@ -49,6 +49,14 @@
 	return second;
 }
 
+static long long s_mmi_power_key_last_press_time_ms = 0;
+static long long s_mmi_wps_key_last_press_time_ms = 0;
+static long long get_current_time_ms()
+{
+    struct timespec ts;
+    clock_gettime(CLOCK_MONOTONIC, &ts);
+    return (long long)ts.tv_sec * 1000 + (long long)ts.tv_nsec / 1000000;
+}
 
 /************************************************************************************
  º¯Êý×÷ÓÃ:¶ÁÈ¡°´¼üÐÅÏ¢
@@ -78,6 +86,28 @@
 					g_mmi_wifi_longpress_time = 1;
 				}
 			}
+			if (kp_event.code == KEY_POWER_CODE)
+			{
+				long long current_time_ms = get_current_time_ms();
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI power key !\n");
+				if (s_mmi_power_key_last_press_time_ms != 0 && (current_time_ms - s_mmi_power_key_last_press_time_ms) <= 1000)
+				{
+					kp_info->status = KEY_STATUS_POWER_DOUBLE;
+					slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_keystrokes_data double power key !\n");
+				}
+				s_mmi_power_key_last_press_time_ms = current_time_ms;
+			}
+			else if (kp_event.code == KEY_WPS_CODE)
+			{
+				long long current_time_ms = get_current_time_ms();
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI wps key !\n");
+				if (s_mmi_wps_key_last_press_time_ms != 0 && (current_time_ms - s_mmi_wps_key_last_press_time_ms) <= 1000)
+				{
+					kp_info->status = KEY_STATUS_WPS_DOUBLE;
+					slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_keystrokes_data double wps key !\n");
+				}
+				s_mmi_wps_key_last_press_time_ms = current_time_ms;
+			}
 		} else if (kp_event.value == 0) {
 			kp_info->status = KEY_STATUS_UP;
 			s_mmi_keypress_begin = 0;
@@ -230,6 +260,21 @@
 	}
 }
 
+static VOID mmi_handle_power_key_double_click()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_keystrokes_thread , power double key!!\n ");
+
+	return;
+}
+
+static VOID mmi_handle_wps_key_double_click()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_handle_keystrokes_thread , WPS double key!!\n ");
+
+	return;
+}
+
+
 /***********************************************************************************
    º¯Êý×÷ÓÃ:up°´¼üÏûÏ¢´¦Àí
 ***********************************************************************************/
@@ -331,6 +376,10 @@
 	{
 		buttonStr = "+BUTTON: RESET\r\n";
 	}
+	else if (keyData->type == KEY_TYPE_POWER)
+	{
+		buttonStr = "+BUTTON: POWER\r\n";
+	}
 	else
 		return;
 
@@ -375,6 +424,14 @@
 			mmi_handle_keystroke_longpress(keyData.type);
 			break;
 		}
+		case KEY_STATUS_POWER_DOUBLE: {
+			mmi_handle_power_key_double_click();
+			break;
+		}
+		case KEY_STATUS_WPS_DOUBLE: {
+			mmi_handle_wps_key_double_click();
+			break;
+		}
 		default: {
 			break;
 		}
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led.c
index 7b7e99b..7b0792d 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led.c
@@ -361,19 +361,40 @@
 	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
 	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
 	UINT32 i = 0;
+	int charging_idx = -1;
 	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedBatteryInfo chg_sta=%d\n", pBatteryInfo->chg_state);
 	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_BATTERY) / sizeof(T_zMmiBatteryLedConfig); ++ i) {
-		if (pBatteryInfo->chg_state == g_mmi_batled_config_tab[i].bat_info.chg_state) {
-			if (pBatteryInfo->chg_state == STATE_DISCHARGE) {
-				if (pBatteryInfo->bat_level == g_mmi_batled_config_tab[i].bat_info.bat_level) {
+		if (STATE_DISCHARGE == g_mmi_batled_config_tab[i].bat_info.chg_state) {
+			if (pBatteryInfo->bat_level == g_mmi_batled_config_tab[i].bat_info.bat_level) {
+				if (pBatteryInfo->chg_state == STATE_DISCHARGE) {
 					mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
 					return MMI_SUCCESS;
 				}
-			} else {
-				mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
-				return MMI_SUCCESS;
-			}
+				else
+				{
+					if (charging_idx != -1 && STATE_CHARGING == pBatteryInfo->chg_state)
+					{
+						g_mmi_batled_config_tab[charging_idx].led_info.led_color = g_mmi_batled_config_tab[i].led_info.led_color;
+						mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[charging_idx].led_info);
+                                		return MMI_SUCCESS;
+					}
+					break;
+				}
+			} 
 		}
+		else if (STATE_CHARGING == g_mmi_batled_config_tab[i].bat_info.chg_state)
+		{
+			charging_idx = i;
+		}
+		else if (pBatteryInfo->chg_state == g_mmi_batled_config_tab[i].bat_info.chg_state ) {
+			 mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
+                         return MMI_SUCCESS;
+		}
+	}
+	if ( charging_idx != -1 && STATE_CHARGING == pBatteryInfo->chg_state )
+	{
+		mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[charging_idx].led_info);
+		return MMI_SUCCESS;
 	}
 	return MMI_ERROR;
 }
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c
index 3411f31..412df2a 100644
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c
@@ -188,6 +188,8 @@
 	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_BatLedOffOpt !\n");
 	mmi_led_opt_blinkoff(LED_BATTERY_GREEN_BLINKSWITCH);
 	mmi_led_opt_off(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_BATTERY_BLUE_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_BLUE_BRIGHTNESS);
 	mmi_led_opt_blinkoff(LED_BATTERY_RED_BLINKSWITCH);
 	mmi_led_opt_off(LED_BATTERY_RED_BRIGHTNESS);
 	mmi_setBatLedState(LED_ALL_OFF);
@@ -215,6 +217,24 @@
 	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
 }
 
+
+static VOID mmi_BatLedBlueOn()
+{
+	mmi_led_opt_on(LED_BATTERY_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
 static VOID mmi_BatLedGreenBlink(T_zMmi_Led_Blink_Time time)
 {
 	T_zMmi_LedBlink_Info info = {0};
@@ -272,16 +292,12 @@
 			mmi_BatLedGreenOn();
 		}
 		mmi_setBatLedState(LED_GREEN_ON);
-	} else if (color == LED_COLOR_YELLOW) {
-		if (bat_sta == LED_YELLOW_ON) {
+	} else if (color == LED_COLOR_BLUE) {
+		if (bat_sta == LED_BLUE_ON) {
 			return;
-		} else if (bat_sta == LED_GREEN_ON) {
-			mmi_BatLedRedOn();
-		} else if (bat_sta == LED_RED_ON) {
-			mmi_BatLedGreenOn();
 		} else {
 			mmi_BatLedOffOpt();
-			mmi_BatLedYellowOn();
+			mmi_BatLedBlueOn();
 		}
 		mmi_setBatLedState(LED_YELLOW_ON);
 	} else {
@@ -309,14 +325,14 @@
 			mmi_BatLedGreenBlink(time);
 		}
 		mmi_setBatLedState(LED_GREEN_BLINK);
-	} else if (color == LED_COLOR_YELLOW) {
-		if (bat_sta == LED_YELLOW_BLINK) {
+	} else if (color == LED_COLOR_BLUE) {
+		if (bat_sta == LED_BLUE_BLINK) {
 			return;
 		} else {
 			mmi_BatLedOffOpt();
-			mmi_BatLedYellowBlink(time);
+			mmi_BatLedBlueBlink(time);
 		}
-		mmi_setBatLedState(LED_YELLOW_BLINK);
+		mmi_setBatLedState(LED_BLUE_BLINK);
 	} else {
 		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_BatLedFastBlinkOpt invalid led color!\n");
 	}
diff --git a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_wifi.c b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_wifi.c
index 7f26c30..73a0bee 100755
--- a/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_wifi.c
+++ b/lynq/R305/ap/app/zte_comm/zte_mmi/mmi_wifi.c
@@ -274,8 +274,13 @@
 				slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI handle_wifi_opt mode close wifi\n");
 				ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_CLOSE, NULL, NULL, 0); //ÏòWIFI·¢Ë͹رÕÏûÏ¢
 			} else if (strcmp(wifi_mode, WIFI_CLOSED) == 0) {
-				slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI handle_wifi_opt mode open wifi\n");
-				ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_OPEN, NULL, NULL, 0); //ÏòWIFI·¢ËÍ»½ÐÑÏûÏ¢
+				char wifi_switch[16] = {0};
+				cfg_get_item("wifi_switch_status", wifi_switch, 16);
+				if (strcmp("web_close", wifi_switch)) // web close, no need to wake
+				{
+					slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI handle_wifi_opt mode open wifi\n");
+					ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_OPEN, NULL, NULL, 0); //ÏòWIFI·¢ËÍ»½ÐÑÏûÏ¢
+				}
 			}
 		}
 	}
diff --git a/lynq/R305/ap/app/zte_webui/css/com.css b/lynq/R305/ap/app/zte_webui/css/com.css
index 9ac8585..44c91a4 100755
--- a/lynq/R305/ap/app/zte_webui/css/com.css
+++ b/lynq/R305/ap/app/zte_webui/css/com.css
@@ -1869,7 +1869,7 @@
 .traffic_control_container{
     float:left;
     width: 280px;
-    height: 280px;
+    height: 305px;
 	margin-left:45px;
 	border-radius:10px;
 	color:#fff;
@@ -1885,7 +1885,7 @@
 .device_info_container{
     float:left;
     width: 580px;
-    height: 280px;
+    height: 305px;
 	border-radius:10px;
 	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7); 
 	background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
diff --git a/lynq/R305/ap/app/zte_webui/i18n/Messages_en.properties b/lynq/R305/ap/app/zte_webui/i18n/Messages_en.properties
index b8cfab8..d3f463f 100755
--- a/lynq/R305/ap/app/zte_webui/i18n/Messages_en.properties
+++ b/lynq/R305/ap/app/zte_webui/i18n/Messages_en.properties
@@ -446,6 +446,14 @@
 dial_roaming_remind = Check here, you can connect to internet in the roaming status.

 dial_roaming_connect = Your device is roaming. Connecting to network may occur additional charges. Continue?

 

+#net_status

+net_info = Network Status

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

 #phonebook

 search = Search

 save_location = Save Location

@@ -846,6 +854,7 @@
 hardware_version = Hardware Version

 imei = IMEI

 imsi = IMSI

+iccid = ICCID

 wan_ip_address = WAN IP Address

 ipv6_wan_ip_address = WAN IPv6 Address

 network_name_ssid1 = Network Name (Main SSID)

@@ -1096,6 +1105,7 @@
 ota_check_fail = Check new version failed!

 fota_package_already_download = Upgrade package has been downloaded,after waiting for equipment to restart to complete.

 software_upload = Software Upload

+local_upload = Local Upgrade

 upload_update_success = The upgrade file upload successful and will be about to restart,do not power off.

 upload_update_failed0 = parse file failed.   

 upload_update_failed1 = verify file failed.   

@@ -1423,6 +1433,10 @@
 upgrade_pack_fix_success = Upgrade success!

 upgrade_pack_fix_failed = Upgrade failed!

 have_new_version = New version is found,the device will update.

+upload_file = File upload in progress!

+update_status_error = Fail to read the update status file, unable to update!

+verify_error = Verification upgrade file failed, unable to update!

+start_update = The upgrade file has been successfully verified and is currently being upgraded. Please do not power off, restore factory settings, or shut down the device!

 

 ######key same value different###########

 dmz_note_info = If a terminal device can''t run network applications via this device, please enter IP address of the terminal device in the entry box when DMZ is enabled.

@@ -1450,7 +1464,7 @@
 local_note = You can choose the upgrade file on the local computer, upgrade the device software to the selected version, complete the system repair and optimization.

 

 #new word

-modify_password = Modify Login Password

+modify_password = Login Setting

 

 #parental control

 parental_control = Parental Control

@@ -1625,6 +1639,7 @@
 band_40 = Band 40

 band_info = Band Settings

 cell_id = Current registration Cell

+cellid = CELLID

 lock_apply = Lock

 unlock_apply= Unlock

 sinr = SINR

diff --git a/lynq/R305/ap/app/zte_webui/i18n/Messages_zh-cn.properties b/lynq/R305/ap/app/zte_webui/i18n/Messages_zh-cn.properties
index de65817..a6d4abe 100755
--- a/lynq/R305/ap/app/zte_webui/i18n/Messages_zh-cn.properties
+++ b/lynq/R305/ap/app/zte_webui/i18n/Messages_zh-cn.properties
@@ -448,6 +448,14 @@
 dial_roaming_remind = 勾选此项,您可以在漫游状态下连接到网络,且可能会产生额外费用。

 dial_roaming_connect = 设备处于漫游状态,连接网络会使您的资费增加。确定继续?

 

+#net_status

+net_info = 网络状态

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

 #phonebook

 search = 搜索

 save_location = 存储位置

@@ -848,6 +856,7 @@
 hardware_version = 硬件版本

 imei = IMEI

 imsi = IMSI

+iccid = ICCID

 wan_ip_address = WAN IP 地址

 ipv6_wan_ip_address = WAN IPv6 地址

 network_name_ssid1 = 网络名称 (主SSID)

@@ -1098,6 +1107,7 @@
 ota_check_fail = 检测新版本失败!

 fota_package_already_download = 升级包已下载,待设备重启后完成升级

 software_upload = 软件升级

+local_upload = 本地升级

 upload_update_success = 升级文件上传成功,即将重启,请勿断电。

 upload_update_failed0 = 文件解析失败。   

 upload_update_failed1 = 文件校验失败。   

@@ -1429,6 +1439,11 @@
 upgrade_pack_fix_success = 升级成功!

 upgrade_pack_fix_failed = 升级失败!

 have_new_version = 发现新版本,设备将升级。

+upload_file = 文件上传中!

+update_status_error = 获取更新状态文件失败,无法升级!

+verify_error = 校验文件失败,无法升级!

+start_update = 校验升级文件成功,正在升级中,请不要断电、恢复出厂设置或关机!

+

 ######key same value different###########

 dmz_note_info = 如果终端设备无法通过该设备运行网络应用程序,请启用 DMZ,在输入框输入该终端设备的 IP 地址。

 dlna_note_info = DLNA: 数字生活网络联盟。

@@ -1455,7 +1470,7 @@
 local_note = 您可以选择本地电脑中的升级文件,将设备软件升级到选中的版本,完成系统修复和优化。

 

 #new word

-modify_password = 修改登录密码

+modify_password = 登录设置

 

 #家长控制

 parental_control = 家长控制

@@ -1630,6 +1645,7 @@
 band_40 = 频段 40

 band_info = 频段设置

 cell_id = 当前注册的小区

+cellid = CELLID

 lock_apply = 加锁

 unlock_apply= 解锁

 band_cell_settings = 频段小区设置

diff --git a/lynq/R305/ap/app/zte_webui/index.html b/lynq/R305/ap/app/zte_webui/index.html
index 214d453..f64166a 100755
--- a/lynq/R305/ap/app/zte_webui/index.html
+++ b/lynq/R305/ap/app/zte_webui/index.html
@@ -25,7 +25,7 @@
 <div class="container" id="topContainer">

     <div id="langLogoBar" class="row">

         <div class="col-xs-4">

-            <a href="index.html">

+            <a href="index.html" style="display: none;">

 			<script type="text/javascript">

 			document.write("<img src='pic/res_logo_web.png?random=" + Math.random() + "' />");

 			</script>

diff --git a/lynq/R305/ap/app/zte_webui/js/com.js b/lynq/R305/ap/app/zte_webui/js/com.js
index 203ce25..6a48672 100755
--- a/lynq/R305/ap/app/zte_webui/js/com.js
+++ b/lynq/R305/ap/app/zte_webui/js/com.js
@@ -497,6 +497,25 @@
             }

         }

     }

+    function getNetworkStatus() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "NETWORK_INFO";

+            return valueReq;

+        }

+        function deal(result) {

+            return {

+                sinr: result.lte_sinr,

+                rsrp: result.lte_rsrp,

+                rsrq: result.lte_rsrq,

+                plmn: result.lte_plmn,

+                pci: result.lte_pci,

+                cellid: result.lte_cellid,

+                band: result.lte_band

+            };

+       }

+    }

     function deleteApn() {

         return stuffMake(arguments, {}, prepare, deal, null, true);

         function prepare(values, isPost) {

@@ -2888,7 +2907,7 @@
         function prepare(values, isPost) {

 	    var wpask = config.PASSWORD_ENCODE ? "WPAPSK1_encode,m_WPAPSK1_encode," : "rnum_js,WPAPSK1_enaes,m_WPAPSK1_enaes,";

             var valueReq = {

-                cmd: "wifi_coverage,m_ssid_enable,imei,network_type,sub_network_type,rssi,rscp,lte_rsrp,imsi,sim_imsi,cr_version,hw_version,MAX_Access_num," + wpask + "SSID1,AuthMode,m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,lan_ipaddr," + "mac_address,msisdn,LocalDomain,wan_ipaddr,static_wan_ipaddr,ipv6_wan_ipaddr,ipv6_pdp_type,pdp_type,ppp_status,sta_ip_status,rj45_state,ethwan_mode",

+                cmd: "wifi_coverage,m_ssid_enable,imei,ziccid,cell_id,network_type,sub_network_type,rssi,rscp,lte_rsrp,imsi,sim_imsi,cr_version,hw_version,MAX_Access_num," + wpask + "SSID1,AuthMode,m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,lan_ipaddr," + "mac_address,msisdn,LocalDomain,wan_ipaddr,static_wan_ipaddr,ipv6_wan_ipaddr,ipv6_pdp_type,pdp_type,ppp_status,sta_ip_status,rj45_state,ethwan_mode",

                 multi_data: 1

             };

             return valueReq;

@@ -2915,6 +2934,8 @@
                     imei: paramD.imei,

                     signal: convertSignal(paramD),

                     imsi: paramD.imsi || paramD.sim_imsi,

+                    iccid: paramD.ziccid,

+                    cellid: paramD.cell_id,

                     sw_version: paramD.cr_version,

                     hw_version: paramD.hw_version,

                     max_access_num: paramD.MAX_Access_num,

@@ -5441,6 +5462,7 @@
         getLanInfo: getLanInfo,

         setLanInfo: setLanInfo,       

         getApnSettings: getApnSettings,

+        getNetworkStatus: getNetworkStatus,

         deleteApn: deleteApn,

         setDefaultApn: setDefaultApn,

         addOrEditApn: addOrEditApn,

@@ -7764,6 +7786,7 @@
         target.hasRj45 = set.RJ45_SUPPORT;

         target.notDataCard = set.PRODUCT_TYPE != 'DATACARD';

         target.hasParentalControl = set.HAS_PARENTAL_CONTROL;

+        target.hasUssd = set.HAS_USSD;

         var wifiInfo = fnc.getWifiBasic();

         if (set.WIFI_SUPPORT_QR_SWITCH) {

             target.showQRCode = set.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

@@ -7813,6 +7836,8 @@
         target.simSerialNumber = libko.observable('');

         target.imei = libko.observable('');

         target.imsi = libko.observable('');

+        target.iccid = libko.observable('');

+        target.cellid = libko.observable('');

         target.ssid = libko.observable('');

         target.hasWifi = set.HAS_WIFI;

         target.showMultiSsid = libko.observable(set.HAS_MULTI_SSID && wifiInfo.multi_ssid_enable == "1");

@@ -7849,6 +7874,8 @@
             target.simSerialNumber(verifyDeviceInfo(data.simSerialNumber));

             target.imei(verifyDeviceInfo(data.imei));

             target.imsi(verifyDeviceInfo(data.imsi));

+            target.iccid(verifyDeviceInfo(data.iccid));

+            target.cellid(verifyDeviceInfo(data.cellid));

             target.ssid(verifyDeviceInfo(data.ssid));

             target.showMultiSsid(set.HAS_MULTI_SSID && data.multi_ssid_enable == "1");

             return data;

@@ -7863,6 +7890,8 @@
                 simSerialNumber: verifyDeviceInfo(data.simSerialNumber),

                 imei: verifyDeviceInfo(data.imei),

                 imsi: verifyDeviceInfo(data.imsi),

+                iccid : verifyDeviceInfo(data.iccid),

+                cellid: verifyDeviceInfo(data.cellid),

                 signal: signalFormat(data.signal),

                 hasWifi: set.HAS_WIFI,

                 isCPE: set.PRODUCT_TYPE == 'CPE',

diff --git a/lynq/R305/ap/app/zte_webui/js/ext/menu.js b/lynq/R305/ap/app/zte_webui/js/ext/menu.js
index 6277652..dc3a4e4 100755
--- a/lynq/R305/ap/app/zte_webui/js/ext/menu.js
+++ b/lynq/R305/ap/app/zte_webui/js/ext/menu.js
@@ -145,8 +145,14 @@
             parent: '#network_set',

             requireLogin: needLogin,

             checkSIMStatus: true

-        },

-        {

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

             hash: '#wlan_station',

             path: 'wifi_ap_station',

             level: '2',

@@ -218,8 +224,7 @@
         }, {

             hash: '#usat',

             path: 'ussd',

-            level: '2',

-            parent: '#normal_set',

+            level: '1',

             requireLogin: needLogin,

             checkSIMStatus: false

         }, {

diff --git a/lynq/R305/ap/app/zte_webui/js/ext/menu_pppoe.js b/lynq/R305/ap/app/zte_webui/js/ext/menu_pppoe.js
index a1bf328..52fddf8 100755
--- a/lynq/R305/ap/app/zte_webui/js/ext/menu_pppoe.js
+++ b/lynq/R305/ap/app/zte_webui/js/ext/menu_pppoe.js
@@ -145,8 +145,14 @@
             parent: '#network_set',

             requireLogin: needLogin,

             checkSIMStatus: true

-        },

-        {

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

             hash: '#wlan_station',

             path: 'wifi_ap_station',

             level: '2',

@@ -218,8 +224,7 @@
         }, {

             hash: '#usat',

             path: 'ussd',

-            level: '2',

-            parent: '#normal_set',

+            level: '1',

             requireLogin: needLogin,

             checkSIMStatus: false

         }, {

diff --git a/lynq/R305/ap/app/zte_webui/js/ext/set_aic8800.js b/lynq/R305/ap/app/zte_webui/js/ext/set_aic8800.js
index 8ae55e7..8aec80b 100755
--- a/lynq/R305/ap/app/zte_webui/js/ext/set_aic8800.js
+++ b/lynq/R305/ap/app/zte_webui/js/ext/set_aic8800.js
@@ -17,10 +17,10 @@
             name : '802.11 b/g/n/ax',

             value : '6'

         } ],

-        WIFI_SUPPORT_QR_CODE: false,

-        HAS_PHONEBOOK: true,

+        WIFI_SUPPORT_QR_CODE: true,

+        HAS_PHONEBOOK: false,

         HAS_BATTERY: true, //ÊÇ·ñÓÐµç³Ø

-		FAST_BOOT_SUPPORT: true, //ÊÇ·ñÖ§³Ö¿ìËÙ¿ª»ú

+		FAST_BOOT_SUPPORT: false, //ÊÇ·ñÖ§³Ö¿ìËÙ¿ª»ú

         TURN_OFF_SUPPORT: true, //ÊÇ·ñÖ§³Ö¹Ø»ú

 		WIFI_SLEEP_SUPPORT: true, // ÊÇ·ñÖ§³ÖwifiÐÝÃß

         HAS_USSD: false, // ÊÇ·ñÖ§³ÖUSSD

diff --git a/lynq/R305/ap/app/zte_webui/js/main.js b/lynq/R305/ap/app/zte_webui/js/main.js
index a771f7d..09fc299 100755
--- a/lynq/R305/ap/app/zte_webui/js/main.js
+++ b/lynq/R305/ap/app/zte_webui/js/main.js
@@ -56,6 +56,7 @@
         network_apn_set: 'net',

         network_dial_set: 'net',

         network_dial_set_cpe: 'net',

+		    network_info: 'net',

         locknet: 'net',

         network_net_select: 'net',

         ddns: 'net',

diff --git a/lynq/R305/ap/app/zte_webui/js/net.js b/lynq/R305/ap/app/zte_webui/js/net.js
index ffaa342..ce0f5c3 100755
--- a/lynq/R305/ap/app/zte_webui/js/net.js
+++ b/lynq/R305/ap/app/zte_webui/js/net.js
@@ -2390,6 +2390,7 @@
         target.hasSms = config.HAS_SMS;

         target.hasPhonebook = config.HAS_PHONEBOOK;

         target.isSupportSD = config.SD_CARD_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

         if (config.WIFI_SUPPORT_QR_SWITCH == false) {

             target.showQRCode = config.WIFI_SUPPORT_QR_CODE;

         } else {

@@ -4232,4 +4233,31 @@
     return {

         init: initialize

     };

-});
\ No newline at end of file
+});

+define("network_info","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+        function NetInfoVM() {

+            var target = this;

+            var network_status = service.getNetworkStatus();

+

+            target.pci = ko.observable(network_status.pci);

+            target.sinr = ko.observable(network_status.sinr);

+            target.rsrp = ko.observable(network_status.rsrp);

+            target.rsrq = ko.observable(network_status.rsrq);

+            target.plmn = ko.observable(network_status.plmn);

+            target.cellid = ko.observable(network_status.cellid);

+            target.band = ko.observable(network_status.band);

+        }

+

+        function initialize() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var imVm = new NetInfoVM();

+            ko.applyBindings(imVm, container[0]);

+        }

+

+        return {

+            init: initialize

+        };

+});

diff --git a/lynq/R305/ap/app/zte_webui/js/sim_device.js b/lynq/R305/ap/app/zte_webui/js/sim_device.js
index 5be4f99..ec56d28 100755
--- a/lynq/R305/ap/app/zte_webui/js/sim_device.js
+++ b/lynq/R305/ap/app/zte_webui/js/sim_device.js
@@ -38,6 +38,7 @@
         target.hasSms = config.HAS_SMS;

         target.hasPhonebook = config.HAS_PHONEBOOK;

         target.isSupportSD = config.SD_CARD_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

         if (config.WIFI_SUPPORT_QR_SWITCH) {

             var wifiInfo = service.getWifiBasic();

             target.showQRCode = config.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

diff --git a/lynq/R305/ap/app/zte_webui/subpg/adm_lan.html b/lynq/R305/ap/app/zte_webui/subpg/adm_lan.html
index 814900c..5b6b28b 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/adm_lan.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/adm_lan.html
@@ -19,7 +19,7 @@
 			<li class="active"><a href="#route_set" data-trans="router_setting"></a></li>

 			<li><a href="#filter_main" data-trans="firewall"></a></li>

 			<li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>

-			<li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li>

+			<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

 			<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>

 			<li><a href="#more" data-trans="others"></a></li>

 		</ul>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/adm_others.html b/lynq/R305/ap/app/zte_webui/subpg/adm_others.html
index a380032..39309b3 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/adm_others.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/adm_others.html
@@ -19,7 +19,7 @@
 				<li><a href="#route_set" data-trans="router_setting"></a></li>

 				<li><a href="#filter_main" data-trans="firewall"></a></li>

 				<li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>

-				<li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li>

+				<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

 				<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>      

 				<li class="active"><a href="#more" data-trans="others"></a></li>

 			</ul>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/firewall.html b/lynq/R305/ap/app/zte_webui/subpg/firewall.html
index 51a418d..bf00b0c 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/firewall.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/firewall.html
@@ -19,7 +19,7 @@
 					<li><a data-trans="router_setting" href="#route_set"></a></li>

 					<li class="active"><a data-trans="firewall" href="#filter_main"></a></li>

 					<li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

-					<li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li>

+					<!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->

 					<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

 					<li><a data-trans="others" href="#more"></a></li>

 				</ul>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/main.html b/lynq/R305/ap/app/zte_webui/subpg/main.html
index c5f8c00..116e9dd 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/main.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/main.html
@@ -4,6 +4,7 @@
 	<ul>

 		<li><a href="#child_ctl" data-bind="visible: hasParentalControl" data-trans="parental_control" class="c0EC6DC"></a></li>

 		<li><a href="#msg_main"  data-bind="visible: hasSms" data-trans="sms" class="cF53A58"></a></li>

+		<li><a href="#usat" data-bind="visible:hasUssd" data-trans="USSD"></a></li>

 		<li><a href="#pb_main" data-bind="visible: hasPhonebook" data-trans="phonebook" class="c00AEFF"></a></li>

 		<li><a href="#sdcard" data-bind="visible: isSupportSD" data-trans="sd" class="c2175FF"></a></li>

 		<li><a data-bind="attr: {href: notDataCard? '#wlan_sleep' : '#demilitarized_zone'}" data-trans="advanced_settings" class="cFFCE2B"></a></li>

@@ -110,6 +111,14 @@
 				<label data-trans="imsi" class="col-xs-5"></label>

 				<label data-bind="text: imsi" class="col-xs-7"></label>

 			</div>

+			<div class="row">

+				<label data-trans="iccid" class="col-xs-5"></label>

+				<label data-bind="text: iccid" class="col-xs-7"></label>

+			</div>

+			<div class="row">

+				<label data-trans="cellid" class="col-xs-5"></label>

+				<label data-bind="text: cellid" class="col-xs-7"></label>

+			</div>

 			<!--div class="row" data-bind="visible: notDataCard">

 				<label class="col-xs-5" data-trans="wifi_range"></label>

 				<label class="col-xs-7" data-bind="attr: {'data-trans': wifiLongMode}"></label>

@@ -152,6 +161,14 @@
     <label class="col-xs-6"><%= imsi %></label>

 </div>

 <div class="row">

+    <label data-trans="iccid" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= iccid %></label>

+</div>

+<div class="row">

+    <label data-trans="cellid" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= cellid %></label>

+</div>

+<div class="row">

     <label data-trans="signal_strength_label" class="col-xs-6"></label>

     <label class="col-xs-6" id="popoverSignalTxt"><%= signal %></label>

 </div>

@@ -174,7 +191,7 @@
             <label class="col-xs-6"><%= m_max_access_num %></label>

         </div>

     <% } %>

-<div class="row">

+<div class="row" style="display:none">

     <label data-trans="wifi_range" class="col-xs-6"></label>

     <label data-trans="<%= wifi_long_mode %>" class="col-xs-6"></label>

 </div>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/network_apn_set.html b/lynq/R305/ap/app/zte_webui/subpg/network_apn_set.html
index c308b85..5cd5591 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/network_apn_set.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/network_apn_set.html
@@ -18,6 +18,7 @@
 			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li><a data-trans="net_select" href="#network_choose"></a></li>

 				<li class="active"><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+				<li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/network_dial_set.html b/lynq/R305/ap/app/zte_webui/subpg/network_dial_set.html
index e59b1ca..7872355 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/network_dial_set.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/network_dial_set.html
@@ -18,6 +18,7 @@
 			    <li class="active"><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li><a data-trans="net_select" href="#network_choose"></a></li>

 				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/network_info.html b/lynq/R305/ap/app/zte_webui/subpg/network_info.html
new file mode 100755
index 0000000..84dabe4
--- /dev/null
+++ b/lynq/R305/ap/app/zte_webui/subpg/network_info.html
@@ -0,0 +1,64 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+            <div class="nav_right">

+                <ul>

+                    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

+                    <li><a data-trans="net_select" href="#network_choose"></a></li>

+                    <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                    <li class="active"><a data-trans="net_info" href="#net_status"></a></li>

+                </ul>

+            </div>

+	    </div>

+

+        <div class="col-xs-10">

+            <form role="form">

+                <div class="form-body">

+                    <h3 data-trans="net_info" class="form-title"></h3>

+                    <div class="content">

+                        <div class="row form-group">

+                            <label data-trans="pci" class="col-xs-5"></label>

+				            <label data-bind="text: pci" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="sinr" class="col-xs-5"></label>

+				            <label data-bind="text: sinr" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrp" class="col-xs-5"></label>

+				            <label data-bind="text: rsrp" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrq" class="col-xs-5"></label>

+				            <label data-bind="text: rsrq" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="plmn" class="col-xs-5"></label>

+				            <label data-bind="text: plmn" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="cellid" class="col-xs-5"></label>

+				            <label data-bind="text: cellid" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="band" class="col-xs-5"></label>

+				            <label data-bind="text: band" class="col-xs-7"></label>

+                        </div>

+                    </div>

+                </div>

+            </form>

+        </div>

+    </div>

+</div>
\ No newline at end of file
diff --git a/lynq/R305/ap/app/zte_webui/subpg/network_net_select.html b/lynq/R305/ap/app/zte_webui/subpg/network_net_select.html
index c7bb48c..444d972 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/network_net_select.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/network_net_select.html
@@ -18,6 +18,7 @@
 			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li class="active"><a data-trans="net_select" href="#network_choose"></a></li>

 				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/ota_update.html b/lynq/R305/ap/app/zte_webui/subpg/ota_update.html
index f7a84de..c75d9d0 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/ota_update.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/ota_update.html
@@ -21,7 +21,7 @@
 					<li data-bind="visible: !isDataCard"><a href="#route_set" data-trans="router_setting"></a></li>

 					<li data-bind="visible: !isDataCard"><a href="#filter_main" data-trans="firewall"></a></li>

 					<li data-bind="visible:hasUpdateCheck" class="active"><a href="#fota" data-trans="update_settings"></a></li>

-					<li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li>

+					<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

 					<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>

 					<li data-bind="visible: !isDataCard"><a href="#more" data-trans="others"></a></li>

 				</ul>

@@ -30,13 +30,13 @@
 

 <div class="col-xs-10">

 <form id="frmOTAUpdate" role="form" data-bind="visible: updateType() == 'mifi_fota'">

-    <h3 data-trans="ota_update_manual" class="form-title"></h3>

+     <!-- <h3 data-trans="ota_update_manual" class="form-title"></h3 --> 

     <div class="form-body margin-top-20">

-        <div class="content">

+        <!--div class="content">

             <div class="row">

                 <div class="col-xs-6">

-                    <!--span data-trans="ota_last_update_check"></span>

-                    <span data-bind="text: lastCheckTime"></span-->

+                    <span data-trans="ota_last_update_check"></span>

+                    <span data-bind="text: lastCheckTime"></span>

                 </div>

                 <div class="col-xs-6 align-right">

                     <input id="btnCheckNewVersion" data-bind="click:checkNewVersion" data-trans="ota_check_new_version" type="button" class="btn btn-primary margin-right-20"/>

@@ -48,7 +48,7 @@
                     <li data-trans="ota_check_new_version_desc"></li>

                 </ul>

 		    </div>

-        </div>

+        </div-->

 

         <!--div class="form-title" data-trans='ota_update_manual'></div>

         <div class="content">

@@ -60,6 +60,7 @@
         </div>

         <div class="form-title" data-trans='ota_update_setting'></div-->

         <div class="content">

+			<!--

             <h3 data-trans="ota_update_setting" class="form-title"></h3>

             <div class="row">

                 <label data-trans="ota_auto_update_switch" class="col-xs-4 side-right"></label>

@@ -99,15 +100,26 @@
 

             <div class="form-buttons">

                 <input id="btnApply" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div-->

+

+            <div class="row form-group">

+                <label data-trans="ota_manual_upgrade_url" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <input id="upgrade_url" type="text" size="128" data-bind="value:updateURL" class="required form-control">

+                    </div>

             </div>

-            <div class="form-note">

+            <div class="form-buttons">

+                <input id="btnOtaUpgApply" data-bind="click:ota_upgrade_apply" data-trans="download" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div>

+

+            <!--div class="form-note">

                 <div class="notes-title">&nbsp;</div>

                 <ul class="notes-content">

                     <li data-trans="fota_note1"></li>

                 </ul>

-		    </div>

+		    </div-->

 		</div>

-        

+

 	</div>

 </form>

 <!--form id="frmNativeUpdate" data-bind="visible: updateType() == 'mifi_local'" method="post" name="UploadFile" id="UploadFile" action="../../cgi-bin/upload.cgi" enctype="multipart/form-data" target="ifr"> 

@@ -122,6 +134,24 @@
 		<iframe name="ifr" id="ifr" style="display:none;"></iframe>

 	</div>

 </form-->

+

+

+<br><br>

+<form id="uploadForm" action="../../cgi-bin/upload/upload.cgi" method="post" enctype="multipart/form-data">

+	<h3 class="form-title" data-trans="local_upload"></h3>

+    <div class="row form-group col-xs-4 side-right">

+        <label for="fileInput" data-trans="software_upload" style="display: none;"></label>

+        <input class="required form-control btn btn-primary" type="file" id="fileInput" name="file" style="display: none;">

+        <label for="fileInput" class="required btn btn-primary" data-trans="browse_btn" style="width: 70px;"></label>

+        <span id="fileNameDisplay" style="margin-left: 10px; font-weight: normal;"></span>

+    </div>

+    <br><br>

+    <div style="text-align: right; padding-right: 20px;">

+        <button class="btn btn-primary" type="submit" data-trans="ota_title" id="submitButton" disabled></button>

+    </div>

+</form>

+

+

     <div id="uploadSection" data-bind="visible: updateType() == 'mifi_local'">

         <h3 class="form-title" data-trans="software_upload"></h3>

         <iframe id="fileUploadIframe" name="fileUploadIframe" frameborder="0" height="0" scrolling="no" style="height:0px;width:0px;" width="0"></iframe>

@@ -146,3 +176,58 @@
 </div>

 </div>

 </div>

+

+<script>

+    const fileInput = document.getElementById('fileInput');

+    const fileNameDisplay = document.getElementById('fileNameDisplay');

+    const submitButton = document.getElementById('submitButton');

+    const uploadForm = document.getElementById('uploadForm');

+

+    fileInput.addEventListener('change', function () {

+        const fileName = fileInput.files[0] ? fileInput.files[0].name : '';

+        fileNameDisplay.textContent = fileName;

+        

+        if (fileName) {

+            submitButton.disabled = false;

+        } else {

+            submitButton.disabled = true;

+        }

+    });

+

+	uploadForm.addEventListener('submit', function (event) {

+		event.preventDefault();

+		showLoading("upload_file");

+

+		const formData = new FormData(uploadForm);

+		console.log("Form data submitted:", formData);

+

+		fetch(uploadForm.action, {

+			method: 'POST',

+			body: formData

+		})

+		.then(response => {

+			if (!response.ok) {

+				throw new Error(`HTTP error! Status: ${response.status}`);

+			}

+			return response.text();

+		})

+		.then(text => {

+			console.log("Server response:", text);

+			try {

+				const data = JSON.parse(text);

+				if (data.success) {

+					showAlert("start_update");

+				} else {

+					errorOverlay("verify_error");

+				}

+			} catch (error) {

+				console.error("Upload error:", error);

+				errorOverlay("File upload successful: Server returned non-JSON response.");

+			}

+		})

+		.catch(error => {

+			console.error("Upload error:", error);

+			errorOverlay("File upload failed!");

+		});

+	});

+</script>
\ No newline at end of file
diff --git a/lynq/R305/ap/app/zte_webui/subpg/ussd.html b/lynq/R305/ap/app/zte_webui/subpg/ussd.html
new file mode 100755
index 0000000..7310027
--- /dev/null
+++ b/lynq/R305/ap/app/zte_webui/subpg/ussd.html
@@ -0,0 +1,85 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='USSD'></h1>

+            </div>

+        </div>

+    </div>

+<div class="row">

+    <!-- <div class="col-xs-2">

+		<div class="nav_right">

+			<ul>

+			    <li><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>

+				<li><a data-trans="router_setting" href="#route_set"></a></li>

+				<li><a data-trans="firewall" href="#filter_main"></a></li>

+				<li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

+				<li class="active"><a data-trans="USSD" href="#usat"></a></li>

+				<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

+				<li><a data-trans="others" href="#more"></a></li>

+			</ul>

+		</div>

+	</div> -->

+

+	<div class="innerContainer">

+

+    <form id="frmUSSD">

+        <div class="col-xs-1 margin-top-15">

+	</div>

+	<div class="col-xs-11">

+	    <h3 data-trans="USSD" class="form-title"></h3>

+        <div id="USSD_send_div"  data-bind="visible: USSDLocation()==0" class="margin-top-20">

+            <div class="content">

+                <div class="row form-group">

+                    <label data-trans="ussd_send_to" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <input id="USSD_send" type="text" size="20" data-bind="value:USSDSend,valueUpdate:'afterkeydown'" class="required form-control">

+                    </div>

+                </div>

+                <div class="form-buttons">

+                    <input id="sendToNet" type="button" data-trans='ussd_send' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:sendToNet" class="btn btn-primary marginright10" />

+                    <!--input type="reset"  data-trans='ussd_cancel' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:resetUSSD" id="cancelToNet" class="btn btn-primary"/-->

+                </div>

+            </div>

+        </div>

+        <div id="USSD_reply_div"  data-bind="visible: USSDLocation()==1" class="margin-top-20">

+            <!--<div class="form-title" data-trans='ussd_contents'></div>!-->

+            <div class="content">

+                <div class="row form-group">

+                    <label data-trans="ussd_contents" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <textarea id="USSD_Content" rows="8" cols="50" readonly="readonly" name="USSD_Content"></textarea>

+                    </div>

+                </div>

+                <div class="form-buttons">

+                    <input type="button" data-trans='ussd_cancel' data-bind="click:noReplyCancel" class="btn btn-primary marginright10"/>

+                </div>

+                <div id="ussd_action" data-bind="visible: ussd_action()!=0">

+                    <div class="row form-group">

+                        <label class="col-xs-4 side-right" data-trans="ussd_reply_to"></label>

+                        <div class="col-xs-3">

+                            <input id="USSD_reply" type="text" name="USSD_reply" size="20" data-bind="value:USSDReply"  class="required form-control">

+                        </div>

+                    </div>

+                    <div class="form-buttons">

+                        <input type="button" data-trans='ussd_reply' data-bind="click:replyToNet" class="btn btn-primary marginright10"/>

+                    </div>

+                </div>

+            </div>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="ussd_note1"></li>

+            </ul>

+        </div>

+	</div>

+	</form>

+    </div>

+    </div>

+</div>

diff --git a/lynq/R305/ap/app/zte_webui/subpg/wifi_sleep_mode.html b/lynq/R305/ap/app/zte_webui/subpg/wifi_sleep_mode.html
index 5c2e39b..90d9b50 100755
--- a/lynq/R305/ap/app/zte_webui/subpg/wifi_sleep_mode.html
+++ b/lynq/R305/ap/app/zte_webui/subpg/wifi_sleep_mode.html
@@ -19,7 +19,7 @@
             <li><a data-trans="router_setting" href="#route_set"></a></li>

             <li><a data-trans="firewall" href="#filter_main"></a></li>

             <li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

-            <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li>

+            <!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->

 			<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

             <li><a data-trans="others" href="#more"></a></li>

         </ul>

@@ -30,7 +30,7 @@
 

 <div class="form-body margin-top-20">

     <!--hide wifi range settings until sw implements it-->

-    <form id='wifiRangeForm'>

+    <form id='wifiRangeForm' style = "display:none;">

         <h3 data-trans="wifi_range_settings" class="form-title"></h3>

         <div class="content">

             <div class="row">

diff --git a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/build/config.mk b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/build/config.mk
index ea49eed..778fefa 100755
--- a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/build/config.mk
+++ b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/build/config.mk
@@ -67,8 +67,8 @@
 

 CUSTOM_MACRO += -DHAVE_MODEM_IN_CORE

 #CUSTOM_MACRO += -D_USE_BL

-CUSTOM_MACRO += -D_USE_VOLTE

-CUSTOM_MACRO += -D_USE_CODEC_TI3100

+#CUSTOM_MACRO += -D_USE_VOLTE

+#CUSTOM_MACRO += -D_USE_CODEC_TI3100

 # fotaÉý¼¶°üÏÂÔØÍêÊÇ·ñÐèÒªÓû§È·ÈϺóÔÙÉý¼¶¿ª¹Ø

 export ENABLE_FOTA_UPG_USR_CONFIRM=yes

 

diff --git a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_app.mk b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_app.mk
index 62e258d..0ba669a 100755
--- a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_app.mk
+++ b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_app.mk
@@ -9,7 +9,7 @@
 			dnsmasq \

 			Script \

 			zte_amt \

-			zte_webui clatd cwmp at_tool

+			zte_webui clatd at_tool cgi

 

 #yes only when klocwork static analysis 

 ifneq ($(KW_SKIP),yes)

diff --git a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_lib.mk b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_lib.mk
index f9deda4..2e67852 100755
--- a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_lib.mk
+++ b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/config/normal/config_lib.mk
@@ -1,5 +1,5 @@
 

-zte_lib := libvoice libtinyalsa libsoftap \

+zte_lib := libsoftap \

 libatutils libatext libcpnv libamt libkey

 

 ifeq ($(USE_FOTA),yes)

diff --git a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/fs/normal/rootfs/sbin/iperf3 b/lynq/R305/ap/project/zx297520v3/prj_cpe_min/fs/normal/rootfs/sbin/iperf3
deleted file mode 100755
index 9ae80ac..0000000
--- a/lynq/R305/ap/project/zx297520v3/prj_cpe_min/fs/normal/rootfs/sbin/iperf3
+++ /dev/null
Binary files differ