[feature][Task-106][T800-WOM-SWR-046][network] use led dispaly net signal

Change-Id: I1cbcff782214793880fb78fa88583da11333ceed
diff --git a/src/lynq/framework/lynq-ril-service/src/cc.cpp b/src/lynq/framework/lynq-ril-service/src/cc.cpp
index d067540..b1094c4 100755
--- a/src/lynq/framework/lynq-ril-service/src/cc.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/cc.cpp
@@ -47,6 +47,7 @@
 /*Warren add for t800 ril servie 2021/12/23 start*/
 #include "lynq_interface.h"
 #include <binder/Parcel.h>
+#include "led.h"
 using android::Parcel;
 /*Warren add for t800 ril servie 2021/12/23 end*/
 
@@ -1266,7 +1267,7 @@
     static int callIndex = 0;
     RLOGD("callnum = %d, Call State Change then judge speech on/off!", callnum);
     callIndex = callnum;
-    if( callIndex == 1 && speechStatus == SPEECH_OFF) {  //speech on
+    if( callIndex > 0 && speechStatus == SPEECH_OFF) {  //speech on
         //RLOGD("DemoAPP Call shell command (pactl set-card-profile 0 phonecall)");
         //system("pactl set-card-profile 0 phonecall");
         //RLOGD("DemoAPP Call shell command end");
@@ -1280,6 +1281,7 @@
         inCallstatus = CALL_ON;
         RLOGD("[speech]: set on");
         sendCallMsg(true); //for Power Manager test
+        mbtk_netled_state_update(GPIO_NETLED_CS_CALLING);        
     } else if (callIndex == 0
                && (speechStatus == NORMAL_SPEECH_ON
                    || speechStatus == BT_SPEECH_ON)) { //speech off
@@ -1298,6 +1300,7 @@
         speechStatus = SPEECH_OFF;
         inCallstatus = CALL_OFF;
         resetMute();
+        mbtk_netled_state_update(GPIO_NETLED_CS_CALLEND);        
         RLOGD("[speech]: set off");
     } else {
         RLOGD("callIndex is %d, speechStatus is %d.",callIndex, speechStatus);
diff --git a/src/lynq/framework/lynq-ril-service/src/common.cpp b/src/lynq/framework/lynq-ril-service/src/common.cpp
index bf45112..f2901a6 100755
--- a/src/lynq/framework/lynq-ril-service/src/common.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/common.cpp
@@ -39,6 +39,7 @@
 #include "cc.h"
 #include "include/lynq_systime.h"
 #include <include/lynq_uci.h>
+#include "led.h"
 
 static pthread_mutex_t s_DataMutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_DataCond = PTHREAD_COND_INITIALIZER;
@@ -531,6 +532,7 @@
     } else {
         RLOGD("[slot%d]updateCardStatusV6: sim card message is null", slot);
     }
+    mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);  
 }
 
 char* getAid(int slot)
@@ -557,6 +559,7 @@
         reg_voice_service_state[slot] = atoi(code);
         regCodeToServiceState(request, atoi(code), slot);
     }
+    mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);  
 }
 
 void update_reg_voice_radio_tech(int request, int code, int slot, int32_t token) {
@@ -970,6 +973,28 @@
         return -1;
     }
 }
+
+bool ril_get_if_insert_simcard()
+{
+    int slot_id=get_default_sim_voice();
+
+    if(slot_id==0 || slot_id ==1)
+    {
+	    return  cur_CardS_Status[slot_id]->card_state == RIL_CARDSTATE_PRESENT;
+    }
+	return false;	
+}
+
+bool ril_get_if_3gpp_reg_success()
+{
+    int slot_id=get_default_sim_voice();
+
+    if(slot_id==0 || slot_id ==1)
+    {
+		return reg_voice_service_state[slot_id] ==1;
+    }
+	return false;	
+}
 /*hq add for key info output 2022/03/01 begin*/
 // void lynq_output_LINFO_all()
 // {
diff --git a/src/lynq/framework/lynq-ril-service/src/common.h b/src/lynq/framework/lynq-ril-service/src/common.h
index aa9d89c..9d1446d 100755
--- a/src/lynq/framework/lynq-ril-service/src/common.h
+++ b/src/lynq/framework/lynq-ril-service/src/common.h
@@ -200,6 +200,12 @@
 const char *radioStateToString(RIL_RadioState);
 const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
 
