/*
 * @Description: NB模块-svc层-nb81指令集子模块
 * @Author: yangsw
 * @Date: 2021-06-04 14:05:58
 * @LastEditTime: 2024-01-15 16:59:59
 * @LastEditors: LiDa
 * @Reference: 
 */

#include "svc_mb26_latcmd.h"
#include "../../log/svc/svc_log.h"
#include "../../com/svc/svc_com.h"
#include "../../util/util_data.h"
#include "../../util/util_time.h"
#include "../../cloud/svc/svc_cloud.h"
#include "param/svc/svc_flash.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../led/app/app_led.h"
#include "../../cloud/app/app_cloud.h"
#include "../../factory/svc/svc_factory.h"
#include "hci/led/app/sr_app_led.h"

#include "at.h"
#include "sr_log.h"

#ifdef MB26S_LIERDA_MODEL

static gw_s8 Nb_At_Callback(void *pData);
static gw_s8 Nb_Disable_Function_Ack_Callback(void *pData);
static gw_s8 Nb_Enable_Function_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Register_State_Ack_Callback(void *pData);
static gw_s8 Nb_Coap_Set_Server_Ack_Callback(void *pData);
static gw_s8 Nb_Coap_Send_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Version_Ack_Callback(void *pData);
static gw_s8 Nb_Get_IMEI_Ack_Callback(void *pData);
static gw_s8 Nb_Get_IMSI_Ack_Callback(void *pData);
static gw_s8 Nb_Enable_Err_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Signal_Strength_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Current_Time_Ack_Callback(void *pData);
static gw_s8 Nb_Coap_Recv_Callback(void *pData);
static gw_s8 Nb_Band_Query_Ack_Callback(void *pData);
static gw_s8 Nb_Coap_register_Ack_Callback(void *pData);
static gw_s8 Nb_Enable_Register_Notice_Ack_Callback(void *pData);
static gw_s8 Nb_Enable_Connect_Notice_Ack_Callback(void *pData);
static gw_s8 Nb_Attach_Net_Ack_Callback(void *pData);
static gw_s8 Nb_Show_PDP_Address_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Attach_Net_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Check_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Iccid_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Cesq_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Statusphy_Ack_Callback(void *pData);
static gw_s8 Nb_Get_Statusrrc_Ack_Callback(void *pData);

