소스 검색

打通web与设备交互逻辑
解决串口操作导致网络不通的问题

guohui 1 년 전
부모
커밋
285af64653

+ 3 - 18
f407/applications/datadef.h

@@ -149,15 +149,13 @@ enum {
 };
 ////////////////////////////////////////////////
 #pragma pack (1)
-typedef struct
-{
+typedef struct {
     uint8_t             mode;
     uint8_t             addr;               
     uint32_t            baud;
 }modbus_data_t;
 
-typedef struct
-{
+typedef struct {
     uint8_t     mode;               //0:DHCP  1:STATIC  
     char        ipaddr[48];         //
     char        mask[48];           //
@@ -321,12 +319,6 @@ typedef struct board_data {
     power_ch_t          *pch;                   //根据实际通道数申请连续内存
 }board_data_t;
 
-typedef struct {
-    
-    
-    
-}board_all_t;
-
 typedef struct {
     float               voltage;                //电压
     float               current;                //电流
@@ -431,12 +423,7 @@ typedef struct md_3_ac{
     sensor_info_t       md_s[8];
     uint16_t            dry_node[4];
 }md_3_ac_t;
-typedef struct {
-    sys_data_t          sys;
-    
-    board_all_t         ball;
-    power_total_t       pttl;
-}all_data_t;
+
 //////////////////////////////
 typedef struct 
 {
@@ -566,8 +553,6 @@ enum {
     SUB_TYPE_MAX
 };
 
-
-
 #define PKT_MAGIC  0xdead
 typedef struct {
     uint16_t  magic;

+ 2 - 2
f407/applications/main.c

@@ -107,7 +107,7 @@ static int user_init(void)
 {
     int r,n=0;
     
-    ui_init();
+    //ui_init();
     //rt_hw_lcd_init();
     //net_init("0.0.0.0", SERVER_PORT);
     
@@ -133,6 +133,6 @@ int main(void)
     user_init();
     while (1) {
         
-        rt_thread_mdelay(500);
+        rt_thread_mdelay(5000);
     }
 }

+ 36 - 24
f407/applications/power.c

@@ -8,8 +8,8 @@
 #include "thread.h"
 #include "datadef.h"
 
-#define BRD_NUM   3 //BRD_MAX
-
+#define BRD_NUM         3 //BRD_MAX
+#define BRD_TIMEOUT     100
 
 typedef struct {
     void*           mb;
@@ -42,7 +42,7 @@ static void memswap(uint8_t *buf, int len)
 }
 static int read_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
 {
-    return mb_read(h->mb, addr, reg, data, cnt, 800);
+    return mb_read(h->mb, addr, reg, data, cnt, BRD_TIMEOUT);
 }
 static int write_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
 {
@@ -191,7 +191,7 @@ static board_data_t* board_next(power_handle_t *h)
             h->cur_addr = 1;
         }
         else if(h->cur_addr==addr) {
-            break;
+            return h->pbrd[h->cur_addr];
         }
         if(h->pbrd[h->cur_addr]) {
             return h->pbrd[h->cur_addr];
@@ -225,14 +225,12 @@ static int threshold_proc(board_data_t *pbrd)
     
     return 0;
 }
-static board_data_t* board_query(power_handle_t *h)
+static int board_read(power_handle_t *h, board_data_t *pbrd)
 {
     int i,j,r=-1;
     uint16_t offset,tmp[144];
-    board_data_t *pbrd=NULL;
     
     lock_d_hold(h->lck);
-    pbrd = board_next(h);
     if(pbrd) {
         switch(pbrd->type) {
             case AC_SINGLE_S_TYPE:
@@ -452,10 +450,18 @@ static board_data_t* board_query(power_handle_t *h)
     }
     lock_d_release(h->lck);
     
-    return pbrd;
+    return r;
+}
+static int board_query(power_handle_t *h)
+{
+    int i,r;
+    
+    for(i=0; i<h->brd_max; i++) {
+        r = board_read(h, h->pbrd[i]);
+    }
+    
+    return r;
 }
-
-
 static void *power_thread(void *arg)
 {
     int r;
@@ -484,7 +490,7 @@ int power_init(void)
                 .dev = POWER_PORT,          //设备名
                 .baudrate = 115200,         //波特率
                 .parity = 0,                //校验位
-                .pin = 1,                   //收发控制引脚, <0 表示不使用
+                .pin = -1,                   //收发控制引脚, <0 表示不使用
                 .lvl = 0,                   //发送控制电平
             }
         }
@@ -624,7 +630,7 @@ int power_scan(void)
                     times = (ch_idx+1)%nGroups?(ch_idx+1):nGroups;
                     for(j=0; j<pkey->chs; j++) {
                         h->pbrd[i]->pch[j].info.addr = i;
-                        h->pbrd[i]->pch[j].info.sch = j;                    //序号从0开始
+                        h->pbrd[i]->pch[j].info.sch  = j;                    //序号从0开始
                         h->pbrd[i]->pch[j].info.type = pkey->type;
                         h->pbrd[i]->pch[j].info.start_delay = 1000*times;
                         h->pbrd[i]->pch[j].info.stop_delay  = 1000*times;
@@ -1184,26 +1190,32 @@ int power_set_stop_delay(power_ch_t *pch)
 }
 
 
-int power_data_clone(power_data_t *pd)
+int power_data_copy(power_data_t *pd, int flag)
 {
     int i,r=-1;
     power_handle_t *h=&pwrHandle;
     
     lock_d_hold(h->lck);
-    if(h->chs>0) {
-        if(!pd->pch || pd->chs!=h->chs) {
-            if(pd->pch) free(pd->pch);
-            pd->chs = 0;
-            pd->pch = malloc(sizeof(power_ch_t)*h->chs);
-        }
-        
-        if(pd->pch) {
-            pd->chs = h->chs;
-            for(i=0; i<pd->chs; i++) {
-                pd->pch[i] = *h->pch[i];
+    if(flag&1) {
+        if(h->chs>0) {
+            if(!pd->pch || pd->chs!=h->chs) {
+                if(pd->pch) free(pd->pch);
+                pd->chs = 0;
+                pd->pch = malloc(sizeof(power_ch_t)*h->chs);
+            }
+            
+            if(pd->pch) {
+                pd->chs = h->chs;
+                for(i=0; i<pd->chs; i++) {
+                    pd->pch[i] = *h->pch[i];
+                }
             }
         }
     }
+    
+    if(flag&2) {
+        pd->ttl = h->ttl;
+    }
     lock_d_release(h->lck);
     
     return 0;

+ 1 - 2
f407/applications/power.h

@@ -170,8 +170,7 @@ int power_set_start_delay(power_ch_t *pch);
 int power_set_stop_delay(power_ch_t *pch);
 int power_reset_consump(uint8_t addr);
 
-board_all_t * get_control_board();
-int power_data_clone(power_data_t *pd);
+int power_data_copy(power_data_t *pd, int flag);
 
 #endif
 

+ 3 - 3
f407/applications/rtconfig.h

@@ -159,14 +159,14 @@
 #define RT_LWIP_IGMP
 #define RT_LWIP_ICMP
 #define RT_LWIP_DNS
-#define RT_LWIP_DHCP
+//#define RT_LWIP_DHCP
 #define RT_LWIP_SNMP
 #define RT_LWIP_STATS
 #define IP_SOF_BROADCAST 1
 #define IP_SOF_BROADCAST_RECV 1
 
-#define RT_LWIP_IPADDR   "192.168.1.132"
-#define RT_LWIP_GWADDR   "192.168.1.1"
+#define RT_LWIP_IPADDR   "192.168.234.132"
+#define RT_LWIP_GWADDR   "192.168.234.1"
 #define RT_LWIP_MSKADDR  "255.255.255.0"
 #define RT_LWIP_UDP
 #define RT_LWIP_TCP

+ 317 - 145
f407/applications/ui/st7789.c

@@ -1,10 +1,25 @@
-#include "lcd.h"
-#include "log.h"
-
-
-#define COL_ADDR_SET            0x2A
-#define ROW_ADDR_SET            0x2B
-#define MEMORY_WRITE            0x2C
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2023-06-10     Vandoul       First version
+ */
+
+#include "rtthread.h"
+#include "lcd_st7789.h"
+
+#define DBG_TAG "st7789"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+#ifdef PKG_USING_ST7789
+
+#define LCD_CMD_COL_ADDR_SET                0x2A
+#define LCD_CMD_ROW_ADDR_SET                0x2B
+#define LCD_CMD_MEMORY_WRITE                0x2C
 /**
  * MADCTL(36H):
  * +---------------------------------------+
@@ -13,7 +28,7 @@
  * +---------------------------------------+
  * [3] 0=RGB,1=BGR
 */
-#define DATA_ACCESS             0x36
+#define LCD_CMD_MEMORY_DATA_ACCESS_CTRL     0x36
 /**
  * COLMOD(3AH):
  * +---------------------------------------+
@@ -29,204 +44,265 @@
  *      110=18bit/pixel
  *      111=16M truncated
 */
-#define PIXEL_FORMAT            0x3A
+#define LCD_CMD_INTERFACE_PIXEL_FORMAT      0x3A
 
 
-static int lcd_hw_init(lcd_handle_t *h)
+typedef struct
 {
-    h->dev = rt_device_find("lcd");
-    if (h->dev < 0) {
-        LOGE("___ open %s failed\n", DEV_PATH);
-        return -1;
-    }
-    
-    h->buflen = h->width*h->height/8;
-    h->buf = (uint8_t*)calloc(1, h->buflen);
-    if (!h->buf) {
-        LOGE("malloc buffer falied\n");
-        return -1;
-    }
-
-    return 0;
+    struct rt_device parent;
+    uint16_t width;   /* LCD width */
+    uint16_t height;  /* LCD high */
+    uint32_t id;      /* LCD ID */
+    uint8_t dir;      /* 0:Vertical | 1:Vertical */
+} _lcd_dev;
+
+/* LCD param */
+_lcd_dev lcddev;
+static struct rt_spi_device *lcd_dev;
+static uint16_t frame_buf[LCD_H][LCD_W];
+static void LCD_RESET(void)
+{
+    LCD_RES_CLR;
+    DELAY(100);
+    LCD_RES_SET;
+    DELAY(100);
 }
 
-
-
-static void write_reg(lcd_handle_t *h, uint8_t reg)
+static void LCD_WR_REG(uint8_t reg)
 {
     LCD_DC_CLR;
-    rt_spi_send(h->dev, &reg, 1);
+    rt_spi_send(lcd_dev, &reg, 1);
+    LCD_DC_SET;
 }
-static void write_data(uint8_t data)
+
+static void LCD_WR_DATA(uint8_t data)
 {
     LCD_DC_SET;
-    rt_spi_send(h->dev, &data, 1);
+    rt_spi_send(lcd_dev, &data, 1);
 }
-static void write_reg_data(lcd_handle_t *h, uint8_t reg, uint16_t data)
+
+static void LCD_ReadData(uint8_t *data, uint16_t length)
 {
-    write_reg(reg);
-    write_data(data);
+    LCD_DC_SET;
+    rt_spi_transfer(lcd_dev, RT_NULL, &data, length);
 }
-static void read_data(lcd_handle_t *h, uint8_t *data, int length)
+
+static void LCD_WriteReg(uint8_t reg, uint16_t regdata)
 {
-    LCD_DC_SET;
-    rt_spi_transfer(lcd_dev, RT_NULL, data, length);
+    LCD_WR_REG(reg);
+    LCD_WR_DATA(regdata);
 }
-static void write_16bit(lcd_handle_t *h, uint16_t data)
+
+static void LCD_WriteRAM_Prepare(void)
+{
+    LCD_WR_REG(LCD_CMD_MEMORY_WRITE);
+}
+
+static void LCD_WriteData_16Bit(uint16_t Data)
 {
     uint8_t buf[2];
-    
-    
-    buf[0] = data >> 8;
-    buf[1] = data & 0xff;
-    
     LCD_DC_SET;
-    rt_spi_send(h->dev, buf, 2);
+    buf[0] = Data >> 8;
+    buf[1] = Data & 0xff;
+    rt_spi_send(lcd_dev, buf, 2);
 }
 
-void st7789_rotate(lcd_handle_t *h, int rotate)
+void LCD_direction(uint8_t direction)
 {
-    switch (rotate)
+    switch (direction)
     {
-        case rotate:
+    case 0:
         lcddev.width = LCD_W;
         lcddev.height = LCD_H;
-        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (0 << 5) | (0 << 6) | (0 << 7)); /* BGR==0,MV==0,MX==0,MY==0 */
+        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (0 << 5) | (0 << 6) | (0 << 7)); /* BGR==0,MV==0,MX==0,MY==0 */
         break;
-        
-        case 90:
+    case 1:
         lcddev.width = LCD_H;
         lcddev.height = LCD_W;
-        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (1 << 5) | (1 << 6) | (0 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
+        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (1 << 5) | (1 << 6) | (0 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
         break;
-        
-        case 180:
+    case 2:
         lcddev.width = LCD_W;
         lcddev.height = LCD_H;
-        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (0 << 5) | (1 << 6) | (1 << 7)); /* BGR==0,MV==0,MX==1,MY==1 */
+        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (0 << 5) | (1 << 6) | (1 << 7)); /* BGR==0,MV==0,MX==1,MY==1 */
         break;
-        
-        case 270:
+    case 3:
         lcddev.width = LCD_H;
         lcddev.height = LCD_W;
-        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (1 << 5) | (0 << 6) | (1 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
+        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (1 << 5) | (0 << 6) | (1 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
         break;
-        
-        default:
+    default:
         break;
     }
 }
 
-void st7789_set_win(lcd_handle_t *h, int x, int y, int w, int h)
+void LCD_SetWindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd)
 {
-    write_reg(COL_ADDR_SET);
-    write_data(x>>8);
-    write_data(x&0xff);
-    write_data((x+w-1)>>8);
-    write_data((x+w-1)&0xff);
-
-    write_reg(ROW_ADDR_SET);
-    write_data(y>>8);
-    write_data(y&0xff);
-    write_data((y+h-1)>>8);
-    write_data((y+h-1)&0xff);
-
-    write_reg(MEMORY_WRITE);
+    LCD_WR_REG(LCD_CMD_COL_ADDR_SET);
+    LCD_WR_DATA(xStar >> 8);
+    LCD_WR_DATA(0x00FF & xStar);
+    LCD_WR_DATA(xEnd >> 8);
+    LCD_WR_DATA(0x00FF & xEnd);
+
+    LCD_WR_REG(LCD_CMD_ROW_ADDR_SET);
+    LCD_WR_DATA(yStar >> 8);
+    LCD_WR_DATA(0x00FF & yStar);
+    LCD_WR_DATA(yEnd >> 8);
+    LCD_WR_DATA(0x00FF & yEnd);
+
+    LCD_WriteRAM_Prepare();
 }
 
+void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
+{
+    LCD_SetWindows(Xpos, Ypos, Xpos, Ypos);
+}
+
+void LCD_Clear(uint16_t Color)
+{
+    unsigned int i, m;
+
+    LCD_SetWindows(0, 0, lcddev.width - 1, lcddev.height - 1);
+
+    LCD_DC_SET;
+    for (i = 0; i < lcddev.height; i++)
+    {
+        for (m = 0; m < lcddev.width; m++)
+        {
+            frame_buf[i][m] = Color;
+        }
+        for (m = 0; m < lcddev.width;)
+        {
+            m += 40;
+            rt_spi_send(lcd_dev, (uint8_t *)&frame_buf[i][m], 80);
+        }
+    }
+}
 
-void st7789_refresh(lcd_handle_t *h, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
+void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
+{
+    uint16_t i, j;
+    LCD_SetWindows(xsta, ysta, xend - 1, yend - 1);
+    for (i = ysta; i < yend; i++)
+    {
+        for (j = xsta; j < xend; j++)
+        {
+            frame_buf[i][j] = color;
+            LCD_WriteData_16Bit(color);
+        }
+    }
+}
+
+void LCD_Sync_fb(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
 {
     uint16_t i, j;
     LCD_SetWindows(x, y, x + w - 1, y + h - 1);
     LCD_DC_SET;
     for (i = 0; i < h; i++)
     {
-        rt_spi_send(h->dev, (uint8_t *)h->buf, w * 2);
+        rt_spi_send(lcd_dev, (uint8_t *)&frame_buf[y+i][x], w * 2);
     }
 }
 
+void lcd_fill_array_spi(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend, uint16_t *Image)
+{
+    rt_uint32_t size = 0;
+    uint16_t *pImage = Image;
+
+    size = (Xend - Xstart + 1) * (Yend - Ystart + 1) * 2;/*16bit*/
+    LCD_SetWindows(Xstart, Ystart, Xend, Yend);
+    LCD_DC_SET;
+
+    for(int i=0; i<(Yend - Ystart); i++)
+    {
+        for(int j=0; j<(Xend - Xstart); j++)
+        {
+            frame_buf[i + Ystart][j + Xstart] = *pImage++;
+        }
+    }
+    rt_spi_send(lcd_dev, Image, size);
+}
 
-static void reg_init(lcd_handle_t *h)
+static void _st7789_init(void)
 {
-    write_reg(h, DATA_ACCESS);
-    write_data(h, 0x00);
+    LCD_WR_REG(LCD_CMD_MEMORY_DATA_ACCESS_CTRL);
+    LCD_WR_DATA(0x00);
 
-    LCD_WR_REG(h, PIXEL_FORMAT);
-    LCD_WR_DATA(h, 0X05); //03=RGB444,05=RGB565,06=RGB666
+    LCD_WR_REG(LCD_CMD_INTERFACE_PIXEL_FORMAT);
+    LCD_WR_DATA(0X05); //03=RGB444,05=RGB565,06=RGB666
 
-    LCD_WR_REG(h, 0xB2); //Porch Setting
-    LCD_WR_DATA(h, 0x0C);
-    LCD_WR_DATA(h, 0x0C);
-    LCD_WR_DATA(h, 0X00);
-    LCD_WR_DATA(h, 0X33);
-    LCD_WR_DATA(h, 0X33);
+    LCD_WR_REG(0xB2); //Porch Setting
+    LCD_WR_DATA(0x0C);
+    LCD_WR_DATA(0x0C);
+    LCD_WR_DATA(0X00);
+    LCD_WR_DATA(0X33);
+    LCD_WR_DATA(0X33);
 
-    LCD_WR_REG(h, 0xB7); //Gate Control
-    LCD_WR_DATA(h, 0x46);
+    LCD_WR_REG(0xB7); //Gate Control
+    LCD_WR_DATA(0x46);
 
-    LCD_WR_REG(h, 0xBB); //VCOM Setting
-    LCD_WR_DATA(h, 0x1B);
+    LCD_WR_REG(0xBB); //VCOM Setting
+    LCD_WR_DATA(0x1B);
 
-    LCD_WR_REG(h, 0xC0); //LCM Control
-    LCD_WR_DATA(h, 0x2C);
+    LCD_WR_REG(0xC0); //LCM Control
+    LCD_WR_DATA(0x2C);
 
-    LCD_WR_REG(h, 0xC2); //VDV and VRH Command Enable
-    LCD_WR_DATA(h, 0x01);
+    LCD_WR_REG(0xC2); //VDV and VRH Command Enable
+    LCD_WR_DATA(0x01);
 
-    LCD_WR_REG(h, 0xC3); //VRH set
-    LCD_WR_DATA(h, 0x0F);
+    LCD_WR_REG(0xC3); //VRH set
+    LCD_WR_DATA(0x0F);
 
-    LCD_WR_REG(h, 0xC4); //VDV set
-    LCD_WR_DATA(h, 0x20);
+    LCD_WR_REG(0xC4); //VDV set
+    LCD_WR_DATA(0x20);
 
-    LCD_WR_REG(h, 0xC6); //Frame Rate Control
-    LCD_WR_DATA(h, 0x0F);
+    LCD_WR_REG(0xC6); //Frame Rate Control
+    LCD_WR_DATA(0x0F);
 
-    LCD_WR_REG(h, 0xD0); //Power Control 1
-    LCD_WR_DATA(h, 0xA4);
-    LCD_WR_DATA(h, 0xA1);
+    LCD_WR_REG(0xD0); //Power Control 1
+    LCD_WR_DATA(0xA4);
+    LCD_WR_DATA(0xA1);
 
-    LCD_WR_REG(h, 0xD6);
+    LCD_WR_REG(0xD6);
     LCD_WR_DATA(0xA1);
 
-    LCD_WR_REG(h, 0xE0);   /* set Positive Voltage Gamma */
-    LCD_WR_DATA(h, 0xF0);
-    LCD_WR_DATA(h, 0x00);
-    LCD_WR_DATA(h, 0x06);
-    LCD_WR_DATA(h, 0x04);
-    LCD_WR_DATA(h, 0x05);
-    LCD_WR_DATA(h, 0x05);
-    LCD_WR_DATA(h, 0x31);
-    LCD_WR_DATA(h, 0x44);
-    LCD_WR_DATA(h, 0x48);
-    LCD_WR_DATA(h, 0x36);
-    LCD_WR_DATA(h, 0x12);
-    LCD_WR_DATA(h, 0x12);
-    LCD_WR_DATA(h, 0x2B);
-    LCD_WR_DATA(h, 0x34);
-
-    LCD_WR_REG(h, 0xE1);   /* set Negative Voltage Gamma */
-    LCD_WR_DATA(h, 0XF0);
-    LCD_WR_DATA(h, 0X0B);
-    LCD_WR_DATA(h, 0X0F);
-    LCD_WR_DATA(h, 0X0F);
-    LCD_WR_DATA(h, 0X0D);
-    LCD_WR_DATA(h, 0X26);
-    LCD_WR_DATA(h, 0X31);
-    LCD_WR_DATA(h, 0X43);
-    LCD_WR_DATA(h, 0X47);
-    LCD_WR_DATA(h, 0X38);
-    LCD_WR_DATA(h, 0X14);
-    LCD_WR_DATA(h, 0X14);
-    LCD_WR_DATA(h, 0X2C);
-    LCD_WR_DATA(h, 0X32);
-
-    LCD_WR_REG(h, 0x21); // Dispaly Inversion On
-
-    LCD_WR_REG(h, 0x29); // Display On
-
-    LCD_WR_REG(MEMORY_WRITE); // Memory Write
+    LCD_WR_REG(0xE0);   /* set Positive Voltage Gamma */
+    LCD_WR_DATA(0xF0);
+    LCD_WR_DATA(0x00);
+    LCD_WR_DATA(0x06);
+    LCD_WR_DATA(0x04);
+    LCD_WR_DATA(0x05);
+    LCD_WR_DATA(0x05);
+    LCD_WR_DATA(0x31);
+    LCD_WR_DATA(0x44);
+    LCD_WR_DATA(0x48);
+    LCD_WR_DATA(0x36);
+    LCD_WR_DATA(0x12);
+    LCD_WR_DATA(0x12);
+    LCD_WR_DATA(0x2B);
+    LCD_WR_DATA(0x34);
+
+    LCD_WR_REG(0xE1);   /* set Negative Voltage Gamma */
+    LCD_WR_DATA(0XF0);
+    LCD_WR_DATA(0X0B);
+    LCD_WR_DATA(0X0F);
+    LCD_WR_DATA(0X0F);
+    LCD_WR_DATA(0X0D);
+    LCD_WR_DATA(0X26);
+    LCD_WR_DATA(0X31);
+    LCD_WR_DATA(0X43);
+    LCD_WR_DATA(0X47);
+    LCD_WR_DATA(0X38);
+    LCD_WR_DATA(0X14);
+    LCD_WR_DATA(0X14);
+    LCD_WR_DATA(0X2C);
+    LCD_WR_DATA(0X32);
+
+    LCD_WR_REG(0x21); // Dispaly Inversion On
+
+    LCD_WR_REG(0x29); // Display On
+
+    LCD_WR_REG(LCD_CMD_MEMORY_WRITE); // Memory Write
 }
 
 static void Lcd_pin_init(void)
@@ -312,22 +388,118 @@ struct rt_device_graphic_ops lcd_graphic_ops =
     .draw_vline = RT_NULL,//lcd_ops_draw_vline,
     .blit_line  = lcd_ops_blit_line ,
 };
+rt_err_t lcd_dev_ops_init(rt_device_t dev)
+{
+    spi_lcd_init(25);
+    return RT_EOK;
+}
+rt_err_t lcd_dev_ops_open(rt_device_t dev, rt_uint16_t oflag)
+{
+    return RT_EOK;
+}
+rt_err_t lcd_dev_ops_close(rt_device_t dev)
+{
+    return RT_EOK;
+}
+rt_ssize_t lcd_dev_ops_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+    rt_memcpy(buffer, &((uint16_t *)frame_buf)[pos], size * 2);
+    return RT_EOK;
+}
+rt_ssize_t lcd_dev_ops_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+    rt_memcpy(&((uint16_t *)frame_buf)[pos], buffer, size * 2);
+    return RT_EOK;
+}
+rt_err_t lcd_dev_ops_control(rt_device_t dev, int cmd, void *args)
+{
+    switch(cmd)
+    {
+        case RTGRAPHIC_CTRL_RECT_UPDATE:
+        {
+            struct rt_device_rect_info *rect_info = (struct rt_device_rect_info *)args;
+            LCD_Sync_fb(rect_info->x, rect_info->y, rect_info->width, rect_info->height);
+        }
+        case RTGRAPHIC_CTRL_GET_INFO:
+        {
+            struct rt_device_graphic_info *info = args;
+            if(info == RT_NULL)
+            {
+                return -RT_ERROR;
+            }
+            info->pixel_format   = RTGRAPHIC_PIXEL_FORMAT_RGB565; /**< graphic format */
+            info->bits_per_pixel = 16; /**< bits per pixel */
+            info->pitch          = 0; /**< bytes per line */
+            info->width          = lcddev.width; /**< width of graphic device */
+            info->height         = lcddev.height; /**< height of graphic device */
+            info->framebuffer    = (void *)frame_buf; /**< frame buffer */
+            info->smem_len       = sizeof(frame_buf); /**< allocated frame buffer size */
+        }
+    }
+    return RT_EOK;
+}
 
-static int st7789_dev_init(void)
+static int lcd_dev_init(void)
 {
-    #ifdef RT_USING_DEVICE_OPS
-    lcddev.parent.ops = &lcd_dev_ops;
-    #else
     lcddev.parent.init    = lcd_dev_ops_init   ;
     lcddev.parent.open    = lcd_dev_ops_open   ;
     lcddev.parent.close   = lcd_dev_ops_close  ;
     lcddev.parent.read    = lcd_dev_ops_read   ;
     lcddev.parent.write   = lcd_dev_ops_write  ;
     lcddev.parent.control = lcd_dev_ops_control;
-    #endif
+
     lcddev.parent.type = RT_Device_Class_Graphic;
     lcddev.parent.user_data = &lcd_graphic_ops;
     rt_device_register(&lcddev.parent, "lcd", RT_DEVICE_FLAG_RDWR);
     return RT_EOK;
 }
+INIT_DEVICE_EXPORT(lcd_dev_init);
 
+static int lcd_spi_test(int argc, char *argv[])
+{
+    rt_device_t lcd = rt_device_find("lcd");
+    if(lcd)
+    {
+        uint8_t index = 0;
+        rt_device_open(lcd, RT_DEVICE_FLAG_RDWR);
+        if(rt_strcmp(argv[1], "clear") == 0)
+        {
+            for (index = 0; index < sizeof(color_array) / sizeof(color_array[0]); index++)
+            {
+                LCD_Clear(color_array[index]);
+                LOG_I("lcd clear color: 0x%04x", color_array[index]);
+                DELAY(2000);
+            }
+        }
+        else if(rt_strcmp(argv[1], "line") == 0)
+        {
+            if(argc > 5)
+            {
+                int x = _str2hex(argv[2]);
+                int y = _str2hex(argv[3]);
+                int size = _str2hex(argv[4]);
+                volatile uint8_t buf[size*2];
+                uint16_t color = _str2hex(argv[5]);
+                for(int i=0; i<size; i++)
+                {
+                    buf[i*2] = color>>8;
+                    buf[i*2+1] = color&0xFF;
+                }
+                lcd_ops_blit_line((void *)buf, x, y, size);
+            }
+            else
+            {
+                rt_kprintf("<> line <x> <y> <size> <color>\r\n");
+            }
+        }
+        rt_device_close(lcd);
+    }
+    else
+    {
+        LOG_E("lcd not found.");
+    }
+
+    return RT_EOK;
+}
+MSH_CMD_EXPORT(lcd_spi_test, lcd will fill color => you need init lcd first);
+#endif

+ 71 - 0
f407/applications/ui/st7789.h

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2023-03-23     Vandoul       First version
+ */
+#ifndef __ST7789_H__
+#define __ST7789_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#include <stdint.h>
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "drivers/spi.h"
+#include "lcd.h"
+
+
+/* 0-0 angle|1-90 angle|2-180 angle|-270 angle */
+#define USE_DIRECTION   0
+
+/* lcd size */
+#define LCD_W 240
+#define LCD_H 240
+
+#define CS_PIN       GET_PIN(B, 12)
+#define BK_PIN       GET_PIN(D, 9)     //PD9
+#define DC_PIN       GET_PIN(D, 8)     //PD8
+#define RST_PIN     GET_PIN(B, 14)    //PB14
+
+
+#define LCD_DC_CLR  rt_pin_write(DC_PIN, PIN_LOW)
+#define LCD_DC_SET  rt_pin_write(DC_PIN, PIN_HIGH)
+#define LCD_RES_CLR rt_pin_write(RST_PIN, PIN_LOW)
+#define LCD_RES_SET rt_pin_write(RST_PIN, PIN_HIGH)
+#define LCD_BLK_CLR rt_pin_write(BK_PIN, PIN_HIGH)
+#define DELAY       rt_thread_mdelay
+
+#define WHITE 0xFFFF
+#define BLACK 0x0000
+#define BLUE 0x001F
+#define BRED 0XF81F
+#define GRED 0XFFE0
+#define GBLUE 0X07FF
+#define RED 0xF800
+#define MAGENTA 0xF81F
+#define GREEN 0x07E0
+#define CYAN 0x7FFF
+#define YELLOW 0xFFE0
+#define BROWN 0XBC40
+#define BRRED 0XFC07
+#define GRAY 0X8430
+
+void LCD_Clear(uint16_t Color);
+void LCD_direction(uint8_t direction);
+void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);
+void LCD_SetWindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd);
+void LCD_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color);
+void lcd_fill_array_spi(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t *pcolor);
+
+rt_err_t spi_lcd_init(uint32_t freq);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 59 - 55
f407/applications/web.c

@@ -74,26 +74,31 @@ static int ws_send(web_handle_t *h, struct mg_connection *c, uint8_t type, void
     hdr->nack  = 0;
     hdr->dlen  = len;
     memcpy(hdr->data, data, len);
-    mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, h, len+sizeof(pkt_hdr_t));
-    free(h);
+    mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, hdr, len+sizeof(pkt_hdr_t));
     return 0;
 }
-static int send_power(web_handle_t *h, struct mg_connection *c)
+static void send_powerc(web_handle_t *h, struct mg_connection *c)
 {
     int i,r;
-    
-    r = power_data_clone(&h->pdat);
+    r = power_data_copy(&h->pdat, 1);
     if(r==0) {
         for(i=0; i<h->pdat.chs; i++) {
             ws_send(h, c, PKT_TYPE_POWER_CH, &h->pdat.pch[i], sizeof(power_ch_t), 1);
         }
+    }
+}
+static void send_powert(web_handle_t *h, struct mg_connection *c)
+{
+    int i,r;
+    r = power_data_copy(&h->pdat, 2);
+    if(r==0) {
         ws_send(h, c, PKT_TYPE_POWER_TOTAL, &h->pdat.ttl, sizeof(power_total_t), 1);
     }
 }
 
 
 
-static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr)
+static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, struct mg_connection *c)
 {
     int r=0;
     
@@ -102,6 +107,7 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr)
         return -1;
     }
     
