Kaynağa Gözat

添加sensor/breaker/snmp

guohui 1 yıl önce
ebeveyn
işleme
76dd82142f

+ 0 - 1
f407/applications/board.c

@@ -16,7 +16,6 @@
 struct rt_memheap sram2_heap;
 void rt_hw_board_init()
 {
-    
     extern void hw_board_init(char *clock_src, int32_t clock_src_freq, int32_t clock_target_freq);
 
     /* Heap initialization */

+ 81 - 0
f407/applications/breaker.c

@@ -0,0 +1,81 @@
+#include "mb.h"
+#include "lock.h"
+#include "breaker.h"
+
+
+typedef struct {
+    lock_t        lck;
+    modbus_data_t *mb;
+    
+    breaker_all_t all;
+}breaker_handle_t;
+static breaker_handle_t brHandle={0};
+
+int breaker_init(void)
+{
+    breaker_handle_t *h=&brHandle;
+    
+    h->lck = lock_init();
+    
+    return 0;
+}
+
+int breaker_deinit(void)
+{
+    breaker_handle_t *h=&brHandle;
+    
+    lock_deinit(h->lck);
+    
+    return 0;
+}
+
+int breaker_add(breaker_data_t *data)
+{
+    breaker_handle_t *h=&brHandle;
+    
+    if(!data) {
+        return -1;
+    }
+    lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+int breaker_remove(breaker_data_t *data)
+{
+    breaker_handle_t *h=&brHandle;
+    
+    if(!data) {
+        return -1;
+    }
+    
+    lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+int breaker_query(breaker_data_t *data)
+{
+    breaker_handle_t *h=&brHandle;
+    
+    lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+breaker_all_t* breaker_data_get(void)
+{
+    breaker_handle_t *h=&brHandle;
+    return &h->all;
+}
+
+

+ 14 - 0
f407/applications/breaker.h

@@ -0,0 +1,14 @@
+#ifndef __BREAKER_Hx__
+#define __BREAKER_Hx__
+
+#include "datadef.h"
+
+int breaker_init(void);
+int breaker_deinit(void);
+int breaker_add(breaker_data_t *data);
+int breaker_remove(breaker_data_t *data);
+int breaker_query(breaker_data_t *data);
+breaker_all_t* breaker_data_get(void);
+
+#endif
+

+ 90 - 90
f407/applications/cascade.c

@@ -44,9 +44,9 @@ typedef struct cascade_info{
 	uint8_t         quit;
 	slave_info_t			*info;
 	lock_t 					lock;
-	mb_handle_t*           mb;
 	slave_t         slaves[CASCADE_MAX+1];
 	cmd_data_t    cmd;
+    power_all_t   all;
 //	union {
 //		md_ac_dc_t ac_dc;
 //		md_3_ac_t  ac_3; 
@@ -122,7 +122,7 @@ static uint8_t master_scan(cascade_handle_t *cas)
 		//scan
 		uint16_t value = 0;
 		lock_on(cas->lock);
-		int r = mb_read(cas->mb,slave_addr,CASCADE_REG_SCAN,&value,1,300);
+		int r = mb_read(MB_ID_CASCADE,slave_addr,CASCADE_REG_SCAN,&value,1,300);
 		lock_off(cas->lock);
 		if(r > 0)
 		{
@@ -139,9 +139,9 @@ static uint8_t master_scan(cascade_handle_t *cas)
 static int slave_get_info(cascade_handle_t *cas)
 {
 	slave_info_t *info=cas->info;
-	power_data_t power = power_data_get();
+	power_all_t *p = power_data_get();
 
-	info->channels = power.chs-1 > 0 ? power.chs-1 :  power.chs;
+	info->channels = p->chs-1 > 0 ? p->chs-1 :  p->chs;
 
 	if(info->channels  > SLAVE_CH_MAX)
 			info->channels = SLAVE_CH_MAX;
@@ -149,7 +149,7 @@ static int slave_get_info(cascade_handle_t *cas)
 			return -1;
 	for(int i=0; i < info->channels;i++)
 	{
-		info->ch[i] = power.pch[i+1];
+		info->ch[i] = p->pch[i+1];
 	}
 	LOGD("slave will send %d channels to master!!!!\n",info->channels);
 	return 0;
@@ -183,9 +183,8 @@ static void *my_memcpy_byte(void *dst, const void *src, int n)
 static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 {
 	cmd_data_t *cmd=NULL;
-	mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
 	pthread_t id = 0;
-	power_data_t power = power_data_get();
+	power_all_t *power = power_data_get();
 	switch (reg)
 	{
 		case CASCADE_REG_SCAN:
@@ -249,7 +248,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 				{
 					LOGD("____read_____  %d,sendlen = %d size=%d\n",lenth,sendlen,sizeof(power_ch_t)*4);
 					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
-					uint8_t * base_addr = (uint8_t *)&power.pch[1];
+					uint8_t * base_addr = (uint8_t *)&power->pch[1];
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 					
@@ -258,9 +257,9 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 				case CASCADE_CMD_QUERY_CH:
 				{
 					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
-					//power_data_t power = power_data_get();
-					uint8_t * base_addr = (uint8_t *)&power.pch[1];
-					//my_memcpy_byte(r_w_data,&power.pch[1]+sendlen,lenth*2);
+					//power_all_t power = power_data_get();
+					uint8_t * base_addr = (uint8_t *)&power->pch[1];
+					//my_memcpy_byte(r_w_data,&power->pch[1]+sendlen,lenth*2);
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 				}
@@ -311,7 +310,7 @@ static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
 			memcpy(buff, d->data+wlen, xlen);
 			//交换数据
 			memswap(buff,xlen%2+xlen);
-			wl = mb_write(cas->mb, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
+			wl = mb_write(MB_ID_CASCADE, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
 			if(wl<=0) {
 				LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i+1);
 				if(addr >0 && addr < SLAVE_CH_MAX)
@@ -361,7 +360,7 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
 					 xlen = oncelen;
 				}
 				xlen += xlen%2;
-				rl = mb_read(cas->mb, addr, CASCADE_REG_READ, buff, xlen/2,100);
+				rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,100);
 				if(rl<=0) {
 					LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, i+1);
 					if(addr >0 && addr < SLAVE_CH_MAX)
@@ -472,7 +471,7 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 //            rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*SLAVE_CH_MAX;
 //            rdata.data = (uint8_t*)cas->info;
 						uint16_t value = 0;
-						r = mb_read(cas->mb,cur_dev_addr,4000,&value,1,100);//获取通道数
+						r = mb_read(MB_ID_CASCADE,cur_dev_addr,4000,&value,1,100);//获取通道数
             //r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
 						LOGD("r = %d  value=%d\n",r,value);
             if(r == 1)
@@ -536,15 +535,15 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 
 
 
-uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
+uint8_t cascade_init(uint8_t mode,uint8_t addr,uint32_t baud)
 {	
 	mb_para_t para;
 	para.type = MB_TYPE_RTU;
-	para.para.rtu.dev = (char *)uart;
+	para.para.rtu.dev = CASCADE_PORT;
 	para.para.rtu.baudrate = baud;
 	para.para.rtu.parity = 0;
 	para.para.rtu.pin = -1;
-  para.para.rtu.lvl = 0;
+	para.para.rtu.lvl = 0;
 	para.para.rtu.baudrate = baud;
 	memset(&slave_info,0,sizeof(slave_info));
 	
@@ -556,20 +555,18 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
 		para.mode = MB_MODE_SLAVE;
 		slave_info.saddr = addr;
 	}
+    mb_setup(MB_ID_CASCADE, &para);
+    
 	slave_info.bund = baud;
 	slave_info.md_type = para.mode;
-  slave_info.lock = lock_init();
-	slave_info.mb = mb_init(&para);
-  if(!slave_info.mb) {
-      return -1;
-  }
+	slave_info.lock = lock_init();
+
 	if(para.mode == MB_MODE_SLAVE)
 	{
-		mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
-		mb_set_slave(slave_info.mb->hinst,slave_info.saddr);
-		mb_set_cb_table(slave_info.mb->hinst,&mb_table);
+		mb_set_addr(MB_ID_CASCADE,slave_info.saddr);
+		mb_set_cb(MB_ID_CASCADE, &mb_table);
 		func.slave_func = slave_func;
-		mb_set_cb_cascade(slave_info.mb->hinst,&func);
+		mb_set_cascade_cb(MB_ID_CASCADE,&func);
 		slave_info.north = (north_data_t *)malloc(sizeof(north_data_t));
 		if(slave_info.north == NULL)
 		{
@@ -592,7 +589,7 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
 	if(para.mode == MB_MODE_MASTER)
 		slave_info.read_addr = 1;
 	
-	LOGD("uart: %s mode: %d addr: %d bound: %d\n",uart,slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
+	LOGD("mode: %d addr: %d bound: %d\n",slave_info.md_type,slave_info.saddr,para.para.rtu.baudrate);
 	LOGD("scan thread!!!\n");
 	thread_start(THREAD_ID_CAS_SCAN,cascade_scan_thread,NULL);
 	sleep(1);
@@ -605,9 +602,7 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud)
 
 uint8_t cascade_deinit()
 {
-    mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
     lock_deinit(slave_info.lock);
-    mb_deinit(slave_info.mb);
 		if(slave_info.north)
 		{
 			free(slave_info.north);
@@ -624,7 +619,6 @@ uint8_t cascade_deinit()
 
 void cascade_scan_thread(void *arg)
 {
-	mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
 	while(slave_info.quit == 0)
 	{
 		if(slave_info.md_type == MB_MODE_MASTER)
@@ -634,29 +628,29 @@ void cascade_scan_thread(void *arg)
 		}else	//做从机//拷贝数据到北向
 		{
 			paras_data_t* p_data = paras_get();
-			power_data_t power = power_data_get();
+			power_all_t *power = power_data_get();
 			
 			if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
 			{
-				int channels = power.chs > 0 ? power.chs - 1: 0;
+				int channels = power->chs > 0 ? power->chs - 1: 0;
 				slave_info.north->data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
-				int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				int cnt = power->chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
 				//电量信息
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.power[i].voltage 	= power.pch[i].power[0].voltage *1000;
-					slave_info.north->data.ac_dc.power[i].current 	= power.pch[i].power[0].current *1000;
-					slave_info.north->data.ac_dc.power[i].power 		= power.pch[i].power[0].power *1000;
-					slave_info.north->data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
-					slave_info.north->data.ac_dc.power[i].factor 	= power.pch[i].power[0].factor *1000;
-					slave_info.north->data.ac_dc.power[i].freq 		= power.pch[i].power[0].freq *1000;
+					slave_info.north->data.ac_dc.power[i].voltage 	= power->pch[i].power[0].voltage *1000;
+					slave_info.north->data.ac_dc.power[i].current 	= power->pch[i].power[0].current *1000;
+					slave_info.north->data.ac_dc.power[i].power 	= power->pch[i].power[0].power *1000;
+					slave_info.north->data.ac_dc.power[i].consumer  = power->pch[i].power[0].consump *1000;
+					slave_info.north->data.ac_dc.power[i].factor 	= power->pch[i].power[0].factor *1000;
+					slave_info.north->data.ac_dc.power[i].freq 		= power->pch[i].power[0].freq *1000;
 				}
 				//总信息
 				//slave_info.north->data.ac_dc.power_all. = power.ttl.total;
-				slave_info.north->data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
-				slave_info.north->data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
-				slave_info.north->data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
-				slave_info.north->data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
+				slave_info.north->data.ac_dc.power_all.all_consumer = power->ttl.total[0].consump *1000;
+				slave_info.north->data.ac_dc.power_all.all_current  = power->ttl.total[0].current *1000;
+				slave_info.north->data.ac_dc.power_all.all_power    = power->ttl.total[0].power *1000;
+				slave_info.north->data.ac_dc.power_all.all_voltage  = power->ttl.total[0].voltage *1000;
 				//温湿度
 				slave_info.north->data.ac_dc.temp = 0;				//后续加上传感器数据
 				slave_info.north->data.ac_dc.humity = 0;
@@ -664,24 +658,24 @@ void cascade_scan_thread(void *arg)
 					slave_info.north->data.ac_dc.switch_stu[i] = 0;
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
+					slave_info.north->data.ac_dc.delay_open[i] = power->pch[i].info.start_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
+					slave_info.north->data.ac_dc.delay_close[i] = power->pch[i].info.stop_delay;
 				}
 			}else
 			{
-				int channels = power.chs > 0 ? power.chs - 1: 0;
+				int channels = power->chs > 0 ? power->chs - 1: 0;
 				slave_info.north->data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
 				for(int i = A_P; i <= C_P;i++)
 				{
-					slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
-					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].consumer = power->ttl.total[i].consump *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].current  = power->ttl.total[i].current *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].power    = power->ttl.total[i].power *1000;
+					slave_info.north->data.ac_3.ac_3_all_pw[i].voltage  = power->ttl.total[i].voltage *1000;
 				}
-				int cnt = power.chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
+				int cnt = power->chs > SLAVE_CH_MAX ? SLAVE_CH_MAX : channels;
 				for(int i = 0; i < cnt;i++)
 				{
 
@@ -691,20 +685,20 @@ void cascade_scan_thread(void *arg)
 				{
 					for(int j = A_P; j <= C_P;j++)
 					{
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power.pch[i].power[j].consump * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current = power.pch[i].power[j].current * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power = power.pch[i].power[j].power * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage = power.pch[i].power[j].voltage * 1000;
-						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status = power.pch[i].power[j].status;		
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_consumer = power->pch[i].power[j].consump * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_current  = power->pch[i].power[j].current * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_power    = power->pch[i].power[j].power * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_voltage  = power->pch[i].power[j].voltage * 1000;
+						slave_info.north->data.ac_3.ac_3_chn_p[i][j].p_status   = power->pch[i].power[j].status;		
 					}
 				}	
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_open[i] = power.pch[i].info.start_delay;
+					slave_info.north->data.ac_3.delay_open[i] = power->pch[i].info.start_delay;
 				}
 				for(int i = 0; i < cnt;i++)
 				{
-					slave_info.north->data.ac_3.delay_close[i] = power.pch[i].info.stop_delay;
+					slave_info.north->data.ac_3.delay_close[i] = power->pch[i].info.stop_delay;
 				}
 				
 			}
@@ -718,23 +712,21 @@ void cascade_scan_thread(void *arg)
 
 void cascade_thread(void *arg)
 {
-    mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
     LOGD("__ cascade %s\n", (slave_info.md_type==MODBUS_MASTER)?"master":"slave");
- 
-		while(slave_info.quit==0) {
+    while(slave_info.quit==0) {
         if(slave_info.md_type==MODBUS_MASTER) {      //主模
-						cmd_data_t cmd;
-						cmd.cmd = CASCADE_CMD_GET_INFO;
-						cmd.obj = OBJ_OVERALL;
-						slave_info.cmd = cmd;
-            master_cmd(&slave_info,slave_info.read_addr,&cmd); ;
-					sleep(1);
+            cmd_data_t cmd;
+            cmd.cmd = CASCADE_CMD_GET_INFO;
+            cmd.obj = OBJ_OVERALL;
+            slave_info.cmd = cmd;
+            master_cmd(&slave_info,slave_info.read_addr,&cmd);
+            sleep(1);
         }
         else {                                  //从模式,等待主设备发起数据请求
-					mb_slave_fsm(slave_info.mb->hinst);
+            mb_slave_poll(MB_ID_CASCADE);
         }  
     }
-    
+
     pthread_exit(NULL);
 }
 
@@ -794,7 +786,7 @@ int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成
 
 int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
 {
-  power_data_t power = power_data_get();
+    //power_all_t *power = power_data_get();
 	
 	if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
 	{
@@ -827,43 +819,38 @@ uint8_t cascade_set_mode(uint8_t mode,uint8_t addr)
 	{
 		slave_info.md_type = MODBUS_MASTER;
 		slave_info.saddr = 0;
-		mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
-		mb_set_slave(slave_info.mb->hinst,0);
+		mb_set_addr(MB_ID_CASCADE,0);
 	}else
 	{
 		slave_info.md_type =MODBUS_SLAVE;
-		mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
 		slave_info.saddr = addr;
-		mb_set_slave(slave_info.mb->hinst,addr);
+		mb_set_addr(MB_ID_CASCADE,addr);
 	}
 }
 
 void cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud)
 {
-		if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= SLAVE_CH_MAX)
-		{
-			return;
-		}
-		mb_handle_t *handle=(mb_handle_t *)(&slave_info.mb);
+    if(mode != MODBUS_MASTER || mode !=MODBUS_SLAVE || addr >= SLAVE_CH_MAX)
+    {
+        return;
+    }
 
-		slave_info.quit = 1;
-		sleep(1);
-		cascade_deinit();
-		cascade_init(CASCADE_PORT,mode,addr,baud);
+    slave_info.quit = 1;
+    sleep(1);
+    cascade_deinit();
+    cascade_init(mode,addr,baud);
 }
 
-power_data_t cascade_power_get(void)
+power_all_t* cascade_power_get(void)
 {
-    power_data_t cas_d = {0};
-    cas_d.chs = slave_info.info->channels;
-    cas_d.pch = &slave_info.info->ch[0];
-    return cas_d;
+    slave_info.all.chs = slave_info.info->channels;
+    slave_info.all.pch = &slave_info.info->ch[0];
+    return &slave_info.all;
 }
 int cascade_get_dlist(dev_list_t *dl)
 {
-	  int i,cnt=0;
+    int i,cnt=0;
     slave_t *sl=NULL;
-    
 
     if(!dl) {
         return -1;
@@ -893,3 +880,16 @@ int cascade_free_dlist(dev_list_t *dl)
     return 0;
 }
 
+
+int cascade_lock(int flag)
+{
+    cascade_handle_t *h=&slave_info;
+    
+    if(flag) {
+        lock_on(h->lock);
+    }
+    else {
+        lock_off(h->lock);
+    }
+    return 0;
+}

+ 3 - 2
f407/applications/cascade.h

@@ -107,7 +107,7 @@ enum {
 };
 
 
-uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint32_t baud);
+uint8_t cascade_init(uint8_t mode,uint8_t addr,uint32_t baud);
 uint8_t cascade_deinit();
 void    cascade_scan_thread(void *arg);
 void    cascade_thread(void *arg);
@@ -117,6 +117,7 @@ uint8_t cascade_set_mode(uint8_t mode,uint8_t addr);
 void    cascade_reinit(uint8_t mode,uint8_t addr,uint32_t baud);
 int     cascade_get_dlist(dev_list_t *dl);
 int     cascade_free_dlist(dev_list_t *dl);
-power_data_t cascade_power_get(void);
+power_all_t* cascade_power_get(void);
+int cascade_lock(int flag);
 
 #endif

+ 49 - 14
f407/applications/datadef.h

@@ -9,6 +9,7 @@
 #define BRD_MAX         32
 #define SLAVE_CH_MAX    32
 #define CASCADE_MAX     32
+#define BRK_MAX         8
 
 enum {
     RW_READ=0,                                 //读
@@ -355,17 +356,48 @@ typedef struct {
 }power_total_t;
 
 typedef struct {
-    uint8_t         chs;                    //所有控制板的总通道数
-    power_ch_t      *pch;
-    power_total_t   ttl;
-}power_data_t;
-
+    uint8_t             chs;                    //所有控制板的总通道数
+    power_ch_t          *pch;
+    power_total_t       ttl;
+}power_all_t;
 
 typedef struct {
     uint8_t             type;
-    float               data;
-    uint8_t             time;
+    uint8_t             subtype;
+    uint8_t             addr;
+    uint8_t             subaddr;
+}sensor_info_t;
+typedef union {
+    char                name[32];
+    uint32_t            flag;
+    float               val[2];
+    uint32_t            time;
+}sensor_samp_t;
+typedef struct {
+    sensor_info_t       info;
+    sensor_samp_t       samp;
 }sensor_data_t;
+typedef struct {
+    uint8_t             cnt;
+    sensor_data_t       *pss;
+}sensor_all_t;
+
+typedef struct {
+    char                name[32];
+    uint8_t             addr;
+}breaker_info_t;
+typedef struct {
+    uint8_t             num;                    //
+    uint8_t             nid;                    //node id
+    uint8_t             sw;
+    uint8_t             ch[BRK_MAX];
+    uint32_t            time;
+}breaker_data_t;
+typedef struct {
+    uint8_t             cnt;
+    breaker_data_t      *pbr;
+}breaker_all_t;
+
 
 typedef struct {
     uint8_t             type;
@@ -393,13 +425,6 @@ typedef struct cascade_saddr{
 }slave_info_t;
 
 
-
-typedef struct sensor_info{
-    uint8_t     type;
-    float       v[2];
-}sensor_info_t;
-
-
 //////////////////////////////
 typedef struct 
 {
@@ -576,6 +601,7 @@ typedef struct {
     uint8_t             addr[CASCADE_MAX];
 }slave_list_t;
 
+
 enum {
     PKT_TYPE_ACK=0,             
     PKT_TYPE_PARAS,             
@@ -631,5 +657,14 @@ typedef struct {
 #define INI_NAME        "smartPDU.ini"
 #define INF_NAME        "PDUInfo.txt"
 
+#define CONCAT(a,b)     a b
+
+#define SD_DEV          "sd"
+#define NOR_DEV         "nor"
+
+#define ROOT_PATH       "/"
+#define SD_PATH         CONCAT(ROOT_PATH,SD_DEV)
+#define NOR_PATH        CONCAT(ROOT_PATH,NOR_DEV)
+
 #endif
 

+ 25 - 5
f407/applications/fs.c

@@ -4,6 +4,8 @@
 #include <rtdevice.h>
 #include <rtthread.h>
 #include <dfs_posix.h>
+#include "datadef.h"
+#include "fal.h"
 #include "fs.h"
 #include "log.h"
 
@@ -31,9 +33,9 @@ typedef struct {
 
 
 static mnt_info_t MNT_INFO[FS_DEV_MAX]={
-    //{FS_DEV_SD, "sd",  "/mnt/sd",  "elm"},
+    //{FS_DEV_SD, SD_DEV,  SD_PATH,  "elm"},
     {FS_DEV_SD, "sd",  "/",  "elm"},
-    //{FS_DEV_NOR, "nor", "/mnt/nor", "lfs"},
+    {FS_DEV_NOR, NOR_DEV, NOR_PATH, "lfs"},
 };
 
 static int sd_mount(void)
@@ -42,10 +44,10 @@ static int sd_mount(void)
     while(n<10) {
         r = mmcsd_wait_cd_changed(500);
         if(r==MMCSD_HOST_PLUGED) {
-            r = fs_mount("sd", 1);
+            r = fs_mount(SD_DEV, 1);
         }
         else if(r==MMCSD_HOST_UNPLUGED) {
-            r = fs_mount("sd", 0);
+            r = fs_mount(SD_DEV, 0);
         }
         
         if(r<=0) break;
@@ -53,6 +55,24 @@ static int sd_mount(void)
     }
     return r;
 }
+static int nor_mount(void)
+{
+    int r=0;
+    struct rt_device *dev = RT_NULL;
+    
+    fal_init();
+    
+    dev = fal_mtd_nor_device_create(NOR_DEV);
+    if(!dev) {
+        LOGE("Can't create a mtd device on nor partition\n");
+        return -1;
+    }
+    
+    r = fs_mount(NOR_DEV, 1);
+    return r;
+}
+
+
 static int is_mounted(fs_handle_t *h, char *dev, char *path)
 {
     int i;
@@ -206,7 +226,7 @@ int fs_mkdir(char *path)
 int fs_init(void)
 {
     sd_mount();
-    fs_mkdir("/cfg");
+    //nor_mount();
     return 0;
 }
 

+ 1 - 1
f407/applications/fs.h

@@ -6,7 +6,7 @@
 
 enum {
     FS_DEV_SD=0,
-    //FS_DEV_NOR,
+    FS_DEV_NOR,
     
     FS_DEV_MAX
 };

+ 5 - 2
f407/applications/main.c

@@ -11,6 +11,7 @@
 #include "sys.h"
 #include "power.h"
 #include "cfg.h"
+#include "paras.h"
 #include "cascade.h"
 
 //https://embedded-rd.blog.csdn.net/article/details/109643188
@@ -94,10 +95,12 @@ __exit:
 
 static int user_init(void)
 {
+    paras_data_t *p=paras_get();
+    modbus_data_t *cas=&p->cas;
+    
     power_init();
     web_init();
-    LOGD("cascade thread!!!!!\n");
-    cascade_init(CASCADE_PORT,1,1,115200);
+    cascade_init(cas->mode, cas->addr, cas->baud);
     return 0;
 }
 

+ 185 - 98
f407/applications/mb.c

@@ -1,157 +1,162 @@
 #include "mb.h"
+#include "lock.h"
 #include "list.h"
 
 
 #define MALLOC   malloc
 #define FREE     free
 
+typedef void (*thread_fn_t)(void *arg);
 
 typedef struct {
-    mb_inst_t  *hinst;
-    uint8_t    mode;
     uint8_t    type;
-    
+    uint8_t    mode;
+    mb_inst_t  *hinst;
+    lock_t     lck;
+}mb_inf_t;
+typedef struct {
     rt_thread_t tid;
-    uint8_t    quit;
-    
-    
+    uint8_t     quit;
+    mb_inf_t    inf[MB_ID_MAX];
 }mb_handle_t;
 static mb_handle_t mbHandle={0};
-
-typedef void (*thread_fn_t)(void *arg);
 static int mb_stop(mb_handle_t *h);
 
 
-static void mb_thread(void *arg)
-{
-    mb_handle_t *h=(mb_handle_t*)arg;
-    
-    while(h->quit==0) {
-        mb_slave_fsm(h->hinst);
-    }
-    h->quit = 2;
-}
-
-static int mb_start(mb_handle_t *h)
-{
-//    if(h->mode==MB_MODE_MASTER) {
-//        return -1;
-//    }
-//    
-//    if(h->tid) {
-//        mb_stop(h);
-//    }
-    
-   // h->tid = rt_thread_create(NULL, mb_thread, h, 2048, 5, 20);
-//    if(h->tid==NULL) {
-//        //LOG_E("___ thread create failed\n");
-//        return -1;
-//    }
-//    
-   // h->quit = 0;
-   // rt_thread_startup(h->tid);
+static mb_para_t mb_paras[MB_ID_MAX]={
+    {   //MB_ID_POWER
+        .mode = MB_MODE_MASTER,
+        .type = MB_TYPE_RTU,
+        .para = {
+            .rtu = {
+                .dev = POWER_PORT,          //端口
+                .baudrate = 115200,         //波特率
+                .parity = 0,                //校验位
+                .pin = -1,                  //收发控制引脚, <0 表示不使用
+                .lvl = 0,                   //发送控制电平
+            }
+        }
+    },
     
-    return 0;
-}
-static int mb_stop(mb_handle_t *h)
-{
-    if(h->mode==MB_MODE_MASTER || h->tid==NULL) {
-        return -1;
-    }
-
-    h->quit = 1;
-    mb_destory(h->hinst);
-    while(h->quit!=2);
-    rt_thread_delete(h->tid);
-    h->tid = NULL;
+    {   //MB_ID_SENSOR
+        .mode = MB_MODE_MASTER,
+        .type = MB_TYPE_RTU,
+        .para = {
+            .rtu = {
+                .dev = SENSOR_PORT,         //端口
+                .baudrate = 115200,         //波特率
+                .parity = 0,                //校验位
+                .pin = -1,                  //收发控制引脚, <0 表示不使用
+                .lvl = 0,                   //发送控制电平
+            }
+        }
+    },
     
-    return 0;
-}
-
+    {   //MB_ID_CASCADE
+        .mode = MB_MODE_SLAVE,
+        .type = MB_TYPE_RTU,
+        .para = {
+            .rtu = {
+                .dev = CASCADE_PORT,        //端口
+                .baudrate = 115200,         //波特率
+                .parity = 0,                //校验位
+                .pin = -1,                  //收发控制引脚, <0 表示不使用
+                .lvl = 0,                   //发送控制电平
+            }
+        }
+    },
+};
 
 
-void* mb_init(mb_para_t *para)
+int mb_init(void)
 {
-    list_cfg_t lc={0,LIST_FULL_FIFO,10};
-    mb_handle_t *h=NULL;
-    
-    if(!para) {
-        return NULL;
-    }
+    int i,r;
+    mb_handle_t *h=&mbHandle;
+    const char *err[MB_ID_MAX]={"power","sensor","cascade"};
     
-    h = (mb_handle_t*)MALLOC(sizeof(mb_handle_t));
-    if(h) {
-        memset(h, 0, sizeof(mb_handle_t));
-        mb_setup(h, para);
+    memset(h, 0, sizeof(mb_handle_t));
+    for(i=0; i<MB_ID_MAX; i++) {
+        r = mb_setup(i, &mb_paras[i]);
+        if(r) {
+            LOGE("___ %s mb setup failed\n", err[i]);
+            continue;
+        }
+        h->inf[i].lck = lock_init();
     }
     
-    return h;
+    return 0;
 }
 
 
-int mb_setup(void *h, mb_para_t *para)
+int mb_setup(int id, mb_para_t *para)
 {
     int r;
+    mb_inf_t *pinf=NULL;
     mb_backend_param_t param={0};
-    mb_handle_t *mh=(mb_handle_t*)h;
+    mb_handle_t *h=&mbHandle;
     
-    if(!mh || !para) {
+    if(id<0 || id>=MB_ID_MAX || !para) {
         return -1;
     }
+    pinf = &h->inf[id];
     
-    mh->type = para->type;
-    mh->mode = para->mode;
-    if(mh->type==MB_TYPE_RTU) {
-        if(mh->hinst) {
-            mb_disconn(mh->hinst);
+    lock_on(pinf->lck);
+    pinf->type = para->type;
+    pinf->mode = para->mode;
+    if(pinf->type==MB_TYPE_RTU) {
+        if(pinf->hinst) {
+            mb_disconn(pinf->hinst);
         }
         
         param.rtu = para->para.rtu;
-        mh->hinst = mb_create(mh->type, &param);
-        if(!mh->hinst) {
+        pinf->hinst = mb_create(pinf->type, &param);
+        if(!pinf->hinst) {
             return -1;
         }
-        r = mb_connect(mh->hinst);
+        r = mb_connect(pinf->hinst);
         if(r) {
             LOGE("___ mb_connect failed\n");
         }
     }
-    else if(mh->type==MB_TYPE_TCP) {
+    else if(pinf->type==MB_TYPE_TCP) {
         
     }
     else {
-        return -1;
+        r = -1;
     }
-    mb_start(h);
+    lock_off(pinf->lck);
     
-    return 0;
+    return r;
 }
 
 
 
-int mb_deinit(void *h)
+int mb_deinit(void)
 {
-    mb_handle_t *mh=(mb_handle_t*)h;
-    if(!mh) {
-        return -1;
+    int i;
+    mb_handle_t *h=&mbHandle;
+    
+    for(i=0; i<MB_ID_MAX; i++) {
+        lock_deinit(h->inf[i].lck);
+        mb_disconn(h->inf[i].hinst);
+        mb_destory(h->inf[i].hinst);
     }
-    mb_stop(mh);
-    FREE(mh);
     
     return 0;
 }
 
 
-//
-
-int mb_read(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int timeout)
+int mb_read(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int timeout)
 {
     int r=-1;
-    mb_handle_t *mh=(mb_handle_t*)h;
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
     
-    if(!mh || !data || cnt<=0) {
+    if(id<0 || id>=MB_ID_MAX || !data || cnt<=0) {
         return -1;
     }
+    pinf = &h->inf[id];
+    
 #if 0
     rt_tick_t end = rt_tick_get_millisecond()+timeout;
     while(1) {
@@ -183,34 +188,116 @@ int mb_read(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int ti
         }
     }
 #else
-    mb_set_tmo(mh->hinst, timeout, 50);
-    mb_set_slave(mh->hinst, addr);
-    r = mb_read_regs(mh->hinst, reg, cnt, data);
+    lock_on(pinf->lck);
+    mb_set_tmo(pinf->hinst, timeout, 50);
+    mb_set_slave(pinf->hinst, addr);
+    r = mb_read_regs(pinf->hinst, reg, cnt, data);
+    lock_off(pinf->lck);
 #endif
     
     return r;
 }
 
 
-int mb_write(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
+int mb_write(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
 {
     int r=-1;
-    mb_handle_t *mh=(mb_handle_t*)h;
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
     
-    if(!mh || !data || cnt<=0) {
+    if(id<0 || id>=MB_ID_MAX || !data || cnt<=0) {
         return -1;
     }
+    pinf = &h->inf[id];
 
 #if 0
     r = list_append(mh->tx, 0, data, len);
 #else
-    mb_set_slave(mh->hinst, addr);
-    r = mb_write_regs(mh->hinst, reg, cnt, data);
+    lock_on(pinf->lck);
+    mb_set_slave(pinf->hinst, addr);
+    r = mb_write_regs(pinf->hinst, reg, cnt, data);
+    lock_off(pinf->lck);
 #endif
     
     return r;
 }
 
 
+int mb_set_addr(int id, uint8_t addr)
+{
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
+    
+    if(id<0 || id>=MB_ID_MAX) {
+        return -1;
+    }
+    pinf = &h->inf[id];
+    
+    lock_on(pinf->lck);
+    mb_set_slave(pinf->hinst,addr);
+    lock_off(pinf->lck);
+    
+    return 0;
+}
+
+
+int mb_set_cb(int id, const mb_cb_table_t *tab)
+{
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
+    
+    if(id<0 || id>=MB_ID_MAX) {
+        return -1;
+    }
+    pinf = &h->inf[id];
+    
+    lock_on(pinf->lck);
+    mb_set_cb_table(pinf->hinst, tab);
+    lock_off(pinf->lck);
+    
+    return 0;
+}
+
+
+int mb_set_cascade_cb(int id, mb_cascade_fun_t *fn)
+{
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
+    
+    if(id<0 || id>=MB_ID_MAX) {
+        return -1;
+    }
+    pinf = &h->inf[id];
+    
+    lock_on(pinf->lck);
+    mb_set_cb_cascade(pinf->hinst, fn);
+    lock_off(pinf->lck);
+    
+    return 0;
+}
+
+
+int mb_slave_poll(int id)
+{
+    mb_inf_t *pinf=NULL;
+    mb_handle_t *h=&mbHandle;
+    
+    if(id<0 || id>=MB_ID_MAX) {
+        return -1;
+    }
+    pinf = &h->inf[id];
+    
+    lock_on(pinf->lck);
+    mb_slave_fsm(pinf->hinst);
+    lock_off(pinf->lck);
+    
+    return 0;
+}
+
+
+
+
+
+
 
 

+ 20 - 16
f407/applications/mb.h

@@ -5,6 +5,8 @@
 #include "modbus.h"
 #include "datadef.h"
 
+typedef int (*mb_fn_t)(void *data, int len);
+
 enum {
     MB_MODE_MASTER=0,
     MB_MODE_SLAVE,
@@ -13,7 +15,13 @@ enum {
     MB_TYPE_RTU=0,
     MB_TYPE_TCP,
 };
-
+enum {
+    MB_ID_POWER=0,
+    MB_ID_SENSOR,
+    MB_ID_CASCADE,
+    
+    MB_ID_MAX,
+};
 typedef struct {
     uint8_t         type;
     uint8_t         mode;
@@ -21,21 +29,17 @@ typedef struct {
 }mb_para_t;
 
 
-typedef int (*mb_fn_t)(void *data, int len);
-typedef struct {
-    uint8_t     rw;     //0:read, 1:write
-    uint16_t    reg;
-    uint16_t    *data;
-    uint32_t    len;
-    uint32_t    time_e;
-}mb_data_t;
-
-void* mb_init(mb_para_t *para);
-int mb_deinit(void *h);
-int mb_setup(void *h, mb_para_t *para);
-
-int mb_read(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int timeout);
-int mb_write(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt);
+int mb_init(void);
+int mb_deinit(void);
+int mb_setup(int id, mb_para_t *para);
+
+int mb_read(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int timeout);
+int mb_write(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt);
+
+int mb_set_addr(int id, uint8_t addr);
+int mb_set_cb(int id, const mb_cb_table_t *tab);
+int mb_set_cascade_cb(int id, mb_cascade_fun_t *fn);
+int mb_slave_poll(int id);
 
 #endif
 

+ 2 - 2
f407/applications/paras.c

@@ -3137,13 +3137,13 @@ int paras_init(void)
     memset(h, 0, sizeof(paraHandle));
     h->lck = lock_init();
     h->paras = DFLT_PARAS;
-    sprintf(h->path, "/cfg/%s", INI_NAME);
+    sprintf(h->path, "%s/%s", NOR_PATH, INI_NAME);
     h->dic = ini_load(h->path, &h->paras);
     if(h->dic==NULL) {
         r = ini_reset(h);
     }
     strcpy(pv->ver, VERSION);
-    sprintf(tmp, "/cfg/%s", INF_NAME);
+    sprintf(tmp, "%s/%s", NOR_PATH, INF_NAME);
     sys_get_prod(tmp, &h->paras);
     sys_get_bldtime(pv->bldtime, sizeof(pv->bldtime));
     

+ 138 - 9
f407/applications/power.c

@@ -34,7 +34,7 @@ typedef struct {
     uint8_t         flag[CH_MAX];
     
     product_data_t *prod;
-    power_data_t   pdat;
+    power_all_t    all;
 }power_handle_t;
 
 static int get_power(power_ch_t *pch)
@@ -673,7 +673,7 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
 static int power_copy(power_handle_t *h)
 {
     int i,r=-1;
-    power_data_t *pd=&h->pdat;
+    power_all_t *pd=&h->all;
     
     if(h->chs>0) {
         if(!pd->pch || pd->chs!=h->chs) {
@@ -739,10 +739,6 @@ int power_init(void)
     
     memset(h, 0, sizeof(power_handle_t));
     h->lck = lock_init();
-    h->mb = mb_init(&para);
-    if(!h->mb) {
-        return -1;
-    }
     h->cur_addr = 0;
     h->brd_max = BRD_NUM;
     h->prod = &paras_get()->prod;
@@ -758,7 +754,6 @@ int power_deinit(void)
     power_handle_t *h=&pwrHandle;
     
     lock_deinit(h->lck);
-    mb_deinit(h->mb);
     
     return 0;
 }
@@ -1215,6 +1210,140 @@ int power_set_alarm(power_ch_t *pch)
 }
 
 
+int power_get_threshold(power_ch_t *pch)
+{
+    int i,r=0;
+    uint16_t offset;
+    power_ch_t *pch2=NULL;
+    power_handle_t *h=&pwrHandle;
+    
+    lock_on(h->lck);
+    pch2 = get_ch(h, pch->info.ch);
+    pch2->thr = pch->thr;
+    switch(pch->info.type) {
+        case AC_SINGLE_S_TYPE:
+        case AC_SINGLE_B_TYPE:
+        {
+            uint16_t offset = 0;
+            uint32_t temp = 0 ;
+            uint16_t buffer[16] = {0};
+
+            if(pch->info.ch==0) {
+                offset = POWER_AC_TOTAL_THRESHOLD;
+            }
+            else  {
+                offset = POWER_AC_THRESHOLD_L+(pch->info.ch-1)*16;
+            }
+            r = read_reg(h, pch->info.addr, offset, buffer, 16);
+            if(r) break;
+            
+            pch->thr.v_upper.val = ((buffer[1]<<16)|buffer[0])/1000;
+            pch->thr.v_lower.val = ((buffer[3]<<16)|buffer[2])/1000;
+            pch->thr.c_upper.val = ((buffer[5]<<16)|buffer[4])/1000;
+            pch->thr.p_upper.val = ((buffer[9]<<16)|buffer[8])/1000;
+            pch->thr.w_upper.val = ((buffer[13]<<16)|buffer[12])/1000;
+            
+        }
+        break;
+        
+        case DCPDU_TYPE:
+        {
+            uint16_t temp[4];
+            uint32_t value;
+            
+            offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MAX:POWER_DC_THRESHOLD_VOL_MAX;
+            r = read_reg(h, pch->info.addr, offset, temp, 2);
+            if(r) break;
+            pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            
+            offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_VOL_MIN:POWER_DC_THRESHOLD_VOL_MIN;
+            r = read_reg(h, pch->info.addr, offset, temp, 2);
+            if(r) break;
+            pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+            
+            offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_CUR_MAX:POWER_DC_THRESHOLD_CUR_MAX;
+            r = read_reg(h, pch->info.addr, offset, temp, 2);
+            if(r) break;
+            pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            
+            offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWR_MAX:POWER_DC_THRESHOLD_POWER_MAX;
+            r = read_reg(h, pch->info.addr, offset, temp, 2);
+            if(r) break;
+            pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            
+            offset = (pch->info.ch==0)?POWER_DC_THRESHOLD_TOTAL_PWRCON_MAX:POWER_DC_THRESHOLD_POWERCON_MAX;
+            r = read_reg(h, pch->info.addr, offset, temp, 2);
+            if(r) break;
+            pch->thr.w_upper.val = ((temp[1]<<16)|temp[0])/1000;
+        }
+        break;
+        
+        case TREE_AC_TYPE:
+        {
+            uint16_t temp[4];
+            uint32_t value;
+            
+            if(pch->info.ch==0) {
+                offset = POWER_AC3_THRESHOLD_IN;
+                
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                r = read_reg(h, pch->info.addr, offset+1, temp, 2);
+                if(r) break;
+                pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                r = read_reg(h, pch->info.addr, offset+2, temp, 2);
+                if(r) break;
+                pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                r = read_reg(h, pch->info.addr, offset+3, temp, 2);
+                if(r) break;
+                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                r = read_reg(h, pch->info.addr, offset+4, temp, 2);
+                pch->thr.w_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            }
+            else {
+                offset = POWER_AC3_THRESHOLD_VOL_MAX;
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.v_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                offset = POWER_AC3_THRESHOLD_VOL_MIN;
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.v_lower.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                offset = POWER_AC3_THRESHOLD_CUR_MAX;
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.c_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                offset = POWER_AC3_THRESHOLD_PWR_MAX;
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+                
+                offset = POWER_AC3_THRESHOLD_VOL_MAX;
+                r = read_reg(h, pch->info.addr, offset, temp, 2);
+                if(r) break;
+                pch->thr.p_upper.val = ((temp[1]<<16)|temp[0])/1000;
+            }
+        }
+        break;
+        
+        default:
+        r = -1;
+        break;
+    }
+    lock_off(h->lck);
+    
+    return r;
+}
+
+
 int power_set_threshold(power_ch_t *pch)
 {
     int r=0;
@@ -1520,11 +1649,11 @@ int power_set_stop_delay(power_ch_t *pch)
 }
 
 
-power_data_t power_data_get(void)
+power_all_t* power_data_get(void)
 {
     power_handle_t *h=&pwrHandle;
     
-    return h->pdat;
+    return &h->all;
 }
 
 

+ 2 - 1
f407/applications/power.h

@@ -159,12 +159,13 @@ int power_set_ch_sw(uint8_t ch, uint8_t on);
 int power_set_board_sw(uint8_t addr, uint8_t on);
 int power_set_all_sw(uint8_t on);
 int power_set_alarm(power_ch_t *pch);
+int power_get_threshold(power_ch_t *pch);
 int power_set_threshold(power_ch_t *pch);
 int power_set_start_delay(power_ch_t *pch);
 int power_set_stop_delay(power_ch_t *pch);
 int power_get_board(board_data_t *pbrd);
 int power_reset(void);
 
-power_data_t power_data_get(void);
+power_all_t* power_data_get(void);
 #endif
 

+ 2 - 1
f407/applications/rtconfig.h

@@ -99,7 +99,8 @@
 #define FAL_DEBUG 1
 #define FAL_PART_HAS_TABLE_CFG
 #define FAL_USING_SFUD_PORT
-#define FAL_USING_NOR_FLASH_DEV_NAME "nor"
+#define FAL_USING_NOR_FLASH_DEV_NAME "W25Q32"
+#define RT_USING_MTD_NOR
 
 
 //Device Drivers

+ 209 - 0
f407/applications/sensor.c

@@ -0,0 +1,209 @@
+#include "mb.h"
+#include "lock.h"
+#include "sensor.h"
+
+typedef struct {
+    lock_t        lck;
+    
+    sensor_all_t  all;
+}sensor_handle_t;
+static sensor_handle_t ssHandle={0};
+
+int sensor_init(void)
+{
+    sensor_handle_t *h=&ssHandle;
+    
+    h->lck = lock_init();
+    
+    return 0;
+}
+
+
+int sensor_deinit(void)
+{
+    sensor_handle_t *h=&ssHandle;
+    
+    lock_deinit(h->lck);
+    
+    return 0;
+}
+
+
+int sensor_add(sensor_data_t *data)
+{
+    sensor_handle_t *h=&ssHandle;
+    
+    lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+int sensor_remove(sensor_data_t *data)
+{
+    sensor_handle_t *h=&ssHandle;
+    
+    lock_on(h->lck);
+    
+    lock_off(h->lck);
+    
+    return 0;
+}
+
+
+int sensor_query(sensor_data_t *data)
+{
+    int r=-1;
+    sensor_handle_t *h=&ssHandle;
+
+    if(!data) {
+        return -1;
+    }
+
+    lock_on(h->lck);
+    switch(data->info.type) {
+        case SENSOR_TYPE_TEMP_HUMI:
+        {
+            uint16_t tmp[2];
+            switch(data->info.subtype) {
+                case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
+                {
+                    //r = g_modbus_read_x_reg(mm, addr, 0, 2, tmp);
+                    if(r<=0) {
+                        return -1 ;
+                    }
+                    data->samp.val[0] = tmp[1]/10.0f; //湿度值
+                    data->samp.val[1] = tmp[0]/10.0f; //湿度值
+                }
+                break;
+
+                case SENSOR_TYPE_TEMP_HUMI_HKSHT301T1H536VRS485:    //anderson
+                {
+                    //r = g_modbus_read_input_reg(mm, addr, 0, 2, tmp);
+                    if (r <= 0) {
+                        return -1;
+                    }
+                    data->samp.val[0] = tmp[0]/10.0f;   //温度值
+                    data->samp.val[1] = tmp[1]/10.0f;   //湿度值
+                }
+                break;
+            }
+        }
+        break;
+
+        case SENSOR_TYPE_SMOKE:
+        case SENSOR_TYPE_WATER:
+        case SENSOR_TYPE_ACCESS:
+        {
+            //r = gpio_get(subaddr+GPIO_PD11);
+            if(r<0) {
+                return -1;
+            }
+            data->samp.flag = r;   //温度值
+        }
+        break;
+
+        case SENSOR_TYPE_GAS:
+        {
+            uint16_t tmp;
+            //r = g_modbus_read_x_reg(mm, addr, 19, 1, &tmp);
+            if(r<=0) {
+                return -1 ;
+            }
+            data->samp.val[0] = tmp; //气体浓度值
+        }
+        break;
+
+        case SENSOR_TYPE_AIR_PRESS:
+        {
+
+        }
+        break;
+
+        case SENSOR_TYPE_AIR_COND:
+        {
+
+        }
+        break;
+
+        case SENSOR_TYPE_TEMP_DOUBLE:
+        {
+            uint16_t tmp[2];
+            switch(data->info.subtype) {
+                case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
+                {
+                    //r = g_modbus_read_input_reg(mm, addr, 0x0400, 1, &tmp[0]);
+                    if (r <= 0) {
+                        return -1;
+                    }
+
+                    //r = g_modbus_read_input_reg(mm, addr, 0x0401, 1, &tmp[1]);
+                    if (r <= 0) {
+                        return -1;
+                    }
+                    data->samp.val[0] = tmp[1]/10.0f;   //解算温度值
+                    data->samp.val[1] = tmp[0]/10.0f;   //解算湿度值
+                }
+                break;
+            }
+        }
+        break;
+
+        case SENSOR_TYPE_TEMP:
+        {
+            uint16_t tmp;
+            switch(data->info.subtype) {
+                case SENSOR_TYPE_TEMP_BTG50H8EL3200:
+                {
+                    //r = g_modbus_read_x_reg(mm, addr, 0, 1, &tmp);
+                    if (r <= 0) {
+                        //printf("___ sensor BTG50H8EL3200 read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
+                        return -1;
+                    }
+                    data->samp.val[0] = tmp/10.0f - 50;
+                    //printf("___ BTG50H8EL3200 read: 0x%04x, temp: %0.2f\n", tmp, data->val[0]);
+                }
+                break;
+            }
+        }
+        break;
+
+        case SENSOR_TYPE_LEAK:
+        {
+            switch(data->info.subtype) {
+                case SENSOR_TYPE_LEAK_XWDC01A:
+                {
+                    uint16_t tmp[4]={0};
+                    //r = g_modbus_read_input_reg(mm, addr, 0, 4, tmp);
+                    if (r <= 0) {
+                        //printf("___ sensor XWDC01A read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
+                        return -1;
+                    }
+                    //printf("___ XWDC01A read: 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", tmp[0],tmp[1],tmp[2],tmp[3]);
+
+                    data->samp.flag = 0;
+                    if(tmp[0] || tmp[1]) {
+                        data->samp.flag = 1;
+                    }
+                }
+                break;
+            }
+        }
+        break;
+    }
+    lock_off(h->lck);
+
+    return r;
+}
+
+    
+sensor_all_t* sensor_data_get(void)
+{
+    sensor_handle_t *h=&ssHandle;
+    
+    return &h->all;
+}
+
+

+ 13 - 0
f407/applications/sensor.h

@@ -0,0 +1,13 @@
+#ifndef __SENSORER_Hx__
+#define __SENSORER_Hx__
+
+#include "datadef.h"
+
+int sensor_init(void);
+int sensor_deinit(void);
+int sensor_add(sensor_data_t *data);
+int sensor_remove(sensor_data_t *data);
+int sensor_query(sensor_data_t *data);
+sensor_all_t* sensor_data_get(void);
+
+#endif

+ 41 - 0
f407/applications/snmp.c

@@ -0,0 +1,41 @@
+#include "snmp.h"
+#include "lwip/apps/snmp.h"
+#include "lwip/apps/snmp_mib2.h"
+#include "lwip/apps/snmp_opts.h"
+#include "lwip/apps/snmpv3.h" // 如果使用 SNMP v3
+
+
+void netif_event_callback(struct netif *netif) {
+    //snmp_ifType ifType = netif->link_type == NETIF_TYPE_ETHERNET ? ifTypeEthernetCsmacd : ifTypeOther;
+    //snmp_insert_ipnetif(netif, ifType); // 将网络接口添加到 SNMP MIB-2 中
+}
+
+static void mibs_init(void) {
+    //snmp_mib2_set_syscontact("admin@example.com");
+    //snmp_mib2_set_syslocation("Basement");
+    //snmp_mib2_set_sysdescr("LwIP/SNMP Test Device", "");
+    //snmp_mib2_set_sysname("TestDevice");
+}
+
+int snmp2_init(void)
+{
+    
+    snmp_init();
+    snmp_init_mib2();
+    //snmp_set_mibs(mibs, LWIP_ARRAYSIZE(mibs));
+    //snmp_trap_dst_enable(1, 1); // 启用SNMP陷阱
+    //snmp_set_device_enterprise_oid(device_enterprise_oid); // 设置设备的企业 OID
+    //snmp_asn1_enc_type_value(asn1Type, value); // 设置 MIB 的初始值等
+    //snmp_mib_node_add(&my_mib_node);
+    
+    return 0;
+}
+
+
+int snmp2_deinit(void)
+{
+    
+    return 0;
+}
+
+

+ 11 - 0
f407/applications/snmp.h

@@ -0,0 +1,11 @@
+#ifndef __SNMP_Hx__
+#define __SNMP_Hx__
+
+#include "datadef.h"
+
+int snmp2_init(void);
+int snmp2_deinit(void);
+
+
+#endif
+

+ 6 - 7
f407/applications/ui/menu.c

@@ -119,23 +119,22 @@ static int is_ph3_out(menu_handle_t *h)
 }
 static int get_input(menu_handle_t *h, int ph, total_t *ttl)
 {
-    power_data_t pd=power_data_get();
-    if(pd.chs==0 || !ttl) {
+    power_all_t *p=power_data_get();
+    if(p->chs==0 || !ttl) {
         return -1;
     }
-    *ttl = pd.ttl.total[ph];
+    *ttl = p->ttl.total[ph];
     return 0;
 }
 static int get_output(menu_handle_t *h, int ch, int ph, power_t *pwr)
 {
     int i=-1,j=0;
-    paras_data_t *p=paras_get();
-    power_data_t pd=power_data_get();
+    power_all_t *p=power_data_get();
 
-    if(ch>pd.chs==0 || !pwr || ch>pd.chs) {
+    if(p->chs==0 || ch>p->chs|| !pwr) {
         return -1;
     }
-    *pwr = pd.pch[ch].power[ph];
+    *pwr = p->pch[ch].power[ph];
     
     return 0;
 }

+ 9 - 10
f407/applications/web.c

@@ -124,10 +124,9 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
     int i,j,xlen,offset,times,left;
     pkt_hdr_t *hdr=NULL;
-    power_data_t pd=power_data_get();
+    power_all_t *p=(addr==0)?power_data_get():cascade_power_get();
     
-    pd = (addr==0)?power_data_get():cascade_power_get();
-    if(pd.chs==0 || h->buf==NULL ) {
+    if(p->chs==0 || h->buf==NULL ) {
         return;
     }
     hdr = (pkt_hdr_t*)h->buf;
@@ -137,23 +136,23 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
     hdr->type  = PKT_TYPE_POWER_CH;
     hdr->nack  = 0;
     
-    times = pd.chs/ONCE_SEND_CH_CNT;
+    times = p->chs/ONCE_SEND_CH_CNT;
     for(i=0; i<times; i++) {
         for(j=0; j<ONCE_SEND_CH_CNT; j++) {
             offset = j*sizeof(power_ch_t);
-            memcpy(hdr->data+offset, &pd.pch[i*ONCE_SEND_CH_CNT+j], sizeof(power_ch_t));
+            memcpy(hdr->data+offset, &p->pch[i*ONCE_SEND_CH_CNT+j], sizeof(power_ch_t));
         }
         xlen = ONCE_SEND_CH_CNT*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
         hdr->dlen  = xlen-sizeof(pkt_hdr_t);
         ws_send(c, h->buf, xlen, 1);
     }
     
-    left = pd.chs%ONCE_SEND_CH_CNT;
+    left = p->chs%ONCE_SEND_CH_CNT;
     for(i=0; i<left; i++) {
         offset = i*sizeof(power_ch_t);
-        memcpy(hdr->data+offset, &pd.pch[pd.chs-left+i], sizeof(power_ch_t));
+        memcpy(hdr->data+offset, &p->pch[p->chs-left+i], sizeof(power_ch_t));
     }
-    xlen = (pd.chs%ONCE_SEND_CH_CNT)*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
+    xlen = (p->chs%ONCE_SEND_CH_CNT)*sizeof(power_ch_t)+sizeof(pkt_hdr_t);
     hdr->dlen  = xlen-sizeof(pkt_hdr_t);
     ws_send(c, h->buf, xlen, 1);
 }
@@ -161,8 +160,8 @@ static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 static void send_powert(web_handle_t *h, mg_conn_t *c, uint8_t addr)
 {
     int i,r;
-    power_data_t pd=(addr==0)?power_data_get():cascade_power_get();
-    ws_send_pkt(h, c, addr, PKT_TYPE_POWER_TOTAL, &pd.ttl, sizeof(power_total_t), 1);
+    power_all_t *p=(addr==0)?power_data_get():cascade_power_get();
+    ws_send_pkt(h, c, addr, PKT_TYPE_POWER_TOTAL, &p->ttl, sizeof(power_total_t), 1);
 }
 static void send_dlist(web_handle_t *h, mg_conn_t *c)
 {

Dosya farkı çok büyük olduğundan ihmal edildi
+ 430 - 427
f407/project/app/app.uvoptx


+ 13 - 166
f407/project/app/app.uvprojx

@@ -480,177 +480,24 @@
               <FilePath>..\..\applications\db.c</FilePath>
             </File>
             <File>
-              <FileName>cboard.c</FileName>
+              <FileName>cascade.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\applications\cboard.c</FilePath>
-              <FileOption>
-                <CommonProperty>
-                  <UseCPPCompiler>2</UseCPPCompiler>
-                  <RVCTCodeConst>0</RVCTCodeConst>
-                  <RVCTZI>0</RVCTZI>
-                  <RVCTOtherData>0</RVCTOtherData>
-                  <ModuleSelection>0</ModuleSelection>
-                  <IncludeInBuild>0</IncludeInBuild>
-                  <AlwaysBuild>2</AlwaysBuild>
-                  <GenerateAssemblyFile>2</GenerateAssemblyFile>
-                  <AssembleAssemblyFile>2</AssembleAssemblyFile>
-                  <PublicsOnly>2</PublicsOnly>
-                  <StopOnExitCode>11</StopOnExitCode>
-                  <CustomArgument></CustomArgument>
-                  <IncludeLibraryModules></IncludeLibraryModules>
-                  <ComprImg>1</ComprImg>
-                </CommonProperty>
-                <FileArmAds>
-                  <Cads>
-                    <interw>2</interw>
-                    <Optim>0</Optim>
-                    <oTime>2</oTime>
-                    <SplitLS>2</SplitLS>
-                    <OneElfS>2</OneElfS>
-                    <Strict>2</Strict>
-                    <EnumInt>2</EnumInt>
-                    <PlainCh>2</PlainCh>
-                    <Ropi>2</Ropi>
-                    <Rwpi>2</Rwpi>
-                    <wLevel>0</wLevel>
-                    <uThumb>2</uThumb>
-                    <uSurpInc>2</uSurpInc>
-                    <uC99>2</uC99>
-                    <uGnu>2</uGnu>
-                    <useXO>2</useXO>
-                    <v6Lang>0</v6Lang>
-                    <v6LangP>0</v6LangP>
-                    <vShortEn>2</vShortEn>
-                    <vShortWch>2</vShortWch>
-                    <v6Lto>2</v6Lto>
-                    <v6WtE>2</v6WtE>
-                    <v6Rtti>2</v6Rtti>
-                    <VariousControls>
-                      <MiscControls></MiscControls>
-                      <Define></Define>
-                      <Undefine></Undefine>
-                      <IncludePath></IncludePath>
-                    </VariousControls>
-                  </Cads>
-                </FileArmAds>
-              </FileOption>
+              <FilePath>..\..\applications\cascade.c</FilePath>
             </File>
             <File>
-              <FileName>cboard_dc.c</FileName>
+              <FileName>breaker.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\applications\cboard_dc.c</FilePath>
-              <FileOption>
-                <CommonProperty>
-                  <UseCPPCompiler>2</UseCPPCompiler>
-                  <RVCTCodeConst>0</RVCTCodeConst>
-                  <RVCTZI>0</RVCTZI>
-                  <RVCTOtherData>0</RVCTOtherData>
-                  <ModuleSelection>0</ModuleSelection>
-                  <IncludeInBuild>0</IncludeInBuild>
-                  <AlwaysBuild>2</AlwaysBuild>
-                  <GenerateAssemblyFile>2</GenerateAssemblyFile>
-                  <AssembleAssemblyFile>2</AssembleAssemblyFile>
-                  <PublicsOnly>2</PublicsOnly>
-                  <StopOnExitCode>11</StopOnExitCode>
-                  <CustomArgument></CustomArgument>
-                  <IncludeLibraryModules></IncludeLibraryModules>
-                  <ComprImg>1</ComprImg>
-                </CommonProperty>
-                <FileArmAds>
-                  <Cads>
-                    <interw>2</interw>
-                    <Optim>0</Optim>
-                    <oTime>2</oTime>
-                    <SplitLS>2</SplitLS>
-                    <OneElfS>2</OneElfS>
-                    <Strict>2</Strict>
-                    <EnumInt>2</EnumInt>
-                    <PlainCh>2</PlainCh>
-                    <Ropi>2</Ropi>
-                    <Rwpi>2</Rwpi>
-                    <wLevel>0</wLevel>
-                    <uThumb>2</uThumb>
-                    <uSurpInc>2</uSurpInc>
-                    <uC99>2</uC99>
-                    <uGnu>2</uGnu>
-                    <useXO>2</useXO>
-                    <v6Lang>0</v6Lang>
-                    <v6LangP>0</v6LangP>
-                    <vShortEn>2</vShortEn>
-                    <vShortWch>2</vShortWch>
-                    <v6Lto>2</v6Lto>
-                    <v6WtE>2</v6WtE>
-                    <v6Rtti>2</v6Rtti>
-                    <VariousControls>
-                      <MiscControls></MiscControls>
-                      <Define></Define>
-                      <Undefine></Undefine>
-                      <IncludePath></IncludePath>
-                    </VariousControls>
-                  </Cads>
-                </FileArmAds>
-              </FileOption>
+              <FilePath>..\..\applications\breaker.c</FilePath>
             </File>
             <File>
-              <FileName>cboard_ac.c</FileName>
+              <FileName>sensor.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\applications\cboard_ac.c</FilePath>
-              <FileOption>
-                <CommonProperty>
-                  <UseCPPCompiler>2</UseCPPCompiler>
-                  <RVCTCodeConst>0</RVCTCodeConst>
-                  <RVCTZI>0</RVCTZI>
-                  <RVCTOtherData>0</RVCTOtherData>
-                  <ModuleSelection>0</ModuleSelection>
-                  <IncludeInBuild>0</IncludeInBuild>
-                  <AlwaysBuild>2</AlwaysBuild>
-                  <GenerateAssemblyFile>2</GenerateAssemblyFile>
-                  <AssembleAssemblyFile>2</AssembleAssemblyFile>
-                  <PublicsOnly>2</PublicsOnly>
-                  <StopOnExitCode>11</StopOnExitCode>
-                  <CustomArgument></CustomArgument>
-                  <IncludeLibraryModules></IncludeLibraryModules>
-                  <ComprImg>1</ComprImg>
-                </CommonProperty>
-                <FileArmAds>
-                  <Cads>
-                    <interw>2</interw>
-                    <Optim>0</Optim>
-                    <oTime>2</oTime>
-                    <SplitLS>2</SplitLS>
-                    <OneElfS>2</OneElfS>
-                    <Strict>2</Strict>
-                    <EnumInt>2</EnumInt>
-                    <PlainCh>2</PlainCh>
-                    <Ropi>2</Ropi>
-                    <Rwpi>2</Rwpi>
-                    <wLevel>0</wLevel>
-                    <uThumb>2</uThumb>
-                    <uSurpInc>2</uSurpInc>
-                    <uC99>2</uC99>
-                    <uGnu>2</uGnu>
-                    <useXO>2</useXO>
-                    <v6Lang>0</v6Lang>
-                    <v6LangP>0</v6LangP>
-                    <vShortEn>2</vShortEn>
-                    <vShortWch>2</vShortWch>
-                    <v6Lto>2</v6Lto>
-                    <v6WtE>2</v6WtE>
-                    <v6Rtti>2</v6Rtti>
-                    <VariousControls>
-                      <MiscControls></MiscControls>
-                      <Define></Define>
-                      <Undefine></Undefine>
-                      <IncludePath></IncludePath>
-                    </VariousControls>
-                  </Cads>
-                </FileArmAds>
-              </FileOption>
+              <FilePath>..\..\applications\sensor.c</FilePath>
             </File>
             <File>
-              <FileName>cboard_ac3.c</FileName>
+              <FileName>snmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\applications\cboard_ac3.c</FilePath>
+              <FilePath>..\..\applications\snmp.c</FilePath>
               <FileOption>
                 <CommonProperty>
                   <UseCPPCompiler>2</UseCPPCompiler>
@@ -703,11 +550,6 @@
                 </FileArmAds>
               </FileOption>
             </File>
-            <File>
-              <FileName>cascade.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\applications\cascade.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
@@ -3034,6 +2876,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\rt-thread\components\drivers\spi\sfud\src\sfud_sfdp.c</FilePath>
             </File>
+            <File>
+              <FileName>mtd_nor.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\rt-thread\components\drivers\mtd\mtd_nor.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 6 - 7
f407/rt-thread/components/fal/samples/porting/fal_cfg.h

@@ -14,7 +14,8 @@
 #include <rtconfig.h>
 #include <board.h>
 
-#define NOR_FLASH_DEV_NAME             "nor"
+#define MB  (1024*1024)
+#define NOR_FLASH_DEV_NAME             "W25Q32"
 
 /* ===================== Flash device Configuration ========================= */
 extern struct fal_flash_dev nor_flash0;
@@ -27,12 +28,10 @@ extern struct fal_flash_dev nor_flash0;
 /* ====================== Partition Configuration ========================== */
 #ifdef FAL_PART_HAS_TABLE_CFG
 /* partition table */
-#define FAL_PART_TABLE                                                               \
-{                                                                                    \
-    {FAL_PART_MAGIC_WORD,        "bl",     "stm32_onchip",         0,   64*1024, 0}, \
-    {FAL_PART_MAGIC_WORD,       "app",     "stm32_onchip",   64*1024,  704*1024, 0}, \
-    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
-    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
+#define FAL_PART_TABLE                                                \
+{                                                                     \
+    {FAL_PART_MAGIC_WORD, "nor", NOR_FLASH_DEV_NAME,  0,    1*MB, 0}, \
+    {FAL_PART_MAGIC_WORD, "nor", NOR_FLASH_DEV_NAME,  1*MB, 3*MB, 0}, \
 }
 #endif /* FAL_PART_HAS_TABLE_CFG */
 

+ 15 - 3
f407/rt-thread/components/fal/samples/porting/fal_flash_sfud_port.c

@@ -10,6 +10,7 @@
 
 #include <fal.h>
 #include <sfud.h>
+#include <drv_spi.h>
 
 #ifdef FAL_USING_SFUD_PORT
 #ifdef RT_USING_SFUD
@@ -17,7 +18,7 @@
 #endif
 
 #ifndef FAL_USING_NOR_FLASH_DEV_NAME
-#define FAL_USING_NOR_FLASH_DEV_NAME             "nor"
+#define FAL_USING_NOR_FLASH_DEV_NAME             "W25Q32"
 #endif
 
 static int init(void);
@@ -30,8 +31,8 @@ struct fal_flash_dev nor_flash0 =
 {
     .name       = FAL_USING_NOR_FLASH_DEV_NAME,
     .addr       = 0,
-    .len        = 8 * 1024 * 1024,
-    .blk_size   = 4096,
+    .len        = 4 * 1024 * 1024,
+    .blk_size   = 64*1024,
     .ops        = {init, read, write, erase},
     .write_gran = 1
 };
@@ -92,5 +93,16 @@ static int erase(long offset, size_t size)
 
     return size;
 }
+
+static int rt_hw_spi_flash_init(void)
+{
+    rt_hw_spi_device_attach("spi1", "spi1.0", GET_PIN(B, 6));
+    if (RT_NULL == rt_sfud_flash_probe("W25Q32", "spi1.0")) {
+        return -RT_ERROR;
+    };
+    return RT_EOK;
+}
+INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
+
 #endif /* FAL_USING_SFUD_PORT */