g0b1vetx-board/Application/disctrlthread.c
2023-11-30 08:10:01 +08:00

459 lines
10 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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