Selaa lähdekoodia

继续完善power/web接口

guohui 1 vuosi sitten
vanhempi
commit
fefd3dcdcb

+ 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
 

+ 24 - 17
f407/applications/datadef.h

@@ -40,7 +40,7 @@ enum {
     PDU_DC_I1O1,
     PDU_AC_I3O3=3,
     PDU_AC_I3O1,
-    PDU_AC_I3O3_H,
+    PDU_AC_I3O1_H,
 };
 
 enum {
@@ -275,14 +275,14 @@ 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相
     
-    uint16_t            start_delay;
-    uint16_t            stop_delay;
+    uint32_t            start_delay;
+    uint32_t            stop_delay;
 }info_t;
 typedef struct {
     info_t              info;
@@ -553,26 +553,33 @@ 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_CONSUMP_RESET,
+    SUB_TYPE_BOARD_SCAN,
+    
+    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  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/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;
         }

+ 132 - 47
f407/applications/power.c

@@ -1,5 +1,6 @@
 #include "mb.h"
 #include "cfg.h"
+#include "web.h"
 #include "lock.h"
 #include "list.h"
 #include "paras.h"
@@ -7,6 +8,9 @@
 #include "thread.h"
 #include "datadef.h"
 
+#define BRD_NUM   3 //BRD_MAX
+
+
 typedef struct {
     void*           mb;
     lock_t          lck;
@@ -22,6 +26,7 @@ typedef struct {
     board_key_t     key[BRD_MAX+1];
     power_total_t   ttl;
     
+    product_data_t *prod;
 }power_handle_t;
 power_handle_t pwrHandle={0};
 
@@ -47,25 +52,24 @@ static int write_reg(power_handle_t *h, uint8_t addr, uint16_t reg, uint16_t *da
 static int get_key(power_handle_t *h, uint8_t addr, board_key_t *key)
 {
     int i,r=-1;
-    uint16_t tmp=0;
+    uint16_t tmp[2];
     
-    r = read_reg(h, addr, POWER_DC_INFO, &tmp, 1);
+    r = read_reg(h, addr, POWER_DC_INFO, tmp, 2);
     if(r==0) {
-        key->type = (tmp>>8)&0xFF;
-        key->chs = tmp&0xFF;
+        key->type = (tmp[0]>>8)&0xFF;
+        key->chs = tmp[0]&0xFF;
         return 0;
     }
     
-    r = read_reg(h, addr, POWER_AC_GET_INFO, &tmp, 1);
+    r = read_reg(h, addr, POWER_AC_GET_INFO, tmp, 2);
     if(r==0) {
-        key->type = (tmp>>8)&0xFF;
-        key->chs = tmp&0xFF;
+        key->type = (tmp[0]>>8)&0xFF;
+        key->chs = tmp[0]&0xFF;
     }
     
     return r;
 }
 ////////////////////////////////////////////////////////////////
-
 static int set_kb_value(power_handle_t *h, int type, int addr, kb_val_t *kv)
 {
     switch(type) {
@@ -221,7 +225,7 @@ static int threshold_proc(board_data_t *pbrd)
     
     return 0;
 }
-static int board_query(power_handle_t *h)
+static board_data_t* board_query(power_handle_t *h)
 {
     int i,j,r=-1;
     uint16_t offset,tmp[144];
@@ -448,13 +452,14 @@ static int board_query(power_handle_t *h)
     }
     lock_d_release(h->lck);
     
-    return r;
+    return pbrd;
 }
 
 
 static void *power_thread(void *arg)
 {
     int r;
+    board_data_t *pbrd=NULL;
     thread_handle_t *th=(thread_handle_t*)arg;
     power_handle_t *h=(power_handle_t*)th->arg;;
     
@@ -467,8 +472,6 @@ static void *power_thread(void *arg)
 }
 
 
-
-
 int power_init(void)
 {
     power_handle_t *h=&pwrHandle;
@@ -494,7 +497,8 @@ int power_init(void)
         return -1;
     }
     h->cur_addr = 0;
-    h->brd_max = BRD_MAX;
+    h->brd_max = BRD_NUM;
+    h->prod = &paras_get()->prod;
     thread_start(THREAD_ID_POWER, power_thread, h);
     
     return 0;
@@ -561,7 +565,7 @@ int power_set(int ch, power_ch_t *pch)
 
 static int pch_map(power_handle_t *h, int chs)
 {
-    int i,j,r,idx=1;
+    int i,j,r,idx=0;
     board_data_t *pbrd=NULL;
     uint8_t pwr_type=paras_get()->prod.pwr_type;
     
@@ -580,14 +584,17 @@ static int pch_map(power_handle_t *h, int chs)
             } 
         }
     }