static const S_Nb_At_Cmd_Data at_cmd_data[NB_AT_CMD_NUM] = {
    {AT_CMD,              (gw_u8*)"AT\r\n",                                 (gw_u8*)"OK",               3000,   5,  Nb_At_Callback },
    {AT_CMD_CFUN_0,       (gw_u8*)"AT+CFUN=0\r\n",                          (gw_u8*)"OK",               8000,   3,  Nb_Disable_Function_Ack_Callback },
    {AT_CMD_CFUN_1,       (gw_u8*)"AT+CFUN=1\r\n",                          (gw_u8*)"OK",               3000,   3,  Nb_Enable_Function_Ack_Callback },
    {AT_CMD_CEREG,        (gw_u8*)"AT+CEREG?\r\n",                          (gw_u8*)"+CEREG: 0,1",      5000,   30, Nb_Get_Register_State_Ack_Callback },
    {AT_CMD_COAP,         (gw_u8*)"AT+CTM2MSETPM=",                         (gw_u8*)"OK",               5000,   3,  Nb_Coap_Set_Server_Ack_Callback },
    {AT_CMD_COAP_REG,     (gw_u8*)"AT+CTM2MREG\r\n",                        (gw_u8*)"+CTM2M: obsrv,0",  15000,  3,  Nb_Coap_register_Ack_Callback },
    {AT_CMD_COAP_SEND,    (gw_u8*)"AT+CTM2MSEND=\"",                        (gw_u8*)"+CTM2M: send,0",   15000,  3,  Nb_Coap_Send_Ack_Callback },
    {AT_CMD_CGSN_1,       (gw_u8*)"AT+CGSN=1\r\n",                          (gw_u8*)"+CGSN:",           3000,   3,  Nb_Get_IMEI_Ack_Callback },
    {AT_CMD_CGMR,         (gw_u8*)"AT+CGMR\r\n",                            (gw_u8*)"OK",               3000,   3,  Nb_Get_Version_Ack_Callback },
    {AT_CMD_CMEE_1,       (gw_u8*)"AT+CMEE=1\r\n",                          (gw_u8*)"OK",               3000,   3,  Nb_Enable_Err_Ack_Callback },
    {AT_CMD_CSQ,          (gw_u8*)"AT+CSQ\r\n",                             (gw_u8*)"+CSQ:",            3000,   3,  Nb_Get_Signal_Strength_Ack_Callback },
    {AT_CMD_CCLK,         (gw_u8*)"AT+CCLK?\r\n",                           (gw_u8*)"+CCLK:",           3000,   3,  Nb_Get_Current_Time_Ack_Callback },
    {AT_CMD_CIMI,         (gw_u8*)"AT+CIMI\r\n",                            (gw_u8*)"OK",               3000,   3,  Nb_Get_IMSI_Ack_Callback },
    {AT_CMD_BAND,         (gw_u8*)"AT+ECBAND?\r\n",                         (gw_u8*)"+ECBAND:",         3000,   3,  Nb_Band_Query_Ack_Callback },
    {AT_CMD_CEREG_1,      (gw_u8*)"AT+CEREG=0\r\n",                         (gw_u8*)"OK",               3000,   3,  Nb_Enable_Register_Notice_Ack_Callback },
    {AT_CMD_CSCON_1,      (gw_u8*)"AT+CSCON=0\r\n",                         (gw_u8*)"OK",               3000,   3,  Nb_Enable_Connect_Notice_Ack_Callback },
    {AT_CMD_CGATT_1,      (gw_u8*)"AT+CGATT=1\r\n",                         (gw_u8*)"OK",               5000,   10, Nb_Attach_Net_Ack_Callback },
    {AT_CMD_CGPADDR,      (gw_u8*)"AT+CGPADDR\r\n",                         (gw_u8*)"+CGPADDR:",        3000,   3,  Nb_Show_PDP_Address_Ack_Callback },
    {AT_CMD_CGATT,        (gw_u8*)"AT+CGATT?\r\n",                          (gw_u8*)"+CGATT: 1",        5000,   30, Nb_Get_Attach_Net_Ack_Callback },
    {AT_CMD_ECNPICFG,     (gw_u8*)"AT+ECNPICFG?\r\n",                       (gw_u8*)"OK",               3000,   3,  Nb_Get_Check_Ack_Callback },
    {AT_CMD_ECICCID,      (gw_u8*)"AT+ECICCID\r\n",                         (gw_u8*)"+ECICCID:",        5000,   3,  Nb_Get_Iccid_Ack_Callback },
    {AT_CMD_CESQ,         (gw_u8*)"AT+CESQ\r\n",                            (gw_u8*)"+CESQ:",           3000,   3,  Nb_Get_Cesq_Ack_Callback },
    {AT_CMD_STATUSPHY,    (gw_u8*)"AT+ECSTATUS=PHY\r\n",                    (gw_u8*)"+ECSTATUS: PHY",   3000,   3,  Nb_Get_Statusphy_Ack_Callback }, //+ECSTATUS: PHY,
    {AT_CMD_STATUSRRC,    (gw_u8*)"AT+ECSTATUS=RRC\r\n",                    (gw_u8*)"+ECSTATUS: RRC",   3000,   3,  Nb_Get_Statusrrc_Ack_Callback },       
};

static const S_Nb_At_Cmd_Notice at_cmd_notice[NB_AT_CMD_NOTICE_NUM]={
    {(gw_u8*)"+CTM2MRECV:",Nb_Coap_Recv_Callback},
}; 

S_Nb_At_Cmd_Data* Svc_Nb_Find_At_Cmd(E_Nb_At_Cmd in_at_cmd){
    
    for(int i=0;i<NB_AT_CMD_NUM;i++){
        if(at_cmd_data[i].e_nb_at_cmd==in_at_cmd){
            return (S_Nb_At_Cmd_Data *)&at_cmd_data[i];
        }
    }
    return NULL;
}

E_Result_State Svc_Nb_At_Cmd_Notice_Parse(gw_u8 *data){
    char *p=NULL;
    for(int i=0;i<NB_AT_CMD_NOTICE_NUM;i++){
        p=strstr((char const*)data,(char const*)at_cmd_notice[i].recv_cmd);
        if(p!=NULL){
            if(at_cmd_notice[i].callback!=NULL){
               at_cmd_notice[i].callback(data);
               return E_STATE_SUCCESS; 
            }
        }
    }
    return E_STATE_ERROR;
}

//static gw_s8 Nb_Disable_Function_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Disable_Function_Ack_Callback(void *pData)
{
  return 0;
}

//static gw_s8 Nb_Enable_Function_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Enable_Function_Ack_Callback(void *pData)
{
  return 0;
}

//static gw_s8 Nb_Get_Version_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Version_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p,ver[32]={0};
  S_Factory_Data *s_factory = Svc_Factory_Get_Data(); 

  p = at_resp_get_line_by_kw(resp, "SDK Version:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find ver");
    return -1;
  }

  //提取version
  if(sscanf(p, "-- SDK Version: %s --", ver)!=1)
  {      
        SR_LOG_WARN("sscanf ver error");
        return -1;
  }

  SR_LOG_DEBUG("ver: %s", ver);


  Svc_Cloud_Set_Nb_Ver((uint8_t *)ver,strlen(ver));    
  return 0;