+/*for led add by hq 20221202*/
+bool ril_get_if_insert_simcard();
+bool ril_get_if_3gpp_reg_success();
+
+
+
 #if EM_MODE_SUPPORT
 typedef void (* netwokInfoNotify)(int type, char *data);
 typedef void (*atCmdResponse)(char *response,int responselen);
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
index 03b43dd..196cac6 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -48,6 +48,7 @@
 #include "lynq_common.h"
 #include "lynq_interface.h"
 #include <binder/Parcel.h>
+#include "led.h"
 using android::Parcel;
 
 /*Warren add for t800 ril service 2021/12/25 end*/
@@ -140,6 +141,10 @@
                     writeStringToParcel(p,urc_response->apnType);
                     android::LYNQ_RIL_urcBroadcast(p);
                     RLOGD("removed apn:%s,apntype:%s",apn_table[i].apn,apn_table[i].apntype);
+					if(apn_count==0)
+					{
+						mbtk_netled_state_update(GPIO_NETLED_PPP_CLOSED);  
+					}
                     break;
                 }
             }
@@ -180,6 +185,7 @@
                 writeStringToParcel(p,urc_response->apnType);
                 writeStringToParcel(p,urc_response->ifname);
                 android::LYNQ_RIL_urcBroadcast(p);
