SIM 900

Telecom em geral

Moderadores: andre_luis, 51

SIM 900

Mensagempor j.silvestre » 23 Mar 2011 10:13

Olá

vou começar a trabalhar com o SIM 900, no momento estou lendo os manuais , e os posts sobre o SIM300, que diga- se de passagem é bem parecido com o SIM900. de cara já surgiu uma duvida.

Como eu faço para enviar dados para o SIM900, partindo do principio de que le já esta conectado via gprs TCP/IP e estou recendo dados na porta
8051, por exemplo.

quando o SIM900 se conecta ele adquire um endereço IP para ele ?

se eu tiver dois sim900 enviando dados para a porta 8051, teria como diferenciar os dados recebidos de cada um, (sem ter que fazer protocolo de
envio que identifique cada um).

sds

j.silvestre
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor HC908 » 24 Mar 2011 10:42

ai esta um biblioteca q uso para comunicacao com sim900D


[code]
#define OPERADORA_APN "generica.claro.com.br"
#define OPERADORA_LOGIN "claro"
#define OPERADORA_SENHA "claro"

#define IP_SERVIDOR "200.249.205.171"
#define PORTA_SERVIDOR "8003"

#define DNS01 "200.244.166.065"
#define DNS02 "200.244.166.065"

#define CTS_MODEM PIN_D6
#define RTS_MODEM PIN_D7
#define ON_OFF PIN_B4

#define POWER_KEY PIN_C5

#define VCH_PIN PIN_A1

#define DataRdyUSART() kbhit()
#define putcUSART2(x) putUSART2(x)

#define TAM_BUFFER_SERIAL 180

#define FREE 0x00u
#define BUSY 0x02u
#define LF 0x0A
#define CR 0x0D
#define MODO_CMD 0x00
#define MODO_DATA 0x01
/***********************************************************************
* --------------------Declaracao variaveis globais--------------------
**********************************************************************/
#byte RCREG=0x0FAE
#byte RCSTA=0x0FAB
#bit OERR=0x0FAB.1
#bit RCIF=0x0F9E.5
#bit CSRC=0xFAC.7


boolean flg_modem_inicializado=FALSE;
boolean flg_rcv_ligacao=FALSE;
u8 status_msg_enviada_servidor=FALSE;

volatile u8 tick_status_ligacao=0;
//volatile u8 tick_send_msg=0;
volatile u8 tick_cmd_timeout=0x00;
volatile u8 tick_conexao_timeout=0x00;
volatile int16 tick_watchdog_gprs=0;
u8 state_modem;//=-1;


u8 count_erro=0;
u8 state_rcv_rda=0;
char *dptr='\0';
u8 *dptr_sms='\0';
u8 flg_conectar_servidor=TRUE;

//*********DEFINICAO DOS STATUS DOS LED APP e GSM**************//
#define STATUS_APP_CONECTADO 0b1000000000000000
#define STATUS_APP_DESCONECTADO 0b0000000000000000

#define STATUS_APP_MODEM 0b1000000000000000
#define STATUS_APP_MODEM_INICIADO 0b1010000000000000


#define STATUS_GSM_CONECTADO 0b10101010
#define STATUS_GSM_DESCONECTADO 0b00001111

int16 status_led_conexao=STATUS_APP_DESCONECTADO;
int16 status_led_app = STATUS_APP_MODEM;
int16 status_led_gsm=STATUS_GSM_DESCONECTADO;

typedef struct Tserial
{
u8 buffer_rx[TAM_BUFFER_SERIAL];
u8 dptr;
bool rcv_cmd;
bool modo;
bool overflow;
bool hold;
}Tserial;
volatile Tserial sSerial;//={" ",0x00,FALSE,MODO_CMD,FALSE,FALSE};


struct Tmodem
{
u8 Id[20];
bool gprs; // cobertura gprs
u8 nivel_sinal; // nivel de sinal gprs
u8 conexao_operadora;
u8 conexao_server; // conecao ativa com o servidor
u8 status_comunicacao;
u8 status;
u8 indice_msg_rcv[3];
u8 numero_remetente[20];
u8 status_ligacao;
u16 nivel_bateria;

}sModem={"00",FALSE,0x00,FALSE,FALSE,FREE};

struct TConfig_Operadora
{
u8 apn[30]; // apn de conexao com a operadora
u8 login[7]; // login de conexao com a operadora
u8 senha[7]; // senha de conexao com a operadora
}sConfig_Operadora={OPERADORA_APN,OPERADORA_LOGIN,OPERADORA_SENHA};

struct TConfig_Server
{
u8 ip_server[30]; // ip de conecao com o servidor
u8 porta_server[5]; // porta de conecao com o servidor
}sConfig_Servidor={IP_SERVIDOR,PORTA_SERVIDOR};

struct TServer_Dns
{
u8 DNS1[16];
u8 DNS2[16];
}sDns={DNS01,DNS02};

/***********************************************************************
* ------------------------ Definicao "Comando AT Modem"--------------------
**********************************************************************/
#define CMD_AT "ATE0\r\0" //"AT+IPR=9600 &w\r\0"
#define CMD_CONFIG_MSG "AT+CMGF=1\r\0"
#define CMD_CONEXAO_SERVER_NAME "AT+CDNSORIP=1\r\0"
#define CMD_CONEXAO_SERVER_IP "AT\r\0"
#define CMD_GPRS_MODO_TRANSPARENTE "AT+CIPMODE=0\r\0"
#define CMD_GPRS_MODO_TRANSPARENTE_CONFIGURACAO "AT+CIPATS=1,1\r\0" //"AT+CIPCCFG=5,2,256,1\r\0"
#define CMD_SEM_FLUXO "ATE0\r" // "AT+IPR=9600\r\0" //"AT&K0\r" // "AT\r" //
#define CMD_VERIFICAR_ANTENA "ATS97\r"
#define CMD_LER_ID_MODEM "AT+CGSN\r\0"
#define CMD_LER_ID_SIMCARD "AT+CIMI\r\0"
#define CMD_CANCELAR_ECHO "AT\r\0" //"ATE0\r\0"
#define CMD_VERIFICAR_VERSAO_MODEM "ATI8\r\0"
#define CMD_VERIFICAR_COBERTURA_GSM "AT+CREG=1\r\0"
#define CMD_NIVEL_SINAL_GPRS "AT+CSQ\r"
#define CMD_STATUS_SIMCARD "AT+CPIN?\r\0"
#define CMD_INSERIR_PIN "AT+CPIN=\0'"
#define CMD_CHAVEAR_MODO_COMANDO "+++\0"
#define CMD_CHAVEAR_MODO_DATA "ATO\r"
#define CMD_ENVIAR_MSG "AT+CMGS=\0"
#define CMD_GANHO_MIC "AT+CMIC=1,15\r\0"
#define CMD_GANHO_SPEAKER "AT+CLVL=100\r\0"
#define CMD_DIGITAR_PIN "AT+CPIN=\"0601\""
#define CMD_MONITORAR_REDE "AT+CREG?\r"
#define CMD_NIVEL_BAT "AT+CBC\r\0"

#define CMD_ATENDER_LIGACAO "ATA\r\0"
#define CMD_DESLIGAR_LIGACAO "ATH\r\0"
#define CMD_SELEC_CANAL01 "AT+CHFA=0\r\0"
#define CMD_SELEC_CANAL02 "AT+CHFA=0\r\0"
#define CMD_CONFIG_GSM "AT+CBAND=\"EGSM_DCS_MODE\"&w\r\0"

#define CMD_LER_MSG "AT+CMGR=\0"
#define CMD_EFETUAR_LIGACAO "ATD\0"
#define CMD_STATUS_LIGACAO "AT+CLCC\r\0"
#define CMD_TAM_FIXO "AT+CIPSEND=\0"
#define CMD_RCV_MAIOR ">\0"
#define CMD_APAGAR_MSG "AT+CMGDA=\"DEL ALL\"\r\0"
/***********************************************************************
* ------------------------ Definicao "Comando GPRS"--------------------
**********************************************************************/
#define CMD_CONECTAR_OPERADORA "AT+CSTT=\"\0"
#define CMD_WAIT_CONEXAO_OPERADORA "AT+CIICR\r\0"
#define CMD_PING "AT+MIPPING=\0"
#define CMD_CONECTAR_SERVER "AT+CIPSTART=\"TCP\",\0"
#define CMD_SOLICITAR_IP "AT+CIFSR\r\0" //at+cifsr

#define CMD_ENVIAR_DADOS_BUFFER "at+cipsend\r\0"
#define CMD_ENVIAR_DADOS_SERVER "AT+MIPPUSH=1\r\0"
#define CMD_FECHAR_CONEXAO_SERVER "AT+MIPCLOSE=1\0"
#define CMD_FECHAR_CONEXAO_OPERADORA "AT+CIPSHUT\r\0"
#define CMD_CLOSED_SOCKET "AT+CIPCLOSE\r\0"
#define CMD_RESET_CONEXAO "AT+CGATT=0\r\0"
#define CMD_PORTA_SOURCE "3000"
#define CMD_CONFIG_SERVER_DNS "AT+CDNSCFG=\0"
#define CMD_SOLICITACAO_CREDITO_TIM "SAL\r"
/***********************************************************************
----------------------- Definicao "Comando AT Recebido"---------------
**********************************************************************/
#define CMD_RCV_OK "OK\0"
#define CMD_RCV_MONITORAR_REDE_RES "+CREG\0"
#define CMD_RCV_VERSAO_MODEM "G\0"
#define CMD_RCV_ERRO "ERRO\0"
#define CMD_RCV_CONFIRMACAO_CONEXAO_OPERADORA "AT+CSTT=\"\0"
#define CMD_RCV_CONFIRMACAO_CONEXAO_SERVER "+MIPOPEN:"
#define CMD_RCV_CONFIRMACAO_DADOS ">\0"
#define CMD_RCV_DADOS_SERVER "#\0"
#define CMD_RCV_ERRO_CONEXAO "+MIPSTAT:\0"
#define CMD_RCV_ID_MODEM "3\0"
#define CMD_RCV_ID_SIMCARD "+CIMI\0"
#define CMD_RCV_CPIN_READY "+CPIN: READY\0"
#define CMD_RCV_CPIN_COM_PIN "+CPIN: SIM PIN\0"
#define CMD_RCV_COBERTURA_GPRS "+CGPRS:"
#define CMD_RCV_NIVEL_SINAL "+CSQ:"
#define CMD_RCV_CONFIRMACAO_MSG_ENVIADA "SEND OK\0"
#define CMD_RCV_ERRO_MSG_ENVIADA "SEND FAIL\0"
#define CMD_RCV_CONFIRMACAO_MSG_APAGADA "+MIPFLUSH\0"
#define CMD_RCV_SHUT "SHUT OK\0"
#define CMD_RCV_CLOSED "CLOSED\0"
#define CMD_RCV_CONNECT "CONNECT OK\0"
#define CMD_RCV_NOCARRIR "NO CARRIER\0"
#define CMD_RCV_NO_CARRIER "NO CARRIER\0"
#define CMD_RCV_STATUS_LIGACAO "+CLCC:\0"
#define CMD_RCV_LIGACAO "RING\0"
#define CMD_RCV_LER_MSG "+CMGR:\0"
#define CMD_RCV_MSG "+CMTI: \"SM\",\0"
#define CMD_RCV_CONFIRMACAO_MSG "+CMGS:\0"
#define CMD_RCV_CMS_ERRO "+CME ERROR:\0"
#define CMD_RCV_BUSY "BUSY\0"
#define CMD_RCV_SALDO "R$\0"
#define CMD_RCV_NIVEL_BAT "+CBC:\0"
enum SM_LIGACAO
{
LIGA_DESLIGA,
ATENDE_E_DESLIGA,
MODO_LIGA_DESLIGA
};