#if  0
  gw_u8* data=(gw_u8*)pData;
  gw_u8 *p,*p1;
  p=(gw_u8*)strstr((char const*)data,"SDK Version: ");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find ver",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("SDK Version: "));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1," --");
  if(p1==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find ver",__FUNCTION__);
    return -1;
  }
  S_Flash_Data *app_data=Svc_Flash_Get_Data();
  if(app_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len>32){
    Svc_Log_Printf(LOG_WARNING,"%s->ver len error",__FUNCTION__);
    return -1;
  }
  // app_data->s_flash_nb_info.comm_model_ver_len=len;
  // memcpy(app_data->s_flash_nb_info.comm_model_ver,p,len);
	Svc_Cloud_Set_Nb_Ver(p,len);    
  return 0;
#endif
}

//static gw_s8 Nb_Get_IMEI_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_IMEI_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p,imei[16]={0};
  S_Factory_Data *s_factory = Svc_Factory_Get_Data(); 

  p = at_resp_get_line_by_kw(resp, "+CGSN:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find imei");
    return -1;
  }

  //提取imei
  if(sscanf(p, "+CGSN: \"%[^\"]\"", imei)==1){
        if(strlen(imei) != 15)  
        {
           SR_LOG_WARN("imei len error");
           return -1;
        }
    } else {
        SR_LOG_WARN("sscanf imei error");
        return -1;
    }

  SR_LOG_DEBUG("imei: %s", imei);

  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_IMEI = 1;  
  }
  Svc_Cloud_Set_Imei((uint8_t *)imei);
  
  return 0;

#if   0
  gw_u8* data=(gw_u8*)pData;
  gw_u8 *p,*p1;
  S_Factory_Data *s_factory = Svc_Factory_Get_Data(); 
  p=(gw_u8*)strstr((char const*)data,"+CGSN: \"");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find imei",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("+CGSN: \""));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1,"\"");
  if(p1==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find imei",__FUNCTION__);
    return -1;
  }
  S_Flash_Data *app_data=Svc_Flash_Get_Data();
  if(app_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len>32){
    Svc_Log_Printf(LOG_WARNING,"%s->imei len error",__FUNCTION__);
    return -1;
  }
  // app_data->s_flash_nb_info.comm_model_imei_len=len;
  // memcpy(app_data->s_flash_nb_info.comm_model_imei,p,len);
  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_IMEI = 1;  
  }
  Svc_Cloud_Set_Imei(p);
  
  return 0;
  
#endif
}

//static gw_s8 Nb_Get_IMSI_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_IMSI_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p=SR_NULL;
  uint8_t len;
  S_Factory_Data *s_factory = Svc_Factory_Get_Data(); 


  p = at_resp_get_line(resp, 2); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find imsi");
    return -1;
  }

  SR_LOG_DEBUG("imsi: %s", p);

  //提取imsi
  len = strlen(p);
  if(len>24 || len<2){
    SR_LOG_WARN("imsi len error");
    return -1;
  }

 

  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_IMSI = 1;  
  }  
  Svc_Cloud_Set_Imsi(p);
  
  return 0;

#if  0

  gw_u8* data=(gw_u8*)pData;
  gw_u8 *p,*p1;
  S_Factory_Data *s_factory = Svc_Factory_Get_Data();
  p=(gw_u8*)strstr((char const*)data,"\r\n");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find imsi",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("\r\n"));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1,"\r\n");
  if(p1==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find imsi",__FUNCTION__);
    return -1;
  }
  S_Flash_Data *app_data=Svc_Flash_Get_Data();
  if(app_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len>24){
    Svc_Log_Printf(LOG_WARNING,"%s->imsi len error",__FUNCTION__);
    return -1;
  }
  // app_data->s_flash_nb_info.comm_model_imsi_len=len;
  // memcpy(app_data->s_flash_nb_info.comm_model_imsi,p,len);
  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_IMSI = 1;  
  }  
  Svc_Cloud_Set_Imsi(p);
  return 0;

#endif

}

//static gw_s8 Nb_Enable_Err_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Enable_Err_Ack_Callback(void *pData)
{
  return 0;
}

//static gw_s8 Nb_Get_Register_State_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Register_State_Ack_Callback(void *pData)
{
  return 0;
}