+				mbtk_netled_state_update(GPIO_NETLED_PPP_CONNECT);  
             }
             else
             {
diff --git a/src/lynq/framework/lynq-ril-service/src/led/include/led.h b/src/lynq/framework/lynq-ril-service/src/led/include/led.h
new file mode 100755
index 0000000..bd5b6b3
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/led/include/led.h
@@ -0,0 +1,42 @@
+/**

+ * @file led.h

+ * @author hq

+ * @brief 

+ * @version 1.0

+ * @date 2022-11-28

+ * 

+ * @copyright Copyright (c) 2022

+ * 

+ */

+#ifndef LED_H

+#define LED_H 1

+

+#define wait_led_update_effective_timer_ms 20

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+typedef enum

+{

+    GPIO_NETLED_REFLASH_NORMAL,

+    GPIO_NETLED_CS_CALLING,

+    GPIO_NETLED_CS_CALLEND,

+    GPIO_NETLED_PPP_CONNECT,

+    GPIO_NETLED_PPP_CLOSED,

+    GPIO_NETLED_AP_GOINGSLEEP,

+    GPIO_NETLED_AP_WAKEUP,

+    GPIO_NETLED_WWAN_CONNECT,

+    GPIO_NETLED_WWAN_CLOSED,

+} mbtk_netled_reflash_type;

+

+void mbtk_netled_state_update(mbtk_netled_reflash_type flag);

+

+void mbtk_netled_init();

+

+void mbtk_netled_deinit();

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/src/lynq/framework/lynq-ril-service/src/led/led.cpp b/src/lynq/framework/lynq-ril-service/src/led/led.cpp
new file mode 100755
index 0000000..27d27ca
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/led/led.cpp
@@ -0,0 +1,565 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <binder/Parcel.h>

+#include <sys/socket.h>

+#include <errno.h>

+#include <unistd.h>

+#include <cutils/jstring.h>

+#include <sys/types.h>

+#include <time.h>
+#include <signal.h>

+#include "led.h"

+#include "led_inner.h"

+#include <liblog/lynq_deflog.h>

+#include "common.h"

+

+#undef LOG_TAG

+#define LOG_TAG "LED"

+

+

+/*************************************************************

+    Constants and Macros

+*************************************************************/

+#define GPIO_NETLED_CONNECT_REFLASH_TIMER   200

+#define GPIO_NETLED_CREG_REFLASH_TIMER   800

+#define MBTK_GPIO_NETLED_N            77

+

+/*************************************************************

+    Extern Function Declaration

+*************************************************************/

+void mbtk_netled_reflash_handle();

+

+/*************************************************************

+    Variables:local,extern

+*************************************************************/

+//static rex_timer_type mbtk_gpio_netled_timer;

+static mbtk_netled_state_t  mbtk_netled_state;

+/*************************************************************

+    Definitions:enum,struct,union

+*************************************************************/

+

+/*=============================================

+FUNCTION

+    mbtk_get_netled_state

+    

+DESCRIPTION

+    This function to return pointer of mbtk_netled_state.

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    None

+

+RETURN VALUE

+    &mbtk_netled_state

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+mbtk_netled_state_t * mbtk_get_netled_state()

+{

+    return &mbtk_netled_state;

+}

+

+/*=============================================

+FUNCTION

+    mbtk_init_netled_state

+    

+DESCRIPTION

+    This function to init mbtk_netled_state.

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    None

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+void mbtk_init_netled_state()

+{

+    mbtk_netled_state_t * netled_state = NULL;

+    netled_state = mbtk_get_netled_state();

+    

+    netled_state->gpio_netled_cs_flag = false;

+    netled_state->gpio_netled_goingsleep_flag = false;

+    netled_state->gpio_netled_ppp_flag = false;

+    netled_state->gpio_netled_wwan_flag = false;

+    

+}

+

+static timer_t s_mbtk_gpio_netled_timer;

+

+static int s_mbtk_gpio_netled_timer_sig_value = 11;  /* 2,3,4 are used by network */

+

+void start_led_timer(timer_t timer, int signal_value, int milliseconds) 

+{

+    RLOGD("start_led_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);

+
+    struct itimerspec expire;
+    expire.it_interval.tv_sec = 0;
+    expire.it_interval.tv_nsec = 0;
+    expire.it_value.tv_sec = milliseconds/1000;
+    expire.it_value.tv_nsec = (milliseconds%1000)*1000000;

+	if (timer_settime(timer, 0, &expire, NULL) == -1) {

+        RLOGE("timer_settime  failed reason=[%s]", strerror(errno));

+    }

+    

+}
+
+void stop_led_timer(timer_t timer, int signal_value) {

+    RLOGD("stop_led_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);

+    struct itimerspec timespec;
+    if(timer_gettime(timer, &timespec) == -1) {
+        RLOGE("stop_led_timer(), get time fail(%s)", strerror(errno));

+        return;
+    }
+    RLOGD("stop_led_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);

+    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {
+        RLOGD("stop_led_timer(), timer_id(%ld) had stopped, just return", (long)timer);

+        return;
+    } else {
+        start_led_timer(timer, signal_value, 0);

+    }
+}

+

+void led_timer_handler(sigval_t sig) 

+{    

+    RLOGD("led_timer_handler, sig_value: %d", sig.sival_int);

+    if(sig.sival_int == s_mbtk_gpio_netled_timer_sig_value) 

+    {

+        mbtk_netled_reflash_handle();

+    }            

+}

+

+void init_led_timer(timer_t* timer, int signal_value) 

+{

+    struct sigevent sevp;

+    memset(&sevp, 0, sizeof(sevp));
+    sevp.sigev_value.sival_int = signal_value;
+    sevp.sigev_notify = SIGEV_THREAD;
+    sevp.sigev_notify_function = led_timer_handler;

+
+    if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
+        RLOGE("init_led_timer()  failed reason=[%s]", strerror(errno));

+    }
+    RLOGD("init_led_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);

+}
+
+void init_led_timer_all() 

+{

+    init_led_timer(&s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);   

+}

+

+void deinit_led_timer_all() 

+{

+    stop_led_timer(s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);    

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_init

+    

+DESCRIPTION

+    This function to init timer

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+void mbtk_netled_init()

+{

+    mbtk_init_netled_state();

+    init_led_timer_all();   

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_deinit

+    

+DESCRIPTION

+    This function to init timer

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+void mbtk_netled_deinit()

+{

+    deinit_led_timer_all();   

+}

+

+

+/*=============================================

+FUNCTION

+    mbtk_get_at_netled_cmd

+    

+DESCRIPTION

+    This function to return netled switch value.

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    None

+

+RETURN VALUE

+    int

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+int mbtk_get_at_netled_cmd(void)

+{

+    return 1;

+//    return (int) dsatutil_get_val(MBTK_AT_GPIO_CGNETLED_IDX,0,0,NUM_TYPE);

+}

+

+/*=============================================

+FUNCTION

+    mbtk_get_reg_net_status

+    

+DESCRIPTION

+    This function that determine if net registers successfully.

+    

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    mbtk_netled_reg_net_status

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+mbtk_netled_reg_net_status  mbtk_get_reg_net_status(void)

+{

+    mbtk_netled_reg_net_status reg_net_status = NET_REG_FAIL;

+

+    if(false  == ril_get_if_insert_simcard())

+    {

+        RLOGE("ril_get_if_insert_simcard false" );

+        reg_net_status = NET_REG_FAIL;

+        return reg_net_status;

+    }

+   

+    if(true == ril_get_if_3gpp_reg_success())

+    {

+        RLOGD("ril_get_if_3gpp_reg_success true");

+        reg_net_status = NET_REG_SUCCESS;

+        return reg_net_status;

+    }

+

+    return reg_net_status;

+

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_get_socket_conn_status

+    

+DESCRIPTION

+    This function that socket connects successfully.

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    mbtk_netled_socket_conn_status

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+mbtk_netled_socket_conn_status  mbtk_netled_get_socket_conn_status(void)

+{

+    mbtk_netled_socket_conn_status  socket_conn_status = MBTK_SOCKET_DISCONNECT; 

+    mbtk_netled_state_t * netled_state =  mbtk_get_netled_state();    

+

+    if(netled_state->gpio_netled_ppp_flag || netled_state->gpio_netled_wwan_flag)

+    {

+        RLOGD("GPIO: ppp wwan netled state sockNum %d,%d",

+        netled_state->gpio_netled_ppp_flag, netled_state->gpio_netled_wwan_flag);

+        

+        socket_conn_status = MBTK_SOCKET_CONNECTED;

+        return socket_conn_status;

+    }   

+

+    return socket_conn_status;

+

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_get_current_state

+    

+DESCRIPTION

+    get the netled status .

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    mbtk_netled_status_type

+

+SIDE EFFECTS

+    None

+=============================================*/

+mbtk_netled_status_type mbtk_netled_get_current_state(void)

+{

+    mbtk_netled_reg_net_status reg_net_status = NET_REG_FAIL;

+    mbtk_netled_status_type netled_status_type = GPIO_NETLED_OFF;

+    mbtk_netled_socket_conn_status socket_conn_status = MBTK_SOCKET_DISCONNECT;

+    int mbtk_netled_at_cmd_value = mbtk_get_at_netled_cmd();  //  0 -- close netled / 1 -- open netled

+    mbtk_netled_state_t * netled_state =  mbtk_get_netled_state();

+    

+    if(mbtk_netled_at_cmd_value == 0 || 

+       netled_state->gpio_netled_goingsleep_flag == true)

+    {

+        netled_status_type = GPIO_NETLED_OFF;

+        return netled_status_type;

+    }

+

+    reg_net_status = mbtk_get_reg_net_status();

+    if( NET_REG_FAIL == reg_net_status || true == netled_state->gpio_netled_cs_flag )

+    {

+        netled_status_type = GPIO_NETLED_LIGHT;

+    }

+    else if( NET_REG_SUCCESS == reg_net_status )

+    {

+        socket_conn_status = mbtk_netled_get_socket_conn_status();

+        

+        if( MBTK_SOCKET_CONNECTED == socket_conn_status )

+        {

+            netled_status_type = GPIO_NETLED_CONNECT;

+        }

+        else if( MBTK_SOCKET_DISCONNECT == socket_conn_status )

+        {

+            netled_status_type = GPIO_NETLED_REG;

+        }

+    } 

+    return netled_status_type;

+}

+

+

+

+bool is_mbtk_timer_finish() {

+    struct itimerspec timespec;
+    if(timer_gettime(s_mbtk_gpio_netled_timer, &timespec) == -1) {

+        RLOGD("%s(), get time fail(%s)", __FUNCTION__, strerror(errno));
+        return true;
+    }
+    RLOGD("%s(), tv_sec=%ld, tv_nsec=%ld", __FUNCTION__,timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
+    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {
+        RLOGD("%s(), timer_id(%ld) had stopped", __FUNCTION__, (long)s_mbtk_gpio_netled_timer);

+        return true;
+    }

+	return false;

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_state_update

+    

+DESCRIPTION

+    This function to reflash network led status and write gpio value

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param     flag

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+void mbtk_netled_state_update(mbtk_netled_reflash_type flag)

+{

+//  rex_timer_cnt_type prev_value;

+    mbtk_netled_state_t * netled_state = NULL;

+    netled_state = mbtk_get_netled_state();

+    

+    switch (flag)

+    {

+        case GPIO_NETLED_REFLASH_NORMAL:

+             break;

+        case GPIO_NETLED_CS_CALLING:

+             netled_state->gpio_netled_cs_flag = true;

+             break;

+        case GPIO_NETLED_PPP_CONNECT:

+             netled_state->gpio_netled_ppp_flag = true;

+             break;

+        case GPIO_NETLED_PPP_CLOSED:

+             netled_state->gpio_netled_ppp_flag = false;

+             break;

+        case GPIO_NETLED_CS_CALLEND:

+             netled_state->gpio_netled_cs_flag = false;

+             break;

+        case GPIO_NETLED_AP_GOINGSLEEP:

+             netled_state->gpio_netled_goingsleep_flag = true;

+             break;

+        case GPIO_NETLED_AP_WAKEUP:

+             netled_state->gpio_netled_goingsleep_flag = false;

+             break;

+        case GPIO_NETLED_WWAN_CONNECT:

+             netled_state->gpio_netled_wwan_flag = true;

+             break;

+        case GPIO_NETLED_WWAN_CLOSED:

+             netled_state->gpio_netled_wwan_flag = false;

+             break;

+

+    }

+

+    //prev_value = rex_get_timer(&mbtk_gpio_netled_timer);

+//    prev_value = timer_get_64(&mbtk_gpio_netled_timer, T_MSEC);

+//    if( prev_value == 0)

+	if((flag== GPIO_NETLED_AP_GOINGSLEEP) || is_mbtk_timer_finish())

+    {

+ //     MBTK_MSG1_HIGH("GPIO: rex_get_timer prev_value =%d",prev_value);

+       //rex_set_timer(&mbtk_gpio_netled_timer, 1);

+       //timer_set_64(&mbtk_gpio_netled_timer,1,0,T_MSEC);

+        start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, 1);        

+    }

+

+    return ;

+}

+

+/*=============================================

+FUNCTION

+    mbtk_netled_reflash_handle

+    

+DESCRIPTION

+    This function to reflash network led status and write gpio value

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+

+void mbtk_gpio_write_output(int gpio_port, int value)

+{

+    if(value==1)

+    {

+        system("echo 255 > /sys/class/leds/led9515:green:cellular-radio/brightness");

+    }  

+	else 

+	{

+	    system("echo 0 > /sys/class/leds/led9515:green:cellular-radio/brightness");

+	}

+}

+

+

+/*=============================================

+FUNCTION

+    mbtk_netled_reflash_handle

+    

+DESCRIPTION

+    This function to reflash network led status and write gpio value

+

+DEPENDENCIES

+    None

+

+PARAMETERS

+    param    not used

+

+RETURN VALUE

+    None

+

+SIDE EFFECTS

+    None

+=============================================*/

+void mbtk_netled_reflash_handle()

+{

+    mbtk_netled_status_type state = GPIO_NETLED_MAX;

+    state = mbtk_netled_get_current_state();

+    RLOGD("mbtk_netled_get_current_state  state = %d",state);

+    static int led_val = 0;

+

+    switch(state)

+    {

+        case GPIO_NETLED_OFF:

+             {

+                 if( 0 != led_val )

+                 {

+                     led_val = 0;

+                     mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 0);

+                 }

+             }

+             break;

+        case GPIO_NETLED_REG:

+             {

+                led_val = ( (1 == led_val)? 0:1 );

+                mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);

+				start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CREG_REFLASH_TIMER);

+				

+              //  timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CREG_REFLASH_TIMER,0,T_MSEC);

+                //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CREG_REFLASH_TIMER);

+             }

+             break;

+        case GPIO_NETLED_CONNECT:

+             {

+                 led_val = ( (1 == led_val)? 0:1 );

+                 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);

+        		 start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CONNECT_REFLASH_TIMER);

+                // timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CONNECT_REFLASH_TIMER,0,T_MSEC);

+                 //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CONNECT_REFLASH_TIMER);

+             }

+             break;

+        case GPIO_NETLED_LIGHT:

+             {

+                 if( 1 != led_val )

+                 {

+                     led_val = 1;

+                     mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 1);

+                 }

+             }

+             break;

+        default:

+             RLOGE("GPIO: Unkown netled state !");

+    }

+}

diff --git a/src/lynq/framework/lynq-ril-service/src/led/led_inner.h b/src/lynq/framework/lynq-ril-service/src/led/led_inner.h
new file mode 100755
index 0000000..2e31e21
--- /dev/null
+++ b/src/lynq/framework/lynq-ril-service/src/led/led_inner.h
@@ -0,0 +1,59 @@
+/**

+ * @file led_inner.h

+ * @author hq

+ * @brief 

+ * @version 1.0

+ * @date 2022-11-28

+ * 

+ * @copyright Copyright (c) 2022

+ * 

+ */

+#ifndef LED_INNER_H

+#define LED_INNER_H 1

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*************************************************************

+    Definitions:enum,struct,union,class

+*************************************************************/

+typedef struct {

+    bool gpio_netled_cs_flag;

+    bool gpio_netled_ppp_flag;

+    bool gpio_netled_wwan_flag;

+    bool gpio_netled_goingsleep_flag;

+}mbtk_netled_state_t;

+

+typedef enum

+{

+    GPIO_NETLED_OFF,

+    GPIO_NETLED_REG,

+    GPIO_NETLED_CONNECT,

+    GPIO_NETLED_LIGHT,

+    GPIO_CS_REG,

+    GPIO_NETLED_MAX

+}mbtk_netled_status_type;

+

+typedef enum

+{

+    NET_REG_SUCCESS,

+    NET_REG_FAIL,

+    NET_REG_MAX

+}mbtk_netled_reg_net_status;

+

+typedef enum

+{

+    MBTK_SOCKET_CONNECTED,

+    MBTK_SOCKET_DISCONNECT,

+    MBTK_SOCKET_CONN_MAX

+}mbtk_netled_socket_conn_status;

+

+/*************************************************************

+    Function Declaration

+*************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/src/lynq/framework/lynq-ril-service/src/makefile b/src/lynq/framework/lynq-ril-service/src/makefile
index 23715e6..2b49b61 100755
--- a/src/lynq/framework/lynq-ril-service/src/makefile
+++ b/src/lynq/framework/lynq-ril-service/src/makefile
@@ -68,6 +68,7 @@
   -I$(LOCAL_PATH)/factory \
   -I$(LOCAL_PATH)/fota \
   -I$(LOCAL_PATH)/temp \
+  -I$(LOCAL_PATH)/led/include \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/liblynq-thermal \
@@ -124,7 +125,7 @@
 endif
 
 
-SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp  temp/*.cpp fota/*.cpp)
+SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp sms/lynqSmsManager/*.cpp  rndis/*.cpp factory/*.cpp  temp/*.cpp fota/*.cpp led/*.cpp)
 
 EXECUTABLE = lynq-ril-service
 
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index e44cd49..a66ab71 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -91,6 +91,7 @@
 #include "lynq_fota.h"
 /*lt add end*/
 /*Warren add for t800 RIL service 2021_12_10 end*/
+#include "led.h"
 
 #define LOG_TAG "DEMO_RIL"
 #define WAIT_TIME_FOR_SIM_SWITCH 30
@@ -5670,6 +5671,7 @@
 
 static void initCoditions()
 {
+    mbtk_netled_init();
     mixer_init();
     if(utils::is_support_dsds()) {
         for(int i = 0; i < 2 ; i++) {
@@ -6168,6 +6170,7 @@
      }
      RLOGD("close socket fd");
      close(server_socket_fd);
+	 mbtk_netled_deinit();
      return ;
 }
 int LYNQ_RIL_respSocket(Parcel &p,RIL_Token t)
diff --git a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp b/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
index 9e16b5e..b1142ef 100755
--- a/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/stateManager/stateManager.cpp
@@ -47,6 +47,7 @@
 #include "util/utils.h"
 #include <cutils/jstring.h>
 #include <liblog/lynq_deflog.h>
+#include "led.h"
 #undef LOG_TAG
 #define LOG_TAG "DEMO_MANAGER"
 
@@ -96,7 +97,12 @@
     size_t pos = p.dataPosition();
 
     p.writeInt32(1);
-    p.writeInt32(atoi(argv[1]));
+
+	int screen_state= atoi(argv[1]);
+    p.writeInt32(screen_state);
+
+    mbtk_netled_state_update(screen_state==0 ? GPIO_NETLED_AP_GOINGSLEEP : GPIO_NETLED_AP_WAKEUP);	
+	usleep(wait_led_update_effective_timer_ms*1000);
 
     p.setDataPosition(pos);
     pRI->pCI->dispatchFunction(p, pRI);