+    
+    return 0;
 }
+
 int power_scan(void)
 {
     int r,i,j,chs=0;
     int ch_idx=0,brd_idx=0;
-    board_key_t info;
     power_handle_t *h=&pwrHandle;
-    uint8_t pwr_type=paras_get()->prod.pwr_type;
+    board_key_t *pkey=NULL;
+    uint16_t times,nGroups=h->prod->ch_delay;
     
     power_clear();
     
@@ -595,37 +602,56 @@ int power_scan(void)
     h->cur_addr = 0;
     for(i=1; i<=h->brd_max; i++) {
         r = get_key(h, i, &h->key[i]);
-        LOGD("___ power_scan, addr: %d, result: %d\n", i, r);
+        if(r==0) {
+            LOGD("___ power_scan addr %d ok, type: %d, chs: %d\n", i, h->key[i].type, h->key[i].chs);
+        }
+        else {
+            LOGE("___ power_scan addr %d failed\n", i);
+        }
     }
     
-    for(i=0; i<h->brd_max; i++) {
-        if(h->key[i].chs>0) {
+    for(i=1; i<h->brd_max; i++) {
+        pkey = &h->key[i];
+        if(pkey->chs>0) {
             h->pbrd[i] = (board_data_t*)calloc(1, sizeof(board_data_t));
             if(h->pbrd[i]) {
-                h->pbrd[i]->type = info.type;
-                h->pbrd[i]->chs  = info.chs;
+                h->pbrd[i]->type = pkey->type;
+                h->pbrd[i]->chs  = pkey->chs;
                 h->pbrd[i]->addr = i;
                 h->pbrd[i]->ch0 = ch_idx;
-                h->pbrd[i]->pch = (power_ch_t*)calloc(1, sizeof(power_ch_t)*info.chs);
+                h->pbrd[i]->pch = (power_ch_t*)calloc(1, sizeof(power_ch_t)*pkey->chs);
                 if(h->pbrd[i]->pch) {
-                    for(j=0; j<info.chs; j++) {
+                    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.ch  = ch_idx;       //序号程序从0开始
-                        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;
                         
-                        if(info.type==TREE_AC_TYPE) {
-                            h->pbrd[i]->pch[j].info.pid = i;
-                            
+                        if(h->prod->pwr_type==PDU_AC_I3O3) {
+                            h->pbrd[i]->pch[j].info.ch  = ch_idx+j/3;       //序号程序从0开始
+                            h->pbrd[i]->pch[j].info.pid = j%3;
                         }
-                        h->pbrd[i]->pch[j].info.addr = i;
-                        ch_idx++;
+                        else {
+                            h->pbrd[i]->pch[j].info.ch  = ch_idx+j;         //序号程序从0开始
+                            h->pbrd[i]->pch[j].info.pid = 0;
+                        }
+                    }
+                    
+                    if(h->prod->pwr_type==PDU_AC_I3O3) {
+                        ch_idx += pkey->chs/3;
+                    }
+                    else {
+                        ch_idx += pkey->chs;
                     }
                 }
                 brd_idx++;
             }
-            chs += info.chs;
+            chs += pkey->chs;
         }
     }
+    pch_map(h, chs);
     lock_d_release(h->lck);
     
     return 0;
@@ -636,7 +662,7 @@ int power_clear(void)
 {
     int i,j;
     power_handle_t *h=&pwrHandle;
-  
+    
     lock_d_hold(h->lck);
     for(i=0; i<=h->brd_max; i++) {
         if(h->pbrd[i]) {
@@ -659,7 +685,7 @@ int power_clear(void)
 }
 
 
-int power_reset(int addr)
+int power_reset_consump(uint8_t addr)
 {
     int i,r=-1;
     uint16_t offset = 0;
@@ -754,7 +780,7 @@ int power_reset(int addr)
 }
 
 
-int power_set_ch(power_ch_t *pch)
+int power_set_sw(power_ch_t *pch)
 {
     int r;
     power_ch_t pc;
@@ -1047,26 +1073,47 @@ int power_set_threshold(power_ch_t *pch)
 int power_set_start_delay(power_ch_t *pch)
 {
     int r=-1;
-    uint16_t reg,offset;
+    uint16_t tmp[2],reg,offset;
     power_handle_t *h=&pwrHandle;
     
     switch(pch->info.type) {
         case AC_SINGLE_S_TYPE:
         case AC_SINGLE_B_TYPE:
         {
-            reg = POWER_AC_START_DELAY_TIME_L;
+            tmp[0] = pch->info.start_delay;
+            offset = POWER_AC_START_DELAY_TIME_L+pch->info.ch;
+            r = write_reg(h, pch->info.addr, offset, tmp, 1);
         }
         break;
 
         case DCPDU_TYPE:
         {
-            reg = POWER_DC_SET_START_DELAY;
+            uint32_t time=pch->info.start_delay/1000;
+            tmp[0] = time & 0xffff;
+            tmp[1] = (time >> 16) & 0xffff;
+            offset = POWER_DC_SET_START_DELAY+pch->info.ch;
+            r = write_reg(h, pch->info.addr, offset, tmp, 2);
         }
         break;
         
         case TREE_AC_TYPE:
         {
-            reg = POWER_AC3_START_DELAY_TIME;
+            uint32_t time=pch->info.start_delay/1000;
+            tmp[0] = time & 0xffff;
+            tmp[1] = (time >> 16) & 0xffff;
+            if(h->prod->pwr_type==PDU_AC_I3O3) {
+                offset = POWER_AC3_START_DELAY_TIME+pch->info.sch*3;
+                r = write_reg(h, pch->info.addr, offset+0, tmp, 2);
+                if(r) break;
+                r = write_reg(h, pch->info.addr, offset+1, tmp, 2);
+                if(r) break;
+                r = write_reg(h, pch->info.addr, offset+2, tmp, 2);
+                if(r) break;
+            }
+            else {
+                offset = POWER_AC3_START_DELAY_TIME+pch->info.sch;
+                r = write_reg(h, pch->info.addr, offset, tmp, 2);
+            }
         }
         break;
         
@@ -1077,34 +1124,51 @@ int power_set_start_delay(power_ch_t *pch)
         default:
         return -1;
     }
-    offset = reg+pch->info.ch;
-    r = write_reg(h, pch->info.addr, offset, &pch->info.start_delay, 1);
     
     return r;
 }
 int power_set_stop_delay(power_ch_t *pch)
 {
     int r=-1;
-    uint16_t reg,offset;
+    uint16_t tmp[2],reg,offset;
     power_handle_t *h=&pwrHandle;
     
     switch(pch->info.type) {
         case AC_SINGLE_S_TYPE:
         case AC_SINGLE_B_TYPE:
         {
-            reg = POWER_AC_STOP_DELAY_TIME_L;
+            tmp[0] = pch->info.start_delay;
+            offset = POWER_AC_STOP_DELAY_TIME_L+pch->info.ch;
+            r = write_reg(h, pch->info.addr, offset, tmp, 1);
         }
         break;
 
         case DCPDU_TYPE:
         {
-            reg = POWER_DC_SET_STOP_DELAY;
+            uint32_t time=pch->info.stop_delay/1000;
+            tmp[0] = time & 0xffff;
+            tmp[1] = (time >> 16) & 0xffff;
+            offset = POWER_DC_SET_STOP_DELAY+pch->info.ch;
+            //r = write_reg(h, pch->info.addr, offset, tmp, 2);
         }
         break;
         
         case TREE_AC_TYPE:
         {
-            reg = POWER_AC3_STOP_DELAY_TIME;
+            uint32_t time=pch->info.stop_delay/1000;
+            if(h->prod->pwr_type==PDU_AC_I3O3) {
+                offset = POWER_AC3_STOP_DELAY_TIME+pch->info.sch*3;
+                r = write_reg(h, pch->info.addr, offset+0, tmp, 2);
+                if(r) break;
+                r = write_reg(h, pch->info.addr, offset+1, tmp, 2);
+                if(r) break;
+                r = write_reg(h, pch->info.addr, offset+2, tmp, 2);
+                if(r) break;
+            }
+            else {
+                offset = POWER_AC3_START_DELAY_TIME+pch->info.sch;
+                r = write_reg(h, pch->info.addr, offset, tmp, 2);
+            }
         }
         break;
         
@@ -1115,14 +1179,35 @@ int power_set_stop_delay(power_ch_t *pch)
         default:
         return -1;
     }
-    offset = reg+pch->info.ch;
-    r = write_reg(h, pch->info.addr, offset, &pch->info.start_delay, 1);
     
     return r;
 }
 
 
-
+int power_data_clone(power_data_t *pd)
+{
+    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];
+            }
+        }
+    }
+    lock_d_release(h->lck);
+    
+    return 0;
+}
 
 
 

+ 11 - 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,15 @@ 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_consump(uint8_t addr);
 
 board_all_t * get_control_board();
+int power_data_clone(power_data_t *pd);
+
 #endif
 

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

+ 142 - 231
f407/applications/ui/st7789.c

@@ -1,25 +1,10 @@
-/*
- * 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
+#include "lcd.h"
+#include "log.h"
+
+
+#define COL_ADDR_SET            0x2A
+#define ROW_ADDR_SET            0x2B
+#define MEMORY_WRITE            0x2C
 /**
  * MADCTL(36H):
  * +---------------------------------------+
@@ -28,7 +13,7 @@
  * +---------------------------------------+
  * [3] 0=RGB,1=BGR
 */
-#define LCD_CMD_MEMORY_DATA_ACCESS_CTRL     0x36
+#define DATA_ACCESS             0x36
 /**
  * COLMOD(3AH):
  * +---------------------------------------+
@@ -44,265 +29,204 @@
  *      110=18bit/pixel
  *      111=16M truncated
 */
-#define LCD_CMD_INTERFACE_PIXEL_FORMAT      0x3A
+#define PIXEL_FORMAT            0x3A
 
 
-typedef struct
+static int lcd_hw_init(lcd_handle_t *h)
 {
-    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);
-}
+    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;
+    }
 
-static void LCD_WR_REG(uint8_t reg)
-{
-    LCD_DC_CLR;
-    rt_spi_send(lcd_dev, &reg, 1);
-    LCD_DC_SET;
+    return 0;
 }
 
-static void LCD_WR_DATA(uint8_t data)
+
+
+static void write_reg(lcd_handle_t *h, uint8_t reg)
 {
-    LCD_DC_SET;
-    rt_spi_send(lcd_dev, &data, 1);
+    LCD_DC_CLR;
+    rt_spi_send(h->dev, &reg, 1);
 }
-
-static void LCD_ReadData(uint8_t *data, uint16_t length)
+static void write_data(uint8_t data)
 {
     LCD_DC_SET;
-    rt_spi_transfer(lcd_dev, RT_NULL, &data, length);
+    rt_spi_send(h->dev, &data, 1);
 }
-
-static void LCD_WriteReg(uint8_t reg, uint16_t regdata)
+static void write_reg_data(lcd_handle_t *h, uint8_t reg, uint16_t data)
 {
-    LCD_WR_REG(reg);
-    LCD_WR_DATA(regdata);
+    write_reg(reg);
+    write_data(data);
 }
-
-static void LCD_WriteRAM_Prepare(void)
+static void read_data(lcd_handle_t *h, uint8_t *data, int length)
 {
-    LCD_WR_REG(LCD_CMD_MEMORY_WRITE);
+    LCD_DC_SET;
+    rt_spi_transfer(lcd_dev, RT_NULL, data, length);
 }
-
-static void LCD_WriteData_16Bit(uint16_t Data)
+static void write_16bit(lcd_handle_t *h, uint16_t data)
 {
     uint8_t buf[2];
+    
+    
+    buf[0] = data >> 8;
+    buf[1] = data & 0xff;
+    
     LCD_DC_SET;
-    buf[0] = Data >> 8;
-    buf[1] = Data & 0xff;
-    rt_spi_send(lcd_dev, buf, 2);
+    rt_spi_send(h->dev, buf, 2);
 }
 
-void LCD_direction(uint8_t direction)
+void st7789_rotate(lcd_handle_t *h, int rotate)
 {
-    switch (direction)
+    switch (rotate)
     {
-    case 0:
+        case rotate:
         lcddev.width = LCD_W;
         lcddev.height = LCD_H;
-        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (0 << 5) | (0 << 6) | (0 << 7)); /* BGR==0,MV==0,MX==0,MY==0 */
+        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (0 << 5) | (0 << 6) | (0 << 7)); /* BGR==0,MV==0,MX==0,MY==0 */
         break;
-    case 1:
+        
+        case 90:
         lcddev.width = LCD_H;
         lcddev.height = LCD_W;
-        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (1 << 5) | (1 << 6) | (0 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
+        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (1 << 5) | (1 << 6) | (0 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
         break;
-    case 2:
+        
+        case 180:
         lcddev.width = LCD_W;
         lcddev.height = LCD_H;
-        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (0 << 5) | (1 << 6) | (1 << 7)); /* BGR==0,MV==0,MX==1,MY==1 */
+        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (0 << 5) | (1 << 6) | (1 << 7)); /* BGR==0,MV==0,MX==1,MY==1 */
         break;
-    case 3:
+        
+        case 270:
         lcddev.width = LCD_H;
         lcddev.height = LCD_W;
-        LCD_WriteReg(LCD_CMD_MEMORY_DATA_ACCESS_CTRL, (0 << 3) | (1 << 5) | (0 << 6) | (1 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
+        LCD_WriteReg(DATA_ACCESS, (0 << 3) | (1 << 5) | (0 << 6) | (1 << 7)); /* BGR==0,MV==1,MX==0,MY==1 */
         break;
-    default:
+        
+        default:
         break;
     }
 }
 
-void LCD_SetWindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd)
+void st7789_set_win(lcd_handle_t *h, int x, int y, int w, int h)
 {
-    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();
+    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);
 }
 
