liyi преди 2 години
родител
ревизия
9c47b3f4ff
променени са 5 файла, в които са добавени 151 реда и са изтрити 14 реда
  1. 26 10
      pro/src/app.c
  2. 95 3
      pro/src/breaker_detection.c
  3. 28 0
      pro/src/breaker_detection.h
  4. 1 1
      pro/src/common.h
  5. 1 0
      pro/src/thread.h

+ 26 - 10
pro/src/app.c

@@ -1037,23 +1037,36 @@ void* breaker_thread(void *arg)
     GlobalBreakerManager *temp = NULL;
     pthread_mutex_init(&_globalDeviceManager->_breaker_mutex,NULL);
     uint16_t value = 0;
+    breaker_scanner_t* breaker_scann = get_breaker_scanner(); 
     while (_globalDeviceManager->dev_samp_flag)
     {
         pthread_mutex_lock(&__globalDeviceManage._breaker_mutex);
         list_for_each_entry(temp, &_globalDeviceManager->g_new_global_breaker.list,list)
         {
-            if(temp->breaker_gather_addr != 0)
+            // if(temp->breaker_gather_addr != 0)
+            // {
+            //     value = 0;
+            //     r = breaker_485_get_chn_status((void*)&_globalDeviceManager->_globalRelaySampManger,
+            //     temp->breaker_gather_addr,BREADER_485_ADDR_CHN_REG+temp->breaker_chn,&value);
+            //     if(r==0) {
+            //         temp->breaker_status = value;
+            //     }
+            //   //  printf("temp->breaker_gather_addr = %d temp->breaker_chn=%d getchn value = %d\n",temp->breaker_gather_addr,temp->breaker_chn,value);
+            // }else
+            // {
+            //     //DI
+            // }
+            if(temp->breaker_gather_addr)
             {
-                value = 0;
-                r = breaker_485_get_chn_status((void*)&_globalDeviceManager->_globalRelaySampManger,
-                temp->breaker_gather_addr,BREADER_485_ADDR_CHN_REG+temp->breaker_chn,&value);
-                if(r==0) {
-                    temp->breaker_status = value;
+                if(temp->breaker_gather_addr-BREADER_485_ADDR < BREAKER_BOARD_MAX && 
+                           (breaker_scann->breaker_flag[temp->breaker_gather_addr-BREADER_485_ADDR]) == 1)
+                {
+                    int chn = temp->breaker_chn;
+                    temp->breaker_status = breaker_scann->board[temp->breaker_gather_addr-BREADER_485_ADDR].ch_status[chn-1];
+                }else
+                {
+                    temp->breaker_status = 0;
                 }
-              //  printf("temp->breaker_gather_addr = %d temp->breaker_chn=%d getchn value = %d\n",temp->breaker_gather_addr,temp->breaker_chn,value);
-            }else
-            {
-                //DI
             }
         }
         pthread_mutex_unlock(&__globalDeviceManage._breaker_mutex);
@@ -2243,6 +2256,9 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     thread_start(THREAD_ID_POWER, power_thread, _globalDeviceManager, 20*MB, 0);
     thread_start(THREAD_ID_SENSOR, sensor_thread, _globalDeviceManager, 10*MB, 0);
     thread_start(THREAD_ID_SHMW, shm_thread, _globalDeviceManager, 10*MB, 0);
+
+    thread_start(THREAD_ID_BREAKER_SCANNER,breaker_scanner_thread,_globalDeviceManager,1*MB,0);
+
 	thread_start(THREAD_ID_BREAKER, breaker_thread, _globalDeviceManager, 5*MB, 0);
         dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"Server Thread");
     

+ 95 - 3
pro/src/breaker_detection.c

@@ -5,6 +5,11 @@
 #include <unistd.h>
 #include "breaker_detection.h"
 #include "modbus_handle.h"
+#include "common.h"
+#include "thread.h"
+#include "string.h"
+
+static breaker_scanner_t breaker_scanner;
 
 
 
@@ -132,10 +137,8 @@ int breaker_485_get_all_chn_status(void* manger,int saddr,unsigned short *status
 {
     int ret = 0 ;
     unsigned short data_temp[6] = {0};
-    if(ret <= 0)
-        return -1 ;
     ret = g_modbus_read_x_reg(manger,saddr,BREADER_485_ADDR_CHN_REG+1,BREAKER_485_CHN_MAX,data_temp);
-    for(int i =0;i < 6;i++)
+    for(int i =0;i < BREAKER_485_CHN_MAX;i++)
     {
         if(data_temp[i])
         {
@@ -158,4 +161,93 @@ int breaker_485_get_chns(void* manger,int saddr,unsigned short* cnt)
 
     *cnt = data_temp & 0x00ff;
     return 0;
+}
+
+
+void* breaker_scanner_thread(void* argv)
+{
+
+    //GlobalDeviceManager* gm= (GlobalDeviceManager*)(argv);
+    thread_handle_t *h=(thread_handle_t*)(argv);
+    GlobalDeviceManager* gm= (GlobalDeviceManager*)(h->arg);
+    memset(&breaker_scanner,0,sizeof(breaker_scanner));
+    int ret = 0;
+    uint16_t value =0;
+    uint16_t status[BREAKER_485_CHN_MAX] = {0};
+    //scanner all boadr
+    for(int i = 0; i < BREAKER_BOARD_MAX; i++)
+    {
+        ret = breaker_485_get_chn_status((void*)&gm->_globalRelaySampManger,
+                BREADER_485_ADDR+i,BREADER_485_ADDR_CHN_REG,&value);
+        if(ret == 0)
+        {
+            breaker_scanner.breaker_flag[i] = 1;
+        }else
+        {
+            breaker_scanner.breaker_flag[i] = 0;
+        }
+    }
+    int count = 0;
+
+    while(h->quit==0)
+    {
+        if((count % 10) == 1)
+        {
+            for(int i = 0; i < BREAKER_BOARD_MAX; i++)
+            {
+                ret = breaker_485_get_chn_status((void*)&gm->_globalRelaySampManger,
+                        BREADER_485_ADDR+i,BREADER_485_ADDR_CHN_REG,&value);
+                if(ret == 0)
+                 {
+                    breaker_scanner.breaker_flag[i] = 1;
+                }else
+                {
+                    breaker_scanner.breaker_flag[i] = 0;
+                }
+            }
+        }
+
+        for(int i = 0; i < BREAKER_BOARD_MAX; i++)
+        {
+            if(breaker_scanner.breaker_flag[i])
+            {
+
+                    breaker_485_get_all_chn_status((void*)&gm->_globalRelaySampManger,BREADER_485_ADDR+i,status);
+                    pthread_mutex_lock(&gm->_breaker_mutex);
+                    memcpy(breaker_scanner.board[i].ch_status,status,sizeof(status));
+                    pthread_mutex_unlock(&gm->_breaker_mutex);
+                // ret = breaker_485_get_chn_status((void*)&gm->_globalRelaySampManger,
+                //     BREADER_485_ADDR+i,BREADER_485_ADDR_CHN_REG,&value);
+                // //pthread_mutex_lock(&gm->_breaker_mutex);
+                // if(ret == 0)
+                // {
+                //     breaker_scanner.breaker_flag[i] = 1;  // board is online
+                //     //breaker_485_get_all_chn_status((void*)&gm->_globalRelaySampManger,BREADER_485_ADDR+i,status);     
+                //     //memcmp(breaker_scanner.board[i].scanner_info.ch_status,status,sizeof(status));
+                // }else
+                // {
+                //     breaker_scanner.breaker_flag[i] = 0;           //board is offline
+                // }
+                
+                
+                // // pthread_mutex_unlock(&gm->_breaker_mutex);
+                memset(status,0,sizeof(status));
+            }else
+            {
+                memset(status,0,sizeof(status));
+                pthread_mutex_lock(&gm->_breaker_mutex);
+                memcpy(breaker_scanner.board[i].ch_status,status,sizeof(status));
+                pthread_mutex_unlock(&gm->_breaker_mutex);
+            }
+        }
+        count ++;
+        sleep(1);
+    }
+
+    return NULL;
+}
+
+breaker_scanner_t *get_breaker_scanner(void)
+{
+    return &breaker_scanner;
 }

+ 28 - 0
pro/src/breaker_detection.h

@@ -1,6 +1,8 @@
 #ifndef __BREAKER_DETECTION_H__
 #define __BREAKER_DETECTION_H__
 
+#include "stdint.h"
+
 
 #define BREAKER_IO_BASE    (96)
 
@@ -26,6 +28,27 @@ enum{
 #define BREADER_485_ADDR     (64)
 
 #define BREADER_485_ADDR_CHN_REG        (2200)
+#define BREAKER_BOARD_MAX (8)
+
+
+
+#define CHN1_ONLOINE  (1)
+#define CHN2_ONLOINE  (2)
+#define CHN3_ONLOINE  (4)
+#define CHN4_ONLOINE  (8)
+#define CHN5_ONLOINE  (16)
+#define CHN6_ONLOINE  (32)
+
+
+typedef struct breaker_scanner_info{
+    uint16_t ch_status[BREAKER_485_CHN_MAX];
+}breaker_scanner_info_t;
+
+
+typedef struct breaker_scanner{
+    uint8_t breaker_flag[BREAKER_BOARD_MAX];
+    breaker_scanner_info_t board[BREAKER_BOARD_MAX];  // breaker addr start by 64
+}breaker_scanner_t;
 
 
 
@@ -37,6 +60,11 @@ int breaker_read_status(int gpio);
 int breaker_485_get_chns(void* manger,int saddr,unsigned short* cnt);
 int breaker_485_get_chn_status(void* manger,int saddr,int channel,unsigned short *statue);
 int breaker_485_get_all_chn_status(void* manger,int saddr,unsigned short *status);
+void* breaker_scanner_thread(void* argv);
+
+
+breaker_scanner_t *get_breaker_scanner(void);
+
 
 #endif
 

+ 1 - 1
pro/src/common.h

@@ -51,6 +51,7 @@
 #define INTERL_SENSOR_MODBUS_BAUD 9600
 
 
+
 #define IMAGE_PATH          "image"
 #define LOGO_FILE           "logo.png"
 #define QRCODE_FILE         "qrcode.png"
@@ -866,7 +867,6 @@ typedef struct GlobalBreakerManger{
 }GlobalBreakerManger;
 
 
-
 typedef struct GlobalBreakerManager{
     uint32_t        product_id;
     uint32_t        breaker_id;

+ 1 - 0
pro/src/thread.h

@@ -26,6 +26,7 @@ enum {
     THREAD_ID_SHMW,
     THREAD_ID_BREAKER,
     THREAD_ID_SWITCH,
+    THREAD_ID_BREAKER_SCANNER,
     
     THREAD_ID_MAX=30
 };