Bläddra i källkod

1、微调thread接口
2、改写ntp

guohui 1 år sedan
förälder
incheckning
126e414ee7

+ 42 - 45
pro/src/app.c

@@ -189,7 +189,7 @@ void upg_test(void)
 }
 
 
-void* power_thread(void* arg)
+static void* power_thread(void* arg)
 {
     int ret = 0 ;
     GlobalPowerManger* _globalPowerMangerTemp = NULL ;
@@ -1380,7 +1380,7 @@ void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType)
     }
 }
 
-void* breaker_thread(void *arg)
+static void* breaker_thread(void *arg)
 {
     int r;
     int ret=0;
@@ -1455,7 +1455,7 @@ void* breaker_thread(void *arg)
 /// @brief 传感器采集线程
 /// @param arg 
 /// @return 
-void* sensor_thread(void* arg)
+static void* sensor_thread(void* arg)
 {
 #if 1
    GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
@@ -1682,7 +1682,7 @@ void* sensor_thread(void* arg)
 #endif
     pthread_exit(NULL);
 }
-void* shm_thread(void *arg)
+static void* shm_thread(void *arg)
 {
     int fd = 0;
     GlobalPowerManger* _globalPowerMangerTemp = NULL ;
@@ -1780,46 +1780,43 @@ void* shm_thread(void *arg)
 	pthread_exit(NULL);
 }
 
-void* ntp_thread(void *arg)
+static void* ntp_thread(void *arg)
 {
-    time_t start_t, end_t;
+    int r=0,flag=0;
+    NTPClient  *pc=NULL;
+    time_t time1=0,time2=0,ntp_time;
     thread_handle_t *h=(thread_handle_t*)arg;
-
-    start_t = time(NULL);
-    while(h->quit==0)
-    {
-        if (end_t - start_t >= 1 && _globalNTPManager.mode == true)
-        {
-            if(globalNTPclient==NULL) {
-                globalNTPclient = createNTPClient(_globalNTPManager.ntpaddress, _globalNTPManager.port);
+    NTPManager *pm=&_globalNTPManager;
+    
+    #define NTP_INTERVAL_TIME  600
+    time1 = time(NULL);
+    while(h->quit==0) {
+        if(pm->mode>0) {
+            if(pc==NULL) {
+                pc = createNTPClient(pm->ntpaddress, pm->port);
             }
 
-            if (globalNTPclient ==NULL)
-            {
-                log_e("Failed to Connect the NTP server.");
-                sleep(600);
-                continue;
-            }
-            
-            time_t current_time;  
-            if (getCurrentTimeFromNTP(globalNTPclient, &current_time) < 0)
-            {
-                log_e("Failed to get time from NTP server.");
-                sleep(600);
-                continue;
+            if(pc) {
+                if(ntp_sync_flag || (time2==0) || ((time2-time1)>=NTP_INTERVAL_TIME)) {
+                    if (getCurrentTimeFromNTP(pc, &ntp_time)==0) {
+                        time_t host_time = time(NULL);
+                        if (abs(host_time - ntp_time) >= 5) {
+                            struct tm *ptm = localtime(&ntp_time);
+                            set_local_timeandzone(ptm, pm->tzone);
+                        }
+                        time2 = time1;
+                        ntp_sync_flag = 0;
+                    }
+                    else {
+                        log_e("getCurrentTimeFromNTP failed!");
+                    }
+                }
+                time2 = time(NULL);
             }
-            time_t t = time(NULL);
-            struct tm *ptm = localtime(&t);
-            struct tm *pCurrenttm = gmtime(&current_time);
-            if (abs(t - current_time) >= 5)
-                set_local_timeandzone(pCurrenttm, _globalNTPManager.tzone);
-            end_t = start_t;
         }
-        end_t = time(NULL);
-
-        sleep(600); // 十分钟同步一次
+        sleep(1);
     }
-    destroyNTPClient(globalNTPclient);
+    destroyNTPClient(pc);
 
     pthread_exit(NULL);
 }
@@ -1870,7 +1867,7 @@ int snmp_config(SNMPManager *m)
 }
 
 
-void* snmp_thread(void *arg)
+static void* snmp_thread(void *arg)
 {
     //int ret = 0 ;
     thread_handle_t *h=(thread_handle_t*)arg;
@@ -2165,12 +2162,12 @@ int app_init(void)
 
     _globalDeviceManager->dev_samp_flag = true;
 
-    thread_start(THREAD_ID_POWER, _globalDeviceManager);
-    thread_start(THREAD_ID_SENSOR, _globalDeviceManager);
-    thread_start(THREAD_ID_SHMW, _globalDeviceManager);
+    thread_start(THREAD_ID_POWER,  power_thread,  _globalDeviceManager);
+    thread_start(THREAD_ID_SENSOR, sensor_thread, _globalDeviceManager);
+    thread_start(THREAD_ID_SHMW,   shm_thread,    _globalDeviceManager);
 
-    thread_start(THREAD_ID_BREAKER_SCANNER,_globalDeviceManager);
-    thread_start(THREAD_ID_BREAKER, _globalDeviceManager);
+    thread_start(THREAD_ID_BREAKER_SCANNER, breaker_scanner_thread, _globalDeviceManager);
+    thread_start(THREAD_ID_BREAKER, breaker_thread, _globalDeviceManager);
 
     dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"Server Thread");
 
@@ -2202,13 +2199,13 @@ int app_init(void)
         log_d("get ntp info from database succeeded");
     }
 
-    thread_start(THREAD_ID_NTP, NULL);
+    thread_start(THREAD_ID_NTP, ntp_thread, NULL);
     dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "NTP");
 
     //初始化snmp
      dev_get_snmp_info(_globalDeviceManager->db, &_globalSNMPManager);
 #ifndef USE_NETSWITCH
-    thread_start(THREAD_ID_SNMP, _globalDeviceManager);
+    thread_start(THREAD_ID_SNMP, snmp_thread, _globalDeviceManager);
 #endif
     dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "SNMP");
 

+ 4 - 3
pro/src/appweb_handle.c

@@ -154,7 +154,7 @@ static int power_to_csv(char *path, status_data_t *data, int ftype)
 {
     int i=0;
     FILE *fp=NULL;
-    _OverAllPwrAckInfo *info=(ftype==FILE_POWER_ALL)?&data->all:&data->chn;
+    _OverAllPwrAckInfo *info=((ftype==FILE_POWER_ALL)?(&data->all):(&data->chn));
     
     fp = fopen(path, "wt");
     if(!fp) {
@@ -384,7 +384,7 @@ static void http_mg_cb(struct mg_connection *c, int ev, void *ev_data)
         }
     }
 }