-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 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)
+void st7789_refresh(lcd_handle_t *h, 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(lcd_dev, (uint8_t *)&frame_buf[y+i][x], w * 2);
+        rt_spi_send(h->dev, (uint8_t *)h->buf, 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 _st7789_init(void)
+static void reg_init(lcd_handle_t *h)
 {
-    LCD_WR_REG(LCD_CMD_MEMORY_DATA_ACCESS_CTRL);
-    LCD_WR_DATA(0x00);
+    write_reg(h, DATA_ACCESS);
+    write_data(h, 0x00);
 
-    LCD_WR_REG(LCD_CMD_INTERFACE_PIXEL_FORMAT);
-    LCD_WR_DATA(0X05); //03=RGB444,05=RGB565,06=RGB666
+    LCD_WR_REG(h, PIXEL_FORMAT);
+    LCD_WR_DATA(h, 0X05); //03=RGB444,05=RGB565,06=RGB666
 
-    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, 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(0xB7); //Gate Control
-    LCD_WR_DATA(0x46);
+    LCD_WR_REG(h, 0xB7); //Gate Control
+    LCD_WR_DATA(h, 0x46);
 
-    LCD_WR_REG(0xBB); //VCOM Setting
-    LCD_WR_DATA(0x1B);
+    LCD_WR_REG(h, 0xBB); //VCOM Setting
+    LCD_WR_DATA(h, 0x1B);
 
-    LCD_WR_REG(0xC0); //LCM Control
-    LCD_WR_DATA(0x2C);
+    LCD_WR_REG(h, 0xC0); //LCM Control
+    LCD_WR_DATA(h, 0x2C);
 
-    LCD_WR_REG(0xC2); //VDV and VRH Command Enable
-    LCD_WR_DATA(0x01);
+    LCD_WR_REG(h, 0xC2); //VDV and VRH Command Enable
+    LCD_WR_DATA(h, 0x01);
 
-    LCD_WR_REG(0xC3); //VRH set
-    LCD_WR_DATA(0x0F);
+    LCD_WR_REG(h, 0xC3); //VRH set
+    LCD_WR_DATA(h, 0x0F);
 
-    LCD_WR_REG(0xC4); //VDV set
-    LCD_WR_DATA(0x20);
+    LCD_WR_REG(h, 0xC4); //VDV set
+    LCD_WR_DATA(h, 0x20);
 
-    LCD_WR_REG(0xC6); //Frame Rate Control
-    LCD_WR_DATA(0x0F);
+    LCD_WR_REG(h, 0xC6); //Frame Rate Control
+    LCD_WR_DATA(h, 0x0F);
 
-    LCD_WR_REG(0xD0); //Power Control 1
-    LCD_WR_DATA(0xA4);
-    LCD_WR_DATA(0xA1);
+    LCD_WR_REG(h, 0xD0); //Power Control 1
+    LCD_WR_DATA(h, 0xA4);
+    LCD_WR_DATA(h, 0xA1);
 
-    LCD_WR_REG(0xD6);
+    LCD_WR_REG(h, 0xD6);
     LCD_WR_DATA(0xA1);
 
-    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
+    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
 }
 
 static void Lcd_pin_init(void)
@@ -374,20 +298,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);
@@ -402,7 +313,7 @@ struct rt_device_graphic_ops lcd_graphic_ops =
     .blit_line  = lcd_ops_blit_line ,
 };
 
