/*
 * @Description: NB模块-svc层-nb81指令集子模块
 * @Author: yangsw
 * @Date: 2021-06-04 14:05:58
 * @LastEditTime: 2022-12-13 15:31:02
 * @LastEditors: Lida
 * @Reference: 
 */

#include "svc_mb26_qatcmd.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"

#ifdef MB26S_QUECTEL_MODEL

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


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",               3000,   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,   10,  Nb_Get_Register_State_Ack_Callback },
    {AT_CMD_COAP,         (gw_u8*)"AT+CTM2MSETPM=",                         (gw_u8*)"OK",               8000,   3,  Nb_Coap_Set_Server_Ack_Callback },
    {AT_CMD_COAP_REG,     (gw_u8*)"AT+CTM2MREG\r\n",                        (gw_u8*)"+CTM2M: reg,1",    8000,   3,  Nb_Coap_register_Ack_Callback },
    {AT_CMD_COAP_SEND,    (gw_u8*)"AT+CTM2MSEND=\"",                        (gw_u8*)"+CTM2M",           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=1\r\n",                         (gw_u8*)"OK",               3000,   3,  Nb_Enable_Register_Notice_Ack_Callback },
    {AT_CMD_CSCON_1,      (gw_u8*)"AT+CSCON=1\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,   10,  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:",        3000,   3,  Nb_Get_Iccid_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){
  return 0;
}

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

static gw_s8 Nb_Get_Version_Ack_Callback(gw_u8* data){
  gw_u8 *p,*p1;
  p=(gw_u8*)strstr((char const*)data,"EVB Version: ");
  if(p==NULL){
    Svc_Log_Printf(LOG_WARNING,"%s->not find ver",__FUNCTION__);
    return -1;
  }
//   p=(gw_u8*)(p+strlen("EVB 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;
//   }
//   App_Data_Struct *app_data=App_Main_Get_App_Data_Struct_Addr();
//   if((app_data==NULL)||(app_data->cloud_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->cloud_data->nb_info.comm_model_ver_len=len;
//   memcpy(app_data->cloud_data->nb_info.comm_model_ver,p,len);
  return 0;
}

static gw_s8 Nb_Get_IMEI_Ack_Callback(gw_u8* data){
//   gw_u8 *p,*p1;
//   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;
//   }
//   App_Data_Struct *app_data=App_Main_Get_App_Data_Struct_Addr();
//   if((app_data==NULL)||(app_data->cloud_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->cloud_data->nb_info.comm_model_imei_len=len;
//   for(gw_u8 i=0;i<len;i++){
//     app_data->cloud_data->nb_info.comm_model_imei[i]=Util_Data_String_To_Uint8(p+i,1);
//   }
  //memcpy(app_data->cloud_data->nb_info.comm_model_imei,p,len);
  return 0;
}

static gw_s8 Nb_Get_IMSI_Ack_Callback(gw_u8* data){
  gw_u8 *p,*p1;
  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;
  // }
  // App_Data_Struct *app_data=App_Main_Get_App_Data_Struct_Addr();
  // if((app_data==NULL)||(app_data->cloud_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->cloud_data->nb_info.comm_model_imsi_len=len;
  // for(gw_u8 i=0;i<len;i++){
  //   app_data->cloud_data->nb_info.comm_model_imsi[i]=Util_Data_String_To_Uint8(p+i,1);
  // }
  //memcpy(app_data->cloud_data->nb_info.comm_model_imsi,p,len);
  return 0;
}

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

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


static gw_s8 Nb_Get_Signal_Strength_Ack_Callback(gw_u8* data){
  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;
  // }
  // // App_Data_Struct *app_data=App_Main_Get_App_Data_Struct_Addr();
  // // if((app_data==NULL)||(app_data->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;
  // }
  // app_data->cloud_data->nb_info.rssi=Util_Data_String_To_Uint8(p,len);
  return 0;
}

static gw_s8 Nb_Get_Current_Time_Ack_Callback(gw_u8* data){
  gw_u8 *p,*p1;
  gw_u8 buff[19];
  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);

  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((char*)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((char*)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小时
  //Svc_Cloud_Time_Calibrate(time);
  return 0;
}

static gw_s8 Nb_Coap_Send_Ack_Callback(gw_u8* data){
  Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND);
  // Svc_Cloud_Clear_Event(CLOUD_EVENT_RSP);
  return 0;
}

static gw_s8 Nb_At_Callback(gw_u8* data){
  return 0;
}

static gw_s8 Nb_Coap_Set_Server_Ack_Callback(gw_u8* data){
  return 0;
}

static gw_s8 Nb_Band_Query_Ack_Callback(gw_u8* data){
  return 0;
}

static gw_s8 Nb_Coap_register_Ack_Callback(gw_u8* data){
  return 0;
}

static gw_s8 Nb_Coap_Recv_Callback(gw_u8* data){
  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){
    p=(gw_u8*)(p+strlen("+CTM2MRECV: "));
    //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_u16 data_len=strlen((char const*)data)-strlen("+CTM2MRECV: ")-4;    //需要减掉末尾的\r\n\r\n
    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;
}

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

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,",38400\r\n");
  send_len=send_len+strlen(",38400\r\n");
  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){
  return 0;
}



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


/**
 * @brief: 附着网络回调
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
static gw_s8 Nb_Attach_Net_Ack_Callback(gw_u8* data){
  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){
  return 0;
}

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

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


/**
 * @brief: 查询ICCID
 * @return {gw_s8} 执行结果
 * @note: 
 * @see: 
 * @param {gw_u8} *data 待解析数据
 */
static gw_s8 Nb_Get_Iccid_Ack_Callback(gw_u8* data){
  return 0;
}



#endif