-void *web_thread(void *arg)
+static void *web_thread(void *arg)
 {
     struct mg_mgr mgr;
     struct mg_connection *c;
@@ -4096,6 +4096,7 @@ static void serviceManagement(void *conn)
             tm_new.tm_sec = atoi(tempstr);
             t = mktime(&tm_new);
             set_local_timeandzone(&tm_new, _globalNTPManager.tzone);
+            ntp_sync_flag = 1;
         }
 
         char temp[100];
@@ -5642,7 +5643,7 @@ static int webSetCallback(void)
 
 int appweb_init(void)
 {
-    thread_start(THREAD_ID_WEB, &__globalDeviceManage);
+    thread_start(THREAD_ID_WEB, web_thread, &__globalDeviceManage);
     
     return 0;
 }

+ 2 - 3
pro/src/breaker_detection.c

@@ -162,11 +162,10 @@ int breaker_485_get_chns(void* manger,int saddr,unsigned short* cnt)
 }
 
 
-void* breaker_scanner_thread(void* argv)
+void* breaker_scanner_thread(void* arg)
 {
-
     //GlobalDeviceManager* gm= (GlobalDeviceManager*)(argv);
-    thread_handle_t *h=(thread_handle_t*)(argv);
+    thread_handle_t *h=(thread_handle_t*)(arg);
     GlobalDeviceManager* gm= (GlobalDeviceManager*)(h->arg);
    // memset(&breaker_scanner,0,sizeof(breaker_scanner));
     int ret = 0;

+ 1 - 2
pro/src/breaker_detection.h

@@ -60,8 +60,7 @@ 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);
-
+void* breaker_scanner_thread(void* arg);
 
 breaker_scanner_t *get_breaker_scanner(void);
 