enum ENUM_STATE_MODEM
{
SM_MOD_SEM_FLU=6,
SM_MOD_MONITORAR_REDE,
SM_MOD_MONITORAR_REDE_RES,
SM_MOD_ATENDER_LIGACAO,
SM_MOD_ATENDER_LIGACAO_RES,
SM_MOD_ENVIAR_SMS,
SM_MOD_VOLUME_SPEAKER,
SM_MOD_VOLUME_SPEAKER_RES,
SM_MOD_VOLUME_MIC,
SM_MOD_VOLUME_MIC_RES,
SM_MOD_ENVIAR_SMS_RES,
SM_MOD_ENVIAR_SMS_RES2,
SM_MOD_OFF,
SM_MOD_ON,
SM_MOD_NIVEL_BAT,
SM_MOD_NIVEL_BAT_RES,
SM_MODO_SWITCH_DATA,
SM_MODO_SWITCH_DATA_RES,
SM_MOD_CONFIG_MSG,
SM_MOD_CONFIG_MSG_RES,
SM_MOD_EFETUAR_LIGACAO,
SM_MOD_EFETUAR_LIGACAO_RES,
SM_MOD_WAIT_ON,
SM_MOD_ESTABILIZAR,
SM_MOD_SEM_FLU_RES,
SM_MOD_SEM_ECH,
SM_MOD_SEM_ECH_RES,
SM_MOD_ID_MODEM,
SM_MOD_ID_MODEM_RES,
SM_MOD_SIM_CAR,
SM_MOD_SIM_CAR_RES,
SM_MOD_SIM_ID_CAR,
SM_MOD_SIM_ID_CAR_RES,
SM_MOD_NIVEL,
SM_MOD_NIVEL_RES,
SM_MOD_COBERT_GPRS,
SM_MOD_COBERT_GPRS_RES,
SM_MOD_ADQ_IP,
SM_MOD_ADQ_IP_RES,
SM_MOD_WAIT_IP,
SM_MOD_WAIT_IP_RES,
SM_MOD_SOQ_ABE,
SM_MOD_SOQ_ABE_RES,
SM_MOD_LER_MSG_RES,
SM_MOD_LER_MSG,
SM_MOD_WAIT_CONNECT_SERVER,
SM_MOD_ENV_DAD_RES2,
SM_MOD_WAIT_DATA_SERVER,
SM_MOD_CLOSED_OPERADORA,
SM_MOD_CLOSED_OPERADORA_RES,
SM_MOD_CLOSED_SOQUET,
SM_MOD_CLOSED_SOQUET_RES,
SM_MOD_CLA_GPR,
SM_MOD_WAIT_OPERADORA,
SM_MOD_WAIT_OPERADORA_RES,
SM_MOD_CLA_GPR_RES,
SM_MOD_QUA_SER,
SM_MOD_QUA_SER_RES,
SM_MOD_QUA_SER_1,
SM_MOD_QUA_SER_1_RES,
SM_MOD_APAGAR_BUFFER_SOCKET,
SM_MOD_APAGAR_BUFFER_SOCKET_RES,
SM_MOD_LIN_GPR,
SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO,
SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES,
SM_MOD_GPRS_TRANSPARENTE,
SM_MOD_GPRS_TRANSPARENTE_RES,
SM_MOD_LIN_GPR_RES,
SM_MOD_TEM_IP,
SM_MOD_TEM_IP_RES,
SM_MOD_ABR_SOQ,
SM_MOD_ABR_SOQ_RES,
SM_MOD_ENV_DAD,
SM_MOD_ENV_DAD_RES,
SM_MOD_FLU_DAD,
SM_MOD_FLU_DAD_RES,
SM_MOD_FEC_SOQ,
SM_MOD_FEC_SOQ_RES,
SM_MOD_FEC_LIN,
SM_MOD_FEC_LIN_RES,
SM_MOD_REI_PRO,
SM_MOD_REI_PRO_RES,
SM_MOD_SOQ_ABE1,
SM_MOD_SOQ_ABE1_RES,
SM_MOD_MIP_SET,
SM_MOD_MIP_SET_RES,
SM_MOD_ATD,
SM_MOD_ATD_RES,
SM_MOD_SWITCH_CMD,
SM_MOD_SWITCH_CMD_RES,
SM_MOD_CONFIG_AUDIO,
SM_MOD_CONFIG_AUDIO_RES,
SM_MOD_DISCAR_NUMERO,
SM_MOD_DISCAR_NUMERO_RES,
SM_MOD_MONITORAR_LIGACAO,
SM_MOD_CONFIG_BAND_GSM,
SM_MOD_CONFIG_BAND_GSM_RES,
SM_MOD_RETIRAR_PIN,
SM_MOD_RETIRAR_PIN_RES,
SM_MOD_LIGAR_PARA_PANICO_ALARME,
SM_MOD_LIGAR_PARA_PANICO_ALARME_AGUARDAR


};

enum CMD_RCV
{
RCV_MAIOR,
RCV_INVALID,
RCV_LIGACAO,
RCV_OK,
RCV_ERRO,
RCV_SHUT,
RCV_ID_MODEM,
RCV_NOT_MSG,
RCV_ID_SIMCARD,
RCV_CPIN_READY,
RCV_CONNECT,
RCV_CMD_INVALID,
RCV_CLOSED,
RCV_VERSAO_MODEM,
RCV_COBERTURA_GPRS,
RCV_NIVEL_SINAL,
RCV_CONFIRMACAO_CONEXAO_OPERADORA,
RCV_CONFIRMACAO_CONEXAO_SERVER,
RCV_ERRO_CONEXAO,
RCV_DADOS_SERVER,
RCV_CONFIRMACAO_DADOS,
RCV_CONFIRMACAO_MSG_ENVIADA,
RCV_CONFIRMACAO_MSG_APAGADA,
RCV_STATUS_LIGACAO,
RCV_NO_CARRIER,
RCV_ERRO_MSG_ENVIADA,
RCV_MSG,
RCV_LER_NIVEL_BAT,
RCV_LER_MSG,
RCV_CONFIRMACAO_MSG,
RCV_CMS_ERRO,
RCV_BUSY,
RCV_NIVEL_BAT,
RCV_CPIN_COM_PIN,
RCV_MONITORAR_REDE_RES
};
/***********************************************************************
-------------- Definicao "Declaracao Prototipo fun‡”es"---------------
**********************************************************************/
void isr_modem(void);
void reset_serial(void);
u8 g20_comunicacao(void);
void sim340_enviar_cmd_conexao_server(struct TConfig_Server *ptr);
void sim340_enviar_cmd_conexao_operadora(struct TConfig_Operadora *ptr);
u8 sim340_enviar_msg(u8 *numero,u8 *msg,bool modo);//enviar uma msg sms.
u8 sim340_realiza_ligacao(char *numero);// realiza uma liga‡„o.
void sim340_ler_msg(u8 *indice_msg);
u8 sim340_rcv_modem(void);


void Modem_efetuar_ligacao(u8* numero01,u8 modo);
u8 Modem_rcv_ligacao(u8* numero);
u8 Modem_status(void);
void Modem_enviar_sms(u8* numero, u8* msg);
u8* Modem_ler_msg_sms(u8* numero);
void Modem_ler_msg_sms_flush(void);
u8 Modem_enviar_smsOk(void);
void ModemInit(void);
u8 Modem_inicializado(void);
u8 ModemIniciado(void);
u8 ModemConnected(void);
void ModemTcpDisconnect(void);
void ModemTcpPuts(u8*dptr ,u8 lentgh);
bool ModemTcpPutsOk(void);
void ModemTcpFlush(void);
u8* ModemTcpGets(void);
void ModemTask(void);

u8* strcmpmodem(u8 *s1,u8 *s2);
u8 flg_msg_sms_enviada=FREE;
boolean flg_clcc=TRUE;



u8* strcmpmodem(u8 *s1,u8 *s2)
{
u8 s3=NULL;

s3=*s1++;
while(s3)
{
if(s3!=(u8)*s2++)return NULL;
s3=(u8)*s1++;
}
return (u8*)s2;
}

u8* strcmpmodem2(u8 *s1,u8 *s2)
{
u8 count=0;

while(*s2)
{
if(s1[count]!='\0')
{
if(s1[count]==*s2)
count++;
else
count=0;
}else
{
return s2;
}
s2++;
}
return NULL;
}

u8* dptr_copy_rom_ram=0;
void CopyRamForRom(u8 s2)
{
*dptr_copy_rom_ram = s2;
dptr_copy_rom_ram++;
}


void putsUSART(char* s1)
{
while(*s1)putc(*s1++);
}

void putrsUSART(char s1)
{
putc(s1);
}
#define putcUSART(x) putc(x)


u8 cmd_send=FALSE;

void isr_modem(void)
{
volatile u8 data_rcv=0;
if(RCSTA!=0x90)
{
RCSTA=0;
RCSTA=0b10010000;
return;
}

while(DataRdyUSART())
{
data_rcv=getch();
if(data_rcv=='#'){sSerial.rcv_cmd=FALSE;sSerial.dptr=0;state_rcv_rda=2;sSerial.hold=FALSE;sSerial.overflow=FALSE;}//sSerial.modo=MODO_DATA;}
if(data_rcv=='>'){sSerial.dptr=0;state_rcv_rda=2;sSerial.buffer_rx[sSerial.dptr++]=data_rcv;sSerial.rcv_cmd=TRUE;}
if(sSerial.modo==MODO_CMD)
{
if(sSerial.hold==(bool)FALSE)
{

if(sSerial.overflow==(bool)FALSE)
{
switch(state_rcv_rda)
{
case 0: if(data_rcv==(u8)LF)
{
state_rcv_rda++;
}break;
case 1: if(data_rcv==(u8)CR || data_rcv==(u8)LF)
{
state_rcv_rda=0;
}
else {
state_rcv_rda++;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
if(data_rcv=='>')sSerial.rcv_cmd=TRUE;
}
break;
case 2: if(data_rcv==(u8)CR || data_rcv=='*')
{
sSerial.rcv_cmd=TRUE;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
sSerial.buffer_rx[sSerial.dptr]='\0';
//sSerial.hold=TRUE;
}else
{
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
if(sSerial.dptr==(u8)TAM_BUFFER_SERIAL-1)
{
sSerial.overflow=TRUE;
state_rcv_rda=0;
sSerial.dptr=0;
}
sSerial.buffer_rx[sSerial.dptr]='\0';
}
break;
}
}
}
}else
{
if(data_rcv==CR || data_rcv=='*')
{
sSerial.rcv_cmd=TRUE;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
sSerial.buffer_rx[sSerial.dptr]='\0';
sSerial.dptr=0;
sSerial.hold=TRUE;
sSerial.modo=MODO_CMD;
}else
{
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
}
}
}

}


void reset_serial(void)
{
sSerial.dptr=0;
sSerial.rcv_cmd=FALSE;
state_rcv_rda=0;
sSerial.overflow=FALSE;
sSerial.hold=FALSE;
sSerial.modo=MODO_CMD;
if(RCSTA!=0x90)
{
RCSTA=0;
RCSTA=0b10010000;
return;
}
memset(sSerial.buffer_rx, 0x00, sizeof(sSerial.buffer_rx));



}

u8 g20_comunicacao(void)
{
return FREE;
/// if(!input(CTS_MODEM))return FREE;
// else return BUSY;
}

char* strcatpgm2ram(char* s1,char * s2)
{
char s3;

s3=*s2;
while(s3)
{
s3=*s2++;
*s1++=s3;
s3=*s2;
}
*s1='\0';
return s1;
}

u8* numero_01='\0';
u8* msg_sms='\0';

u8 modo_ligacao=0;
u8 back_state_modem=0;
u8 next_state_modem=0;

void Modem_efetuar_ligacao(u8* numero01,u8 modo)
{
if(Modem_inicializado()==TRUE && Modem_status()==FREE)
{
if(numero01!=NULL)
{
numero_01=numero01;
modo_ligacao=modo;
sModem.status_comunicacao=MODO_CMD;
back_state_modem=state_modem;
state_modem=SM_MOD_CONFIG_AUDIO;
next_state_modem=SM_MOD_DISCAR_NUMERO;
}
}
}

u8 Modem_rcv_ligacao(u8* numero)
{
u8 x=0;
if(flg_rcv_ligacao==TRUE)
{
while(sModem.numero_remetente[x])
{
*numero++=sModem.numero_remetente[x++];
}
*numero='\0';

}
return flg_rcv_ligacao;
}

void Modem_atender_ligacao(void)
{
putrsUSART(CMD_ATENDER_LIGACAO);
}
void ModemTcpPutsFlush(void)
{

}
u8 ModemNivelBateria(void)
{
return sModem.nivel_bateria;
}

void ModemStartLeituraBateria(void)
{
if(sModem.status==FREE)
{
back_state_modem = state_modem;
state_modem = SM_MOD_NIVEL_BAT;
}
}
char* strcatram(char *s1, char *s2)
{
while(*s2)*s1++=*s2++;
*s1='\0';
return s1;
}

u8* Modem_ler_msg_sms(u8* numero)
{
if(dptr_sms!=NULL)
{
strcpy(numero,sModem.numero_remetente);
return dptr_sms;
}else return '\0';
}
void Modem_ler_msg_sms_flush(void)
{
dptr_sms='\0';
sSerial.hold=FALSE;
SModem.status=FREE;
reset_serial();
}

u8 Modem_inicializado(void)
{
return flg_modem_inicializado;
}

volatile u8 tick_cmd_msg=0;
void Modem_enviar_sms(u8* numero,u8 *msg)
{

if(Modem_inicializado()==TRUE && Modem_status()==FREE)
{
back_state_modem=state_modem;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_ENVIAR_SMS;
numero_01=numero;
msg_sms=msg;
}

}
u8 modem_enviar_smsOk(void)
{
return flg_msg_sms_enviada;
}

void sim340_enviar_cmd_conexao_server(struct TConfig_Server *ptr)
{
u8 buffer_compare[50];
u8 *dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONECTAR_SERVER);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
*dptr++='"';
dptr=strcatram(dptr,ptr->ip_server);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->porta_server);
*dptr++='"';
*dptr++=0x0D;
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}

void sim340_enviar_cmd_conexao_operadora(struct TConfig_Operadora *ptr)
{
u8 buffer_compare[50];
u8* dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONECTAR_OPERADORA);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
dptr=strcatram(dptr,ptr->apn);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->login);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->senha);
*dptr++='"';
*dptr++=0x0D;
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}

