Merge "[Feature][MD310][task-view-882][LCD] Added the scan to connect display and changed the version number to two-line display"
diff --git a/lynq/MD310/ap/app/fota_upi/src/upi_led.c b/lynq/MD310/ap/app/fota_upi/src/upi_led.c
new file mode 100755
index 0000000..2ed298d
--- /dev/null
+++ b/lynq/MD310/ap/app/fota_upi/src/upi_led.c
@@ -0,0 +1,313 @@
+/**
+* @file upi_led.c
+* @brief ÁÁµÆÏà¹Ø½Ó¿Ú
+*
+* Copyright (C) 2017 Sanechips Technology Co., Ltd.
+* @author
+*
+*/
+
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "upi_led.h"
+#include "update.h"
+
+
+// nv½Ó¿ÚÐèÒª
+#include "softap_api.h"
+
+#include "upi_cmd.h"
+#include "zxic_fs_interface.h"
+
+
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+// LEDµÆÃû³Æ¶¨Òå
+#define WL_LED 						"/sys/class/leds/wl_led_en/"
+
+#define SIGNAL_1_LED 				"/sys/class/leds/signal_status1_led/"
+#define SIGNAL_2_LED				"/sys/class/leds/signal_status2_led/"
+#define SIGNAL_3_LED				"/sys/class/leds/signal_status3_led/"
+
+#define WIFI_RED_LED				"/sys/class/leds/wifi_r_led/"
+#define WIFI_GREEN_LED				"/sys/class/leds/wifi_g_led/"
+#define WIFI_BLUE_LED				"/sys/class/leds/wifi_b_led/"
+
+
+#define BATTERY_RED_LED			"/sys/class/leds/battery_r_led/"
+#define BATTERY_GREEN_LED			"/sys/class/leds/battery_g_led/"
+#define BATTERY_BLUE_LED			"/sys/class/leds/battery_b_led/"
+
+#define SMS_LED						"/sys/class/leds/sms_led/"
+
+#define MODEM_RED_LED				"/sys/class/leds/modem_r_led/"
+#define MODEM_GREEN_LED			"/sys/class/leds/modem_g_led/"
+#define MODEM_BLUE_LED				"/sys/class/leds/modem_b_led/"
+
+// LEDµÆ²Ù×÷¶¨Òå
+#define BRIGHTNESS					"/brightness"     // µÆ×Ü¿ª¹Ø
+#define BLINKSWITDH					"/trigger"       // ÉÁ˸¿ª¹Ø
+#define BLINKTIMEON					"/delay_on"      // ÉÁ˸ÁÁµÆÊ±¼ä(ms)
+#define BLINKTIMEOFF				"/delay_off"    // ÉÁ˸ÃðµÆÊ±¼ä(ms)
+
+
+#define LEDON						(1)
+#define LEDOFF						(0)
+
+#define LEDBLINKON					"timer"
+#define LEDBLINKOFF					"none"
+
+#define FOTA_LED_BLINK_ON_MS		(300)
+#define FOTA_LED_BLINK_OFF_MS		(300)
+
+
+// system command max len
+//#define CMD_MAX_LEN				(256)
+
+
+// nv max len
+#define LED_NV_MAX_LEN				(256)
+
+
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+
+typedef enum {
+	SHOW_MODE_UNDEFINE = 0,
+	SHOW_MODE_LED = 1,
+	SHOW_MODE_LCD,
+	SHOW_MODE_ALL
+} E_zShowMode;
+
+
+/*******************************************************************************
+ *                       Global variable declarations                          *
+ ******************************************************************************/
+
+E_zShowMode			g_show_mode = SHOW_MODE_UNDEFINE;
+
+/*******************************************************************************
+ *                       Static function declarations                          *
+ ******************************************************************************/
+static int write_led_file(const char* filepath, const char* content)
+{
+	int ret = -1;
+	int fd  = -1;
+
+	fd = open(filepath, O_RDWR|O_TRUNC);
+	if (fd < 0)       
+	{
+		upi_err("open file fail [%s], error:%d[%s]\n", filepath,  errno, strerror(errno));
+		return -1;
+	}
+
+	ret = upi_writen(fd, content, strlen(content));
+	if (ret < 0)
+	{
+		upi_err("write fail ,file path:%s , error:%d[%s]\n", filepath,  errno, strerror(errno));
+		close(fd);
+		return -1;
+	}
+	else
+	{
+		upi_log("write counts: %d\n", ret);
+	}
+
+	ret = close(fd);
+	if(ret < 0)
+	{
+		upi_err("close file fail [%s], error:%d[%s]\n", filepath,  errno, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief		ÉèÖÃLEDµÈÁÁÃð¼°ÉÁ˸
+ * @param	ledName:		LEDµÆÃû³Æ
+ * @param	brightNess:	µÆ×Ü¿ª¹Ø£¬0-¹Ø£¬1-¿ª
+ * @param	blinkSwitch:	ÉÁ˸¿ª¹Ø£¬0-¹Ø£¬1-¿ª
+ * @param	onMs:		ÉÁ˸ÁÁµÆºÁÃëÊý
+ * @param	offMs:		ÉÁ˸ÃðµÆºÁÃëÊý
+ */
+static int led_handle(const char *ledName, unsigned int brightNess,
+                      const char * blinkSwitch, unsigned int onMs, unsigned int offMs)
+{
+	char content[128] = {0};
+	char path[256] = {0};
+	int ret = -1;
+	int ret_1 = -1;
+	int ret_2 = -1;
+	int ret_3 = -1;
+
+	if (NULL == ledName) {
+		upi_err("set_led_blink NULL parameter ledName\n");
+		return -1;
+	}
+
+	if (0 != access(ledName, F_OK)) {
+		upi_err("set_led_blink led device [%s] does not exist!\n", ledName);
+		return -2;
+	}
+
+	switch (brightNess) {
+	case 0: 
+		{
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", brightNess);
+			snprintf(path, sizeof(path), "%s%s", ledName, BRIGHTNESS);
+			ret = write_led_file(path, content);
+			upi_log("set_led_blink set [%s] off :%d \n", ledName, ret);
+			break;
+		}
+
+	case 1: 
+		{
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%s", blinkSwitch);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKSWITDH);
+			ret_1 = write_led_file(path, content);
+
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", onMs);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKTIMEON);
+			ret_2 = write_led_file(path, content);
+
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", offMs);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKTIMEOFF);
+			ret_3 = write_led_file(path, content);
+
+			upi_log("set_led_blink set [%s] blink: %dms on, %dms off, ret=%d|%d|%d \n", ledName, onMs, offMs, ret_1, ret_2, ret_3);
+			ret = (ret_1 & ret_2 & ret_3);
+
+			break;
+		}
+
+	default: 
+		{
+			upi_err("set_led_blink invalid parameter: MUST BE 0 or 1\n");
+			ret = -1;
+			break;
+		}
+	}
+
+
+	return ret;
+}
+
+
+
+
+/*******************************************************************************
+ *                       Global function declarations                          *
+ ******************************************************************************/
+
+/**
+ * @brief 	ÉèÖôò¿ªupiÉý¼¶ledÉÁµÆ
+ * @note		ÉèÖÃÉÁµÆÇ°ÐèÒªÏÈ¹Ø±ÕÆäËüÎÞ¹ØÉÁµÆ
+ */
+void set_upi_leds_on(void)
+{
+	int i   = 0;
+	char* led_list[] = {MODEM_GREEN_LED, WIFI_GREEN_LED, BATTERY_GREEN_LED, NULL};
+	int led_list_len = sizeof(led_list) / sizeof(char*);
+
+
+	// ϨÃðÆäËûLEDµÆ
+	led_handle(WIFI_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_GREEN_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+
+	led_handle(BATTERY_RED_LED,	 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_GREEN_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_BLUE_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+
+	led_handle(MODEM_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_GREEN_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+
+	// FOTAÉý¼¶¹ý³ÌÖÐLEDµÆÉÁ˸ÓÅÏȼ¶ 300msÁÁ£¬300msÃð:
+	// 1. modemÀ¶µÆ 2. batteryÀ¶µÆ 3. wifiÀ¶µÆ 4. batteryÂÌµÆ 5. modemÂ̵Æ
+	for (i = 0; i < led_list_len; i++) {
+		if (NULL == led_list[i]) {
+			break;
+		}
+
+		if (0 == led_handle(led_list[i], LEDON, LEDBLINKON, FOTA_LED_BLINK_ON_MS, FOTA_LED_BLINK_OFF_MS)) {
+			upi_err("FOTA set led blink success, current led device file is %s! \n", led_list[i]);
+			return;
+		}
+	}
+
+	upi_log("FOTA set led blink failed! No blue and green led!\n");
+}
+
+/**
+ * @brief 	ÉèÖùرÕupiÉý¼¶ledÉÁµÆ
+ * @note
+ */
+void set_upi_leds_off(void)
+{
+	led_handle(WIFI_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_GREEN_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_RED_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_GREEN_LED,	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_BLUE_LED,	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_GREEN_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_BLUE_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_RED_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+}
+
+
+
+/**
+ * @brief 	»ñÈ¡ÏÔʾģʽ£¬Ö÷ÒªÅжÏÊÇ·ñÐèÒªLED
+ * @note
+ */
+
+int init_show_mode()
+{
+#if 0
+	char led_nv_value[LED_NV_MAX_LEN] = {0};
+
+	//ÉèÖÃmmiÏÔʾģʽȫ¾Ö±äÁ¿
+	cfg_get_item("mmi_showmode", led_nv_value, sizeof(led_nv_value));
+	if (0 == strcmp(led_nv_value, "led")) {
+		g_show_mode = SHOW_MODE_LED;
+	} else if (0 == strcmp(led_nv_value, "lcd")) {
+		g_show_mode = SHOW_MODE_LCD;
+	} else if (0 == strcmp(led_nv_value, "all")) {
+		g_show_mode = SHOW_MODE_ALL;
+	} else {
+		assert(0);
+		return -1;
+	}
+#endif
+
+	return 0;
+
+}
+
+
+
+
diff --git a/lynq/MD310/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c b/lynq/MD310/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c
index 23ee0c7..b00ad68 100755
--- a/lynq/MD310/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c
+++ b/lynq/MD310/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c
@@ -159,16 +159,16 @@
 		return AT_END;

 	memset(opt, 0 , sizeof(restart_info));

 	void *p[2] = {&opt->action, &opt->subaction}; 

-	

+

 	parse_param2("%d,%d", at_paras, p);

-	

+

 	if (3 != strlen(at_paras) || opt->action < Restart_Action_RESTART || opt->action > Restart_Action_RESET || opt->subaction < Operate_By_MCU || opt->subaction > Operate_By_SOC)

 	{

 		*res_msg = at_err_build(ATERR_PARAM_INVALID);

 		*res_msglen = strlen(*res_msg);

 		return AT_END;

 	}

-	

+

 	printf("ext_restart_req action=%d,subaction=%d ,len=%d \n",opt->action, opt->subaction,strlen(at_paras));

 	*res_msg = opt;

 	*res_msglen = sizeof(restart_info);

@@ -246,12 +246,12 @@
 	snprintf(nv_atv,12,"%d",g_atv);

 	snprintf(nv_atq,12,"%d",g_atq);

 	snprintf(nv_at_d,12,"%d",g_at_d);

-	

+

 	cfg_set("at_atv", nv_atv);

 	cfg_set("at_atq", nv_atq);

 	cfg_set("at_at_d", nv_at_d);

 	cfg_save();

-	

+

 	return AT_END;

 }

 

@@ -311,11 +311,11 @@
 		}

 		else

 			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",101);

-		

+

 	}

 	else

 		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

-		

+

 	*res_msg = at_str;

 	return AT_END;

 }

@@ -372,7 +372,7 @@
 	}

 	else

 		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

-		

+

 	*res_msg = at_str;

 	return AT_END;

 }

@@ -424,11 +424,11 @@
 		}

 		else

 			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",101);