+    LOGD("_____ ws handle, type: %d\n", hdr->type);
     switch(hdr->type) {
         case PKT_TYPE_PARAS:
         {
@@ -111,41 +117,53 @@ static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr)
         
         case PKT_TYPE_POWER_CH:
         {
-            power_ch_t *pch=(power_ch_t*)hdr->data;
-            switch(hdr->subtype) {
-                case SUB_TYPE_POWER_SWITCH:
-                {
-                    r = power_set_sw(pch);
-                }
-                break;
-                
-                case SUB_TYPE_POWER_ALARM:
-                {
-                    r = power_set_alarm(pch);
-                }
-                break;
-                
-                case SUB_TYPE_POWER_THRESHOLD:
-                {
-                    r = power_set_threshold(pch);
-                }
-                break;
-                
-                case SUB_TYPE_POWER_START_DELAY:
-                {
-                    r = power_set_start_delay(pch);
+            if(hdr->dlen>0) {
+                power_ch_t *pch=(power_ch_t*)hdr->data;
+                switch(hdr->subtype) {
+                    case SUB_TYPE_POWER_SWITCH:
+                    {
+                        r = power_set_sw(pch);
+                    }
+                    break;
+                    
+                    case SUB_TYPE_POWER_ALARM:
+                    {
+                        r = power_set_alarm(pch);
+                    }
+                    break;
+                    
+                    case SUB_TYPE_POWER_THRESHOLD:
+                    {
+                        r = power_set_threshold(pch);
+                    }
+                    break;
+                    
+                    case SUB_TYPE_POWER_START_DELAY:
+                    {
+                        r = power_set_start_delay(pch);
+                    }
+                    break;
+                    
+                    case SUB_TYPE_POWER_STOP_DELAY:
+                    {
+                        r = power_set_stop_delay(pch);
+                    }
+                    break;
                 }
-                break;
-                
-                case SUB_TYPE_POWER_STOP_DELAY:
-                {
-                    r = power_set_stop_delay(pch);
-                }
-                break;
+            }
+            else {
+                LOGD("_____ send_powerc\n");
+                send_powerc(h, c);
             }
         }
         break;
         
+        case PKT_TYPE_POWER_TOTAL:
+        {
+            send_powert(h, c);
+        }
+        break;
+        
         case PKT_TYPE_CH_ALL:
         {
             power_ch_t *pch=(power_ch_t*)hdr->data;
@@ -208,14 +226,13 @@ static void http_fn(struct mg_connection *c, int ev, void *ev_data)
     }
     else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
         paras_data_t *p=paras_get();
-        ws_send(h, c, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
-        
-        set_timer(c, TIMER_INTERVAL);
+        //ws_send(h, c, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
+        //set_timer(c, TIMER_INTERVAL);
     }
     else if(ev == MG_EV_WEBSOCKET_FRAME) {
         struct websocket_message *wm = (struct websocket_message *) ev_data;
-        pkt_hdr_t *pkt=(pkt_hdr_t*)wm->data;
-        ws_handle(h, pkt);
+        pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
+        ws_handle(h, hdr, c);
     }
     else if(ev==MG_EV_TIMER) {
         list_node_t *ln=NULL;
@@ -268,7 +285,7 @@ static void *web_thread(void *arg)
 #endif
     
     while(th->quit==0) {
-        mg_mgr_poll(&h->mgr, 200);
+        mg_mgr_poll(&h->mgr, 300);
     }
     mg_mgr_free(&h->mgr);
     
@@ -293,19 +310,6 @@ int web_init(void)
 
 
 
-int web_send_bin(int type, void *data, int len)
-{
-    struct mg_connection *c;
-    web_handle_t *h=&webHandle;
-    
-    for (c = mg_next(&h->mgr, NULL); c != NULL; c = mg_next(&h->mgr, c)) {
-        ws_send(h, c, type, data, len, 1);
-    }
-    
-    return 0;
-}
-
-
 int web_post_bin(int type, void *data, int len)
 {
     struct mg_connection *c;

+ 0 - 1
f407/applications/web.h

@@ -4,7 +4,6 @@
 
 int web_init(void);
 int web_post_bin(int type, void *data, int len);
-int web_send_bin(int type, void *data, int len);
 
 #endif
 

+ 17 - 52
f407/project/app/app.uvoptx

@@ -120,7 +120,6 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>d</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -148,56 +147,7 @@
           <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint>
-        <Bp>
-          <Number>0</Number>
-          <Type>0</Type>
-          <LineNumber>644</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>&lt;1&gt;..\..\applications\power.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>1</Number>
-          <Type>0</Type>
-          <LineNumber>647</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>134500914</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>1</BreakIfRCount>
-          <Filename>&lt;1&gt;..\..\applications\power.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression>\\app\../../applications/power.c\647</Expression>
-        </Bp>
-        <Bp>
-          <Number>2</Number>
-          <Type>0</Type>
-          <LineNumber>642</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>&lt;1&gt;..\..\applications\power.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-      </Breakpoint>
+      <Breakpoint/>
       <WatchWindow1>
         <Ww>
           <count>0</count>
@@ -214,6 +164,21 @@
           <WinNumber>1</WinNumber>
           <ItemText>h-&gt;pch[2]</ItemText>
         </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>tmp</ItemText>
+        </Ww>
+        <Ww>
+          <count>4</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>len,0x0A</ItemText>
+        </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>h-&gt;buflen,0x0A</ItemText>
+        </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
@@ -549,7 +514,7 @@
 
   <Group>
     <GroupName>applications/ui</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 5 - 5
f407/rt-thread/components/net/lwip/port/ethernetif.c

@@ -610,14 +610,14 @@ rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_
         ip4_addr_t ipaddr, netmask, gw;
 #endif /* LWIP_VERSION_MAJOR == 1U */
 
-#if !LWIP_DHCP
+#if LWIP_DHCP
+        IP4_ADDR(&ipaddr, 0, 0, 0, 0);
+        IP4_ADDR(&gw, 0, 0, 0, 0);
+        IP4_ADDR(&netmask, 0, 0, 0, 0); 
+#else
         ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
         gw.addr = inet_addr(RT_LWIP_GWADDR);
         netmask.addr = inet_addr(RT_LWIP_MSKADDR);
-#else
-        IP4_ADDR(&ipaddr, 0, 0, 0, 0);
-        IP4_ADDR(&gw, 0, 0, 0, 0);
-        IP4_ADDR(&netmask, 0, 0, 0, 0);
 #endif
         netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input);
     }

+ 29 - 1
f407/tools/web/data.js

@@ -61,6 +61,34 @@ function array_cat(a1,a2){
     }
     return buffer;
 }
+function mk_hdr(type)
+{
+    var tmp,length=0;
+    var buffer = new ArrayBuffer(9);
+
+    tmp = new DataView(buffer, length);
+    var t = 0xdead;
+    tmp.setUint16(0,t,true);//magic
+    length += 2;
+
+    tmp = new DataView(buffer, length);
+    tmp.setUint8(0,type,true);  //type
+    length += 1;
+
+    tmp = new DataView(buffer, length);
+    tmp.setUint8(0,0,true);     //subtype
+    length += 1;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint8(0,0,true);     //nack
+    length += 1;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint32(0,0,true);    //dlen
+    length += 4;
+    
+    return buffer;
+}
 ///////////////////////////////////////////////////
 function bin_to_hdr(bin) {
     var tmp, length=0;
@@ -758,7 +786,7 @@ function WS(url,fn) {
     var his = this;
     this.open();
     function _open() {
-        console.log("____ url: \n", his.url);
+        console.log("____url: ", his.url);
         his.ws = new WebSocket(his.url);
         his.ws.binaryType = 'arraybuffer';
         his.ws.onopen = _onopen;

+ 3 - 1
f407/tools/web/index.html

@@ -32,7 +32,9 @@
         return ws;
     }
 
-    ws = new WS("ws://localhost:8888/websocket",on_ws_msg);
+
+
+    ws = new WS("ws://192.168.234.132/ws",on_ws_msg);
 
     
     

+ 1 - 1
f407/tools/wsServer/mg.cpp

@@ -39,7 +39,7 @@ static void fn(struct mg_connection *c, int ev, void *ev_data) {
       
   } else if (ev == MG_EV_HTTP_MSG) {
         struct mg_http_message *hm = (struct mg_http_message *) ev_data;
-        if (mg_match(hm->uri, mg_str("/websocket"), NULL)) {
+        if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
             // Upgrade to websocket. From now on, a connection is a full-duplex
             // Websocket connection, which will receive MG_EV_WS_MSG events.
             mg_ws_upgrade(c, hm, NULL);