void sim340_ler_msg(u8 *indice_msg)
{
u8 x=0;
sModem.status=busy;
putrsUSART(CMD_LER_MSG);
while(*indice_msg>='0' && *indice_msg<='9')
{
sModem.indice_msg_rcv[x++]=*indice_msg;
putc(*indice_msg++);
}
sModem.indice_msg_rcv[x]='\0';
reset_serial();
putc(0x0D);

}
#define RAM 0
#define ROM 1
#define MSG00 "CMD RCV - BLOQUEIO ATIVADO\0"
#define MSG01 "CMD RCV - BLOQUEIO DESATIVADO\0"
#define MSG02 "CMD RECEBIDO OK\0"
//#define MSG03 "CMD RCV - SIR DESAT"//SIRENE DESATIVADA\0"
//#define MSG04 "CMD RCV - PISCA ATIVADO\0"
//#define MSG05 "CMD RCV - PISCA DESATIVADO\0"
//#define MSG08 "CMD_RCV - AGUARDE AS LOCALIZACOES GEOGRAFICA NO SEU CELULAR\0";

#define MSG06 "PANICO\0"
//#define MSG09 "CMD RCV - NUMERO CADASTRADO COM SUCESSO\0"
#define MSG10 "ALERTA\0"

#define MSG11 "SAL\0"
u8 tick_timeout_cmd=0;
u8 sim340_enviar_msg(u8 *numero,u8 *msg,bool modo)
{
u8 result=0xFF;

reset_serial();
putrsUSART(CMD_ENVIAR_MSG);
while(*numero)putc(*numero++);
putc(0x0D);
reset_serial();
tick_timeout_cmd=0x00;
while(result!=RCV_MAIOR)
{
if(tick_timeout_cmd>10)return RCV_ERRO;
result=sim340_rcv_modem();
if(result==RCV_ERRO)return RCV_ERRO;
}
if(modo==ROM)
{
switch(msg)
{
case 0: putrsUSART(MSG00);
break;
case 1: putrsUSART(MSG01);
break;
case 2: putrsUSART(MSG02);
break;
case 6: putrsUSART(MSG06);
break;
case 10:putrsUSART(MSG10);
break;
case 11:putrsUSART(MSG11);
break;

}
}else
{
while(*msg)putc(*msg++);
}
putc(0x1A);
result=RCV_INVALID;
tick_timeout_cmd=0x00;
while(result!=RCV_OK)
{
if(tick_timeout_cmd>10)return RCV_ERRO;
if(result!=RCV_INVALID)return RCV_ERRO;
result=sim340_rcv_modem();
}
return RCV_OK;
}

void sim340_config_serverdns(void)
{
u8 buffer_compare[50];
u8 *dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONFIG_SERVER_DNS);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
*dptr++='"';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(sDNS.DNS1);
*dptr_copy_rom_ram='\0';
dptr=strcatram(dptr,buffer_compare);
*dptr++='"';
*dptr++='\r';
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}


void ModemDesconectarServidor(void)
{
if(sModem.conexao_server==TRUE)
{
state_modem=SM_MOD_CLOSED_SOQUET;
sModem.conexao_server=FALSE;
}
flg_conectar_servidor=FALSE;
}


void ModemConectarServidor(void)
{
flg_conectar_servidor=TRUE;
}

u8 Modem_status(void)
{
return sModem.status;
}
extern void AppDiscarPanicoAlarme(void);

u8 buffer_compare[30];
int1 flg_chamada=FALSE;
void ModemEventoSerial(void)
{
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CLOSED);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
state_modem=SM_MOD_ABR_SOQ;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_LIGACAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem2(buffer_compare,sSerial.buffer_rx)!=NULL)
{
if(flg_chamada==FALSE)
{
flg_chamada=TRUE;
back_state_modem=state_modem;
next_state_modem=SM_MOD_ATENDER_LIGACAO;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_CONFIG_AUDIO;
}
sModem.status=FREE;
reset_serial();
return;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem2(buffer_compare,sSerial.buffer_rx)!=NULL)
{
delay_ms(200);
sModem.status=BUSY;
back_state_modem=state_modem;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_LER_MSG;
}

}

u8 sim340_realiza_ligacao(char *numero)
{
u8 result=0xFF,x=0;


putrsUSART(CMD_EFETUAR_LIGACAO);
while(numero[x])
{
result=numero[x++];
if(result!='"')putc(result);
}
putc(';');
putc(0x0D);
reset_serial();
tick_timeout_cmd=0x00;
result=RCV_NOT_MSG;
while(result!=RCV_OK)
{
if(tick_timeout_cmd>40)return RCV_ERRO;
if(result!=RCV_NOT_MSG)return RCV_ERRO;
result=sim340_rcv_modem();
}
return RCV_OK;
}

u8 sim340_rcv_modem(void)
{


if(sSerial.rcv_cmd==(u8)TRUE)
{
ModemEventoSerial();
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_LER_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return (u8)RCV_LER_MSG;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MONITORAR_REDE_RES);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
return (u8)RCV_MONITORAR_REDE_RES;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_BUSY);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return (u8)RCV_BUSY;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CPIN_COM_PIN);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return (u8)RCV_CPIN_COM_PIN;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CMS_ERRO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CMS_ERRO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_MSG;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ERRO_MSG_ENVIADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO_MSG_ENVIADA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_STATUS_LIGACAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_STATUS_LIGACAO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NO_CARRIER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_NO_CARRIER;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_OK);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_OK;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONNECT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONNECT;

}


dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_SHUT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_SHUT;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ERRO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ID_MODEM);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{

return RCV_ID_MODEM;

}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_VERSAO_MODEM);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_VERSAO_MODEM;

}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MAIOR);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_MAIOR;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CPIN_READY);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CPIN_READY;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_COBERTURA_GPRS);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_COBERTURA_GPRS;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NIVEL_SINAL);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_NIVEL_SINAL;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(RCV_ERRO_CONEXAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO_CONEXAO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_DADOS_SERVER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_DADOS_SERVER;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_CONEXAO_OPERADORA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_CONEXAO_OPERADORA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_DADOS);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_DADOS;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG_APAGADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_MSG_APAGADA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG_ENVIADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_CONFIRMACAO_MSG_ENVIADA;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NIVEL_BAT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_NIVEL_BAT;
}



dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_CONEXAO_SERVER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_CONEXAO_SERVER;
}else{
reset_serial();
return RCV_CMD_INVALID;
}
}
return RCV_NOT_MSG;
}

void ModemInit(void)
{
state_modem=SM_MOD_OFF;
ModemTcpFlush();
}

u8 ModemTcpOpen(void)
{
if(flg_modem_inicializado==(u8)TRUE)
{
state_modem=SM_MOD_ADQ_IP;

}else return RCV_ERRO;
}

u8 ModemConnected(void)
{
if(sModem.conexao_server==(u8)TRUE)
{
return TRUE;
}else
{
return ERRO;
}
}

void ModemTcpDisconnect(void)
{
state_modem=23;
}
void ModemTcpFlush(void)
{
sModem.status=FREE;
dptr=NULL;
sSerial.hold=FALSE;
reset_serial();
}
u8* ModemTcpGets(void)
{
return ((u8*)dptr);
}

char *dptr_send='\0';
char length_msg=0;

void ModemTcpPuts(u8*dptr ,u8 lentgh)
{

status_msg_enviada_servidor=BUSY;
dptr_send=dptr;
length_msg=lentgh;
reset_serial();
putrsUSART(CMD_TAM_FIXO);
printf("%u\r",lentgh);
back_state_modem= SM_MOD_WAIT_DATA_SERVER;
state_modem=SM_MOD_ENV_DAD;
tick_cmd_timeout=0;

}
void ModemLigarAlarmePanico(void)
{
back_state_modem = state_modem;
state_modem=SM_MOD_LIGAR_PARA_PANICO_ALARME;
}

void ModemBackLigarAlarmePanico(void)
{
state_modem=back_state_modem;
}
boolean ModemTcpPutsOk(void)
{

return (status_msg_enviada_servidor);
}
#define TEMPO_LIGACAO_LIMITE 1800
int16 tick_tempo_ligacao=0;


void ModemWatchDogGprs(void)
{

if(tick_watchdog_gprs>=900)
{
count_erro=0x00;
tick_watchdog_gprs=0x00;
reset_serial();
state_modem=SM_MOD_OFF;
}

}
u8* ModuloGetId(void)
{
return (u8*)sModem.ID;
}

u8 ModemCarregador(void)
{
return input(VCH_PIN);
}
u8 ModemRssi(void)
{
return sModem.nivel_sinal;
}
void ModemTask(void)
{
u8 result=0,x=0,*ptr_aux;
static boolean flg_erro=FALSE;
static u8 count_ligacao=0;




if(count_erro>=10)
{
count_erro=0x00;
tick_watchdog_gprs=0x00;
state_modem=SM_MOD_OFF;
}

ModemEventoSerial();
switch(state_modem)
{
case SM_MOD_OFF:
status_led_app = STATUS_APP_MODEM;
flg_modem_inicializado=FALSE;
sModem.status=BUSY;
count_erro=0x00;
tick_watchdog_gprs=0x00;
status_led_conexao=STATUS_APP_DESCONECTADO;
status_led_gsm=STATUS_GSM_DESCONECTADO;
sModem.conexao_server=FALSE;
output_high(ON_OFF);
input(POWER_KEY);
state_modem=SM_MOD_ON;
tick_cmd_timeout=0;
break;

/*********LIGANDO O MODEM DEPOIS DE 100ms.*************/
case SM_MOD_ON:
if(tick_cmd_timeout>(u8)5)
{
output_low(ON_OFF);
state_modem=SM_MOD_ESTABILIZAR;
tick_cmd_timeout=0;

}break;
case SM_MOD_ESTABILIZAR:
if(tick_cmd_timeout>(u8)20)
{
output_low(POWER_KEY);
state_modem=SM_MOD_WAIT_ON;
tick_cmd_timeout=0;
}
break;
case SM_MOD_WAIT_ON:
if(tick_cmd_timeout>(u8)5)
{
input(POWER_KEY);
sModem.status=FREE;
state_modem=SM_MOD_SEM_FLU;
putrsUSART(CMD_CHAVEAR_MODO_COMANDO);
tick_cmd_timeout=0;
}break;

/*********RESPONSAVEL PELO CANCELAMENTO DO ECHO DO MODEM*************/
case SM_MOD_SEM_FLU: if(tick_cmd_timeout>(u8)15)
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_AT);
state_modem=SM_MOD_SEM_FLU_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SEM_FLU_RES:if(tick_cmd_timeout>=(u8)1)
{
tick_cmd_timeout=0x00;
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_CONFIG_MSG;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SEM_FLU;
break;
default: count_erro++;state_modem=SM_MOD_WAIT_ON;
}
}break;
case SM_MOD_CONFIG_MSG:
if(Modem_status()==(u8)FREE)
{
reset_serial();
sModem.status=BUSY;
putrsUSART(CMD_CONFIG_MSG);
state_modem=SM_MOD_CONFIG_MSG_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_CONFIG_MSG_RES:
if(tick_cmd_timeout>=(u8)1)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_ID_MODEM;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_MSG;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_MSG;
}
}break;

/*********RESPONSAVEL PELA LEITURA DO ID DO MODEM*************/
case SM_MOD_ID_MODEM: if(g20_comunicacao()==(u8)FREE)
{
reset_serial();
putrsUSART(CMD_LER_ID_MODEM);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ID_MODEM_RES;
}break;

case SM_MOD_ID_MODEM_RES: if(tick_cmd_timeout>(u8)4)
{
SModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_ID_MODEM: sSerial.buffer_rx[15]='\0';
strcpy(ModuloGetId(),&sSerial.buffer_rx[0]);
reset_serial();
count_erro=0x00;
state_modem=SM_MOD_VOLUME_SPEAKER;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_ID_MODEM;
break;
default: count_erro++;state_modem=SM_MOD_ID_MODEM;
}
tick_cmd_timeout=0x00;
}break;

case SM_MOD_VOLUME_SPEAKER:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_GANHO_SPEAKER);
//putrsUSART(CMD_APAGAR_MSG);
state_modem=SM_MOD_VOLUME_SPEAKER_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_VOLUME_SPEAKER_RES:
if(tick_cmd_timeout>=(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_VOLUME_MIC;
break;
case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_MSG;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_MSG;
}
sModem.status=FREE;
} break;

case SM_MOD_VOLUME_MIC:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_GANHO_MIC);
state_modem=SM_MOD_VOLUME_MIC_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_VOLUME_MIC_RES:
if(tick_cmd_timeout>=(u8)2)
{
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_GPRS_TRANSPARENTE;
break;
case RCV_ERRO: count_erro++;
state_modem=SM_MOD_VOLUME_MIC;
break;
default: count_erro++;state_modem=SM_MOD_VOLUME_MIC;
}
sModem.status=FREE;
}break;

