网络自适应

This commit is contained in:
2584532475@qq.com committed 2024-09-10 11:51:07 +08:00
1 parent a589e89e33
commit 0f40dd8b17
68 files changed
+7062 -2678

No files matched your search

+3 -1
View File
@@ -9,6 +9,7 @@
#include "data.h"
#include "easyflash.h"
#include <string.h>
#include <elog.h>
ALIGN (RT_ALIGN_SIZE)
@@ -28,6 +29,7 @@ static void thread_entry (void * argument)
g_DebugDrv.rxdone = cfg_rx_done;
rt_kprintf ("%s was start!\r\n", __FILE__);
rt_kprintf ("config input\r\n");
elog_stop();
g_ifconfig = 1;
char * p;
char key[32], value[32];
@@ -95,7 +97,7 @@ static void thread_entry (void * argument)
rt_thread_delay (10);
}
shell_recover();
g_ifconfig = 0;
elog_start();
rt_kprintf ("config exit\r\n");
}
+17 -12
View File
@@ -16,11 +16,13 @@
#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_1PROT 0x10B0 // 一级保护
#define DIS_CNUM_2PROT 0x10C0 // 二级保护
#define DIS_CNUM_SLHEIGHT 0x10D0 // 闸门高度
#define DIS_CNUM_SLLOAD 0x10E0 // 荷重仪类型
#define DIS_CNUM_SLLOADKEY 0x10F0 //荷重仪
#define DIS_CNUM_PROTK 0x10E0 // 荷重仪类型
#define DIS_CNUM_SLLOADKEY 0x10F0 // 闸门荷重
@@ -35,11 +37,12 @@
// 调试界面
#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_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_CNUM_MAX_OPEN 0x11D0 // 开度提闸界面 最大开度
// 按钮
@@ -51,7 +54,7 @@
#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 // 调试 下
@@ -60,7 +63,8 @@
#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_CMD_BTN_SETMIN 0X2120 // 菜单 设为最
#define DIS_CMD_BTN_CLREXC 0X2130 // 菜单 解除报警
// 动态图标
@@ -68,7 +72,7 @@
#define DIS_CSTE_LOAD 0X3010 // 荷重仪状态
#define DIS_CSTE_PLUS 0X3020 // 编码器状态
#define DIS_CSTE_NET 0X3030 // 网络状态
#define DIS_CSTE_MOTOR 0X3040 // 电机状态
#define DIS_CSTE_MOTOR 0X3040 // 电机状态
#define DIS_CMD_DOW_SUCC 0X4F4A // "OK"
@@ -84,6 +88,7 @@
#define DIS_TYPE_SWPAGE 0x03
#define DIS_TYPE_WD_BYTES 0x04
#define DIS_TYPE_WD_ICON 0x05
#define DIS_TYPE_WD_AUDIO 0x06
#define DIS_STE_INVALID 0 // 无效的
#define DIS_STE_SUCCSEE 1 // 成功 绿色
+262 -30
View File
@@ -15,6 +15,10 @@ ALIGN (RT_ALIGN_SIZE)
static char thread_stack[4096];
static struct rt_thread display_thread;
#if !defined(LOG_TAG)
#define LOG_TAG "lcd"
#endif
#include <elog.h>
static rt_timer_t timer;
@@ -26,6 +30,8 @@ static struct
int identity;
} s_driver;
static void dis_write_usrpwd (char *pass);
static void view_rx_done (void)
{
rt_event_send (gUartEvents, EVENT_UART_VIEW_RX);
@@ -126,6 +132,18 @@ static int DisPreparePacket (DisDataType_t ddtt, char *buf, int maxLen)
break;
}
case DIS_TYPE_WD_AUDIO:
{
buf[tx_size++] = 0x82;
buf[tx_size++] = 0x00; // 寄存器地址高位
buf[tx_size++] = 0xA0; // 寄存器地址高位
buf[tx_size++] = (char)ddtt.Int.Int; // 寄存器数据高位
buf[tx_size++] = 0x01; // 寄存器数据高位
buf[tx_size++] = 0x40; // 寄存器数据高位
buf[tx_size++] = 0x00; // 寄存器数据高位
break;
}
default:
break;
}
@@ -164,6 +182,10 @@ static void disctrl_handle (char *data, int length)
}
case DIS_CMD_BTN_DUP: // 调试界面上升
{
if (s_driver.identity == 0) // 用户无此权限
{
break;
}
mail.Type = MAIL_SLUICE_SUP;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
@@ -171,6 +193,10 @@ static void disctrl_handle (char *data, int length)
}
case DIS_CMD_BTN_DDOWN: // 调试界面下降
{
if (s_driver.identity == 0) // 用户无此权限
{
break;
}
mail.Type = MAIL_SLUICE_SDW;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
@@ -178,9 +204,10 @@ static void disctrl_handle (char *data, int length)
}
case DIS_CMD_BTN_DSTOP: // 调试界面停止
{
mail.Type = MAIL_SLUICE_STP;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
OsSendMail(gSluiceMail,MAIL_SLUICE_STP,0);
// mail.Type = MAIL_SLUICE_STP;
// mail.index = 0;
// rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
break;
}
case DIS_CMD_BTN_DUNLOCK: // 调试界面解锁
@@ -226,7 +253,7 @@ static void disctrl_handle (char *data, int length)
break;
}
// 5A A5 0A 83 10 30 03 30 31 32 33 FF FF
case DIS_CNUM_PASS:
case DIS_CNUM_PASS: // 登录成功
{
if ( (rt_memcmp (&data[index], (char *) s_driver.userpwd, 6) == 0)) // 用户密码
{
@@ -235,18 +262,24 @@ static void disctrl_handle (char *data, int length)
ddtt.Int.Int = 0x0004;
tx_size = DisPreparePacket (ddtt, txbuf, 100);
MX_UART_PutBuffer (&g_ViewDrv, txbuf, tx_size);
OsSendMail(gViewMail,MAIL_VIEW_AUDIO,MAIL_AUDIO_LOGIN_SUC) ;
}
if ( (rt_memcmp (&data[index], (char *) s_driver.syspwd, 6) == 0)) // 用户密码
else 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);
OsSendMail(gViewMail,MAIL_VIEW_AUDIO,MAIL_AUDIO_LOGIN_ADM) ;
}
else
{
OsSendMail(gViewMail,MAIL_VIEW_AUDIO,MAIL_AUDIO_LOGIN_FIL) ;
}
break;
}
// 设置提闸开度
// 输入提闸开度
case DIS_CNUM_SLSET:
{
a = (uint16_t) data[index + 2] * 256 + (uint16_t) data[index + 3];
@@ -258,6 +291,17 @@ static void disctrl_handle (char *data, int length)
//rt_event_send (gCtrlEvents, EVENT_CTRL_SET_OPT_SLU);
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: // 设置设备编码
{
@@ -272,27 +316,29 @@ static void disctrl_handle (char *data, int length)
}
case DIS_CASCII_PASS:
{
char password[7] = {0};
if (s_driver.identity == 0)
{
break;
}
// if (s_user_role != 1)
// break;
// if (length != 12)
// {
// DisWritePass (SysInfo.LoginPass, QUEUE);
// return;
// }
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);
for (int i = 0; i < 6; i++)
{
if (data[index + i] > '9' || data[index + i] < '0')
{
//DisWritePass (SysInfo.LoginPass, QUEUE);
return;
}
}
rt_memcpy(password,&data[index],6);
ef_set_env("user_pass",password) ;
dis_write_usrpwd(password);
break;
}
@@ -319,6 +365,63 @@ static void disctrl_handle (char *data, int length)
ef_set_env ("max_open", setstr);
break;
}
case DIS_CNUM_1PROT: // 修改1级保护
{
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 ("curr1", setstr);
break;
}
case DIS_CNUM_2PROT: // 修改1级保护
{
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 ("curr2", setstr);
break;
}
case DIS_CNUM_PROTK: // 修改1级保护
{
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 ("openk", setstr);
break;
}
default:
break;
}
@@ -353,6 +456,18 @@ static void dis_write_ttflow (uint32_t ttflow)
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新电流
static void dis_write_current (float current)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.Addr.addr = DIS_CNUM_DBG_CUR;
ddtt.type = DIS_TYPE_WD_FLOAT;
ddtt.Float.Float = current;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新瞬时流量
static void dis_write_mmflow (float mmFlow)
{
@@ -389,6 +504,33 @@ void dis_write_open (float open)
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新闸门开度 到调试界面
void dis_write_open2debug (int open)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.Addr.addr = DIS_CNUM_DBG_OPEN;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Int.Int = open;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 播报语音 参数,第几段音频
void dis_write_audio (int k)
{
DisDataType_t ddtt;
char tx_buf[128], p;
//ddtt.Addr.addr = DIS_CNUM_SLGET;
ddtt.type = DIS_TYPE_WD_AUDIO;
ddtt.Int.Int = k;
p = DisPreparePacket (ddtt, tx_buf, 128);
elog_hexdump("lcd",16,tx_buf,p);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新闸门荷重
void dis_write_load (float load)
{
@@ -426,9 +568,52 @@ void dis_write_slmaxopen (uint32_t ecode)
ddtt.Int.Int = ecode;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
ddtt.Addr.addr = DIS_CNUM_MAX_OPEN;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Int.Int = ecode/10;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
//DIS_CNUM_MAX_OPEN
}
// 更新一级保护
void dis_write_1prot (uint32_t data)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.Addr.addr = DIS_CNUM_1PROT;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Int.Int = data;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新二级保护
void dis_write_2prot (uint32_t data)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.Addr.addr = DIS_CNUM_2PROT;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Int.Int = data;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 更新二级保护
void dis_write_openk (uint32_t data)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.Addr.addr = DIS_CNUM_PROTK;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Int.Int = data;
p = DisPreparePacket (ddtt, tx_buf, 128);
MX_UART_PutBuffer (&g_ViewDrv, tx_buf, p);
}
// 发送给屏幕设备编号
// 参数1:设备编号
// 参数2:是否通过队列写入
@@ -503,7 +688,7 @@ void dis_write_net_ste (int ste)
}
// 修改电机状态
void dis_write_motor_ste (int ste, int isqueue)
void dis_write_motor_ste (int ste)
{
DisDataType_t ddtt;
char tx_buf[128], p;
@@ -551,12 +736,24 @@ void diw_write_load_ste (int ste)
}
void dis_write_err (int err)
{
DisDataType_t ddtt;
char tx_buf[128], p;
ddtt.type = DIS_TYPE_WD_INT;
ddtt.Addr.addr = DIS_CNUM_DBG_ERR;
ddtt.Int.Int = err;
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__);
log_i ("display was start!");
g_ViewDrv.rxdone = view_rx_done;
g_ViewDrv.BaudRate = 115200;
MX_UART_Init (&g_ViewDrv);
@@ -571,6 +768,15 @@ static void thread_entry (void * argument)
s_driver.identity = 0;
s = ef_get_env ("max_open");
int32_t max_open = atoi (s);
s = ef_get_env ("curr1");
int32_t curr1 = atoi (s);
s = ef_get_env ("curr2");
int32_t curr2 = atoi (s);
s = ef_get_env ("openk");
int32_t openk = atoi (s);
// 载入参数
dis_write_divice_id ( (char *) s_driver.device_id);
dis_write_ipaddr ("mqtt.zyjzjs.cn");
@@ -582,6 +788,14 @@ static void thread_entry (void * argument)
dis_write_net_ste (0);
dis_write_load (0);
dis_write_code (SluiceData[0].ecode);
dis_write_audio(0);
dis_write_1prot (curr1);
// 更新二级保护
dis_write_2prot (curr2);
// 更新二级保护
dis_write_openk (openk) ;
rt_timer_start (timer);
while (1)
{
@@ -591,14 +805,26 @@ static void thread_entry (void * argument)
{
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_load ((float)WaterData[0].thisLevel/10); // 荷重或者压力
dis_write_mmflow ((float)WaterData[0].thisFlow/100/3600);
dis_write_mmspeed ((float)WaterData[0].thisLevel/100);
dis_write_ttflow (WaterData[0].ttWater/100);
dis_write_code (SluiceData[0].ecode);
dis_write_motor_ste(1);
dis_write_current ((float)SluiceData[0].currt/100);
dis_write_open2debug(SluiceData[0].gopen);
dis_write_load((float)SluiceData[0].lload/1000);
dis_write_err(SluiceData[0].error); // SluiceData[i].error
// dis_write_open ( (float)WaterData[0].thisLevel/1000);
// dis_write_load ((float)WaterData[1].thisLevel/1000); // 荷重或者压力
// dis_write_mmspeed ((float)WaterData[2].thisLevel/1000);
// dis_write_audio(2);
break;
case MAIL_VIEW_READSL:
case MAIL_VIEW_READSL: // 读取闸门开度
ddtt.type = DIS_TYPE_RD;
ddtt.Addr.addr = DIS_CNUM_SLSET;
ddtt.Len = 2;
@@ -608,14 +834,19 @@ static void thread_entry (void * argument)
case MAIL_VIEW_LOGIN: // 登录
break;
case MAIL_VIEW_NET_STE:
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;
case MAIL_VIEW_AUDIO:
dis_write_audio(mail.index);
break;
default:
break;
}
}
@@ -625,6 +856,7 @@ static void thread_entry (void * argument)
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_VIEW_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 300, RT_NULL)) // 数据接受失败,上报异常状态
{
elog_hexdump("lcd",16,g_ViewDrv.rx_buffer,g_ViewDrv.rx_size);
for (int i = 0; i < g_ViewDrv.rx_size; i++)
{
if (g_ViewDrv.rx_buffer[i] == 0x5A)
+19 -4
View File
@@ -35,6 +35,11 @@ ALIGN (RT_ALIGN_SIZE)
static char thread_stack[2048];
static struct rt_thread os_app;
#if !defined(LOG_TAG)
#define LOG_TAG "os_app"
#endif
#include <elog.h>
static rt_timer_t locktimer;
static void locktimerouter (void* parameter)
{
@@ -81,10 +86,10 @@ static void thread_entry (void *parameter)
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");
log_i ("ID:%08X %08X %08X", id1, id2, id3);
log_i ("Version:%s,%s",__DATE__,__TIME__);
log_i ("os-app running !");
//netWorkAesInit();
while (1)
{
rt_thread_mdelay (500);
@@ -127,4 +132,14 @@ void OsShellTask (void * argument)
void OsSendMail(rt_mailbox_t box,uint16_t type,uint16_t index)
{
TypeIndexMail_t mail;
mail.Type = type;
mail.index = index;
rt_mb_send (box, * ( (uint32_t*) &mail));
}
+29 -10
View File
@@ -90,6 +90,9 @@ void MJEth1ThreadStart (void);
void UpgradeThreadStart (void);
void RtcThreadStart (void);
void OsSendMail(rt_mailbox_t box,uint16_t type,uint16_t index);
#define EVENT_CTRL_SET_OPT_SLU (1U<< 0) // 发送开度控制到提闸线程
#define EVENT_CTRL_SET_STP_SLU (1U<< 1) // 发送停止控制到提闸线程
#define EVENT_CTRL_SET_SUP_SLU (1U<< 2) // 发送上升控制到提闸线程
@@ -124,16 +127,19 @@ void RtcThreadStart (void);
#define EVENT_TRIG_COMM_RST (1U << 7) // MQTT 发送数据
#define EVENT_TRIG_UPGRADE_RX (1U << 8) // MQTT 接受到数据
#define EVENT_TRIG_NETMODE_TX2 (1U << 9) // 通过网络模块向通道2发送数据
#define EVENT_TRIG_CAT1_SHUT (1U << 10) // 通过4G 模块关机
#define EVENT_TRIG_ETH_SHUT (1U << 11) // 通过Eth 模块关机
#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_COMM_ACK 7 // 读取参数
#define MAIL_COMM_READPARA 4 // 读取参数
#define MAIL_COMM_UPACK 5 // 升级的ACK
#define MAIL_COMM_SLACK 6 // 提闸的ACK
#define MAIL_COMM_WRACK 7 // 修改参数ACK
#define MAIL_COMM_FACACK 8 // 出厂设置ACK
#define MAIL_SLUICE_OPT 0
#define MAIL_SLUICE_STP 1
@@ -146,12 +152,25 @@ void RtcThreadStart (void);
#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 // 更新闸门状态
#define MAIL_AUDIO_WEL 0 // 执行
#define MAIL_AUDIO_LOAD 1 // 下降
#define MAIL_AUDIO_OPEN 2 // 上升
#define MAIL_AUDIO_UP 3 // 停止
#define MAIL_AUDIO_DOWN 4 // 停止
#define MAIL_AUDIO_STOP 5 // 停止
#define MAIL_AUDIO_LOGIN_SUC 6 // 停止
#define MAIL_AUDIO_LOGIN_FIL 7 // 停止
#define MAIL_AUDIO_LOGIN_ADM 8 // 停止
#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 // 更新闸门状态
#define MAIL_VIEW_AUDIO 7 // 播放语音
+156 -35
View File
@@ -2,54 +2,175 @@
#include "math.h"
#include "easyflash.h"
#include "stdlib.h"
#include "cjson.h"
#include "rtthread.h"
#include "user_config.h"
#if !defined(LOG_TAG)
#define LOG_TAG "simu"
#endif
#include <elog.h>
static 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},
} ;
// 两点法计算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;
//}
double math_k(double x0,double y0,double x1,double y1)
{
double k;
k = (y1-y0)/(x1-x0);
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;
//}
double math_b(double k,double x,double y)
{
double b;
b = y - (k*x);
return b;
}
//WaterLeveInfo_t Info = {
// .Y[0] = 2,
//};
// k=(y2-y1)/(x2-x1)
typedef struct SimflowPara_t
{
double leve[11];
double flow[11];
int pallid ;
}SimflowPara_t;
// 水位流量关系表
//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;
//}
static SimflowPara_t g_para = {
.leve = {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1},
.flow = {0,0.036,0.105,0.200,0.317,0.454,0.713,0.897,0.955,1.015,1.025},
.pallid = 7
};
int32_t ParShallCalc(int index,double leve)
// 水位流量关系表初始化
void SimuFlowInit(void)
{
char * p;
double flow = 0;
flow = ParShallTale[index].c * pow(leve,ParShallTale[index].m);
return (int32_t )(flow *100);
char *p ;
p = ef_get_env ("parshall");
g_para.pallid = atoi (p); // 巴歇尔流量计槽号
rt_kprintf("parshall:%d\r\n",g_para.pallid);
#ifdef SYK_06_18_SM
ef_set_env ("simu_flow","1");
ef_set_env("level","[0.1,0.18,0.26,0.34,0.42,0.5,0.58,0.66,0.74,0.8]");
ef_set_env("flow","[0.031,0.081,0.149,0.233,0.33,0.44,0.562,0.695,0.84,0.955]");
#endif
#ifdef SYK_08_18_SM
ef_set_env ("simu_flow","1");
ef_set_env("level","[0.1,0.18,0.26,0.34,0.42,0.5,0.58,0.66,0.74,0.8]");
ef_set_env("flow","[0.043,0.113,0.206,0.32,0.453,0.603,0.769,0.951,1.147,1.304]");
#endif
#ifdef SYK_10_18_SM
ef_set_env ("simu_flow","1");
ef_set_env("level","[0.1,0.18,0.26,0.34,0.42,0.5,0.58,0.66,0.74,0.8]");
ef_set_env("flow","[0.058,0.146,0.261,0.397,0.553,0.728,0.918,1.125,1.346,1.522]");
#endif
cJSON *root = NULL;
// 水位表
p = ef_get_env ("level") ;
root = cJSON_Parse (p);
int size = cJSON_GetArraySize (root);
if(size != 10)
{
cJSON_Delete (root);
return ;
}
for (int i = 1; i < 11; i++)
{
g_para.leve[i] = cJSON_GetNumberValue (cJSON_GetArrayItem (root, i-1)); // 接入设备类型
}
// 流量表
p = ef_get_env ("flow") ;
root = cJSON_Parse (p);
size = cJSON_GetArraySize (root);
if(size != 10)
{
cJSON_Delete (root);
return ;
}
for (int i = 1; i < 11; i++)
{
g_para.flow[i] = cJSON_GetNumberValue (cJSON_GetArrayItem (root, i-1)); // 接入设备类型
}
cJSON_Delete (root);
rt_kprintf("leve( mm):");
for (int i =0; i< 11;i++)
{
rt_kprintf("%6d,",(int)(g_para.leve[i] * 1000));
}
rt_kprintf("\r\nflow(dm3):");
for (int i =0; i< 11;i++)
{
rt_kprintf("%6d,",(int)(g_para.flow[i]*1000));
}
rt_kprintf("\r\n");
}
// 水位流量关系表 单位cm
int32_t WaterLeveCalc(double leve)
{
double k,b;
double flow;
if((leve == 0) ||(leve >= g_para.leve[10]) )
return 0;
for (int i =0;i< 11;i++)
{
if (leve < g_para.leve[i])
{
k = math_k((double)g_para.leve[i-1],(double)g_para.flow[i-1],(double)g_para.leve[i],(double)g_para.flow[i]) ;
b = math_b(k,(double)g_para.leve[i],(double)g_para.flow[i]);
flow = k *leve +b;
break;
}
}
return (int32_t )(flow *1000);
}
int32_t ParShallCalc(double leve)
{
char * p;
double flow = 0;
flow = ParShallTale[g_para.pallid].c * pow(leve,ParShallTale[g_para.pallid].m);
return (int32_t )(flow *1000);
}
+4 -1
View File
@@ -1,6 +1,9 @@
#ifndef _SIM_FLOW_H
#define _SIM_FLOW_H
int32_t ParShallCalc(int index,double leve);
void SimuFlowInit(void);
int32_t ParShallCalc(double leve);
int32_t WaterLeveCalc(double leve);
#endif