引入mqtt 引入cjson

This commit is contained in:
2584532475@qq.com committed 2023-11-30 08:10:01 +08:00
1 parent a69c1a58d6
commit f8591b8b99
72 files changed
+10319 -335

No files matched your search

+123
View File
@@ -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 ;
}
+458
View File
@@ -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 ;
}
+126
View File
@@ -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
+667
View File
@@ -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 ;
}
+128
View File
@@ -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);
}
}
+165
View File
@@ -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
+55
View File
@@ -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);
}
+12
View File
@@ -0,0 +1,12 @@
#ifndef _SIM_FLOW_H
#define _SIM_FLOW_H
int32_t ParShallCalc(int index,double leve);
#endif
+163
View File
@@ -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 ;
}
+22
View File
@@ -0,0 +1,22 @@
#include "ao-board.h"
// //³õʼ»¯ 4-20 ma ͨµÀ
void MX_AOInit (O4_20mA_t o)
{
}
+15
View File
@@ -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
View File
@@ -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
View File
@@ -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
+9
View File
@@ -0,0 +1,9 @@
#include "do-board.h"
#include "tim.h"
void MX_Dout_Push(int index,int pwm)
{
MX_TIM_SetDuty(index,pwm);
}
+6
View File
@@ -0,0 +1,6 @@
#ifndef _DO_BOARD_HH
#define _DO_BOARD_HH
void MX_Dout_Push(int index, int pwm);
#endif
+307
View File
@@ -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 ;
}
+26
View File
@@ -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
View File
@@ -7,6 +7,11 @@
#include <rtthread.h> #include <rtthread.h>
#include <string.h> #include <string.h>
#include "usart-board.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 char thread_stack[2048];
static struct rt_thread dtu_thread; 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; // 连接成功 0, // 信号值
"", // iccid
} g_dtuDrv ; Init, // 状态
tx_buffer, // 接受缓存
0, // 接受数据长度
rx_buffer, // 发送数据缓存
static enum 0, // 发送数据长度
{ };
netDrvInit = 0, // 初始化网络驱动
netDrvJoin = 1, // 等待网络注册成功
netDrvSend = 2, // 发送数据
netDrvRecv = 3, // 读取数据
netDrvIdle = 4, // 读取数据
} eDrvStatus;
static void net_data_rxdone (void) static void net_data_rxdone (void)
@@ -47,36 +50,75 @@ static void net_data_rxdone(void)
static void thread_entry (void * argument) static void thread_entry (void * argument)
{ {
// eDrvStatus = netDrvInit;
rt_kprintf ("%s was start!\r\n", __FILE__); 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; g_ETH1Drv.rxdone = net_data_rxdone;
MX_UART_Init(&g_ETH1Drv); // MX_UART_Init(&g_ETH1Drv);
// // 注册网络驱动
// 注册网络驱动
while (1) while (1)
{ {
//MX_UART_PutBuffer(&g_ETH1Drv,"20140524",8); MODE_RST:
if( RT_EOK == rt_event_recv( gUartEvents, EVENT_UART_ETH1_RX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL )) 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) ; MX_UART_Clear (&g_ETH1Drv) ;
} }
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
rt_thread_delay (100); 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) void DTUThreadStart (void)
@@ -88,7 +130,6 @@ void DTUThreadStart (void)
sizeof (thread_stack), sizeof (thread_stack),
DTU_THREAD_PRIORITY, DTU_THREAD_TIMESLICE); DTU_THREAD_PRIORITY, DTU_THREAD_TIMESLICE);
rt_thread_startup (&dtu_thread); rt_thread_startup (&dtu_thread);
return ; return ;
} }
+6 -2
View File
@@ -1,9 +1,13 @@
#ifndef _DTU_BOARD_H #ifndef _DTU_BOARD_H
#define _DTU_BOARD_H #define _DTU_BOARD_H
typedef struct {
}
void dtu_service_tx (char * buff, int size);
void dtu_netreset (void);
#endif #endif
+2 -1
View File
@@ -1,7 +1,8 @@
#ifndef _DTU_BOARD_H #ifndef _DTU_BOARD_H
#define _DTU_BOARD_H #define _DTU_BOARD_H
typedef struct { typedef struct
{
} }
+237
View File
@@ -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\"}");
}
+18
View File
@@ -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
+106
View File
@@ -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);
}
+9
View File
@@ -0,0 +1,9 @@
#ifndef _JSON_UNPACKET_H
#define _JSON_UNPACKET_H
#include <stdint.h>
void JsonUnPacket (int index, char *buff);
#endif
+114
View File
@@ -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 ;
}
+12
View File
@@ -0,0 +1,12 @@
#ifndef _MJETH1_DRV_H
#define _MJETH1_DRV_H
#endif
+323
View File
@@ -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) ;
}
+22
View File
@@ -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
+161
View File
@@ -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;
}
+41
View File
@@ -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
+43
View File
@@ -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>
+10
View File
@@ -0,0 +1,10 @@
#ifndef _NET_WORK_H
#define _NET_WORK_H
#endif
+238
View File
@@ -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 ;
}
+64
View File
@@ -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
+132
View File
@@ -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 ;
}
+16
View File
@@ -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
+37
View File
@@ -238,6 +238,7 @@ void MX_UART_Init (UartDrv_t *drv)
{ {
Error_Handler(); Error_Handler();
} }
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
break; break;
case G0_UART1 : // 4853 case G0_UART1 : // 4853
huart1.Instance = USART1; huart1.Instance = USART1;
@@ -328,6 +329,7 @@ void MX_UART_Init (UartDrv_t *drv)
{ {
Error_Handler(); Error_Handler();
} }
__HAL_UART_ENABLE_IT (&huart3, UART_IT_RXNE);
break; break;
case G0_UART4: // ETH1 case G0_UART4: // ETH1
huart4.Instance = USART4; huart4.Instance = USART4;
@@ -383,6 +385,7 @@ void MX_UART_Init (UartDrv_t *drv)
{ {
Error_Handler(); Error_Handler();
} }
__HAL_UART_ENABLE_IT (&huart6, UART_IT_RXNE);
break; break;
default: default:
break; break;
@@ -394,6 +397,17 @@ void MX_UART_Init (UartDrv_t *drv)
void MX_UART_IRQHandle (void) void MX_UART_IRQHandle (void)
{ {
uint8_t ret; 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 if (USART2->ISR & (1 << 5)) // 串口2
{ {
ret = USART2->RDR; ret = USART2->RDR;
@@ -427,6 +441,17 @@ void MX_UART_IRQHandle (void)
g_U4851Drv.rx_size = 0; 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)) if (LPUART1->ISR & (1 << 5))
{ {
@@ -439,6 +464,18 @@ void MX_UART_IRQHandle (void)
g_ETH2Drv.rx_size = 0; 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
View File
@@ -3,24 +3,35 @@
#include <stdint.h> #include <stdint.h>
typedef struct reg_data_t
#define REG_GOPENH 0X0000 {
#define REG_GOPENL 0X0001 uint16_t gopen;
uint16_t aload;
#define REG_ALOADH 0X0002 uint16_t bload;
#define REG_ALOADL 0X0003 uint16_t bl1;
uint16_t bl2;
#define REG_BLOADH 0X0004 uint16_t bl3;
#define REG_BLOADL 0X0005 uint16_t bl4;
uint16_t sopen;
#define REG_SOPEN 0X0007 uint16_t slopt;
#define REG_SLOPT 0X0008 // 执行闸门动作 } reg_data_t;
typedef enum reg_addr_t
#define REG_MAX 0X0009 {
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
View File
@@ -5,16 +5,16 @@
typedef struct netWorkInterface_t //typedef struct netWorkInterface_t
{ //{
void (*Init) (void); // void (*Init) (void);
int (*IsConnected) (void); // int (*IsConnected) (void);
void (*WriteData) (char *, int); // void (*WriteData) (char *, int);
int (*ReadData) (char *, int); // int (*ReadData) (char *, int);
int (*IsReady) (void); // int (*IsReady) (void);
int (*IsIdle) (void); // int (*IsIdle) (void);
int (*ReSubTopic) (char *); // int (*ReSubTopic) (char *);
} netWorkInterface_t; //} netWorkInterface_t;
typedef struct NetPacket_t typedef struct NetPacket_t
+267 -54
View File
@@ -10,92 +10,306 @@
#include <string.h> #include <string.h>
#include "usart-board.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) ALIGN (RT_ALIGN_SIZE)
static char thread_stack[4096]; static char thread_stack[4096];
static struct rt_thread netapp_thread; 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: static rt_timer_t timer;
// {
// 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 enum { static uint32_t g_net_5min_timer[SLUICE_COUTN] = {0};
netDrvInit = 0, // 初始化网络驱动 static uint32_t g_net_1min_timer[SLUICE_COUTN] = {0};
netDrvJoin = 1, // 等待网络注册成功
netDrvSend = 2, // 发送数据
netDrvRecv = 3, // 读取数据
netDrvIdle = 4, // 读取数据
}eDrvStatus;
static netWorkInterface_t interface;
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));
} }
// 网络链接成功 if (g_net_5min_timer[i] == 1)
static void net_connected(void)
{ {
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) static void thread_entry (void * argument)
{ {
eDrvStatus = netDrvInit;
rt_kprintf ("%s was start!\r\n", __FILE__); 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"); // 读取网络类型 netdrv_init();
if(strcmp("dtu",drv) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传 MQTTThreadStart();
{ char data[100] = {0};
DTUThreadStart(); int tx_size = 0;
// 初始化串口驱动 #ifndef USER_JSON_PACKET
// interface.Init = NULL; char rxdata_decode[256];
// interface.IsConnected = NULL; int rxdata_decode_size = 0;
// interface.IsIdle = NULL; uint32_t datak;
// interface.IsReady = NULL; #endif
// interface.ReadData = NULL;
// interface.ReSubTopic = NULL;
// interface.WriteData = NULL;
} // 判断站点类型
//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) 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), sizeof (thread_stack),
NET_APP_THREAD_PRIORITY, NET_APP_THREAD_TIMESLICE); NET_APP_THREAD_PRIORITY, NET_APP_THREAD_TIMESLICE);
rt_thread_startup (&netapp_thread); rt_thread_startup (&netapp_thread);
return ; return ;
} }
+45 -42
View File
@@ -11,6 +11,7 @@
#include "usart-board.h" #include "usart-board.h"
#include "modbus-s.h" #include "modbus-s.h"
#include "modbusaddr.h" #include "modbusaddr.h"
#include "data.h"
ALIGN (RT_ALIGN_SIZE) ALIGN (RT_ALIGN_SIZE)
@@ -18,63 +19,57 @@ static char thread_stack[4096];
static struct rt_thread probus_thread; 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 ModBusSlave_t modbus_slave;
static uint8_t modbus_rx_data[32]; static uint8_t modbus_rx_data[256];
static void eth2_data_rxdone (void) static void eth2_data_rxdone (void)
{ {
rt_event_send (gUartEvents, EVENT_UART_ETH2_RX); 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) switch (addr)
{ {
case REG_SOPEN: // 设定闸门开度 case reg_sopen: // 设定闸门开度
data32 = data[0];
data32 = (data32 << 8) + data[1];
SluiceData[0].sopen = data32 * 10;
break; break;
case REG_SLOPT: // 执行闸门动作 case reg_slopt: // 执行闸门动作
rt_kprintf ("reg_slopt\r\n");
if (data[0] == 0x01) // 执行 if (data[0] == 0x01) // 执行
{ {
rt_event_send(gCtrlEvents,EVENT_CTRL_SET_OPEN); rt_kprintf ("reg_slopt\r\n");
rt_kprintf("probus_handle set open\r\n"); mail.Type = MAIL_SLUICE_OPT;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
} }
else else
{ {
mail.Type = MAIL_SLUICE_STP;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
rt_kprintf ("reg_stp\r\n");
} }
break; break;
@@ -96,21 +91,27 @@ static void thread_entry(void * argument)
g_ETH2Drv.BaudRate = 115200; g_ETH2Drv.BaudRate = 115200;
MX_UART_Init (&g_ETH2Drv); 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 *) &reg_data, sizeof (reg_data_t) / 2);
MX_UART_Clear (&g_ETH2Drv);
// 注册网络驱动 // 注册网络驱动
// 注册网络驱动 // 注册网络驱动
while (1) 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)) 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++)
// for(int i =0; i < g_ETH2Drv.rx_size;i++) {
// { rt_kprintf ("%02x", g_ETH2Drv.rx_buffer[i]);
// rt_kprintf("%02X ",g_ETH2Drv.rx_buffer[i]); }
// } if (g_ETH2Drv.rx_size > 4)
// rt_kprintf("\r\n"); {
k = ModbusSlaveHandle (&modbus_slave, (uint8_t *) g_ETH2Drv.rx_buffer, g_ETH2Drv.rx_size); 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) if (k == 0)
{ {
switch (modbus_slave.func) switch (modbus_slave.func)
@@ -136,12 +137,14 @@ static void thread_entry(void * argument)
} }
if (tx_size > 0) if (tx_size > 0)
{ {
//rt_kprintf("tx_size :%d\r\n",tx_size);
MX_UART_PutBuffer (&g_ETH2Drv, (char *) txbuff, tx_size); MX_UART_PutBuffer (&g_ETH2Drv, (char *) txbuff, tx_size);
} }
}
MX_UART_Clear (&g_ETH2Drv); MX_UART_Clear (&g_ETH2Drv);
} }
rt_thread_delay(10); rt_thread_mdelay (100);
} }
} }
+2
View File
@@ -133,6 +133,8 @@ void Error_Handler(void);
#define DI6_GPIO_Port GPIOD #define DI6_GPIO_Port GPIOD
#define PWM_CH1_Pin GPIO_PIN_4 #define PWM_CH1_Pin GPIO_PIN_4
#define PWM_CH1_GPIO_Port GPIOB #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_Pin GPIO_PIN_0
#define RELAY1_GPIO_Port GPIOE #define RELAY1_GPIO_Port GPIOE
#define RELAY2_Pin GPIO_PIN_1 #define RELAY2_Pin GPIO_PIN_1
+1 -1
View File
@@ -58,7 +58,7 @@ void MX_TIM15_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/* USER CODE BEGIN Prototypes */ /* USER CODE BEGIN Prototypes */
void MX_TIM_SetDuty (int index, uint32_t duty);
/* USER CODE END Prototypes */ /* USER CODE END Prototypes */
#ifdef __cplusplus #ifdef __cplusplus
+7 -1
View File
@@ -204,7 +204,13 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
uint32_t MX_READ_ADC_VALUE (int channel) 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
View File
@@ -20,6 +20,7 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "gpio.h" #include "gpio.h"
#include <rtthread.h>
/* USER CODE BEGIN 0 */ /* 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); HAL_GPIO_WritePin (GPIOA, ETH_PW_Pin | GSM_PW_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */ /*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 */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin (GPIOE, LORA_M1_Pin | RELAY1_Pin | RELAY2_Pin | S4851_RT_Pin 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; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init (DAC2_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init (DAC2_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PBPin PBPin PBPin PBPin */ /*Configure GPIO pins : PBPin PBPin PBPin PBPin
GPIO_InitStruct.Pin = U485_RT_Pin|LORA_TX_Pin|LORA_RX_Pin|SPI2_NSS_Pin; 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.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
@@ -130,6 +134,19 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init (GPIOD, &GPIO_InitStruct); 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
View File
@@ -191,7 +191,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
/* USER CODE BEGIN Callback 0 */ /* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */ /* USER CODE END Callback 0 */
if (htim->Instance == TIM2) { if (htim->Instance == TIM2)
{
HAL_IncTick(); HAL_IncTick();
} }
/* USER CODE BEGIN Callback 1 */ /* USER CODE BEGIN Callback 1 */
+5 -3
View File
@@ -75,7 +75,7 @@ extern TIM_HandleTypeDef htim2;
/* USER CODE BEGIN EV */ /* USER CODE BEGIN EV */
extern void MX_UART_IRQHandle (void); extern void MX_UART_IRQHandle (void);
extern void MX_UART_TickHandle (void); extern void MX_UART_TickHandle (void);
//extern void main_Systick (void); extern void main_Systick (void);
/* USER CODE END EV */ /* USER CODE END EV */
/******************************************************************************/ /******************************************************************************/
@@ -154,9 +154,11 @@ void TIM2_IRQHandler(void)
{ {
/* USER CODE BEGIN TIM2_IRQn 0 */ /* USER CODE BEGIN TIM2_IRQn 0 */
MX_UART_TickHandle(); MX_UART_TickHandle();
//main_Systick(); main_Systick();
#ifdef USE_APP_SLUICE
MX_IWDG_Reload(); MX_IWDG_Reload();
MX_WWDG_Relad(); //MX_WWDG_Relad();
#endif
/* USER CODE END TIM2_IRQn 0 */ /* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler (&htim2); HAL_TIM_IRQHandler (&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */ /* USER CODE BEGIN TIM2_IRQn 1 */
+69 -3
View File
@@ -97,7 +97,7 @@ void MX_TIM3_Init(void)
htim3.Instance = TIM3; htim3.Instance = TIM3;
htim3.Init.Prescaler = 0; htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535; htim3.Init.Period = 640;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init (&htim3) != HAL_OK) if (HAL_TIM_PWM_Init (&htim3) != HAL_OK)
@@ -134,6 +134,10 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit (&htim3); 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 */ /* TIM6 init function */
@@ -247,7 +251,7 @@ void MX_TIM15_Init(void)
htim15.Init.Prescaler = 0; htim15.Init.Prescaler = 0;
htim15.Init.CounterMode = TIM_COUNTERMODE_UP; htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
htim15.Init.Period = 65535; htim15.Init.Period = 65535;
htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4 ;
htim15.Init.RepetitionCounter = 0; htim15.Init.RepetitionCounter = 0;
htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init (&htim15) != HAL_OK) if (HAL_TIM_PWM_Init (&htim15) != HAL_OK)
@@ -261,7 +265,7 @@ void MX_TIM15_Init(void)
Error_Handler(); Error_Handler();
} }
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; sConfigOC.Pulse = 3000;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
@@ -291,6 +295,8 @@ void MX_TIM15_Init(void)
/* USER CODE END TIM15_Init 2 */ /* USER CODE END TIM15_Init 2 */
HAL_TIM_MspPostInit (&htim15); 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 */ /* 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 */ /* USER CODE END 1 */
+1 -1
View File
@@ -608,7 +608,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
*/ */
GPIO_InitStruct.Pin = U485_TX_Pin | U485_RX_Pin; GPIO_InitStruct.Pin = U485_TX_Pin | U485_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 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.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_USART5; GPIO_InitStruct.Alternate = GPIO_AF8_USART5;
HAL_GPIO_Init (GPIOB, &GPIO_InitStruct); HAL_GPIO_Init (GPIOB, &GPIO_InitStruct);
+27 -21
View File
@@ -143,31 +143,32 @@ Mcu.Pin45=PD3
Mcu.Pin46=PF12 Mcu.Pin46=PF12
Mcu.Pin47=PF13 Mcu.Pin47=PF13
Mcu.Pin48=PB4 Mcu.Pin48=PB4
Mcu.Pin49=PE0 Mcu.Pin49=PB5
Mcu.Pin5=PE6 Mcu.Pin5=PE6
Mcu.Pin50=PE1 Mcu.Pin50=PE0
Mcu.Pin51=PE2 Mcu.Pin51=PE1
Mcu.Pin52=PE3 Mcu.Pin52=PE2
Mcu.Pin53=PB6 Mcu.Pin53=PE3
Mcu.Pin54=PB7 Mcu.Pin54=PB6
Mcu.Pin55=PB8 Mcu.Pin55=PB7
Mcu.Pin56=VP_ADC1_TempSens_Input Mcu.Pin56=PB8
Mcu.Pin57=VP_CRC_VS_CRC Mcu.Pin57=VP_ADC1_TempSens_Input
Mcu.Pin58=VP_IWDG_VS_IWDG Mcu.Pin58=VP_CRC_VS_CRC
Mcu.Pin59=VP_RTC_VS_RTC_Activate Mcu.Pin59=VP_IWDG_VS_IWDG
Mcu.Pin6=PC12 Mcu.Pin6=PC12
Mcu.Pin60=VP_SYS_VS_tim2 Mcu.Pin60=VP_RTC_VS_RTC_Activate
Mcu.Pin61=VP_SYS_VS_DBSignals Mcu.Pin61=VP_SYS_VS_tim2
Mcu.Pin62=VP_TIM6_VS_ClockSourceINT Mcu.Pin62=VP_SYS_VS_DBSignals
Mcu.Pin63=VP_TIM7_VS_ClockSourceINT Mcu.Pin63=VP_TIM6_VS_ClockSourceINT
Mcu.Pin64=VP_TIM14_VS_ClockSourceINT Mcu.Pin64=VP_TIM7_VS_ClockSourceINT
Mcu.Pin65=VP_WWDG_VS_WWDG Mcu.Pin65=VP_TIM14_VS_ClockSourceINT
Mcu.Pin66=VP_RealThread.RT-Thread_VS_RTOSJjkernel_3.1.5_3.1.5 Mcu.Pin66=VP_WWDG_VS_WWDG
Mcu.Pin67=VP_RealThread.RT-Thread_VS_RTOSJjdevice_3.1.5_3.1.5 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.Pin7=PC13
Mcu.Pin8=PC14-OSC32_IN (PC14) Mcu.Pin8=PC14-OSC32_IN (PC14)
Mcu.Pin9=PC15-OSC32_OUT (PC15) Mcu.Pin9=PC15-OSC32_OUT (PC15)
Mcu.PinsNb=68 Mcu.PinsNb=69
Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5 Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5
Mcu.ThirdPartyNb=1 Mcu.ThirdPartyNb=1
Mcu.UserConstants= Mcu.UserConstants=
@@ -275,6 +276,10 @@ PB4.GPIOParameters=GPIO_Label
PB4.GPIO_Label=PWM_CH1 PB4.GPIO_Label=PWM_CH1
PB4.Locked=true PB4.Locked=true
PB4.Signal=S_TIM3_CH1 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.GPIOParameters=GPIO_Label
PB6.GPIO_Label=S4852_TX PB6.GPIO_Label=S4852_TX
PB6.Locked=true PB6.Locked=true
@@ -497,7 +502,7 @@ RCC.USART3Freq_Value=64000000
RCC.USBFreq_Value=48000000 RCC.USBFreq_Value=48000000
RCC.VCOInputFreq_Value=8000000 RCC.VCOInputFreq_Value=8000000
RCC.VCOOutputFreq_Value=128000000 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=true
RealThread.RT-Thread.3.1.5.RTOSJjdevice_Checked=true RealThread.RT-Thread.3.1.5.RTOSJjdevice_Checked=true
RealThread.RT-Thread.3.1.5.RTOSJjkernel=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_HEAP=1
RealThread.RT-Thread.3.1.5.RT_USING_MAILBOX=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_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; RealThread.RT-Thread.3.1.5_SwParameter=RTOSJjkernel\:true;RTOSJjshell\:true;RTOSJjdevice\:true;
SH.COMP_DAC12_group.0=DAC1_OUT2 SH.COMP_DAC12_group.0=DAC1_OUT2
SH.COMP_DAC12_group.ConfNb=1 SH.COMP_DAC12_group.ConfNb=1
+14
View File
@@ -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'
+20 -38
View File
@@ -97,17 +97,17 @@
<yPos>-1</yPos> <yPos>-1</yPos>
</MaxPosition> </MaxPosition>
<NormalPosition> <NormalPosition>
<Top>210</Top> <Top>337</Top>
<Left>-47</Left> <Left>2503</Left>
<Right>1393</Right> <Right>3943</Right>
<Bottom>969</Bottom> <Bottom>1096</Bottom>
</NormalPosition> </NormalPosition>
</WindowPosition> </WindowPosition>
<MDIClientArea> <MDIClientArea>
<RegID>0</RegID> <RegID>0</RegID>
<MDITabState> <MDITabState>
<Len>1746</Len> <Len>1394</Len>
<Data>0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000B0000000100000001000000874A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF594A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF904A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF544A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF624A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF7D4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF7E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C66696E73685C66696E73685F6170692E68000000000B66696E73685F6170692E6800000000D9ADC200FFFFFFFF774A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000A5C2D700FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000B3A6BE00FFFFFFFF814A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745CB2E2BFD8D2BBCCE5D5A25C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C66696E73685C66696E73685F636F6E6669672E68000000000E66696E73685F636F6E6669672E6800000000EAD6A300FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000480100006600000080070000D8020000</Data> <Data>010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000090000000400000001000000834A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF8C4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF754A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF504A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF5E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF734A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000D9ADC200FFFFFFFF514A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000A5C2D700FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000C808000066000000000F0000D8020000</Data>
</MDITabState> </MDITabState>
</MDIClientArea> </MDIClientArea>
<ViewEx> <ViewEx>
@@ -130,7 +130,7 @@
</RectRecentDocked> </RectRecentDocked>
<RectRecentFloat> <RectRecentFloat>
<Len>16</Len> <Len>16</Len>
<Data>F40000006600000090050000F6000000</Data> <Data>7408000066000000100D0000F6000000</Data>
</RectRecentFloat> </RectRecentFloat>
</Window> </Window>
<Window> <Window>
@@ -1795,14 +1795,14 @@
</Window> </Window>
<DockMan> <DockMan>
<Len>3312</Len> <Len>3312</Len>
<Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F40000006600000090050000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000C102000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000006600000044010000D8020000000000004F00000044010000C10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000003002000090050000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated <Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007408000066000000100D0000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000200C000066000000100D000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000C102000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008007000066000000C4080000D8020000000000004F00000044010000C10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008007000030020000100D0000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated
</DockMan> </DockMan>
<ToolBar> <ToolBar>
<RegID>59392</RegID> <RegID>59392</RegID>
<Name>File</Name> <Name>File</Name>
<Buttons> <Buttons>
<Len>2909</Len> <Len>2878</Len>
<Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000B67547269674576656E7473960000000000000014000B67547269674576656E7473154556454E545F5452494745525F52533438353152580D72745F6576656E745F73656E640F72745F6576656E745F6372656174650ECAE4B3F6B2CECAFDA3BA4E554C4C0D52545F5553494E475F484F4F4B0D72745F6576656E745F726563760A735F4C657665446174610C735F6C6F73745F74696D6572124574684D717474446973436F6E6E65637464104D585F4652454552544F535F496E69741278506F727450656E64535648616E646C65720F5379735469636B5F48616E646C65720768616E646C65730E50656E6453565F48616E646C65720A41542B514D54434F4E4E176E6574776F726B5F756172745F727863616C6C6261636B0972745F7374727374720452535430055057524F4E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000Line truncated <Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000A4465766963654C696E6B960000000000000013000A4465766963654C696E6B096C696E6B54696D657204D0C4CCF80A6754436F6D6D4D61696C0D50616B63657454696D657255700F4D41494C5F534C554943455F4F50540C75343835325F7468726561641445465F454E565F5553494E475F574C5F4D4F44450F534655445F44454255475F4D4F44450557617465720F6F6E6C696E655F6961705F7461736B0D6961705F66696C655F73697A650B6961705F66696C656E616D074949435F53434C1065665F65726173655F62616B5F6170701172745F656E7465725F637269746963616C0C4D585F554152545F496E6974164F535F4941505F5448524541445F5052494F524954590A675F6966636F6E66696700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E730000000000000000000000000100000001000000000Line truncated
</Buttons> </Buttons>
<OriginalItems> <OriginalItems>
<Len>1423</Len> <Len>1423</Len>
@@ -1818,7 +1818,7 @@
<Name>Build</Name> <Name>Build</Name>
<Buttons> <Buttons>
<Len>976</Len> <Len>976</Len>
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008474230315645547896000000000000000100084742303156455478000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data> <Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008474230315645547896000000000000000100084742303156455478000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
</Buttons> </Buttons>
<OriginalItems> <OriginalItems>
<Len>583</Len> <Len>583</Len>
@@ -1834,7 +1834,7 @@
<Name>Debug</Name> <Name>Debug</Name>
<Buttons> <Buttons>
<Len>2373</Len> <Len>2373</Len>
<Data>00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000</Data> <Data>00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000</Data>
</Buttons> </Buttons>
<OriginalItems> <OriginalItems>
<Len>898</Len> <Len>898</Len>
@@ -3599,7 +3599,7 @@
<ActiveMDIGroup>0</ActiveMDIGroup> <ActiveMDIGroup>0</ActiveMDIGroup>
<MDIGroup> <MDIGroup>
<Size>100</Size> <Size>100</Size>
<ActiveTab>1</ActiveTab> <ActiveTab>4</ActiveTab>
<Doc> <Doc>
<Name>../Middlewares/Third_Party/RealThread_RTOS/components/device/device.c</Name> <Name>../Middlewares/Third_Party/RealThread_RTOS/components/device/device.c</Name>
<ColumnNumber>26</ColumnNumber> <ColumnNumber>26</ColumnNumber>
@@ -3611,9 +3611,9 @@
</Doc> </Doc>
<Doc> <Doc>
<Name>../RT-Thread/rtconfig.h</Name> <Name>../RT-Thread/rtconfig.h</Name>
<ColumnNumber>7</ColumnNumber> <ColumnNumber>24</ColumnNumber>
<TopLine>122</TopLine> <TopLine>119</TopLine>
<CurrentLine>134</CurrentLine> <CurrentLine>133</CurrentLine>
<Folding>1</Folding> <Folding>1</Folding>
<ContractedFolders></ContractedFolders> <ContractedFolders></ContractedFolders>
<PaneID>0</PaneID> <PaneID>0</PaneID>
@@ -3638,9 +3638,9 @@
</Doc> </Doc>
<Doc> <Doc>
<Name>../Core/Src/main.c</Name> <Name>../Core/Src/main.c</Name>
<ColumnNumber>23</ColumnNumber> <ColumnNumber>25</ColumnNumber>
<TopLine>124</TopLine> <TopLine>199</TopLine>
<CurrentLine>136</CurrentLine> <CurrentLine>207</CurrentLine>
<Folding>1</Folding> <Folding>1</Folding>
<ContractedFolders></ContractedFolders> <ContractedFolders></ContractedFolders>
<PaneID>0</PaneID> <PaneID>0</PaneID>
@@ -3663,15 +3663,6 @@
<ContractedFolders></ContractedFolders> <ContractedFolders></ContractedFolders>
<PaneID>0</PaneID> <PaneID>0</PaneID>
</Doc> </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> <Doc>
<Name>../Middlewares/Third_Party/RealThread_RTOS/src/idle.c</Name> <Name>../Middlewares/Third_Party/RealThread_RTOS/src/idle.c</Name>
<ColumnNumber>26</ColumnNumber> <ColumnNumber>26</ColumnNumber>
@@ -3683,22 +3674,13 @@
</Doc> </Doc>
<Doc> <Doc>
<Name>../Core/Src/usart.c</Name> <Name>../Core/Src/usart.c</Name>
<ColumnNumber>1</ColumnNumber> <ColumnNumber>4</ColumnNumber>
<TopLine>97</TopLine> <TopLine>97</TopLine>
<CurrentLine>98</CurrentLine> <CurrentLine>98</CurrentLine>
<Folding>1</Folding> <Folding>1</Folding>
<ContractedFolders></ContractedFolders> <ContractedFolders></ContractedFolders>
<PaneID>0</PaneID> <PaneID>0</PaneID>
</Doc> </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> </MDIGroup>
</MDIGroups> </MDIGroups>
+2 -2
View File
@@ -26,7 +26,7 @@
<ToolsetNumber>0x4</ToolsetNumber> <ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName> <ToolsetName>ARM-ADS</ToolsetName>
<TargetOption> <TargetOption>
<CLKADS>12000000</CLKADS> <CLKADS>8000000</CLKADS>
<OPTTT> <OPTTT>
<gFlags>1</gFlags> <gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd> <BeepAtEnd>1</BeepAtEnd>
@@ -1209,7 +1209,7 @@
<Group> <Group>
<GroupName>Middlewares/RT-Thread/RTOS/device</GroupName> <GroupName>Middlewares/RT-Thread/RTOS/device</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
+1744 -61
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -29,7 +29,7 @@
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Stack_Size EQU 0x00001000 Stack_Size EQU 0x2000
AREA STACK, NOINIT, READWRITE, ALIGN=3 AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size Stack_Mem SPACE Stack_Size
@@ -40,7 +40,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Heap_Size EQU 0x00001000 Heap_Size EQU 0x2000
AREA HEAP, NOINIT, READWRITE, ALIGN=3 AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base __heap_base
@@ -12,13 +12,14 @@
#include <rtthread.h> #include <rtthread.h>
#include "main.h" #include "main.h"
#include "data.h"
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/* /*
* Please modify RT_HEAP_SIZE if you enable 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 * 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]; static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void) 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) void rt_hw_console_output(const char *str)
{ {
if (g_ifconfig == 1)
{
return ;
}
rt_size_t i = 0, size = 0; rt_size_t i = 0, size = 0;
char a = '\r'; 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); HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1);
} }
} }
#endif #endif
Submodule Project/g0b1vetx-sluice added at 38d2e6b239.
+2 -2
View File
@@ -88,7 +88,7 @@
// <c1>Using Mutex // <c1>Using Mutex
// <i>Using Mutex // <i>Using Mutex
//#define RT_USING_MUTEX #define RT_USING_MUTEX
// </c> // </c>
// <c1>Using Event // <c1>Using Event
@@ -136,7 +136,7 @@
// <o>the buffer size of console <1-1024> // <o>the buffer size of console <1-1024>
// <i>the buffer size of console // <i>the buffer size of console
// <i>Default: 128 (128Byte) // <i>Default: 128 (128Byte)
#define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLEBUF_SIZE 1024
// </h> // </h>
// <h>Enable FinSH Configuration // <h>Enable FinSH Configuration
+80 -1
View File
@@ -1,5 +1,5 @@
#include "util.h" #include "util.h"
#include <ctype.h>
float Bytes2Float (char * data) float Bytes2Float (char * data)
{ {
@@ -11,6 +11,85 @@ float Bytes2Float(char * data)
return ff.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
View File
@@ -3,17 +3,25 @@
#include <stdint.h> #include <stdint.h>
typedef union { typedef union
{
uint32_t data; uint32_t data;
char byte[4]; char byte[4];
} Int; } Int;
typedef union { typedef union
{
float data; float data;
char byte[4]; char byte[4];
} Float; } Float;
float Bytes2Float (char * data); 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 #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
+24
View File
@@ -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);
+23 -2
View File
@@ -2,6 +2,7 @@
#include <easyflash.h> #include <easyflash.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "rtthread.h"
// 获取uint32_t 的数值 // 获取uint32_t 的数值
@@ -13,8 +14,7 @@ uint32_t ef_get_integer(const char * key)
/* get the boot count number from Env */ /* get the boot count number from Env */
value_ptr = ef_get_env (key); value_ptr = ef_get_env (key);
integer = atol (value_ptr); integer = atoi (value_ptr);
return integer; 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();
}
+33 -22
View File
@@ -40,15 +40,21 @@ static const ef_env default_env_set[] = {
{"iap_need_uart_update", "0"}, // 需要通过串口升级 {"iap_need_uart_update", "0"}, // 需要通过串口升级
{"iap_app_filename", "App.bin"}, {"iap_app_filename", "App.bin"},
{"stop_in_bootloader", "0"}, {"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_user", "admin"},
{"mqtt_pass", "admin"}, {"mqtt_pass", "admin"},
{"mqtt_addr", "mqtt.zyjzjs.cn"}, {"mqtt_addr", "mqtt.zyjzjs.cn"},
{"mqtt_port", "1883"}, {"mqtt_port", "1883"},
{"boot_times", "0"}, {"mqtt_topic", "sluice"}, //订阅topic
{"jump_boot_time", "10"}, // BOOT 等待时间 10s
{"net_drv", "dtu"}, // mqtt dtu ec200 {"net_drv", "dtu"}, // mqtt dtu ec200 eth
{"eth2_chann", "1"}, //以太网通道2 {"eth2_chann", "0"}, //以太网通道2 支持modbus
// 传感器基础参数配置 // 传感器基础参数配置
{"di1", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止 {"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:停止 {"di5", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
{"di6", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止 {"di6", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
// 485 配置参数 // 485 配置参数
{"s4851num", "1"}, // 4851 接入传感器的个数 {"u485func", "mg1000"}, // 用于一个柜子控制多台闸门
{"s4852num", "0"}, // 4852 接入传感器的个数 {"s4851func", "rds600"}, // 4851 接入传感器的类型 rds600 tds300
{"s4851func", "0100000000000000"}, // 4851 接入传感器的类型 {"s4852func", "modbus"}, // 4852 接入传感器的类型
{"s4852func", "0000000000000000"}, // 4852 接入传感器的类型
{"s4851bute", "9600"}, // 4851 波特率
{"s4852bute", "19200"}, // 4852 波特率
{"s4851para", "0"}, // 4851 接入传感器的个数
{"s4852para", "0"}, // 4851 接入传感器的个数
// 模拟量配置 // 模拟量配置
{"ai1", "0"}, // AI1接入设备 {"ai1", "0"}, // AI1接入设备
{"ai2", "0"}, // AI2接入设备 {"ai2", "0"}, // AI2接入设备
@@ -80,18 +82,27 @@ static const ef_env default_env_set[] = {
{"pwm4", "0"}, // PWM4功能 {"pwm4", "0"}, // PWM4功能
// 闸门参数设置 // 闸门参数设置
{"maxopen", "140"}, // PWM4功能 {"max_open", "1400"}, // 最大开度
{"maxecode", "0"}, // PWM4功能 {"max_ecode", "31241"}, // 编码器最大编码
{"minecode", "0"}, // PWM4功能 {"min_ecode", "32828"}, // 编码器最小编码
{"codepre", "0"}, // 编码器和闸门开度的比 {"exec_time", "50"}, // 异常检测时间 单位100ms 50 就是 5s
// 闸门参数设置 // 闸门参数设置
{"motortype", "140"}, // PWM4功能 {"ctrl_mode", "0"}, // 控制模式 // 1 直接开度控制,0 反馈开度控制
{"codertype", "0"}, // PWM4功能 {"motor_type", "mg1000"}, // 电机类型 // mg a3 b5
{"loadrtype", "0"}, // PWM4功能 {"simu_flow", "0"}, // 0 未启动 1 水位流量关系表 2巴歇尔槽启动流量关系表
{"flowrtype", "0"}, // 编码器和闸门开度的比 {"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"}, // 编码器和闸门开度的比
}; };
+1 -1
View File
@@ -124,7 +124,7 @@ extern "C" {
#endif /* ELOG_OUTPUT_ENABLE */ #endif /* ELOG_OUTPUT_ENABLE */
/* all formats index */ /* all formats index */
typedef enum { typedef enum { //
ELOG_FMT_LVL = 1 << 0, /**< level */ ELOG_FMT_LVL = 1 << 0, /**< level */
ELOG_FMT_TAG = 1 << 1, /**< tag */ ELOG_FMT_TAG = 1 << 1, /**< tag */
ELOG_FMT_TIME = 1 << 2, /**< current time */ ELOG_FMT_TIME = 1 << 2, /**< current time */
+2 -1
View File
@@ -28,6 +28,7 @@
#include <elog.h> #include <elog.h>
#include <stdio.h> #include <stdio.h>
#include <rtthread.h>
/** /**
* EasyLogger port initialize * EasyLogger port initialize
@@ -61,7 +62,7 @@ void elog_port_deinit(void) {
void elog_port_output(const char *log, size_t size) { void elog_port_output(const char *log, size_t size) {
/* add your code here */ /* add your code here */
printf("%.*s", size, log); rt_kprintf("%.*s", size, log);
} }
/** /**
+90
View File
@@ -2,6 +2,8 @@
#include<stdint.h> #include<stdint.h>
#include "crc.h" #include "crc.h"
#include "modbus-m.h"
#include "rtthread.h"
// 读取保持寄存器的值 // 读取保持寄存器的值
// addr 寄存器地址 // addr 寄存器地址
@@ -22,6 +24,25 @@ int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data
return index; 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 寄存器地址 // 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;
}
+9
View File
@@ -2,9 +2,18 @@
#define MODBUS_M_H #define MODBUS_M_H
#include <stdint.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_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_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 #endif
+4 -6
View File
@@ -3,9 +3,10 @@
#include<stdint.h> #include<stdint.h>
#include "crc.h" #include "crc.h"
#include "modbus-s.h" #include "modbus-s.h"
#include "modbus-m.h"
#if !defined(LOG_TAG) #if !defined(LOG_TAG)
#define LOG_TAG "main" #define LOG_TAG "modbus-s"
#endif #endif
#include <elog.h> #include <elog.h>
@@ -22,19 +23,16 @@ void ModbusSlaveInit(ModBusSlave_t * drv,uint8_t ID,uint8_t * data,uint16_t * r
//-1 華硊渣昫 //-1 華硊渣昫
int ModbusSlaveHandle(ModBusSlave_t * drv,uint8_t * data,uint16_t length ) 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)) if( (data[0] != drv->ID) && (data[0] != 0x00))
{ {
// 華硊渣昫 // 華硊渣昫
return -1; return -1;
} }
rcrc = ((uint16_t)data[length- 1] << 8) + (uint16_t)data[length- 2] ; if(modbus_m_crc_check(data,length) != MOD_OK)
ccrc = MX_CRC_CALC(data,length-2);
if (rcrc != ccrc )
{ {
log_e("rcrc:%04X,ccrc:%04X\r\n",rcrc,ccrc) ;
return -2; return -2;
} }
drv->func = data[1] ; drv->func = data[1] ;
switch (drv->func) switch (drv->func)
Submodule middleware/paho.mqtt.embedded-c added at 29ab2aa29c.
+3
View File
@@ -29,6 +29,9 @@
#ifndef _SFUD_CFG_H_ #ifndef _SFUD_CFG_H_
#define _SFUD_CFG_H_ #define _SFUD_CFG_H_
#ifndef BOOT
#define SFUD_DEBUG_MODE
#endif
#define SFUD_DEBUG_MODE #define SFUD_DEBUG_MODE
#define SFUD_USING_SFDP #define SFUD_USING_SFDP