case SM_MOD_GPRS_TRANSPARENTE:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_GPRS_MODO_TRANSPARENTE);
state_modem=SM_MOD_GPRS_TRANSPARENTE_RES;
tick_cmd_timeout=0x00;
}break;
case SM_MOD_GPRS_TRANSPARENTE_RES:
if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;
default: count_erro++;state_modem=SM_MOD_SEM_ECH;
}

}break;
case SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_GPRS_MODO_TRANSPARENTE_CONFIGURACAO);
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES:
if(tick_cmd_timeout>=(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;
default: count_erro++;state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
}

}break;

case SM_MOD_SEM_ECH: if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CONEXAO_SERVER_IP);
state_modem=SM_MOD_SEM_ECH_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SEM_ECH_RES:if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SEM_ECH;
break;
default: count_erro++;state_modem=SM_MOD_SEM_ECH;
}
break;
}break;
case SM_MOD_CONFIG_BAND_GSM:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CONFIG_GSM);
state_modem=SM_MOD_CONFIG_BAND_GSM_RES;
tick_cmd_timeout=0x00;
}break;


case SM_MOD_CONFIG_BAND_GSM_RES:
if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_BAND_GSM;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_BAND_GSM;
}
break;
}break;
break;



/*********RESPONSAVEL PELA LEITURA DO STATUS DO SIMCARD*************/
case SM_MOD_SIM_CAR: if(Modem_status()==(u8)FREE)
{


sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_STATUS_SIMCARD);
state_modem=SM_MOD_SIM_CAR_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SIM_CAR_RES: if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_CPIN_READY: count_erro=0x00;
state_modem=SM_MOD_NIVEL_BAT;//;
status_led_app=STATUS_APP_MODEM_INICIADO;
back_state_modem = SM_MOD_NIVEL;
break;
case RCV_CPIN_COM_PIN: count_erro=0x00;
state_modem=SM_MOD_RETIRAR_PIN;
break;
case RCV_CMD_INVALID: count_erro++;
state_modem=SM_MOD_SIM_CAR;
break;
default : count_erro++; state_modem=SM_MOD_SIM_CAR;;
}

}break;


case SM_MOD_RETIRAR_PIN:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_DIGITAR_PIN);
state_modem=SM_MOD_SIM_CAR_RES;
tick_cmd_timeout=0x00;
}break;


case SM_MOD_RETIRAR_PIN_RES:
if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK:
state_modem=SM_MOD_SIM_CAR;
break;


case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SIM_CAR;
break;
default: count_erro++;state_modem=SM_MOD_SIM_CAR;
}
}break;


/*********RESPONSAVEL PELO TRATAMENTO DA CONEXAO COM A OPERADORA*************/
case SM_MOD_NIVEL_BAT:
/*********ENVIA O COMANDO PARA LER O NIVEL DA BATERIA**************/
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_NIVEL_BAT);
state_modem=SM_MOD_NIVEL_BAT_RES;
tick_cmd_timeout=0x00;
}break;


/*********EFETUA O TRATAMENTO DA MSG RECEBIDA*********************/
case SM_MOD_NIVEL_BAT_RES:
switch(sim340_rcv_modem())
{
case RCV_NIVEL_BAT :state_modem=SM_MOD_NIVEL;
sModem.status=FREE;
ptr_aux=find_carac(sSerial.buffer_rx,',',0x02);ptr_aux[2]='\0';
sModem.nivel_bateria=atoi(ptr_aux);
reset_serial();
state_modem=back_state_modem;
break;
}
if(tick_cmd_timeout>(u8)3)
{
SModem.status=FREE;
state_modem=back_state_modem;
}
break;
case SM_MOD_NIVEL:
if(Modem_status()==(u8)FREE)
{
status_led_conexao=STATUS_APP_DESCONECTADO;
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_NIVEL_SINAL_GPRS);
state_modem=SM_MOD_NIVEL_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_NIVEL_RES: if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_NIVEL_SINAL: flg_modem_inicializado=TRUE;
sModem.nivel_sinal=atoi(&sSerial.buffer_rx[6]);
state_modem=SM_MOD_COBERT_GPRS;

count_erro=0x00;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_NIVEL;
break;

default: count_erro++;state_modem=SM_MOD_NIVEL;
}
}
break;

case SM_MOD_COBERT_GPRS:
if(flg_conectar_servidor==TRUE)
{
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
status_led_gsm=STATUS_GSM_DESCONECTADO;
reset_serial();
putrsUSART(CMD_VERIFICAR_COBERTURA_GSM); // enviar para serial a string "AT"
tick_cmd_timeout=0x00;
state_modem=SM_MOD_COBERT_GPRS_RES;
}
}else
{
state_modem=SM_MOD_MONITORAR_REDE;
tick_cmd_timeout=0;
}
break;

case SM_MOD_MONITORAR_REDE:

if(flg_conectar_servidor==TRUE) state_modem=SM_MOD_NIVEL;
if(tick_cmd_timeout>30)
{
reset_serial();
putrsUSART(CMD_MONITORAR_REDE); // enviar para serial a string "AT"
tick_cmd_timeout=0x00;
state_modem=SM_MOD_MONITORAR_REDE_RES;
}
break;

case SM_MOD_MONITORAR_REDE_RES:
switch(sim340_rcv_modem())
{
case RCV_MONITORAR_REDE_RES:
ptr_aux=find_carac(sSerial.buffer_rx,',',0x01);
if(*ptr_aux!='1'){state_modem=SM_MOD_OFF;return;}
else{tick_watchdog_gprs=0; delay_ms(500); reset_serial();tick_watchdog_gprs=0;} // retirar isto depois
count_erro=0;
state_modem=SM_MOD_MONITORAR_REDE;
tick_cmd_timeout=0;
break;
}
if(tick_cmd_timeout>(u8)10)
{
state_modem=SM_MOD_OFF;
}
break;

case SM_MOD_COBERT_GPRS_RES: if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK:
state_modem=SM_MOD_ADQ_IP;
break;


case RCV_ERRO: count_erro++;
state_modem=SM_MOD_COBERT_GPRS;
break;
default: count_erro++;state_modem=SM_MOD_COBERT_GPRS;
}
}break;

case SM_MOD_ADQ_IP: if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
sim340_enviar_cmd_conexao_operadora(&sConfig_Operadora);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ADQ_IP_RES;
}break;

case SM_MOD_ADQ_IP_RES: if(tick_cmd_timeout>(u8)30)
{
count_erro++;
state_modem--;
}
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_OPERADORA;
break;


case RCV_ERRO: sModem.status=FREE;
count_erro++;
sModem.conexao_operadora=FALSE;
state_modem=SM_MOD_CLOSED_OPERADORA;
break;

}break;

case SM_MOD_WAIT_OPERADORA:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
status_led_gsm=STATUS_GSM_CONECTADO;
reset_serial();
putrsUSART(CMD_WAIT_CONEXAO_OPERADORA);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_WAIT_OPERADORA_RES;
}break;

case SM_MOD_WAIT_OPERADORA_RES:
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_IP;
break;

case RCV_ERRO:sModem.status=FREE;
state_modem=SM_MOD_CLOSED_OPERADORA;
break;
}
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
state_modem=SM_MOD_CLOSED_OPERADORA;
}
break;

case SM_MOD_WAIT_IP:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_SOLICITAR_IP);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_WAIT_IP_RES;
}break;

case SM_MOD_WAIT_IP_RES:
switch(sim340_rcv_modem())
{

default:sModem.status=FREE;
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ABR_SOQ;
}
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
state_modem=SM_MOD_CLOSED_SOQUET;
}
break;

/*********RESPONSAVEL PELO TRATAMENTO DA CONEXAO COM O SERVIDOR*************/
case SM_MOD_ABR_SOQ:
if(flg_conectar_servidor==FALSE)
{
state_modem=SM_MOD_CLOSED_OPERADORA;
}
if(tick_cmd_timeout>3)
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
sim340_enviar_cmd_conexao_server(&sConfig_Servidor);
state_modem=SM_MOD_ABR_SOQ_RES;// incrementar para o proximo estado da tarefa.
tick_cmd_timeout=0x00;
}break;

case SM_MOD_ABR_SOQ_RES:
if(tick_cmd_timeout>10)
{
sModem.status=FREE;
sModem.conexao_server=FALSE;
state_modem=SM_MOD_CLOSED_SOQUET;

}
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_CONNECT_SERVER;
count_erro=0x00;
tick_conexao_timeout=0x00;
reset_serial();
break;


case RCV_ERRO_CONEXAO: sModem.status=FREE;
sModem.conexao_server=FALSE;
state_modem=SM_MOD_CLOSED_SOQUET;
break;

case RCV_ERRO: sModem.status=FREE;
sModem.conexao_server=FALSE;
count_erro++;
state_modem=SM_MOD_CLOSED_SOQUET;
break;

}break;

case SM_MOD_WAIT_CONNECT_SERVER:
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
count_erro++;
state_modem=SM_MOD_CLOSED_SOQUET;
}
switch(sim340_rcv_modem())
{
case RCV_CONNECT: sModem.status=FREE;

state_modem=SM_MOD_WAIT_DATA_SERVER;
sModem.conexao_server=TRUE;
sModem.status_comunicacao=MODO_DATA;
break;
}
break;
/*********DISPOSITIVO CONECTADO AO SERVIDOR DE COMUNICA?ZO*************/
case SM_MOD_WAIT_DATA_SERVER:

switch(sim340_rcv_modem())
{
case RCV_ERRO: sModem.conexao_server=FALSE;
sModem.status=FREE;
status_led_conexao=STATUS_APP_DESCONECTADO;
state_modem=SM_MOD_CLOSED_SOQUET;
sModem.status_comunicacao=MODO_CMD;
break;

case RCV_CLOSED: sModem.conexao_server=FALSE;sModem.status=FREE;
sModem.status_comunicacao=MODO_CMD;
status_led_conexao=STATUS_APP_DESCONECTADO;
state_modem=SM_MOD_ABR_SOQ;
break;

case RCV_DADOS_SERVER: sModem.status=BUSY;
tick_watchdog_gprs=0;
dptr=(char*)sSerial.buffer_rx;
break;




}break;
case SM_MOD_CLOSED_OPERADORA:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_FECHAR_CONEXAO_OPERADORA);
state_modem=SM_MOD_CLOSED_OPERADORA_RES;// incrementar para o proximo estado da tarefa.
tick_cmd_timeout=0x00;
}break;

case SM_MOD_CLOSED_OPERADORA_RES:
if(tick_cmd_timeout>(u8)5)
{
state_modem=SM_MOD_NIVEL;
sModem.status=FREE;
}
switch(sim340_rcv_modem())
{
case RCV_SHUT: sModem.status=FREE;
state_modem=SM_MOD_NIVEL;
break;
case RCV_ERRO: sModem.status=FREE;
state_modem=SM_MOD_NIVEL;
break;
}break;

/*******************RESPONSAVEL PELO RESET DO MODEM*********************/
case SM_MOD_CLOSED_SOQUET: if(Modem_status()==(u8)FREE)
{
status_led_conexao=STATUS_APP_DESCONECTADO;
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CLOSED_SOCKET);
state_modem=SM_MOD_CLOSED_SOQUET_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_CLOSED_SOQUET_RES:
if(tick_cmd_timeout>(u8)10)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{

case RCV_CLOSED: state_modem=SM_MOD_ABR_SOQ;
break;
case RCV_ERRO: state_modem=SM_MOD_NIVEL;
break;
default: count_erro++;
state_modem=SM_MOD_NIVEL;
}
}break;


