📄 gsm.c
字号:
//-----------------------------------------------------------------------------
// gsm.c
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <reg52.h>
#include <string.h>
#include "cpu/cpu.h"
#include "main/main.h"
#include "ext/ds1307.h"
#include "comm/gsm.h"
#include "misc/misc.h"
#include "misc/general.h"
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
bit Check_Comm_Response ( char* p );
//-----------------------------------------------------------------------------
// External Interrupt 1 Routine
//-----------------------------------------------------------------------------
void Ext1_ISR (void) interrupt 2
{
char i;
pSTMsg msg;
if ( bComm == DEAL_END && Uart1_Rxd == LOW )
{
for ( i = 0; i < HEAD_LEN; i++ )
Comm_Buf [i] = Uart1_Receive_Byte ();
msg = ( pSTMsg ) Comm_Buf;
if ( MSG_TAG == msg->Tag1 && MSG_TAG == msg->Tag2 )
{
for ( ; i < ( HEAD_LEN + msg->Len2 + TAIL_LEN ); i++ )
Comm_Buf [i] = Uart1_Receive_Byte ();
bComm = NEW_DATA;
}
}
// IE1 = 0; // don't deal other interrupt request
// EX1 = 1; // open interrupt to maybe upadte just now
}
//-----------------------------------------------------------------------------
// Communication Protocol Response Routine
//-----------------------------------------------------------------------------
bit Check_Comm_Response ( char * p )
{
char i;
unsigned long ul;
pSTMsg msg;
msg = ( pSTMsg ) p;
p += HEAD_LEN;
if ( Buffer_Sum ( p, msg->Len2 ) != *( p + msg->Len2 )) return DEAL_END;
if ( memcmp ( p, f.City, sizeof( msg->Addr )) != 0 ) return DEAL_END;
if ( msg->Ctrl != MSG_CMD ) return DEAL_END;
switch ( msg->Type )
{
case READ_DATA:
msg->Len1 = msg->Len2 + sizeof( STData );
msg->u.Data.bStatus = STATUS;
if ( bWire == ERROR ) msg->u.Data.bStatus |= SENSOR_FAULT;
if ( bRCtrl == STOP ) msg->u.Data.bStatus |= PUMP_STOP;
if ( bDoor == OPEN ) msg->u.Data.bStatus |= DOOR_OPEN;
if ( bPump == ON ) msg->u.Data.bStatus |= I380_OFF;
msg->u.Data.Resvd = 0;
msg->u.Data.Total = Hex_BCD ( r.Total, 7 );
msg->u.Data.Flow = Hex_BCD ( f.Flow, 4 );
msg->u.Data.Remain = Hex_BCD ( r.Remain, 7 );
if ( bDue == TRUE )
msg->u.Data.Remain |= isDUE;
break;
case SET_CLOCK:
msg->Len1 = msg->Len2 - sizeof( STClock );
Set_Clock ( &msg->u.Clock );
break;
case GET_CLOCK:
msg->Len1 = msg->Len2 + sizeof( STClock );
Get_Clock ( &msg->u.Clock );
break;
case SET_BASIS:
if (( ul = BCD_Hex ( msg->u.mBasis, 7 )) >= TotalMax ) break;
else r.Total = ul;
f.Flow1 = (int) ul;
Mem_Fee_Update ();
break;
case CTRL_PUMP:
msg->Len1 += 1;
if ( msg->u.Cmd_Rtn[0] == PUMPON )
{
bRCtrl = START;
Relay_On ();
Run_LED = ON;
}
else if ( msg->u.Cmd_Rtn[0] == PUMPOFF )
{
bRCtrl = STOP;
Relay_Off ();
Run_LED = OFF;
}
msg->u.Cmd_Rtn[1] = SUCCESS;
break;
default:
return DEAL_END;
break;
}
msg->Len2 = msg->Len1;
msg->Ctrl = MSG_RTN;
*( p + msg->Len2 ) = Buffer_Sum ( p, msg->Len2 );
*( p + msg->Len2 + 1 ) = MSG_END;
for ( p = (char *) msg, i = 0; i < ( HEAD_LEN + msg->Len2 + TAIL_LEN ); i++ )
Uart1_Send_Byte ( *p++ );
return DEAL_END;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -