Selaa lähdekoodia

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

liyi 1 vuosi sitten
vanhempi
commit
a64e766911

+ 2 - 2
Qt/SmartPDU_QT/mainwidget.cpp

@@ -569,12 +569,12 @@ void MainWidget::UpdateStatusInfo()
     ui->label_humidity->setText(strTemp);
     if(!m_PDUAllInfo.Sensor_LeakFlag)
     {
-        ui->label_water->setText("未泄漏");
+        ui->label_water->setText("未浸入");
         ui->label_water->setStyleSheet("color: rgb(10, 197, 50);");
     }
     else
     {
-        ui->label_water->setText("泄漏");
+        ui->label_water->setText("浸入");
         // 切换颜色
         QColor currentColor = ui->label_water->palette().color(QPalette::WindowText);
         if (currentColor == Qt::white) {

+ 2 - 2
Qt/SmartPDU_QT/mainwidget.ui

@@ -364,7 +364,7 @@
                   <string notr="true">color: rgb(255, 255, 255);</string>
                  </property>
                  <property name="text">
-                  <string>泄漏:</string>
+                  <string>水浸:</string>
                  </property>
                 </widget>
                </item>
@@ -382,7 +382,7 @@
                   <string notr="true">color: rgb(255, 255, 255);</string>
                  </property>
                  <property name="text">
-                  <string>未泄漏</string>
+                  <string>未浸入</string>
                  </property>
                 </widget>
                </item>

+ 1 - 3
Qt/SmartPDU_QT/serialinfo.cpp

@@ -245,9 +245,7 @@ void SerialInfo::on_Parse_PDUStatus(const QString &Sendstr,const QString &Recstr
         }
         m_PDUAllInfo.Sensor_Temperature = ((pRecVector[1] << 16) + pRecVector[0] )/1000.0f;
         m_PDUAllInfo.Sensor_Humidity = ((pRecVector[3] << 16) + pRecVector[2] )/1000.0f;
-        float ftemp=((pRecVector[5] << 16) + pRecVector[4] )/1000.0f;
-        if(ftemp>0.05)m_PDUAllInfo.Sensor_LeakFlag=true;
-        else m_PDUAllInfo.Sensor_LeakFlag=false;
+        m_PDUAllInfo.Sensor_LeakFlag=((pRecVector[5] << 16) + pRecVector[4] );
         //m_PDUAllInfo.Sensor_CO2 = ((pRecVector[5] << 16) + pRecVector[4] )/1000.0f;
         m_PDUAllInfo.Sensor_INTemperature = ((pRecVector[9] << 16)+ pRecVector[8])/1000.0f;
         m_PDUAllInfo.Sensor_OUTTemperature = ((pRecVector[13] << 16)+ pRecVector[12])/1000.0f;

+ 2 - 1
f407/applications/board.h

@@ -119,7 +119,8 @@ extern "C"
 
 
 #define BSP_USING_SPI
-//#define BSP_USING_SPI1
+#define BSP_USING_SPI1
+#define BSP_USING_SPI2
 
 #define BSP_USING_SDCARD
 

+ 1 - 2
f407/applications/cfg.h

@@ -48,8 +48,7 @@
     
     #define CHANNEL_DELAY                       8
 
-    #define PROD_TYPE                           1
-    #define PROD_POWER_TYPE                     0
+    #define PROD_TYPE                           PDU_AC_I3O3
 
     //#define USE_UI
 

+ 39 - 96
f407/applications/datadef.h

@@ -9,12 +9,6 @@
 #define BRD_MAX         32
 #define SLAVE_CH_MAX    64
 
-enum{
-    A_P = 0,
-    B_P = 1,
-    C_P = 2,
-};
-
 
 enum {
     RW_READ=0,                                 //读
@@ -40,7 +34,7 @@ enum {
     PDU_DC_I1O1,
     PDU_AC_I3O3=3,
     PDU_AC_I3O1,
-    PDU_AC_I3O3_H,
+    PDU_AC_I3O1_H,
 };
 
 enum {
@@ -149,15 +143,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];           //
@@ -232,19 +224,19 @@ typedef struct {
 typedef struct power_data{
     float               voltage;                //电压
     float               current;                //电流
-    float               power;                  //功率
+    float               power;                  //功率(视在)
     float               freq;                   //频率
+    float               factor;                 //功率因数
     float               consump;                //耗电量consumption
-    float               factor;                 //功率因素
 
+    float               active;                 //有功功率
+    float               reactive;               //无功功率
+    uint8_t             ph_out;                 //三相输出时,用于判断该相是否有输出
+    
     uint8_t             status;                 //开关状态     
     uint8_t             nwire;                  //零线状态    
 }power_t;
 
-typedef union board_wanning{
-    uint8_t             data[3];
-}power_wanning_t;
-
 typedef struct {
     uint8_t             en;
     float               val;                    //threashold value
@@ -266,7 +258,7 @@ typedef struct {
     uint8_t             p_upper;                //功率超上限
     uint8_t             w_upper;                //耗电量超上限
     
-    uint8_t             ph_loss;                //缺相
+    uint8_t             ph_loss;                //缺相,0,1,2位分别代表L1,L2,L3相,相应位为1则代表缺相,为0则不缺
 }alarm_t;
 typedef struct {
     uint8_t             ch;
@@ -275,16 +267,18 @@ typedef struct {
 }alarm_data_t;
 
 typedef struct {
-    int8_t              type;
+    uint8_t             type;
     uint8_t             addr;
     uint8_t             ch;                      //该通道在全部板上的所排序号,程序始于0,用户始于1
     uint8_t             sch;                     //该通道在其所在的板上的序号,程序始于0,用户始于1
-    uint8_t             pid;                     //phase id, 0:L1相 1:L2相 2:L3相
+    uint8_t             ph_id;                   //phase id, 0:L1相 1:L2相 2:L3相
     
-    uint16_t            start_delay;
-    uint16_t            stop_delay;
+    uint8_t             ph_val;                  //三相输出设置,0:单相  1:三相
+    uint32_t            start_delay;
+    uint32_t            stop_delay;
 }info_t;
 typedef struct {
+    char                name[32];
     info_t              info;
     power_t             power[3];                 //电力信息
     thr_t               thr;                      //阈值
@@ -321,22 +315,16 @@ typedef struct board_data {
     power_ch_t          *pch;                   //根据实际通道数申请连续内存
 }board_data_t;
 
-typedef struct {
-    
-    
-    
-}board_all_t;
-
 typedef struct {
     float               voltage;                //电压
     float               current;                //电流
-    float               power;                  //功率
+    float               power;                  //视在功率
     float               freq;                   //频率
+    float               factor;                 //功率因数
     float               consump;                //耗电量
     
     float               active;                 //有功功率
     float               reactive;               //无功功率
-    float               apparent;               //视在功率
 }total_t;
 typedef struct {
     uint8_t             type;
@@ -376,7 +364,7 @@ typedef struct cascade_saddr{
 
 
 typedef struct cascade_data{
-    slave_info_t *c_s[BRD_MAX];                        //从机最多个数
+    slave_info_t *c_s[BRD_MAX];                 //从机最多个数
 }cascade_data_t;
 
 
@@ -385,58 +373,7 @@ typedef struct sensor_info{
     float       v[2];
 }sensor_info_t;
 
-typedef struct md_ac_dc{
-    uint16_t          dev_cnt;                   //设备类型和通道数
-    power_t           power[64];                 //最大64通道
-    uint16_t          temp_hum;
-    uint16_t          switch_stu[64];
-    uint16_t          delay_open[64];
-    uint16_t          delay_close[64];
-    sensor_info_t     md_s[8];
-    uint16_t          dry_node[4]; 
-}md_ac_dc_t;
-
-typedef struct all_info{
-    uint32_t voltage;
-    uint32_t current;
-    uint32_t power;
-    uint32_t consumer;
-}all_info_t;
 
-typedef struct {
-    uint32_t power;
-    uint32_t freq;
-    uint32_t consumer;
-    uint16_t fac;
-    uint32_t out_type;
-}all_chn_info_t;
-
-typedef struct chn_phase_info{
-    uint32_t p_voltage;
-    uint32_t p_current;
-    uint32_t p_power;
-    uint32_t p_consumer;
-    uint32_t p_status;
-}chn_phase_info_t;
-
-typedef struct md_3_ac{
-    uint16_t            dev_cnt;                                        //设备类型和通道数
-    all_info_t          ac_3_all_pw[3];
-    all_chn_info_t      ac_3_all_chn[64];
-    chn_phase_info_t    ac_3_chn_p[64][3];
-    uint16_t            temp_hum;
-    uint16_t            switch_chn[64];
-    uint16_t            delay_open[64];
-    uint16_t            delay_close[64];
-    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 
 {
@@ -542,7 +479,10 @@ enum {
     PKT_TYPE_PARAS,             
     PKT_TYPE_POWER_CH,          //power_ch_t
     PKT_TYPE_POWER_TOTAL,       //power_total_t
-    PKT_TYPE_CH_ALL,            //uint8_t, 0:all close  1:all open
+    PKT_TYPE_POWER_RESET,
+    PKT_TYPE_CH_ALL,
+    PKT_TYPE_SCAN,
+    PKT_TYPE_FACTORY,
     PKT_TYPE_ALARM,
     PKT_TYPE_SENSOR,
     PKT_TYPE_BREAKER,
@@ -553,26 +493,29 @@ enum {
     PKT_TYPE_MAX
 };
 
-#define PKT_MAGIC  0xdeadbeef
+enum {
+    SUB_TYPE_POWER_SWITCH=0,            //set relay switch
+    SUB_TYPE_POWER_ALARM,
+    SUB_TYPE_POWER_THRESHOLD,
+    SUB_TYPE_POWER_START_DELAY,
+    SUB_TYPE_POWER_STOP_DELAY,
+    
+    SUB_TYPE_MAX
+};
+
+#define PKT_MAGIC  0xdead
 typedef struct {
-    uint32_t  magic;
-    uint32_t  type;
-    uint32_t  nack;
+    uint16_t  magic;
+    uint8_t   type;
+    uint8_t   subtype;
+    uint8_t   nack;
+    uint32_t  flag;
     uint32_t  dlen;
     uint8_t   data[0];
 }pkt_hdr_t;
 
 
 
-
-
-
-
-
-
-
-
-
 #pragma pack ()
 
 #define DB_NAME         "smartPDU.db"

+ 1 - 1
f407/applications/dflt.c

@@ -14,7 +14,7 @@ paras_data_t DFLT_PARAS={
             .date = "2024.01.01",
             .batch= "1",
             .type       = PROD_TYPE,
-            .pwr_type   = PROD_POWER_TYPE,
+            .pwr_type   = PROD_TYPE,
             .version    = VERSION,
             .language   = LANGUAGE,                     //多国语言
             .count      = 0,                            //级联设备数

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

+ 2 - 2
f407/applications/paras.c

@@ -218,11 +218,11 @@ static int proc_prod(dictionary *dic, int op, product_data_t *prod)
             LOGE("___ check product.language %d is wrong\n", prod->language);
             r = -1;
         }
-        if(prod->type>=PDU_AC_I3O3_H) {
+        if(prod->type>=PDU_AC_I3O1_H) {
             LOGE("___ check product.type %d is wrong\n", prod->type);
             r = -1;
         }
-        if(prod->pwr_type>PDU_AC_I3O3_H) {
+        if(prod->pwr_type>PDU_AC_I3O1_H) {
             LOGE("___ check product.pwr_type %d is wrong\n", prod->pwr_type);
             r = -1;
         }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 440 - 237
f407/applications/power.c


+ 10 - 3
f407/applications/power.h

@@ -147,6 +147,12 @@ typedef struct {
     float   current_b;//电流B
 }kb_val_t;
 
+typedef struct {
+    uint8_t         chs;                    //所有控制板的总通道数
+    power_ch_t      *pch;
+    
+    power_total_t   ttl;
+}power_data_t;
 
 
 int power_init(void);
@@ -157,13 +163,14 @@ int power_scan(void);
 int power_get_ch(int ch, power_ch_t *pch);
 int power_get_board(board_data_t *pb);
 
-int power_set_ch(power_ch_t *pch);
+int power_set_sw(power_ch_t *pch);
 int power_set_alarm(power_ch_t *pch);
 int power_set_threshold(power_ch_t *pch);
 int power_set_start_delay(power_ch_t *pch);
-int power_set_close_delay(power_ch_t *pch);
+int power_set_stop_delay(power_ch_t *pch);
+int power_reset(void);
 
+int power_data_copy(power_data_t *pd, int flag);
 
-board_all_t * get_control_board();
 #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

+ 33 - 129
f407/applications/ui/lcd.c

@@ -1,12 +1,12 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include <fcntl.h>
-#include <unistd.h>
 #include <string.h>
+#include <unistd.h>
 #include "gpio.h"
 #include "lcd.h"
 #include "log.h"
 
+#define CS_GPIO      GET_PIN(B, 12)
 #define BK_GPIO      GET_PIN(D, 9)     //PD9
 #define DC_GPIO      GET_PIN(D, 8)     //PD8
 #define RST_GPIO     GET_PIN(B, 14)    //PB14
@@ -16,7 +16,7 @@
 #define SWAP16(a)           ((uint16_t)((a<<8)|(a>>8)))
 
 
-#define DEV_PATH        "spi2"
+#define LCD_PORT            "spi2"
 
 
 typedef struct {
@@ -25,69 +25,12 @@ typedef struct {
     int  w;
     int  h;
 }lcd_rect_t;
-typedef struct {
-    int         width;
-    int         height;
-    int         color;
-    int         rotate;
-
-    int         fd;
-    int         io;
-    uint8_t     *buf;
-    
-    int         buflen;
-}lcd_handle_t;
+
 static lcd_handle_t lcdHandle={0};
-static int ssd1309_init(lcd_handle_t *h);
-static void ssd1309_refresh(lcd_handle_t *h);
 
-static int lcd_hw_init(lcd_handle_t *h)
-{
-    h->fd = open(DEV_PATH, O_RDWR);
-    if (h->fd < 0) {
-        LOGE("___ open %s failed\n", DEV_PATH);
-        return -1;
-    }
 
-    gpio_init(BK_GPIO, GPIO_OUT, 0);
-    gpio_init(DC_GPIO, GPIO_OUT, 0);
-    gpio_init(RST_GPIO, GPIO_OUT, 0);
-    
-    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;
-    }
-    
-    #if 0
-    uint8_t mode = SPI_MODE_0;
-    if (ioctl(fd, SPI_IOC_WR_MODE, &mode) == -1) {
-        LOGE("Can't set SPI mode\n");
-        return -1;
-    }
-    
-    uint32_t speed = 8000000;
-    if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) {
-        LOGE("Can't set max speed\n");
-        return -1;
-    }
-    #endif
-    
-    ssd1309_init(h);
 
-    return 0;
-}
-static int lcd_hw_write(lcd_handle_t *h, void *data, int len)
-{
-    return write(h->fd, data, len);
-}
-static void lcd_write_reg(lcd_handle_t *h, uint8_t reg)
-{
-    gpio_set(DC_GPIO, 0);
-    lcd_hw_write(h, &reg, 1);
-}
-static int ssd1309_reset(void)
+static int lcd_reset(void)
 {
     gpio_set(RST_GPIO, 0);
     usleep(100*1000);
@@ -95,78 +38,28 @@ static int ssd1309_reset(void)
     
     return 0;
 }
-static void ssd1309_on(lcd_handle_t *h, int flag)
-{
-    if(flag) {
-        lcd_write_reg(h,0x8D);
-	    lcd_write_reg(h,0x14);
-	    lcd_write_reg(h,0xAF);
-    }
-    else {
-        lcd_write_reg(h,0x8D);
-	    lcd_write_reg(h,0x10);
-	    lcd_write_reg(h,0xAE);
-    }
 
-}
-static int ssd1309_init(lcd_handle_t *h)
-{
-    ssd1309_reset();
-
-    lcd_write_reg(h,0xFD);
-	lcd_write_reg(h,0x12);
-	lcd_write_reg(h,0xAE);//--turn off oled panel
-	lcd_write_reg(h,0xd5);//--set display clock divide ratio/oscillator frequency
-	lcd_write_reg(h,0xA0);
-	lcd_write_reg(h,0xA8);//--set multiplex ratio(1 to 64)
-	lcd_write_reg(h,0x3f);//--1/64 duty
-	lcd_write_reg(h,0xD3);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
-	lcd_write_reg(h,0x00);//-not offset
-	lcd_write_reg(h,0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
-	lcd_write_reg(h,0xA1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
-	lcd_write_reg(h,0xC8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
-	lcd_write_reg(h,0xDA);//--set com pins hardware configuration
-	lcd_write_reg(h,0x12);
-	lcd_write_reg(h,0x81);//--set contrast control register
-	lcd_write_reg(h,0x7F);// Set SEG Output Current Brightness
-	lcd_write_reg(h,0xD9);//--set pre-charge period
-	lcd_write_reg(h,0x82);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
-	lcd_write_reg(h,0xDB);//--set vcomh
-	lcd_write_reg(h,0x34);//Set VCOM Deselect Level
-	lcd_write_reg(h,0xA4);// Disable Entire Display On (0xa4/0xa5)
-	lcd_write_reg(h,0xA6);// Disable Inverse Display On (0xa6/a7)
-
-    ssd1309_refresh(h);
-    ssd1309_on(h,1);
-	
-	return 0;
-}
-static void ssd1309_refresh(lcd_handle_t *h)
+int lcd_hw_init(lcd_handle_t *h, uint32_t freq)
 {
-	int i,n,offset;
     
-	for(i=0;i<8;i++) {
-	   lcd_write_reg(h,0xb0+i); 			//设置行起始地址
-	   lcd_write_reg(h,0x00);   			//设置低列起始地址
-	   lcd_write_reg(h,0x10);   			//设置高列起始地址
-
-       gpio_set(DC_GPIO, 1);
-       lcd_hw_write(h, &h->buf[i*h->width], h->width);
-  	}
+
+    return 0;
 }
+
 static int lcd_hw_deinit(lcd_handle_t *h)
 {
+    gpio_deinit(CS_GPIO);
     gpio_deinit(BK_GPIO);
     gpio_deinit(DC_GPIO);
     gpio_deinit(RST_GPIO);
     
     free(h->buf);
-    close(h->fd);
+    //close(h->fd);
     
     return 0;
 }
 
-static inline int set_point(lcd_handle_t *h, int x, int y, int data)
+static inline int set_point(lcd_handle_t *h, int x, int y, uint32_t data)
 {
     int pos,bit;
 
@@ -203,15 +96,20 @@ static int get_color_bits(int color)
 }
 
 ////////////////////////////////////////////////////////////
-void lcd_init(int width, int height, int color)
+void lcd_init(int width, int height, uint32_t color)
 {
     lcd_handle_t *h=&lcdHandle;
     h->width  = width;
     h->height = height;
     h->color  = color;
     h->rotate = 0;
-
-    lcd_hw_init(h);
+    
+    gpio_init(BK_GPIO, GPIO_OUT, 0);
+    gpio_init(DC_GPIO, GPIO_OUT, 0);
+    gpio_init(RST_GPIO, GPIO_OUT, 0);
+    lcd_reset();
+    
+    //lcd_hw_init(h);
 }
 
 void lcd_deinit(void)
@@ -244,7 +142,13 @@ void lcd_set_backlight(int on)
 }
 
 
-void lcd_fill(int color)
+void lcd_set_win(int x, int y, int w, int h)
+{
+    
+}
+
+
+void lcd_fill(uint32_t color)
 {
     lcd_handle_t *h=&lcdHandle;
     
@@ -252,7 +156,7 @@ void lcd_fill(int color)
 }
 
 
-void lcd_draw_line(int x1, int y1, int x2, int y2, int color)
+void lcd_draw_line(int x1, int y1, int x2, int y2, uint32_t color)
 {
     int incx = 0, incy = 0;
     int  delta_x = 0, delta_y = 0;
@@ -328,7 +232,7 @@ void lcd_draw_line(int x1, int y1, int x2, int y2, int color)
 
 
 
-void lcd_draw_rect(int x, int y, int w, int h, int color)
+void lcd_draw_rect(int x, int y, int w, int h, uint32_t color)
 {
     int  x2,y2;
 
@@ -341,7 +245,7 @@ void lcd_draw_rect(int x, int y, int w, int h, int color)
 }
 
 
-void lcd_fill_rect(int x, int y, int w, int h, int color)
+void lcd_fill_rect(int x, int y, int w, int h, uint32_t color)
 {
     int i,j;
     lcd_handle_t *h2=&lcdHandle;
@@ -357,11 +261,11 @@ void lcd_fill_rect(int x, int y, int w, int h, int color)
 void lcd_refresh(void)
 {
     lcd_handle_t *h=&lcdHandle;
-    ssd1309_refresh(h);
+    
 }
 
 
-int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int font, int color, int bgcolor, int vert)
+int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int font, uint32_t color, uint32_t bgcolor, int vert)
 {
     uint8_t tmp;
     font_data_t fdata;
@@ -404,7 +308,7 @@ int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int
 }
 
 
-void lcd_draw_string(int x, int y, int w, int h, char *str, int font, int color, int bgcolor, int hori, int vert)
+void lcd_draw_string(int x, int y, int w, int h, char *str, int font, uint32_t color, uint32_t bgcolor, int hori, int vert)
 {
     int r,sw,xmax=x+w;
     lcd_rect_t rect;

+ 39 - 6
f407/applications/ui/lcd.h

@@ -1,8 +1,31 @@
 #ifndef __LCD_Hx__
 #define __LCD_Hx__
 
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "drivers/spi.h"
 #include "font.h"
 
+
+enum {
+    COLOR_WHITE=0,
+    COLOR_BLACK,
+    COLOR_BLUE,
+    COLOR_BRED,
+    COLOR_GRED,
+    COLOR_GBLUE,
+    COLOR_RED,
+    COLOR_MAGENTA,
+    COLOR_GREEN,
+    COLOR_CYAN,
+    COLOR_YELLOW,
+    COLOR_BROWN,
+    COLOR_BRRED,
+    COLOR_GRAY,
+    
+    COLOR_MAX,
+};
+
 #define LCD_COLOR   COLOR_WB
 #define LCD_WIDTH   128
 #define LCD_HEIGHT  64
@@ -57,19 +80,29 @@ enum {
     COLOR_RGBA,
 };
 
+typedef struct {
+    int         width;
+    int         height;
+    int         color;
+    int         rotate;
+
+    rt_device_t dev;
+    uint8_t     *buf;
+    int         buflen;
+}lcd_handle_t;
 
-void lcd_init(int width, int height, int color);
+void lcd_init(int width, int height, uint32_t color);
 void lcd_deinit(void);
 
 void lcd_rotate(int angle);
 int lcd_get_rotate(void);
 void lcd_set_backlight(int on);
-void lcd_fill(int color);
-void lcd_draw_line(int x1, int y1, int x2, int y2, int color);
-void lcd_draw_rect(int x1, int y1, int w, int h, int color);
-void lcd_fill_rect(int x1, int y1, int w, int h, int color);
+void lcd_fill(uint32_t color);
+void lcd_draw_line(int x1, int y1, int x2, int y2, uint32_t color);
+void lcd_draw_rect(int x1, int y1, int w, int h, uint32_t color);
+void lcd_fill_rect(int x1, int y1, int w, int h, uint32_t color);
 
-void lcd_draw_string(int x, int y, int width, int height, char *str, int font, int color, int bgcolor, int hori, int vert);
+void lcd_draw_string(int x, int y, int width, int height, char *str, int font, uint32_t color, uint32_t bgcolor, int hori, int vert);
 void lcd_refresh(void);
 #endif
 

+ 1 - 1
f407/applications/ui/menu.c

@@ -102,7 +102,7 @@ static int is_ph3_in(menu_handle_t *h)
     
     if ((p->prod.pwr_type == PDU_AC_I3O3 ||
          p->prod.pwr_type == PDU_AC_I3O1  ||
-         p->prod.pwr_type == PDU_AC_I3O3_H)) {
+         p->prod.pwr_type == PDU_AC_I3O1_H)) {
         return 1;
     }
     return 0;

+ 101 - 18
f407/applications/ui/st7789.c

@@ -374,20 +374,7 @@ rt_err_t spi_lcd_init(uint32_t freq)
 
     return res;
 }
-#if 0
-static void lcd_ops_set_pixel (const char *pixel, int x, int y)
-{
-}
-static void lcd_ops_get_pixel (char *pixel, int x, int y)
-{
-}
-static void lcd_ops_draw_hline(const char *pixel, int x1, int x2, int y)
-{
-}
-static void lcd_ops_draw_vline(const char *pixel, int x, int y1, int y2)
-{
-}
-#endif
+
 static void lcd_ops_blit_line(const char *pixel, int x, int y, rt_size_t size)
 {
     LCD_SetWindows(x, y, x + size, y);
@@ -401,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 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

+ 148 - 23
f407/applications/web.c

@@ -2,6 +2,8 @@
 #include "mongoose.h"
 #include "thread.h"
 #include "list.h"
+#include "power.h"
+#include "paras.h"
 #include "cfg.h"
 #include <stdio.h>
 #include "datadef.h"
@@ -33,8 +35,11 @@ typedef struct {
     mg_opts_t       opts;
 #endif
     
+    power_data_t    pdat;
     handle_t        list;
     char            rootDir[MG_PATH_MAX];
+    char            *buf;
+    int             buflen;
 }web_handle_t;
 static web_handle_t webHandle={0};
 
@@ -43,36 +48,147 @@ static void set_timer(struct mg_connection *c, int ms)
     mg_set_timer(c, mg_time()+ms/1000.0f);
 }
 
-static int ws_send(struct mg_connection *c, void *data, int len, int isbin)
+static int ws_send(web_handle_t *h, struct mg_connection *c, uint8_t type, void *data, int len, int isbin)
 {
-    pkt_hdr_t *h=(pkt_hdr_t*)malloc(len+sizeof(pkt_hdr_t));
-    if(!h) {
+    pkt_hdr_t *hdr=NULL;
+    
+    if(!h->buf) {
+        LOGE("____ h->buf is NULL\n");
         return -1;
     }
-    h->magic = PKT_MAGIC;
-    h->type  = PKT_TYPE_POWER_TOTAL;
-    h->nack  = 0;
-    h->dlen  = len;
-    memcpy(h->data, data, len);
-    mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, h, len+sizeof(pkt_hdr_t));
-    free(h);
+    if(h->buflen<sizeof(pkt_hdr_t)+len) {
+        h->buf = realloc(h->buf, sizeof(pkt_hdr_t)+len);
+        if(h->buf) {
+            h->buflen = sizeof(pkt_hdr_t)+len;
+        }
+        else {
+            h->buflen = 0;
+            LOGE("____ realloc failed\n");
+            return -1;
+        }
+    }
+    hdr = (pkt_hdr_t*)h->buf;
+    
+    hdr->magic = PKT_MAGIC;
+    hdr->type  = type;
+    hdr->nack  = 0;
+    hdr->dlen  = len;
+    memcpy(hdr->data, data, len);
+    mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, hdr, len+sizeof(pkt_hdr_t));
     return 0;
 }
-static int ws_handle(pkt_hdr_t *hdr)
+static void send_powerc(web_handle_t *h, struct mg_connection *c)
 {
+    int i,r;
+    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, struct mg_connection *c)
+{
+    int r=0;
+    
+    if(hdr->magic!=PKT_MAGIC) {
+        LOGE("___ magic: 0x%x is wrong!, correct is: 0x%x\n", hdr->magic, PKT_MAGIC);
+        return -1;
+    }
+    
+    LOGD("_____ ws handle, type: %d, flag: %d\n", hdr->type, hdr->flag);
     switch(hdr->type) {
         case PKT_TYPE_PARAS:
         {
-            
+            //setup
         }
         break;
         
         case PKT_TYPE_POWER_CH:
         {
+            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;
+                }
+            }
+            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:
+        {
+            //hdr->flag;
             
         }
         break;
         
+        case PKT_TYPE_POWER_RESET:
+        {
+            //r = power_reset_consump(addr);
+        }
+        break;
+        
+        case PKT_TYPE_SCAN:
+        {
+            //r = power_scan();
+        }
+        break;
+        
+        case PKT_TYPE_FACTORY:
+        {
+            //r = power_scan();
+        }
+        break;
+        
         case PKT_TYPE_SENSOR:
         {
             
@@ -85,6 +201,12 @@ static int ws_handle(pkt_hdr_t *hdr)
         }
         break;
         
+        case PKT_TYPE_FILE:
+        {
+            
+        }
+        break;
+        
     }
 }
 
@@ -109,19 +231,21 @@ static void http_fn(struct mg_connection *c, int ev, void *ev_data)
         mg_serve_http(c, (struct http_message *)ev_data, h->opts);
     }
     else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
-        set_timer(c, TIMER_INTERVAL);
+        paras_data_t *p=paras_get();
+        //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(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;
         r = list_take_node(h->list, &ln, 0);
         if(r==0) {
             node_t *n=&ln->data;
-            ws_send(c, n->buf, n->dlen, 1);
+            ws_send(h, c, n->tp, n->buf, n->dlen, 1);
             list_back_node(list_append, ln);
         }
     }
@@ -167,7 +291,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);
     
@@ -180,23 +304,24 @@ int web_init(void)
     list_cfg_t lc={0,0,10};
     web_handle_t *h=&webHandle;
     
+    memset(h, 0, sizeof(web_handle_t));
     h->list = list_init(&lc);
+    
+    h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)+32;
+    h->buf = (char*)malloc(h->buflen);
+    
     thread_start(THREAD_ID_WEB, web_thread, h);
     return 0;
 }
 
 
 
-int web_send(void *data, int len, int isbin)
+int web_post_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(c, data, len, isbin);
-    }
-    
-    return 0;
+    return list_append(h->list, type, data, len);
 }
 
 

+ 2 - 4
f407/applications/web.h

@@ -1,11 +1,9 @@
 #ifndef __WEB_Hx__
 #define __WEB_Hx__
 
-int web_init(void);
-int web_send(void *data, int len, int is_bin);
-
-
 
+int web_init(void);
+int web_post_bin(int type, void *data, int len);
 
 #endif
 

+ 46 - 33
f407/project/app/app.uvoptx

@@ -147,64 +147,77 @@
           <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint/>
+      <Breakpoint>
+        <Bp>
+          <Number>0</Number>
+          <Type>0</Type>
+          <LineNumber>373</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134503936</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>&lt;1&gt;..\..\rt-thread\libcpu\arm\cortex-m4\cpuport.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\app\../../rt-thread/libcpu/arm/cortex-m4/cpuport.c\373</Expression>
+        </Bp>
+        <Bp>
+          <Number>1</Number>
+          <Type>0</Type>
+          <LineNumber>229</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134218896</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>&lt;1&gt;..\..\rt-thread\libcpu\arm\cortex-m4\context_rvds.S</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\app\../../rt-thread/libcpu/arm/cortex-m4/context_rvds.S\229</Expression>
+        </Bp>
+      </Breakpoint>
       <WatchWindow1>
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>hinst-&gt;prot</ItemText>
+          <ItemText>h-&gt;pch[0]</ItemText>
         </Ww>
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>hinst</ItemText>
+          <ItemText>h-&gt;pch[1]</ItemText>
         </Ww>
         <Ww>
           <count>2</count>
           <WinNumber>1</WinNumber>
-          <ItemText>mh-&gt;hinst</ItemText>
+          <ItemText>h-&gt;pch[2]</ItemText>
         </Ww>
         <Ww>
           <count>3</count>
           <WinNumber>1</WinNumber>
-          <ItemText>((mb_handle_t*)pwrHandle.mb)-&gt;hinst-&gt;prot</ItemText>
+          <ItemText>tmp</ItemText>
         </Ww>
         <Ww>
           <count>4</count>
           <WinNumber>1</WinNumber>
-          <ItemText>h</ItemText>
+          <ItemText>len,0x0A</ItemText>
         </Ww>
         <Ww>
           <count>5</count>
           <WinNumber>1</WinNumber>
-          <ItemText>mh</ItemText>
-        </Ww>
-        <Ww>
-          <count>6</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>pwrHandle.mb</ItemText>
-        </Ww>
-        <Ww>
-          <count>7</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h-&gt;mb</ItemText>
-        </Ww>
-        <Ww>
-          <count>8</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h</ItemText>
-        </Ww>
-        <Ww>
-          <count>9</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>kv-&gt;key</ItemText>
+          <ItemText>h-&gt;buflen,0x0A</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
-          <SubType>8</SubType>
-          <ItemText>path_info.p</ItemText>
+          <SubType>2</SubType>
+          <ItemText>0x20013808</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -534,7 +547,7 @@
 
   <Group>
     <GroupName>applications/ui</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -662,7 +675,7 @@
 
   <Group>
     <GroupName>packages/mb</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -2822,7 +2835,7 @@
 
   <Group>
     <GroupName>drivers/drv</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -5174,7 +5187,7 @@
 
   <Group>
     <GroupName>rt-thread/comp/finsh</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</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);
     }

+ 128 - 87
f407/tools/web/data.js

@@ -1,12 +1,15 @@
 
-var PKT_TYPE=function(){
+const PKT_TYPE=function(){
     var len = 0;
     return {
         PKT_TYPE_ACK:len++,             
         PKT_TYPE_PARAS:len++,             
         PKT_TYPE_POWER_CH:len++,          //power_ch_t
         PKT_TYPE_POWER_TOTAL:len++,       //power_total_t
+        PKT_TYPE_POWER_RESET:len++,
         PKT_TYPE_CH_ALL:len++,
+        PKT_TYPE_SCAN:len++,
+        PKT_TYPE_FACTORY:len++,
         PKT_TYPE_ALARM:len++,
         PKT_TYPE_SENSOR:len++,
         PKT_TYPE_BREAKER:len++,
@@ -15,6 +18,17 @@ var PKT_TYPE=function(){
         PKT_TYPE_FILE:len++,
     }
 }();
+const SUB_TYPE=function(){
+    var len = 0;
+    return {
+        SUB_TYPE_POWER_SWITCH:len++,             
+        SUB_TYPE_POWER_ALARM:len++,             
+        SUB_TYPE_POWER_THRESHOLD:len++,          //power_ch_t
+        SUB_TYPE_POWER_START_DELAY:len++,       //power_total_t
+        SUB_TYPE_POWER_STOP_DELAY:len++,
+    }
+}();
+
 
 
 ///////////////////////////////////////////////////////
@@ -48,20 +62,60 @@ function array_cat(a1,a2){
     }
     return buffer;
 }
+function mk_hdr(type,flag)
+{
+    var tmp,length=0;
+    var buffer = new ArrayBuffer(13);
+
+    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,flag,true);     //flag
+    length += 4;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint32(0,0,true);    //dlen
+    length += 4;
+    
+    return buffer;
+}
 ///////////////////////////////////////////////////
 function bin_to_hdr(bin) {
     var tmp, length=0;
 
     tmp = new DataView(bin, length);
-    this.magic = tmp.getUint32(0,true);
-    length += 4;
+    this.magic = tmp.getUint16(0,true);
+    length += 2;
 
     tmp = new DataView(bin, length);
-    this.type = tmp.getUint32(0,true);
-    length += 4;
+    this.type = tmp.getUint8(0,true);
+    length += 1;
+    
+    tmp = new DataView(bin, length);
+    this.subtype = tmp.getUint8(0,true);
+    length += 1;
 
     tmp = new DataView(bin, length);
-    this.nack = tmp.getUint32(0,true);
+    this.nack = tmp.getUint8(0,true);
+    length += 1;
+    
+    tmp = new DataView(bin, length);
+    this.flag = tmp.getUint8(0,true);
     length += 4;
 
     tmp = new DataView(bin, length);
@@ -74,7 +128,7 @@ function bin_to_info(bin) {
     var tmp, length=0;
 
     tmp = new DataView(bin, length);
-    this.type = tmp.getInt8(0,true);
+    this.type = tmp.getUint8(0,true);
     length += 1;
 
     tmp = new DataView(bin, length);
@@ -90,16 +144,20 @@ function bin_to_info(bin) {
     length += 1;
     
     tmp = new DataView(bin, length);
-    this.pid = tmp.getUint8(0,true);
+    this.ph_id = tmp.getUint8(0,true);
     length += 1;
     
     tmp = new DataView(bin, length);
-    this.start_delay = tmp.getUint16(0,true);
-    length += 2;
+    this.ph_val = tmp.getUint8(0,true);
+    length += 1;
     
     tmp = new DataView(bin, length);
-    this.stop_delay = tmp.getUint16(0,true);
-    length += 2;
+    this.start_delay = tmp.getUint32(0,true);
+    length += 4;
+    
+    tmp = new DataView(bin, length);
+    this.stop_delay = tmp.getUint32(0,true);
+    length += 4;
 
     this.len = length;
 }
@@ -129,6 +187,22 @@ function bin_to_power(bin) {
     tmp = new DataView(bin, length);
     this.consump = tmp.getFloat32(0,true);
     length += 4;
+    
+    tmp = new DataView(bin, length);
+    this.factor = tmp.getFloat32(0,true);
+    length += 4;
+    
+    tmp = new DataView(bin, length);
+    this.active = tmp.getFloat32(0,true);
+    length += 4;
+    
+    tmp = new DataView(bin, length);
+    this.reactive = tmp.getFloat32(0,true);
+    length += 4;
+    
+    tmp = new DataView(bin, length);
+    this.ph_out = tmp.getUint8(0,true);
+    length += 1;
 
     tmp = new DataView(bin, length);
     this.status = tmp.getUint8(0,true);
@@ -271,10 +345,6 @@ function bin_to_total(bin) {
     tmp = new DataView(bin, length);
     this.reactive = tmp.getFloat32(0,true);
     length += 4;
-
-    tmp = new DataView(bin, length);
-    this.apparent = tmp.getFloat32(0,true);
-    length += 4;
     
     this.len = length;
 }
@@ -293,15 +363,6 @@ function bin_to_powert(bin) {
     
     this.len = length;
 }
-function bin_to_chall(bin) {
-    var tmp, length=0;
-
-    tmp = new DataView(bin, length);
-    var chall = tmp.getUint8(0,true);
-    length += 1;
-
-    return chall;
-}
 function bin_to_alarmd(bin) {
     var tmp, length=0;
     
@@ -324,15 +385,23 @@ function hdr_to_bin(js) {
     var buffer = new ArrayBuffer(js.len);
 
     tmp = new DataView(buffer, length);
-    tmp.setUint32(0,js.magic,true);
-    length += 4;
+    tmp.setUint16(0,js.magic,true);
+    length += 2;
 
     tmp = new DataView(buffer, length);
-    tmp.setUint32(0,js.type,true);
-    length += 4;
+    tmp.setUint8(0,js.type,true);
+    length += 1;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint8(0,js.subtype,true);
+    length += 1;
 
     tmp = new DataView(buffer, length);
-    tmp.setUint32(0,js.nack,true);
+    tmp.setUint8(0,js.nack,true);
+    length += 1;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint32(0,js.flag,true);
     length += 4;
     
     tmp = new DataView(buffer, length);
@@ -346,7 +415,7 @@ function info_to_bin(js) {
     var buffer = new ArrayBuffer(js.len);
 
     tmp = new DataView(buffer, length);
-    tmp.setInt8(0,js.type,true);
+    tmp.setUint8(0,js.type,true);
     length += 1;
 
     tmp = new DataView(buffer, length);
@@ -362,16 +431,20 @@ function info_to_bin(js) {
     length += 1;
 
     tmp = new DataView(buffer, length);
-    tmp.setUint8(0,js.pid,true);
+    tmp.setUint8(0,js.ph_id,true);
     length += 1;
     
     tmp = new DataView(buffer, length);
-    tmp.setUint16(0,js.start_delay,true);
-    length += 2;
+    tmp.setUint8(0,js.ph_val,true);
+    length += 1;
     
     tmp = new DataView(buffer, length);
-    tmp.setUint16(0,js.stop_delay,true);
-    length += 2;
+    tmp.setUint32(0,js.start_delay,true);
+    length += 4;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint32(0,js.stop_delay,true);
+    length += 4;
 
     return buffer;
 }
@@ -398,11 +471,23 @@ function power_to_bin(js) {
     tmp = new DataView(buffer, length);
     tmp.setFloat32(0,js.factor,true);
     length += 4;
-
+    
     tmp = new DataView(buffer, length);
     tmp.setFloat32(0,js.consump,true);
     length += 4;
 
+    tmp = new DataView(buffer, length);
+    tmp.setFloat32(0,js.active,true);
+    length += 4;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setFloat32(0,js.reactive,true);
+    length += 4;
+    
+    tmp = new DataView(buffer, length);
+    tmp.setUint8(0,js.ph_put,true);
+    length += 1;
+
     tmp = new DataView(buffer, length);
     tmp.setUint8(0,js.status,true);
     length += 1;
@@ -534,17 +619,16 @@ function total_to_bin(js) {
     tmp.setFloat32(0,js.consump,true);
     length += 4;
     
-    ///
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.active,true);
+    tmp.setFloat32(0,js.factor,true);
     length += 4;
     
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.reactive,true);
+    tmp.setFloat32(0,js.active,true);
     length += 4;
     
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.apparent,true);
+    tmp.setFloat32(0,js.reactive,true);
     length += 4;
 
     return buffer;
@@ -564,16 +648,6 @@ function powert_to_bin(js) {
 
     return bin;
 }
-function chall_to_bin(js) {
-    var tmp, length=0;
-    var bin = new ArrayBuffer(1);
-
-    tmp = new DataView(bin, length);
-    tmp.setUint8(0,js,true);
-    length += 1;
-
-    return bin;
-}
 function alarmd_to_bin(js) {
     var tmp, length=0;
     var bin,buffer = new ArrayBuffer(1);
@@ -606,13 +680,9 @@ XXX.hdr = function() {
             case PKT_TYPE.PKT_TYPE_POWER_TOTAL:
                 tmp = BIN.powert.j2b(js.powert);
                 break;
-                
-           case PKT_TYPE.PKT_TYPE_CH_ALL:
-                tmp = BIN.chall.j2b(js);
-                break;
                
            case PKT_TYPE.PKT_TYPE_ALARM:
-                tmp = BIN.alarm.j2b(js);
+                tmp = BIN.alarm.j2b(js.alarmd);
                 break;
                 
            default:
@@ -640,13 +710,9 @@ XXX.hdr = function() {
             case PKT_TYPE.PKT_TYPE_POWER_TOTAL:
                 hdr.powert = BIN.powert.b2j(data);
                 break;
-            
-            case PKT_TYPE.PKT_TYPE_CH_ALL:
-                hdr.chall = BIN.chall.b2j(data);
-                break;
                
            case PKT_TYPE.PKT_TYPE_ALARM:
-                hdr.alarm = BIN.alarm.b2j(data);
+                hdr.alarmd = BIN.alarmd.b2j(data);
                 break;
             
             default :
@@ -682,15 +748,6 @@ XXX.powert=function() {
         return new bin_to_powert(bin);
     }
 };
-XXX.chall=function() {
-    this.j2b = function (js) {
-        return new chall_to_bin(js);
-    }
-
-    this.b2j = function (bin) {
-        return new bin_to_chall(bin);
-    }
-};
 XXX.alarmd=function() {
     this.j2b = function (js) {
         return new alarmd_to_bin(js);
@@ -707,7 +764,6 @@ var BIN=new function() {
     this.paras = new XXX.paras();
     this.powerc = new XXX.powerc();
     this.powert = new XXX.powert();
-    this.chall = new XXX.chall();
     this.alarmd = new XXX.alarmd();
 }();
 
@@ -722,21 +778,6 @@ function LOG(){
 
 }
 
-var PKT_TYPE=function(){
-    var len = 0;
-    return {
-        PKT_TYPE_ACK:len++,             
-        PKT_TYPE_PARAS:len++,             
-        PKT_TYPE_POWER_CH:len++,          //power_ch_t
-        PKT_TYPE_POWER_TOTAL:len++,       //power_total_t
-        PKT_TYPE_SENSOR:len++,
-        PKT_TYPE_BREAKER:len++,
-        PKT_TYPE_STAT:len++,
-        PKT_TYPE_MESG:len++,
-        PKT_TYPE_FILE:len++,
-    }
-}();
-
 
 function WS(url,fn) {
     this.url = url;
@@ -752,7 +793,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;

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

@@ -12,6 +12,9 @@
     function on_ws_msg(bin){
         var j = BIN.hdr.b2j(bin);
         
+        j.chall = 1;
+        j.type = PKT_TYPE.PKT_TYPE_CH_ALL;
+        
         console.log(j);
         var b = BIN.hdr.j2b(j);
         
@@ -29,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);
 
     
     

+ 8 - 7
f407/tools/wsServer/mg.cpp

@@ -9,7 +9,7 @@
 #define PWR_TYPE PDU_AC_I3O3
 
 
-static const char *s_listen_on = "ws://localhost:8888";
+static const char *s_listen_on = "ws://localhost";
 static const char *s_web_root = ".";
 static void send_powerc(struct mg_connection* c);
 
@@ -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);
@@ -125,7 +125,7 @@ static void powerc_rand(power_ch_t* pc, uint8_t addr, uint8_t ch, uint8_t sch)
     pc->info.addr = addr;
     pc->info.ch = ch;
     pc->info.sch = sch;
-    pc->info.pid = 0;
+    pc->info.ph_id = 0;
     pc->info.start_delay = 0;
     pc->info.stop_delay = 0;
     
@@ -154,10 +154,11 @@ static void send_powerc(struct mg_connection *c)
     int i,j,ch=0;
     power_ch_t pc;
 #if 1
-    #define BOARD_CNT       5
-    #define BOARC_CH_CNT    5
+    #define BOARD_CNT       2
+    #define BOARC_CH_CNT    2
 
-    uint8_t addr[BOARD_CNT] = {2,4,6,7,8};
+    //uint8_t addr[BOARD_CNT] = {2,4,6,7,8};
+    uint8_t addr[BOARD_CNT] = { 2,4};
 #else
     #define BOARD_CNT       1
     #define BOARC_CH_CNT    1
@@ -215,7 +216,7 @@ int main(void) {
 
   srand((uint32_t)time(NULL));
   mg_mgr_init(&mgr);  // Initialise event manager
-  printf("ws server on %s/websocket\n", s_listen_on);
+  printf("ws server on %s/ws\n", s_listen_on);
   mg_timer_add(&mgr, 1000, MG_TIMER_REPEAT, timer_fn, &mgr);
   mg_http_listen(&mgr, s_listen_on, fn, NULL);  // Create HTTP listener
   for (;;) mg_mgr_poll(&mgr, 200);             // Infinite event loop

+ 9 - 4
pro/src/app.c

@@ -1549,6 +1549,9 @@ static void* sensor_thread(void* arg)
         lock_s_hold(LOCK_ID_SENSOR);
         list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
         {
+            _globalSensorInfo.val1 = 0.0f;
+            _globalSensorInfo.val2 = 0.0f;
+
             gettimeofday(&tv, &tz);
             t = localtime(&tv.tv_sec);
             sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
@@ -1677,7 +1680,7 @@ static void* sensor_thread(void* arg)
                 else {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = sdat.val[0];
-                    _globalSensorInfo.val2 = -1;
+                    _globalSensorInfo.val2 = 0.0f;
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 set_sensor_val_modbus(_globalDeviceManager,&_globalSensorInfo,_globalSensorMangerTemp->sensor_addr);
@@ -1695,18 +1698,20 @@ static void* sensor_thread(void* arg)
                 else {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = sdat.flag;
-                    _globalSensorInfo.val2 = -1;
+                    _globalSensorInfo.val2 = 0.0f;
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 //set_sensor_val_modbus(_globalDeviceManager,&_globalSensorInfo,_globalSensorMangerTemp->sensor_addr);
+
+                //printf("_______SENSOR_TYPE_LEAK: addr:%d, %d, %d, ____%f\n", _globalSensorMangerTemp->sensor_addr, ret, sdat.flag, sensor_info.val1);
                 if(_globalDeviceManager->_globalDevInfo.product.pwr_type == SmartPDU_AC ||
                             _globalDeviceManager->_globalDevInfo.product.pwr_type == SmartPDU_DC)
                 {
-                    _globalDeviceManager->single_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_1 = info->val;
+                    _globalDeviceManager->single_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_1 = _globalSensorInfo.val1;
                     _globalDeviceManager->single_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_2 = 0xFFFFFFFF;
                 }else
                 {
-                    _globalDeviceManager->triphasic_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_1 = info->val;
+                    _globalDeviceManager->triphasic_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_1 = _globalSensorInfo.val1;
                     _globalDeviceManager->triphasic_mmap->cas_sensor[_globalSensorMangerTemp->sensor_addr-1].s_2 = 0xFFFFFFFF;
                 }
             }

+ 2 - 2
pro/src/cascade_slave.c

@@ -189,8 +189,8 @@ int cascade_slave_init(void)
         modbus_three[TREE_R_SWITCH_STA      ].addr = &mgr->triphasic_mmap->chn_status;
         modbus_three[TREE_R_OPEN_DELAY      ].addr = &mgr->triphasic_mmap->open_delay;
         modbus_three[TREE_R_CLOSE_DELAY     ].addr = &mgr->triphasic_mmap->close_delay;
-        modbus_three[TREE_R_SENSOR         ].addr = &mgr->triphasic_mmap->cas_sensor;
-        modbus_three[TREE_R_DRY            ].addr = &mgr->triphasic_mmap->d_node;
+        modbus_three[TREE_R_SENSOR          ].addr = &mgr->triphasic_mmap->cas_sensor[0];
+        modbus_three[TREE_R_DRY             ].addr = &mgr->triphasic_mmap->d_node;
 
         modbus_three[TREE_W_OPEN_DELAY      ].addr = &mgr->triphasic_mmap->set_chn_open_delay;
         modbus_three[TREE_W_CLOSE_DELAY     ].addr = &mgr->triphasic_mmap->set_chn_close_delay;

+ 1 - 1
pro/src/sensor_handle.c

@@ -260,7 +260,7 @@ int sensor_get_data(int type, int subtype, int addr, int subaddr, sensor_dat_t *
         break;
     }
 
-    return r;
+    return 0;
 }