/*******************RESPONSAVEL POR ENVIAR MSG AO SERVIDOR*********************/
case SM_MOD_ENV_DAD: switch(sim340_rcv_modem())
{

case RCV_MAIOR: delay_ms(10);
reset_serial();
while(length_msg!=(u8)0x00)
{
putcUSART(*dptr_send++);
length_msg--;
}

tick_cmd_timeout=0;
state_modem=SM_MOD_
Editado pela última vez por HC908 em 24 Mar 2011 10:44, em um total de 2 vezes.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor HC908 » 24 Mar 2011 10:42

ai esta um biblioteca q uso para comunicacao com sim900D


[code]#define OPERADORA_APN "generica.claro.com.br"
#define OPERADORA_LOGIN "claro"
#define OPERADORA_SENHA "claro"

#define IP_SERVIDOR "210.249.205.171"
#define PORTA_SERVIDOR "8003"

#define DNS01 "200.244.166.065"
#define DNS02 "200.244.166.065"

#define CTS_MODEM PIN_D6
#define RTS_MODEM PIN_D7
#define ON_OFF PIN_B4

#define POWER_KEY PIN_C5

#define VCH_PIN PIN_A1

#define DataRdyUSART() kbhit()
#define putcUSART2(x) putUSART2(x)

#define TAM_BUFFER_SERIAL 180

#define FREE 0x00u
#define BUSY 0x02u
#define LF 0x0A
#define CR 0x0D
#define MODO_CMD 0x00
#define MODO_DATA 0x01
/***********************************************************************
* --------------------Declaracao variaveis globais--------------------
**********************************************************************/
#byte RCREG=0x0FAE
#byte RCSTA=0x0FAB
#bit OERR=0x0FAB.1
#bit RCIF=0x0F9E.5
#bit CSRC=0xFAC.7


boolean flg_modem_inicializado=FALSE;
boolean flg_rcv_ligacao=FALSE;
u8 status_msg_enviada_servidor=FALSE;

volatile u8 tick_status_ligacao=0;
//volatile u8 tick_send_msg=0;
volatile u8 tick_cmd_timeout=0x00;
volatile u8 tick_conexao_timeout=0x00;
volatile int16 tick_watchdog_gprs=0;
u8 state_modem;//=-1;


u8 count_erro=0;
u8 state_rcv_rda=0;
char *dptr='\0';
u8 *dptr_sms='\0';
u8 flg_conectar_servidor=TRUE;

//*********DEFINICAO DOS STATUS DOS LED APP e GSM**************//
#define STATUS_APP_CONECTADO 0b1000000000000000
#define STATUS_APP_DESCONECTADO 0b0000000000000000

#define STATUS_APP_MODEM 0b1000000000000000
#define STATUS_APP_MODEM_INICIADO 0b1010000000000000


#define STATUS_GSM_CONECTADO 0b10101010
#define STATUS_GSM_DESCONECTADO 0b00001111

int16 status_led_conexao=STATUS_APP_DESCONECTADO;
int16 status_led_app = STATUS_APP_MODEM;
int16 status_led_gsm=STATUS_GSM_DESCONECTADO;

typedef struct Tserial
{
u8 buffer_rx[TAM_BUFFER_SERIAL];
u8 dptr;
bool rcv_cmd;
bool modo;
bool overflow;
bool hold;
}Tserial;
volatile Tserial sSerial;//={" ",0x00,FALSE,MODO_CMD,FALSE,FALSE};


struct Tmodem
{
u8 Id[20];
bool gprs; // cobertura gprs
u8 nivel_sinal; // nivel de sinal gprs
u8 conexao_operadora;
u8 conexao_server; // conecao ativa com o servidor
u8 status_comunicacao;
u8 status;
u8 indice_msg_rcv[3];
u8 numero_remetente[20];
u8 status_ligacao;
u16 nivel_bateria;

}sModem={"00",FALSE,0x00,FALSE,FALSE,FREE};

struct TConfig_Operadora
{
u8 apn[30]; // apn de conexao com a operadora
u8 login[7]; // login de conexao com a operadora
u8 senha[7]; // senha de conexao com a operadora
}sConfig_Operadora={OPERADORA_APN,OPERADORA_LOGIN,OPERADORA_SENHA};

struct TConfig_Server
{
u8 ip_server[30]; // ip de conecao com o servidor
u8 porta_server[5]; // porta de conecao com o servidor
}sConfig_Servidor={IP_SERVIDOR,PORTA_SERVIDOR};

struct TServer_Dns
{
u8 DNS1[16];
u8 DNS2[16];
}sDns={DNS01,DNS02};

/***********************************************************************
* ------------------------ Definicao "Comando AT Modem"--------------------
**********************************************************************/
#define CMD_AT "ATE0\r\0" //"AT+IPR=9600 &w\r\0"
#define CMD_CONFIG_MSG "AT+CMGF=1\r\0"
#define CMD_CONEXAO_SERVER_NAME "AT+CDNSORIP=1\r\0"
#define CMD_CONEXAO_SERVER_IP "AT\r\0"
#define CMD_GPRS_MODO_TRANSPARENTE "AT+CIPMODE=0\r\0"
#define CMD_GPRS_MODO_TRANSPARENTE_CONFIGURACAO "AT+CIPATS=1,1\r\0" //"AT+CIPCCFG=5,2,256,1\r\0"
#define CMD_SEM_FLUXO "ATE0\r" // "AT+IPR=9600\r\0" //"AT&K0\r" // "AT\r" //
#define CMD_VERIFICAR_ANTENA "ATS97\r"
#define CMD_LER_ID_MODEM "AT+CGSN\r\0"
#define CMD_LER_ID_SIMCARD "AT+CIMI\r\0"
#define CMD_CANCELAR_ECHO "AT\r\0" //"ATE0\r\0"
#define CMD_VERIFICAR_VERSAO_MODEM "ATI8\r\0"
#define CMD_VERIFICAR_COBERTURA_GSM "AT+CREG=1\r\0"
#define CMD_NIVEL_SINAL_GPRS "AT+CSQ\r"
#define CMD_STATUS_SIMCARD "AT+CPIN?\r\0"
#define CMD_INSERIR_PIN "AT+CPIN=\0'"
#define CMD_CHAVEAR_MODO_COMANDO "+++\0"
#define CMD_CHAVEAR_MODO_DATA "ATO\r"
#define CMD_ENVIAR_MSG "AT+CMGS=\0"
#define CMD_GANHO_MIC "AT+CMIC=1,15\r\0"
#define CMD_GANHO_SPEAKER "AT+CLVL=100\r\0"
#define CMD_DIGITAR_PIN "AT+CPIN=\"0601\""
#define CMD_MONITORAR_REDE "AT+CREG?\r"
#define CMD_NIVEL_BAT "AT+CBC\r\0"

#define CMD_ATENDER_LIGACAO "ATA\r\0"
#define CMD_DESLIGAR_LIGACAO "ATH\r\0"
#define CMD_SELEC_CANAL01 "AT+CHFA=0\r\0"
#define CMD_SELEC_CANAL02 "AT+CHFA=0\r\0"
#define CMD_CONFIG_GSM "AT+CBAND=\"EGSM_DCS_MODE\"&w\r\0"

#define CMD_LER_MSG "AT+CMGR=\0"
#define CMD_EFETUAR_LIGACAO "ATD\0"
#define CMD_STATUS_LIGACAO "AT+CLCC\r\0"
#define CMD_TAM_FIXO "AT+CIPSEND=\0"
#define CMD_RCV_MAIOR ">\0"
#define CMD_APAGAR_MSG "AT+CMGDA=\"DEL ALL\"\r\0"
/***********************************************************************
* ------------------------ Definicao "Comando GPRS"--------------------
**********************************************************************/
#define CMD_CONECTAR_OPERADORA "AT+CSTT=\"\0"
#define CMD_WAIT_CONEXAO_OPERADORA "AT+CIICR\r\0"
#define CMD_PING "AT+MIPPING=\0"
#define CMD_CONECTAR_SERVER "AT+CIPSTART=\"TCP\",\0"
#define CMD_SOLICITAR_IP "AT+CIFSR\r\0" //at+cifsr

#define CMD_ENVIAR_DADOS_BUFFER "at+cipsend\r\0"
#define CMD_ENVIAR_DADOS_SERVER "AT+MIPPUSH=1\r\0"
#define CMD_FECHAR_CONEXAO_SERVER "AT+MIPCLOSE=1\0"
#define CMD_FECHAR_CONEXAO_OPERADORA "AT+CIPSHUT\r\0"
#define CMD_CLOSED_SOCKET "AT+CIPCLOSE\r\0"
#define CMD_RESET_CONEXAO "AT+CGATT=0\r\0"
#define CMD_PORTA_SOURCE "3000"
#define CMD_CONFIG_SERVER_DNS "AT+CDNSCFG=\0"
#define CMD_SOLICITACAO_CREDITO_TIM "SAL\r"
/***********************************************************************
----------------------- Definicao "Comando AT Recebido"---------------
**********************************************************************/
#define CMD_RCV_OK "OK\0"
#define CMD_RCV_MONITORAR_REDE_RES "+CREG\0"
#define CMD_RCV_VERSAO_MODEM "G\0"
#define CMD_RCV_ERRO "ERRO\0"
#define CMD_RCV_CONFIRMACAO_CONEXAO_OPERADORA "AT+CSTT=\"\0"
#define CMD_RCV_CONFIRMACAO_CONEXAO_SERVER "+MIPOPEN:"
#define CMD_RCV_CONFIRMACAO_DADOS ">\0"
#define CMD_RCV_DADOS_SERVER "#\0"
#define CMD_RCV_ERRO_CONEXAO "+MIPSTAT:\0"
#define CMD_RCV_ID_MODEM "3\0"
#define CMD_RCV_ID_SIMCARD "+CIMI\0"
#define CMD_RCV_CPIN_READY "+CPIN: READY\0"
#define CMD_RCV_CPIN_COM_PIN "+CPIN: SIM PIN\0"
#define CMD_RCV_COBERTURA_GPRS "+CGPRS:"
#define CMD_RCV_NIVEL_SINAL "+CSQ:"
#define CMD_RCV_CONFIRMACAO_MSG_ENVIADA "SEND OK\0"
#define CMD_RCV_ERRO_MSG_ENVIADA "SEND FAIL\0"
#define CMD_RCV_CONFIRMACAO_MSG_APAGADA "+MIPFLUSH\0"
#define CMD_RCV_SHUT "SHUT OK\0"
#define CMD_RCV_CLOSED "CLOSED\0"
#define CMD_RCV_CONNECT "CONNECT OK\0"
#define CMD_RCV_NOCARRIR "NO CARRIER\0"
#define CMD_RCV_NO_CARRIER "NO CARRIER\0"
#define CMD_RCV_STATUS_LIGACAO "+CLCC:\0"
#define CMD_RCV_LIGACAO "RING\0"
#define CMD_RCV_LER_MSG "+CMGR:\0"
#define CMD_RCV_MSG "+CMTI: \"SM\",\0"
#define CMD_RCV_CONFIRMACAO_MSG "+CMGS:\0"
#define CMD_RCV_CMS_ERRO "+CME ERROR:\0"
#define CMD_RCV_BUSY "BUSY\0"
#define CMD_RCV_SALDO "R$\0"
#define CMD_RCV_NIVEL_BAT "+CBC:\0"
enum SM_LIGACAO
{
LIGA_DESLIGA,
ATENDE_E_DESLIGA,
MODO_LIGA_DESLIGA
};

enum ENUM_STATE_MODEM
{
SM_MOD_SEM_FLU=6,
SM_MOD_MONITORAR_REDE,
SM_MOD_MONITORAR_REDE_RES,
SM_MOD_ATENDER_LIGACAO,
SM_MOD_ATENDER_LIGACAO_RES,
SM_MOD_ENVIAR_SMS,
SM_MOD_VOLUME_SPEAKER,
SM_MOD_VOLUME_SPEAKER_RES,
SM_MOD_VOLUME_MIC,
SM_MOD_VOLUME_MIC_RES,
SM_MOD_ENVIAR_SMS_RES,
SM_MOD_ENVIAR_SMS_RES2,
SM_MOD_OFF,
SM_MOD_ON,
SM_MOD_NIVEL_BAT,
SM_MOD_NIVEL_BAT_RES,
SM_MODO_SWITCH_DATA,
SM_MODO_SWITCH_DATA_RES,
SM_MOD_CONFIG_MSG,
SM_MOD_CONFIG_MSG_RES,
SM_MOD_EFETUAR_LIGACAO,
SM_MOD_EFETUAR_LIGACAO_RES,
SM_MOD_WAIT_ON,
SM_MOD_ESTABILIZAR,
SM_MOD_SEM_FLU_RES,
SM_MOD_SEM_ECH,
SM_MOD_SEM_ECH_RES,
SM_MOD_ID_MODEM,
SM_MOD_ID_MODEM_RES,
SM_MOD_SIM_CAR,
SM_MOD_SIM_CAR_RES,
SM_MOD_SIM_ID_CAR,
SM_MOD_SIM_ID_CAR_RES,
SM_MOD_NIVEL,
SM_MOD_NIVEL_RES,
SM_MOD_COBERT_GPRS,
SM_MOD_COBERT_GPRS_RES,
SM_MOD_ADQ_IP,
SM_MOD_ADQ_IP_RES,
SM_MOD_WAIT_IP,
SM_MOD_WAIT_IP_RES,
SM_MOD_SOQ_ABE,
SM_MOD_SOQ_ABE_RES,
SM_MOD_LER_MSG_RES,
SM_MOD_LER_MSG,
SM_MOD_WAIT_CONNECT_SERVER,
SM_MOD_ENV_DAD_RES2,
SM_MOD_WAIT_DATA_SERVER,
SM_MOD_CLOSED_OPERADORA,
SM_MOD_CLOSED_OPERADORA_RES,
SM_MOD_CLOSED_SOQUET,
SM_MOD_CLOSED_SOQUET_RES,
SM_MOD_CLA_GPR,
SM_MOD_WAIT_OPERADORA,
SM_MOD_WAIT_OPERADORA_RES,
SM_MOD_CLA_GPR_RES,
SM_MOD_QUA_SER,
SM_MOD_QUA_SER_RES,
SM_MOD_QUA_SER_1,
SM_MOD_QUA_SER_1_RES,
SM_MOD_APAGAR_BUFFER_SOCKET,
SM_MOD_APAGAR_BUFFER_SOCKET_RES,
SM_MOD_LIN_GPR,
SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO,
SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES,
SM_MOD_GPRS_TRANSPARENTE,
SM_MOD_GPRS_TRANSPARENTE_RES,
SM_MOD_LIN_GPR_RES,
SM_MOD_TEM_IP,
SM_MOD_TEM_IP_RES,
SM_MOD_ABR_SOQ,
SM_MOD_ABR_SOQ_RES,
SM_MOD_ENV_DAD,
SM_MOD_ENV_DAD_RES,
SM_MOD_FLU_DAD,
SM_MOD_FLU_DAD_RES,
SM_MOD_FEC_SOQ,
SM_MOD_FEC_SOQ_RES,
SM_MOD_FEC_LIN,
SM_MOD_FEC_LIN_RES,
SM_MOD_REI_PRO,
SM_MOD_REI_PRO_RES,
SM_MOD_SOQ_ABE1,
SM_MOD_SOQ_ABE1_RES,
SM_MOD_MIP_SET,
SM_MOD_MIP_SET_RES,
SM_MOD_ATD,
SM_MOD_ATD_RES,
SM_MOD_SWITCH_CMD,
SM_MOD_SWITCH_CMD_RES,
SM_MOD_CONFIG_AUDIO,
SM_MOD_CONFIG_AUDIO_RES,
SM_MOD_DISCAR_NUMERO,
SM_MOD_DISCAR_NUMERO_RES,
SM_MOD_MONITORAR_LIGACAO,
SM_MOD_CONFIG_BAND_GSM,
SM_MOD_CONFIG_BAND_GSM_RES,
SM_MOD_RETIRAR_PIN,
SM_MOD_RETIRAR_PIN_RES,
SM_MOD_LIGAR_PARA_PANICO_ALARME,
SM_MOD_LIGAR_PARA_PANICO_ALARME_AGUARDAR


};

enum CMD_RCV
{
RCV_MAIOR,
RCV_INVALID,
RCV_LIGACAO,
RCV_OK,
RCV_ERRO,
RCV_SHUT,
RCV_ID_MODEM,
RCV_NOT_MSG,
RCV_ID_SIMCARD,
RCV_CPIN_READY,
RCV_CONNECT,
RCV_CMD_INVALID,
RCV_CLOSED,
RCV_VERSAO_MODEM,
RCV_COBERTURA_GPRS,
RCV_NIVEL_SINAL,
RCV_CONFIRMACAO_CONEXAO_OPERADORA,
RCV_CONFIRMACAO_CONEXAO_SERVER,
RCV_ERRO_CONEXAO,
RCV_DADOS_SERVER,
RCV_CONFIRMACAO_DADOS,
RCV_CONFIRMACAO_MSG_ENVIADA,
RCV_CONFIRMACAO_MSG_APAGADA,
RCV_STATUS_LIGACAO,
RCV_NO_CARRIER,
RCV_ERRO_MSG_ENVIADA,
RCV_MSG,
RCV_LER_NIVEL_BAT,
RCV_LER_MSG,
RCV_CONFIRMACAO_MSG,
RCV_CMS_ERRO,
RCV_BUSY,
RCV_NIVEL_BAT,
RCV_CPIN_COM_PIN,
RCV_MONITORAR_REDE_RES
};
/***********************************************************************
-------------- Definicao "Declaracao Prototipo fun‡”es"---------------
**********************************************************************/
void isr_modem(void);
void reset_serial(void);
u8 g20_comunicacao(void);
void sim340_enviar_cmd_conexao_server(struct TConfig_Server *ptr);
void sim340_enviar_cmd_conexao_operadora(struct TConfig_Operadora *ptr);
u8 sim340_enviar_msg(u8 *numero,u8 *msg,bool modo);//enviar uma msg sms.
u8 sim340_realiza_ligacao(char *numero);// realiza uma liga‡„o.
void sim340_ler_msg(u8 *indice_msg);
u8 sim340_rcv_modem(void);


void Modem_efetuar_ligacao(u8* numero01,u8 modo);
u8 Modem_rcv_ligacao(u8* numero);
u8 Modem_status(void);
void Modem_enviar_sms(u8* numero, u8* msg);
u8* Modem_ler_msg_sms(u8* numero);
void Modem_ler_msg_sms_flush(void);
u8 Modem_enviar_smsOk(void);
void ModemInit(void);
u8 Modem_inicializado(void);
u8 ModemIniciado(void);
u8 ModemConnected(void);
void ModemTcpDisconnect(void);
void ModemTcpPuts(u8*dptr ,u8 lentgh);
bool ModemTcpPutsOk(void);
void ModemTcpFlush(void);
u8* ModemTcpGets(void);
void ModemTask(void);

u8* strcmpmodem(u8 *s1,u8 *s2);
u8 flg_msg_sms_enviada=FREE;
boolean flg_clcc=TRUE;



u8* strcmpmodem(u8 *s1,u8 *s2)
{
u8 s3=NULL;

s3=*s1++;
while(s3)
{
if(s3!=(u8)*s2++)return NULL;
s3=(u8)*s1++;
}
return (u8*)s2;
}

u8* strcmpmodem2(u8 *s1,u8 *s2)
{
u8 count=0;

while(*s2)
{
if(s1[count]!='\0')
{
if(s1[count]==*s2)
count++;
else
count=0;
}else
{
return s2;
}
s2++;
}
return NULL;
}

u8* dptr_copy_rom_ram=0;
void CopyRamForRom(u8 s2)
{
*dptr_copy_rom_ram = s2;
dptr_copy_rom_ram++;
}


void putsUSART(char* s1)
{
while(*s1)putc(*s1++);
}

void putrsUSART(char s1)
{
putc(s1);
}
#define putcUSART(x) putc(x)


u8 cmd_send=FALSE;

void isr_modem(void)
{
volatile u8 data_rcv=0;
if(RCSTA!=0x90)
{
RCSTA=0;
RCSTA=0b10010000;
return;
}

while(DataRdyUSART())
{
data_rcv=getch();
if(data_rcv=='#'){sSerial.rcv_cmd=FALSE;sSerial.dptr=0;state_rcv_rda=2;sSerial.hold=FALSE;sSerial.overflow=FALSE;}//sSerial.modo=MODO_DATA;}
if(data_rcv=='>'){sSerial.dptr=0;state_rcv_rda=2;sSerial.buffer_rx[sSerial.dptr++]=data_rcv;sSerial.rcv_cmd=TRUE;}
if(sSerial.modo==MODO_CMD)
{
if(sSerial.hold==(bool)FALSE)
{

if(sSerial.overflow==(bool)FALSE)
{
switch(state_rcv_rda)
{
case 0: if(data_rcv==(u8)LF)
{
state_rcv_rda++;
}break;
case 1: if(data_rcv==(u8)CR || data_rcv==(u8)LF)
{
state_rcv_rda=0;
}
else {
state_rcv_rda++;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
if(data_rcv=='>')sSerial.rcv_cmd=TRUE;
}
break;
case 2: if(data_rcv==(u8)CR || data_rcv=='*')
{
sSerial.rcv_cmd=TRUE;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
sSerial.buffer_rx[sSerial.dptr]='\0';
//sSerial.hold=TRUE;
}else
{
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
if(sSerial.dptr==(u8)TAM_BUFFER_SERIAL-1)
{
sSerial.overflow=TRUE;
state_rcv_rda=0;
sSerial.dptr=0;
}
sSerial.buffer_rx[sSerial.dptr]='\0';
}
break;
}
}
}
}else
{
if(data_rcv==CR || data_rcv=='*')
{
sSerial.rcv_cmd=TRUE;
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
sSerial.buffer_rx[sSerial.dptr]='\0';
sSerial.dptr=0;
sSerial.hold=TRUE;
sSerial.modo=MODO_CMD;
}else
{
sSerial.buffer_rx[sSerial.dptr++]=data_rcv;
}
}
}

}


void reset_serial(void)
{
sSerial.dptr=0;
sSerial.rcv_cmd=FALSE;
state_rcv_rda=0;
sSerial.overflow=FALSE;
sSerial.hold=FALSE;
sSerial.modo=MODO_CMD;
if(RCSTA!=0x90)
{
RCSTA=0;
RCSTA=0b10010000;
return;
}
memset(sSerial.buffer_rx, 0x00, sizeof(sSerial.buffer_rx));



}

u8 g20_comunicacao(void)
{
return FREE;
/// if(!input(CTS_MODEM))return FREE;
// else return BUSY;
}

char* strcatpgm2ram(char* s1,char * s2)
{
char s3;

s3=*s2;
while(s3)
{
s3=*s2++;
*s1++=s3;
s3=*s2;
}
*s1='\0';
return s1;
}

u8* numero_01='\0';
u8* msg_sms='\0';

u8 modo_ligacao=0;
u8 back_state_modem=0;
u8 next_state_modem=0;

void Modem_efetuar_ligacao(u8* numero01,u8 modo)
{
if(Modem_inicializado()==TRUE && Modem_status()==FREE)
{
if(numero01!=NULL)
{
numero_01=numero01;
modo_ligacao=modo;
sModem.status_comunicacao=MODO_CMD;
back_state_modem=state_modem;
state_modem=SM_MOD_CONFIG_AUDIO;
next_state_modem=SM_MOD_DISCAR_NUMERO;
}
}
}

u8 Modem_rcv_ligacao(u8* numero)
{
u8 x=0;
if(flg_rcv_ligacao==TRUE)
{
while(sModem.numero_remetente[x])
{
*numero++=sModem.numero_remetente[x++];
}
*numero='\0';

}
return flg_rcv_ligacao;
}

void Modem_atender_ligacao(void)
{
putrsUSART(CMD_ATENDER_LIGACAO);
}
void ModemTcpPutsFlush(void)
{

}
u8 ModemNivelBateria(void)
{
return sModem.nivel_bateria;
}

void ModemStartLeituraBateria(void)
{
if(sModem.status==FREE)
{
back_state_modem = state_modem;
state_modem = SM_MOD_NIVEL_BAT;
}
}
char* strcatram(char *s1, char *s2)
{
while(*s2)*s1++=*s2++;
*s1='\0';
return s1;
}

u8* Modem_ler_msg_sms(u8* numero)
{
if(dptr_sms!=NULL)
{
strcpy(numero,sModem.numero_remetente);
return dptr_sms;
}else return '\0';
}
void Modem_ler_msg_sms_flush(void)
{
dptr_sms='\0';
sSerial.hold=FALSE;
SModem.status=FREE;
reset_serial();
}

u8 Modem_inicializado(void)
{
return flg_modem_inicializado;
}

volatile u8 tick_cmd_msg=0;
void Modem_enviar_sms(u8* numero,u8 *msg)
{

if(Modem_inicializado()==TRUE && Modem_status()==FREE)
{
back_state_modem=state_modem;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_ENVIAR_SMS;
numero_01=numero;
msg_sms=msg;
}

}
u8 modem_enviar_smsOk(void)
{
return flg_msg_sms_enviada;
}

void sim340_enviar_cmd_conexao_server(struct TConfig_Server *ptr)
{
u8 buffer_compare[50];
u8 *dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONECTAR_SERVER);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
*dptr++='"';
dptr=strcatram(dptr,ptr->ip_server);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->porta_server);
*dptr++='"';
*dptr++=0x0D;
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}

