#include "main.h" #include "os-app.h" #include #include #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 '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 ; }