-static int lcd_dev_init(void)
+static int st7789_dev_init(void)
 {
     #ifdef RT_USING_DEVICE_OPS
     lcddev.parent.ops = &lcd_dev_ops;

+ 130 - 15
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,33 +48,120 @@ 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);
+    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, h, len+sizeof(pkt_hdr_t));
     free(h);
     return 0;
 }
-static int ws_handle(pkt_hdr_t *hdr)
+static int send_power(web_handle_t *h, struct mg_connection *c)
 {
+    int i,r;
+    
+    r = power_data_clone(&h->pdat);
+    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);
+        }
+        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)
+{
+    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;
+    }
+    
     switch(hdr->type) {
         case PKT_TYPE_PARAS:
         {
-            
+            //setup
         }
         break;
         
         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);
+                }
+                break;
+                
+                case SUB_TYPE_POWER_STOP_DELAY:
+                {
+                    r = power_set_stop_delay(pch);
+                }
+                break;
+            }
+        }
+        break;
+        
+        case PKT_TYPE_CH_ALL:
+        {
+            power_ch_t *pch=(power_ch_t*)hdr->data;
+            switch(hdr->subtype) {
+                case SUB_TYPE_CONSUMP_RESET:
+                {
+                    //r = power_reset_consump(addr);
+                }
+                break;
+                
+                case SUB_TYPE_BOARD_SCAN:
+                {
+                    r = power_scan();
+                }
+                break;
+            }
         }
         break;
         
