Files
g0b1vetx-board/Application/disctrlthread.c
T

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 ;
}