📄 gsm.c
字号:
#include "stdlib.h"
#include "config.h"
#include "regmap.h"
#include "memmap.h"
#include "global.h"
#include "sio.h"
#include "gpio.h"
#include "func.h"
#include "util.h"
#include "graph.h"
#include "osdfont.h"
#include "gsmdef.h"
#ifdef SUPPORT_GPRS_FUNCTION
/************************************************************************
* GSM Port Define *
************************************************************************/
#define GSM_POWER (1 << 6)
#define GSM_POWER_HI (Bus1SetBit(GSM_POWER, 1))
#define GSM_POWER_LO (Bus1SetBit(GSM_POWER, 0))
#define GSM_DTR 49
#define GSM_DSR 24
#define GSM_RI 39
/*
#define GSM_RTS 39
#define GSM_CTS 38
*/
#define GSM_DTR_HI (GPIO_O_SET(GSM_DTR, 1))
#define GSM_DTR_LO (GPIO_O_SET(GSM_DTR, 0))
#define GSM_DSR_IN (GPIO_I_GET(GSM_DSR))
#define GSM_RI_IN (GPIO_I_GET(GSM_RI))
/*
#define GSM_CTS_HI (GPIO_O_SET(GSM_CTS, 1))
#define GSM_CTS_LO (GPIO_O_SET(GSM_CTS, 0))
#define GSM_RTS_IN (GPIO_I_GET(GSM_RTS))
#define GSM_CTS_IN (GPIO_I_GET(GSM_CTS))
*/
/************************************************************************
* GSM Buffer Define *
************************************************************************/
static UINT16 GSMReadSize; // 接收缓冲区的当前位置
static UINT16 GSMReadAddr;
static UINT16 GSMReadStop;
static UINT16 GSMSaveSize;
#define GSMReadCurr GSMReadBuff + GSMReadSize
static BYTE GSMSendSize; // 发送缓冲区的当前位置
#define GSMSendCurr GSMSendBuff + GSMSendSize
/********************************************************
SMS Send/Read FIFO Define
********************************************************/
#define FIFO_SEND_SIZE 32
#define FIFO_SEND_MASK (FIFO_SEND_SIZE - 1)
#define FIFO_SEND_FI(d) SMSSendFIFO[SMSSendFI++] = (d); \
SMSSendFI &= FIFO_SEND_MASK
#define FIFO_SEND_FO(d) (d) = SMSSendFIFO[SMSSendFO++]; \
SMSSendFO &= FIFO_SEND_MASK
#define FIFO_SEND_FC(d) (d) = SMSSendFIFO[SMSSendFO]
#define FIFO_SEND_FF SMSSendFO++; \
SMSSendFO &= FIFO_SEND_MASK
#define FIFO_SEND_EMPTY (SMSSendFI == SMSSendFO)
#define FIFO_SEND_FULL (((SMSSendFI + 1) & FIFO_SEND_MASK) == SMSSendFO)
#define FIFO_READ_SIZE 16
#define FIFO_READ_MASK (FIFO_READ_SIZE - 1)
#define FIFO_READ_FI(d) SMSReadFIFO[SMSReadFI++] = (d); \
SMSReadFI &= FIFO_READ_MASK
#define FIFO_READ_FO(d) (d) = SMSReadFIFO[SMSReadFO++]; \
SMSReadFO &= FIFO_READ_MASK
#define FIFO_READ_FC(d) (d) = SMSReadFIFO[SMSReadFO]
#define FIFO_READ_FF SMSReadFO++; \
SMSReadFO &= FIFO_READ_MASK
#define FIFO_READ_EMPTY (SMSReadFI == SMSReadFO)
#define FIFO_READ_FULL (((SMSReadFI + 1) & FIFO_READ_MASK) == SMSReadFO)
static UINT16 SMSSendFIFO[FIFO_SEND_SIZE];
static BYTE SMSSendFI;
static BYTE SMSSendFO;
static BYTE SMSReadFIFO[FIFO_READ_SIZE];
static BYTE SMSReadFI;
static BYTE SMSReadFO;
/********************************************************
GSM Public Define
********************************************************/
#define GSM_BLOCK_INTERVAL (TIMER_xS(60) / 2)
#define SMS_EMPTY_INTERVAL (TIMER_xS(60) * 5)
/********************************************************
GSM Public variabler
********************************************************/
static BYTE GSMRoundState;
static BYTE GSMRetryCount;
static UINT16 GSMDelayCount;
static UINT16 GSMDelayTimer;
static BYTE GSMSenseTimer;
static BYTE GSMCheckState;
static BYTE GSMCheckCount;
static BYTE GSMCheckError;
static BYTE GSMCheckTimer;
static BYTE GSMFuncReturn;
/********************************************************
GSM Send Command state variabler
********************************************************/
static BYTE GSMModemReply;
static BYTE GSMSendDataStep;
static BYTE GSMSendCommStep;
static BYTE GSMSendCommType;
static BYTE GSMSendCommPara;
static BYTE GSMReadCommPara;
/********************************************************
GSM Hardware state variabler
********************************************************/
static BYTE GSMPowerState;
static BYTE GSMSleepState;
static BYTE GSMResetState;
static BYTE GSMSetupState;
/********************************************************
GSM Phone State variabler
********************************************************/
static BYTE GSMPhoneState;
static BYTE GSMPhonePhase;
static BYTE GSMPhoneTooth;
static BYTE GSMPhoneTimer;
static BYTE GSMPhoneValue;
static BYTE GSMPhoneReady;
/********************************************************
GSM - GPRS State variabler
********************************************************/
static BYTE GSMHelloState;
static BYTE GSMEnterState;
static BYTE GSMLeaveState;
static BYTE GSMRenetState;
static BYTE GSMCloseState;
static BYTE GSMClearState;
static BYTE GSMErrorState;
static BYTE GSMEnterCount; // GPRS Enter Steps
static BYTE GSMBreakCount; // GPRS broked by other
static BYTE GSMBlockState; // GPRS can't enter
static UINT16 GSMBlockTimer;
static BYTE GSMRadioState; // GPRS Phone call
static BYTE GSMCenterFlag;
static UINT16 GSMCenterPos1;
static UINT16 GSMCenterPos2;
static BYTE GSMPinRIState;
static BYTE GSMPinRICount;
/********************************************************
SMS - Public state variabler
********************************************************/
static BYTE SMSReadState;
static BYTE SMSSendState;
static BYTE SMSHeadState;
static BYTE SMSTailState;
static BYTE SMSReadIndex;
static BYTE SMSSendRetry;
static BYTE SMSEmptyIndex;
static BYTE SMSEmptyCount;
static UINT16 SMSEmptyTimer;
static BYTE SMSBlockState;
static BYTE SMSGuardState;
static BYTE SMSGuardData;
static BYTE SMSGuardWarn;
static UINT16 SMSSendInfo;
static BYTE SMSSendInfoHost;
static BYTE SMSSendInfoType;
/********************************************************
CGD - Public state variabler
********************************************************/
#define CGD_COUNT_MAX 5
static BYTE CGDCountState[CGD_COUNT_MAX];
static BYTE CGDCountIndex;
static BYTE CGDCountRetry;
/********************************************************
Public Misc variabler
********************************************************/
static BYTE *PtrTempAddr;
static BYTE *StrCurr;
static BYTE *StrNext;
static BYTE StrLineBuff[20];
/************************************************************************
* Init Code Start *
************************************************************************/
static void InitReadBuff(void)
{
GSMReadSize = 0;
GSMReadBuff[0] = 0;
}
static void InitSendBuff(void)
{
GSMSendSize = 0;
GSMSendBuff[0] = 0;
}
static void InitDataBuff(void)
{
}
static void InitUserBuff(void)
{
BYTE i;
InitReadBuff();
InitSendBuff();
InitDataBuff();
GSMPowerState = STATE_IDLE;
GSMSleepState = STATE_IDLE;
GSMResetState = STATE_IDLE;
GSMSetupState = STATE_IDLE;
GSMCheckState = STATE_IDLE;
GSMCheckCount = 0;
GSMCheckError = 0;
GSMPhoneState = STATE_IDLE;
GSMPhonePhase = GSM_PHONE_HANG;
GSMPhoneTooth = FALSE;
GSMHelloState = STATE_IDLE;
GSMEnterState = STATE_IDLE;
GSMLeaveState = STATE_IDLE;
GSMRenetState = STATE_IDLE;
GSMCloseState = STATE_IDLE;
GSMClearState = STATE_IDLE;
GSMSendDataStep = STATE_IDLE;
GSMSendCommStep = STATE_IDLE;
GSMCenterFlag = FALSE;
GSMBlockState = FALSE;
GSMBlockTimer = 0;
GSMEnterCount = 0;
GSMBreakCount = 0;
GSMRadioState = RADIO_IDLE;
GSMPinRIState = FALSE;
GSMPinRICount = 10;
SMSReadState = STATE_IDLE;
SMSSendState = STATE_IDLE;
SMSHeadState = STATE_IDLE;
SMSTailState = STATE_IDLE;
SMSReadIndex = 1;
SMSSendRetry = 5;
SMSSendFI = 0;
SMSSendFO = 0;
SMSReadFI = 0;
SMSReadFO = 0;
SMSGuardData = SMS_GRD_INIT;
SMSGuardWarn = SMS_GRD_INIT;
SMSEmptyIndex = 1;
SMSEmptyCount = 20;
SMSEmptyTimer = SMS_EMPTY_INTERVAL;
SMSBlockState = FALSE;
SMSGuardState = FALSE;
GSMInitGPRS = FALSE;
GSMLinkGPRS = FALSE;
#ifdef SUPPORT_TAXI_FUNCTION
GSMRingGPRS = FALSE;
#endif
for (i = 0; i < CGD_COUNT_MAX; i++) {
CGDCountState[i] = FALSE;
}
}
void GSMInitGPIO()
{
GSM_POWER_HI;
// Output mode
GPIO_G_SET(3, 1, 1 << (GSM_DTR - 48));
// GPIO_G_SET(2, 1, 1 << (GSM_CTS - 32));
GSM_DTR_HI;
// GSM_CTS_HI;
// Input mode
GPIO_G_SET(1, 0, 1 << (GSM_DSR - 16));
GPIO_G_SET(2, 0, 1 << (GSM_RI - 32));
// GPIO_G_SET(2, 0, 1 << (GSM_CTS - 32));
// GPIO_G_SET(2, 0, 1 << (GSM_RTS - 32));
InitUserBuff();
// GSMRoundState = GSM_POWER_PROC;
GSMRoundState = GSM_SLEEP_PROC;
}
/************************************************************************
* GSM Uart Code *
************************************************************************/
void GSMUsartSend(BYTE *Data, BYTE Len)
{
#ifdef SUPPORT_USART_SHOW
BYTE i;
#endif
if (Len) {
UartSend(Data, Len);
#ifdef SUPPORT_USART_SHOW
if (GSMRoundState == GSM_STATE_GPRS) {
for (i = 0; i < Len; i++) {
DBusEditSetColor(MAP_COLOR_BLUE);
psprintf(LineBuffer, "%02x", Data[i]);
DBusEditShowText(LineBuffer);
}
}
else
if (GSMRoundState != GSM_CHECK_PROC) {
strcpylen(LineBuffer, Data, Len);
DBusEditSetColor(MAP_COLOR_BLUE);
DBusEditShowText(LineBuffer);
}
#endif
}
}
BYTE GSMUsartRead()
{
return UartRecv(GSMReadBuff + GSMReadSize, UART_RECV_SIZE);
}
/************************************************************************
* GSM Read Usart Data *
* Read Usart Data from the GSM Module *
************************************************************************/
BYTE GSMReadUsart(void)
{
BYTE Size;
#ifdef SUPPORT_USART_SHOW
BYTE i;
#endif
Size = GSMUsartRead();
if (Size) {
#ifdef SUPPORT_USART_SHOW
if (GSMRoundState == GSM_STATE_GPRS) {
for (i = 0; i < Size; i++) {
DBusEditSetColor(MAP_COLOR_RED);
psprintf(LineBuffer, "%02x", GSMReadBuff[GSMReadSize + i]);
DBusEditShowText(LineBuffer);
}
}
else
if (GSMRoundState != GSM_CHECK_PROC) {
strcpylen(LineBuffer, GSMReadCurr, Size);
DBusEditShowText(LineBuffer);
}
#endif
GSMReadSize += Size;
GSMReadBuff[GSMReadSize] = NUL;
if (GSMReadSize >= GSM_READ_BUFF_SIZE - UART_RECV_SIZE) {
InitReadBuff();
}
}
return Size;
}
/************************************************************************
* GSM Wait Modem Reply *
* Wait Modem Reply from the GSM Module *
************************************************************************/
BYTE GSMReadModemSense(void)
{
UINT16 i;
UINT16 Len;
BYTE Num;
if (GSMReadUsart() || GSMSaveSize != GSMReadSize) {
GSMSaveSize = GSMReadSize;
GSMSenseTimer = TIMER_mS(200);
return IDLE;
}
if (GSMSenseTimer == 0) {
GSMSaveSize = 0;
if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMRING)) != NULL) {
memcopy(PtrTempAddr, PtrTempAddr + LenGSMRING,
GSMReadSize - (PtrTempAddr - GSMReadBuff) - LenGSMRING + 1);
GSMReadSize -= LenGSMRING;
#ifdef SUPPORT_USART_SHOW
psprintf(LineBuffer, "RING,");
DBusEditShowText(LineBuffer);
#endif
return RING;
}
if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMCMTI)) != NULL &&
(IsDigit(PtrTempAddr[LenGSMCMTI]))) {
Num = PtrTempAddr[LenGSMCMTI] - '0';
Len = LenGSMCMTI + 1 + 2;
if (IsDigit(PtrTempAddr[LenGSMCMTI + 1])) {
Num *= 10;
Num += PtrTempAddr[LenGSMCMTI + 1] - '0';
Len = LenGSMCMTI + 2 + 2;
}
if (PtrTempAddr[Len - 2] == CR && PtrTempAddr[Len - 1] == LF) {
memcopy(PtrTempAddr, PtrTempAddr + Len,
GSMReadSize - (PtrTempAddr - GSMReadBuff) - Len + 1);
GSMReadSize -= Len;
#ifdef SUPPORT_USART_SHOW
psprintf(LineBuffer, "CMTI:%02d,", Num);
DBusEditShowText(LineBuffer);
#endif
GSMReadCommPara = Num;
return CMTI;
}
}
if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMCLIP)) != NULL &&
(PtrTempAddr[LenGSMCLIP] == '\"')) {
GSMReadAddr = PtrTempAddr - GSMReadBuff;
for (i = GSMReadAddr + LenGSMCLIP + 2; i <= GSMReadSize; i++) {
if (GSMReadBuff[i - 2] == CR && GSMReadBuff[i - 1] == LF) {
GSMReadStop = i;
StrCurr = PtrTempAddr + LenGSMCLIP + 1;
if ((StrNext = strchr(StrCurr, '\"')) != NULL &&
(StrNext - StrCurr) <= LenGSMDailerTXT) {
strcpylen(StrGSMDailerTXT, StrCurr, StrNext - StrCurr);
#ifdef SUPPORT_USART_SHOW
psprintf(LineBuffer, "CLIP:%s,", StrGSMDailerTXT);
DBusEditShowText(LineBuffer);
#endif
memcopy(GSMReadBuff + GSMReadAddr,
GSMReadBuff + GSMReadStop, GSMReadSize - GSMReadStop + 1);
GSMReadSize -= GSMReadStop - GSMReadAddr;
return CLIP;
}
}
}
}
if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMECAV)) != NULL &&
(IsDigit(PtrTempAddr[LenGSMECAV]))) {
GSMReadAddr = PtrTempAddr - GSMReadBuff;
for (i = GSMReadAddr + LenGSMECAV + 2; i <= GSMReadSize; i++) {
if (GSMReadBuff[i - 2] == CR && GSMReadBuff[i - 1] == LF) {
GSMReadStop = i;
if (IsDigit(PtrTempAddr[LenGSMECAV + 2])) {
GSMPhoneValue = PtrTempAddr[LenGSMECAV + 2] - '0';
#ifdef SUPPORT_USART_SHOW
psprintf(LineBuffer, "ECAV:%d,", GSMPhoneValue);
DBusEditShowText(LineBuffer);
#endif
memcopy(GSMReadBuff + GSMReadAddr,
GSMReadBuff + GSMReadStop, GSMReadSize - GSMReadStop + 1);
GSMReadSize -= GSMReadStop - GSMReadAddr;
return ECAV;
}
}
}
}
if ((PtrTempAddr = strstr(GSMReadBuff, (BYTE *)cStrGSMOK)) != NULL) {
memcopy(PtrTempAddr, PtrTempAddr + LenGSMRING,
GSMReadSize - (PtrTempAddr - GSMReadBuff) - LenGSMOK + 1);
GSMReadSize -= LenGSMOK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -