319 lines
5.6 KiB
C
319 lines
5.6 KiB
C
#include "uart.h"
|
|
#include "addr.h"
|
|
#include "debug_printf.h"
|
|
#include "bl24c512.h"
|
|
#include "WaterMetermanager.h"
|
|
#include "Led.h"
|
|
#include "keywd.h"
|
|
#include "update.h"
|
|
#include "Flash.h"
|
|
#include "PHY.h"
|
|
#include "rtc_ext.h"
|
|
#include "hbframe.h"
|
|
|
|
|
|
|
|
extern void gprs_recv_judge_timeset();
|
|
extern u8 * get_uart_recv();
|
|
extern u8 * get_uart_send();
|
|
extern u16 MODBUS_CRC16(u8 *updata, u16 len) ;
|
|
extern u16 get_crc(u8 * val,u16 len);
|
|
extern u8 * addr_get();
|
|
extern void rpprocess_recv_ack();
|
|
|
|
const u8 tmp[] = {0x7E,0x7E,0x01,0x13,0x10,0x02,0x00,0x28,0x12,0x34,0x32,0x00,0x3C,0x02,0x05,0xFD,0x20,0x12,0x19,0x01,0x30,0x00,0xF1,0xF1,0x13,0x10,0x02,0x00,0x28,0x49,0xF0,0xF0,0x20,0x12,0x19,0x01,0x10,0x28,0x2B,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x2A,0x00,0x02,0x67,0x03,0x00,0x60,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x20,0x00,0x00,0x00,0x01,0x38,0x12,0x00,0x00,0xFF,0x02,0x08,0x12,0x03};//,0x03,0x0B,0xB7
|
|
|
|
u8 send_buff[512];
|
|
u16 send_buff_len = 0;
|
|
u8 recv_buff[512];
|
|
u16 recv_buff_len = 0;
|
|
|
|
u8 recv_ana_buff1[512];
|
|
u16 recv_ana_buff_len1 = 0;
|
|
|
|
static u8 center_addr = 0x01;
|
|
static u8 hb_addr[6];
|
|
static u8 hb_dl_time[6];
|
|
static u16 password = 0x1234;
|
|
|
|
static u16 recvserial = 0;
|
|
static u16 sendserial = 1;
|
|
|
|
//将2个字节转换成 u16数字。
|
|
unsigned short hbu16fromp2(unsigned char * p2)
|
|
{
|
|
return (((p2[0]<<8) &0xFF00) + p2[1]);
|
|
}
|
|
|
|
//将u16数字转换成 2个字节。
|
|
void hbp2from16(unsigned char * p2,unsigned short val)
|
|
{
|
|
p2[1] = (val&0xFF);
|
|
p2[0] = ((val)>>8)&0xFF;
|
|
}
|
|
|
|
|
|
u16 get_send_serial()
|
|
{
|
|
sendserial ++;
|
|
return sendserial;
|
|
}
|
|
|
|
u16 get_recv_seral()
|
|
{
|
|
return recvserial;
|
|
}
|
|
|
|
void set_recv_seral(u16 serial)
|
|
{
|
|
recvserial = serial;
|
|
}
|
|
|
|
void set_dl_time()
|
|
{
|
|
}
|
|
|
|
/*
|
|
void test_crc()
|
|
{
|
|
// u16 cc = MODBUS_CRC16((u8*)tmp,sizeof(tmp));
|
|
u16 cc = get_crc((u8*)tmp,sizeof(tmp));
|
|
// u8 kk = 0;
|
|
}
|
|
*/
|
|
|
|
/*
|
|
得到中心地址
|
|
*/
|
|
u8 get_center_addr()
|
|
{
|
|
return center_addr;
|
|
}
|
|
|
|
/*
|
|
得到集中器地址
|
|
*/
|
|
u8 * get_hb_addr()
|
|
{
|
|
u8 * addr = addr_get();
|
|
u8 tmp[6];
|
|
|
|
u8 tmptmp[2] = {0};
|
|
|
|
MemCpy(tmp,addr,6);
|
|
MemCpy(hb_addr,addr,6);
|
|
|
|
hb_addr[0] = tmp[5];
|
|
hb_addr[1] = tmp[4];
|
|
hb_addr[2] = tmp[3];
|
|
hb_addr[3] = tmp[2];
|
|
hb_addr[4] = tmp[1];
|
|
|
|
tmptmp[0] = BCDToHex(hb_addr[3]);
|
|
tmptmp[1] = BCDToHex(hb_addr[4]);
|
|
|
|
u16 aa= tmptmp[0] * 100 + tmptmp[1];
|
|
|
|
hb_addr[3] = (aa>>8)&0xFF;
|
|
hb_addr[4] = (aa)&0xFF;
|
|
|
|
return hb_addr;
|
|
}
|
|
|
|
/*
|
|
得到密码
|
|
*/
|
|
u16 get_password()
|
|
{
|
|
return password;
|
|
}
|
|
|
|
|
|
|
|
void hb_setdl_time()
|
|
{
|
|
st_rtc_ext rtc_dat = {0x00};
|
|
|
|
|
|
read_rtc_time(&rtc_dat);
|
|
|
|
hb_dl_time[0] = rtc_dat.year;
|
|
hb_dl_time[1] = rtc_dat.month;
|
|
hb_dl_time[2] = rtc_dat.day;
|
|
if(rtc_dat.hour == 0x00)
|
|
{
|
|
hb_dl_time[3] = 0x23;
|
|
}
|
|
else
|
|
{
|
|
hb_dl_time[3] = rtc_dat.hour-1;
|
|
}
|
|
hb_dl_time[4] = 0x00;
|
|
hb_dl_time[5] = 0;
|
|
}
|
|
|
|
void hb_get_time(u8 * time)
|
|
{
|
|
st_rtc_ext rtc_dat = {0x00};
|
|
|
|
read_rtc_time(&rtc_dat);
|
|
|
|
time[0] = rtc_dat.year;
|
|
time[1] = rtc_dat.month;
|
|
time[2] = rtc_dat.day;
|
|
/*
|
|
if(rtc_dat.hour == 0x00)
|
|
{
|
|
time[3] = 0x23;
|
|
}
|
|
else
|
|
{
|
|
time[3] = rtc_dat.hour;
|
|
}
|
|
*/
|
|
|
|
time[3] = rtc_dat.hour;
|
|
time[4] = rtc_dat.min;
|
|
time[5] = 0;
|
|
}
|
|
|
|
|
|
u8 * hb_getdl_time()
|
|
{
|
|
return hb_dl_time;
|
|
}
|
|
|
|
|
|
bool hb_frame_recv()
|
|
{
|
|
u8 * p = get_uart_recv();
|
|
u8 * q = get_uart_send();
|
|
|
|
// u16 len = 0;
|
|
u8 fn = p[10];
|
|
|
|
// struct hb_struct * hb = (struct hb_struct *)p;
|
|
|
|
|
|
|
|
memset(send_buff,0,sizeof(send_buff));
|
|
|
|
switch(fn)
|
|
{
|
|
default:
|
|
break;
|
|
case AFN_RP_TIME: //0x32 遥测站定时报
|
|
gprs_recv_judge_timeset();
|
|
rpprocess_recv_ack();
|
|
break;
|
|
case AFN_RP_HOURTIME: //0x34 遥测站小时报
|
|
break;
|
|
case AFN_INIT: //0x47 初始化固态存储数据
|
|
break;
|
|
case AFN_RECOVER: //0x48 恢复终端出厂设置
|
|
break;
|
|
case AFN_MODIFY_PWD: //0x49 修改密码
|
|
break;
|
|
case AFN_SET_RTC: //0x4A 设置遥测站时钟
|
|
break;
|
|
case AFN_SET_ICCARD: //0x4B 设置遥测终端 IC 卡状态
|
|
break;
|
|
case AFN_CTL_SHUIBANG: //0x4C 控制水泵开关命令/水泵状态信息自报
|
|
break;
|
|
case AFN_CTL_FAMEN: //0x4D 控制阀门开关命令/阀门状态信息自报
|
|
break;
|
|
case AFN_CTL_ZAMEN: //0x4E 控制闸门开关命令/闸门状态信息自报
|
|
break;
|
|
case AFN_CTL_WATER_VALUE: //0x4F 水量定值控制命令
|
|
break;
|
|
case AFN_QRY_EVENT: //0x50 中心站查询遥测站事件记录
|
|
break;
|
|
case AFN_QRY_RTC: //0x51 中心站查询遥测站时钟
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void set_uart_recv(u8 * val,u16 len)
|
|
{
|
|
memmove(recv_buff,val,len);
|
|
recv_buff_len = len;
|
|
|
|
//将接收的序列号也放这里
|
|
|
|
//set_recvserial(U16From2(&val[3]));
|
|
}
|
|
|
|
void frame_process(u8 * val,u16 len)
|
|
{
|
|
|
|
memmove(recv_buff,val,len);
|
|
recv_buff_len = len;
|
|
|
|
set_uart_recv(val,len);
|
|
|
|
|
|
|
|
|
|
u8 * p = recv_buff;
|
|
|
|
u16 i = 0;
|
|
|
|
while(1)
|
|
{
|
|
|
|
u16 ck1 = 0;
|
|
u16 ck2 = 0;
|
|
if(0x7E == p[0] && 0x7E == p[1])
|
|
{
|
|
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
|
//7E 7E 01 00 00 00 00 01 0C 50 2F 00 08 02 00 02 12 12 07 08 56 50 03 22 8D
|
|
|
|
|
|
u16 tmplen = (p[11])<<8|p[12];
|
|
tmplen = tmplen&0xFFF;
|
|
|
|
tmplen = tmplen + 15+2;
|
|
ck1 = get_crc(&p[0],tmplen-2);
|
|
ck2 = hbu16fromp2(&p[tmplen-2]);
|
|
|
|
if(ck1 == ck2)
|
|
{
|
|
//仅仅只是替换用
|
|
memmove(recv_ana_buff1,recv_buff,recv_buff_len);
|
|
recv_ana_buff_len1 = recv_buff_len;
|
|
|
|
memmove(recv_buff,p,tmplen);
|
|
recv_buff_len = tmplen;
|
|
|
|
hb_frame_recv();
|
|
|
|
//处理完后,恢复
|
|
recv_buff_len = recv_ana_buff_len1;
|
|
memmove(recv_buff,recv_ana_buff1,recv_buff_len);
|
|
|
|
gprs_recv_judge_timeset();
|
|
p = p + tmplen;
|
|
i = i + tmplen;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
printf("[frame] crc err\r\n");
|
|
}
|
|
|
|
}
|
|
i++;
|
|
p++;
|
|
if(i>recv_buff_len)
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|