//static gw_s8 Nb_Get_Signal_Strength_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Signal_Strength_Ack_Callback(void * pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p;
  uint8_t csq=0;


  p = at_resp_get_line_by_kw(resp, "+CSQ:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find csq");
    return -1;
  }

   //提取csq
  if(sscanf(p, "+CSQ: %d,", &csq)!=1)
  {
      SR_LOG_WARN("sscanf csq error");
      return -1;
  }

  S_Cloud_Data *s_cloud_data=Svc_Cloud_Get_Data();
  if(s_cloud_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
 

  s_cloud_data->u8Csq=csq;
  return 0;

#if  0
  gw_u8* data =(gw_u8*)pData;
  gw_u8 *p,*p1;
  p=(gw_u8*)strstr((char const*)data,"+CSQ: ");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find csq",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("+CSQ: "));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1,",");
  if(p1==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find csq",__FUNCTION__);
    return -1;
  }

  S_Cloud_Data *s_cloud_data=Svc_Cloud_Get_Data();
  if(s_cloud_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len>2){
    Svc_Log_Printf(LOG_WARNING,"%s->csq len error",__FUNCTION__);
    return -1;
  }
  s_cloud_data->u8Csq=Util_Data_String_To_Uint8(p,len);
  return 0;
#endif

}

//static gw_s8 Nb_Get_Current_Time_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Current_Time_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p,buff[20]={0};

  p = at_resp_get_line_by_kw(resp, "+CCLK:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find cclk");
    return -1;
  }

   //提取cclk
  if(sscanf(p, "+CCLK: \"%19s", buff)!=1)
  {
      SR_LOG_WARN("sscanf cclk error");
      return -1;
  }



#if   0
  gw_u8* data =(gw_u8*)pData;
  gw_u8 *p,*p1;
  gw_u8 buff[20];

  p=(gw_u8*)strstr((char const*)data,"+CCLK: \"");
  if(p==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->not find cclk",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("+CCLK: \""));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1,"+");
  if(p1==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->not find cclk",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len!=19){
    Svc_Log_Printf(LOG_ERROR,"%s->cclk len error",__FUNCTION__);
    return -1;
  }
  memcpy(buff,p,19);
  buff[19] = '\0';
#endif

  gw_u8 time[6];
  char *strs[2]={NULL};
  char *strs1[3]={NULL};
  gw_u8 out_size=0;
  gw_u16 year;
  out_size=Util_Data_String_Split((gw_s8*)buff,',',strs,2);
  if(out_size<2){
    Svc_Log_Printf(LOG_ERROR,"%s->string split fail!",__FUNCTION__);
    return -1;
  }
  out_size=Util_Data_String_Split((gw_s8*)strs[0],'/',strs1,3);
  if(out_size<3){
    Svc_Log_Printf(LOG_ERROR,"%s->string split fail!",__FUNCTION__);
    return -1;
  }
  year=Util_Data_String_To_Uint16((gw_u8*)strs1[0],strlen(strs1[0]));
  if(year<2000){
    Svc_Log_Printf(LOG_ERROR,"%s->year error!",__FUNCTION__);
    return -1;
  }
  time[0]=year-2000;
  time[1]=Util_Data_String_To_Uint8((gw_u8*)strs1[1],strlen(strs1[1]));
  time[2]=Util_Data_String_To_Uint8((gw_u8*)strs1[2],strlen(strs1[2]));
  out_size=Util_Data_String_Split((char*)strs[1],':',strs1,3);
  if(out_size<3){
    Svc_Log_Printf(LOG_ERROR,"%s->string split fail!",__FUNCTION__);
    return -1;
  }
  time[3]=Util_Data_String_To_Uint8((gw_u8*)strs1[0],strlen(strs1[0]));
  time[4]=Util_Data_String_To_Uint8((gw_u8*)strs1[1],strlen(strs1[1]));
  time[5]=Util_Data_String_To_Uint8((gw_u8*)strs1[2],strlen(strs1[2]));
  Util_Time_Add_Hour(time,8,time);              //O时区转为东八区,+8小时
  gw_u32 pu32time;
  pu32time = Util_Time_Date_To_Timestamp(time);
  if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
  {
      Svc_Cloud_Time_Calibrate(pu32time);
  }
  return 0;
}

//static gw_s8 Nb_Coap_Send_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Coap_Send_Ack_Callback(void *pData)
{
    //gw_u8* data =(gw_u8*)pData;
    
    return 0; 
}

