Files
HBshuiwuConcentrator/hb/hbframe.c
2025-12-15 16:07:49 +08:00

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