void sim340_enviar_cmd_conexao_operadora(struct TConfig_Operadora *ptr)
{
u8 buffer_compare[50];
u8* dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONECTAR_OPERADORA);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
dptr=strcatram(dptr,ptr->apn);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->login);
*dptr++='"';
*dptr++=',';
*dptr++='"';
dptr=strcatram(dptr,ptr->senha);
*dptr++='"';
*dptr++=0x0D;
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}

void sim340_ler_msg(u8 *indice_msg)
{
u8 x=0;
sModem.status=busy;
putrsUSART(CMD_LER_MSG);
while(*indice_msg>='0' && *indice_msg<='9')
{
sModem.indice_msg_rcv[x++]=*indice_msg;
putc(*indice_msg++);
}
sModem.indice_msg_rcv[x]='\0';
reset_serial();
putc(0x0D);

}
#define RAM 0
#define ROM 1
#define MSG00 "CMD RCV - BLOQUEIO ATIVADO\0"
#define MSG01 "CMD RCV - BLOQUEIO DESATIVADO\0"
#define MSG02 "CMD RECEBIDO OK\0"
//#define MSG03 "CMD RCV - SIR DESAT"//SIRENE DESATIVADA\0"
//#define MSG04 "CMD RCV - PISCA ATIVADO\0"
//#define MSG05 "CMD RCV - PISCA DESATIVADO\0"
//#define MSG08 "CMD_RCV - AGUARDE AS LOCALIZACOES GEOGRAFICA NO SEU CELULAR\0";

#define MSG06 "PANICO\0"
//#define MSG09 "CMD RCV - NUMERO CADASTRADO COM SUCESSO\0"
#define MSG10 "ALERTA\0"