void Nb_Coap_Sendok_Proc(void)
{
    S_Cloud_Data *ps_cloud_data;
	  Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND);//清除NB发送udp数据事件		
    ps_cloud_data=Svc_Cloud_Get_Data();
    Svc_Cloud_Set_Keep_Alive_Time(15); 
    if(Svc_Cloud_Get_Sending_Event()==E_Cloud_Event_Rsp_Set){
        Svc_Cloud_Clear_Event(E_Cloud_Event_Rsp_Set);
        ps_cloud_data->u16FrameSerial=ps_cloud_data->u16FrameSerial+1;
    }
		else if(Svc_Cloud_Get_Sending_Event()==E_Cloud_Event_Upload){
				// SR_AppLedSetWork(LED_NB_NET_RUN);
				SR_AppLedClearFlag(LED_NB_NET_ERR);
				SR_AppLedClearFlag(LED_NB_NET_INIT);				
				Parse_Cmd82_Reply_Data_Upload(0,0);
		}		
		else if(Svc_Cloud_Get_Sending_Event()==E_Cloud_Event_Upload_Historical){
				// SR_AppLedSetWork(LED_NB_NET_RUN);
				SR_AppLedClearFlag(LED_NB_NET_ERR);
				SR_AppLedClearFlag(LED_NB_NET_INIT);				
				Parse_Cmd85_Reply_Historical_Data_Upload(0,0);						
		}		
    else if(Svc_Cloud_Get_Sending_Event()==E_Cloud_Event_Rsp_Info){
        Svc_Cloud_Clear_Event(E_Cloud_Event_Rsp_Info);
        ps_cloud_data->u16FrameSerial=ps_cloud_data->u16FrameSerial+1;
    }
    else if(Svc_Cloud_Get_Sending_Event()==E_Cloud_Event_Rsp_Historical){
        Svc_Cloud_Clear_Event(E_Cloud_Event_Rsp_Historical);
        ps_cloud_data->u16FrameSerial=ps_cloud_data->u16FrameSerial+1;
    }

}



//static gw_s8 Nb_At_Callback(gw_u8* data)
static gw_s8 Nb_At_Callback(void *pData)
{
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data();
    // S_Nb_Core *ps_nb_core;
    // ps_nb_core = Svc_Nb_Core_Get_Data();
    // if(ps_nb_core->s_fail_state.rst_fail_cnt > 0)
    // {
    //     return -1;
    // }
    ps_flash->s_para.u16Netcnt++;
    if(ps_flash->s_para.u16Netcnt > 65535)
    {
       ps_flash->s_para.u16Netcnt = 65535;
    }
    if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
    {
        Svc_Flash_Write_Device_Para(&ps_flash->s_para);
    }
    return 0;
}

static gw_s8 Nb_Coap_Set_Server_Ack_Callback(void *pData){
  return 0;
}

static gw_s8 Nb_Band_Query_Ack_Callback(void *pData){
  return 0;
}

static gw_s8 Nb_Coap_register_Ack_Callback(void *pData){
  // s_nb_core.s_fail_state.send_time_cnt=0;
  return 0;
}

//static gw_s8 Nb_Coap_Recv_Callback(gw_u8* data)
static gw_s8 Nb_Coap_Recv_Callback(void *pData)
{
  gw_u8* data =(gw_u8*)pData;

  gw_u8 *p=data;
  gw_u8 *p1=NULL;
  //char *strs[3]={NULL};
  //gw_u8 out_size=0;
  p=(gw_u8*)strstr((char const*)data,"+CTM2MRECV: ");

  //p1=(gw_u8*)strstr((char const*)(data+1),"+CTM2MRECV: ");
  if(p!=NULL){
    gw_u16 data_len;
    p=(gw_u8*)(p+strlen("+CTM2MRECV: "));
    p1 = (gw_u8*)strstr((char const*)p,"\r\n\r\n");
    if(p1 != NULL)
    {
        data_len=p1-p;    //需要减掉末尾的\r\n\r\n
    }
    else{
        data_len=strlen((char const*)data)-strlen("+CTM2MRECV: ")-4;    //需要减掉末尾的\r\n\r\n
    }
    //out_size=Util_Data_String_Split((char*)p,',',strs,3);
    // if(out_size<2){
    //   Svc_Log_Printf(LOG_ERROR,"%s->string split fail!",__FUNCTION__);
    //   return -1;
    // }
    //gw_u16 data_len=strlen(strs[2]);
    gw_u8* buff=Svc_Com_Get_Buf();
    if(buff==NULL){
        Svc_Log_Printf(LOG_ERROR,"%s->malloc fail!",__FUNCTION__);
        return -3;
    }
    data_len=Util_Data_String2_To_Byte((gw_u8*)p,data_len,buff);
    //接收数据解析
    Svc_Cloud_Protocol_Parse(buff,data_len);
    //
    // if(buff!=NULL){
    //     free(buff);
    //     buff=NULL;
    // }
  }
  return 0;
}

/**
 * @name: 
 * @param {gw_u8*} in_data
 * @param {gw_u16} in_len
 * @param {gw_u8*} out_data
 * @return {*}
 * @note: 
 */
