459 lines
10 KiB
C
459 lines
10 KiB
C
|
||
#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 ;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|