@@ -85,6 +177,12 @@ static int ws_handle(pkt_hdr_t *hdr)
         }
         break;
         
+        case PKT_TYPE_FILE:
+        {
+            
+        }
+        break;
+        
     }
 }
 
@@ -109,19 +207,22 @@ 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) {
+        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);
+        ws_handle(h, pkt);
     }
     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);
         }
     }
@@ -180,24 +281,38 @@ 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_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(c, data, len, isbin);
+        ws_send(h, c, type, data, len, 1);
     }
     
     return 0;
 }
 
 
+int web_post_bin(int type, void *data, int len)
+{
+    struct mg_connection *c;
+    web_handle_t *h=&webHandle;
+    
+    return list_append(h->list, type, data, len);
+}
+
+
 

+ 3 - 4
f407/applications/web.h

@@ -1,11 +1,10 @@
 #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);
+int web_send_bin(int type, void *data, int len);
 
 #endif
 

+ 54 - 39
f407/project/app/app.uvoptx

@@ -120,6 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
+          <Name>d</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -147,57 +148,71 @@
           <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>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>
       <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>
-        </Ww>
-        <Ww>
-          <count>3</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>((mb_handle_t*)pwrHandle.mb)-&gt;hinst-&gt;prot</ItemText>
-        </Ww>
-        <Ww>
-          <count>4</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>h</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;pch[2]</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>