gw_u16 Svc_Nb_Coap_Send_Data_Creat(gw_u8* in_data,gw_u16 in_len,gw_u8* out_data){
  S_Nb_At_Cmd_Data *cmd_struct;
  cmd_struct=Svc_Nb_Find_At_Cmd(AT_CMD_COAP_SEND);
  if(cmd_struct==NULL){
    return 0;
  }
  gw_u8 cmd_head_len;
  cmd_head_len=strlen((char const*)cmd_struct->send_cmd);
  memcpy(out_data,cmd_struct->send_cmd,cmd_head_len);
  gw_u16 out_len;
  out_len=Util_Data_Hexs_To_Hexstr(in_data,&out_data[cmd_head_len],in_len,0);
  gw_u16 send_len;
  send_len=cmd_head_len+out_len;
  out_data[send_len]='\0';
  strcat((char*)out_data,"\",0\r\n");
  send_len=send_len+strlen("\",0\r\n");
  return send_len;
}

// /**
//  * @name: 
//  * @param {gw_u8*} out_data
//  * @return {*}
//  * @note: 
//  */
// gw_u16 Svc_Nb_Coap_Creat(gw_u8* out_data){
//   S_Nb_At_Cmd_Data *cmd_struct;
//   cmd_struct=Svc_Nb_Find_At_Cmd(AT_CMD_COAP);
//   if(cmd_struct==NULL){
//     return 0;
//   }
//   gw_u8 cmd_head_len;
//   cmd_head_len=strlen((char const*)cmd_struct->send_cmd);
//   memcpy(out_data,cmd_struct->send_cmd,cmd_head_len);
//   gw_u8 server_len=strlen(NB_CDP_SERVER);
//   memcpy(&out_data[cmd_head_len],NB_CDP_SERVER,server_len);
//   gw_u16 send_len;
//   send_len=cmd_head_len+server_len;
//   out_data[send_len]='\0';
//   strcat((char*)out_data,",86400\r\n");
//   send_len=send_len+strlen(",86400\r\n");
//   return send_len;
// }

/**
 * @name: 
 * @param {gw_u8*} out_data
 * @return {*}
 * @note: 
 */
gw_u16 Svc_Nb_Coap_Creat(gw_u8* out_data){
		gw_u8 cmd_head_len;
    gw_u8 port_len;
		gw_u8 ip_len;
		gw_u8 *p,*p1;
    gw_u16 send_len;
    S_Nb_At_Cmd_Data *cmd_struct;
    S_Flash_Data *ps_flash_data;
    ps_flash_data=Svc_Flash_Get_Data();

    cmd_struct=Svc_Nb_Find_At_Cmd(AT_CMD_COAP);
		if(cmd_struct==NULL){
        return 0;
    }
		cmd_head_len=strlen((char const*)cmd_struct->send_cmd);
    memcpy(out_data,cmd_struct->send_cmd,cmd_head_len);
		send_len=cmd_head_len;
		memcpy(&out_data[cmd_head_len],"\"",1);
		send_len=send_len+1; 
	
		p=(gw_u8*)ps_flash_data->s_para.s_nb_info.IpInfo;		
		p1=p+1;
		p1=(gw_u8*)strstr((char const*)p1,",");    
		if(p1==NULL){
		    Svc_Log_Printf(LOG_WARNING,"%s->not find server ip\r\n",__FUNCTION__);
		    return 0;
		}
		ip_len=p1-p;
    memcpy(&out_data[send_len],p,ip_len);		
		send_len=send_len+ip_len;
		memcpy(&out_data[send_len],"\",",2);
		send_len=send_len+2; 
		p1=p1+1;
    port_len=strlen((const char *)p1);		
    memcpy(&out_data[send_len],p1,port_len);   
		send_len=send_len+port_len;		 
    strcat((char*)out_data,",86400\r\n");
    send_len=send_len+strlen(",86400\r\n");    
    out_data[send_len]='\0';        
    return send_len;
}