#define MSG11 "SAL\0"
u8 tick_timeout_cmd=0;
u8 sim340_enviar_msg(u8 *numero,u8 *msg,bool modo)
{
u8 result=0xFF;

reset_serial();
putrsUSART(CMD_ENVIAR_MSG);
while(*numero)putc(*numero++);
putc(0x0D);
reset_serial();
tick_timeout_cmd=0x00;
while(result!=RCV_MAIOR)
{
if(tick_timeout_cmd>10)return RCV_ERRO;
result=sim340_rcv_modem();
if(result==RCV_ERRO)return RCV_ERRO;
}
if(modo==ROM)
{
switch(msg)
{
case 0: putrsUSART(MSG00);
break;
case 1: putrsUSART(MSG01);
break;
case 2: putrsUSART(MSG02);
break;
case 6: putrsUSART(MSG06);
break;
case 10:putrsUSART(MSG10);
break;
case 11:putrsUSART(MSG11);
break;

}
}else
{
while(*msg)putc(*msg++);
}
putc(0x1A);
result=RCV_INVALID;
tick_timeout_cmd=0x00;
while(result!=RCV_OK)
{
if(tick_timeout_cmd>10)return RCV_ERRO;
if(result!=RCV_INVALID)return RCV_ERRO;
result=sim340_rcv_modem();
}
return RCV_OK;
}

void sim340_config_serverdns(void)
{
u8 buffer_compare[50];
u8 *dptr=NULL;

sSerial.hold=TRUE;
sSerial.buffer_rx[0]='\0';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_CONFIG_SERVER_DNS);
*dptr_copy_rom_ram='\0';
dptr=strcatpgm2ram(sSerial.buffer_rx,buffer_compare);
*dptr++='"';
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(sDNS.DNS1);
*dptr_copy_rom_ram='\0';
dptr=strcatram(dptr,buffer_compare);
*dptr++='"';
*dptr++='\r';
*dptr='\0';
putsUSART(sSerial.buffer_rx);
sSerial.hold=FALSE;
}


void ModemDesconectarServidor(void)
{
if(sModem.conexao_server==TRUE)
{
state_modem=SM_MOD_CLOSED_SOQUET;
sModem.conexao_server=FALSE;
}
flg_conectar_servidor=FALSE;
}


void ModemConectarServidor(void)
{
flg_conectar_servidor=TRUE;
}

u8 Modem_status(void)
{
return sModem.status;
}
extern void AppDiscarPanicoAlarme(void);

u8 buffer_compare[30];
int1 flg_chamada=FALSE;
void ModemEventoSerial(void)
{
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CLOSED);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
state_modem=SM_MOD_ABR_SOQ;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_LIGACAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem2(buffer_compare,sSerial.buffer_rx)!=NULL)
{
if(flg_chamada==FALSE)
{
flg_chamada=TRUE;
back_state_modem=state_modem;
next_state_modem=SM_MOD_ATENDER_LIGACAO;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_CONFIG_AUDIO;
}
sModem.status=FREE;
reset_serial();
return;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem2(buffer_compare,sSerial.buffer_rx)!=NULL)
{
delay_ms(200);
sModem.status=BUSY;
back_state_modem=state_modem;
sModem.status_comunicacao=MODO_CMD;
state_modem=SM_MOD_LER_MSG;
}

}

u8 sim340_realiza_ligacao(char *numero)
{
u8 result=0xFF,x=0;


putrsUSART(CMD_EFETUAR_LIGACAO);
while(numero[x])
{
result=numero[x++];
if(result!='"')putc(result);
}
putc(';');
putc(0x0D);
reset_serial();
tick_timeout_cmd=0x00;
result=RCV_NOT_MSG;
while(result!=RCV_OK)
{
if(tick_timeout_cmd>40)return RCV_ERRO;
if(result!=RCV_NOT_MSG)return RCV_ERRO;
result=sim340_rcv_modem();
}
return RCV_OK;
}

u8 sim340_rcv_modem(void)
{


if(sSerial.rcv_cmd==(u8)TRUE)
{
ModemEventoSerial();
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_LER_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return (u8)RCV_LER_MSG;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MONITORAR_REDE_RES);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
return (u8)RCV_MONITORAR_REDE_RES;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_BUSY);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return (u8)RCV_BUSY;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CPIN_COM_PIN);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return (u8)RCV_CPIN_COM_PIN;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CMS_ERRO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CMS_ERRO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_MSG;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ERRO_MSG_ENVIADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO_MSG_ENVIADA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_STATUS_LIGACAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_STATUS_LIGACAO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NO_CARRIER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_NO_CARRIER;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_OK);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_OK;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONNECT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONNECT;

}


dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_SHUT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_SHUT;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ERRO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_ID_MODEM);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{

return RCV_ID_MODEM;

}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_VERSAO_MODEM);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_VERSAO_MODEM;

}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_MAIOR);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_MAIOR;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CPIN_READY);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CPIN_READY;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_COBERTURA_GPRS);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_COBERTURA_GPRS;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NIVEL_SINAL);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_NIVEL_SINAL;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(RCV_ERRO_CONEXAO);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_ERRO_CONEXAO;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_DADOS_SERVER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_DADOS_SERVER;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_CONEXAO_OPERADORA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_CONEXAO_OPERADORA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_DADOS);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_DADOS;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG_APAGADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_MSG_APAGADA;
}
dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_MSG_ENVIADA);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_CONFIRMACAO_MSG_ENVIADA;
}

dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_NIVEL_BAT);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
//reset_serial();
return RCV_NIVEL_BAT;
}



dptr_copy_rom_ram = buffer_compare;
CopyRamForRom(CMD_RCV_CONFIRMACAO_CONEXAO_SERVER);
*dptr_copy_rom_ram='\0';
if(strcmpmodem(buffer_compare,sSerial.buffer_rx)!=NULL)
{
reset_serial();
return RCV_CONFIRMACAO_CONEXAO_SERVER;
}else{
reset_serial();
return RCV_CMD_INVALID;
}
}
return RCV_NOT_MSG;
}

void ModemInit(void)
{
state_modem=SM_MOD_OFF;
ModemTcpFlush();
}

u8 ModemTcpOpen(void)
{
if(flg_modem_inicializado==(u8)TRUE)
{
state_modem=SM_MOD_ADQ_IP;

}else return RCV_ERRO;
}

u8 ModemConnected(void)
{
if(sModem.conexao_server==(u8)TRUE)
{
return TRUE;
}else
{
return ERRO;
}
}

void ModemTcpDisconnect(void)
{
state_modem=23;
}
void ModemTcpFlush(void)
{
sModem.status=FREE;
dptr=NULL;
sSerial.hold=FALSE;
reset_serial();
}
u8* ModemTcpGets(void)
{
return ((u8*)dptr);
}

char *dptr_send='\0';
char length_msg=0;

void ModemTcpPuts(u8*dptr ,u8 lentgh)
{

status_msg_enviada_servidor=BUSY;
dptr_send=dptr;
length_msg=lentgh;
reset_serial();
putrsUSART(CMD_TAM_FIXO);
printf("%u\r",lentgh);
back_state_modem= SM_MOD_WAIT_DATA_SERVER;
state_modem=SM_MOD_ENV_DAD;
tick_cmd_timeout=0;

}
void ModemLigarAlarmePanico(void)
{
back_state_modem = state_modem;
state_modem=SM_MOD_LIGAR_PARA_PANICO_ALARME;
}

void ModemBackLigarAlarmePanico(void)
{
state_modem=back_state_modem;
}
boolean ModemTcpPutsOk(void)
{

return (status_msg_enviada_servidor);
}
#define TEMPO_LIGACAO_LIMITE 1800
int16 tick_tempo_ligacao=0;


void ModemWatchDogGprs(void)
{

if(tick_watchdog_gprs>=900)
{
count_erro=0x00;
tick_watchdog_gprs=0x00;
reset_serial();
state_modem=SM_MOD_OFF;
}

}
u8* ModuloGetId(void)
{
return (u8*)sModem.ID;
}

u8 ModemCarregador(void)
{
return input(VCH_PIN);
}
u8 ModemRssi(void)
{
return sModem.nivel_sinal;
}
void ModemTask(void)
{
u8 result=0,x=0,*ptr_aux;
static boolean flg_erro=FALSE;
static u8 count_ligacao=0;




if(count_erro>=10)
{
count_erro=0x00;
tick_watchdog_gprs=0x00;
state_modem=SM_MOD_OFF;
}

ModemEventoSerial();
switch(state_modem)
{
case SM_MOD_OFF:
status_led_app = STATUS_APP_MODEM;
flg_modem_inicializado=FALSE;
sModem.status=BUSY;
count_erro=0x00;
tick_watchdog_gprs=0x00;
status_led_conexao=STATUS_APP_DESCONECTADO;
status_led_gsm=STATUS_GSM_DESCONECTADO;
sModem.conexao_server=FALSE;
output_high(ON_OFF);
input(POWER_KEY);
state_modem=SM_MOD_ON;
tick_cmd_timeout=0;
break;

/*********LIGANDO O MODEM DEPOIS DE 100ms.*************/
case SM_MOD_ON:
if(tick_cmd_timeout>(u8)5)
{
output_low(ON_OFF);
state_modem=SM_MOD_ESTABILIZAR;
tick_cmd_timeout=0;

}break;
case SM_MOD_ESTABILIZAR:
if(tick_cmd_timeout>(u8)20)
{
output_low(POWER_KEY);
state_modem=SM_MOD_WAIT_ON;
tick_cmd_timeout=0;
}
break;
case SM_MOD_WAIT_ON:
if(tick_cmd_timeout>(u8)5)
{
input(POWER_KEY);
sModem.status=FREE;
state_modem=SM_MOD_SEM_FLU;
putrsUSART(CMD_CHAVEAR_MODO_COMANDO);
tick_cmd_timeout=0;
}break;

/*********RESPONSAVEL PELO CANCELAMENTO DO ECHO DO MODEM*************/
case SM_MOD_SEM_FLU: if(tick_cmd_timeout>(u8)15)
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_AT);
state_modem=SM_MOD_SEM_FLU_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SEM_FLU_RES:if(tick_cmd_timeout>=(u8)1)
{
tick_cmd_timeout=0x00;
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_CONFIG_MSG;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SEM_FLU;
break;
default: count_erro++;state_modem=SM_MOD_WAIT_ON;
}
}break;
case SM_MOD_CONFIG_MSG:
if(Modem_status()==(u8)FREE)
{
reset_serial();
sModem.status=BUSY;
putrsUSART(CMD_CONFIG_MSG);
state_modem=SM_MOD_CONFIG_MSG_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_CONFIG_MSG_RES:
if(tick_cmd_timeout>=(u8)1)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_ID_MODEM;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_MSG;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_MSG;
}
}break;

/*********RESPONSAVEL PELA LEITURA DO ID DO MODEM*************/
case SM_MOD_ID_MODEM: if(g20_comunicacao()==(u8)FREE)
{
reset_serial();
putrsUSART(CMD_LER_ID_MODEM);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ID_MODEM_RES;
}break;

case SM_MOD_ID_MODEM_RES: if(tick_cmd_timeout>(u8)4)
{
SModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_ID_MODEM: sSerial.buffer_rx[15]='\0';
strcpy(ModuloGetId(),&sSerial.buffer_rx[0]);
reset_serial();
count_erro=0x00;
state_modem=SM_MOD_VOLUME_SPEAKER;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_ID_MODEM;
break;
default: count_erro++;state_modem=SM_MOD_ID_MODEM;
}
tick_cmd_timeout=0x00;
}break;

case SM_MOD_VOLUME_SPEAKER:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_GANHO_SPEAKER);
//putrsUSART(CMD_APAGAR_MSG);
state_modem=SM_MOD_VOLUME_SPEAKER_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_VOLUME_SPEAKER_RES:
if(tick_cmd_timeout>=(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_VOLUME_MIC;
break;
case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_MSG;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_MSG;
}
sModem.status=FREE;
} break;

case SM_MOD_VOLUME_MIC:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_GANHO_MIC);
state_modem=SM_MOD_VOLUME_MIC_RES;
tick_cmd_timeout=0x00;
}
break;

case SM_MOD_VOLUME_MIC_RES:
if(tick_cmd_timeout>=(u8)2)
{
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_GPRS_TRANSPARENTE;
break;
case RCV_ERRO: count_erro++;
state_modem=SM_MOD_VOLUME_MIC;
break;
default: count_erro++;state_modem=SM_MOD_VOLUME_MIC;
}
sModem.status=FREE;
}break;

case SM_MOD_GPRS_TRANSPARENTE:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_GPRS_MODO_TRANSPARENTE);
state_modem=SM_MOD_GPRS_TRANSPARENTE_RES;
tick_cmd_timeout=0x00;
}break;
case SM_MOD_GPRS_TRANSPARENTE_RES:
if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;
default: count_erro++;state_modem=SM_MOD_SEM_ECH;
}

}break;
case SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
cmd_send=TRUE;
reset_serial();
putrsUSART(CMD_GPRS_MODO_TRANSPARENTE_CONFIGURACAO);
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO_RES:
if(tick_cmd_timeout>=(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
break;
default: count_erro++;state_modem=SM_MOD_GPRS_TRANSPARENTE_CONFIGURACAO;
}

}break;

