Files
g0b1vetx-board/Board/network/proto.c
T
2024-05-31 16:57:54 +08:00

240 lines
5.9 KiB
C

#include "proto.h"
#include "util.h"
#include "main.h"
#include "data.h"
#include "crc.h"
#include <ef_api.h>
#include <rtthread.h>
#include "data.h"
static int g_syn_number = 0;
// 打包数据帧
int PacketHeader (uint8_t func, char * data, int length, char * txbuff)
{
char * p;
char id [5];
p = ef_get_env ("device_id");
hexstr_to_hexbyte (p, id, 10);
int tx_size = 0;
uint16_t crc = 0;
txbuff[tx_size++] = 0x7E;
txbuff[tx_size++] = 0x7E;
txbuff[tx_size++] = 0x01;
txbuff[tx_size++] = 0xFF;
txbuff[tx_size++] = 0xFF;
for (int i = 0; i < 5; i++)
{
txbuff[tx_size++] = id[i];
}
txbuff[tx_size++] = func;
txbuff[tx_size++] = 0x00;
txbuff[tx_size++] = length;// 长度
txbuff[tx_size++] = _651_STX;
//dbg_printf ("sizeof (_651_U_Header_t):%d\r\n", tx_size);
for (int i = 0; i < length; i++)
{
txbuff[tx_size++] = data[i];
}
txbuff[tx_size++] = 0x03;
crc = MX_CRC_CALC ( (uint8_t *) txbuff, tx_size); //MX_;
txbuff[tx_size++] = (crc >> 8) & 0x00FF;
txbuff[tx_size++] = crc & 0x00FF;
return tx_size;
//
// 计算校验
}
// 均匀时段报
int PakcetTimerUp (int k, char * tx_data)
{
char * p;
char id [5];
p = ef_get_env ("device_id");
hexstr_to_hexbyte (p, id, 10);
int tx_size = 0;
g_syn_number ++;
Int intk;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
for (int i = 0; i < 6; i++)
{
tx_data[tx_size++] = 0;
}
for (int i = 0; i < 5; i++)
{
tx_data[tx_size++] = id[i];
}
tx_data[tx_size++] = 0x5A; //闸坝
for (int i = 0; i < 6; i++)
{
tx_data[tx_size++] = 0;
}
tx_data[tx_size++] = 0x30; // 编码要素
tx_data[tx_size++] = 0xFF; // 要素1 瞬时流速
tx_data[tx_size++] = 0x31; // 要素1 瞬时流速
tx_data[tx_size++] = 0xFF; // 要素1 瞬时流量
tx_data[tx_size++] = 0x32; // 要素1 瞬时流量
tx_data[tx_size++] = 0xFF; // 要素1 累计流量
tx_data[tx_size++] = 0x33; // 要素1 累计流量
tx_data[tx_size++] = 0xFF; // 要素1 闸门开度
tx_data[tx_size++] = 0x34; // 要素1 闸门开度
tx_data[tx_size++] = 0xFF; // 要素1 闸门荷重
tx_data[tx_size++] = 0x35; // 要素1 闸门荷重
tx_data[tx_size++] = 0xFF; // 要素1 累计流量
tx_data[tx_size++] = 0x36; // 要素1 累计流量
tx_data[tx_size++] = 0xFF; // 要素1 闸门开度
tx_data[tx_size++] = 0x37; // 要素1 闸门开度
tx_data[tx_size++] = 0xFF; // 要素1 闸门荷重
tx_data[tx_size++] = 0x38; // 要素1 闸门荷重
tx_data[tx_size++] = 0xFF; // 要素1 闸前水位
tx_data[tx_size++] = 0x39; // 要素1 闸前水位
intk.data = WaterData[0].thisSpeed * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = WaterData[0].thisFlow * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = WaterData[0].ttWater * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = SluiceData[k].gopen * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = (SluiceData[k].lload + SluiceData[k].rload) * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 要素6 最大开度
intk.data = ef_get_integer ("max_open") * 10; // 单位mm *10
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 要素7 电池电压
intk.data = 0 * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 要素8 机箱温度
intk.data = 0 * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 要素9 闸前水位
intk.data = WaterData[0].thisLevel;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
return tx_size;
}
// 闸门状态自报 闸门开度发生变化时上报
int PacketSluiceUp (int k, char * tx_data)
{
int tx_size = 0;
g_syn_number ++;
Int intk;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
tx_data[tx_size++] = 0x01;
tx_data[tx_size++] = 0x01;
// // 闸门开度
intk.data = SluiceData[k].gopen * 10;
rt_kprintf("gopen:%d\r\n");
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = (SluiceData[k].lload + SluiceData[k].rload) * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 闸前水位
intk.data = WaterData[0].thisLevel;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 瞬时流量
intk.data = 0 * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
return tx_size;
}
// 接受到提闸数据时,应答的ACK
int PacketSluiceAck (char* tx_data)
{
int tx_size = 0;
g_syn_number ++;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
for (int i = 0; i < 6; i++)
{
tx_data[tx_size++] = 0;
}
for (int i = 0; i < 5; i++)
{
tx_data[tx_size++] = 0xEE;
}
return tx_size;
}
int PacketAnsAck (char * tx_data)
{
int size = 0;
size = rt_sprintf (tx_data, "{\"result\":\"ok\"}");
return size;
}
int PacketUpRegist (char * tx_data)
{
int tx_size = rt_sprintf (tx_data, "{\"iccid\":\"%s\",\"version\":\"%s\"}", SysData.iccid, VERSION);
return tx_size ;
}