/**
 * @brief: 使能注册网络通知回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Enable_Register_Notice_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Enable_Register_Notice_Ack_Callback(void *pData)
{
  return 0;
}



/**
 * @brief: 使能网络连接通知回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Enable_Connect_Notice_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Enable_Connect_Notice_Ack_Callback(void *pData)
{
  return 0;
}


/**
 * @brief: 附着网络回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Attach_Net_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Attach_Net_Ack_Callback(void *pData)
{
  return 0;
}


/**
 * @brief: 显示PDP地址回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Show_PDP_Address_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Show_PDP_Address_Ack_Callback(void *pData)
{
  
  at_response_t resp = (at_response_t) pData;
  char *p;


  p = at_resp_get_line_by_kw(resp, "+CGPADDR:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not get addr");
    return -1;
  }

  SR_LOG_DEBUG("addr: %s",p);
 
  return 0;
}

/**
 * @brief: 查询网络附着状态回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Get_Attach_Net_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Attach_Net_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p;
  uint8_t attach;

  
  p = at_resp_get_line_by_kw(resp, "+CGATT:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find cgatt");
    return -1;
  }

  SR_LOG_INFO("att: %s", p);

  //提取att
  if(sscanf(p, "+CGATT: %d", &attach)==1)
  {
    if(attach!=1) 
    {
      SR_LOG_WARN("+CGATT: %d,!=1", attach);
      return -1;
    }
   
  } else {
      SR_LOG_WARN("sscanf cgatt error");
      return -1;
  }


  return 0;
}

/**
 * @brief: 查询校准状态
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Get_Check_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Check_Ack_Callback(void *pData)
{
  return 0;
}
/**
 * @brief: 查询信号质量
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Get_Cesq_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Cesq_Ack_Callback(void *pData)
{
  return 0;
}

/**
 * @brief: 查询ICCID
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
//static gw_s8 Nb_Get_Iccid_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Iccid_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p,iccid[32]={0};
  S_Factory_Data *s_factory = Svc_Factory_Get_Data(); 

  p = at_resp_get_line_by_kw(resp, "+ECICCID:"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find iccid");
    return -1;
  }

  //提取iccid
  if(sscanf(p, "+ECICCID: %s", iccid)==1){
        if(strlen(iccid) >21)  
        {
           SR_LOG_WARN("iccid len error");
           return -1;
        }
    } else {
        SR_LOG_WARN("sscanf iccid error");
        return -1;
    }

  SR_LOG_DEBUG("iccid: %s", iccid);

  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_ICCID = 1;  
  } 
  
  Svc_Cloud_Set_Iccid(iccid);
  
  return 0;



#if  0
  gw_u8* data = (gw_u8*)pData;
  gw_u8 *p,*p1;
  S_Factory_Data *s_factory = Svc_Factory_Get_Data();
  p=(gw_u8*)strstr((char const*)data,"+ECICCID: ");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find icccid",__FUNCTION__);
    return -1;
  }
  p=(gw_u8*)(p+strlen("+ECICCID: "));
  p1=p+1;
  p1=(gw_u8*)strstr((char const*)p1,"\r\n");
  if(p1==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find icccid",__FUNCTION__);
    return -1;
  }
  S_Flash_Data *app_data=Svc_Flash_Get_Data();
  if(app_data==NULL){
    Svc_Log_Printf(LOG_ERROR,"%s->app_data is NULL",__FUNCTION__);
    return -1;
  }
  gw_u8 len=p1-p;
  if(len>21){
    Svc_Log_Printf(LOG_WARNING,"%s->icccid len error",__FUNCTION__);
    return -1;
  }
  // app_data->s_flash_nb_info.comm_model_iccid_len=len;
  // memcpy(app_data->s_flash_nb_info.comm_model_iccid,p,len);
  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_ICCID = 1;  
  } 
  
  Svc_Cloud_Set_Iccid(p);
  return 0;

#endif
}

//static gw_s8 Nb_Get_Statusphy_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Statusphy_Ack_Callback(void *pData)
{
    at_response_t resp = (at_response_t) pData;
    char *data;

    data = at_resp_get_line_by_kw(resp, "+ECSTATUS: PHY,"); //查找关键字
    if (data==SR_NULL) {
      SR_LOG_WARN("not find phy");
      return -1;
    }

    SR_LOG_INFO("phy: %s", data);

    //+ECSTATUS: PHY, DlEarfcn:3688, UlEarfcn:21688, PCI:38, Band:8, RSRP:-70, 
    //  RSRQ:-13, SNR:1, AnchorFreqOfst:11, NonAnchorFreqOfst:0, CeLevel:0, DlBler:0/100, 
    //  UlBler:0/100, DataInactTimerS:0, RetxBSRTimerP:0, TAvalue:-1, TxPower:-128,NBMode:"Stand alone"
    gw_u8 *p=data;  
    S_Factory_Data *s_factory = Svc_Factory_Get_Data();
    gw_s8 *strs[18]={NULL};
    gw_s8 *strdata[2] = {NULL}; 
    gw_u8 out_size=0;
    gw_u8 out_datasize = 0; 
    S_Cloud_Data *ps_cloud_data;
    ps_cloud_data = Svc_Cloud_Get_Data();
    p=(gw_u8*)strstr((char const*)data,"+ECSTATUS: PHY,");
    if(p==NULL){
      Svc_Log_Printf(LOG_WARNING,"%s->not find PHY\r\n",__FUNCTION__);
      return -1;
    }	
	  out_size=Util_Data_String_Split((gw_s8*)p,',',(gw_s8 **)strs,18);
    if(out_size != 18){
      Svc_Log_Printf(LOG_ERROR,"%s->PHY string split fail!",__FUNCTION__);
      return -1;
    }
    out_datasize = Util_Data_String_Split((gw_s8*)strs[4],':',(gw_s8 **)strdata,2);
    if(out_datasize != 2){
      Svc_Log_Printf(LOG_ERROR,"%s->Band string split fail!",__FUNCTION__);
      return -1;
    }
    ps_cloud_data->u8Band=(gw_s16)atol((const char *)strdata[1]);
    memset(strdata,0,sizeof(strdata));
   
    out_datasize = Util_Data_String_Split((gw_s8*)strs[5],':',(gw_s8 **)strdata,2);
    if(out_datasize != 2){
      Svc_Log_Printf(LOG_ERROR,"%s->RSRP string split fail!",__FUNCTION__);
      return -1;
    }
    ps_cloud_data->s16Rsrp=(gw_s16)atol((const char *)strdata[1]);
    memset(strdata,0,sizeof(strdata));
    out_datasize = Util_Data_String_Split((gw_s8*)strs[6],':',(gw_s8 **)strdata,2);
    if(out_datasize != 2){
      Svc_Log_Printf(LOG_ERROR,"%s->RSRQ string split fail!",__FUNCTION__);
      return -1;
    }
    ps_cloud_data->s16Rsrq=(gw_s16)atol((const char *)strdata[1]); 
    memset(strdata,0,sizeof(strdata));    
    out_datasize = Util_Data_String_Split((gw_s8*)strs[7],':',(gw_s8 **)strdata,2);
    if(out_datasize != 2){
      Svc_Log_Printf(LOG_ERROR,"%s->SNR string split fail!",__FUNCTION__);
      return -1;
    }
    ps_cloud_data->s16Snr=(gw_s16)atol((const char *)strdata[1]);
    memset(strdata,0,sizeof(strdata));         
    out_datasize = Util_Data_String_Split((gw_s8*)strs[10],':',(gw_s8 **)strdata,2);
    if(out_datasize != 2){
      Svc_Log_Printf(LOG_ERROR,"%s->CeLevel string split fail!",__FUNCTION__);
      return -1;
    }
    ps_cloud_data->u8CoverLev=(gw_s16)atol((const char *)strdata[1]); 
    if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
    {
        s_factory->u8Flag_RSRP = 1; 
    }
    return 0;     
}
//static gw_s8 Nb_Get_Statusrrc_Ack_Callback(gw_u8* data)
static gw_s8 Nb_Get_Statusrrc_Ack_Callback(void *pData)
{
  at_response_t resp = (at_response_t) pData;
  char *p,*data;
  uint32_t id=0;
  S_Cloud_Data *ps_cloud_data;
  S_Factory_Data *s_factory = Svc_Factory_Get_Data();

  p = at_resp_get_line_by_kw(resp, "+ECSTATUS: RRC"); //查找关键字
  if (p==SR_NULL) {
    SR_LOG_WARN("not find rrc");
    return -1;
  }

  SR_LOG_DEBUG("rrc: %s",p);

  //提取cellid 
  data=strstr((char const*)p,"CellId:");
  if(data==SR_NULL)
  {
    SR_LOG_WARN("not find cellid");
    return -1;
  }


  if(sscanf(data, "CellId:%d\r", &id)!=1)
  {
  SR_LOG_WARN("sscanf cellid error");
  return -1;
  }

  ps_cloud_data=Svc_Cloud_Get_Data();
  ps_cloud_data->u32CellId=id;
  if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
  {
    s_factory->u8Flag_RSRP = 1; 
    Svc_Cloud_Clear_Event(E_Cloud_Event_Upload);
    Svc_Factory_Init();	      
  }    
  return 0;


#if  0
    gw_u8* data = (gw_u8*)pData;
    gw_u8 *p,*p1;
    S_Factory_Data *s_factory = Svc_Factory_Get_Data();
    S_Cloud_Data *ps_cloud_data;
    gw_u8 u8buf[10]; 
    p=(gw_u8*)strstr((char const*)data,", CellId:");
    if(p==NULL){
      Svc_Log_Printf(LOG_WARNING,"%s->not find CellId",__FUNCTION__);
      return -1;
    }
    p=(gw_u8*)(p+strlen(", CellId:"));
    p1=p+1;
    p1=(gw_u8*)strstr((char const*)p1,"\r\n"); 
    if(p1==NULL){
      Svc_Log_Printf(LOG_WARNING,"%s->not find CellId",__FUNCTION__);
      return -1;
    } 
    gw_u8 len=p1-p;
    memcpy(u8buf,p,len);
	  ps_cloud_data=Svc_Cloud_Get_Data();
	  ps_cloud_data->u32CellId=atol((const char *)u8buf);
    if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
    {
        s_factory->u8Flag_RSRP = 1; 
        Svc_Cloud_Clear_Event(E_Cloud_Event_Upload);
        Svc_Factory_Init();	      
    }    
    return 0;
#endif
}

#endif