case SM_MOD_SEM_ECH: if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CONEXAO_SERVER_IP);
state_modem=SM_MOD_SEM_ECH_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SEM_ECH_RES:if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SEM_ECH;
break;
default: count_erro++;state_modem=SM_MOD_SEM_ECH;
}
break;
}break;
case SM_MOD_CONFIG_BAND_GSM:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CONFIG_GSM);
state_modem=SM_MOD_CONFIG_BAND_GSM_RES;
tick_cmd_timeout=0x00;
}break;


case SM_MOD_CONFIG_BAND_GSM_RES:
if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK: count_erro=0x00;
state_modem=SM_MOD_SIM_CAR;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_CONFIG_BAND_GSM;
break;
default: count_erro++;state_modem=SM_MOD_CONFIG_BAND_GSM;
}
break;
}break;
break;



/*********RESPONSAVEL PELA LEITURA DO STATUS DO SIMCARD*************/
case SM_MOD_SIM_CAR: if(Modem_status()==(u8)FREE)
{


sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_STATUS_SIMCARD);
state_modem=SM_MOD_SIM_CAR_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_SIM_CAR_RES: if(tick_cmd_timeout>(u8)3)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_CPIN_READY: count_erro=0x00;
state_modem=SM_MOD_NIVEL_BAT;//;
status_led_app=STATUS_APP_MODEM_INICIADO;
back_state_modem = SM_MOD_NIVEL;
break;
case RCV_CPIN_COM_PIN: count_erro=0x00;
state_modem=SM_MOD_RETIRAR_PIN;
break;
case RCV_CMD_INVALID: count_erro++;
state_modem=SM_MOD_SIM_CAR;
break;
default : count_erro++; state_modem=SM_MOD_SIM_CAR;;
}

}break;


case SM_MOD_RETIRAR_PIN:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_DIGITAR_PIN);
state_modem=SM_MOD_SIM_CAR_RES;
tick_cmd_timeout=0x00;
}break;


case SM_MOD_RETIRAR_PIN_RES:
if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK:
state_modem=SM_MOD_SIM_CAR;
break;


case RCV_ERRO: count_erro++;
state_modem=SM_MOD_SIM_CAR;
break;
default: count_erro++;state_modem=SM_MOD_SIM_CAR;
}
}break;


/*********RESPONSAVEL PELO TRATAMENTO DA CONEXAO COM A OPERADORA*************/
case SM_MOD_NIVEL_BAT:
/*********ENVIA O COMANDO PARA LER O NIVEL DA BATERIA**************/
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_NIVEL_BAT);
state_modem=SM_MOD_NIVEL_BAT_RES;
tick_cmd_timeout=0x00;
}break;


/*********EFETUA O TRATAMENTO DA MSG RECEBIDA*********************/
case SM_MOD_NIVEL_BAT_RES:
switch(sim340_rcv_modem())
{
case RCV_NIVEL_BAT :state_modem=SM_MOD_NIVEL;
sModem.status=FREE;
ptr_aux=find_carac(sSerial.buffer_rx,',',0x02);ptr_aux[2]='\0';
sModem.nivel_bateria=atoi(ptr_aux);
reset_serial();
state_modem=back_state_modem;
break;
}
if(tick_cmd_timeout>(u8)3)
{
SModem.status=FREE;
state_modem=back_state_modem;
}
break;
case SM_MOD_NIVEL:
if(Modem_status()==(u8)FREE)
{
status_led_conexao=STATUS_APP_DESCONECTADO;
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_NIVEL_SINAL_GPRS);
state_modem=SM_MOD_NIVEL_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_NIVEL_RES: if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_NIVEL_SINAL: flg_modem_inicializado=TRUE;
sModem.nivel_sinal=atoi(&sSerial.buffer_rx[6]);
state_modem=SM_MOD_COBERT_GPRS;

count_erro=0x00;
break;

case RCV_ERRO: count_erro++;
state_modem=SM_MOD_NIVEL;
break;

default: count_erro++;state_modem=SM_MOD_NIVEL;
}
}
break;

case SM_MOD_COBERT_GPRS:
if(flg_conectar_servidor==TRUE)
{
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
status_led_gsm=STATUS_GSM_DESCONECTADO;
reset_serial();
putrsUSART(CMD_VERIFICAR_COBERTURA_GSM); // enviar para serial a string "AT"
tick_cmd_timeout=0x00;
state_modem=SM_MOD_COBERT_GPRS_RES;
}
}else
{
state_modem=SM_MOD_MONITORAR_REDE;
tick_cmd_timeout=0;
}
break;

case SM_MOD_MONITORAR_REDE:

if(flg_conectar_servidor==TRUE) state_modem=SM_MOD_NIVEL;
if(tick_cmd_timeout>30)
{
reset_serial();
putrsUSART(CMD_MONITORAR_REDE); // enviar para serial a string "AT"
tick_cmd_timeout=0x00;
state_modem=SM_MOD_MONITORAR_REDE_RES;
}
break;

case SM_MOD_MONITORAR_REDE_RES:
switch(sim340_rcv_modem())
{
case RCV_MONITORAR_REDE_RES:
ptr_aux=find_carac(sSerial.buffer_rx,',',0x01);
if(*ptr_aux!='1'){state_modem=SM_MOD_OFF;return;}
else{tick_watchdog_gprs=0; delay_ms(500); reset_serial();tick_watchdog_gprs=0;} // retirar isto depois
count_erro=0;
state_modem=SM_MOD_MONITORAR_REDE;
tick_cmd_timeout=0;
break;
}
if(tick_cmd_timeout>(u8)10)
{
state_modem=SM_MOD_OFF;
}
break;

case SM_MOD_COBERT_GPRS_RES: if(tick_cmd_timeout>(u8)2)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{
case RCV_OK:
state_modem=SM_MOD_ADQ_IP;
break;


case RCV_ERRO: count_erro++;
state_modem=SM_MOD_COBERT_GPRS;
break;
default: count_erro++;state_modem=SM_MOD_COBERT_GPRS;
}
}break;

case SM_MOD_ADQ_IP: if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
sim340_enviar_cmd_conexao_operadora(&sConfig_Operadora);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ADQ_IP_RES;
}break;

case SM_MOD_ADQ_IP_RES: if(tick_cmd_timeout>(u8)30)
{
count_erro++;
state_modem--;
}
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_OPERADORA;
break;


case RCV_ERRO: sModem.status=FREE;
count_erro++;
sModem.conexao_operadora=FALSE;
state_modem=SM_MOD_CLOSED_OPERADORA;
break;

}break;

case SM_MOD_WAIT_OPERADORA:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
status_led_gsm=STATUS_GSM_CONECTADO;
reset_serial();
putrsUSART(CMD_WAIT_CONEXAO_OPERADORA);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_WAIT_OPERADORA_RES;
}break;

case SM_MOD_WAIT_OPERADORA_RES:
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_IP;
break;

case RCV_ERRO:sModem.status=FREE;
state_modem=SM_MOD_CLOSED_OPERADORA;
break;
}
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
state_modem=SM_MOD_CLOSED_OPERADORA;
}
break;

case SM_MOD_WAIT_IP:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_SOLICITAR_IP);
tick_cmd_timeout=0x00;
state_modem=SM_MOD_WAIT_IP_RES;
}break;

case SM_MOD_WAIT_IP_RES:
switch(sim340_rcv_modem())
{

default:sModem.status=FREE;
tick_cmd_timeout=0x00;
state_modem=SM_MOD_ABR_SOQ;
}
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
state_modem=SM_MOD_CLOSED_SOQUET;
}
break;

/*********RESPONSAVEL PELO TRATAMENTO DA CONEXAO COM O SERVIDOR*************/
case SM_MOD_ABR_SOQ:
if(flg_conectar_servidor==FALSE)
{
state_modem=SM_MOD_CLOSED_OPERADORA;
}
if(tick_cmd_timeout>3)
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
sim340_enviar_cmd_conexao_server(&sConfig_Servidor);
state_modem=SM_MOD_ABR_SOQ_RES;// incrementar para o proximo estado da tarefa.
tick_cmd_timeout=0x00;
}break;

case SM_MOD_ABR_SOQ_RES:
if(tick_cmd_timeout>10)
{
sModem.status=FREE;
sModem.conexao_server=FALSE;
state_modem=SM_MOD_CLOSED_SOQUET;

}
switch(sim340_rcv_modem())
{
case RCV_OK: sModem.status=FREE;
state_modem=SM_MOD_WAIT_CONNECT_SERVER;
count_erro=0x00;
tick_conexao_timeout=0x00;
reset_serial();
break;


case RCV_ERRO_CONEXAO: sModem.status=FREE;
sModem.conexao_server=FALSE;
state_modem=SM_MOD_CLOSED_SOQUET;
break;

case RCV_ERRO: sModem.status=FREE;
sModem.conexao_server=FALSE;
count_erro++;
state_modem=SM_MOD_CLOSED_SOQUET;
break;

}break;

case SM_MOD_WAIT_CONNECT_SERVER:
if(tick_cmd_timeout>(u8)30)
{
sModem.status=FREE;
count_erro++;
state_modem=SM_MOD_CLOSED_SOQUET;
}
switch(sim340_rcv_modem())
{
case RCV_CONNECT: sModem.status=FREE;

state_modem=SM_MOD_WAIT_DATA_SERVER;
sModem.conexao_server=TRUE;
sModem.status_comunicacao=MODO_DATA;
break;
}
break;
/*********DISPOSITIVO CONECTADO AO SERVIDOR DE COMUNICA?ZO*************/
case SM_MOD_WAIT_DATA_SERVER:

switch(sim340_rcv_modem())
{
case RCV_ERRO: sModem.conexao_server=FALSE;
sModem.status=FREE;
status_led_conexao=STATUS_APP_DESCONECTADO;
state_modem=SM_MOD_CLOSED_SOQUET;
sModem.status_comunicacao=MODO_CMD;
break;

case RCV_CLOSED: sModem.conexao_server=FALSE;sModem.status=FREE;
sModem.status_comunicacao=MODO_CMD;
status_led_conexao=STATUS_APP_DESCONECTADO;
state_modem=SM_MOD_ABR_SOQ;
break;

case RCV_DADOS_SERVER: sModem.status=BUSY;
tick_watchdog_gprs=0;
dptr=(char*)sSerial.buffer_rx;
break;




}break;
case SM_MOD_CLOSED_OPERADORA:
if(Modem_status()==(u8)FREE)
{
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_FECHAR_CONEXAO_OPERADORA);
state_modem=SM_MOD_CLOSED_OPERADORA_RES;// incrementar para o proximo estado da tarefa.
tick_cmd_timeout=0x00;
}break;

case SM_MOD_CLOSED_OPERADORA_RES:
if(tick_cmd_timeout>(u8)5)
{
state_modem=SM_MOD_NIVEL;
sModem.status=FREE;
}
switch(sim340_rcv_modem())
{
case RCV_SHUT: sModem.status=FREE;
state_modem=SM_MOD_NIVEL;
break;
case RCV_ERRO: sModem.status=FREE;
state_modem=SM_MOD_NIVEL;
break;
}break;

/*******************RESPONSAVEL PELO RESET DO MODEM*********************/
case SM_MOD_CLOSED_SOQUET: if(Modem_status()==(u8)FREE)
{
status_led_conexao=STATUS_APP_DESCONECTADO;
sModem.status=BUSY;
reset_serial();
putrsUSART(CMD_CLOSED_SOCKET);
state_modem=SM_MOD_CLOSED_SOQUET_RES;
tick_cmd_timeout=0x00;
}break;

case SM_MOD_CLOSED_SOQUET_RES:
if(tick_cmd_timeout>(u8)10)
{
sModem.status=FREE;
switch(sim340_rcv_modem())
{

case RCV_CLOSED: state_modem=SM_MOD_ABR_SOQ;
break;
case RCV_ERRO: state_modem=SM_MOD_NIVEL;
break;
default: count_erro++;
state_modem=SM_MOD_NIVEL;
}
}break;


/*******************RESPONSAVEL POR ENVIAR MSG AO SERVIDOR*********************/
case SM_MOD_ENV_DAD: switch(sim340_rcv_modem())
{

case RCV_MAIOR: delay_ms(10);
reset_serial();
while(length_msg!=(u8)0x00)
{
putcUSART(*dptr_send++);
length_msg--;
}

tick_cmd_timeout=0;
state_modem=SM_MOD_
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor eng.viniciuspais » 15 Ago 2011 18:05

#define CMD_SELEC_CANAL01 "AT+CHFA=0\r\0"
#define CMD_SELEC_CANAL02 "AT+CHFA=0\r\0"


O SIM900D possui duas saidas de audio, SPK1 e SPK2, para alternar entre canais só existe este metodo ou tem alguma forma de falar para o módulo que eu quero o CANAL2(especificadamente)!

Ei amigo, você pode enviar este código para meu e-mail, verifiquei que está incompleto!

vinicius_pais@hotmail.com

Grato!
Avatar do usuário
eng.viniciuspais
Byte
 
Mensagens: 189
Registrado em: 29 Set 2010 02:35


Voltar para Telecomunicações

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x