+ 5 - 5
pro/src/cascade.c

@@ -1592,7 +1592,7 @@ static int slave_receive(cascade_handle_t *cas)
     return mb_receive(cas);
 }
 
-void* cascade_thread(void *arg)
+static void* cascade_thread(void *arg)
 {
     int r;
     thread_handle_t *h=(thread_handle_t*)arg;
@@ -1612,7 +1612,7 @@ void* cascade_thread(void *arg)
     
     pthread_exit(NULL);
 }
-void* cascade_scan_thread(void *arg)
+static void* cascade_scan_thread(void *arg)
 {
     int r;
     thread_handle_t *h=(thread_handle_t*)arg;
@@ -1788,8 +1788,8 @@ int cascade_init(void)
 
     slave_add(cas, 0);
 
-    thread_start(THREAD_ID_CASCADE, cas);
-    thread_start(THREAD_ID_CASCADE_SCAN, cas);
+    thread_start(THREAD_ID_CASCADE, cascade_thread, cas);
+    thread_start(THREAD_ID_CASCADE_SCAN, cascade_scan_thread, cas);
 
     GlobalDeviceManager* dm =get_dm();
     NetworkInfo_t net = {0};
@@ -1804,7 +1804,7 @@ int cascade_init(void)
     }
 
     dm->md_tcp = tcp_modbus_init(net.ip_address,CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product.pwr_type);
-    thread_start(THREAD_ID_TCP, NULL);
+    thread_start(THREAD_ID_TCP, tcp_modbus_thread, NULL);
         
     return 0;
 }

+ 1 - 0
pro/src/cascade.h

@@ -271,6 +271,7 @@ int cascade_slave_init(void);
 modbus_mapping_t    *cascade_slave_map();
 void cascade_slave_read(uint32_t addr,uint32_t lenth);
 void cascade_slave_write(uint32_t addr, uint16_t val);
+void* tcp_modbus_thread(void *arg);
 
 #endif
 

+ 2 - 1
pro/src/common.c

@@ -16,12 +16,13 @@
 GlobalDeviceManager __globalDeviceManage={0};
 GlobalDeviceManager __globalDeviceManage2={0};
 
+int ntp_sync_flag=0;
 unsigned long __globalSxIdx;
-NTPClient* globalNTPclient;
 _User_Log _GlobalUserLoginInfo;
 UserInfo _GlobalUserInfoNew;
 char _GlobalUserToken[64];
 MenuAuthority _GlobalMenuAuthority;
+NTPManager _globalNTPManager;
 
 void printf_global_device_info(GlobalDeviceInfo* _globalDeviceInfo)
 {

+ 3 - 2
pro/src/common.h

@@ -381,7 +381,7 @@ typedef struct
     int                 weekday;
     int                 tzone;
 }NTPManager;