+ 47 - 41
f407/tools/web/data.js

@@ -1,5 +1,5 @@
 
-var PKT_TYPE=function(){
+const PKT_TYPE=function(){
     var len = 0;
     return {
         PKT_TYPE_ACK:len++,             
@@ -15,6 +15,19 @@ 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++,
+        SUB_TYPE_POWER_RESET_CONSUMP:len++,
+        SUB_TYPE_POWER_SCAN:len++,
+    }
+}();
+
 
 
 ///////////////////////////////////////////////////////
@@ -53,16 +66,20 @@ 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);
-    length += 4;
+    this.nack = tmp.getUint8(0,true);
+    length += 1;
 
     tmp = new DataView(bin, length);
     this.dlen = tmp.getUint32(0,true);
@@ -74,7 +91,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);
@@ -94,12 +111,12 @@ function bin_to_info(bin) {
     length += 1;
     
     tmp = new DataView(bin, length);
-    this.start_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.getUint16(0,true);
-    length += 2;
+    this.stop_delay = tmp.getUint32(0,true);
+    length += 4;
 
     this.len = length;
 }
@@ -324,16 +341,20 @@ 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);
-    length += 4;
+    tmp.setUint8(0,js.nack,true);
+    length += 1;
     
     tmp = new DataView(buffer, length);
     tmp.setUint32(0,js.dlen,true);