-		

+

 	}

 	else

 		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

-		

+

 	*res_msg = at_str;

 	return AT_END;

 }

@@ -525,23 +525,26 @@
 int ext_at_led_func(char *at_paras, void ** res_msg)

 {

 	int i = 0;

-	char *led_list[6] = {

+	char *led_list[9] = {

 					"battery_g_led",

 					"modem_g_led",

+					"wifi_g_led",

 					"battery_r_led",

 					"modem_r_led",

-					"wifi_led",

-					"modem_b_led",};

-	set_led_states(led_list, 0, 6, 0); // turn off all leds

-	set_led_states(led_list, 0, 2, 1); // turn on all green leds

+					"wifi_r_led",

+					"battery_b_led",

+					"modem_b_led",

+					"wifi_b_led",};

+	set_led_states(led_list, 0, 9, 0); // turn off all leds

+	set_led_states(led_list, 0, 3, 1); // turn on all green leds

 	usleep(500000);

-	set_led_states(led_list, 0, 2, 0); // turn off all green leds

-	set_led_states(led_list, 2, 2, 1); // turn on all red leds

+	set_led_states(led_list, 0, 3, 0); // turn off all green leds

+	set_led_states(led_list, 3, 3, 1); // turn on all red leds

 	usleep(500000);

-	set_led_states(led_list, 2, 2, 0); // turn off all red leds

-	set_led_states(led_list, 4, 2, 1); // turn on all blue leds

+	set_led_states(led_list, 3, 3, 0); // turn off all red leds

+	set_led_states(led_list, 6, 3, 1); // turn on all blue leds

 	usleep(500000);

-	set_led_states(led_list, 4, 2, 0); // turn off all blue leds

+	set_led_states(led_list, 6, 3, 0); // turn off all blue leds

 	return AT_END;

 }

 

@@ -560,7 +563,7 @@
 							MSG_CMD_WIFI_CFG_PWD_RSP, 

 							ext_wifi_cfg_auth_req, ext_wifi_operate_rsp);

 

-	

+

 	register_serv_func2("ZRESET",MODULE_ID_MAIN_CTRL,MSG_CMD_RESET_REQUEST,MSG_CMD_RESTART_RSP,ext_reset_req,ext_restart_rsp);//½ö¹©Éú²ú²âÊÔÓÃ

 	register_serv_func2("ZRESTART=",MODULE_ID_MAIN_CTRL,MSG_CMD_RESTART_REQUEST,MSG_CMD_RESTART_RSP,ext_restart_req,ext_restart_rsp);//ZRESTART=0,0,²ÎÊý1±íʾRESET /RESTART£¬²ÎÊý2±íʾʵ¼ÊÖØÆô²Ù×÷ÊÇ·ñÓɱ¾ºË×Ô¼ºÊµÏÖ

 	register_serv_func("TC_CONTROL=",MODULE_ID_MAIN_CTRL,ext_tc_control_func);