-NTPManager _globalNTPManager;
+
 
 
 enum {
@@ -1050,13 +1050,14 @@ typedef struct
 extern GlobalDeviceManager __globalDeviceManage;
 extern GlobalDeviceManager __globalDeviceManage2;
 
-extern NTPClient* globalNTPclient;
+extern int ntp_sync_flag;
 extern unsigned long __globalSxIdx;
 
 extern _User_Log _GlobalUserLoginInfo;//全局用户登录信息
 extern UserInfo _GlobalUserInfoNew;////最近登录的信息
 extern char _GlobalUserToken[64];////最近登录的信息
 extern MenuAuthority _GlobalMenuAuthority;////角色菜单权限
+extern NTPManager _globalNTPManager;
 
 void initLogger(void);
 

+ 2 - 2
pro/src/dflt.c

@@ -39,7 +39,7 @@ GlobalDeviceInfo DFLT_PARAS={
         },
         
         .cascade = {
-            .mode = 1,                                  //modbus模式,0: master     1: slave
+            .mode = MODBUS_SLAVE,                       //modbus模式,0: master     1: slave
             .addr = 1,
             .baudrate = 115200,
             .path = "/dev/ttyAS5",                      //表头级联串口对应路径
@@ -53,7 +53,7 @@ mail_send_t DFLT_MAIL_SEND={
     .server = "smtp.gmail.com",
     .port = "587",
     .account = "billbaister@gmail.com",
-    .password = "dzwiqkyzfmrwyqxx",
+    .password = "vfvpyefvnfdtfzho",
     .auth = "PLAIN",
     .ca = "",
 };

+ 2 - 2
pro/src/mail.c

@@ -4219,7 +4219,7 @@ static void sleep_ms(int ms)
     usleep(ms*1000);
 }
 
-void* mail_thread(void *arg)
+static void* mail_thread(void *arg)
 {
 #ifdef USE_MAIL
     int r;
@@ -4261,7 +4261,7 @@ int mail_init(void)
     h->info = &h->dm->mailInfo;
 
     dev_mail_init(dm->db, h->info);
-    thread_start(THREAD_ID_MAIL, h);
+    thread_start(THREAD_ID_MAIL, mail_thread, h);
     h->inited = 1;
 
     //mail_test();

+ 2 - 2
pro/src/mqtt.c

@@ -545,7 +545,7 @@ static void* client_thread(void *arg)
 #endif
 
 
-void* mqtt_thread(void *arg)
+static void* mqtt_thread(void *arg)
 {
 #ifdef USE_MQTT
     int r;
@@ -587,7 +587,7 @@ int mqtt_init(void)
     h->list = xlist_init(&lc);
 
     dev_mqtt_init(h->dm->db, &h->dm->mqttInfo);
-    thread_start(THREAD_ID_MQTT, h);
+    thread_start(THREAD_ID_MQTT, mqtt_thread, h);
     h->inited = 1; r = 0;
 #endif
 

+ 2 - 2
pro/src/netswitch.c

@@ -858,7 +858,7 @@ static int sw_alarm(netswitch_evts_t *evts, netswitch_info_t *old, netswitch_inf
 }
 #endif
 
-void* netswitch_thread(void *arg)
+static void* netswitch_thread(void *arg)
 {
 #ifdef USE_NETSWITCH
     int r;
@@ -899,7 +899,7 @@ int netswitch_init(void)
 
     dev_switch_init(get_db(), &h->sw);
     pthread_mutex_init(&h->mutex, NULL);
-    thread_start(THREAD_ID_SWITCH, h);
+    thread_start(THREAD_ID_SWITCH, netswitch_thread, h);
 #endif
 
     return 0;

+ 42 - 21
pro/src/ntpclient.c

@@ -35,32 +35,53 @@ static time_t parseNTPResponse(const char* ntp_packet) {
     double frac = frac_sec * 2.0e-32;  
     return (time_t)(sec_since_1900 - 2208988800U) + (time_t)frac;  
 }  
-  
+  #include<netdb.h>
 // 创建NTP客户端实例  
 NTPClient* createNTPClient(const char* ntp_server, int port) {  
     NTPClient* client = (NTPClient*)malloc(sizeof(NTPClient));  
     if (!client) {  
-        perror("malloc failed");  
-        return NULL;  
-    }  
-  
-    // 创建UDP套接字  
-    if ((client->sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
-        perror("socket creation failed");  
-        free(client);  
+        perror("createNTPClient, malloc failed\n");  
         return NULL;  
-    }  
-  
-    // 设置NTP服务器地址  
-    memset(&client->server_addr, 0, sizeof(client->server_addr));  
-    client->server_addr.sin_family = AF_INET;  
-    client->server_addr.sin_port = htons(port);  
-    if (inet_aton(ntp_server, &client->server_addr.sin_addr) == 0) {  
-        fprintf(stderr, "Invalid address/Address not supported\n");  
-        close(client->sockfd);  
-        free(client);  
-        return NULL;  
-    }  
+    } 
+
+    int fd=-1;
+    char tmp[32];
+    struct addrinfo hints;
+    struct addrinfo *res=NULL,*rp;
+    char temp[INET6_ADDRSTRLEN];
+
+    memset(&hints, 0, sizeof hints);
+    hints.ai_family   = AF_UNSPEC;
+    hints.ai_socktype = SOCK_DGRAM;
+    hints.ai_protocol = IPPROTO_UDP;
+
+    sprintf(tmp, "%d", port);
+    if(getaddrinfo(ntp_server, tmp, &hints, &res) || (res==NULL)){
+        printf(" getaddrinfo %s:%d failed\n", ntp_server, port);  
+        free(client); return NULL;
+    }
+
+    for(rp=res; rp; rp=rp->ai_next){
+        fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+        if (fd>=0) {
+            break;
+        }
+        if(rp->ai_family==AF_INET) {
+            struct sockaddr_in *p4=(struct sockaddr_in*)rp->ai_addr;
+            inet_ntop(AF_INET, p4, temp, INET6_ADDRSTRLEN);
+            printf("socket to %s:%d failed\n", temp, p4->sin_port);
+        }
+        else {
+            struct sockaddr_in6 *p6=(struct sockaddr_in6*)rp->ai_addr;
+            inet_ntop(AF_INET6, p6, temp, INET6_ADDRSTRLEN);
+            printf("socket to %s:%d failed\n", temp, p6->sin6_port);
+        }
+    }
+    freeaddrinfo(res);
+    if(fd<0) {
+        free(client); return NULL;
+    }
+    client->sockfd = fd;
   
     return client;  
 }  

+ 31 - 8
pro/src/sqlite_handle.c

@@ -2677,15 +2677,13 @@ int dev_serarch_all_alarm(sqlite3* db,
 
     if (alarm_type<0)//小于0加载所有的
     {   
-        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (product_id=%d) and ((alarmType=%d) or (alarmType=%d) or (alarmType=%d)) order by alarmDate desc LIMIT %d OFFSET %d ",
-                        product_id,
+        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE((alarmType=%d) or (alarmType=%d) or (alarmType=%d)) order by alarmDate desc LIMIT %d OFFSET %d ",
                         ALARM_TYPE_POWER,ALARM_TYPE_SENSOR,ALARM_TYPE_NETWORK,
                         page_size,
                         page_num>0?(page_num-1)*page_size:0);
     }else
     {
-        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (product_id=%d) AND (alarmType=%d) LIMIT %d OFFSET %d",
-                        product_id,
+        sprintf(select_sql,"SELECT* FROM Table_AlarmManage (alarmType=%d) LIMIT %d OFFSET %d",
                         alarm_type,
                         page_size,
                         page_num>0?(page_num-1)*page_size:0);
@@ -2790,8 +2788,7 @@ int dev_search_alarm_info(sqlite3* db,
     
     if (alarm_type<0)//小于0加载所有的
     {   
-        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (product_id=%d) and ((alarmType=%d) or (alarmType=%d) or (alarmType=%d)) and (alarmDate BETWEEN '%s' AND '%s') order by alarmDate desc LIMIT %d OFFSET %d ;",
-                        product_id,
+        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE ((alarmType=%d) or (alarmType=%d) or (alarmType=%d)) and (alarmDate BETWEEN '%s' AND '%s') order by alarmDate desc LIMIT %d OFFSET %d ;",
                         ALARM_TYPE_POWER,ALARM_TYPE_SENSOR,ALARM_TYPE_NETWORK,
                         start_time,end_time,
                         page_size,
@@ -2799,8 +2796,7 @@ int dev_search_alarm_info(sqlite3* db,
     }
     else
     {
-        sprintf(select_sql, "SELECT* FROM Table_AlarmManage WHERE (product_id=%d) AND (alarmType=%d) AND (alarmDate BETWEEN '%s' AND '%s')  LIMIT %d OFFSET %d ;",
-                product_id,
+        sprintf(select_sql, "SELECT* FROM Table_AlarmManage WHERE (alarmType=%d) AND (alarmDate BETWEEN '%s' AND '%s')  LIMIT %d OFFSET %d ;",
                 alarm_type,
                 start_time,
                 end_time,
@@ -4636,4 +4632,31 @@ int dev_sql_set_overwrite(int flag)
 }
 
 
+///////////////////////////////////////////////////////////////////////////////
+
+const char *tabName[TAB_ID_MAX]={
+    "Table_NTPManage",
+    "Table_Userinfo",
+    "Table_AlarmManage",
+    "Table_RoleInfo",
+    "Table_GroupManage",
+    "Table_SNMPManage",
+    "Table_SMTPManage",
+    "Table_MQTTManage",
+    "Table_ChnTimerManage",
+    "Table_PowerManage"
+    "Table_PhasePowerManage",
+    "Table_SensorManage",
+    "Table_SensorInfo",
+    "Table_BreakerManage",
+    
+    "Table_LogInfo",
+    "Table_AlarmManage",
+    "Table_PowerInfo",
+    "Table_PhasePowerInfo",
+
+};
+
+
+
 

+ 43 - 0
pro/src/sqlite_handle.h

@@ -165,4 +165,47 @@ int dev_mqtt_update_info(sqlite3 *db, mqtt_info_t *info);
 int dev_sql_VACCUM(sqlite3 *db);
 int dev_sql_set_overwrite(int flag);
 
+
+enum {
+    TAB_ID_NTP=0,
+    TAB_ID_USER,
+    TAB_ID_ROLE,
+    TAB_ID_GROUP,
+    TAB_ID_SNMP,
+    TAB_ID_SMTP,
+    TAB_ID_MQTT,
+    TAB_ID_TIMER,
+    TAB_ID_POWER,
+    TAB_ID_POWER3,
+    TAB_ID_SENSOR,
+    TAB_ID_SENSOR_INFO,
+    TAB_ID_BREAKER,
+    
+    TAB_ID_LOG_INFO,
+    TAB_ID_ALARM_INFO,
+    TAB_ID_POWER_INFO,
+    TAB_ID_POWER3_INFO,
+    
+    TAB_ID_MAX
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 #endif

+ 3 - 3
pro/src/sys.c

@@ -1202,7 +1202,7 @@ static void mem_check(void)
     }
 }
 
-void* polling_thread(void *arg)
+static void* polling_thread(void *arg)
 {
     thread_handle_t *h=(thread_handle_t*)arg;
 
@@ -1221,8 +1221,8 @@ int sys_init(void)
     lock_s_init();
     paras_init();
     
-    //nic_restart(DFLT_NIC);
-    thread_start(THREAD_ID_POLLING, NULL);
+    nic_restart(DFLT_NIC);
+    thread_start(THREAD_ID_POLLING, polling_thread, NULL);
 
     return 0;
 }

+ 24 - 20
pro/src/thread.c

@@ -1,35 +1,36 @@
 #include "thread.h"
 
 static thread_attr_t thdAttrs[THREAD_ID_MAX]={
-    //name          fn                          arg             stacksize       prio
-    {"io",          NULL,                       NULL,           8*MB,           1},
-    {"ws",          ws_thread,                  NULL,           8*MB,           1},
-    {"web",         web_thread,                 NULL,           8*MB,           1},
-    {"ntp",         ntp_thread,                 NULL,           8*MB,           1},
-    {"snmp",        snmp_thread,                NULL,           8*MB,           1},
-    {"power",       power_thread,               NULL,           8*MB,           1},
-    {"sensor",      sensor_thread,              NULL,           8*MB,           1},
-    {"polling",     polling_thread,             NULL,           8*MB,           1},
-    {"cascade",     cascade_thread,             NULL,           8*MB,           1},
-    {"casscan",     cascade_scan_thread,        NULL,           8*MB,           1},
-    {"shmw",        shm_thread,                 NULL,           8*MB,           1},
-    {"breaker",     breaker_thread,             NULL,           8*MB,           1},
-    {"switch",      netswitch_thread,           NULL,           8*MB,           1},
-    {"brkscan",     breaker_scanner_thread,     NULL,           8*MB,           1},
-    {"mqtt",        mqtt_thread,                NULL,           8*MB,           1},
-    {"mail",        mail_thread,                NULL,           8*MB,           1},
-    {"modbus_tcp",  tcp_modbus_thread,          NULL,           8*MB,           1},
+    //name          fn              arg             stacksize       prio
+    {"io",          NULL,           NULL,           8*MB,           1},
+    {"ws",          NULL,           NULL,           8*MB,           1},
+    {"web",         NULL,           NULL,           8*MB,           1},
+    {"ntp",         NULL,           NULL,           8*MB,           1},
+    {"snmp",        NULL,           NULL,           8*MB,           1},
+    {"power",       NULL,           NULL,           8*MB,           1},
+    {"sensor",      NULL,           NULL,           8*MB,           1},
+    {"polling",     NULL,           NULL,           8*MB,           1},
+    {"cascade",     NULL,           NULL,           8*MB,           1},
+    {"casscan",     NULL,           NULL,           8*MB,           1},
+    {"shmw",        NULL,           NULL,           8*MB,           1},
+    {"breaker",     NULL,           NULL,           8*MB,           1},
+    {"switch",      NULL,           NULL,           8*MB,           1},
+    {"brkscan",     NULL,           NULL,           8*MB,           1},
+    {"mqtt",        NULL,           NULL,           8*MB,           1},
+    {"mail",        NULL,           NULL,           8*MB,           1},
+    {"modbus_tcp",  NULL,           NULL,           8*MB,           1},
 };
 static thread_handle_t thdHandles[THREAD_ID_MAX]={0};
 
 
-int thread_start(int id, void *arg)
+int thread_start(int id, thread_fn fn, void *arg)
 {
-    if(id<0 || id>=THREAD_ID_MAX) {
+    if(id<0 || id>=THREAD_ID_MAX || !fn) {
         return -1;
     }
     thread_attr_t *attr=&thdAttrs[id];
 
+    attr->fn = fn;
     attr->arg = arg;
     return thread_startEx(id, attr->name, attr->fn, attr->arg, attr->stksz, attr->prio);
 }
@@ -41,6 +42,9 @@ int thread_restart(int id)
         return -1;
     }
     thread_attr_t *attr=&thdAttrs[id];
+    if(!attr->fn) {
+        return -1;
+    }
 
     thread_stop(id);
     return thread_startEx(id, attr->name, attr->fn, attr->arg, attr->stksz, attr->prio);

+ 1 - 19
pro/src/thread.h

@@ -56,25 +56,7 @@ typedef struct {
 }thread_handle_t;
 
 
-void* ws_thread(void *arg);
-void* web_thread(void *arg);
-void* ntp_thread(void *arg);
-void* snmp_thread(void *arg);
-void* power_thread(void *arg);
-void* sensor_thread(void *arg);
-void* polling_thread(void *arg);
-void* cascade_thread(void *arg);
-void* cascade_scan_thread(void *arg);
-void* shm_thread(void *arg);
-void* breaker_thread(void *arg);
-void* netswitch_thread(void *arg);
-void* breaker_scanner_thread(void *arg);
-void* mqtt_thread(void *arg);
-void* mail_thread(void *arg);
-void* tcp_modbus_thread(void *arg);
-
-
-int thread_start(int id, void *arg);
+int thread_start(int id, thread_fn fn, void *arg);
 int thread_restart(int id);
 int thread_startEx(int id, const char *name, thread_fn fn, void *arg, int stksz, int prio);
 int thread_stop(int id);

+ 2 - 2
pro/src/websocket_handle.c

@@ -275,7 +275,7 @@ static void fn(mg_conn_t *c, int ev, void *ev_data)
   }
 
 }
-void* ws_thread(void* arg)
+static void* ws_thread(void* arg)
 {
     int r;
     thread_handle_t *h=(thread_handle_t*)arg;
@@ -314,7 +314,7 @@ int websocket_init(void)
     memset(wh, 0, sizeof(ws_handle_t));
     //read_ipaddr(wh);
 
-    thread_start(THREAD_ID_WS, wh);
+    thread_start(THREAD_ID_WS, ws_thread, wh);
     return 0;
 }