@@ -346,7 +367,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);
@@ -366,12 +387,12 @@ function info_to_bin(js) {
     length += 1;
     
     tmp = new DataView(buffer, length);
-    tmp.setUint16(0,js.start_delay,true);
-    length += 2;
+    tmp.setUint32(0,js.start_delay,true);
+    length += 4;
     
     tmp = new DataView(buffer, length);
-    tmp.setUint16(0,js.stop_delay,true);
-    length += 2;
+    tmp.setUint32(0,js.stop_delay,true);
+    length += 4;
 
     return buffer;
 }
@@ -608,11 +629,11 @@ XXX.hdr = function() {
                 break;
                 
            case PKT_TYPE.PKT_TYPE_CH_ALL:
-                tmp = BIN.chall.j2b(js);
+                tmp = BIN.chall.j2b(js.chall);
                 break;
                
            case PKT_TYPE.PKT_TYPE_ALARM:
-                tmp = BIN.alarm.j2b(js);
+                tmp = BIN.alarm.j2b(js.alarmd);
                 break;
                 
            default:
@@ -646,7 +667,7 @@ XXX.hdr = function() {
                 break;
                
            case PKT_TYPE.PKT_TYPE_ALARM:
-                hdr.alarm = BIN.alarm.b2j(data);
+                hdr.alarmd = BIN.alarmd.b2j(data);
                 break;
             
             default :
@@ -722,21 +743,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;

+ 3 - 0
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);
         

+ 4 - 3
f407/tools/wsServer/mg.cpp

@@ -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