引入mqtt 引入cjson
This commit is contained in:
1 parent
a69c1a58d6
commit
f8591b8b99
72 files changed
+10319
-335
No files matched your search
@@ -0,0 +1,123 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include "usart-board.h"
|
||||
#include "data.h"
|
||||
#include "easyflash.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[1024];
|
||||
static struct rt_thread thread;
|
||||
|
||||
|
||||
void cfg_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_CONFIG_RX);
|
||||
}
|
||||
extern void shell_recover (void);
|
||||
static char tx_buff[1024];
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
int tx_size ;
|
||||
g_DebugDrv.rxdone = cfg_rx_done;
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
rt_kprintf ("config input\r\n");
|
||||
g_ifconfig = 1;
|
||||
char * p;
|
||||
char key[32], value[32];
|
||||
while (1)
|
||||
{
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_CONFIG_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
if (rt_memcmp ("config=envs\r\n", g_DebugDrv.rx_buffer, g_DebugDrv.rx_size) == 0) // 读取配置
|
||||
{
|
||||
MX_UART_PutBuffer (&g_DebugDrv, "config:\r\n", rt_strlen ("config:\r\n"));
|
||||
ef_print_env();
|
||||
}
|
||||
if (rt_memcmp ("config=exit\r\n", g_DebugDrv.rx_buffer, g_DebugDrv.rx_size) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (rt_memcmp ("config=fact\r\n", g_DebugDrv.rx_buffer, g_DebugDrv.rx_size) == 0)
|
||||
{
|
||||
ef_env_set_default();
|
||||
printf ("config fact\r\n");
|
||||
}
|
||||
if (rt_memcmp ("\r\nconfig\r\n", g_DebugDrv.rx_buffer, g_DebugDrv.rx_size) == 0)
|
||||
{
|
||||
MX_UART_PutBuffer (&g_DebugDrv, "config input\r\n", rt_strlen ("config input\r\n"));
|
||||
}
|
||||
if (rt_memcmp ("config=set\r\n", g_DebugDrv.rx_buffer, rt_strlen ("config=set\r\n")) == 0)
|
||||
{
|
||||
p = g_DebugDrv.rx_buffer;
|
||||
p = strtok (p, "\r\n");
|
||||
while (1)
|
||||
{
|
||||
if (p)
|
||||
{
|
||||
rt_memset (key, 0, 32);
|
||||
rt_memset (value, 0, 32);
|
||||
for (int i = 0; i < rt_strlen (p); i++)
|
||||
{
|
||||
if (p[i] == '=')
|
||||
{
|
||||
rt_sprintf (key, "%*.s", i, p);
|
||||
rt_sprintf (value, "%*.s", rt_strlen (p) - i - 1, &p[i + 1]);
|
||||
}
|
||||
}
|
||||
if (ef_get_env (key) != NULL)
|
||||
{
|
||||
ef_set_env (key, value);
|
||||
}
|
||||
|
||||
p = strtok (NULL, "\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
//ef_save_env();
|
||||
printf ("config succ\r\n");
|
||||
}
|
||||
if (rt_memcmp ("\r\nreboot\r\n", g_DebugDrv.rx_buffer, g_DebugDrv.rx_size) == 0)
|
||||
{
|
||||
HAL_NVIC_SystemReset();
|
||||
}
|
||||
MX_UART_Clear (&g_DebugDrv);
|
||||
}
|
||||
rt_thread_delay (10);
|
||||
}
|
||||
shell_recover();
|
||||
g_ifconfig = 0;
|
||||
rt_kprintf ("config exit\r\n");
|
||||
}
|
||||
|
||||
|
||||
//char * WriteEasyFlash(char *p)
|
||||
//{
|
||||
// if ()
|
||||
//}
|
||||
|
||||
|
||||
void CFGThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&thread, "cfgthread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
CFG_THREAD_PRIORITY, CFG_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&thread);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,458 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include "usart-board.h"
|
||||
#include "disdefine.h"
|
||||
#include "data.h"
|
||||
#include "easyflash.h"
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread thread;
|
||||
|
||||
static struct
|
||||
{
|
||||
char userpwd[8];
|
||||
char syspwd[8];
|
||||
} s_driver;
|
||||
|
||||
|
||||
static void view_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_VIEW_RX);
|
||||
//rt_kprintf ("m4851_rx_done!\r\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int DisPreparePacket (DisDataType_t ddtt, char *buf, int maxLen)
|
||||
{
|
||||
int tx_size = 0;
|
||||
buf[tx_size++] = 0x5A;
|
||||
buf[tx_size++] = 0xA5;
|
||||
buf[tx_size++] = 0x00; // 数据长度
|
||||
switch (ddtt.type)
|
||||
{
|
||||
case DIS_TYPE_WD_INT:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Int.Byte[3]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[2]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_WD_FLOAT:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Float.Byte[3]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[2]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_SWPAGE:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = 0x00;
|
||||
buf[tx_size++] = 0x84;
|
||||
buf[tx_size++] = 0x5a;
|
||||
buf[tx_size++] = 0x01;
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_RD:
|
||||
{
|
||||
buf[tx_size++] = 0x83;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Len;
|
||||
break;
|
||||
}
|
||||
// 10 70 05 30 30 30 30 30 30 30 31 FF FF
|
||||
case DIS_TYPE_WD_BYTES:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
for (int i = 0; i < ddtt.Len; i++)
|
||||
{
|
||||
buf[tx_size++] = ddtt.bytes[i];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_WD_ICON:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
// for(int i =0;i <tx_size;i++)
|
||||
// {
|
||||
// dbg_printf("%X ",buf[i]);
|
||||
// }
|
||||
break;
|
||||
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
buf[2] = tx_size - 3;
|
||||
return tx_size;
|
||||
}
|
||||
|
||||
|
||||
static void disctrl_handle (char *data, int length)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
int index = 0, a = 0, tx_size ;
|
||||
uint16_t cmd, addr;
|
||||
char txbuf[100];
|
||||
cmd = data[index++];
|
||||
addr = ( (uint16_t) data[index] << 8) + (uint16_t) data[index + 1];
|
||||
index += 2; // 去掉地址
|
||||
index++;
|
||||
if (cmd == 0x83) // 屏幕上报的数据
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
// 5A A5 06 83 20 10 01 00 00
|
||||
case DIS_CMD_BTN_SLOP: // 开度提闸界面 - 执行
|
||||
{
|
||||
// 读取闸门高度
|
||||
ddtt.type = DIS_TYPE_RD;
|
||||
ddtt.Addr.addr = DIS_CNUM_SLSET;
|
||||
ddtt.Len = 2;
|
||||
// tx_size = DisPreparePacket (ddtt, txbuf, 100);
|
||||
// MX_UART_PutBuffer (&g_ViewDrv, txbuf, tx_size);
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_STOP: //急停
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DUP: // 调试界面上升
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// log1_printf ("DIS_CMD_BTN_DUP\r\n");
|
||||
// SluiceSetDCMotor (SMMotor, SLUICE_OPEN);
|
||||
// sSluiceDebug = SluiceUp;
|
||||
// s_debug_tx_timer = 1000;
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DDOWN: // 调试界面下降
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// log1_printf ("DIS_CMD_BTN_DDOWN\r\n");
|
||||
// SluiceSetDCMotor (SMMotor, SLUICE_CLOSE);
|
||||
// sSluiceDebug = SluiceDown;
|
||||
// s_debug_tx_timer = 1000;
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DSTOP: // 调试界面停止
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// SluiceDCMotorStop (SMMotor);
|
||||
// log1_printf ("DIS_CMD_BTN_DSTOP\r\n");
|
||||
// sSluiceDebug = SluiceStop;
|
||||
// s_debug_tx_timer = 0;
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DUNLOCK: // 调试界面解锁
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// RelayOpenDoor();
|
||||
// s_unlock_timerout = 5000;
|
||||
// log1_printf ("DIS_CMD_BTN_DUNLOCK\r\n");
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_CALC: // 调试界面计算
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// int prec = (s_MaxEcode - s_MinEcode) / SysInfo.SlMaxOpen;
|
||||
// SysSetEcodeData (s_MaxEcode, s_MinEcode, prec);
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_FACT:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// SysFactory();
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_REST:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// HAL_NVIC_SystemReset();
|
||||
break;
|
||||
}
|
||||
// 5A A5 0A 83 10 30 03 30 31 32 33 FF FF
|
||||
case DIS_CNUM_PASS:
|
||||
{
|
||||
rt_kprintf ("%s\r\n", &data[index]);
|
||||
if ( (rt_memcmp (&data[index], (char *) s_driver.userpwd, 6) == 1)) // 用户密码
|
||||
{
|
||||
|
||||
ddtt.type = DIS_TYPE_SWPAGE;
|
||||
ddtt.Int.Int = 0x0004;
|
||||
FifoWrite (&g_DisFifo, (unsigned char *) &ddtt, sizeof (ddtt));
|
||||
log1_printf ("Login Success\r\n");
|
||||
s_user_role = 0;
|
||||
}
|
||||
if ( (ty_compare_arry (&data[index], "898909", 6) == 1))
|
||||
{
|
||||
ddtt.type = DIS_TYPE_SWPAGE;
|
||||
ddtt.Int.Int = 0x0004;
|
||||
FifoWrite (&g_DisFifo, (unsigned char *) &ddtt, sizeof (ddtt));
|
||||
log1_printf ("Login Success\r\n");
|
||||
s_user_role = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// 设置闸门开度
|
||||
case DIS_CNUM_SLSET:
|
||||
{
|
||||
//if (s_user_role != 1)
|
||||
// break;
|
||||
// a = (uint16_t) data[index + 2] * 256 + (uint16_t) data[index + 3];
|
||||
// SluSetValveHeigthPercent (a);
|
||||
// log1_printf ("DIS_CMD_NUM_SLSET:%d\r\n", a);
|
||||
break;
|
||||
}
|
||||
// 83 10 70 05 30 30 30 31 30 30 30 31 FF FF
|
||||
case DIS_CASCII_DEVID: // 设置设备编码
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// char addr[4];
|
||||
// if (length != 14)
|
||||
// {
|
||||
// DisWriteDevid ( (char *) SysInfo.Addr, QUEUE);
|
||||
// break;
|
||||
// }
|
||||
// dbg_printf ("Addr:%s\r\n", &data[index]);
|
||||
// // 存储数据
|
||||
// hexstr_to_hexbyte (&data[index], addr, 8);
|
||||
// dbg_printf ("Addr:%X%X%X%X\r\n", addr[0], addr[1], addr[2], addr[3]);
|
||||
// // 存储数据
|
||||
// SysSetAddr (addr);
|
||||
break;
|
||||
}
|
||||
// 83 10 80 05 31 2E 31 2E 31 2E 31 FF FF 2E
|
||||
//设置远程ip
|
||||
case DIS_CASCII_IP:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// // memset()
|
||||
// SysSetRemoteIp ( (char *) &data[index], length - 7);
|
||||
// // hexstr_to_hexbyte (&data[index], addr, 4);
|
||||
break;
|
||||
}
|
||||
case DIS_CASCII_PORT:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// if (length != 8)
|
||||
// {
|
||||
// // DisWriteDevid (SysInfo.Addr, QUEUE);
|
||||
// DisWriteIpPort (SysInfo.remotePort, QUEUE);
|
||||
// return;
|
||||
// }
|
||||
// union
|
||||
// {
|
||||
// uint32_t Int;
|
||||
// uint8_t Byte[4];
|
||||
// } Int;
|
||||
// Int.Byte[3] = data[index++];
|
||||
// Int.Byte[2] = data[index++];
|
||||
// Int.Byte[1] = data[index++];
|
||||
// Int.Byte[0] = data[index++];
|
||||
// SysSetRemotePort (Int.Int);
|
||||
// dbg_printf ("port:%d\r\n", Int.Int);
|
||||
break;
|
||||
}
|
||||
case DIS_CASCII_PASS:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// if (length != 12)
|
||||
// {
|
||||
// DisWritePass (SysInfo.LoginPass, QUEUE);
|
||||
// return;
|
||||
// }
|
||||
// // 校验密码的合法性,只能出现数字
|
||||
// for (int i = 0; i < 6; i++)
|
||||
// {
|
||||
// if (data[index + i] > '9' || data[index + i] < '0')
|
||||
// {
|
||||
// DisWritePass (SysInfo.LoginPass, QUEUE);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// SysSetLoginPass ( (char *) &data[index], length - 6);
|
||||
break;
|
||||
}
|
||||
case DIS_CASCII_SLTYPE: // 闸门类型,包括伺服驱动器,直流驱动器
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// if (length != 8)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
break;
|
||||
}
|
||||
case DIS_CSPEED_SLSPEED: // 提闸速度,分为10级,直流驱动器提闸速度似乎没什么用,太小了都提不动
|
||||
{
|
||||
break;
|
||||
}
|
||||
//lcd:[83 10 D0 01 00 5A ]
|
||||
case DIS_CNUM_SLHEIGHT:
|
||||
{
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// union
|
||||
// {
|
||||
// uint32_t Int;
|
||||
// uint8_t Byte[4];
|
||||
// } Int;
|
||||
// Int.Byte[3] = data[index++];
|
||||
// Int.Byte[2] = data[index++];
|
||||
// Int.Byte[1] = data[index++];
|
||||
// Int.Byte[0] = data[index++];
|
||||
// SysSetSlMaxOpen (Int.Int);
|
||||
// int prec = (s_MaxEcode - s_MinEcode) / SysInfo.SlMaxOpen;
|
||||
// SysSetEcodeData (s_MaxEcode, s_MinEcode, prec);
|
||||
|
||||
// dbg_printf ("Height:%d\r\n", Int.Int);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // 0x82
|
||||
{
|
||||
//rt_kprintf("0x82\r\n");
|
||||
switch (addr)
|
||||
{
|
||||
case DIS_CMD_DOW_SUCC:
|
||||
{
|
||||
// dbg_printf("DIS_CMD_DOW_SUCC\r\n");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern struct
|
||||
{
|
||||
uint32_t sopen; // 单位mm
|
||||
uint32_t gopen; // 单位mm
|
||||
uint32_t lload;
|
||||
uint32_t rload;
|
||||
uint32_t lastopen;
|
||||
uint32_t count;
|
||||
} Sluice1Data, Sluice2Data;
|
||||
|
||||
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
char tx_buf[128];
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
g_ViewDrv.rxdone = view_rx_done;
|
||||
g_ViewDrv.BaudRate = 115200;
|
||||
MX_UART_Init (&g_ViewDrv);
|
||||
char * p ;
|
||||
p = ef_get_env ("user_pass");
|
||||
rt_kprintf (s_driver.userpwd, "%s", p);
|
||||
p = ef_get_env ("sys_pass");
|
||||
rt_kprintf (s_driver.syspwd, "%s", p);
|
||||
while (1)
|
||||
{
|
||||
rt_thread_mdelay (10);
|
||||
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_VIEW_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 300, RT_NULL)) // 数据接受失败,上报异常状态
|
||||
{
|
||||
for (int i = 0; i < g_ViewDrv.rx_size; i++)
|
||||
{
|
||||
if (g_ViewDrv.rx_buffer[i] == 0x5A)
|
||||
{
|
||||
if ( (g_ViewDrv.rx_buffer[i] == 0x5A) || (g_ViewDrv.rx_buffer[i + 1] != 0xA5)) // 如果是1
|
||||
{
|
||||
int dataLen = g_ViewDrv.rx_buffer[i + 2];
|
||||
disctrl_handle (&g_ViewDrv.rx_buffer[i + 3], dataLen);
|
||||
}
|
||||
}
|
||||
}
|
||||
// if ((g_ViewDrv.rx_buffer[i] == 0x5A)
|
||||
// {
|
||||
// if (ty_compare_arry (&rxbuf[i], (char *) c_dis_cmd_head, 2) == 1) // 如果是1
|
||||
// {
|
||||
// dataLen = rxbuf[i + 2];
|
||||
// HandleDisBus (&rxbuf[i + 3], dataLen);
|
||||
// }
|
||||
// }
|
||||
// if ( (g_ViewDrv.rx_buffer[0] != 0x5A) || (g_ViewDrv.rx_buffer[0] != 0x5A))
|
||||
// {
|
||||
// rt_kprintf ("Header Error \r\n");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// disctrl_handle(g_ViewDrv.rx_buffer,g_ViewDrv.rx_size);
|
||||
// }
|
||||
//rt_kprintf ("data timeout\r\n");
|
||||
MX_UART_Clear (&g_ViewDrv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DisCtrlThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&thread, "disctrl_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
DISCTRL_THREAD_PRIORITY, DISCTRL_THREAD_TIMESLICE);
|
||||
|
||||
rt_thread_startup (&thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
#ifndef _DIS_DEFINE_H
|
||||
#define _DIS_DEFINE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define DIS_CNUM_SLOP 0X1000 // 闸门开度设定实际值
|
||||
#define DIS_CNUM_SPEED 0X1010 // 瞬时流速读取值
|
||||
#define DIS_CNUM_FLOW 0X1020 // 瞬时流量读取值
|
||||
#define DIS_CNUM_PASS 0X1030 // 登录密码读取值
|
||||
#define DIS_CNUM_SLSET 0X1040 // 闸门开度设置
|
||||
#define DIS_CNUM_TTFLOW 0X1050 // 累计流量读取值
|
||||
#define DIS_CNUM_SLGET 0X1060 // 闸门高度反馈
|
||||
|
||||
|
||||
#define DIS_CASCII_DEVID 0x1070 // 设备编码参数设置
|
||||
#define DIS_CASCII_IP 0x1080 // 远程地址
|
||||
#define DIS_CASCII_PORT 0x1090 // 远程端口
|
||||
#define DIS_CASCII_PASS 0x10A0 // 登录密码
|
||||
#define DIS_CASCII_SLTYPE 0x10B0 // 闸门类型
|
||||
#define DIS_CNUM_SLSPEED 0x10C0 // 闸门速度
|
||||
#define DIS_CNUM_SLHEIGHT 0x10D0 // 闸门高度
|
||||
#define DIS_CNUM_SLLOAD 0x10E0 // 荷重仪类型
|
||||
#define DIS_CNUM_SLLOADKEY 0x10F0 //荷重仪
|
||||
|
||||
|
||||
|
||||
#define DIS_CNUM_FLOW_ADDR 0x1110 // 流量计类型
|
||||
#define DIS_CNUM_FLOW_BUTE 0x1120 // 流量计类型
|
||||
#define DIS_CNUM_FLOW_MAX 0x1130 // 流量计类型
|
||||
#define DIS_CNUM_MAX_CODE 0x1140 // 最大编码
|
||||
#define DIS_CNUM_MIN_CODE 0x1150 // 最小编码
|
||||
#define DIS_CNUM_COF_CODE 0x1160 // 编码比例
|
||||
#define DIS_CNUM_FLOW_TYPE 0x1170 // 流量计类型
|
||||
|
||||
|
||||
|
||||
// 调试界面
|
||||
#define DIS_CNUM_DBG_ECODE 0x1180 //当前编码
|
||||
#define DIS_CNUM_DBG_OPEN 0x1190 //闸门开度
|
||||
#define DIS_CNUM_DBG_VOL 0x11A0 //母线电压
|
||||
#define DIS_CNUM_DBG_CUR 0x11B0 //当前电流
|
||||
#define DIS_CNUM_DBG_ERR 0x11C0 //报警代码
|
||||
|
||||
|
||||
// 按钮
|
||||
#define DIS_CMD_BTN_SLOP 0X2010 // 开度提闸界面 - 执行
|
||||
#define DIS_CMD_BTN_SMAX 0X2020 // 开度提闸界面 - 全开
|
||||
|
||||
#define DIS_CMD_BTN_OP 0X2030 // 菜单 开度提闸
|
||||
#define DIS_CMD_BTN_FL 0X2040 // 菜单 流量提闸
|
||||
#define DIS_CMD_BTN_PA 0X2050 // 菜单 参数设置
|
||||
#define DIS_CMD_BTN_DB 0X2070 // 菜单 设备调试
|
||||
#define DIS_CMD_BTN_ST 0X2080 // 菜单 设备状态
|
||||
// #define DIS_CMD_BTN_STOP 0X2090 // 急停
|
||||
|
||||
#define DIS_CMD_BTN_DUP 0X20B0 // 调试 上
|
||||
#define DIS_CMD_BTN_DDOWN 0X20C0 // 调试 下
|
||||
#define DIS_CMD_BTN_DSTOP 0X20D0 // 菜单 停止
|
||||
#define DIS_CMD_BTN_DUNLOCK 0X20E0 // 菜单 开锁
|
||||
#define DIS_CMD_BTN_SETMAX 0X20F0 // 菜单 设为最大
|
||||
#define DIS_CMD_BTN_FACT 0X2100 // 菜单 恢复出厂设置
|
||||
#define DIS_CMD_BTN_REST 0X2110 // 菜单 重启
|
||||
#define DIS_CMD_BTN_SETMIN 0X2120 // 菜单 设为最小
|
||||
|
||||
// 动态图标
|
||||
|
||||
#define DIS_CSTE_FLOW 0X3000 // 流量计状态
|
||||
#define DIS_CSTE_LOAD 0X3010 // 荷重仪状态
|
||||
#define DIS_CSTE_PLUS 0X3020 // 编码器状态
|
||||
#define DIS_CSTE_NET 0X3030 // 网络状态
|
||||
#define DIS_CSTE_MOTOR 0X3040 // 电机状态
|
||||
|
||||
#define DIS_CMD_DOW_SUCC 0X4F4A // "OK"
|
||||
|
||||
#define MOTOR_STE_STOP 0 // 电机停止
|
||||
#define MOTOR_STE_DOWN 1 // 电机下
|
||||
#define MOTOR_STE_UP 2 // 电机上
|
||||
|
||||
|
||||
|
||||
#define DIS_TYPE_WD_INT 0x00
|
||||
#define DIS_TYPE_WD_FLOAT 0x01
|
||||
#define DIS_TYPE_RD 0x02
|
||||
#define DIS_TYPE_SWPAGE 0x03
|
||||
#define DIS_TYPE_WD_BYTES 0x04
|
||||
#define DIS_TYPE_WD_ICON 0x05
|
||||
|
||||
#define DIS_STE_INVALID 0 // 无效的
|
||||
#define DIS_STE_SUCCSEE 1 // 成功 绿色
|
||||
#define DIS_STE_ERROR 2 // 错误 红色
|
||||
|
||||
// 类型定义
|
||||
|
||||
typedef struct DisDataType_t
|
||||
{
|
||||
uint8_t RW;
|
||||
uint8_t type;// 0:32整 ,1:32浮点,2:切换页面
|
||||
uint8_t Len;
|
||||
uint8_t bytes[32];
|
||||
union // 2:切换页面,地址无效
|
||||
{
|
||||
uint16_t addr;
|
||||
uint8_t Byte[2];
|
||||
} Addr;
|
||||
union //如果是切换页面,显示为页面ID
|
||||
{
|
||||
uint32_t Int;
|
||||
uint8_t Byte[4];
|
||||
} Int;
|
||||
union
|
||||
{
|
||||
float Float;
|
||||
uint8_t Byte[4];
|
||||
} Float;
|
||||
} DisDataType_t;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,667 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include "usart-board.h"
|
||||
#include "disdefine.h"
|
||||
#include "data.h"
|
||||
#include <ef_api.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread display_thread;
|
||||
|
||||
|
||||
static rt_timer_t timer;
|
||||
|
||||
static struct
|
||||
{
|
||||
char userpwd[8];
|
||||
char syspwd[8];
|
||||
char device_id[10];
|
||||
int identity;
|
||||
} s_driver;
|
||||
|
||||
static void view_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_VIEW_RX);
|
||||
//rt_kprintf ("m4851_rx_done!\r\n");
|
||||
}
|
||||
|
||||
|
||||
static void view_tx_data (uint8_t * data, uint16_t length)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_VIEW_RX);
|
||||
//rt_kprintf ("m4851_rx_done!\r\n");
|
||||
}
|
||||
static int timerout_timer = 0;
|
||||
static void timerouter (void * parameter)
|
||||
{
|
||||
TypeIndexMail_t mail;
|
||||
timerout_timer ++;
|
||||
if (timerout_timer > 100) // 超过90s 没有收到数据,重启网络
|
||||
{
|
||||
mail.Type = MAIL_VIEW_FLUSH;
|
||||
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
|
||||
timerout_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int DisPreparePacket (DisDataType_t ddtt, char *buf, int maxLen)
|
||||
{
|
||||
int tx_size = 0;
|
||||
buf[tx_size++] = 0x5A;
|
||||
buf[tx_size++] = 0xA5;
|
||||
buf[tx_size++] = 0x00; // 数据长度
|
||||
switch (ddtt.type)
|
||||
{
|
||||
case DIS_TYPE_WD_INT:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Int.Byte[3]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[2]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_WD_FLOAT:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Float.Byte[3]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[2]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Float.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_SWPAGE:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = 0x00;
|
||||
buf[tx_size++] = 0x84;
|
||||
buf[tx_size++] = 0x5a;
|
||||
buf[tx_size++] = 0x01;
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_RD:
|
||||
{
|
||||
buf[tx_size++] = 0x83;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Len;
|
||||
break;
|
||||
}
|
||||
// 10 70 05 30 30 30 30 30 30 30 31 FF FF
|
||||
case DIS_TYPE_WD_BYTES:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
for (int i = 0; i < ddtt.Len; i++)
|
||||
{
|
||||
buf[tx_size++] = ddtt.bytes[i];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DIS_TYPE_WD_ICON:
|
||||
{
|
||||
buf[tx_size++] = 0x82;
|
||||
buf[tx_size++] = ddtt.Addr.Byte[1]; // 寄存器地址高位
|
||||
buf[tx_size++] = ddtt.Addr.Byte[0]; // 寄存器地址高位
|
||||
|
||||
buf[tx_size++] = ddtt.Int.Byte[1]; // 寄存器数据高位
|
||||
buf[tx_size++] = ddtt.Int.Byte[0]; // 寄存器数据高位
|
||||
break;
|
||||
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
buf[2] = tx_size - 3;
|
||||
return tx_size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void disctrl_handle (char *data, int length)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
int index = 0, a = 0, tx_size ;
|
||||
uint16_t cmd, addr;
|
||||
char txbuf[100];
|
||||
char setstr[32];
|
||||
TypeIndexMail_t mail;
|
||||
cmd = data[index++];
|
||||
addr = ( (uint16_t) data[index] << 8) + (uint16_t) data[index + 1];
|
||||
index += 2; // 去掉地址
|
||||
index++;
|
||||
if (cmd == 0x83) // 屏幕上报的数据
|
||||
{
|
||||
rt_kprintf ("command:%04X\r\n", addr);
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
//
|
||||
// 5A A5 06 83 20 10 01 00 00
|
||||
case DIS_CMD_BTN_SLOP: // 开度提闸界面 - 执行
|
||||
{
|
||||
mail.Type = MAIL_VIEW_READSL;
|
||||
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
|
||||
//rt_event_send (gUIEvents, EVENT_VIEW_READSL);
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DUP: // 调试界面上升
|
||||
{
|
||||
mail.Type = MAIL_SLUICE_SUP;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DDOWN: // 调试界面下降
|
||||
{
|
||||
mail.Type = MAIL_SLUICE_SDW;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DSTOP: // 调试界面停止
|
||||
{
|
||||
mail.Type = MAIL_SLUICE_STP;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_DUNLOCK: // 调试界面解锁
|
||||
{
|
||||
if (s_driver.identity == 0) // 用户无此权限
|
||||
{
|
||||
break;
|
||||
}
|
||||
rt_event_send (gCtrlEvents, EVENT_CTRL_SET_UNLOCK); // 开锁
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_FACT:
|
||||
{
|
||||
if (s_driver.identity == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
ef_env_set_default();
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_REST:
|
||||
{
|
||||
if (s_driver.identity == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
HAL_NVIC_SystemReset();
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_SETMAX: // 设置为最大值
|
||||
{
|
||||
// 将最大值写入flash
|
||||
|
||||
rt_sprintf (setstr, "%d", SluiceData[0].ecode);
|
||||
ef_set_env ("max_ecode", setstr);
|
||||
|
||||
break;
|
||||
}
|
||||
case DIS_CMD_BTN_SETMIN: // 设置为最小值
|
||||
{
|
||||
rt_sprintf (setstr, "%d", SluiceData[0].ecode);
|
||||
ef_set_env ("min_ecode", setstr);
|
||||
break;
|
||||
}
|
||||
// 5A A5 0A 83 10 30 03 30 31 32 33 FF FF
|
||||
case DIS_CNUM_PASS:
|
||||
{
|
||||
if ( (rt_memcmp (&data[index], (char *) s_driver.userpwd, 6) == 0)) // 用户密码
|
||||
{
|
||||
s_driver.identity = 0;
|
||||
ddtt.type = DIS_TYPE_SWPAGE;
|
||||
ddtt.Int.Int = 0x0004;
|
||||
tx_size = DisPreparePacket (ddtt, txbuf, 100);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, txbuf, tx_size);
|
||||
}
|
||||
if ( (rt_memcmp (&data[index], (char *) s_driver.syspwd, 6) == 0)) // 用户密码
|
||||
{
|
||||
s_driver.identity = 1;
|
||||
ddtt.type = DIS_TYPE_SWPAGE;
|
||||
ddtt.Int.Int = 0x0004;
|
||||
tx_size = DisPreparePacket (ddtt, txbuf, 100);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, txbuf, tx_size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// 设置提闸开度
|
||||
case DIS_CNUM_SLSET:
|
||||
{
|
||||
a = (uint16_t) data[index + 2] * 256 + (uint16_t) data[index + 3];
|
||||
SluiceData[0].sopen = a * 10;
|
||||
//SluiceData[gMqttDrv.rx_index].sopen = datak / 10;
|
||||
mail.Type = MAIL_SLUICE_OPT;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
//rt_event_send (gCtrlEvents, EVENT_CTRL_SET_OPT_SLU);
|
||||
break;
|
||||
}
|
||||
// 83 10 70 05 30 30 30 31 30 30 30 31 FF FF
|
||||
case DIS_CASCII_DEVID: // 设置设备编码
|
||||
{
|
||||
if (s_driver.identity == 0) // 验证身份,不是管理员不允许修改参数
|
||||
{
|
||||
break;
|
||||
}
|
||||
//char addr[11];
|
||||
//rt_sprintf(addr, "%*.s", 10, &data[index]);
|
||||
ef_save_string ("device_id", &data[index], 10);
|
||||
break;
|
||||
}
|
||||
case DIS_CASCII_PASS:
|
||||
{
|
||||
if (s_driver.identity == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
// if (s_user_role != 1)
|
||||
// break;
|
||||
// if (length != 12)
|
||||
// {
|
||||
// DisWritePass (SysInfo.LoginPass, QUEUE);
|
||||
// return;
|
||||
// }
|
||||
// // 校验密码的合法性,只能出现数字
|
||||
// for (int i = 0; i < 6; i++)
|
||||
// {
|
||||
// if (data[index + i] > '9' || data[index + i] < '0')
|
||||
// {
|
||||
// DisWritePass (SysInfo.LoginPass, QUEUE);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// SysSetLoginPass ( (char *) &data[index], length - 6);
|
||||
break;
|
||||
}
|
||||
|
||||
// case DIS_CSPEED_SLSPEED: // 提闸速度,分为10级,直流驱动器提闸速度似乎没什么用,太小了都提不动
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
case DIS_CNUM_SLHEIGHT: // 修改最大开度
|
||||
{
|
||||
if (s_driver.identity == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
union
|
||||
{
|
||||
uint32_t Int;
|
||||
uint8_t Byte[4];
|
||||
} Int;
|
||||
Int.Byte[3] = data[index++];
|
||||
Int.Byte[2] = data[index++];
|
||||
Int.Byte[1] = data[index++];
|
||||
Int.Byte[0] = data[index++];
|
||||
rt_sprintf (setstr, "%d", Int.Int);
|
||||
ef_set_env ("max_open", setstr);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // 0x82
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case DIS_CMD_DOW_SUCC:
|
||||
{
|
||||
// dbg_printf("DIS_CMD_DOW_SUCC\r\n");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// 更新累计流量
|
||||
static void dis_write_ttflow (uint32_t ttflow)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_TTFLOW;
|
||||
ddtt.type = DIS_TYPE_WD_INT;
|
||||
ddtt.Int.Int = ttflow;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 更新瞬时流量
|
||||
static void dis_write_mmflow (float mmFlow)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_FLOW;
|
||||
ddtt.type = DIS_TYPE_WD_FLOAT;
|
||||
ddtt.Float.Float = mmFlow;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 更新瞬时流速
|
||||
static void dis_write_mmspeed (float mmSpeed)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_SPEED;
|
||||
ddtt.type = DIS_TYPE_WD_FLOAT;
|
||||
ddtt.Float.Float = mmSpeed;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 更新闸门开度
|
||||
void dis_write_open (float open)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_SLGET;
|
||||
ddtt.type = DIS_TYPE_WD_FLOAT;
|
||||
ddtt.Float.Float = open;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 更新闸门荷重
|
||||
void dis_write_load (float load)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_FLOAT;
|
||||
ddtt.Addr.addr = DIS_CNUM_SLLOADKEY;
|
||||
ddtt.Float.Float = load;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 更新编码器值
|
||||
void dis_write_code (uint32_t ecode)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_DBG_ECODE;
|
||||
ddtt.type = DIS_TYPE_WD_INT;
|
||||
ddtt.Int.Int = ecode;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
|
||||
// 闸门最大开度
|
||||
void dis_write_slmaxopen (uint32_t ecode)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.Addr.addr = DIS_CNUM_SLHEIGHT;
|
||||
ddtt.type = DIS_TYPE_WD_INT;
|
||||
ddtt.Int.Int = ecode;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
|
||||
// 发送给屏幕设备编号
|
||||
// 参数1:设备编号
|
||||
// 参数2:是否通过队列写入
|
||||
static void dis_write_divice_id (char * id)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_BYTES;
|
||||
ddtt.Addr.addr = DIS_CASCII_DEVID;
|
||||
ddtt.Len = 10;
|
||||
char * c = ef_get_env ("device_id");
|
||||
rt_memcpy (ddtt.bytes, c, 10);
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 发送给屏幕设备编号
|
||||
// 参数1:设备编号
|
||||
// 参数2:是否通过队列写入
|
||||
static void dis_write_ipaddr (char *ipaddr)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
// 2、 IP地址
|
||||
ddtt.type = DIS_TYPE_WD_BYTES;
|
||||
ddtt.Addr.addr = DIS_CASCII_IP;
|
||||
ddtt.Len = strlen (ipaddr);
|
||||
rt_sprintf (ddtt.bytes, "%s", ipaddr);
|
||||
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
// 发送给屏幕设备编号
|
||||
// 参数1:端口
|
||||
// 参数2:是否通过队列写入
|
||||
void dis_write_ipport (int port)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_INT;
|
||||
ddtt.Addr.addr = DIS_CASCII_PORT;
|
||||
ddtt.Int.Int = port;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 发送给屏幕登录密码
|
||||
// 参数1:端口
|
||||
// 参数2:是否通过队列写入
|
||||
void dis_write_usrpwd (char *pass)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_BYTES;
|
||||
ddtt.Addr.addr = DIS_CASCII_PASS;
|
||||
ddtt.Len = strlen (pass);
|
||||
rt_sprintf ( (char *) ddtt.bytes, "%s", pass);
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 修改网络状态
|
||||
void dis_write_net_ste (int ste)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_ICON;
|
||||
ddtt.Addr.addr = DIS_CSTE_NET;
|
||||
ddtt.Int.Int = ste;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 修改电机状态
|
||||
void dis_write_motor_ste (int ste, int isqueue)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_ICON;
|
||||
ddtt.Addr.addr = DIS_CSTE_MOTOR;
|
||||
ddtt.Int.Int = ste;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
// 修改编码器状态
|
||||
static void dis_write_plus_ste (int ste)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_ICON;
|
||||
ddtt.Addr.addr = DIS_CSTE_PLUS;
|
||||
ddtt.Int.Int = ste;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
// 切换页面
|
||||
static void dis_write_page (uint32_t Page)
|
||||
{
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_SWPAGE;
|
||||
ddtt.Int.Int = Page;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
|
||||
// 修改编码器状态
|
||||
void diw_write_load_ste (int ste)
|
||||
{
|
||||
|
||||
DisDataType_t ddtt;
|
||||
char tx_buf[128], p;
|
||||
ddtt.type = DIS_TYPE_WD_ICON;
|
||||
ddtt.Addr.addr = DIS_CSTE_LOAD;
|
||||
ddtt.Int.Int = ste;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
char tx_buf[128], p;
|
||||
DisDataType_t ddtt;
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
g_ViewDrv.rxdone = view_rx_done;
|
||||
g_ViewDrv.BaudRate = 115200;
|
||||
MX_UART_Init (&g_ViewDrv);
|
||||
TypeIndexMail_t mail;
|
||||
timer = rt_timer_create ("distimer", timerouter, RT_NULL, 10, RT_TIMER_FLAG_PERIODIC); // 异常检测定时器
|
||||
|
||||
char * s ;
|
||||
s = ef_get_env ("user_pass");
|
||||
rt_sprintf (s_driver.userpwd, "%s", s);
|
||||
s = ef_get_env ("sys_pass");
|
||||
rt_sprintf (s_driver.syspwd, "%s", s);
|
||||
s_driver.identity = 0;
|
||||
s = ef_get_env ("max_open");
|
||||
int32_t max_open = atoi (s);
|
||||
// 载入参数
|
||||
dis_write_divice_id ( (char *) s_driver.device_id);
|
||||
dis_write_ipaddr ("mqtt.zyjzjs.cn");
|
||||
dis_write_ipport (1883);
|
||||
dis_write_usrpwd ( (char *) s_driver.userpwd);
|
||||
dis_write_slmaxopen (max_open);
|
||||
dis_write_page (1); // 初始化完成,跳转到第一页显示
|
||||
dis_write_plus_ste (0);
|
||||
dis_write_net_ste (0);
|
||||
dis_write_load (0);
|
||||
dis_write_code (SluiceData[0].ecode);
|
||||
rt_timer_start (timer);
|
||||
while (1)
|
||||
{
|
||||
if (rt_mb_recv (gViewMail, (rt_ubase_t*) &mail, RT_WAITING_NO) == RT_EOK)
|
||||
{
|
||||
switch (mail.Type)
|
||||
{
|
||||
case MAIL_VIEW_FLUSH:
|
||||
// 刷新闸门开度
|
||||
dis_write_open ( (float) SluiceData[0].gopen / 10);
|
||||
dis_write_load (0);
|
||||
dis_write_mmflow (0);
|
||||
dis_write_mmspeed (0);
|
||||
dis_write_ttflow (0);
|
||||
dis_write_code (SluiceData[0].ecode);
|
||||
break;
|
||||
case MAIL_VIEW_READSL:
|
||||
ddtt.type = DIS_TYPE_RD;
|
||||
ddtt.Addr.addr = DIS_CNUM_SLSET;
|
||||
ddtt.Len = 2;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
break;
|
||||
case MAIL_VIEW_LOGIN: // 登录
|
||||
|
||||
break;
|
||||
case MAIL_VIEW_NET_STE:
|
||||
ddtt.type = DIS_TYPE_WD_ICON;
|
||||
ddtt.Addr.addr = DIS_CSTE_NET;
|
||||
ddtt.Int.Int = mail.index;
|
||||
p = DisPreparePacket (ddtt, tx_buf, 128);
|
||||
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 更新网络状态
|
||||
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_VIEW_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 300, RT_NULL)) // 数据接受失败,上报异常状态
|
||||
{
|
||||
for (int i = 0; i < g_ViewDrv.rx_size; i++)
|
||||
{
|
||||
if (g_ViewDrv.rx_buffer[i] == 0x5A)
|
||||
{
|
||||
if ( (g_ViewDrv.rx_buffer[i] == 0x5A) && (g_ViewDrv.rx_buffer[i + 1] == 0xA5)) // 如果是1
|
||||
{
|
||||
int dataLen = g_ViewDrv.rx_buffer[i + 2];
|
||||
disctrl_handle (&g_ViewDrv.rx_buffer[i + 3], dataLen);
|
||||
}
|
||||
}
|
||||
}
|
||||
MX_UART_Clear (&g_ViewDrv);
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
}
|
||||
}
|
||||
|
||||
void DisThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&display_thread, "display_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
U4851M_THREAD_PRIORITY, U4851M_THREAD_TIMESLICE);
|
||||
|
||||
rt_thread_startup (&display_thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
|
||||
|
||||
//#include "FreeRTOS.h"
|
||||
//#include "task.h"
|
||||
#include "main.h"
|
||||
#include "os-app.h"
|
||||
#include <stdio.h>
|
||||
#include "shell.h"
|
||||
#include "shellapp.h"
|
||||
#include <rtthread.h>
|
||||
#include <easyflash.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "mqtt-board.h"
|
||||
#include "data.h"
|
||||
uint32_t os_timer_count = 1;
|
||||
|
||||
|
||||
|
||||
#include <rtthread.h>
|
||||
rt_event_t gCtrlEvents;
|
||||
rt_event_t gUartEvents;
|
||||
//rt_event_t gUIEvents;
|
||||
rt_event_t gTrigEvents;
|
||||
//rt_event_t gCommEvents;
|
||||
|
||||
rt_mailbox_t gTCommMail;
|
||||
rt_mailbox_t gSluiceMail;
|
||||
rt_mailbox_t gCtrlMail;
|
||||
rt_mailbox_t gViewMail;
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[2048];
|
||||
static struct rt_thread os_app;
|
||||
|
||||
static rt_timer_t locktimer;
|
||||
static void locktimerouter (void* parameter)
|
||||
{
|
||||
// todo 关闭定时器
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
static void thread_entry (void *parameter)
|
||||
{
|
||||
// 创建控制事件组
|
||||
gCtrlEvents = rt_event_create ("Ctrl_Events", RT_IPC_FLAG_FIFO) ;
|
||||
/* 创建串口事件组*/
|
||||
gUartEvents = rt_event_create ("gUartEvents", RT_IPC_FLAG_FIFO) ;
|
||||
/* 创建串口事件组*/
|
||||
//gUIEvents = rt_event_create ("gUIEvents", RT_IPC_FLAG_FIFO) ;
|
||||
|
||||
/* 创建串口事件组*/
|
||||
gTrigEvents = rt_event_create ("gTrigEvents", RT_IPC_FLAG_FIFO) ;
|
||||
|
||||
// 创建网络传输邮箱
|
||||
gTCommMail = rt_mb_create ("gTCommMail", 32, RT_IPC_FLAG_FIFO);
|
||||
|
||||
// 创建网络传输邮箱
|
||||
gSluiceMail = rt_mb_create ("gSluiceMail", 32, RT_IPC_FLAG_FIFO);
|
||||
|
||||
// 创建控制传输邮箱
|
||||
gCtrlMail = rt_mb_create ("gCtrlMail", 32, RT_IPC_FLAG_FIFO);
|
||||
// 创建控制传输邮箱
|
||||
gViewMail = rt_mb_create ("gViewMail", 32, RT_IPC_FLAG_FIFO);
|
||||
|
||||
|
||||
//gCommEvents = rt_event_create ("gCommEvents", RT_IPC_FLAG_FIFO) ;
|
||||
|
||||
locktimer = rt_timer_create ("locktimer", locktimerouter, RT_NULL, 1000, RT_TIMER_FLAG_ONE_SHOT); // 异常检测定时器
|
||||
SluiceThreadStart(); // 闸门控制线程
|
||||
U4851ThreadStart(); // 4851采集线程
|
||||
U4852ThreadStart(); // 4852采集线程
|
||||
U4853ThreadStart(); // 4853采集线程
|
||||
NET_APPThreadStart(); // 网络线程
|
||||
DisThreadStart(); // UI 线程
|
||||
PROBUS_APPThreadStart();
|
||||
|
||||
uint32_t id1 = HAL_GetUIDw0();
|
||||
uint32_t id2 = HAL_GetUIDw1();
|
||||
uint32_t id3 = HAL_GetUIDw2();
|
||||
rt_kprintf ("ID:%X %X %X\r\n", id1, id2, id3);
|
||||
rt_kprintf ("Version:%s,%s\r\n",__DATE__,__TIME__);
|
||||
rt_kprintf ("os-app running !\r\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
rt_thread_mdelay (500);
|
||||
if (RT_EOK == rt_event_recv (gCtrlEvents, EVENT_CTRL_SET_UNLOCK, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 2000, RT_NULL)) // 数据接受失败,上报异常状态
|
||||
{
|
||||
// todo: 打开继电器,开启定时器
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_SET);
|
||||
rt_timer_start (locktimer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 线程示例 */
|
||||
int ThreadNewOsApp (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&os_app, "thread1",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
OS_APP_THREAD_PRIORITY, OS_APP_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&os_app);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OsShellTask (void * argument)
|
||||
{
|
||||
|
||||
while (1)
|
||||
{
|
||||
myshell_task();
|
||||
//osDelay(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
#ifndef _OS_APP_H
|
||||
#define _OS_APP_H
|
||||
#include "stdint.h"
|
||||
#include <rtthread.h>
|
||||
#include <time.h>
|
||||
|
||||
// OS-APP 线程
|
||||
#define OS_APP_THREAD_PRIORITY 25 // 优先级
|
||||
#define OS_APP_THREAD_TIMESLICE 5
|
||||
|
||||
// 阀门控制线程
|
||||
#define SLUICE_THREAD_PRIORITY 24 // 优先级
|
||||
#define SLUICE_THREAD_TIMESLICE 5
|
||||
|
||||
// 4851 主机线程
|
||||
#define U4851M_THREAD_PRIORITY 23 // 优先级
|
||||
#define U4851M_THREAD_TIMESLICE 5
|
||||
|
||||
// 4852 主机线程
|
||||
#define U4852M_THREAD_PRIORITY 22 // 优先级
|
||||
#define U4852M_THREAD_TIMESLICE 5
|
||||
|
||||
// 4853 主机线程
|
||||
#define U4853M_THREAD_PRIORITY 21 // 优先级
|
||||
#define U4853M_THREAD_TIMESLICE 5
|
||||
|
||||
// 网络线程
|
||||
#define NET_APP_THREAD_PRIORITY 20 // 优先级
|
||||
#define NET_APP_THREAD_TIMESLICE 5
|
||||
|
||||
// modbus 从机 用于实现modbus 程序
|
||||
#define PROBUS_APP_THREAD_PRIORITY 19 // 优先级
|
||||
#define PROBUS_APP_THREAD_TIMESLICE 5
|
||||
|
||||
// UI线程
|
||||
#define DIS_THREAD_PRIORITY 18 // 优先级
|
||||
#define DIS_THREAD_TIMESLICE 5
|
||||
|
||||
// DTU线程
|
||||
#define DTU_THREAD_PRIORITY 17 // 优先级
|
||||
#define DTU_THREAD_TIMESLICE 5
|
||||
|
||||
// DTU线程
|
||||
#define DTU2_THREAD_PRIORITY 16 // 优先级
|
||||
#define DTU2_THREAD_TIMESLICE 5
|
||||
|
||||
// MQTT线程
|
||||
#define MQTT_THREAD_PRIORITY 15 // 优先级
|
||||
#define MQTT_THREAD_TIMESLICE 5
|
||||
|
||||
// CAT1线程
|
||||
#define CAT1_THREAD_PRIORITY 14 // 优先级
|
||||
#define CAT1_THREAD_TIMESLICE 5
|
||||
|
||||
// CAT1线程
|
||||
#define ZS001_THREAD_PRIORITY 14 // 优先级
|
||||
#define ZS001_THREAD_TIMESLICE 5
|
||||
|
||||
// CAT1线程
|
||||
#define MJETH1_THREAD_PRIORITY 14 // 优先级
|
||||
#define MJETH1_THREAD_TIMESLICE 5
|
||||
|
||||
// UI线程
|
||||
#define CFG_THREAD_PRIORITY 13 // 优先级
|
||||
#define CFG_THREAD_TIMESLICE 5
|
||||
|
||||
// UI线程
|
||||
#define UPGRADE_THREAD_PRIORITY 12 // 优先级
|
||||
#define UPGRADE_THREAD_TIMESLICE 5
|
||||
|
||||
int ThreadNewOsApp (void);
|
||||
|
||||
void SluiceThreadStart (void);
|
||||
void U4851ThreadStart (void);
|
||||
void U4852ThreadStart (void);
|
||||
void U4853ThreadStart (void);
|
||||
|
||||
void NET_APPThreadStart (void);
|
||||
void DisThreadStart (void);
|
||||
|
||||
void DTUThreadStart (void);
|
||||
void PROBUS_APPThreadStart (void);//
|
||||
void CAT1ThreadStart (void);
|
||||
void ZS001ThreadStart (void);
|
||||
void MJEth1ThreadStart (void);
|
||||
void UpgradeThreadStart (void);
|
||||
|
||||
#define EVENT_CTRL_SET_OPT_SLU (1U<< 0) // 发送开度控制到提闸线程
|
||||
#define EVENT_CTRL_SET_STP_SLU (1U<< 1) // 发送停止控制到提闸线程
|
||||
#define EVENT_CTRL_SET_SUP_SLU (1U<< 2) // 发送上升控制到提闸线程
|
||||
#define EVENT_CTRL_SET_SDW_SLU (1U<< 3) // 发送下降控制到提闸线程
|
||||
|
||||
#define EVENT_CTRL_SET_OPT_CTT (1U<< 4) // 发送开度控制到控制层
|
||||
#define EVENT_CTRL_SET_STP_CTT (1U<< 5) // 发送停止控制到控制层
|
||||
#define EVENT_CTRL_SET_SUP_CTT (1U<< 6) // 发送上升控制到控制层
|
||||
#define EVENT_CTRL_SET_SDW_CTT (1U<< 7) // 发送下降控制到控制层
|
||||
#define EVENT_CTRL_SET_UNLOCK (1U<< 8) // 开锁
|
||||
|
||||
|
||||
#define EVENT_UART_4851_RX (1U << 0)
|
||||
#define EVENT_UART_4852_RX (1U << 1)
|
||||
#define EVENT_UART_4853_RX (1U << 2)
|
||||
#define EVENT_UART_VIEW_RX (1U << 3)
|
||||
#define EVENT_UART_DEBUG_RX (1U << 4)
|
||||
#define EVENT_UART_GSM_RX (1U << 5)
|
||||
#define EVENT_UART_ETH1_RX (1U << 6)
|
||||
#define EVENT_UART_ETH2_RX (1U << 7)
|
||||
#define EVENT_UART_LORA_RX (1U << 8)
|
||||
#define EVENT_UART_CONFIG_RX (1U << 9)
|
||||
|
||||
|
||||
#define EVENT_TRIG_NETMODE_TX1 (1U << 0) // 通过网络模块驱动发送数据
|
||||
#define EVENT_TRIG_NETMODE_RX1 (1U << 1)
|
||||
#define EVENT_TRIG_NETMODE_RST (1U << 2) // 重启网路模块
|
||||
#define EVENT_TRIG_MQTT_SUB (1U << 3) // 订阅成功
|
||||
#define EVENT_TRIG_MQTT_RST (1U << 4) // 重启网路模块
|
||||
#define EVENT_TRIG_MQTT_TX (1U << 5) // MQTT 发送数据
|
||||
#define EVENT_TRIG_COMM_RX (1U << 6) // MQTT 接受到数据
|
||||
#define EVENT_TRIG_COMM_RST (1U << 7) // MQTT 发送数据
|
||||
#define EVENT_TRIG_UPGRADE_RX (1U << 8) // MQTT 接受到数据
|
||||
|
||||
|
||||
#define MAIL_COMM_HEART 0
|
||||
#define MAIL_COMM_REGIST 1
|
||||
#define MAIL_COMM_STAND 2
|
||||
#define MAIL_COMM_SLUICE 3
|
||||
#define MAIL_COMM_UPACK 4 // 提闸的ACK
|
||||
#define MAIL_COMM_SLACK 5 // 其他的ACK
|
||||
#define MAIL_COMM_READPARA 6 // 读取参数
|
||||
|
||||
#define MAIL_SLUICE_OPT 0
|
||||
#define MAIL_SLUICE_STP 1
|
||||
#define MAIL_SLUICE_SUP 2
|
||||
#define MAIL_SLUICE_SDW 3
|
||||
|
||||
|
||||
#define MAIL_CT_OPT 0
|
||||
#define MAIL_CT_SUP 1
|
||||
#define MAIL_CT_SDW 2
|
||||
#define MAIL_CT_STP 3
|
||||
|
||||
#define MAIL_VIEW_LOGIN 1 // 登录成功 需要跳转页面
|
||||
#define MAIL_VIEW_FLUSH 2 // 刷新界面显示
|
||||
#define MAIL_VIEW_READSL 3 // 读取闸门开度
|
||||
#define MAIL_VIEW_COD_STE 4 // 更新编码器状态
|
||||
#define MAIL_VIEW_NET_STE 5 // 更新网络状态
|
||||
#define MAIL_VIEW_SLU_STE 6 // 更新闸门状态
|
||||
|
||||
|
||||
|
||||
extern rt_event_t gCtrlEvents;
|
||||
extern rt_event_t gUartEvents;
|
||||
extern rt_event_t gUIEvents; // 界面显示事件
|
||||
extern rt_event_t gTrigEvents; // 界面显示事件
|
||||
extern rt_event_t gCommEvents;
|
||||
|
||||
|
||||
extern rt_mailbox_t gTCommMail;
|
||||
extern rt_mailbox_t gCtrlMail;
|
||||
extern rt_mailbox_t gSluiceMail;
|
||||
extern rt_mailbox_t gViewMail;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "data.h"
|
||||
#include "math.h"
|
||||
#include "easyflash.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
// 两点法计算k,b
|
||||
//uint16_t math_k(uint32_t x0,uint32_t y0,uint32_t x1,uint32_t y1)
|
||||
//{
|
||||
// uint16_t k;
|
||||
// k = (y0-x0)/(y1-x1);
|
||||
// return k;
|
||||
//}
|
||||
|
||||
//uint16_t math_k(uint32_t x0,uint32_t y0,uint32_t x1,uint32_t y1)
|
||||
//{
|
||||
// uint16_t k;
|
||||
// k = (y0-x0)/(y1-x1);
|
||||
// return k;
|
||||
//}
|
||||
|
||||
//WaterLeveInfo_t Info = {
|
||||
// .Y[0] = 2,
|
||||
//};
|
||||
|
||||
|
||||
// 水位流量关系表
|
||||
//uint16_t WaterLeveCalc(int leve,int Open)
|
||||
//{
|
||||
// for (int i =0;i< 100;i++)
|
||||
// {
|
||||
// if (LeveInfo.X[i] > Open)
|
||||
// {
|
||||
// for (int j =0;j < 100;i++)
|
||||
// {
|
||||
// if (LeveInfo.Key[i].Y[j] >leve)
|
||||
// {
|
||||
// return LeveInfo.Key[i].Key[j];
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return 0;
|
||||
//}
|
||||
|
||||
|
||||
|
||||
int32_t ParShallCalc(int index,double leve)
|
||||
{
|
||||
char * p;
|
||||
double flow = 0;
|
||||
flow = ParShallTale[index].c * pow(leve,ParShallTale[index].m);
|
||||
return (int32_t )(flow *100);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef _SIM_FLOW_H
|
||||
#define _SIM_FLOW_H
|
||||
int32_t ParShallCalc(int index,double leve);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include "usart-board.h"
|
||||
#include "data.h"
|
||||
#include "easyflash.h"
|
||||
#include <string.h>
|
||||
#include "mqtt-board.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[2048];
|
||||
static struct rt_thread thread;
|
||||
|
||||
extern MqttDrv_t gMqttDrv;
|
||||
|
||||
|
||||
static void YmodemC (void)
|
||||
{
|
||||
gMqttDrv.txbuff[0] = 0x43;
|
||||
gMqttDrv.tx_size = 1;
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
}
|
||||
|
||||
static void YmodemAkc (void)
|
||||
{
|
||||
gMqttDrv.txbuff[0] = 0x06;
|
||||
gMqttDrv.tx_size = 1;
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
}
|
||||
static void YmodemNak (void)
|
||||
{
|
||||
gMqttDrv.txbuff[0] = 0x15;
|
||||
gMqttDrv.tx_size = 1;
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
}
|
||||
|
||||
static void YmodemFail (void)
|
||||
{
|
||||
gMqttDrv.txbuff[0] = 0x19;
|
||||
gMqttDrv.tx_size = 1;
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
}
|
||||
static void YmodemSucc (void)
|
||||
{
|
||||
gMqttDrv.txbuff[0] = 0x17;
|
||||
gMqttDrv.tx_size = 1;
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
}
|
||||
|
||||
static int file_size = 0;
|
||||
static char file_name[64];
|
||||
static int cur_size = 0;
|
||||
static char envbuf[128];
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
int tx_size ;
|
||||
int packet_index = 0;
|
||||
// 发送文件名给升级服务器
|
||||
gMqttDrv.tx_size = rt_sprintf (gMqttDrv.txbuff, "N %s,%d", SysData.fileName, 1024);
|
||||
gMqttDrv.tx_index = 0;
|
||||
MQTT_SendData();
|
||||
g_ifupdate = 1;
|
||||
packet_index = 0;
|
||||
cur_size = 0;
|
||||
char * p;
|
||||
while (g_ifupdate == 1)
|
||||
{
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_UPGRADE_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
switch (gMqttDrv.rx_size)
|
||||
{
|
||||
case 0x01:
|
||||
if (gMqttDrv.rxbuff[0] == 0x06)
|
||||
{
|
||||
YmodemC();
|
||||
}
|
||||
else if (gMqttDrv.rxbuff[0] == 0x04)
|
||||
{
|
||||
YmodemNak();
|
||||
rt_thread_mdelay (300);
|
||||
YmodemSucc();
|
||||
|
||||
ef_set_env("iap_need_copy_app","1");
|
||||
rt_sprintf(envbuf,"%d",file_size);
|
||||
ef_set_env("iap_copy_app_size",envbuf);
|
||||
ef_set_env("iap_app_filename",file_name);
|
||||
ef_save_env(); // 存储环境变量
|
||||
rt_kprintf("update Success\r\n");
|
||||
rt_thread_mdelay(2000);
|
||||
NVIC_SystemReset();
|
||||
g_ifupdate = 0;
|
||||
}
|
||||
break;
|
||||
case 133: // 第一包数据
|
||||
p = &gMqttDrv.rxbuff[3];
|
||||
rt_sprintf(file_name,"%s",p);
|
||||
p = p + strlen(p) +1;
|
||||
file_size = atoi(p);
|
||||
// 擦除备份区数据
|
||||
ef_erase_bak_app(file_size);
|
||||
YmodemAkc();
|
||||
rt_thread_mdelay (300);
|
||||
YmodemC();
|
||||
break;
|
||||
case 1029: // 数据包
|
||||
rt_kprintf ("1029packet,index:%d\r\n", gMqttDrv.rxbuff[1]);
|
||||
if (packet_index + 1 != gMqttDrv.rxbuff[1]) // 数据丢包,升级失败
|
||||
{
|
||||
YmodemFail();
|
||||
g_ifupdate = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 写程序到备份区
|
||||
ef_write_data_to_bak((uint8_t *)&gMqttDrv.rxbuff[3],1024,(size_t *)&cur_size,file_size);
|
||||
rt_kprintf("cursize:%d\r\n",cur_size) ;
|
||||
YmodemAkc();
|
||||
}
|
||||
packet_index++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
rt_thread_mdelay (100);
|
||||
}
|
||||
rt_kprintf ("upgrade end!\r\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
//char * WriteEasyFlash(char *p)
|
||||
//{
|
||||
// if ()
|
||||
//}
|
||||
|
||||
|
||||
void UpgradeThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&thread, "upgradethread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
UPGRADE_THREAD_PRIORITY, UPGRADE_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&thread);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#include "ao-board.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// //³õʼ»¯ 4-20 ma ͨµÀ
|
||||
void MX_AOInit (O4_20mA_t o)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef _AO_BOARD_H
|
||||
#define _AO_BOARD_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
typedef enum O4_20mA_t
|
||||
{
|
||||
O4_20mA1,
|
||||
O4_20mA2
|
||||
} O4_20mA_t;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
#include "data.h"
|
||||
#include <rtthread.h>
|
||||
|
||||
|
||||
|
||||
const StrIndex_t cDownDataType[] =
|
||||
{
|
||||
{"run",DownRun} ,
|
||||
{"stop",DownStop} ,
|
||||
{"open",DownOpen} ,
|
||||
{"close",DownClose} ,
|
||||
{"reg_ans",DownRegistAns} ,
|
||||
{"heart_ans",DownHeartAns},
|
||||
{"update",DownUpdate},
|
||||
{"reboot",DownReboot},
|
||||
{"config",DownConfig},
|
||||
{"read",DownRead}
|
||||
};
|
||||
|
||||
|
||||
|
||||
const StrIndex_t cSiteType[] =
|
||||
{
|
||||
{"sluice",SiteSluice} ,
|
||||
{"flow",SiteFlow} ,
|
||||
{"press",SiteSee} ,
|
||||
{"auto",SiteColl} ,
|
||||
{"trans",SiteServer} ,
|
||||
{"level",SiteLevel}
|
||||
};
|
||||
|
||||
|
||||
const StrIndex_t cMotorType[] =
|
||||
{
|
||||
{"mg1000",MT_MG_1000} ,
|
||||
{"qh100",MT_QH_V100} ,
|
||||
{"qh200",MT_QH_V200} ,
|
||||
{"zs100",MT_ZS_V100} ,
|
||||
{"dy100",MT_DY_V100} ,
|
||||
{"kg100",MT_KG_V100}
|
||||
};
|
||||
|
||||
const StrIndex_t c4851Type[] =
|
||||
{
|
||||
{"mg1000",ST_MG_1000} ,
|
||||
{"qh100",ST_QH_V100} ,
|
||||
{"qh200",ST_QH_V200} ,
|
||||
{"dy100",ST_DY_V100} ,
|
||||
{"kg100",ST_KG_V100} ,
|
||||
};
|
||||
|
||||
const StrIndex_t cU485Type[] =
|
||||
{
|
||||
{"modbus",0}
|
||||
};
|
||||
|
||||
const StrIndex_t c4852Type[] =
|
||||
{
|
||||
{"rds600",ST_RDS_600} ,
|
||||
{"tds300",ST_TDS_300} ,
|
||||
{"ht100",ST_HT_V100} ,
|
||||
{"zkjszk",ST_ZK_JSZK},
|
||||
{"djx100",ST_DJX_100},
|
||||
{"rds300",ST_RDS_300}
|
||||
};
|
||||
|
||||
|
||||
const ParShallInfo_t ParShallTale[] =
|
||||
{
|
||||
{.w = 0,.c = 0,.m = 0},
|
||||
{.w = 0.152, .c = 0.381, .m = 1.58 ,.minLeve = 0.03, .maxLeve = 0.45, .minFlow = 1.5/1000, .maxFlow = 100/1000},
|
||||
{.w = 0.25, .c = 0.561, .m = 1.513 ,.minLeve = 0.03, .maxLeve = 0.60, .minFlow = 3.0/1000, .maxFlow = 250/1000},
|
||||
{.w = 0.30, .c = 0.679, .m = 1.521 ,.minLeve = 0.03, .maxLeve = 0.75, .minFlow = 3.5/1000, .maxFlow = 400/1000},
|
||||
{.w = 0.45, .c = 1.038, .m = 1.537 ,.minLeve = 0.03, .maxLeve = 0.75, .minFlow = 4.5/1000, .maxFlow = 630/1000},
|
||||
{.w = 0.60, .c = 1.403, .m = 1.548 ,.minLeve = 0.05, .maxLeve = 0.75, .minFlow = 12.5/1000, .maxFlow = 850/1000},
|
||||
{.w = 0.75, .c = 1.772, .m = 1.557 ,.minLeve = 0.06, .maxLeve = 0.75, .minFlow = 25.0/1000, .maxFlow = 1100/1000},
|
||||
{.w = 0.90, .c = 2.147, .m = 1.565 ,.minLeve = 0.06, .maxLeve = 0.75, .minFlow = 30.0/1000, .maxFlow = 1250/1000},
|
||||
{.w = 1.00, .c = 2.397, .m = 1.569 ,.minLeve = 0.06, .maxLeve = 0.80, .minFlow = 30.0/1000, .maxFlow = 1500/1000},
|
||||
{.w = 1.20, .c = 2.904, .m = 1.577 ,.minLeve = 0.06, .maxLeve = 0.80, .minFlow = 35.0/1000, .maxFlow = 2000/1000},
|
||||
{.w = 1.50, .c = 3.668, .m = 1.586 ,.minLeve = 0.06, .maxLeve = 0.80, .minFlow = 45.0/1000, .maxFlow = 2500/1000},
|
||||
{.w = 1.80, .c = 4.440, .m = 1.593 ,.minLeve = 0.08, .maxLeve = 0.80, .minFlow = 80.0/1000, .maxFlow = 3000/1000},
|
||||
{.w = 2.10, .c = 5.222, .m = 1.599 ,.minLeve = 0.08, .maxLeve = 0.80, .minFlow = 95.0/1000, .maxFlow = 3600/1000},
|
||||
{.w = 2.40, .c = 6.004, .m = 1.605 ,.minLeve = 0.08, .maxLeve = 0.80, .minFlow = 100.0/1000, .maxFlow = 4000/1000},
|
||||
|
||||
{.w = 3.05, .c = 7.463, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.07, .minFlow = 0.16, .maxFlow = 8.28},
|
||||
{.w = 3.66, .c = 8.859, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.37, .minFlow = 0.19, .maxFlow = 14.68},
|
||||
{.w = 4.57, .c = 10.96, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.67, .minFlow = 0.23, .maxFlow = 25.04},
|
||||
{.w = 6.10, .c = 14.45, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.31, .maxFlow = 37.97},
|
||||
|
||||
{.w = 7.62, .c = 17.94, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.38, .maxFlow = 47.16},
|
||||
{.w = 9.14, .c = 21.44, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.46, .maxFlow = 56.33},
|
||||
{.w = 12.19, .c = 28.43, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.60, .maxFlow = 74.70},
|
||||
{.w = 15.24, .c = 35.41, .m = 1.6 ,.minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.75, .maxFlow = 93.04},
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
SluiceData_t SluiceData[SLUICE_COUTN];
|
||||
WaterData_t WaterData[WATER_COUTN];
|
||||
SysData_t SysData;
|
||||
|
||||
uint32_t g_ifconfig = 0;
|
||||
uint32_t g_ifupdate = 0;
|
||||
|
||||
|
||||
int cMotorGetType (char * str)
|
||||
{
|
||||
for (int i =0;i < sizeof(cMotorType)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
if (rt_memcmp(str,cMotorType[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return cMotorType[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int c4851GetType(char * str)
|
||||
{
|
||||
rt_kprintf("485 option count:%d\r\n",sizeof(c4851Type)/sizeof(StrIndex_t)) ;
|
||||
for (int i =0;i < sizeof(c4851Type)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
rt_kprintf("%s,%s\r\n",str,c4851Type[i].str) ;
|
||||
if (rt_memcmp(str,c4851Type[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return c4851Type[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int c4852GetType(char * str)
|
||||
{
|
||||
for (int i =0;i < sizeof(c4852Type)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
if (rt_memcmp(str,c4852Type[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return c4852Type[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int cU485GetType(char *str)
|
||||
{
|
||||
for (int i =0;i < sizeof(cU485Type)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
if (rt_memcmp(str,cU485Type[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return cU485Type[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int cDownType2Index(char * str)
|
||||
{
|
||||
for (int i =0;i < sizeof(cDownDataType)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
if (rt_memcmp(str,cDownDataType[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return cDownDataType[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cSiteType2Index(char * str)
|
||||
{
|
||||
for (int i =0;i < sizeof(cSiteType)/sizeof(StrIndex_t);i++)
|
||||
{
|
||||
if (rt_memcmp(str,cSiteType[i].str,rt_strlen(str)) == 0)
|
||||
{
|
||||
return cSiteType[i].index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+213
@@ -0,0 +1,213 @@
|
||||
#ifndef _DATA_H
|
||||
#define _DATA_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#define SLUICE_COUTN 1// 当前处理几口闸
|
||||
#define WATER_COUTN 6// 当前接入n个流量计
|
||||
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
|
||||
#define SLUCIE_EXEC_COUNT 20// 闸门异常时间
|
||||
|
||||
|
||||
#define VERSION "V2.0.1"
|
||||
|
||||
|
||||
|
||||
extern uint32_t g_ifconfig;
|
||||
extern uint32_t g_ifupdate;
|
||||
|
||||
typedef struct StrIndex_t
|
||||
{
|
||||
char str[10];
|
||||
int index;
|
||||
}StrIndex_t;
|
||||
|
||||
|
||||
// 巴歇尔槽流量计
|
||||
typedef struct ParShallInfo_t
|
||||
{
|
||||
double w; // 喉道宽
|
||||
double c;
|
||||
double m;
|
||||
double minLeve;
|
||||
double maxLeve;
|
||||
double minFlow;
|
||||
double maxFlow;
|
||||
}ParShallInfo_t;
|
||||
|
||||
|
||||
|
||||
typedef struct LeveInfo_t
|
||||
{
|
||||
uint16_t Y[100]; // 水位
|
||||
uint16_t Key[100]; // 流量
|
||||
}LeveInfo_t;
|
||||
// 水位流量关系表数据
|
||||
typedef struct WaterLeveInfo_t
|
||||
{
|
||||
uint16_t X[100]; // 单位 mm
|
||||
LeveInfo_t Key[100];
|
||||
}WaterLeveInfo_t;
|
||||
|
||||
|
||||
|
||||
// 闸门信息
|
||||
typedef struct SluiceData_t
|
||||
{
|
||||
int32_t gopen; // 读取到的开度 单位 mm / %0.1
|
||||
int32_t sopen; // 设定开度 单位 mm / %0.1
|
||||
int32_t lload; // 左荷重 单位 kg
|
||||
int32_t rload; // 右荷重 单位 kg
|
||||
int32_t ecode; // 编码器原始数据
|
||||
int32_t currt; // 设备电流
|
||||
} SluiceData_t;
|
||||
|
||||
|
||||
// 系统信息
|
||||
typedef struct SysData_t
|
||||
{
|
||||
uint32_t Vbat;// 电池电压
|
||||
char iccid[32] ;
|
||||
int16_t Csq;// 信号强度
|
||||
int netState; // 网络状态
|
||||
int ecdState; // 编码器状态
|
||||
int flowState;// 流量计状态
|
||||
int ldState; // 荷重状态
|
||||
int scram; // 急停被按下
|
||||
char fileName[64]; // 文件名
|
||||
int fileSize; // 文件大小
|
||||
} SysData_t;
|
||||
|
||||
|
||||
|
||||
|
||||
// 水量参数
|
||||
typedef struct WaterData_t
|
||||
{
|
||||
int64_t ttWater; // 累计流量 单位 m3
|
||||
int32_t thisFlow; // 瞬时流量 单位 m3
|
||||
int32_t thisLevel; // 水位
|
||||
int32_t thisSpeed; // 流速
|
||||
int32_t thisPress; // 压力
|
||||
int32_t thisTemp; // 温度
|
||||
} WaterData_t;
|
||||
|
||||
|
||||
|
||||
typedef enum Ctrl_Mode_t
|
||||
{
|
||||
CTRL_FOPEN = 0,
|
||||
CTRL_ZOPEN = 1
|
||||
}Ctrl_Mode_t;
|
||||
|
||||
|
||||
typedef enum MotorType_t
|
||||
{
|
||||
MT_MG_1000, // 米格1000
|
||||
MT_QH_V100, // 强华 1.0 版本
|
||||
MT_QH_V200, // 强华 2.0 版本
|
||||
MT_ZS_V100, // 中盛 4-20 ma
|
||||
MT_JZ_V200, // 金志 4-20 ma
|
||||
MT_DY_V100, // 大禹锥型阀
|
||||
MT_KG_V100, // 开关量模块
|
||||
MT_KR_V100, // 徐州正天闸位计
|
||||
} MotorType_t;
|
||||
|
||||
typedef enum S4851Type_t
|
||||
{
|
||||
ST_MG_1000, // 米格1000
|
||||
ST_QH_V100, // 强华 1.0 版本
|
||||
ST_QH_V200, // 强华 2.0 版本
|
||||
ST_AT_V100, // 奥图编码器
|
||||
ST_DY_V100, // 大禹锥形阀
|
||||
ST_KG_V100, // 开关量模块
|
||||
ST_KR_V100, // 徐州正天闸位计
|
||||
} S4851Type_t;
|
||||
|
||||
typedef enum S4852Type_t
|
||||
{
|
||||
ST_RDS_600, // rds600 雷达流速一体机
|
||||
ST_TDS_300, // tds300 超声波流量计
|
||||
ST_HT_V100, // 华天液位计
|
||||
ST_ZK_JSZK, // 精水中科多普勒
|
||||
ST_DJX_100, // 丁家峡闸门 读取开度
|
||||
ST_RDS_300, // 雷达流量计
|
||||
} S4852Type_t;
|
||||
|
||||
|
||||
typedef enum SOFTFLOWType_t
|
||||
{
|
||||
NONE,
|
||||
WATER,
|
||||
PARSHALL//
|
||||
}SOFTFLOWType_t;
|
||||
|
||||
|
||||
|
||||
typedef enum SiteType_t
|
||||
{
|
||||
SiteSluice, // 闸门站
|
||||
SiteFlow, // 流量站
|
||||
SiteSee, // 渗流渗压站
|
||||
SiteColl, // 采集站
|
||||
SiteServer, // 串口服务器
|
||||
SiteLevel // 水位站
|
||||
}SiteType_t;
|
||||
|
||||
|
||||
typedef enum DownDataType_t
|
||||
{
|
||||
DownRun = 0,
|
||||
DownStop = 1,
|
||||
DownOpen = 2,
|
||||
DownClose = 3,
|
||||
DownRegistAns = 4,
|
||||
DownHeartAns = 5, // 心跳
|
||||
DownUpdate = 6, // 升级
|
||||
DownReboot = 7, // 重启
|
||||
DownConfig = 8, // 修改参数
|
||||
DownRead = 9, // 读取参数
|
||||
}DownDataType_t;
|
||||
|
||||
|
||||
|
||||
extern const StrIndex_t cSiteType[];
|
||||
|
||||
// 通过邮箱传输给驱动层
|
||||
typedef struct TypeIndexMail_t
|
||||
{
|
||||
uint16_t Type;
|
||||
uint16_t index;
|
||||
}TypeIndexMail_t;
|
||||
|
||||
|
||||
|
||||
|
||||
extern SluiceData_t SluiceData[SLUICE_COUTN];
|
||||
extern WaterData_t WaterData[WATER_COUTN];
|
||||
extern SysData_t SysData;
|
||||
extern const WaterLeveInfo_t LeveInfo;
|
||||
extern const ParShallInfo_t ParShallTale[];
|
||||
|
||||
|
||||
int cMotorGetType (char * str);
|
||||
|
||||
|
||||
int c4851GetType(char * str);
|
||||
|
||||
int c4852GetType(char * str);
|
||||
|
||||
int cU485GetType(char *str);
|
||||
|
||||
// 读取控制模式
|
||||
int cCtrlGetType(char * str);
|
||||
|
||||
int cDownType2Index(char * str);
|
||||
|
||||
|
||||
int cSiteType2Index(char * str);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#include "do-board.h"
|
||||
#include "tim.h"
|
||||
|
||||
|
||||
|
||||
void MX_Dout_Push(int index,int pwm)
|
||||
{
|
||||
MX_TIM_SetDuty(index,pwm);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef _DO_BOARD_HH
|
||||
#define _DO_BOARD_HH
|
||||
|
||||
void MX_Dout_Push(int index, int pwm);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,307 @@
|
||||
#include <cat1drv.h>
|
||||
#include <rtthread.h>
|
||||
#include <os-app.h>
|
||||
#include "main.h"
|
||||
#include "usart-board.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <easyflash.h>
|
||||
#include "netdrv.h"
|
||||
#include "data.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "CAT1"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread netapp_thread;
|
||||
static char tcprxbbuff[1200];
|
||||
static char tcptxbbuff[1200];
|
||||
|
||||
|
||||
netDrv_t g_cat1Drv =
|
||||
{
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tcprxbbuff, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
tcptxbbuff, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void ec200_resp_csq_callback (char * data, uint16_t length)
|
||||
{
|
||||
char * p;
|
||||
p = strstr (data, "+CSQ:");
|
||||
p = p + 6;
|
||||
g_cat1Drv.Csq = atoi (p);
|
||||
rt_kprintf ("CSQ: <<< <%d>\r\n", g_cat1Drv.Csq);
|
||||
}
|
||||
|
||||
// 校准时间程序
|
||||
static void ec200_resp_qlts_callback (char * data, uint16_t length)
|
||||
{
|
||||
uint8_t k[6] = {NULL};
|
||||
char *p = NULL;
|
||||
p = strstr (data, "+QLTS:") ;
|
||||
p = p + 10;
|
||||
k[0] = atoi (p); // 年
|
||||
k[0] = (k[0] + (k[0] / 10) * 6) ; // 十进制转bcd码
|
||||
p = p + 3;
|
||||
k[1] = atoi (p); // 月
|
||||
k[1] = (k[1] + (k[1] / 10) * 6) ;
|
||||
p = p + 3;
|
||||
k[2] = atoi (p); // 日
|
||||
k[2] = (k[2] + (k[2] / 10) * 6) ;
|
||||
p = p + 3; // p
|
||||
k[3] = atoi (p); // 时
|
||||
k[3] = (k[3] + (k[3] / 10) * 6) ;
|
||||
p = p + 3; // p
|
||||
k[4] = atoi (p); // 分
|
||||
k[4] = (k[4] + (k[4] / 10) * 6) ;
|
||||
p = p + 3; // p
|
||||
k[5] = atoi (p); // 秒
|
||||
k[5] = (k[5] + (k[5] / 10) * 6) ;
|
||||
rt_kprintf ("20%02x-%02x-%02x %02x:%02x:%02x\r\n", k[0], k[1], k[2], k[3], k[4], k[5]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void ec200_resp_iccid_callback (char * data, uint16_t length)
|
||||
{
|
||||
char *p;
|
||||
p = strstr (data, "+QCCID:");
|
||||
p = p + 8;
|
||||
rt_memset (SysData.iccid, 0, 32);
|
||||
rt_memcpy (SysData.iccid, p, 20);
|
||||
rt_kprintf ("ICCID: <<< <%d> [%s]\r\n", length, SysData.iccid);
|
||||
}
|
||||
|
||||
static void ec200_resp_qird_callback (char * data, uint16_t length)
|
||||
{
|
||||
char * p;
|
||||
p = strstr (data, "+QIRD: ");
|
||||
p = p + 7;
|
||||
g_cat1Drv.rx_size = atoi (p);
|
||||
if (g_cat1Drv.rx_size > 0) // 读取到数据
|
||||
{
|
||||
p = strstr (p, "\r\n");
|
||||
p = p + 2;
|
||||
for (int i = 0; i < g_cat1Drv.rx_size; i++)
|
||||
{
|
||||
g_cat1Drv.rxbuff[i] = *p;
|
||||
p++;
|
||||
}
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RX1) ;
|
||||
// rt_kprintf("EVENT_TRIG_NETMODE_RX1\r\n");
|
||||
// for(int i =0 ;i < g_cat1Drv.rx_size;i++)
|
||||
// {
|
||||
// rt_kprintf("%02X ",g_cat1Drv.rxbuff[i]);
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// type 0 无需打包 1 需要重新打包
|
||||
const struct
|
||||
{
|
||||
char * cmd;
|
||||
char * ack;
|
||||
uint32_t delayms;
|
||||
uint32_t waitms;
|
||||
uint32_t retry;
|
||||
void (*call) (char *, uint16_t);
|
||||
} cat1list[] =
|
||||
{
|
||||
[ATE] = {"ATE0\r\n", "OK", 10, 2000, 10, NULL},
|
||||
[ATI] = {"ATI\r\n", "OK", 10, 2000, 3, NULL},
|
||||
[CPIN] = {"AT+CPIN?\r\n", "+CPIN: READY", 10, 2000, 10, NULL},
|
||||
// [CREG] = {"AT+CREG?\r\n", "+CREG: 0,1", 10, 2000, 30, NULL},
|
||||
// [CGREG] = {"AT+CGREG?\r\n", "+CGREG: 0,1", 10, 2000, 30, NULL},
|
||||
[CGATT] = {"AT+CGATT?\r\n", "+CGATT: 1", 10, 2000, 30, NULL},
|
||||
[CSQ] = {"AT+CSQ\r\n", "+CSQ:", 10, 2000, 1, ec200_resp_csq_callback},
|
||||
[QLTS] = {"AT+QLTS=2\r\n", "+QLTS:", 10, 2000, 1, ec200_resp_qlts_callback},
|
||||
[QCCID] = {"AT+QCCID\r\n", "+QCCID:", 10, 2000, 1, ec200_resp_iccid_callback},
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void cat1_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_GSM_RX);
|
||||
// for (int i = 0 ; i < g_GSMDrv.rx_size; i++)
|
||||
// {
|
||||
// rt_kprintf ("%c", g_GSMDrv.rx_buffer[i]);
|
||||
// }
|
||||
|
||||
// MX_UART_Clear (&g_GSMDrv);
|
||||
}
|
||||
|
||||
|
||||
// cat1 发送数据
|
||||
//0 : 结束,下一个
|
||||
//1 : 运行中,下一个
|
||||
static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char * ack, void (*call) (char *, uint16_t))
|
||||
{
|
||||
MX_UART_Clear (&g_GSMDrv);
|
||||
MX_UART_PutBuffer (&g_GSMDrv, tx, size);
|
||||
//rt_kprintf ("%.*s", size, tx) ;
|
||||
//timeout = cat1list[i].waitms;
|
||||
int timeout = time;
|
||||
while (timeout--)
|
||||
{
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
// rt_kprintf ("[%.*s]", g_GSMDrv.rx_size, g_GSMDrv.rx_buffer) ;
|
||||
if (NULL != rt_strstr ( (char *) g_GSMDrv.rx_buffer, ack))
|
||||
{
|
||||
if (call != NULL)
|
||||
{
|
||||
call ( (char *) g_GSMDrv.rx_buffer, g_GSMDrv.rx_size) ;
|
||||
}
|
||||
return RetSucc; // 成功
|
||||
}
|
||||
MX_UART_Clear (&g_GSMDrv);
|
||||
}
|
||||
rt_thread_mdelay (1);
|
||||
}
|
||||
return RetErr; // 超时
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
|
||||
char at_cmd[128] = {NULL};
|
||||
char ipaddr[32] = {NULL};
|
||||
int ipport;
|
||||
char *p;
|
||||
int retry = 0;
|
||||
|
||||
p = ef_get_env ("mqtt_addr");
|
||||
rt_strncpy (ipaddr, p, rt_strlen (p));
|
||||
p = ef_get_env ("mqtt_port");
|
||||
ipport = atoi (p);
|
||||
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
|
||||
g_GSMDrv.rxdone = cat1_rx_done;
|
||||
g_GSMDrv.BaudRate = 115200;
|
||||
// 启动4G 模块电源
|
||||
// 拉高4G 模块复位
|
||||
while (1)
|
||||
{
|
||||
CAT1RST:
|
||||
// 初始化串口,打开模块电源
|
||||
g_cat1Drv.State = Init;
|
||||
MX_UART_Init (&g_GSMDrv);
|
||||
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
|
||||
rt_thread_mdelay (3000);
|
||||
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_SET); // 开启4G
|
||||
rt_thread_mdelay (100);
|
||||
// 拉高模组复位
|
||||
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_RESET);
|
||||
rt_thread_mdelay (100);
|
||||
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (8000);
|
||||
for (int i = 0; i < MAXSETP; i++)
|
||||
{
|
||||
retry = cat1list[i].retry;
|
||||
while (1)
|
||||
{
|
||||
if (cat1_sendcmd_and_responce (cat1list[i].waitms, cat1list[i].cmd, strlen (cat1list[i].cmd), cat1list[i].ack, cat1list[i].call) == RetSucc)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
retry--;
|
||||
if (retry <= 0)
|
||||
{
|
||||
rt_kprintf ("Join Faild%d \r\n", i);
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
rt_kprintf ("Join Success \r\n");
|
||||
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
|
||||
if (cat1_sendcmd_and_responce (15000, at_cmd, strlen (at_cmd), "+QIOPEN: 0,0", NULL) == RetSucc)
|
||||
{
|
||||
g_cat1Drv.State = Conn;
|
||||
rt_kprintf ("Net is ready \r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf ("Net is Error \r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
// 发送数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发送数据
|
||||
{
|
||||
if (g_cat1Drv.txbuff != NULL)
|
||||
{
|
||||
rt_sprintf (at_cmd, "AT+QISEND=0,%d\r\n", g_cat1Drv.tx_size);
|
||||
rt_thread_mdelay (10);
|
||||
if (cat1_sendcmd_and_responce (1000, at_cmd, strlen (at_cmd), ">", NULL) != RetSucc)
|
||||
{
|
||||
rt_kprintf ("NET:+CME:ERROR QISEND\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
if (cat1_sendcmd_and_responce (3000, g_cat1Drv.txbuff, g_cat1Drv.tx_size, "SEND OK", NULL) != RetSucc)
|
||||
{
|
||||
rt_kprintf ("NET:+CME:ERROR QPUSH\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 读取数据
|
||||
rt_thread_mdelay (300);
|
||||
if (cat1_sendcmd_and_responce (1000, "AT+QIRD=0,1500\r\n", strlen ("AT+QIRD=0,1500\r\n"), "+QIRD:", ec200_resp_qird_callback) != RetSucc)
|
||||
{
|
||||
rt_kprintf ("NET:+CME:ERROR QIRD\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
rt_thread_mdelay (3000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void cat1_service_tx (char * buff, int size)
|
||||
{
|
||||
rt_memcpy (g_cat1Drv.txbuff, buff, size);
|
||||
g_cat1Drv.tx_size = size;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX1) ;
|
||||
}
|
||||
|
||||
|
||||
void CAT1ThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry */
|
||||
rt_thread_init (&netapp_thread, "netapp_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
CAT1_THREAD_PRIORITY, CAT1_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&netapp_thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#ifndef _CAT1_DRV_H
|
||||
#define _CAT1_DRV_H
|
||||
|
||||
|
||||
// 定义CAT1 状态机器
|
||||
typedef enum
|
||||
{
|
||||
ATE,
|
||||
ATI,
|
||||
CPIN,
|
||||
// CREG,
|
||||
// CGREG,
|
||||
CGATT,
|
||||
CSQ,
|
||||
QLTS,
|
||||
QCCID,
|
||||
MAXSETP
|
||||
} EC200_SETUP_T;
|
||||
|
||||
|
||||
|
||||
|
||||
void cat1_service_tx (char * buff, int size);
|
||||
int cat1_is_connected (void);
|
||||
|
||||
#endif
|
||||
+78
-37
@@ -7,6 +7,11 @@
|
||||
#include <rtthread.h>
|
||||
#include <string.h>
|
||||
#include "usart-board.h"
|
||||
#include <MQTTPacket.h>
|
||||
#include "transport.h"
|
||||
#include "netdrv.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,23 +24,21 @@ ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[2048];
|
||||
static struct rt_thread dtu_thread;
|
||||
|
||||
static struct
|
||||
static char tx_buffer[512];
|
||||
static char rx_buffer[512];
|
||||
|
||||
|
||||
|
||||
netDrv_t g_dtuDrv =
|
||||
{
|
||||
uint32_t isConnected; // 连接成功
|
||||
|
||||
} g_dtuDrv ;
|
||||
|
||||
|
||||
|
||||
static enum
|
||||
{
|
||||
netDrvInit = 0, // 初始化网络驱动
|
||||
netDrvJoin = 1, // 等待网络注册成功
|
||||
netDrvSend = 2, // 发送数据
|
||||
netDrvRecv = 3, // 读取数据
|
||||
netDrvIdle = 4, // 读取数据
|
||||
} eDrvStatus;
|
||||
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tx_buffer, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
rx_buffer, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
};
|
||||
|
||||
|
||||
static void net_data_rxdone (void)
|
||||
@@ -47,36 +50,75 @@ static void net_data_rxdone(void)
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
// eDrvStatus = netDrvInit;
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
// gnetEvents = rt_event_create("gnetEvents", RT_IPC_FLAG_FIFO) ;
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
|
||||
HAL_GPIO_WritePin(ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(ETH_PW_GPIO_Port, ETH_PW_Pin, GPIO_PIN_SET);
|
||||
g_ETH1Drv.rxdone = net_data_rxdone;
|
||||
MX_UART_Init(&g_ETH1Drv);
|
||||
|
||||
// // 注册网络驱动
|
||||
// 注册网络驱动
|
||||
// MX_UART_Init(&g_ETH1Drv);
|
||||
while (1)
|
||||
{
|
||||
//MX_UART_PutBuffer(&g_ETH1Drv,"20140524",8);
|
||||
if( RT_EOK == rt_event_recv( gUartEvents, EVENT_UART_ETH1_RX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL ))
|
||||
MODE_RST:
|
||||
g_dtuDrv.State = Init;
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (8000);
|
||||
g_dtuDrv.State = Conn;
|
||||
while (1) // 判断是否链接成功
|
||||
{
|
||||
rt_kprintf("<<<<<<<<<<<<<<<<<<<<rx1:\r\n");
|
||||
for(int i =0; i < g_ETH1Drv.rx_size;i++)
|
||||
// 准备要上报数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) //
|
||||
{
|
||||
rt_kprintf("%02X ",g_ETH1Drv.rx_buffer[i]);
|
||||
//rt_kprintf("MODE_RST\r\n");
|
||||
MX_UART_PutBuffer (&g_ETH1Drv, g_dtuDrv.txbuff, g_dtuDrv.tx_size);
|
||||
// rt_kprintf("tx\r\n");
|
||||
// for(int i =0; i <g_dtuDrv.tx_size;i++ )
|
||||
// {
|
||||
// rt_kprintf("%02X ",g_dtuDrv.txbuff[i]);
|
||||
// }
|
||||
// rt_kprintf("\r\n");
|
||||
}
|
||||
rt_kprintf("\r\n");
|
||||
// 接受到数据
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH1_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
// rt_kprintf ("ETH1Rx:%d\r\n", g_ETH1Drv.rx_size);
|
||||
// for (int i = 0; i < g_ETH1Drv.rx_size; i++)
|
||||
// {
|
||||
// rt_kprintf ("%02X ", g_ETH1Drv.rx_buffer[i]);
|
||||
// }
|
||||
// rt_kprintf ("\r\n");
|
||||
rt_memcpy (g_dtuDrv.rxbuff, g_ETH1Drv.rx_buffer, g_ETH1Drv.rx_size);
|
||||
g_dtuDrv.rx_size = g_ETH1Drv.rx_size;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RX1) ;
|
||||
MX_UART_Clear (&g_ETH1Drv) ;
|
||||
}
|
||||
|
||||
|
||||
rt_thread_delay (100);
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
goto MODE_RST;
|
||||
}
|
||||
rt_thread_delay (100);
|
||||
// 读取IO 状态
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void dtu_service_tx (char * buff, int size)
|
||||
{
|
||||
rt_memcpy (g_dtuDrv.txbuff, buff, size);
|
||||
g_dtuDrv.tx_size = size;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX1) ;
|
||||
}
|
||||
|
||||
void dtu_netreset (void)
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RST) ;
|
||||
}
|
||||
|
||||
void DTUThreadStart (void)
|
||||
@@ -88,7 +130,6 @@ void DTUThreadStart (void)
|
||||
sizeof (thread_stack),
|
||||
DTU_THREAD_PRIORITY, DTU_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&dtu_thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
#ifndef _DTU_BOARD_H
|
||||
#define _DTU_BOARD_H
|
||||
|
||||
typedef struct {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void dtu_service_tx (char * buff, int size);
|
||||
void dtu_netreset (void);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#ifndef _DTU_BOARD_H
|
||||
#define _DTU_BOARD_H
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
#include "jsonpacket.h"
|
||||
#include "cjson.h"
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
#include "data.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define PROTO_VER "FF_V3.0"
|
||||
|
||||
extern char config_list[16][32];
|
||||
extern int config_list_size;
|
||||
|
||||
|
||||
// 5 分钟流量站数据上报
|
||||
int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
double dbl[6] = {3.14, 3.12, 3.33, 3.20, 3.12, 3.20};
|
||||
int length;
|
||||
char * p;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "vol", cJSON_CreateNumber (12.3)); // 表示电池电压
|
||||
cJSON_AddItemToObject (root, "temp", cJSON_CreateNumber (32.5)); // 表示流量计
|
||||
p = ef_get_env ("net_drv");
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
|
||||
p = ef_get_env ("iap_app_filename");
|
||||
//uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
|
||||
cJSON_AddItemToObject (root, "chancnt", cJSON_CreateNumber (1)); // 表示电池电压
|
||||
//cJSON_AddItemToObject (root, "chancnt", cJSON_CreateNumber (1)); // 表示电池电压
|
||||
// 瞬时流速
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisSpeed;
|
||||
}
|
||||
cJSON * ArrNumSpeed = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisspeed", ArrNumSpeed);
|
||||
|
||||
// 瞬时流量
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisFlow;
|
||||
}
|
||||
cJSON * ArrNumFlow = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisflow", ArrNumFlow);
|
||||
|
||||
// 累计流量
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].ttWater;
|
||||
}
|
||||
cJSON * ArrNumTtflow = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "ttflow", ArrNumTtflow);
|
||||
|
||||
// 当前水位
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisLevel;
|
||||
}
|
||||
cJSON * ArrNumLeve = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisLeve", ArrNumLeve);
|
||||
// 当前压力
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisPress;
|
||||
}
|
||||
cJSON * ArrNumPress = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thispress", ArrNumPress);
|
||||
|
||||
// 当前温度
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].ttWater;
|
||||
}
|
||||
cJSON * ArrNumTemp = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thistemp", ArrNumTemp);
|
||||
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
// 5分钟闸门站数据上报
|
||||
int JsonRegistDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
char * p;
|
||||
int length;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("regist")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
|
||||
p = ef_get_env ("net_drv");
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
|
||||
p = ef_get_env ("iap_app_filename");
|
||||
//uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
|
||||
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
// 5分钟闸门站数据上报
|
||||
int Json5MinSluiceDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
char * p;
|
||||
int length;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
|
||||
p = ef_get_env ("net_drv");
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
|
||||
p = ef_get_env ("iap_app_filename");
|
||||
//uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
|
||||
|
||||
// 添加闸门相关数据
|
||||
// 闸门当前开度
|
||||
cJSON_AddItemToObject (root, "thisopen", cJSON_CreateNumber (SluiceData[0].gopen)); // 表示电池电压
|
||||
// 闸门最大开度
|
||||
p = ef_get_env ("max_open");
|
||||
uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "maxopen", cJSON_CreateNumber (max_open));
|
||||
// 闸门A路荷重
|
||||
cJSON_AddItemToObject (root, "aload", cJSON_CreateNumber (SluiceData[0].lload));
|
||||
// 闸门B路荷重
|
||||
cJSON_AddItemToObject (root, "bload", cJSON_CreateNumber (SluiceData[0].rload));
|
||||
// 闸前水位
|
||||
cJSON_AddItemToObject (root, "thisleve", cJSON_CreateNumber (WaterData[0].thisLevel));
|
||||
// 闸门瞬时流速
|
||||
cJSON_AddItemToObject (root, "thisspeed", cJSON_CreateNumber (WaterData[0].thisSpeed));
|
||||
// 闸门累计流量
|
||||
cJSON_AddItemToObject (root, "thisflow", cJSON_CreateNumber (WaterData[0].thisFlow));
|
||||
// 闸门瞬时流量
|
||||
cJSON_AddItemToObject (root, "ttflow", cJSON_CreateNumber (WaterData[0].ttWater));
|
||||
// 闸门启动电流
|
||||
cJSON_AddItemToObject (root, "current", cJSON_CreateNumber (SluiceData[0].currt));
|
||||
// 闸门编码器最大值
|
||||
p = ef_get_env ("max_ecode");
|
||||
uint32_t max_code = atoi (p);
|
||||
|
||||
cJSON_AddItemToObject (root, "maxecode", cJSON_CreateNumber (max_code));
|
||||
p = ef_get_env ("min_ecode");
|
||||
uint32_t min_code = atoi (p);
|
||||
// 闸门编码器最小值
|
||||
cJSON_AddItemToObject (root, "minecode", cJSON_CreateNumber (min_code));
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
// 心跳包,需要应答
|
||||
int JsonHeartDatapacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
int length;
|
||||
char *p;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("heart")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ecdState", cJSON_CreateNumber (SysData.ecdState)); // 编码器状态
|
||||
cJSON_AddItemToObject (root, "flowState", cJSON_CreateNumber (SysData.flowState)); // 流量计状态
|
||||
cJSON_AddItemToObject (root, "ldState", cJSON_CreateNumber (SysData.ldState)); // 荷重仪状态
|
||||
cJSON_AddItemToObject (root, "scram", cJSON_CreateNumber (SysData.scram)); // 荷重仪状态
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
int JsonConfigReadDataPacket(uint8_t* buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
int length;
|
||||
char *p;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("read_config")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
|
||||
for (int i =0 ;i < config_list_size;i++)
|
||||
{
|
||||
p = ef_get_env (config_list[i]);
|
||||
cJSON_AddItemToObject (root, config_list[i], cJSON_CreateString (p)); // 表示流量计
|
||||
}
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
int JsonAckSuccPacket(char * buffer)
|
||||
{
|
||||
rt_sprintf(buffer,"{\"state\":\"ok\"}");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef _JSON_PACKET_H
|
||||
#define _JSON_PACKET_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// 5 分钟数据上报
|
||||
int Json5MinFlowDataPacket (uint8_t * buffer);
|
||||
|
||||
// 注册包数据 需要应答
|
||||
int JsonRegistDataPacket (uint8_t * buffer);
|
||||
// 心跳包,需要应答
|
||||
int JsonHeartDatapacket (uint8_t * buffer);
|
||||
|
||||
int Json5MinSluiceDataPacket (uint8_t * buffer);
|
||||
|
||||
int JsonConfigReadDataPacket(uint8_t* buffer);
|
||||
int JsonAckSuccPacket(char * buffer);
|
||||
#endif
|
||||
@@ -0,0 +1,106 @@
|
||||
#include "jsonunpack.h"
|
||||
#include "cjson.h"
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
#include "data.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
#include "data.h"
|
||||
#include "os-app.h"
|
||||
|
||||
char config_list[16][32] = {NULL};
|
||||
int config_list_size = 0;
|
||||
|
||||
|
||||
|
||||
void JsonUnPacket (int index, char *buff)
|
||||
{
|
||||
// 读取Json 数据类型
|
||||
char * packMsg = (char *) buff;
|
||||
cJSON *root = NULL, *list = NULL;
|
||||
root = cJSON_Parse (packMsg);
|
||||
DownDataType_t type = (DownDataType_t) 0;
|
||||
char * p, *key, *value;
|
||||
int list_size;
|
||||
TypeIndexMail_t mail;
|
||||
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "type"));
|
||||
type = (DownDataType_t) cDownType2Index (p);
|
||||
rt_kprintf("down :%s<%d>\r\n",p,type);
|
||||
switch (type)
|
||||
{
|
||||
case DownRun : // 开度提闸
|
||||
|
||||
// rt_kprintf ("open:%u mm/10\r\n", datak);
|
||||
|
||||
// //SluiceData[gMqttDrv.rx_index].opt = 1; // 执行操作闸门
|
||||
// SluiceData[gMqttDrv.rx_index - 1].sopen = datak / 10;
|
||||
// mail.Type = MAIL_SLUICE_OPT;
|
||||
// mail.index = gMqttDrv.rx_index - 1;
|
||||
// rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
|
||||
// // 回复应答
|
||||
// mail.Type = MAIL_COMM_SLACK;
|
||||
// mail.index = gMqttDrv.rx_index;
|
||||
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
case DownStop :
|
||||
break;
|
||||
case DownOpen :
|
||||
break;
|
||||
case DownClose :
|
||||
break;
|
||||
case DownRegistAns :
|
||||
break;
|
||||
case DownHeartAns :
|
||||
break;
|
||||
case DownUpdate :
|
||||
rt_memset (SysData.fileName, 0, 32);
|
||||
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "file"));
|
||||
rt_sprintf (SysData.fileName, "%s", p) ;
|
||||
// 启动升级线程
|
||||
// 回复应答
|
||||
mail.Type = MAIL_COMM_UPACK;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
rt_thread_mdelay (2000); // 等待2s 进入升级线程
|
||||
UpgradeThreadStart();
|
||||
break;
|
||||
case DownReboot :
|
||||
break;
|
||||
case DownConfig: // 设置参数
|
||||
// 读取参数列表
|
||||
list = cJSON_GetObjectItem (root, "list");
|
||||
list_size = cJSON_GetArraySize (list);
|
||||
for (int i = 0; i < list_size; i++)
|
||||
{
|
||||
key = cJSON_GetStringValue (cJSON_GetArrayItem (list, i));
|
||||
value = cJSON_GetStringValue (cJSON_GetObjectItem (root, key));
|
||||
if ( (ef_get_env (key) != NULL) && (value != NULL))
|
||||
{
|
||||
ef_set_env (key, value);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DownRead: // 读取参数
|
||||
list = cJSON_GetObjectItem (root, "list");
|
||||
config_list_size = cJSON_GetArraySize (list);
|
||||
for (int i = 0; i < config_list_size; i++)
|
||||
{
|
||||
key = cJSON_GetStringValue (cJSON_GetArrayItem (list, i));
|
||||
rt_sprintf(config_list[i],"%s",key);
|
||||
}
|
||||
mail.Type = MAIL_COMM_READPARA;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
// 读取参数列表
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
cJSON_Delete (root);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef _JSON_UNPACKET_H
|
||||
#define _JSON_UNPACKET_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
|
||||
|
||||
void JsonUnPacket (int index, char *buff);
|
||||
#endif
|
||||
@@ -0,0 +1,114 @@
|
||||
#include <cat1drv.h>
|
||||
#include <rtthread.h>
|
||||
#include <os-app.h>
|
||||
#include "main.h"
|
||||
#include "usart-board.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <easyflash.h>
|
||||
#include "netdrv.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "MJE1S2"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread thread;
|
||||
static char tcprxbbuff[1200];
|
||||
static char tcptxbbuff[1200];
|
||||
|
||||
|
||||
|
||||
netDrv_t g_MJEth1Drv =
|
||||
{
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tcprxbbuff, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
tcptxbbuff, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
};
|
||||
|
||||
|
||||
static void mje1s2f_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
|
||||
|
||||
|
||||
uint8_t low_leve = 0; // 高电平时间
|
||||
g_ETH1Drv.rxdone = mje1s2f_rx_done;
|
||||
g_ETH1Drv.BaudRate = 115200;
|
||||
// 启动4G 模块电源
|
||||
// 拉高4G 模块复位
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (3000);
|
||||
while (1)
|
||||
{
|
||||
MODE_RST:
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (3000);
|
||||
while (1) // 判断是否链接成功
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//// rt_kprintf("zs0010+++++++++++++++++++\r\n");
|
||||
// MX_UART_PutBuffer(&g_ETH1Drv,(char *)readip,13) ;
|
||||
//
|
||||
// 发送数据
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH1_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 2000, RT_NULL)) // 需要发送数据
|
||||
{
|
||||
for (int i = 0 ; i < g_ETH1Drv.rx_size; i++)
|
||||
{
|
||||
rt_kprintf ("%02X", g_ETH1Drv.rx_buffer[i]);
|
||||
}
|
||||
rt_kprintf ("\r\n");
|
||||
MX_UART_Clear (&g_ETH1Drv) ;
|
||||
}
|
||||
|
||||
rt_thread_mdelay (10);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void MJEth1ThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry */
|
||||
rt_thread_init (&thread, "mjeth1_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
MJETH1_THREAD_PRIORITY, MJETH1_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef _MJETH1_DRV_H
|
||||
#define _MJETH1_DRV_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,323 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include <string.h>
|
||||
#include "usart-board.h"
|
||||
#include <MQTTPacket.h>
|
||||
#include "transport.h"
|
||||
#include <easyflash.h>
|
||||
#include "mqtt-board.h"
|
||||
#include "netdrv.h"
|
||||
#include "stdlib.h"
|
||||
#include "data.h"
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "mqtt"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[2048];
|
||||
static struct rt_thread mqtt_thread;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static rt_timer_t timer;
|
||||
|
||||
static char mqtt_tx_buff[500];
|
||||
static char mqtt_rx_buff[500];
|
||||
|
||||
|
||||
|
||||
static enum {CONN = 1, DISC = 0} State = DISC;
|
||||
MqttDrv_t gMqttDrv =
|
||||
{
|
||||
.State = DISC,
|
||||
.txbuff = mqtt_tx_buff,
|
||||
.tx_size = 0,
|
||||
.tx_index = 0,
|
||||
.rxbuff = mqtt_rx_buff,
|
||||
.rx_size = 0,
|
||||
.rx_index = 0
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 定义mqtt 的数据存储buffer
|
||||
#define MQTT_BUFF_LENGTH 1500
|
||||
static uint8_t mqtt_buffer[MQTT_BUFF_LENGTH];
|
||||
|
||||
//static uint8_t mqtt_payload[1200];
|
||||
//// 定义mqtt消息的 数据长度
|
||||
//static int mqtt_payload_size = 0;
|
||||
// 定义mqtt消息的 数据长度
|
||||
static int mqtt_buflen = 0;
|
||||
// 定义qos
|
||||
static int qos[SUBTOPIC_COUNT + 1] = {0};
|
||||
// 定义message id
|
||||
static int message_id = 0;
|
||||
|
||||
// 定义mqtt 链接参数
|
||||
MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
|
||||
MQTTString subtopic[SUBTOPIC_COUNT + 1] = {MQTTString_initializer};
|
||||
MQTTString pubtopic[SUBTOPIC_COUNT + 1] = {MQTTString_initializer};
|
||||
char sub_topic_str[SUBTOPIC_COUNT + 1][64] = {NULL};
|
||||
char pub_topic_str[SUBTOPIC_COUNT + 1][64] = {NULL};
|
||||
char client_id_str[64] = {NULL};
|
||||
|
||||
|
||||
static char device_id[32] = {NULL}; // 设备编码
|
||||
static char user_topic[32] = {NULL}; // topic
|
||||
|
||||
static void net_data_rxdone (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
|
||||
}
|
||||
|
||||
static int timerout_timer = 0;
|
||||
static void timerouter (void * parameter)
|
||||
{
|
||||
timerout_timer ++;
|
||||
if (timerout_timer > 90) // 超过90s 没有收到数据,重启网络
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_RST);
|
||||
timerout_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
|
||||
int count = 0;
|
||||
// 初始化串口驱动
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
timer = rt_timer_create ("timer", timerouter, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); // 异常检测定时器
|
||||
// 读取配置文件
|
||||
char * p = ef_get_env ("device_id");
|
||||
rt_sprintf (device_id, "%s", p);
|
||||
p = ef_get_env ("mqtt_topic");
|
||||
rt_memcpy (user_topic, p, strlen (p));
|
||||
|
||||
int id = rand() % 1000;
|
||||
rt_sprintf (client_id_str, "GID_SLUICE_V2_220000%s", device_id) ;
|
||||
rt_kprintf ("clinet:%s\r\n", client_id_str);
|
||||
connectData.clientID.cstring = client_id_str;
|
||||
connectData.keepAliveInterval = 120;
|
||||
connectData.cleansession = 1;
|
||||
connectData.username.cstring = "admin";
|
||||
connectData.password.cstring = "admin";
|
||||
rt_sprintf (sub_topic_str[0], "device/%s/tx/220000%s", "update", device_id);
|
||||
rt_sprintf (pub_topic_str[0], "device/%s/rx/220000%s", "update", device_id);
|
||||
// 读取设备编码
|
||||
rt_sprintf (sub_topic_str[1], "device/%s/tx/220000%s", user_topic, device_id);
|
||||
rt_sprintf (pub_topic_str[1], "device/%s/rx/220000%s", user_topic, device_id);
|
||||
#if (SUBTOPIC_COUNT > 1)
|
||||
rt_sprintf (sub_topic_str[2], "device/%s/tx/2200002308170002", user_topic);
|
||||
rt_sprintf (pub_topic_str[2], "device/%s/rx/2200002308170002", user_topic);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < SUBTOPIC_COUNT + 1; i++)
|
||||
{
|
||||
subtopic[i].cstring = sub_topic_str[i];
|
||||
pubtopic[i].cstring = pub_topic_str[i];
|
||||
}
|
||||
|
||||
rt_timer_start (timer);
|
||||
while (1)
|
||||
{
|
||||
MQTTINIT:
|
||||
if (g_netDrv->State != Conn)
|
||||
{
|
||||
//rt_kprintf ("mqtt tcp-connected fail\r\n");
|
||||
rt_thread_delay (1000); // 延迟3s 等待模块连接TCP 服务成功
|
||||
goto MQTTINIT;
|
||||
}
|
||||
// 链接MQTT 服务器
|
||||
rt_kprintf ("mqtt connected\r\n");
|
||||
mqtt_buflen = MQTTSerialize_connect (mqtt_buffer, MQTT_BUFF_LENGTH, &connectData);
|
||||
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
|
||||
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
|
||||
{
|
||||
goto MQTTINIT;
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
if (MQTTPacket_read (mqtt_buffer, MQTT_BUFF_LENGTH, netdrv_getdata) == CONNACK)
|
||||
{
|
||||
unsigned char sessionPresent, connack_rc;
|
||||
if (MQTTDeserialize_connack (&sessionPresent, &connack_rc, mqtt_buffer, MQTT_BUFF_LENGTH) != 1 || connack_rc != 0)
|
||||
{
|
||||
rt_kprintf ("Unable to connect, return code %d\n", connack_rc);
|
||||
rt_thread_delay (3000);
|
||||
netdrv_clear();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf ("mqtt error");
|
||||
netdrv_clear();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
netdrv_clear();
|
||||
rt_kprintf ("connect to mqtt successful\n");
|
||||
// 订阅topic
|
||||
mqtt_buflen = MQTTSerialize_subscribe (mqtt_buffer, MQTT_BUFF_LENGTH, 0, message_id++, SUBTOPIC_COUNT + 1, subtopic, qos);
|
||||
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
|
||||
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
|
||||
{
|
||||
netdrv_clear();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
if (MQTTPacket_read (mqtt_buffer, MQTT_BUFF_LENGTH, netdrv_getdata) == SUBACK) /* wait for suback */
|
||||
{
|
||||
unsigned short submsgid;
|
||||
int subcount;
|
||||
int granted_qos;
|
||||
MQTTDeserialize_suback (&submsgid, 1, &subcount, &granted_qos, mqtt_buffer, MQTT_BUFF_LENGTH);
|
||||
if (granted_qos != 0)
|
||||
{
|
||||
rt_kprintf ("granted qos != 0, %d\n", granted_qos);
|
||||
netdrv_clear();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf ("sub topic faild\r\n");
|
||||
rt_thread_delay (1000);
|
||||
netdrv_clear();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
netdrv_clear();
|
||||
|
||||
rt_kprintf ("subtopic topic %s\r\n", subtopic[0].cstring);
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_SUB);
|
||||
netdrv_clear();
|
||||
rt_thread_delay (500);
|
||||
State = CONN;
|
||||
while (1)
|
||||
{
|
||||
// 接受到数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
if (MQTTPacket_read (mqtt_buffer, MQTT_BUFF_LENGTH, netdrv_getdata) == PUBLISH)
|
||||
{
|
||||
|
||||
unsigned char dup;
|
||||
int qos;
|
||||
unsigned char retained;
|
||||
unsigned short msgid;
|
||||
int payloadlen_in;
|
||||
unsigned char* payload_in;
|
||||
int rc;
|
||||
MQTTString receivedTopic;
|
||||
rc = MQTTDeserialize_publish (&dup, &qos, &retained, &msgid, &receivedTopic,
|
||||
&payload_in, &payloadlen_in, mqtt_buffer, MQTT_BUFF_LENGTH);
|
||||
rt_memcpy (gMqttDrv.rxbuff, payload_in, payloadlen_in) ;
|
||||
gMqttDrv.rx_size = payloadlen_in;
|
||||
//rt_memcpy(gMqttDrv.topic,receivedTopic.lenstring.data,receivedTopic.lenstring.len);
|
||||
|
||||
|
||||
for (int var = 0; var < SUBTOPIC_COUNT + 1; ++var)
|
||||
{
|
||||
if (rt_memcmp (subtopic[var].cstring, receivedTopic.lenstring.data, receivedTopic.lenstring.len) == 0)
|
||||
{
|
||||
gMqttDrv.rx_index = var;
|
||||
rt_kprintf ("recv from :%d,%*.s\r\n", gMqttDrv.rx_index, receivedTopic.lenstring.len, receivedTopic.lenstring.data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (gMqttDrv.rx_index == 0) // 0 通道为升级通道
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_UPGRADE_RX);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RX);
|
||||
}
|
||||
timerout_timer = 0;
|
||||
}
|
||||
netdrv_clear();
|
||||
}
|
||||
// 发送数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_TX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
mqtt_buflen = MQTTSerialize_publish (mqtt_buffer, MQTT_BUFF_LENGTH, 0, 0, 0, 0, pubtopic[gMqttDrv.tx_index], (uint8_t *) gMqttDrv.txbuff, gMqttDrv.tx_size);
|
||||
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
|
||||
}
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
rt_kprintf ("mqtt conn lost\r\n");
|
||||
netdrv_reset();
|
||||
State = DISC;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
|
||||
goto MQTTINIT;
|
||||
}
|
||||
// 网络链接丢失
|
||||
if (g_netDrv->State != Conn)
|
||||
{
|
||||
rt_kprintf ("mqtt conn lost\r\n");
|
||||
netdrv_reset();
|
||||
State = DISC;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
|
||||
goto MQTTINIT;
|
||||
}
|
||||
rt_thread_delay (100);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MQTT_SendData (void)
|
||||
{
|
||||
|
||||
// topic_index = index;
|
||||
//// rt_memcpy(mqtt_payload,data,size);
|
||||
//// mqtt_payload_size = size ;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_TX);
|
||||
}
|
||||
int MQTT_Subscribed (void)
|
||||
{
|
||||
return State;
|
||||
}
|
||||
|
||||
|
||||
void MQTTThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||||
rt_thread_init (&mqtt_thread, "mqtt_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
MQTT_THREAD_PRIORITY, MQTT_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&mqtt_thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void shell_mqtt_time (void)
|
||||
{
|
||||
rt_kprintf ("lost_timer:%u\r\n", timerout_timer) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef _MQTT__BOARD_H
|
||||
#define _MQTT__BOARD_H
|
||||
|
||||
|
||||
|
||||
void MQTTThreadStart (void);
|
||||
void MQTT_SendData (void);
|
||||
int MQTT_Subscribed (void);
|
||||
|
||||
|
||||
typedef struct MqttDrv_t
|
||||
{
|
||||
int State; // 订阅成功
|
||||
char * txbuff;
|
||||
int tx_size;
|
||||
uint8_t tx_index;
|
||||
char * rxbuff;
|
||||
int rx_size;
|
||||
uint8_t rx_index;// 接受数据的订阅
|
||||
} MqttDrv_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,161 @@
|
||||
#include <cat1drv.h>
|
||||
#include <rtthread.h>
|
||||
#include <os-app.h>
|
||||
#include "main.h"
|
||||
#include "usart-board.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <easyflash.h>
|
||||
#include "netdrv.h"
|
||||
#include "dtu-board.h"
|
||||
|
||||
extern netDrv_t g_cat1Drv;
|
||||
extern netDrv_t g_MJEth1Drv;
|
||||
extern netDrv_t g_dtuDrv;
|
||||
|
||||
|
||||
netDrv_t * g_netDrv;
|
||||
|
||||
|
||||
static int mysock = 0;
|
||||
static int offset = 0;
|
||||
|
||||
|
||||
|
||||
void netdrv_init (void)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
g_netDrv = &g_dtuDrv;
|
||||
DTUThreadStart();
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
g_netDrv = &g_cat1Drv;
|
||||
|
||||
CAT1ThreadStart();
|
||||
}
|
||||
// else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
// {
|
||||
// g_netDrv = &g_MJEth1Drv;
|
||||
// MJEth1ThreadStart();
|
||||
// }
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void netdrv_service_tx (uint8_t * data, int length)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
dtu_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
cat1_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void netdrv_reset (void)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
dtu_netreset();
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
//cat1_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int netdrv_getdata (unsigned char* buf, int count)
|
||||
{
|
||||
int tsize = 0;
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
if (offset + count > g_netDrv->rx_size)
|
||||
{
|
||||
tsize = g_netDrv->rx_size - offset;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
tsize = count;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
if (offset + count > g_netDrv->rx_size)
|
||||
{
|
||||
tsize = g_netDrv->rx_size - offset;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
tsize = count;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
offset += count;
|
||||
return tsize;
|
||||
}
|
||||
|
||||
|
||||
int netdrv_clear (void)
|
||||
{
|
||||
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
MX_UART_Clear (&g_ETH1Drv);
|
||||
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
//rt_memcpy(buf, &g_cat1Drv.rxbuff[offset], count);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
offset = 0;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
#ifndef _NET_DRV_H
|
||||
#define _NET_DRV_H
|
||||
|
||||
|
||||
typedef enum netDrvState_t
|
||||
{
|
||||
Init, // 初始化状态
|
||||
Join, // 入网
|
||||
Conn, // 入网成功
|
||||
Idle // 空闲
|
||||
} netDrvState_t;
|
||||
|
||||
typedef struct netDrv_t
|
||||
{
|
||||
int Csq;
|
||||
char Iccid[20];
|
||||
netDrvState_t State;
|
||||
char * rxbuff;
|
||||
int rx_size; // 接受到的tcp 数据缓存
|
||||
char * txbuff; // 发送的TCP 数据缓存
|
||||
int tx_size;
|
||||
} netDrv_t;
|
||||
|
||||
|
||||
typedef enum CommRet_T
|
||||
{
|
||||
RetSucc,
|
||||
RetErr
|
||||
} CommRet_T;
|
||||
|
||||
extern netDrv_t * g_netDrv;;
|
||||
|
||||
|
||||
void netdrv_service_tx (uint8_t * data, int length);
|
||||
int netdrv_getdata (uint8_t* buf, int count);
|
||||
int netdrv_clear (void);
|
||||
void netdrv_init (void);
|
||||
void netdrv_reset (void); // 网络链接失败,通知驱动重新启动网络模块
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,43 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "os-app.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
#include <string.h>
|
||||
#include "usart-board.h"
|
||||
|
||||
|
||||
void networkInit (void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 网络线程 mqtt 线程和 驱动都从这里走
|
||||
void networkthread_entry (void * argument)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "network"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef _NET_WORK_H
|
||||
#define _NET_WORK_H
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,238 @@
|
||||
#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;
|
||||
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 ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef _PROTO_H
|
||||
#define _PROTO_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// 上行统一使用M1模式,无确认
|
||||
// 下行统一使用M2模式一次确认
|
||||
|
||||
#define _651_STX 2
|
||||
#define _651_ETX 3
|
||||
#define _651_ETB 23
|
||||
|
||||
|
||||
|
||||
#pragma pack (1)
|
||||
typedef struct _651_U_Header_t
|
||||
{
|
||||
uint16_t Head;
|
||||
uint8_t CentAddr;
|
||||
uint8_t DeviAddr[5];
|
||||
uint16_t Pass;
|
||||
uint8_t FuncCode;
|
||||
uint16_t TypeLength;
|
||||
uint8_t Stx;
|
||||
} _651_U_Header_t;
|
||||
|
||||
typedef struct _651_D_Header_t
|
||||
{
|
||||
uint16_t Head;
|
||||
uint8_t DeviAddr[5];
|
||||
uint8_t CentAddr;
|
||||
uint16_t Pass;
|
||||
uint8_t FuncCode;
|
||||
uint16_t Type: 4;
|
||||
uint16_t Length: 12;
|
||||
uint8_t Stx;
|
||||
} _651_D_Header_t;
|
||||
#pragma pack ()
|
||||
|
||||
|
||||
|
||||
|
||||
// 打包数据帧
|
||||
int PacketHeader (uint8_t func, char * data, int length, char * txbuff);
|
||||
|
||||
// 均匀时段报
|
||||
int PakcetTimerUp (int k, char * tx_data);
|
||||
|
||||
// 闸门状态自报 闸门开度发生变化时上报
|
||||
int PacketSluiceUp (int k, char * tx_data);
|
||||
|
||||
// 接受到提闸数据时,应答的ACK
|
||||
int PacketSluiceAck (char* tx_data);
|
||||
|
||||
|
||||
int PacketAnsAck (char * tx_data);
|
||||
int PacketUpRegist (char * tx_data);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,132 @@
|
||||
#include <cat1drv.h>
|
||||
#include <rtthread.h>
|
||||
#include <os-app.h>
|
||||
#include "main.h"
|
||||
#include "usart-board.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <easyflash.h>
|
||||
#include "netdrv.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "CAT1"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread thread;
|
||||
static char tcprxbbuff[1200];
|
||||
static char tcptxbbuff[1200];
|
||||
|
||||
|
||||
static const uint8_t header[] = {0xed, 0xf2, 0xa3, 0x56, 0xca, 0xdb, 0x91, 0x84, 0xb0, 0xd7};
|
||||
static const uint8_t readip[] = {0xed, 0xf2, 0xa3, 0x56, 0xca, 0xdb, 0x91, 0x84, 0xb0, 0xd7, 0x00, 0x00, 0x04};
|
||||
|
||||
|
||||
netDrv_t g_ZS001Drv =
|
||||
{
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tcprxbbuff, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
tcptxbbuff, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
};
|
||||
|
||||
|
||||
static void zs001_rx_done (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int zs001_packet_commad (int type, int loc, int size, char * data)
|
||||
{
|
||||
int index = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
data[index++] = header[i];
|
||||
}
|
||||
data[index++] = type;
|
||||
data[index++] = loc;
|
||||
data[index++] = size;
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
|
||||
// char at_cmd[128] = {NULL};
|
||||
// char ipaddr[32] = {NULL};
|
||||
// int ipport;
|
||||
// char *p;
|
||||
// int retry = 0;
|
||||
|
||||
|
||||
|
||||
// char send_data[32];
|
||||
// int size = 0;
|
||||
// size = zs001_packet_commad(0,)
|
||||
// p = ef_get_env ("mqtt_addr");
|
||||
// rt_strncpy (ipaddr, p, rt_strlen (p));
|
||||
// p = ef_get_env ("mqtt_port");
|
||||
// ipport = atoi (p);
|
||||
//rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
|
||||
g_ETH1Drv.rxdone = zs001_rx_done;
|
||||
g_ETH1Drv.BaudRate = 115200;
|
||||
// 启动4G 模块电源
|
||||
// 拉高4G 模块复位
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (3000);
|
||||
while (1)
|
||||
{
|
||||
|
||||
// rt_kprintf("zs0010+++++++++++++++++++\r\n");
|
||||
MX_UART_PutBuffer (&g_ETH1Drv, (char *) readip, 13) ;
|
||||
|
||||
// 发送数据
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH1_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 2000, RT_NULL)) // 需要发送数据
|
||||
{
|
||||
for (int i = 0 ; i < g_ETH1Drv.rx_size; i++)
|
||||
{
|
||||
rt_kprintf ("%02X", g_ETH1Drv.rx_buffer[i]);
|
||||
}
|
||||
rt_kprintf ("\r\n");
|
||||
MX_UART_Clear (&g_ETH1Drv) ;
|
||||
}
|
||||
|
||||
rt_thread_mdelay (3000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void ZS001ThreadStart (void)
|
||||
{
|
||||
/* 创建线程1,名称是thread1,入口是thread1_entry */
|
||||
rt_thread_init (&thread, "zs001_thread",
|
||||
thread_entry, RT_NULL,
|
||||
&thread_stack[0],
|
||||
sizeof (thread_stack),
|
||||
ZS001_THREAD_PRIORITY, ZS001_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef _ZS001_DRV_H
|
||||
#define _ZS001_DRV_H
|
||||
|
||||
|
||||
|
||||
#define ZS001_READ_CMD 0x00
|
||||
#define ZS001_WRITE_CMD 0x01
|
||||
|
||||
//#define ZS001_CMD_READSTATE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -238,6 +238,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
|
||||
break;
|
||||
case G0_UART1 : // 4853
|
||||
huart1.Instance = USART1;
|
||||
@@ -328,6 +329,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&huart3, UART_IT_RXNE);
|
||||
break;
|
||||
case G0_UART4: // ETH1
|
||||
huart4.Instance = USART4;
|
||||
@@ -383,6 +385,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&huart6, UART_IT_RXNE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -394,6 +397,17 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
void MX_UART_IRQHandle (void)
|
||||
{
|
||||
uint8_t ret;
|
||||
if (USART3->ISR & (1 << 5)) // 串口2
|
||||
{
|
||||
ret = USART3->RDR;
|
||||
if (g_U4852Drv.rx_buffer != NULL)
|
||||
{
|
||||
g_U4852Drv.rx_buffer[g_U4852Drv.rx_size++] = ret;
|
||||
g_U4852Drv.rx_timer = 30; // 30ms
|
||||
if (g_U4852Drv.rx_size > UART_UART3_BUFF_SIZE)
|
||||
g_U4852Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
if (USART2->ISR & (1 << 5)) // 串口2
|
||||
{
|
||||
ret = USART2->RDR;
|
||||
@@ -427,6 +441,17 @@ void MX_UART_IRQHandle (void)
|
||||
g_U4851Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
if (USART6->ISR & (1 << 5))
|
||||
{
|
||||
ret = USART6->RDR;
|
||||
if (g_ViewDrv.rx_buffer != NULL)
|
||||
{
|
||||
g_ViewDrv.rx_buffer[g_ViewDrv.rx_size++] = ret;
|
||||
g_ViewDrv.rx_timer = 30; // 30ms
|
||||
if (g_ViewDrv.rx_size > UART_UART6_BUFF_SIZE)
|
||||
g_ViewDrv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (LPUART1->ISR & (1 << 5))
|
||||
{
|
||||
@@ -439,6 +464,18 @@ void MX_UART_IRQHandle (void)
|
||||
g_ETH2Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (LPUART2->ISR & (1 << 5))
|
||||
{
|
||||
ret = LPUART2->RDR;
|
||||
if (g_GSMDrv.rx_buffer != NULL)
|
||||
{
|
||||
g_GSMDrv.rx_buffer[g_GSMDrv.rx_size++] = ret;
|
||||
g_GSMDrv.rx_timer = 30; // 30ms
|
||||
if (g_GSMDrv.rx_size > UART_LPUART2_BUFF_SIZE)
|
||||
g_GSMDrv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+25
-14
@@ -3,24 +3,35 @@
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
|
||||
#define REG_GOPENH 0X0000
|
||||
#define REG_GOPENL 0X0001
|
||||
|
||||
#define REG_ALOADH 0X0002
|
||||
#define REG_ALOADL 0X0003
|
||||
|
||||
#define REG_BLOADH 0X0004
|
||||
#define REG_BLOADL 0X0005
|
||||
|
||||
#define REG_SOPEN 0X0007
|
||||
#define REG_SLOPT 0X0008 // 执行闸门动作
|
||||
typedef struct reg_data_t
|
||||
{
|
||||
uint16_t gopen;
|
||||
uint16_t aload;
|
||||
uint16_t bload;
|
||||
uint16_t bl1;
|
||||
uint16_t bl2;
|
||||
uint16_t bl3;
|
||||
uint16_t bl4;
|
||||
uint16_t sopen;
|
||||
uint16_t slopt;
|
||||
} reg_data_t;
|
||||
|
||||
|
||||
|
||||
#define REG_MAX 0X0009
|
||||
typedef enum reg_addr_t
|
||||
{
|
||||
reg_gopen = 0X0000, // 2¸ö×Ö
|
||||
reg_aload = 0X0001,
|
||||
reg_bload = 0X0002,
|
||||
reg_bl1 = 0X0003,
|
||||
reg_bl2 = 0X0004,
|
||||
reg_bl3 = 0X0005,
|
||||
reg_bl4 = 0X0006,
|
||||
reg_sopen = 0X0007,
|
||||
reg_slopt = 0X0008,
|
||||
} reg_addr_t;
|
||||
|
||||
|
||||
extern reg_data_t reg_data;
|
||||
|
||||
|
||||
|
||||
|
||||
+10
-10
@@ -5,16 +5,16 @@
|
||||
|
||||
|
||||
|
||||
typedef struct netWorkInterface_t
|
||||
{
|
||||
void (*Init) (void);
|
||||
int (*IsConnected) (void);
|
||||
void (*WriteData) (char *, int);
|
||||
int (*ReadData) (char *, int);
|
||||
int (*IsReady) (void);
|
||||
int (*IsIdle) (void);
|
||||
int (*ReSubTopic) (char *);
|
||||
} netWorkInterface_t;
|
||||
//typedef struct netWorkInterface_t
|
||||
//{
|
||||
// void (*Init) (void);
|
||||
// int (*IsConnected) (void);
|
||||
// void (*WriteData) (char *, int);
|
||||
// int (*ReadData) (char *, int);
|
||||
// int (*IsReady) (void);
|
||||
// int (*IsIdle) (void);
|
||||
// int (*ReSubTopic) (char *);
|
||||
//} netWorkInterface_t;
|
||||
|
||||
|
||||
typedef struct NetPacket_t
|
||||
|
||||
+267
-54
@@ -10,92 +10,306 @@
|
||||
#include <string.h>
|
||||
#include "usart-board.h"
|
||||
|
||||
#include "mqtt-board.h"
|
||||
#include "network.h"
|
||||
#include "netdrv.h"
|
||||
#include "proto.h"
|
||||
#include "util.h"
|
||||
#include "data.h"
|
||||
#include "disdefine.h"
|
||||
#include "jsonpacket.h"
|
||||
#include "jsonunpack.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
static char thread_stack[4096];
|
||||
static struct rt_thread netapp_thread;
|
||||
|
||||
static rt_event_t gnetEvents;
|
||||
|
||||
#define EVENT_COMM_TX (1U << 0)
|
||||
#define EVENT_COMM_RX (1U << 1) //
|
||||
|
||||
extern MqttDrv_t gMqttDrv;
|
||||
|
||||
|
||||
|
||||
// case ssKHYSet:
|
||||
// {
|
||||
// vv = value*10;
|
||||
// dbg_printf ("MbusSetValue vv:%d\r\n",vv);
|
||||
// sendcmd[type][4] = ((vv >> 8) & 0xff);
|
||||
// sendcmd[type][5] = (vv & 0xff);
|
||||
// vv = bsp_crc_calc16((uint8_t *)sendcmd[type],6);
|
||||
// sendcmd[type][7] = ((vv >> 8) & 0xff);
|
||||
// sendcmd[type][6] = (vv & 0xff);
|
||||
// for(int i = 0;i < 8;i++)
|
||||
// {
|
||||
// dbg_printf("%02X ",sendcmd[type][i]);
|
||||
// }
|
||||
// dbg_printf("\r\n");
|
||||
// }
|
||||
static rt_timer_t timer;
|
||||
|
||||
// {0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0xC5, 0xC8}, // 闸位计读取开度
|
||||
// {0x01, 0x06, 0x00, 0x07, 0x00, 0x02, 0xE6, 0x69}, // 闸位计设置开度
|
||||
// {0x01, 0x06, 0x00, 0x04, 0x01, 0x00, 0xC9, 0x9B}, // 启动闸位计
|
||||
// {0x01, 0x06, 0x00, 0x04, 0x00, 0x00, 0xC8, 0x0B}, // 停止闸位计
|
||||
|
||||
static enum {
|
||||
netDrvInit = 0, // 初始化网络驱动
|
||||
netDrvJoin = 1, // 等待网络注册成功
|
||||
netDrvSend = 2, // 发送数据
|
||||
netDrvRecv = 3, // 读取数据
|
||||
netDrvIdle = 4, // 读取数据
|
||||
}eDrvStatus;
|
||||
static netWorkInterface_t interface;
|
||||
static uint32_t g_net_5min_timer[SLUICE_COUTN] = {0};
|
||||
static uint32_t g_net_1min_timer[SLUICE_COUTN] = {0};
|
||||
|
||||
static void net_send_frame(void)
|
||||
|
||||
static void timerouter (void * parameter)
|
||||
{
|
||||
rt_event_send(gnetEvents,EVENT_COMM_TX) ;
|
||||
TypeIndexMail_t mail;
|
||||
for (int i = 0; i < SLUICE_COUTN; i++)
|
||||
{
|
||||
if (g_net_1min_timer[i] == 1)
|
||||
{
|
||||
g_net_1min_timer[i] = 60;
|
||||
mail.Type = MAIL_COMM_HEART;
|
||||
mail.index = i + 1;
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
|
||||
}
|
||||
// 网络链接成功
|
||||
static void net_connected(void)
|
||||
if (g_net_5min_timer[i] == 1)
|
||||
{
|
||||
g_net_5min_timer[i] = 60 * 5;
|
||||
mail.Type = MAIL_COMM_STAND;
|
||||
mail.index = i + 1;
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
|
||||
}
|
||||
if (g_net_1min_timer[i] > 1)
|
||||
g_net_1min_timer[i]--;
|
||||
if (g_net_5min_timer[i] > 1)
|
||||
g_net_5min_timer[i]--;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
const static char upinfo[][10] = {"heart", "regist", "stand", "sluice", "upack", "slack","readcfg"} ;
|
||||
|
||||
static void thread_entry (void * argument)
|
||||
{
|
||||
eDrvStatus = netDrvInit;
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
gnetEvents = rt_event_create("gnetEvents", RT_IPC_FLAG_FIFO) ;
|
||||
TypeIndexMail_t mail;
|
||||
timer = rt_timer_create ("timer", timerouter, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC);
|
||||
// 读取网络驱动类型
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if(strcmp("dtu",drv) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
DTUThreadStart();
|
||||
// 初始化串口驱动
|
||||
// interface.Init = NULL;
|
||||
// interface.IsConnected = NULL;
|
||||
// interface.IsIdle = NULL;
|
||||
// interface.IsReady = NULL;
|
||||
// interface.ReadData = NULL;
|
||||
// interface.ReSubTopic = NULL;
|
||||
// interface.WriteData = NULL;
|
||||
netdrv_init();
|
||||
MQTTThreadStart();
|
||||
char data[100] = {0};
|
||||
int tx_size = 0;
|
||||
#ifndef USER_JSON_PACKET
|
||||
char rxdata_decode[256];
|
||||
int rxdata_decode_size = 0;
|
||||
uint32_t datak;
|
||||
#endif
|
||||
|
||||
}
|
||||
// 判断站点类型
|
||||
//site_type
|
||||
char * p = ef_get_env ("site_type") ;
|
||||
int site_type = cSiteType2Index(p);
|
||||
rt_kprintf ("site_type:%d\r\n", site_type);
|
||||
|
||||
//CommTMail_t mail;
|
||||
// 注册网络驱动
|
||||
// 注册网络驱动
|
||||
while (1)
|
||||
{
|
||||
// 发送数据
|
||||
if( RT_EOK == rt_event_recv( gnetEvents, EVENT_COMM_TX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL ))
|
||||
|
||||
INIT:
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_COMM_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
rt_kprintf ("net work lost\r\n");
|
||||
mail.Type = MAIL_VIEW_NET_STE;
|
||||
mail.index = DIS_STE_ERROR;
|
||||
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
|
||||
rt_timer_stop (timer);
|
||||
// 发送消息给
|
||||
}
|
||||
if (MQTT_Subscribed() != 1) // 网络链接不成功
|
||||
{
|
||||
rt_thread_mdelay (1000);
|
||||
goto INIT;
|
||||
}
|
||||
// 订阅成功
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_SUB, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
rt_kprintf ("netWork Sub Success\r\n");
|
||||
// 发送注册报
|
||||
mail.Type = MAIL_COMM_REGIST;
|
||||
mail.index = 1;
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
|
||||
for (int i = 0; i < SLUICE_COUTN; i++)
|
||||
{
|
||||
rt_timer_start (timer);
|
||||
g_net_1min_timer[i] = i * 10 + 5;
|
||||
g_net_5min_timer[i] = i * 10 + 10;
|
||||
mail.Type = MAIL_VIEW_NET_STE;
|
||||
mail.index = DIS_STE_SUCCSEE;
|
||||
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
|
||||
}
|
||||
}
|
||||
if (rt_mb_recv (gTCommMail, (rt_ubase_t *) &mail, RT_WAITING_NO) == RT_EOK)
|
||||
{
|
||||
rt_kprintf ("recv send mail: type:%s,index:%d\n", upinfo[mail.Type], mail.index);
|
||||
if (g_ifupdate != 1)
|
||||
{
|
||||
switch (mail.Type)
|
||||
{
|
||||
case MAIL_COMM_HEART:
|
||||
#ifdef USER_JSON_PACKET
|
||||
gMqttDrv.tx_size = JsonHeartDatapacket ( (uint8_t *) gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#else
|
||||
// 心跳数据
|
||||
gMqttDrv.tx_size = PacketHeader (0x2F, data, 4, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
|
||||
#endif
|
||||
MQTT_SendData () ;
|
||||
break;
|
||||
case MAIL_COMM_REGIST: // 注册报
|
||||
|
||||
#ifdef USER_JSON_PACKET // 使用Json格式数据包
|
||||
gMqttDrv.tx_size = JsonRegistDataPacket ((uint8_t *) gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#else
|
||||
// 心跳数据
|
||||
tx_size = PacketUpRegist (data);
|
||||
gMqttDrv.tx_size = PacketHeader (0xE4, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#endif
|
||||
MQTT_SendData () ;
|
||||
break;
|
||||
case MAIL_COMM_SLUICE: // 闸门状态自报
|
||||
tx_size = PacketSluiceUp (mail.index - 1, data);
|
||||
gMqttDrv.tx_size = PacketHeader (0x4E, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
MQTT_SendData () ;
|
||||
break;
|
||||
case MAIL_COMM_STAND: // 5分钟标准包上报
|
||||
|
||||
#ifdef USER_JSON_PACKET // 使用Json格式数据包
|
||||
// 判断站点类型
|
||||
switch (site_type)
|
||||
{
|
||||
case SiteSluice: // 闸门站
|
||||
gMqttDrv.tx_size = Json5MinSluiceDataPacket ( (uint8_t *) gMqttDrv.txbuff);
|
||||
break;
|
||||
case SiteFlow:
|
||||
case SiteSee:
|
||||
gMqttDrv.tx_size = Json5MinFlowDataPacket ( (uint8_t *) gMqttDrv.txbuff);
|
||||
break;
|
||||
case SiteColl:
|
||||
case SiteServer:
|
||||
break;
|
||||
}
|
||||
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#else
|
||||
// 心跳数据
|
||||
tx_size = PakcetTimerUp (mail.index - 1, data);
|
||||
gMqttDrv.tx_size = PacketHeader (0x31, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#endif
|
||||
|
||||
MQTT_SendData () ;
|
||||
break;
|
||||
case MAIL_COMM_SLACK: // 提闸的应答
|
||||
tx_size = PacketSluiceAck (data);
|
||||
gMqttDrv.tx_size = PacketHeader (0x4E, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
MQTT_SendData();
|
||||
break;
|
||||
case MAIL_COMM_UPACK: // 升级的应答
|
||||
|
||||
#ifdef USER_JSON_PACKET // 使用Json格式数据包
|
||||
gMqttDrv.tx_size = JsonAckSuccPacket ((uint8_t *) gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#else
|
||||
// 心跳数据
|
||||
tx_size = PacketAnsAck (data);
|
||||
gMqttDrv.tx_size = PacketHeader (0xE0, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#endif
|
||||
|
||||
|
||||
MQTT_SendData();
|
||||
break;
|
||||
case MAIL_COMM_READPARA:
|
||||
#ifdef USER_JSON_PACKET // 使用Json格式数据包
|
||||
gMqttDrv.tx_size = JsonConfigReadDataPacket ((uint8_t *) gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#else
|
||||
// 心跳数据
|
||||
tx_size = PacketUpRegist (data);
|
||||
gMqttDrv.tx_size = PacketHeader (0xE4, data, tx_size, gMqttDrv.txbuff);
|
||||
gMqttDrv.tx_index = mail.index;
|
||||
#endif
|
||||
MQTT_SendData();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if ( RT_EOK == rt_event_recv( gnetEvents, EVENT_COMM_RX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL ))
|
||||
// 接受数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_COMM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
|
||||
#ifdef USER_JSON_PACKET // 使用Json格式数据包
|
||||
JsonUnPacket(gMqttDrv.rx_index - 1,gMqttDrv.rxbuff); // 第n个通道过来的数据
|
||||
// 解析数据
|
||||
#else
|
||||
|
||||
rxdata_decode_size = hexstr_to_hexbyte (gMqttDrv.rxbuff, rxdata_decode, gMqttDrv.rx_size);
|
||||
rt_kprintf ("<<<<<<<<<<<<rx_size:%d\r\n", rxdata_decode_size);
|
||||
for (int i = 0; i < rxdata_decode_size; i++)
|
||||
{
|
||||
rt_kprintf ("%02X ", rxdata_decode[i]);
|
||||
}
|
||||
rt_thread_delay(10);
|
||||
rt_kprintf ("\r\n");
|
||||
switch ( (int) rxdata_decode[10])
|
||||
{
|
||||
case 0x4E: // 控制闸门操作
|
||||
{
|
||||
// 远程提闸
|
||||
datak = rxdata_decode[18];
|
||||
datak = (datak << 8) + rxdata_decode[19];
|
||||
rt_kprintf ("open:%u mm/10\r\n", datak);
|
||||
|
||||
//SluiceData[gMqttDrv.rx_index].opt = 1; // 执行操作闸门
|
||||
SluiceData[gMqttDrv.rx_index - 1].sopen = datak / 10;
|
||||
mail.Type = MAIL_SLUICE_OPT;
|
||||
mail.index = gMqttDrv.rx_index - 1;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
|
||||
// 回复应答
|
||||
mail.Type = MAIL_COMM_SLACK;
|
||||
mail.index = gMqttDrv.rx_index;
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
}
|
||||
case 0xE0:// 远程升级
|
||||
{
|
||||
int filenamesize = 0;
|
||||
rt_memset (SysData.fileName, 0, 32);
|
||||
filenamesize = rxdata_decode[12] - 2;
|
||||
rt_memcpy (SysData.fileName, &rxdata_decode[16], filenamesize);
|
||||
// 启动升级线程
|
||||
rt_kprintf ("filename:[%s]\r\n", SysData.fileName);
|
||||
// 回复应答
|
||||
mail.Type = MAIL_COMM_UPACK;
|
||||
mail.index = gMqttDrv.rx_index;
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
rt_thread_mdelay (2000);
|
||||
|
||||
UpgradeThreadStart();
|
||||
//
|
||||
// 应答ACK
|
||||
break;
|
||||
}
|
||||
case 0xE1: // 远程停止闸门
|
||||
{
|
||||
mail.Type = MAIL_SLUICE_STP; // 停止提
|
||||
mail.index = gMqttDrv.rx_index - 1;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
}
|
||||
case 0xE2: // 读取远程参数
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
// 网络连接丢失
|
||||
rt_thread_mdelay (10);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -109,7 +323,6 @@ void NET_APPThreadStart(void )
|
||||
sizeof (thread_stack),
|
||||
NET_APP_THREAD_PRIORITY, NET_APP_THREAD_TIMESLICE);
|
||||
rt_thread_startup (&netapp_thread);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
+45
-42
@@ -11,6 +11,7 @@
|
||||
#include "usart-board.h"
|
||||
#include "modbus-s.h"
|
||||
#include "modbusaddr.h"
|
||||
#include "data.h"
|
||||
|
||||
|
||||
ALIGN (RT_ALIGN_SIZE)
|
||||
@@ -18,63 +19,57 @@ static char thread_stack[4096];
|
||||
static struct rt_thread probus_thread;
|
||||
|
||||
|
||||
uint16_t REG_DATA[REG_MAX] = {0x00};
|
||||
|
||||
|
||||
//uint16_t REG_DATA[REG_MAX] = {0x00};
|
||||
|
||||
|
||||
|
||||
// 寄存器对应的数据
|
||||
reg_data_t reg_data =
|
||||
{
|
||||
.gopen = 56,
|
||||
.aload = 0,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// case ssKHYSet:
|
||||
// {
|
||||
// vv = value*10;
|
||||
// dbg_printf ("MbusSetValue vv:%d\r\n",vv);
|
||||
// sendcmd[type][4] = ((vv >> 8) & 0xff);
|
||||
// sendcmd[type][5] = (vv & 0xff);
|
||||
// vv = bsp_crc_calc16((uint8_t *)sendcmd[type],6);
|
||||
// sendcmd[type][7] = ((vv >> 8) & 0xff);
|
||||
// sendcmd[type][6] = (vv & 0xff);
|
||||
// for(int i = 0;i < 8;i++)
|
||||
// {
|
||||
// dbg_printf("%02X ",sendcmd[type][i]);
|
||||
// }
|
||||
// dbg_printf("\r\n");
|
||||
// }
|
||||
|
||||
// {0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0xC5, 0xC8}, // 闸位计读取开度
|
||||
// {0x01, 0x06, 0x00, 0x07, 0x00, 0x02, 0xE6, 0x69}, // 闸位计设置开度
|
||||
// {0x01, 0x06, 0x00, 0x04, 0x01, 0x00, 0xC9, 0x9B}, // 启动闸位计
|
||||
// {0x01, 0x06, 0x00, 0x04, 0x00, 0x00, 0xC8, 0x0B}, // 停止闸位计
|
||||
|
||||
|
||||
static ModBusSlave_t modbus_slave;
|
||||
static uint8_t modbus_rx_data[32];
|
||||
static uint8_t modbus_rx_data[256];
|
||||
|
||||
|
||||
static void eth2_data_rxdone (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH2_RX);
|
||||
//rt_kprintf("net_data_rxdone\r\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void probus_handle(uint16_t addr,uint8_t * data)
|
||||
static void probus_handle (reg_addr_t addr, uint8_t * data)
|
||||
{
|
||||
uint32_t data32;
|
||||
TypeIndexMail_t mail;
|
||||
switch (addr)
|
||||
{
|
||||
case REG_SOPEN: // 设定闸门开度
|
||||
case reg_sopen: // 设定闸门开度
|
||||
data32 = data[0];
|
||||
data32 = (data32 << 8) + data[1];
|
||||
SluiceData[0].sopen = data32 * 10;
|
||||
break;
|
||||
case REG_SLOPT: // 执行闸门动作
|
||||
case reg_slopt: // 执行闸门动作
|
||||
rt_kprintf ("reg_slopt\r\n");
|
||||
if (data[0] == 0x01) // 执行
|
||||
{
|
||||
rt_event_send(gCtrlEvents,EVENT_CTRL_SET_OPEN);
|
||||
rt_kprintf("probus_handle set open\r\n");
|
||||
rt_kprintf ("reg_slopt\r\n");
|
||||
mail.Type = MAIL_SLUICE_OPT;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
mail.Type = MAIL_SLUICE_STP;
|
||||
mail.index = 0;
|
||||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
rt_kprintf ("reg_stp\r\n");
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -96,21 +91,27 @@ static void thread_entry(void * argument)
|
||||
g_ETH2Drv.BaudRate = 115200;
|
||||
MX_UART_Init (&g_ETH2Drv);
|
||||
|
||||
ModbusSlaveInit(&modbus_slave,0x01,modbus_rx_data,REG_DATA,REG_MAX);
|
||||
ModbusSlaveInit (&modbus_slave, 0x01, modbus_rx_data, (uint16_t *) ®_data, sizeof (reg_data_t) / 2);
|
||||
MX_UART_Clear (&g_ETH2Drv);
|
||||
// 注册网络驱动
|
||||
// 注册网络驱动
|
||||
while (1)
|
||||
{
|
||||
// 从其他数据区域更新到寄存器
|
||||
reg_data.gopen = SluiceData[0].gopen * 10;
|
||||
//reg_data.aload = SluiceData[0].lload;
|
||||
//reg_data.bload = SluiceData[0].rload;
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH2_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
// rt_kprintf("<<<<<<<<<<<<<<<<<<<<probus2:\r\n");
|
||||
// for(int i =0; i < g_ETH2Drv.rx_size;i++)
|
||||
// {
|
||||
// rt_kprintf("%02X ",g_ETH2Drv.rx_buffer[i]);
|
||||
// }
|
||||
// rt_kprintf("\r\n");
|
||||
for (int i = 0; i < g_ETH2Drv.rx_size; i++)
|
||||
{
|
||||
rt_kprintf ("%02x", g_ETH2Drv.rx_buffer[i]);
|
||||
}
|
||||
if (g_ETH2Drv.rx_size > 4)
|
||||
{
|
||||
k = ModbusSlaveHandle (&modbus_slave, (uint8_t *) g_ETH2Drv.rx_buffer, g_ETH2Drv.rx_size);
|
||||
//rt_kprintf("k:%d\r\n",k);
|
||||
//k = 2;
|
||||
rt_kprintf ("k:%d\r\n", k);
|
||||
if (k == 0)
|
||||
{
|
||||
switch (modbus_slave.func)
|
||||
@@ -136,12 +137,14 @@ static void thread_entry(void * argument)
|
||||
}
|
||||
if (tx_size > 0)
|
||||
{
|
||||
//rt_kprintf("tx_size :%d\r\n",tx_size);
|
||||
MX_UART_PutBuffer (&g_ETH2Drv, (char *) txbuff, tx_size);
|
||||
}
|
||||
}
|
||||
|
||||
MX_UART_Clear (&g_ETH2Drv);
|
||||
}
|
||||
rt_thread_delay(10);
|
||||
rt_thread_mdelay (100);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -133,6 +133,8 @@ void Error_Handler(void);
|
||||
#define DI6_GPIO_Port GPIOD
|
||||
#define PWM_CH1_Pin GPIO_PIN_4
|
||||
#define PWM_CH1_GPIO_Port GPIOB
|
||||
#define LOCK_Pin GPIO_PIN_5
|
||||
#define LOCK_GPIO_Port GPIOB
|
||||
#define RELAY1_Pin GPIO_PIN_0
|
||||
#define RELAY1_GPIO_Port GPIOE
|
||||
#define RELAY2_Pin GPIO_PIN_1
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@ void MX_TIM15_Init(void);
|
||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
void MX_TIM_SetDuty (int index, uint32_t duty);
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+7
-1
@@ -204,7 +204,13 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
|
||||
|
||||
uint32_t MX_READ_ADC_VALUE (int channel)
|
||||
{
|
||||
return aADCxConvertedData[channel];
|
||||
uint32_t p = 0;
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
p = p + aADCxConvertedData[channel];
|
||||
}
|
||||
p = p / 100;
|
||||
return p;//aADCxConvertedData[channel];
|
||||
}
|
||||
|
||||
|
||||
|
||||
+20
-3
@@ -20,6 +20,7 @@
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "gpio.h"
|
||||
#include <rtthread.h>
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
@@ -60,7 +61,8 @@ void MX_GPIO_Init(void)
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, U485_RT_Pin|LORA_TX_Pin|LORA_RX_Pin|SPI2_NSS_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin (GPIOB, U485_RT_Pin | LORA_TX_Pin | LORA_RX_Pin | SPI2_NSS_Pin
|
||||
| LOCK_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin (GPIOE, LORA_M1_Pin | RELAY1_Pin | RELAY2_Pin | S4851_RT_Pin
|
||||
@@ -95,8 +97,10 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init (DAC2_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : PBPin PBPin PBPin PBPin */
|
||||
GPIO_InitStruct.Pin = U485_RT_Pin|LORA_TX_Pin|LORA_RX_Pin|SPI2_NSS_Pin;
|
||||
/*Configure GPIO pins : PBPin PBPin PBPin PBPin
|
||||
PBPin */
|
||||
GPIO_InitStruct.Pin = U485_RT_Pin | LORA_TX_Pin | LORA_RX_Pin | SPI2_NSS_Pin
|
||||
| LOCK_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
@@ -130,6 +134,19 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init (GPIOD, &GPIO_InitStruct);
|
||||
|
||||
// HAL_GPIO_WritePin (S4851_RT_GPIO_Port, S4851_RT_Pin, GPIO_PIN_SET);
|
||||
|
||||
//HAL_GPIO_WritePin(GPIOB, LOCK_Pin, GPIO_PIN_SET);
|
||||
|
||||
// HAL_GPIO_WritePin(ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
// rt_kprintf("+++++++++++++++++++++\r\n");
|
||||
//// /*Configure GPIO pin Output Level */
|
||||
//HAL_GPIO_WritePin(GPIOA, ETH_PW_Pin|GSM_PW_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_RESET);
|
||||
|
||||
//
|
||||
/*Configure GPIO pin Output Level */
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -191,7 +191,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
/* USER CODE BEGIN Callback 0 */
|
||||
|
||||
/* USER CODE END Callback 0 */
|
||||
if (htim->Instance == TIM2) {
|
||||
if (htim->Instance == TIM2)
|
||||
{
|
||||
HAL_IncTick();
|
||||
}
|
||||
/* USER CODE BEGIN Callback 1 */
|
||||
|
||||
@@ -75,7 +75,7 @@ extern TIM_HandleTypeDef htim2;
|
||||
/* USER CODE BEGIN EV */
|
||||
extern void MX_UART_IRQHandle (void);
|
||||
extern void MX_UART_TickHandle (void);
|
||||
//extern void main_Systick (void);
|
||||
extern void main_Systick (void);
|
||||
/* USER CODE END EV */
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -154,9 +154,11 @@ void TIM2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM2_IRQn 0 */
|
||||
MX_UART_TickHandle();
|
||||
//main_Systick();
|
||||
main_Systick();
|
||||
#ifdef USE_APP_SLUICE
|
||||
MX_IWDG_Reload();
|
||||
MX_WWDG_Relad();
|
||||
//MX_WWDG_Relad();
|
||||
#endif
|
||||
/* USER CODE END TIM2_IRQn 0 */
|
||||
HAL_TIM_IRQHandler (&htim2);
|
||||
/* USER CODE BEGIN TIM2_IRQn 1 */
|
||||
|
||||
+69
-3
@@ -97,7 +97,7 @@ void MX_TIM3_Init(void)
|
||||
htim3.Instance = TIM3;
|
||||
htim3.Init.Prescaler = 0;
|
||||
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim3.Init.Period = 65535;
|
||||
htim3.Init.Period = 640;
|
||||
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_PWM_Init (&htim3) != HAL_OK)
|
||||
@@ -134,6 +134,10 @@ void MX_TIM3_Init(void)
|
||||
|
||||
/* USER CODE END TIM3_Init 2 */
|
||||
HAL_TIM_MspPostInit (&htim3);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_2);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_3);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_4);
|
||||
|
||||
}
|
||||
/* TIM6 init function */
|
||||
@@ -247,7 +251,7 @@ void MX_TIM15_Init(void)
|
||||
htim15.Init.Prescaler = 0;
|
||||
htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim15.Init.Period = 65535;
|
||||
htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4 ;
|
||||
htim15.Init.RepetitionCounter = 0;
|
||||
htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_PWM_Init (&htim15) != HAL_OK)
|
||||
@@ -261,7 +265,7 @@ void MX_TIM15_Init(void)
|
||||
Error_Handler();
|
||||
}
|
||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||
sConfigOC.Pulse = 0;
|
||||
sConfigOC.Pulse = 3000;
|
||||
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
|
||||
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||
@@ -291,6 +295,8 @@ void MX_TIM15_Init(void)
|
||||
|
||||
/* USER CODE END TIM15_Init 2 */
|
||||
HAL_TIM_MspPostInit (&htim15);
|
||||
HAL_TIM_PWM_Start (&htim15, TIM_CHANNEL_1);
|
||||
HAL_TIM_PWM_Start (&htim15, TIM_CHANNEL_2);
|
||||
|
||||
}
|
||||
|
||||
@@ -578,4 +584,64 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
|
||||
void MX_TIM_SetDuty (int index, uint32_t duty)
|
||||
{
|
||||
TIM_OC_InitTypeDef sConfigOC = {0};
|
||||
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||
sConfigOC.Pulse = duty * 640 / 100;
|
||||
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||
|
||||
|
||||
|
||||
|
||||
// sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||
// sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||
// if (HAL_TIMEx_MasterConfigSynchronization (&htim3, &sMasterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
switch (index)
|
||||
{
|
||||
case 1:
|
||||
if (HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
|
||||
break;
|
||||
case 2:
|
||||
if (HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_2);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_2);
|
||||
break;
|
||||
case 3:
|
||||
if (HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_3);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_3);
|
||||
break;
|
||||
case 4:
|
||||
if (HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_4);
|
||||
HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_4);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE END 1 */
|
||||
+1
-1
@@ -608,7 +608,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
*/
|
||||
GPIO_InitStruct.Pin = U485_TX_Pin | U485_RX_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF8_USART5;
|
||||
HAL_GPIO_Init (GPIOB, &GPIO_InitStruct);
|
||||
|
||||
+27
-21
@@ -143,31 +143,32 @@ Mcu.Pin45=PD3
|
||||
Mcu.Pin46=PF12
|
||||
Mcu.Pin47=PF13
|
||||
Mcu.Pin48=PB4
|
||||
Mcu.Pin49=PE0
|
||||
Mcu.Pin49=PB5
|
||||
Mcu.Pin5=PE6
|
||||
Mcu.Pin50=PE1
|
||||
Mcu.Pin51=PE2
|
||||
Mcu.Pin52=PE3
|
||||
Mcu.Pin53=PB6
|
||||
Mcu.Pin54=PB7
|
||||
Mcu.Pin55=PB8
|
||||
Mcu.Pin56=VP_ADC1_TempSens_Input
|
||||
Mcu.Pin57=VP_CRC_VS_CRC
|
||||
Mcu.Pin58=VP_IWDG_VS_IWDG
|
||||
Mcu.Pin59=VP_RTC_VS_RTC_Activate
|
||||
Mcu.Pin50=PE0
|
||||
Mcu.Pin51=PE1
|
||||
Mcu.Pin52=PE2
|
||||
Mcu.Pin53=PE3
|
||||
Mcu.Pin54=PB6
|
||||
Mcu.Pin55=PB7
|
||||
Mcu.Pin56=PB8
|
||||
Mcu.Pin57=VP_ADC1_TempSens_Input
|
||||
Mcu.Pin58=VP_CRC_VS_CRC
|
||||
Mcu.Pin59=VP_IWDG_VS_IWDG
|
||||
Mcu.Pin6=PC12
|
||||
Mcu.Pin60=VP_SYS_VS_tim2
|
||||
Mcu.Pin61=VP_SYS_VS_DBSignals
|
||||
Mcu.Pin62=VP_TIM6_VS_ClockSourceINT
|
||||
Mcu.Pin63=VP_TIM7_VS_ClockSourceINT
|
||||
Mcu.Pin64=VP_TIM14_VS_ClockSourceINT
|
||||
Mcu.Pin65=VP_WWDG_VS_WWDG
|
||||
Mcu.Pin66=VP_RealThread.RT-Thread_VS_RTOSJjkernel_3.1.5_3.1.5
|
||||
Mcu.Pin67=VP_RealThread.RT-Thread_VS_RTOSJjdevice_3.1.5_3.1.5
|
||||
Mcu.Pin60=VP_RTC_VS_RTC_Activate
|
||||
Mcu.Pin61=VP_SYS_VS_tim2
|
||||
Mcu.Pin62=VP_SYS_VS_DBSignals
|
||||
Mcu.Pin63=VP_TIM6_VS_ClockSourceINT
|
||||
Mcu.Pin64=VP_TIM7_VS_ClockSourceINT
|
||||
Mcu.Pin65=VP_TIM14_VS_ClockSourceINT
|
||||
Mcu.Pin66=VP_WWDG_VS_WWDG
|
||||
Mcu.Pin67=VP_RealThread.RT-Thread_VS_RTOSJjkernel_3.1.5_3.1.5
|
||||
Mcu.Pin68=VP_RealThread.RT-Thread_VS_RTOSJjdevice_3.1.5_3.1.5
|
||||
Mcu.Pin7=PC13
|
||||
Mcu.Pin8=PC14-OSC32_IN (PC14)
|
||||
Mcu.Pin9=PC15-OSC32_OUT (PC15)
|
||||
Mcu.PinsNb=68
|
||||
Mcu.PinsNb=69
|
||||
Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5
|
||||
Mcu.ThirdPartyNb=1
|
||||
Mcu.UserConstants=
|
||||
@@ -275,6 +276,10 @@ PB4.GPIOParameters=GPIO_Label
|
||||
PB4.GPIO_Label=PWM_CH1
|
||||
PB4.Locked=true
|
||||
PB4.Signal=S_TIM3_CH1
|
||||
PB5.GPIOParameters=GPIO_Label
|
||||
PB5.GPIO_Label=LOCK
|
||||
PB5.Locked=true
|
||||
PB5.Signal=GPIO_Output
|
||||
PB6.GPIOParameters=GPIO_Label
|
||||
PB6.GPIO_Label=S4852_TX
|
||||
PB6.Locked=true
|
||||
@@ -497,7 +502,7 @@ RCC.USART3Freq_Value=64000000
|
||||
RCC.USBFreq_Value=48000000
|
||||
RCC.VCOInputFreq_Value=8000000
|
||||
RCC.VCOOutputFreq_Value=128000000
|
||||
RealThread.RT-Thread.3.1.5.IPParameters=RT_MAIN_THREAD_STACK_SIZE,RT_USING_EVENT,RT_USING_MAILBOX,RT_USING_MESSAGEQUEUE,RT_USING_HEAP,RTOSJjkernel,RTOSJjdevice
|
||||
RealThread.RT-Thread.3.1.5.IPParameters=RT_MAIN_THREAD_STACK_SIZE,RT_USING_EVENT,RT_USING_MAILBOX,RT_USING_MESSAGEQUEUE,RT_USING_HEAP,RT_USING_MUTEX,RTOSJjkernel,RTOSJjdevice
|
||||
RealThread.RT-Thread.3.1.5.RTOSJjdevice=true
|
||||
RealThread.RT-Thread.3.1.5.RTOSJjdevice_Checked=true
|
||||
RealThread.RT-Thread.3.1.5.RTOSJjkernel=true
|
||||
@@ -508,6 +513,7 @@ RealThread.RT-Thread.3.1.5.RT_USING_EVENT=1
|
||||
RealThread.RT-Thread.3.1.5.RT_USING_HEAP=1
|
||||
RealThread.RT-Thread.3.1.5.RT_USING_MAILBOX=1
|
||||
RealThread.RT-Thread.3.1.5.RT_USING_MESSAGEQUEUE=1
|
||||
RealThread.RT-Thread.3.1.5.RT_USING_MUTEX=1
|
||||
RealThread.RT-Thread.3.1.5_SwParameter=RTOSJjkernel\:true;RTOSJjshell\:true;RTOSJjdevice\:true;
|
||||
SH.COMP_DAC12_group.0=DAC1_OUT2
|
||||
SH.COMP_DAC12_group.ConfNb=1
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
RM := rm -rf
|
||||
BRIDGE_EXE := studio-mdk-bridge.exe
|
||||
UV4_EXE := "C:\Keil_v5\UV4\UV4.exe"
|
||||
UVPROJX_LOC := "J:\add_by_zhangpeng\Project\SLUICE\Sluice\GB0VETx\g0b1vetx-board\MDK-ARM\GB01VETx.uvprojx"
|
||||
|
||||
.PHONY: mdk_all
|
||||
|
||||
mdk_all:
|
||||
-$(BRIDGE_EXE) --build --uv4-path $(UV4_EXE) $(UVPROJX_LOC)
|
||||
|
||||
mdk_clean:
|
||||
-@$(RM) *
|
||||
@echo 'success'
|
||||
|
||||
@@ -97,17 +97,17 @@
|
||||
<yPos>-1</yPos>
|
||||
</MaxPosition>
|
||||
<NormalPosition>
|
||||
<Top>210</Top>
|
||||
<Left>-47</Left>
|
||||
<Right>1393</Right>
|
||||
<Bottom>969</Bottom>
|
||||
<Top>337</Top>
|
||||
<Left>2503</Left>
|
||||
<Right>3943</Right>
|
||||
<Bottom>1096</Bottom>
|
||||
</NormalPosition>
|
||||
</WindowPosition>
|
||||
<MDIClientArea>
|
||||
<RegID>0</RegID>
|
||||
<MDITabState>
|
||||
<Len>1746</Len>
|
||||
<Data>0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000B0000000100000001000000874A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF594A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF904A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF544A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF624A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF7D4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF7E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C66696E73685C66696E73685F6170692E68000000000B66696E73685F6170692E6800000000D9ADC200FFFFFFFF774A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000A5C2D700FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000B3A6BE00FFFFFFFF814A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C66696E73685C66696E73685F636F6E6669672E68000000000E66696E73685F636F6E6669672E6800000000EAD6A300FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000480100006600000080070000D8020000</Data>
|
||||
<Len>1394</Len>
|
||||
<Data>010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000090000000400000001000000834A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF8C4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF754A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF504A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF5E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF734A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000D9ADC200FFFFFFFF514A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000A5C2D700FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000C808000066000000000F0000D8020000</Data>
|
||||
</MDITabState>
|
||||
</MDIClientArea>
|
||||
<ViewEx>
|
||||
@@ -130,7 +130,7 @@
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
<Data>F40000006600000090050000F6000000</Data>
|
||||
<Data>7408000066000000100D0000F6000000</Data>
|
||||
</RectRecentFloat>
|
||||
</Window>
|
||||
<Window>
|
||||
@@ -1795,14 +1795,14 @@
|
||||
</Window>
|
||||
<DockMan>
|
||||
<Len>3312</Len>
|
||||
<Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F40000006600000090050000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000C102000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000006600000044010000D8020000000000004F00000044010000C10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000003002000090050000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated
|
||||
<Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007408000066000000100D0000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000200C000066000000100D000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000C102000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008007000066000000C4080000D8020000000000004F00000044010000C10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008007000030020000100D0000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated
|
||||
</DockMan>
|
||||
<ToolBar>
|
||||
<RegID>59392</RegID>
|
||||
<Name>File</Name>
|
||||
<Buttons>
|
||||
<Len>2909</Len>
|
||||
<Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000B67547269674576656E7473960000000000000014000B67547269674576656E7473154556454E545F5452494745525F52533438353152580D72745F6576656E745F73656E640F72745F6576656E745F6372656174650ECAE4B3F6B2CECAFDA3BA4E554C4C0D52545F5553494E475F484F4F4B0D72745F6576656E745F726563760A735F4C657665446174610C735F6C6F73745F74696D6572124574684D717474446973436F6E6E65637464104D585F4652454552544F535F496E69741278506F727450656E64535648616E646C65720F5379735469636B5F48616E646C65720768616E646C65730E50656E6453565F48616E646C65720A41542B514D54434F4E4E176E6574776F726B5F756172745F727863616C6C6261636B0972745F7374727374720452535430055057524F4E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000Line truncated
|
||||
<Len>2878</Len>
|
||||
<Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000A4465766963654C696E6B960000000000000013000A4465766963654C696E6B096C696E6B54696D657204D0C4CCF80A6754436F6D6D4D61696C0D50616B63657454696D657255700F4D41494C5F534C554943455F4F50540C75343835325F7468726561641445465F454E565F5553494E475F574C5F4D4F44450F534655445F44454255475F4D4F44450557617465720F6F6E6C696E655F6961705F7461736B0D6961705F66696C655F73697A650B6961705F66696C656E616D074949435F53434C1065665F65726173655F62616B5F6170701172745F656E7465725F637269746963616C0C4D585F554152545F496E6974164F535F4941505F5448524541445F5052494F524954590A675F6966636F6E66696700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E730000000000000000000000000100000001000000000Line truncated
|
||||
</Buttons>
|
||||
<OriginalItems>
|
||||
<Len>1423</Len>
|
||||
@@ -1818,7 +1818,7 @@
|
||||
<Name>Build</Name>
|
||||
<Buttons>
|
||||
<Len>976</Len>
|
||||
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008474230315645547896000000000000000100084742303156455478000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
|
||||
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008474230315645547896000000000000000100084742303156455478000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
|
||||
</Buttons>
|
||||
<OriginalItems>
|
||||
<Len>583</Len>
|
||||
@@ -1834,7 +1834,7 @@
|
||||
<Name>Debug</Name>
|
||||
<Buttons>
|
||||
<Len>2373</Len>
|
||||
<Data>00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000</Data>
|
||||
<Data>00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000</Data>
|
||||
</Buttons>
|
||||
<OriginalItems>
|
||||
<Len>898</Len>
|
||||
@@ -3599,7 +3599,7 @@
|
||||
<ActiveMDIGroup>0</ActiveMDIGroup>
|
||||
<MDIGroup>
|
||||
<Size>100</Size>
|
||||
<ActiveTab>1</ActiveTab>
|
||||
<ActiveTab>4</ActiveTab>
|
||||
<Doc>
|
||||
<Name>../Middlewares/Third_Party/RealThread_RTOS/components/device/device.c</Name>
|
||||
<ColumnNumber>26</ColumnNumber>
|
||||
@@ -3611,9 +3611,9 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../RT-Thread/rtconfig.h</Name>
|
||||
<ColumnNumber>7</ColumnNumber>
|
||||
<TopLine>122</TopLine>
|
||||
<CurrentLine>134</CurrentLine>
|
||||
<ColumnNumber>24</ColumnNumber>
|
||||
<TopLine>119</TopLine>
|
||||
<CurrentLine>133</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
@@ -3638,9 +3638,9 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Core/Src/main.c</Name>
|
||||
<ColumnNumber>23</ColumnNumber>
|
||||
<TopLine>124</TopLine>
|
||||
<CurrentLine>136</CurrentLine>
|
||||
<ColumnNumber>25</ColumnNumber>
|
||||
<TopLine>199</TopLine>
|
||||
<CurrentLine>207</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
@@ -3663,15 +3663,6 @@
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>J:\add_by_zhangpeng\Project\测控一体闸\Sluice\GB0VETx\g0b1vetx-board\Middlewares\Third_Party\RealThread_RTOS\finsh\finsh_api.h</Name>
|
||||
<ColumnNumber>0</ColumnNumber>
|
||||
<TopLine>87</TopLine>
|
||||
<CurrentLine>94</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Middlewares/Third_Party/RealThread_RTOS/src/idle.c</Name>
|
||||
<ColumnNumber>26</ColumnNumber>
|
||||
@@ -3683,22 +3674,13 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Core/Src/usart.c</Name>
|
||||
<ColumnNumber>1</ColumnNumber>
|
||||
<ColumnNumber>4</ColumnNumber>
|
||||
<TopLine>97</TopLine>
|
||||
<CurrentLine>98</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>J:\add_by_zhangpeng\Project\测控一体闸\Sluice\GB0VETx\g0b1vetx-board\Middlewares\Third_Party\RealThread_RTOS\finsh\finsh_config.h</Name>
|
||||
<ColumnNumber>19</ColumnNumber>
|
||||
<TopLine>1</TopLine>
|
||||
<CurrentLine>12</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
</Doc>
|
||||
</MDIGroup>
|
||||
</MDIGroups>
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>12000000</CLKADS>
|
||||
<CLKADS>8000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
@@ -1209,7 +1209,7 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>Middlewares/RT-Thread/RTOS/device</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
|
||||
+1744
-61
File diff suppressed because it is too large.
Load diff
@@ -29,7 +29,7 @@
|
||||
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Stack_Size EQU 0x00001000
|
||||
Stack_Size EQU 0x2000
|
||||
|
||||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||||
Stack_Mem SPACE Stack_Size
|
||||
@@ -40,7 +40,7 @@ __initial_sp
|
||||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Heap_Size EQU 0x00001000
|
||||
Heap_Size EQU 0x2000
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
|
||||
+8
-1
@@ -12,13 +12,14 @@
|
||||
#include <rtthread.h>
|
||||
|
||||
#include "main.h"
|
||||
#include "data.h"
|
||||
|
||||
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
|
||||
/*
|
||||
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
|
||||
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
|
||||
*/
|
||||
#define RT_HEAP_SIZE (15*1024)
|
||||
#define RT_HEAP_SIZE (30*1024)
|
||||
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
|
||||
|
||||
RT_WEAK void *rt_heap_begin_get(void)
|
||||
@@ -93,6 +94,11 @@ INIT_BOARD_EXPORT(uart_init);
|
||||
|
||||
void rt_hw_console_output(const char *str)
|
||||
{
|
||||
|
||||
if (g_ifconfig == 1)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
rt_size_t i = 0, size = 0;
|
||||
char a = '\r';
|
||||
|
||||
@@ -108,6 +114,7 @@ void rt_hw_console_output(const char *str)
|
||||
}
|
||||
HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Submodule
+1
Submodule Project/g0b1vetx-sluice added at 38d2e6b239.
@@ -88,7 +88,7 @@
|
||||
|
||||
// <c1>Using Mutex
|
||||
// <i>Using Mutex
|
||||
//#define RT_USING_MUTEX
|
||||
#define RT_USING_MUTEX
|
||||
// </c>
|
||||
|
||||
// <c1>Using Event
|
||||
@@ -136,7 +136,7 @@
|
||||
// <o>the buffer size of console <1-1024>
|
||||
// <i>the buffer size of console
|
||||
// <i>Default: 128 (128Byte)
|
||||
#define RT_CONSOLEBUF_SIZE 128
|
||||
#define RT_CONSOLEBUF_SIZE 1024
|
||||
// </h>
|
||||
|
||||
// <h>Enable FinSH Configuration
|
||||
|
||||
+80
-1
@@ -1,5 +1,5 @@
|
||||
#include "util.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
float Bytes2Float (char * data)
|
||||
{
|
||||
@@ -11,6 +11,85 @@ float Bytes2Float(char * data)
|
||||
return ff.data;
|
||||
}
|
||||
|
||||
uint32_t Bytes2Int (char * data)
|
||||
{
|
||||
Int I;
|
||||
I.byte[0] = data[1];
|
||||
I.byte[1] = data[0];
|
||||
I.byte[2] = data[3];
|
||||
I.byte[3] = data[2];
|
||||
return I.data;
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
// 函数功能: hex字符串转byte数组
|
||||
// 函数名称: hexbyte_to_hex_str
|
||||
// 参数1 : src 源字符串
|
||||
// 参数2 : obj 目标字节数组
|
||||
// 说明 : "01020304" --> {0x01,0x03,0x03,x04} 或 "01 02 03 04"->{0x01,0x03,0x03,x04}
|
||||
// 返回值 : 1 成功
|
||||
// -----------------------------------------------------------------
|
||||
int hexstr_to_hexbyte (char *src, char *obj, uint16_t length)
|
||||
{
|
||||
char h1, h2;
|
||||
uint8_t s1, s2;
|
||||
int i;
|
||||
length = length / 2;
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
h1 = src[2 * i];
|
||||
h2 = src[2 * i + 1];
|
||||
|
||||
s1 = toupper (h1) - 0x30;
|
||||
if (s1 > 9)
|
||||
s1 -= 7;
|
||||
s2 = toupper (h2) - 0x30;
|
||||
if (s2 > 9)
|
||||
s2 -= 7;
|
||||
obj[i] = s1 * 16 + s2;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
// 754 转float
|
||||
float float_to_iee754 (float ff1,char * data)
|
||||
{
|
||||
Float ff;
|
||||
ff.data = ff1;
|
||||
data[0] = ff.byte[3];
|
||||
data[1] = ff.byte[2];
|
||||
data[2] = ff.byte[1];
|
||||
data[3] = ff.byte[0];
|
||||
|
||||
return ff.data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 754 转float
|
||||
float iee754_to_float (char * data)
|
||||
{
|
||||
Float ff;
|
||||
ff.byte[3] = data[0];
|
||||
ff.byte[2] = data[1];
|
||||
ff.byte[1] = data[2];
|
||||
ff.byte[0] = data[3];
|
||||
return ff.data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint32_t byte_to_Inverse(char * data)
|
||||
{
|
||||
Int I;
|
||||
I.byte[0] = data[3];
|
||||
I.byte[1] = data[2];
|
||||
I.byte[2] = data[1];
|
||||
I.byte[3] = data[0];
|
||||
return I.data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
+10
-2
@@ -3,17 +3,25 @@
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
typedef union {
|
||||
typedef union
|
||||
{
|
||||
uint32_t data;
|
||||
char byte[4];
|
||||
} Int;
|
||||
typedef union {
|
||||
typedef union
|
||||
{
|
||||
float data;
|
||||
char byte[4];
|
||||
} Float;
|
||||
|
||||
|
||||
float Bytes2Float (char * data);
|
||||
uint32_t Bytes2Int (char * data);
|
||||
int hexstr_to_hexbyte (char *src, char *obj, uint16_t length);
|
||||
float iee754_to_float (char * data);
|
||||
uint32_t byte_to_Inverse(char * data);
|
||||
// 754 תfloat
|
||||
float float_to_iee754 (float ff1,char * data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef cJSON__h
|
||||
#define cJSON__h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
|
||||
#define __WINDOWS__
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
|
||||
|
||||
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
|
||||
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
|
||||
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
|
||||
|
||||
For *nix builds that support visibility attribute, you can define similar behavior by
|
||||
|
||||
setting default visibility to hidden by adding
|
||||
-fvisibility=hidden (for gcc)
|
||||
or
|
||||
-xldscope=hidden (for sun cc)
|
||||
to CFLAGS
|
||||
|
||||
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
|
||||
|
||||
*/
|
||||
|
||||
#define CJSON_CDECL __cdecl
|
||||
#define CJSON_STDCALL __stdcall
|
||||
|
||||
/* export symbols by default, this is necessary for copy pasting the C and header file */
|
||||
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_EXPORT_SYMBOLS
|
||||
#endif
|
||||
|
||||
#if defined(CJSON_HIDE_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) type CJSON_STDCALL
|
||||
#elif defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
|
||||
#elif defined(CJSON_IMPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
|
||||
#endif
|
||||
#else /* !__WINDOWS__ */
|
||||
#define CJSON_CDECL
|
||||
#define CJSON_STDCALL
|
||||
|
||||
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
|
||||
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
|
||||
#else
|
||||
#define CJSON_PUBLIC(type) type
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* project version */
|
||||
#define CJSON_VERSION_MAJOR 1
|
||||
#define CJSON_VERSION_MINOR 7
|
||||
#define CJSON_VERSION_PATCH 15
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/* cJSON Types: */
|
||||
#define cJSON_Invalid (0)
|
||||
#define cJSON_False (1 << 0)
|
||||
#define cJSON_True (1 << 1)
|
||||
#define cJSON_NULL (1 << 2)
|
||||
#define cJSON_Number (1 << 3)
|
||||
#define cJSON_String (1 << 4)
|
||||
#define cJSON_Array (1 << 5)
|
||||
#define cJSON_Object (1 << 6)
|
||||
#define cJSON_Raw (1 << 7) /* raw json */
|
||||
|
||||
#define cJSON_IsReference 256
|
||||
#define cJSON_StringIsConst 512
|
||||
|
||||
/* The cJSON structure: */
|
||||
typedef struct cJSON
|
||||
{
|
||||
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
||||
struct cJSON *next;
|
||||
struct cJSON *prev;
|
||||
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
||||
struct cJSON *child;
|
||||
|
||||
/* The type of the item, as above. */
|
||||
int type;
|
||||
|
||||
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
|
||||
char *valuestring;
|
||||
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
|
||||
int valueint;
|
||||
/* The item's number, if type==cJSON_Number */
|
||||
double valuedouble;
|
||||
|
||||
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||
char *string;
|
||||
} cJSON;
|
||||
|
||||
typedef struct cJSON_Hooks
|
||||
{
|
||||
/* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
|
||||
void *(CJSON_CDECL *malloc_fn)(size_t sz);
|
||||
void (CJSON_CDECL *free_fn)(void *ptr);
|
||||
} cJSON_Hooks;
|
||||
|
||||
typedef int cJSON_bool;
|
||||
|
||||
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
|
||||
* This is to prevent stack overflows. */
|
||||
#ifndef CJSON_NESTING_LIMIT
|
||||
#define CJSON_NESTING_LIMIT 1000
|
||||
#endif
|
||||
|
||||
/* returns the version of cJSON as a string */
|
||||
char* cJSON_Version(void);
|
||||
|
||||
/* Supply malloc, realloc and free functions to cJSON */
|
||||
//CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
||||
CJSON_PUBLIC(void) cJSON_InitHooks(void);
|
||||
|
||||
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
|
||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
|
||||
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||
|
||||
/* Render a cJSON entity to text for transfer/storage. */
|
||||
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
|
||||
/* Render a cJSON entity to text for transfer/storage without any formatting. */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
|
||||
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
|
||||
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
|
||||
/* Delete a cJSON entity and all subentities. */
|
||||
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
|
||||
|
||||
/* Returns the number of items in an array (or object). */
|
||||
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
|
||||
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
|
||||
/* Get item "string" from object. Case insensitive. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
||||
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||
|
||||
/* Check item type and return its value */
|
||||
CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
|
||||
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
|
||||
|
||||
/* These functions check the type of an item */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
|
||||
|
||||
/* These calls create a cJSON item of the appropriate type. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||
/* raw json */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||
|
||||
/* Create a string where valuestring references a string so
|
||||
* it will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
|
||||
/* Create an object/array that only references it's elements so
|
||||
* they will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
|
||||
|
||||
/* These utilities create an Array of count items.
|
||||
* The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
|
||||
|
||||
/* Append item to the specified array/object. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
|
||||
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
|
||||
* writing to `item->string` */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
|
||||
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
|
||||
|
||||
/* Remove/Detach items from Arrays/Objects. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
|
||||
/* Update array items. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
|
||||
|
||||
/* Duplicate a cJSON item */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
|
||||
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
|
||||
* need to be released. With recurse!=0, it will duplicate any children connected to the item.
|
||||
* The item->next and ->prev pointers are always zero on return from Duplicate. */
|
||||
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
|
||||
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
|
||||
|
||||
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||
* but should point to a readable and writable address area. */
|
||||
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||
|
||||
/* Helper functions for creating and adding items to an object at the same time.
|
||||
* They return the added item or NULL on failure. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
|
||||
|
||||
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
|
||||
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
|
||||
/* helper for the cJSON_SetNumberValue macro */
|
||||
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
|
||||
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
|
||||
/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
|
||||
CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
|
||||
|
||||
/* Macro for iterating over an array or object */
|
||||
#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
|
||||
|
||||
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
|
||||
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
|
||||
CJSON_PUBLIC(void) cJSON_free(void *object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
#include "stm32g0xx_hal.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// 获取uint32_t 的数值
|
||||
uint32_t ef_get_integer(const char * key);
|
||||
|
||||
// 获取double 的数值
|
||||
double ef_get_double(const char* key);
|
||||
|
||||
// 获取字符串的数值
|
||||
char* ef_get_string(const char* key);
|
||||
|
||||
|
||||
// 存储无符号整
|
||||
void ef_save_uint(const char* key, unsigned int value);
|
||||
|
||||
// 存储string类型
|
||||
void ef_save_string(const char* key, char* value, int size);
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "rtthread.h"
|
||||
|
||||
|
||||
// 获取uint32_t 的数值
|
||||
@@ -13,8 +14,7 @@ uint32_t ef_get_integer(const char * key)
|
||||
/* get the boot count number from Env */
|
||||
value_ptr = ef_get_env (key);
|
||||
|
||||
integer = atol (value_ptr);
|
||||
|
||||
integer = atoi (value_ptr);
|
||||
return integer;
|
||||
}
|
||||
|
||||
@@ -42,3 +42,24 @@ char * ef_get_string(const char * key)
|
||||
}
|
||||
|
||||
|
||||
// ´æ´¢ÎÞ·ûºÅÕû
|
||||
void ef_save_uint(const char* key, unsigned int value)
|
||||
{
|
||||
char valuebuff[128];
|
||||
rt_sprintf(valuebuff, "%u", value);
|
||||
ef_set_env(key, valuebuff);
|
||||
ef_save_env();
|
||||
}
|
||||
|
||||
// ´æ´¢stringÀàÐÍ
|
||||
void ef_save_string(const char* key, char* value, int size)
|
||||
{
|
||||
char valuebuff[128];
|
||||
rt_sprintf(valuebuff, "%*.s", size, value);
|
||||
//rt_kprintf("%s\r\n",valuebuff);
|
||||
ef_set_env(key, valuebuff);
|
||||
ef_save_env();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -40,15 +40,21 @@ static const ef_env default_env_set[] = {
|
||||
{"iap_need_uart_update", "0"}, // 需要通过串口升级
|
||||
{"iap_app_filename", "App.bin"},
|
||||
{"stop_in_bootloader", "0"},
|
||||
{"device_id", "0000000001"},
|
||||
{"boot_times", "0"},
|
||||
{"jump_boot_time", "10"}, // BOOT 等待时间 10s
|
||||
// 基础参数设置
|
||||
{"device_id", "0000000003"},
|
||||
{"app_id", "220000"}, // 业务ID
|
||||
{"user_pass", "123456"},
|
||||
{"sys_pass", "898909"},
|
||||
{"mqtt_user", "admin"},
|
||||
{"mqtt_pass", "admin"},
|
||||
{"mqtt_addr", "mqtt.zyjzjs.cn"},
|
||||
{"mqtt_port", "1883"},
|
||||
{"boot_times", "0"},
|
||||
{"jump_boot_time", "10"}, // BOOT 等待时间 10s
|
||||
{"net_drv", "dtu"}, // mqtt dtu ec200
|
||||
{"eth2_chann", "1"}, //以太网通道2
|
||||
{"mqtt_topic", "sluice"}, //订阅topic
|
||||
|
||||
{"net_drv", "dtu"}, // mqtt dtu ec200 eth
|
||||
{"eth2_chann", "0"}, //以太网通道2 支持modbus
|
||||
|
||||
// 传感器基础参数配置
|
||||
{"di1", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
|
||||
@@ -58,14 +64,10 @@ static const ef_env default_env_set[] = {
|
||||
{"di5", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
|
||||
{"di6", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
|
||||
// 485 配置参数
|
||||
{"s4851num", "1"}, // 4851 接入传感器的个数
|
||||
{"s4852num", "0"}, // 4852 接入传感器的个数
|
||||
{"s4851func", "0100000000000000"}, // 4851 接入传感器的类型
|
||||
{"s4852func", "0000000000000000"}, // 4852 接入传感器的类型
|
||||
{"s4851bute", "9600"}, // 4851 波特率
|
||||
{"s4852bute", "19200"}, // 4852 波特率
|
||||
{"s4851para", "0"}, // 4851 接入传感器的个数
|
||||
{"s4852para", "0"}, // 4851 接入传感器的个数
|
||||
{"u485func", "mg1000"}, // 用于一个柜子控制多台闸门
|
||||
{"s4851func", "rds600"}, // 4851 接入传感器的类型 rds600 tds300
|
||||
{"s4852func", "modbus"}, // 4852 接入传感器的类型
|
||||
|
||||
// 模拟量配置
|
||||
{"ai1", "0"}, // AI1接入设备
|
||||
{"ai2", "0"}, // AI2接入设备
|
||||
@@ -80,18 +82,27 @@ static const ef_env default_env_set[] = {
|
||||
{"pwm4", "0"}, // PWM4功能
|
||||
|
||||
// 闸门参数设置
|
||||
{"maxopen", "140"}, // PWM4功能
|
||||
{"maxecode", "0"}, // PWM4功能
|
||||
{"minecode", "0"}, // PWM4功能
|
||||
{"codepre", "0"}, // 编码器和闸门开度的比
|
||||
{"max_open", "1400"}, // 最大开度
|
||||
{"max_ecode", "31241"}, // 编码器最大编码
|
||||
{"min_ecode", "32828"}, // 编码器最小编码
|
||||
{"exec_time", "50"}, // 异常检测时间 单位100ms 50 就是 5s
|
||||
|
||||
// 闸门参数设置
|
||||
{"motortype", "140"}, // PWM4功能
|
||||
{"codertype", "0"}, // PWM4功能
|
||||
{"loadrtype", "0"}, // PWM4功能
|
||||
{"flowrtype", "0"}, // 编码器和闸门开度的比
|
||||
{"ctrl_mode", "0"}, // 控制模式 // 1 直接开度控制,0 反馈开度控制
|
||||
{"motor_type", "mg1000"}, // 电机类型 // mg a3 b5
|
||||
{"simu_flow", "0"}, // 0 未启动 1 水位流量关系表 2巴歇尔槽启动流量关系表
|
||||
{"parshall", "7"}, // 巴歇尔槽规格
|
||||
// 流量数据存储
|
||||
{"ttflow", "0"}, // 累计流量
|
||||
{"chancnt", "1"}, // 流量计通道数
|
||||
{"site_type", "sluice"}, // 0,闸门站,1,流量站,2,渗流渗压站,3,自动化采集站,4,串口服务器
|
||||
{"level","[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]"},
|
||||
{"flow", "[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]"},
|
||||
{"wsid","[128,2,3,4,5,6]"},
|
||||
// 水位流量关系表 配置10 个点
|
||||
|
||||
|
||||
|
||||
{"speed", "0"}, // 编码器和闸门开度的比
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ extern "C" {
|
||||
#endif /* ELOG_OUTPUT_ENABLE */
|
||||
|
||||
/* all formats index */
|
||||
typedef enum {
|
||||
typedef enum { //
|
||||
ELOG_FMT_LVL = 1 << 0, /**< level */
|
||||
ELOG_FMT_TAG = 1 << 1, /**< tag */
|
||||
ELOG_FMT_TIME = 1 << 2, /**< current time */
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <elog.h>
|
||||
#include <stdio.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
/**
|
||||
* EasyLogger port initialize
|
||||
@@ -61,7 +62,7 @@ void elog_port_deinit(void) {
|
||||
void elog_port_output(const char *log, size_t size) {
|
||||
|
||||
/* add your code here */
|
||||
printf("%.*s", size, log);
|
||||
rt_kprintf("%.*s", size, log);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include<stdint.h>
|
||||
#include "crc.h"
|
||||
#include "modbus-m.h"
|
||||
#include "rtthread.h"
|
||||
|
||||
// 读取保持寄存器的值
|
||||
// addr 寄存器地址
|
||||
@@ -22,6 +24,25 @@ int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data
|
||||
return index;
|
||||
}
|
||||
|
||||
// 读取输入的值
|
||||
// addr 寄存器地址
|
||||
// id 丛机地址
|
||||
// length 读取丛机数据长度
|
||||
int modbus_m_read_input(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data)
|
||||
{
|
||||
uint16_t index = 0,crc;
|
||||
data[index++] = id;
|
||||
data[index++] = 0x04;
|
||||
data[index++] = (addr >> 8) & 0x00FF;
|
||||
data[index++] = addr & 0x00FF;
|
||||
data[index++] = (length >> 8) & 0x00FF;
|
||||
data[index++] = length & 0x00FF;
|
||||
crc = MX_CRC_CALC(data,index);
|
||||
data[index++] = crc & 0x00FF;
|
||||
data[index++] = (crc >> 8) & 0x00FF;
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
// 写入寄存器
|
||||
// addr 寄存器地址
|
||||
@@ -43,3 +64,72 @@ int modbus_m_write_regist(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data)
|
||||
}
|
||||
|
||||
|
||||
//03 10 00 02 00 02 04 41 00 00 00
|
||||
// 写入寄存器
|
||||
// addr 寄存器地址
|
||||
// id 丛机地址
|
||||
// length 读取丛机数据长度
|
||||
int modbus_m_write_mregist(uint8_t id,uint16_t addr,uint8_t *key,uint16_t size ,uint8_t * data)
|
||||
{
|
||||
uint16_t index = 0,crc;
|
||||
data[index++] = id;
|
||||
data[index++] = 0x10;
|
||||
data[index++] = (addr >> 8) & 0x00FF;
|
||||
data[index++] = addr & 0x00FF;
|
||||
data[index++] = (size >> 8) & 0x00FF;
|
||||
data[index++] = size & 0x00FF;
|
||||
data[index++] = size * 2;
|
||||
for (int i =0;i < size * 2;i++)
|
||||
{
|
||||
data[index++] = key[i];
|
||||
}
|
||||
crc = MX_CRC_CALC(data,index);
|
||||
data[index++] = crc & 0x00FF;
|
||||
data[index++] = (crc >> 8) & 0x00FF;
|
||||
return index;
|
||||
}
|
||||
|
||||
// 写入寄存器
|
||||
// addr 寄存器地址
|
||||
// id 丛机地址
|
||||
// length 读取丛机数据长度
|
||||
int modbus_m_write_coil(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data)
|
||||
{
|
||||
uint16_t index = 0,crc;
|
||||
data[index++] = id;
|
||||
data[index++] = 0x05;
|
||||
data[index++] = (addr >> 8) & 0x00FF;
|
||||
data[index++] = addr & 0x00FF;
|
||||
if (key == 1)
|
||||
{
|
||||
data[index++] = (addr >> 8) & 0x00FF;
|
||||
data[index++] = addr & 0x00FF;
|
||||
}
|
||||
else
|
||||
{
|
||||
data[index++] = 0x00;
|
||||
data[index++] = 0x00;
|
||||
}
|
||||
crc = MX_CRC_CALC(data,index);
|
||||
data[index++] = crc & 0x00FF;
|
||||
data[index++] = (crc >> 8) & 0x00FF;
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
MOD_T modbus_m_crc_check(uint8_t * data,int size )
|
||||
{
|
||||
uint16_t rcrc = 0,ccrc;
|
||||
if (size < 4)
|
||||
{
|
||||
return MOD_ERR;
|
||||
}
|
||||
|
||||
ccrc = MX_CRC_CALC(data,size-2);
|
||||
rcrc = ((uint16_t)data[size-1] << 8 )+ (uint16_t)data[size-2];
|
||||
if (ccrc == rcrc )
|
||||
return MOD_OK;
|
||||
return MOD_ERR;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,18 @@
|
||||
#define MODBUS_M_H
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum {
|
||||
MOD_OK = 0,
|
||||
MOD_ERR = 1
|
||||
}MOD_T;
|
||||
|
||||
|
||||
int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data);
|
||||
int modbus_m_write_regist(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data);
|
||||
int modbus_m_read_input(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data) ;
|
||||
int modbus_m_write_coil(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data);
|
||||
MOD_T modbus_m_crc_check(uint8_t * data,int size );
|
||||
int modbus_m_write_mregist(uint8_t id,uint16_t addr,uint8_t *key,uint16_t size ,uint8_t * data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
#include<stdint.h>
|
||||
#include "crc.h"
|
||||
#include "modbus-s.h"
|
||||
#include "modbus-m.h"
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "main"
|
||||
#define LOG_TAG "modbus-s"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
@@ -22,19 +23,16 @@ void ModbusSlaveInit(ModBusSlave_t * drv,uint8_t ID,uint8_t * data,uint16_t * r
|
||||
//-1 華硊渣昫
|
||||
int ModbusSlaveHandle(ModBusSlave_t * drv,uint8_t * data,uint16_t length )
|
||||
{
|
||||
uint16_t rcrc = 0,ccrc = 0 ;
|
||||
if( (data[0] != drv->ID) && (data[0] != 0x00))
|
||||
{
|
||||
// 華硊渣昫
|
||||
return -1;
|
||||
}
|
||||
rcrc = ((uint16_t)data[length- 1] << 8) + (uint16_t)data[length- 2] ;
|
||||
ccrc = MX_CRC_CALC(data,length-2);
|
||||
if (rcrc != ccrc )
|
||||
if(modbus_m_crc_check(data,length) != MOD_OK)
|
||||
{
|
||||
log_e("rcrc:%04X,ccrc:%04X\r\n",rcrc,ccrc) ;
|
||||
return -2;
|
||||
}
|
||||
|
||||
drv->func = data[1] ;
|
||||
|
||||
switch (drv->func)
|
||||
|
||||
Submodule
+1
Submodule middleware/paho.mqtt.embedded-c added at 29ab2aa29c.
@@ -29,6 +29,9 @@
|
||||
#ifndef _SFUD_CFG_H_
|
||||
#define _SFUD_CFG_H_
|
||||
|
||||
#ifndef BOOT
|
||||
#define SFUD_DEBUG_MODE
|
||||
#endif
|
||||
#define SFUD_DEBUG_MODE
|
||||
|
||||
#define SFUD_USING_SFDP
|
||||
|
||||
Reference in new issue
Block a user