web.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819
  1. #include "web.h"
  2. #include "mongoose.h"
  3. //#include "list.h"
  4. #include "time.h"
  5. #include "power.h"
  6. #include "paras.h"
  7. #include "sensor.h"
  8. //#include "breaker.h"
  9. #include "cascade.h"
  10. #include "cfg.h"
  11. #include "lcd.h"
  12. #include <stdio.h>
  13. #include "datadef.h"
  14. #include "cascade.h"
  15. #include "snmp.h"
  16. #include "net.h"
  17. #include "cfg.h"
  18. #include "lcd.h"
  19. //#include "wanning.h"
  20. #include "time.h"
  21. #include "cJSON.h"
  22. #include "json_handle.h"
  23. #include "md5.h"
  24. #include "clock.h"
  25. #include "FreeRTOS.h"
  26. #include "event_groups.h"
  27. #include "led.h"
  28. #include "beep.h"
  29. static char* g_product_t_ac_type_str[3] = {
  30. "L1",
  31. "L2",
  32. "L3",
  33. };
  34. #define TIMER_INTERVAL 1000
  35. #define ONCE_SEND_CNT 13
  36. #define FN_MAX 20
  37. typedef void (*http_fn_t)(void *arg);
  38. #define USE_MG716
  39. typedef struct mg_mgr mg_mgr_t;
  40. #ifdef USE_MG716
  41. typedef struct mg_tls_opts mg_tls_t;
  42. #endif
  43. typedef struct {
  44. http_fn_t f;
  45. char *uri;
  46. }mg_fn_t;
  47. typedef struct {
  48. // pthread_t tid;
  49. mg_mgr_t mgr;
  50. #ifdef USE_MG716
  51. mg_tls_t tls;
  52. #else
  53. mg_opts_t opts;
  54. #endif
  55. int cnt;
  56. mg_fn_t fn[FN_MAX];
  57. // handle_t list;
  58. char rootDir[MG_PATH_MAX];
  59. char *buf;
  60. int buflen;
  61. uint8_t cur_addr;
  62. }web_handle_t;
  63. typedef struct mg_connection mg_conn_t;
  64. #ifdef USE_MG716
  65. static void timer_fn(void *arg)
  66. {
  67. #if 0
  68. int r;
  69. web_handle_t *h=(web_handle_t*)arg;
  70. list_node_t *ln=NULL;
  71. mg_conn_t* c;
  72. r = list_take_node(h->list, &ln, 0);
  73. if(r==0) {
  74. node_t *n=&ln->data;
  75. for (c = h->mgr.conns; c != NULL; c = c->next) {
  76. //ws_send_pkt(h, c, n->tp, n->buf, n->dlen, 1);
  77. }
  78. list_back_node(h->list, ln);
  79. }
  80. #endif
  81. }
  82. #else
  83. typedef struct mg_serve_http_opts mg_opts_t;
  84. #define MG_PATH_MAX 128
  85. static void set_timer(struct mg_connection *c, int ms)
  86. {
  87. mg_set_timer(c, mg_time()+ms/1000.0f);
  88. }
  89. #endif
  90. typedef struct {
  91. struct mg_connection *c;
  92. int ev;
  93. void *ev_data;
  94. }mg_stream_t;
  95. static web_handle_t webHandle={0};
  96. typedef struct {
  97. char name[32];
  98. FILE *file;
  99. uint32_t file_crc;
  100. uint32_t current_chunk;
  101. }import_file_t;
  102. static TCM_DATA uint32_t crc32_table[256]={0};
  103. static TCM_DATA import_file_t import_file = {0};
  104. static void crc32_init_table(void)
  105. {
  106. for (uint32_t i = 0; i < 256; i++) {
  107. uint32_t c = i;
  108. for (int j = 0; j < 8; j++) {
  109. if (c & 1)
  110. c = (c >> 1) ^ 0xEDB88320u;
  111. else
  112. c >>= 1;
  113. }
  114. crc32_table[i] = c;
  115. }
  116. }
  117. static uint32_t crc32_update(uint32_t crc, const void *data, size_t len)
  118. {
  119. const uint8_t *p = (const uint8_t *)data;
  120. crc ^= 0xFFFFFFFFu;
  121. for (size_t i = 0; i < len; i++)
  122. crc = crc32_table[(crc ^ p[i]) & 0xFF] ^ (crc >> 8);
  123. return crc ^ 0xFFFFFFFFu;
  124. }
  125. static uint32_t crc32_buf(const void *data, size_t len)
  126. {
  127. return crc32_update(0, data, len);
  128. }
  129. static void httpAddCallback(char *uri, http_fn_t f)
  130. {
  131. //mg_handle_t *h=&webHandle.mg;
  132. if(webHandle.cnt<FN_MAX-1) {
  133. webHandle.fn[webHandle.cnt].uri = uri;
  134. webHandle.fn[webHandle.cnt].f = f;
  135. webHandle.cnt++;
  136. }
  137. }
  138. static int http_reply(void *conn, int status, char *ack)
  139. {
  140. int r=0;
  141. mg_stream_t *s=(mg_stream_t*)conn;
  142. r = mg_http_reply2(s->c, status, "", ack);
  143. return r;
  144. }
  145. static int is_ws(mg_conn_t *c)
  146. {
  147. int r=0;
  148. #ifdef USE_MG716
  149. r = c->is_websocket?1:0;
  150. #else
  151. r = (c->flags & MG_F_IS_WEBSOCKET)?1:0;
  152. #endif
  153. return r;
  154. }
  155. static int ws_send(mg_conn_t *c, void *data, int len, int isbin)
  156. {
  157. if(!c || !data || len<=0) {
  158. return -1;
  159. }
  160. //LOGD("____ws_send, len: %d\n", len);
  161. #ifdef USE_MG716
  162. mg_ws_send(c, data, len, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
  163. #else
  164. mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, data, len);
  165. #endif
  166. return 0;
  167. }
  168. static void send_user_info(web_handle_t *h, mg_conn_t *c)
  169. {
  170. pkt_hdr_t *hdr=NULL;
  171. hdr = (pkt_hdr_t*)h->buf;
  172. wb_send_user_t *data1 = (wb_send_user_t *)(&hdr->data);
  173. memset(data1,0,sizeof(wb_send_user_t));
  174. paras_data_t* para=paras_get();
  175. user_data_t *data = &para->user;
  176. data1->count = data->user_count;
  177. for(int i = 0; i < data->user_count;i++)
  178. {
  179. data1->users[i].roul_id = data->config[i].role_id;
  180. strcpy(data1->users[i].user,data->config[i].user_name);
  181. strcpy(data1->users[i].date,data->config[i].date);
  182. strcpy(data1->users[i].time,data->config[i].time);
  183. }
  184. hdr->magic = PKT_MAGIC;
  185. hdr->addr = 0;
  186. hdr->type = NEW_PKT_TYPE_USER;
  187. hdr->nack = 0;
  188. hdr->subtype = 0;
  189. hdr->dlen = data1->count * sizeof(user_t) + sizeof(data1->count);
  190. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  191. ws_send(c, h->buf, xlen, 1);
  192. }
  193. static void send_add_user_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  194. {
  195. char date[32]={0};
  196. char time_s[32] = {0};
  197. unsigned char digest[16]={0};
  198. char output[34] = {0};
  199. md5_ctx_t ctx={0};
  200. uint8_t flag = USER_SUCCESS;
  201. web_user_add_t * user_add = (web_user_add_t *)&(ctrl->user_add);
  202. pkt_hdr_t *hdr=(pkt_hdr_t*)(h->buf);
  203. paras_data_t* para=paras_get();
  204. printf("hdr = %x\n",(uint32_t)hdr);
  205. time_t t=time(NULL);
  206. struct tm *tm=localtime(&t);
  207. hdr->magic = PKT_MAGIC;
  208. hdr->addr = 0;
  209. hdr->type = NEW_PKT_TYPE_USER;
  210. hdr->nack = 0;
  211. hdr->subtype = NEW_SUB_PKT_TYPE_USER_ADD;
  212. hdr->dlen = 1;
  213. sprintf(date,"%04d%/%02d/%02d",(tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  214. sprintf(time_s,"%02d%:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  215. for(int i = 0; i < para->user.user_count;i++)
  216. {
  217. if(strcmp(user_add->user,para->user.config[i].user_name) == 0)
  218. {
  219. flag = USER_EXIST; //user_add exist
  220. break;
  221. }
  222. }
  223. if(flag == 0)
  224. {
  225. if(para->user.user_count >= 10)
  226. {
  227. flag = USER_OVER_TEN;
  228. }else
  229. {
  230. para->user.user_count++;
  231. strcpy(para->user.config[para->user.user_count-1].user_name,user_add->user);
  232. para->user.config[para->user.user_count-1].role_id = user_add->permition;
  233. strcpy(para->user.config[para->user.user_count-1].date,date);
  234. strcpy(para->user.config[para->user.user_count-1].time,time_s);
  235. md5_init(&ctx);
  236. //mbedtls_md5_starts(&ctx);
  237. md5_update(&ctx, (uint8_t*)user_add->password, strlen(user_add->password));
  238. md5_final(&ctx, digest);
  239. //md5_free(&ctx);
  240. for (int k = 0; k < 16; k++) {
  241. sprintf(&output[k * 2], "%02x", digest[k]);
  242. }
  243. output[33] = '\0';
  244. strcpy(para->user.config[para->user.user_count-1].password_md5,output);
  245. paras_user_save();
  246. }
  247. }
  248. uint8_t *data = (uint8_t *)(&hdr->data);
  249. *data = flag;
  250. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  251. ws_send(c, h->buf, xlen, 1);
  252. //printf("send len = %d\n",xlen);
  253. }
  254. static void send_user_delete_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  255. {
  256. web_user_delete_t * user_delete = &ctrl->user_delete;
  257. pkt_hdr_t *hdr=NULL;
  258. hdr = (pkt_hdr_t*)h->buf;
  259. uint8_t flag = USER_DELETE_SUCCESS;
  260. paras_data_t* para=paras_get();
  261. user_data_t back_user = {0};
  262. int j = 0;
  263. for(int i = 0;i < para->user.user_count;i++)
  264. {
  265. if(strcmp(para->user.config[i].user_name,user_delete->user) == 0)
  266. {
  267. }else
  268. {
  269. back_user.config[j++] = para->user.config[i];
  270. }
  271. }
  272. back_user.user_count = j;
  273. //memset(&para->user,0,sizeof(para->user));
  274. para->user = back_user;
  275. paras_user_save();
  276. uint8_t *data = (uint8_t *)(&hdr->data);
  277. hdr->magic = PKT_MAGIC;
  278. hdr->addr = 0;
  279. hdr->type = NEW_PKT_TYPE_USER;
  280. hdr->nack = 0;
  281. hdr->subtype = NEW_SUB_PKT_TYPE_USER_DELETE;
  282. hdr->dlen = 1;
  283. *data = flag;
  284. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  285. ws_send(c, h->buf, xlen, 1);
  286. }
  287. static void send_user_update_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  288. {
  289. web_user_update_t *user_update = &ctrl->user_update;
  290. pkt_hdr_t *hdr=NULL;
  291. hdr = (pkt_hdr_t*)h->buf;
  292. uint8_t flag = USER_DELETE_SUCCESS;
  293. paras_data_t* para=paras_get();
  294. unsigned char digest[16]={0};
  295. char output[34] = {0};
  296. md5_ctx_t ctx={0};
  297. for(int i = 0; i < para->user.user_count;i++)
  298. {
  299. if(strcmp(user_update->user,para->user.config[i].user_name) == 0)
  300. {
  301. md5_init(&ctx);
  302. md5_update(&ctx, (uint8_t*)user_update->old_password, strlen(user_update->old_password));
  303. md5_final(&ctx, digest);
  304. for (int k = 0; k < 16; k++) {
  305. sprintf(&output[k * 2], "%02x", digest[k]);
  306. }
  307. output[33] = '\0';
  308. if(strcmp(output,para->user.config[i].password_md5) == 0)
  309. {
  310. md5_init(&ctx);
  311. md5_update(&ctx, (uint8_t *)user_update->new_password, strlen(user_update->new_password));
  312. md5_final(&ctx, digest);
  313. for (int k = 0; k < 16; k++) {
  314. sprintf(&output[k * 2], "%02x", digest[k]);
  315. }
  316. output[33] = '\0';
  317. strcpy(para->user.config[i].password_md5,output);
  318. paras_user_save();
  319. }else
  320. {
  321. flag = USER_UPDATE_PASSERR;
  322. }
  323. break;
  324. }
  325. }
  326. uint8_t *data = (uint8_t *)(&hdr->data);
  327. hdr->magic = PKT_MAGIC;
  328. hdr->addr = 0;
  329. hdr->type = NEW_PKT_TYPE_USER;
  330. hdr->nack = 0;
  331. hdr->subtype = NEW_SUB_PKT_TYPE_USER_UPDATE;
  332. hdr->dlen = 1;
  333. *data = flag;
  334. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  335. ws_send(c, h->buf, xlen, 1);
  336. }
  337. static void send_login_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  338. {
  339. pkt_hdr_t *hdr=NULL;
  340. hdr = (pkt_hdr_t*)h->buf;
  341. uint8_t flag = 0;
  342. uint8_t *data = (uint8_t *)(&hdr->data);
  343. paras_data_t* para=paras_get();
  344. unsigned char digest[16]={0};
  345. char output[34] = {0};
  346. md5_ctx_t ctx={0};
  347. for(int i = 0; i < para->user.user_count;i++)
  348. {
  349. if(strcmp(ctrl->login.user,para->user.config[i].user_name) == 0)
  350. {
  351. md5_init(&ctx);
  352. md5_update(&ctx, (unsigned char *)ctrl->login.password, strlen(ctrl->login.password));
  353. md5_final(&ctx, digest);
  354. for (int k = 0; k < 16; k++) {
  355. sprintf(&output[k * 2], "%02x", digest[k]);
  356. }
  357. output[33] = '\0';
  358. if(strcmp(output,para->user.config[i].password_md5) == 0)
  359. {
  360. flag = 1;
  361. }else
  362. {
  363. flag = 2;
  364. }
  365. //printf("user=%s output: %s\n",ctrl->login.user,output);
  366. break;
  367. }
  368. }
  369. hdr->magic = PKT_MAGIC;
  370. hdr->addr = 0;
  371. hdr->type = MEW_PKT_TYPE_LOGIN;
  372. hdr->nack = 0;
  373. hdr->subtype = 0;
  374. hdr->dlen = 1;
  375. *data = flag;
  376. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  377. ws_send(c, h->buf, xlen, 1);
  378. }
  379. static void send_sys(web_handle_t *h, mg_conn_t *c)
  380. {
  381. time_t t=time(NULL);
  382. struct tm *tm=localtime(&t);
  383. paras_data_t* para=paras_get();
  384. pkt_hdr_t *hdr=NULL;
  385. hdr = (pkt_hdr_t*)h->buf;
  386. hdr->magic = PKT_MAGIC;
  387. hdr->addr = 0;
  388. hdr->type = NEW_PKT_TYPE_DEVICE_INFO;
  389. hdr->nack = 0;
  390. hdr->subtype = 0;
  391. web_device_info_t *data_info = (web_device_info_t *)(&hdr->data);
  392. memset(data_info,0,sizeof(web_device_info_t));
  393. sprintf(data_info->date,"%04d%/%02d/%02d",(tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  394. sprintf(data_info->time,"%02d%:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  395. data_info->zone = (fr_tz_get()/3600);
  396. strcpy(data_info->soft_version,SOFT_VERSION);
  397. strcpy(data_info->hard_version,SOFT_VERSION);
  398. data_info->chs = power_get_all()->chs;
  399. data_info->board_cnt = power_data_get_board_cnt();
  400. data_info->power_type = para->prod.type;
  401. hdr->dlen = sizeof(web_device_info_t);
  402. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  403. ws_send(c, h->buf, xlen, 1);
  404. }
  405. static void reboot_sys(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  406. {
  407. (void)h;
  408. (void)c;
  409. (void)ctrl;
  410. //system("reboot");
  411. NVIC_SystemReset();
  412. }
  413. static void send_sensor_info(web_handle_t *h, mg_conn_t *c)
  414. {
  415. pkt_hdr_t *hdr=NULL;
  416. hdr = (pkt_hdr_t*)h->buf;
  417. hdr->magic = PKT_MAGIC;
  418. hdr->addr = 0;
  419. hdr->type = NEW_PKT_TYPE_SENSOR;
  420. hdr->nack = 0;
  421. hdr->subtype = 0;
  422. web_sensor_info_t *sensor_info = (web_sensor_info_t *)(&hdr->data);
  423. sensor_all_t *sensor = sensor_get_data();
  424. memset(sensor_info,0,sizeof(web_sensor_info_t)*4);
  425. strcpy(sensor_info[0].name,sensor->data[0].info.name);
  426. sensor_info[0].status = sensor->data[0].info.status;
  427. sensor_info[0].value = sensor->data[0].val[0].value;
  428. sensor_info[0].v_max = sensor->data[0].val[0].thr.max;
  429. sensor_info[0].v_min = sensor->data[0].val[0].thr.min;
  430. sensor_info[0].v_max_wrn = sensor->data[0].val[0].s_alarm.max_up;
  431. sensor_info[0].v_min_wrn = sensor->data[0].val[0].s_alarm.min_down;
  432. strcpy(sensor_info[1].name,sensor->data[0].info.name);
  433. sensor_info[1].status = sensor->data[0].info.status;
  434. sensor_info[1].value = sensor->data[0].val[1].value;
  435. sensor_info[1].v_max = sensor->data[0].val[1].thr.max;
  436. sensor_info[1].v_min = sensor->data[0].val[1].thr.min;
  437. sensor_info[1].v_max_wrn = sensor->data[0].val[1].s_alarm.max_up;
  438. sensor_info[1].v_min_wrn = sensor->data[0].val[1].s_alarm.min_down;
  439. strcpy(sensor_info[2].name,sensor->data[1].info.name);
  440. sensor_info[2].status = sensor->data[1].info.status;
  441. sensor_info[2].value = sensor->data[1].val[0].value;
  442. sensor_info[2].v_max = sensor->data[1].val[0].thr.max;
  443. sensor_info[2].v_min = sensor->data[1].val[0].thr.min;
  444. sensor_info[2].v_max_wrn = sensor->data[1].val[0].s_alarm.max_up;
  445. sensor_info[2].v_min_wrn = sensor->data[1].val[0].s_alarm.min_down;
  446. strcpy(sensor_info[3].name,sensor->data[2].info.name);
  447. sensor_info[3].status = sensor->data[2].info.status;
  448. sensor_info[3].value = sensor->data[2].val[0].value;
  449. sensor_info[3].v_max = sensor->data[2].val[0].thr.max;
  450. sensor_info[3].v_min = sensor->data[2].val[0].thr.min;
  451. sensor_info[3].v_max_wrn = sensor->data[2].val[0].s_alarm.max_up;
  452. sensor_info[3].v_min_wrn = sensor->data[2].val[0].s_alarm.min_down;
  453. hdr->dlen = sizeof(web_sensor_info_t) * 4;
  454. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  455. ws_send(c, h->buf, xlen, 1);
  456. }
  457. static void send_power_info(web_handle_t *h, mg_conn_t *c)
  458. {
  459. pkt_hdr_t *hdr=NULL;
  460. hdr = (pkt_hdr_t*)h->buf;
  461. hdr->magic = PKT_MAGIC;
  462. hdr->addr = 0;
  463. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  464. hdr->nack = 0;
  465. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_INFO;
  466. info_new_t *power_info = (info_new_t *)(&hdr->data);
  467. power_handle_new_t *p_handle = power_get_all();
  468. int chn = p_handle->chs;
  469. //max translate 32
  470. for(int i = 0; i < chn;i++)
  471. {
  472. power_info[i] = p_handle->pch[i].info;
  473. }
  474. hdr->dlen = sizeof(info_new_t) * chn;
  475. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  476. ws_send(c, h->buf, xlen, 1);
  477. }
  478. static void send_power_all(web_handle_t *h, mg_conn_t *c)
  479. {
  480. pkt_hdr_t *hdr=NULL;
  481. hdr = (pkt_hdr_t*)h->buf;
  482. hdr->magic = PKT_MAGIC;
  483. hdr->addr = 0;
  484. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  485. hdr->nack = 0;
  486. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_ALL;
  487. power_t *power_all = (power_t *)(&hdr->data);
  488. power_handle_new_t *p_handle = power_get_all();
  489. power_all[0] = p_handle->total.all;
  490. for(int i =0;i < 3;i++)
  491. {
  492. power_all[i+1] = p_handle->total.all_l[i];
  493. }
  494. hdr->dlen = sizeof(power_t) * 4;
  495. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  496. ws_send(c, h->buf, xlen, 1);
  497. }
  498. static void send_power_thr(web_handle_t *h, mg_conn_t *c)
  499. {
  500. pkt_hdr_t *hdr=NULL;
  501. hdr = (pkt_hdr_t*)h->buf;
  502. hdr->magic = PKT_MAGIC;
  503. hdr->addr = 0;
  504. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  505. hdr->nack = 0;
  506. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_THR;
  507. power_handle_new_t *p_handle = power_get_all();
  508. thr_t *_data = (thr_t *)(&hdr->data);
  509. int chn = p_handle->chs;
  510. for(int i =0; i < chn;i++)
  511. {
  512. _data[i] = p_handle->pch[i].thr;
  513. }
  514. hdr->dlen = sizeof(thr_t) * chn;
  515. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  516. ws_send(c, h->buf, xlen, 1);
  517. }
  518. static void set_import_file_start(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  519. {
  520. if(import_file.file)
  521. {
  522. fclose(import_file.file);
  523. import_file.file = NULL;
  524. }
  525. pkt_hdr_t *hdr=NULL;
  526. hdr = (pkt_hdr_t*)h->buf;
  527. hdr->magic = PKT_MAGIC;
  528. hdr->addr = 0;
  529. hdr->type = NEW_PKT_TYPE_IMPORT_FILE;
  530. hdr->nack = 0;
  531. hdr->subtype = NEW_SUB_PKT_TYPE_IMPORT_FILE_SATRT;
  532. web_file_respone_t *res = (web_file_respone_t *)(&hdr->data);
  533. hdr->dlen = sizeof(web_file_respone_t);
  534. #if 1
  535. strcpy(import_file.name,ctrl->import_start.file_name);
  536. import_file.file = fopen(import_file.name,"w");
  537. hdr->dlen = sizeof(web_file_respone_t);
  538. if(!import_file.file)
  539. {
  540. res->flag_error = RES_ERR_FILE_OPEN;
  541. }else
  542. {
  543. res->flag_error = RES_NOERR;
  544. import_file.file_crc = ctrl->import_start.file_crc;
  545. import_file.current_chunk = 0;
  546. }
  547. #endif
  548. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  549. ws_send(c, h->buf, xlen, 1);
  550. }
  551. static void set_import_file_ing(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  552. {
  553. pkt_hdr_t *hdr=NULL;
  554. hdr = (pkt_hdr_t*)h->buf;
  555. hdr->magic = PKT_MAGIC;
  556. hdr->addr = 0;
  557. hdr->type = NEW_PKT_TYPE_IMPORT_FILE;
  558. hdr->nack = 0;
  559. hdr->subtype = NEW_SUB_PKT_TYPE_IMPORT_FILE_ING;
  560. web_file_respone_t *res = (web_file_respone_t *)(&hdr->data);
  561. hdr->dlen = sizeof(web_file_respone_t);
  562. #if 1
  563. if(import_file.file && (import_file.current_chunk == ctrl->import_ing.chunk))
  564. {
  565. uint32_t crc = crc32_buf((const void *)(ctrl->import_ing.data),ctrl->import_ing.lenth);
  566. if(crc == ctrl->import_ing.file_crc)
  567. {
  568. int n = fwrite(ctrl->import_ing.data,1,ctrl->import_ing.lenth,import_file.file);
  569. res->flag_error = RES_NOERR;
  570. import_file.current_chunk ++;
  571. }else
  572. {
  573. res->flag_error = RES_ERR_CHUNK_CRC;
  574. }
  575. }else
  576. {
  577. if(import_file.current_chunk != ctrl->import_ing.chunk){
  578. res->flag_error = RES_ERR_CHUNK;
  579. }else
  580. {
  581. res->flag_error = RES_ERR_FILE_OPEN;
  582. }
  583. }
  584. res->chunck = ctrl->import_ing.chunk;
  585. #endif
  586. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  587. ws_send(c, h->buf, xlen, 1);
  588. }
  589. static void set_import_file_end(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  590. {
  591. pkt_hdr_t *hdr=NULL;
  592. hdr = (pkt_hdr_t*)h->buf;
  593. hdr->magic = PKT_MAGIC;
  594. hdr->addr = 0;
  595. hdr->type = NEW_PKT_TYPE_IMPORT_FILE;
  596. hdr->nack = 0;
  597. hdr->subtype = NEW_SUB_PKT_TYPE_IMPORT_FILE_END;
  598. web_file_respone_t *res = (web_file_respone_t *)(&hdr->data);
  599. hdr->dlen = sizeof(web_file_respone_t);
  600. // fr_printf("file import end\r\n");
  601. //res->flag_error = RES_NOERR;
  602. #if 1
  603. uint32_t crc = 0;
  604. char buff[512] = {0};
  605. int n = 0;
  606. if(import_file.file)
  607. {
  608. fclose(import_file.file);
  609. //fseek(import_file.file,0,SEEK_SET);
  610. import_file.file = fopen(import_file.name,"r");
  611. while ((n = fread(buff, 1, sizeof(buff), import_file.file)) > 0)
  612. {
  613. crc = crc32_update(crc, buff, n);
  614. // fr_printf("crc=%08x\r\n",crc);
  615. }
  616. fr_printf("file import crc =%08x crc=%08x\r\n",import_file.file_crc,crc);
  617. if(crc == import_file.file_crc)
  618. {
  619. res->flag_error = RES_NOERR;
  620. }else
  621. {
  622. res->flag_error = RES_ERR_FILE_CRC;
  623. }
  624. }else
  625. {
  626. res->flag_error = RES_ERR_FILE_OPEN;
  627. }
  628. fclose(import_file.file);
  629. memset(&import_file,0,sizeof(import_file));
  630. #endif
  631. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  632. ws_send(c, h->buf, xlen, 1);
  633. }
  634. static void set_power_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  635. {
  636. (void)h;
  637. (void)c;
  638. power_handle_new_t *p_handle = power_get_all();
  639. uint8_t channle = ctrl->cnt_ctrl.chn;
  640. if(channle > p_handle->chs || ctrl == NULL)
  641. return;
  642. uint8_t saddr = p_handle->pch[channle].info.addr;
  643. uint8_t b_addr = p_handle->pch[channle].info.sch;
  644. p_handle->set_status(saddr,b_addr,ctrl->cnt_ctrl.status);
  645. }
  646. static void set_power_all_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  647. {
  648. power_handle_new_t *p_handle = power_get_all();
  649. p_handle->set_all_status(ctrl->all_ctrl.status);
  650. }
  651. static void set_power_consum_clear(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  652. {
  653. (void)h;
  654. (void)c;
  655. power_handle_new_t *p_handle = power_get_all();
  656. uint8_t channle = ctrl->clear.chn;
  657. if(channle > p_handle->chs || ctrl == NULL)
  658. return;
  659. uint8_t saddr = p_handle->pch[channle].info.addr;
  660. uint8_t b_addr = p_handle->pch[channle].info.sch;
  661. p_handle->set_consumer_clear(saddr,b_addr);
  662. }
  663. static void set_power_delay(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  664. {
  665. (void)h;
  666. (void)c;
  667. power_handle_new_t *p_handle = power_get_all();
  668. uint8_t channle = ctrl->delay.chn;
  669. if(channle > p_handle->chs || ctrl == NULL)
  670. return;
  671. uint8_t saddr = p_handle->pch[channle].info.addr;
  672. uint8_t b_addr = p_handle->pch[channle].info.sch;
  673. uint8_t open = ctrl->delay.open;
  674. uint8_t close = ctrl->delay.close;
  675. p_handle->set_delay(saddr,b_addr,open,close);
  676. }
  677. static void set_power_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  678. {
  679. (void)h;
  680. (void)c;
  681. power_handle_new_t *p_handle = power_get_all();
  682. uint8_t channle = ctrl->thr.chn;
  683. thr_t *thr = &ctrl->thr.thr;
  684. if(channle > p_handle->chs || ctrl == NULL)
  685. return;
  686. uint8_t saddr = p_handle->pch[channle].info.addr;
  687. uint8_t b_addr = p_handle->pch[channle].info.sch;
  688. p_handle->set_thr(saddr,b_addr,thr);
  689. }
  690. static void set_power_batch_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  691. {
  692. (void)h;
  693. (void)c;
  694. power_handle_new_t *p_handle = power_get_all();
  695. thr_t *thr = &ctrl->thr.thr;
  696. if(ctrl == NULL)
  697. return;
  698. for(int i=0; i < 32;i++)
  699. {
  700. if(p_handle->board[i].flag)
  701. {
  702. p_handle->set_batch_thr(i,thr);
  703. }
  704. }
  705. }
  706. static void send_power_data(web_handle_t *h, mg_conn_t *c,uint8_t id)
  707. {
  708. pkt_hdr_t *hdr=NULL;
  709. hdr = (pkt_hdr_t*)h->buf;
  710. hdr->magic = PKT_MAGIC;
  711. hdr->addr = 0;
  712. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  713. hdr->nack = 0;
  714. hdr->subtype = id;
  715. power_t *power_data = (power_t *)(&hdr->data);
  716. power_handle_new_t *p_handle = power_get_all();
  717. if(id>=3)
  718. return;
  719. int chn = p_handle->chs;
  720. for(int i =0; i < chn;i++)
  721. {
  722. power_data[i] = p_handle->pch[i].power[id];
  723. }
  724. hdr->dlen = sizeof(power_t) * chn;
  725. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  726. ws_send(c, h->buf, xlen, 1);
  727. }
  728. static void set_sensor_thr(web_handle_t *h,mg_conn_t *c,uint8_t type,wed_set_t *ctrl)
  729. {
  730. (void)h;
  731. (void)c;
  732. sensor_data_t *data_temp = NULL;
  733. sensor_th_t *sensor_temp = NULL;
  734. int32_t vmax = ctrl->sensor.v_max *100;
  735. int32_t vmin = ctrl->sensor.v_min *100;
  736. switch(type)
  737. {
  738. case NEW_SUB_PKT_TYPE_HUMI:
  739. {
  740. data_temp = &sensor_get_data()->data[0];
  741. sensor_temp = &paras_get()->sensor.sens[0];
  742. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  743. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  744. sensor_temp->th_max_1 = vmax;
  745. sensor_temp->th_min_1 = vmin;
  746. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  747. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  748. }
  749. break;
  750. case NEW_SUB_PKT_TYPE_TEMP:
  751. {
  752. data_temp = &sensor_get_data()->data[0];
  753. sensor_temp = &paras_get()->sensor.sens[0];
  754. data_temp->val[1].thr.en.th_sen_max_en = vmax ? 1 : 0;
  755. data_temp->val[1].thr.en.th_sen_min_en = vmin ? 1 : 0;
  756. sensor_temp->th_max_2 = vmax;
  757. sensor_temp->th_min_2 = vmin;
  758. data_temp->val[1].thr.max = ctrl->sensor.v_max;
  759. data_temp->val[1].thr.min = ctrl->sensor.v_min;
  760. }
  761. break;
  762. case NEW_SUB_PKT_TYPE_SMOKE:
  763. {
  764. data_temp = &sensor_get_data()->data[1];
  765. sensor_temp = &paras_get()->sensor.sens[1];
  766. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  767. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  768. sensor_temp->th_max_1 = vmax;
  769. sensor_temp->th_min_1 = vmin;
  770. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  771. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  772. }
  773. break;
  774. case NEW_SUB_PKT_TYPE_CO2:
  775. {
  776. data_temp = &sensor_get_data()->data[2];
  777. sensor_temp = &paras_get()->sensor.sens[2];
  778. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  779. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  780. sensor_temp->th_max_1 = vmax;
  781. sensor_temp->th_min_1 = vmin;
  782. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  783. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  784. }
  785. break;
  786. default:
  787. return;
  788. }
  789. paras_save();
  790. }
  791. static void send_net_config(web_handle_t *h, mg_conn_t *c)
  792. {
  793. pkt_hdr_t *hdr=NULL;
  794. hdr = (pkt_hdr_t*)h->buf;
  795. hdr->magic = PKT_MAGIC;
  796. hdr->addr = 0;
  797. hdr->type = NEW_PKT_TYPE_NETWORK;
  798. hdr->nack = 0;
  799. hdr->subtype = 0;
  800. network_data_t *net = (network_data_t *)(&hdr->data);
  801. memset(net,0,sizeof(network_data_t));
  802. paras_data_t* para=paras_get();
  803. //*net = para->netwk;
  804. net_get_ip(net);
  805. hdr->dlen = sizeof(network_data_t);
  806. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  807. ws_send(c, h->buf, xlen, 1);
  808. }
  809. static void send_rs485_config(web_handle_t *h, mg_conn_t *c)
  810. {
  811. pkt_hdr_t *hdr=NULL;
  812. hdr = (pkt_hdr_t*)h->buf;
  813. hdr->magic = PKT_MAGIC;
  814. hdr->addr = 0;
  815. hdr->type = NEW_PKT_TYPE_RS485;
  816. hdr->nack = 0;
  817. hdr->subtype = 0;
  818. modbus_data_t *md = (modbus_data_t *)(&hdr->data);
  819. memset(md,0,sizeof(modbus_data_t));
  820. paras_data_t* para=paras_get();
  821. *md = para->cas;
  822. hdr->dlen = sizeof(modbus_data_t);
  823. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  824. ws_send(c, h->buf, xlen, 1);
  825. }
  826. static void send_snmp_config(web_handle_t *h, mg_conn_t *c)
  827. {
  828. pkt_hdr_t *hdr=NULL;
  829. hdr = (pkt_hdr_t*)h->buf;
  830. hdr->magic = PKT_MAGIC;
  831. hdr->addr = 0;
  832. hdr->type = NEW_PKT_TYPE_SNMP;
  833. hdr->nack = 0;
  834. hdr->subtype = 0;
  835. snmp_data_t *snmp = (snmp_data_t *)(&hdr->data);
  836. memset(snmp,0,sizeof(snmp_data_t));
  837. paras_data_t* para=paras_get();
  838. *snmp = para->snmp;
  839. hdr->dlen = sizeof(snmp_data_t);
  840. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  841. ws_send(c, h->buf, xlen, 1);
  842. }
  843. static void web_set_network(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  844. {
  845. (void)h;
  846. (void)c;
  847. web_net_t *net = &ctrl->net;
  848. if(net->mode == 0 || net->mode == 1)
  849. {
  850. if(net->mode == 0)
  851. {
  852. if(sys_ip_check(net->dns1) && sys_ip_check(net->dns2));
  853. {
  854. net_ipaddr_set(net);
  855. }
  856. }else
  857. {
  858. if(sys_ip_check(net->dns1)
  859. && sys_ip_check(net->dns2)
  860. && sys_ip_check(net->gateway)
  861. && sys_ip_check(net->ipaddr)
  862. && sys_ip_check(net->mask))
  863. {
  864. net_ipaddr_set(net);
  865. }
  866. }
  867. }
  868. }
  869. static void web_set_rs485(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  870. {
  871. (void)h;
  872. (void)c;
  873. web_rs485_t *rs485 = &ctrl->rs485;
  874. #if SUPPORT_CASCADE_QMODBUS
  875. cascade_reset_new(rs485->mode,rs485->addr,rs485->baud);
  876. #endif
  877. }
  878. static void web_snmp_set(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  879. {
  880. (void)h;
  881. (void)c;
  882. web_snmp_t *snmp= &ctrl->snmp;
  883. paras_data_t* para=paras_get();
  884. snmp_data_t *p_snmp = &para->snmp;
  885. int len1 = strlen(snmp->publics);
  886. int len2 = strlen(snmp->privates);
  887. if(snmp->trapmode == 1)
  888. {
  889. if(sys_ip_check(snmp->nms_ip))
  890. {
  891. if(len1>0 && len2 > 0)
  892. {
  893. *p_snmp = *snmp;
  894. paras_save();
  895. snmp_strap_set();
  896. }
  897. }
  898. }else
  899. {
  900. if(len1>0 && len2 > 0)
  901. {
  902. strcpy(p_snmp->publics,snmp->publics);
  903. strcpy(p_snmp->privates,snmp->privates);
  904. p_snmp->trapmode = snmp->trapmode;
  905. paras_save();
  906. snmp_strap_set();
  907. }
  908. }
  909. }
  910. static void web_set_ntp(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  911. {
  912. (void)h;
  913. (void)c;
  914. #if 1
  915. web_device_t *device= &ctrl->device;
  916. paras_data_t* para=paras_get();
  917. para->sys.tzone = device->zone;
  918. fr_tz_set(device->zone * 3600);
  919. int lenth = strlen(device->date_time);
  920. for(int i = 0; i < lenth;i++)
  921. {
  922. if(device->date_time[i] <'0' || device->date_time[i] > '9')
  923. {
  924. device->date_time[i]=' ';
  925. }
  926. }
  927. uint32_t year = 0;
  928. uint32_t month = 0;
  929. uint32_t day = 0;
  930. uint32_t hour = 0;
  931. uint32_t min = 0;
  932. uint32_t sec = 0;
  933. sscanf(device->date_time,"%d %d %d %d %d %d",&year,&month,&day,&hour,&min,&sec);
  934. set_date_time(year,month,day,hour,min,sec);
  935. paras_save();
  936. #endif
  937. }
  938. static void send_his_alarm(web_handle_t *h, mg_conn_t *c)
  939. {
  940. #if 0
  941. pkt_hdr_t *hdr=NULL;
  942. hdr = (pkt_hdr_t*)h->buf;
  943. hdr->magic = PKT_MAGIC;
  944. hdr->addr = 0;
  945. hdr->type = NEW_PKT_TYPE_WANNING;
  946. hdr->nack = 0;
  947. hdr->subtype = 0;
  948. uint16_t *count = (uint16_t *)(&hdr->data[0]);
  949. *count = wanning_get_count();
  950. waning_info_t *wanning = (waning_info_t *)(&hdr->data[2]);
  951. wanning_get(wanning, count);
  952. hdr->dlen = (*count)*sizeof(waning_info_t)+2;
  953. uint32_t xlen = (*count)*sizeof(waning_info_t)+sizeof(pkt_hdr_t) + 2;
  954. ws_send(c, h->buf, xlen, 1);
  955. #endif
  956. }
  957. static int ws_handle_new(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
  958. {
  959. int r=0;
  960. if (!is_ws(c)) {
  961. return -1;
  962. }
  963. if(hdr->magic!=PKT_MAGIC) {
  964. LOGD("___ magic: 0x%x is wrong!, correct is: 0x%x\n", hdr->magic, PKT_MAGIC);
  965. return -1;
  966. }
  967. wed_set_t *ctrl = (wed_set_t*)(hdr->data);
  968. switch(hdr->type) {
  969. case NEW_PKT_TYPE_DEVICE_INFO:
  970. {
  971. if(hdr->dlen == 0)
  972. send_sys(h,c);
  973. else
  974. {
  975. reboot_sys(h,c,ctrl);
  976. }
  977. }
  978. break;
  979. case NEW_PKT_TYPE_ELE_INFO:
  980. {
  981. switch (hdr->subtype)
  982. {
  983. case NEW_SUB_PKT_TYPE_ELE_DATA_ALL:
  984. {
  985. send_power_all(h,c);
  986. }
  987. break;
  988. case NEW_SUB_PKT_TYPE_ELE_DATA_INFO:
  989. {
  990. send_power_info(h,c);
  991. }
  992. break;
  993. case NEW_SUB_PKT_TYPE_ELE_DATA_L1:
  994. {
  995. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L1);
  996. }
  997. break;
  998. case NEW_SUB_PKT_TYPE_ELE_DATA_L2:
  999. {
  1000. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L2);
  1001. }
  1002. break;
  1003. case NEW_SUB_PKT_TYPE_ELE_DATA_L3:
  1004. {
  1005. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L3);
  1006. }
  1007. break;
  1008. case NEW_SUB_PKT_TYPE_ELE_DATA_THR:
  1009. {
  1010. if(hdr->dlen == 0)
  1011. send_power_thr(h,c);
  1012. else
  1013. {
  1014. set_power_thr(h,c,ctrl);
  1015. }
  1016. }
  1017. break;
  1018. case NEW_SUB_PKT_TYPE_ELE_DELAY:
  1019. {
  1020. if(hdr->dlen > 0) {
  1021. set_power_delay(h,c,ctrl);
  1022. }
  1023. }
  1024. break;
  1025. case NEW_SUB_PKT_TYPE_ELE_CTRL:
  1026. {
  1027. if(hdr->dlen > 0) {
  1028. set_power_ctrl(h,c,ctrl);
  1029. }
  1030. }
  1031. break;
  1032. case NEW_SUB_PKT_TYPE_ELE_ALL_CTRL:
  1033. {
  1034. if(hdr->dlen > 0) {
  1035. set_power_all_ctrl(h,c,ctrl);
  1036. }
  1037. }
  1038. break;
  1039. case NEW_SUB_PKT_TYPE_ELE_CLEAR_CONSUMER:
  1040. {
  1041. if(hdr->dlen > 0) {
  1042. set_power_consum_clear(h,c,ctrl);
  1043. }
  1044. }
  1045. break;
  1046. case NEW_SUB_PKT_TYPE_ELE_BATCH:
  1047. {
  1048. if(hdr->dlen > 0)
  1049. {
  1050. set_power_batch_thr(h,c,ctrl);
  1051. }
  1052. }
  1053. break;
  1054. default:
  1055. break;
  1056. }
  1057. }
  1058. break;
  1059. case NEW_PKT_TYPE_SENSOR:
  1060. {
  1061. if(hdr->dlen == 0)
  1062. {
  1063. send_sensor_info(h,c);
  1064. }else
  1065. {
  1066. set_sensor_thr(h,c,hdr->subtype,ctrl);
  1067. }
  1068. }
  1069. break;
  1070. case NEW_PKT_TYPE_NETWORK:
  1071. {
  1072. if(hdr->dlen == 0)
  1073. {
  1074. send_net_config(h,c);
  1075. }else
  1076. {
  1077. web_set_network(h,c,ctrl);
  1078. }
  1079. }
  1080. break;
  1081. case NEW_PKT_TYPE_RS485:
  1082. {
  1083. if(hdr->dlen == 0)
  1084. {
  1085. send_rs485_config(h,c);
  1086. }else
  1087. {
  1088. web_set_rs485(h,c,ctrl);
  1089. }
  1090. }
  1091. break;
  1092. case NEW_PKT_TYPE_SNMP:
  1093. {
  1094. if(hdr->dlen == 0)
  1095. {
  1096. send_snmp_config(h,c);
  1097. }else
  1098. {
  1099. web_snmp_set(h,c,ctrl);
  1100. }
  1101. }
  1102. break;
  1103. case NEW_PKT_TYPE_NTP:
  1104. {
  1105. web_set_ntp(h,c,ctrl);
  1106. }
  1107. break;
  1108. case NEW_PKT_TYPE_WANNING:
  1109. {
  1110. if(hdr->dlen == 0)
  1111. {
  1112. send_his_alarm(h,c);
  1113. }else
  1114. {
  1115. #if 1
  1116. switch(hdr->subtype)
  1117. {
  1118. case NEW_SUB_PKT_TYPE_WANNING_CLEAN:
  1119. //wanning_clean();
  1120. break;
  1121. case NEW_SUB_PKT_TYPE_WANNING_SOUND_LIGHT_CLEAN:
  1122. {
  1123. led_reset();
  1124. beep_reset();
  1125. }
  1126. break;
  1127. }
  1128. #endif
  1129. }
  1130. }
  1131. break;
  1132. case MEW_PKT_TYPE_LOGIN:
  1133. {
  1134. send_login_func(h,c,ctrl);
  1135. }
  1136. break;
  1137. case NEW_PKT_TYPE_USER:
  1138. {
  1139. if(hdr->dlen == 0)
  1140. {
  1141. send_user_info(h,c);
  1142. }else
  1143. {
  1144. switch(hdr->subtype)
  1145. {
  1146. case NEW_SUB_PKT_TYPE_USER_ADD:
  1147. {
  1148. send_add_user_func(h,c,ctrl);
  1149. }
  1150. break;
  1151. case NEW_SUB_PKT_TYPE_USER_UPDATE:
  1152. {
  1153. send_user_update_func(h,c,ctrl);
  1154. }
  1155. break;
  1156. case NEW_SUB_PKT_TYPE_USER_DELETE:
  1157. {
  1158. send_user_delete_func(h,c,ctrl);
  1159. }
  1160. break;
  1161. default:
  1162. break;
  1163. }
  1164. }
  1165. }
  1166. break;
  1167. case NEW_PKT_TYPE_IMPORT_FILE:
  1168. {
  1169. switch (hdr->subtype)
  1170. {
  1171. case NEW_SUB_PKT_TYPE_IMPORT_FILE_SATRT:
  1172. {
  1173. set_import_file_start(h,c,ctrl);
  1174. }
  1175. break;
  1176. case NEW_SUB_PKT_TYPE_IMPORT_FIRM_ING:
  1177. {
  1178. set_import_file_ing(h,c,ctrl);
  1179. }
  1180. break;
  1181. case NEW_SUB_PKT_TYPE_IMPORT_FILE_END:
  1182. {
  1183. set_import_file_end(h,c,ctrl);
  1184. }
  1185. break;
  1186. default:
  1187. break;
  1188. }
  1189. }
  1190. break;
  1191. case NEW_PKT_TYPE_IMPORT_FIRM:
  1192. {
  1193. switch (hdr->subtype)
  1194. {
  1195. case NEW_SUB_PKT_TYPE_IMPORT_FIRM_START:
  1196. {
  1197. }
  1198. break;
  1199. case NEW_SUB_PKT_TYPE_IMPORT_FIRM_ING:
  1200. {
  1201. }
  1202. break;
  1203. case NEW_SUB_PKT_TYPE_IMPORT_FIRM_END:
  1204. {
  1205. }
  1206. break;
  1207. }
  1208. }
  1209. break;
  1210. default:
  1211. break;
  1212. }
  1213. return 0;
  1214. }
  1215. static void http_fn(mg_conn_t *c, int ev, void *ev_data)
  1216. {
  1217. int r,flag=0;
  1218. web_handle_t *h=&webHandle;
  1219. mg_stream_t s={c,ev,ev_data};
  1220. // LOGD("connect --------%lx\n",c);
  1221. #ifdef USE_MG716
  1222. if (ev == MG_EV_HTTP_MSG) {
  1223. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
  1224. for(int i=0; i<h->cnt; i++) {
  1225. if (h->fn[i].f && h->fn[i].uri && mg_match(hm->uri, mg_str(h->fn[i].uri), NULL)) {
  1226. h->fn[i].f(&s); flag = 1; break;
  1227. }
  1228. }
  1229. if(flag == 0)
  1230. {
  1231. if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
  1232. mg_ws_upgrade(c, hm, NULL);
  1233. } else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
  1234. // Serve REST response
  1235. mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
  1236. } else {
  1237. struct mg_http_serve_opts opts = {.root_dir = h->rootDir};
  1238. mg_http_serve_dir(c, hm, &opts);
  1239. }
  1240. }
  1241. }
  1242. else if(ev == MG_EV_ACCEPT) {
  1243. if (c->fn_data) {
  1244. mg_tls_init(c, &h->tls);
  1245. }
  1246. // paras_data_t *p=paras_get();
  1247. // ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  1248. }
  1249. else if(ev == MG_EV_WS_MSG) {
  1250. struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
  1251. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data.buf;
  1252. ws_handle_new(h, hdr, c);
  1253. }else if(ev == MG_EV_CLOSE)
  1254. {
  1255. // mg_close_conn(c);
  1256. }
  1257. #else
  1258. if (ev == MG_EV_HTTP_REQUEST) {
  1259. mg_serve_http(c, (struct http_message *)ev_data, h->opts);
  1260. }
  1261. else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
  1262. paras_data_t *p=paras_get();
  1263. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  1264. set_timer(c, TIMER_INTERVAL);
  1265. }
  1266. else if(ev == MG_EV_WEBSOCKET_FRAME) {
  1267. struct websocket_message *wm = (struct websocket_message *) ev_data;
  1268. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  1269. ws_handle(h, hdr, c);
  1270. }
  1271. else if(ev==MG_EV_TIMER) {
  1272. }
  1273. #endif
  1274. }
  1275. static char ack_str[2048] = {0};
  1276. static void overChannelStatusMonitoring(void* conn)
  1277. {
  1278. cJSON *cjson=NULL;
  1279. channel_power_request req = {0};
  1280. memset(ack_str,0,sizeof(ack_str));
  1281. mg_stream_t *s=(mg_stream_t*)conn;
  1282. struct mg_http_message *hm=s->ev_data;
  1283. char *rx_body_buf=(char*)hm->body.buf;
  1284. char *rx_Head_buf = (char*)hm->head.buf;
  1285. power_handle_new_t *p_handle = power_get_all();
  1286. wed_set_t ctrl = {0};
  1287. cjson = json_to_chn_pwr_status_monitor(rx_body_buf,&req);
  1288. if(cjson == NULL)
  1289. return;
  1290. if(strcmp(req.type,"chnInfo")==0)
  1291. {
  1292. if(req.pro_ch_id > 0)
  1293. {
  1294. uint8_t channle = req.pro_ch_id - 1;
  1295. if(channle > p_handle->chs)
  1296. return;
  1297. power_ch_new_t *pch = &p_handle->pch[channle];
  1298. int ph = 0;
  1299. if(p_handle->product->type == PDU_AC_I3O1_H || p_handle->product->type == PDU_AC_I3O1)
  1300. {
  1301. ph=pch->info.pse.ph-1;
  1302. uint8_t wanning = 0;
  1303. uint32_t ph_all_wanning = *(uint32_t*) (&pch->info.alarm);
  1304. wanning = (ph_all_wanning >> (ph*8)) & 0XFF; //get phse wanning
  1305. wanning_type_t wan = *(wanning_type_t *)(&wanning);
  1306. sprintf(ack_str,CHANNEL_SINGLE_RES_TYPE,pch->info.name,req.pro_ch_id,pch->power[ph].voltage,
  1307. pch->power[ph].current,pch->power[ph].power,
  1308. pch->power[ph].app_power,pch->power[ph].freq,
  1309. pch->power[ph].factor,pch->power[ph].consump,
  1310. pch->thr.v_upper,pch->thr.v_lower,
  1311. pch->thr.c_upper,pch->thr.p_upper,
  1312. pch->thr.w_upper,
  1313. pch->info.open_delay,pch->info.close_delay,pch->info.status,
  1314. wan.v_upper,wan.v_lower,wan.c_upper,wan.p_upper,wan.w_upper,
  1315. g_product_t_ac_type_str[ph]);
  1316. }else
  1317. {
  1318. sprintf(ack_str,CHANNEL_SINGLE_RES_TYPE,pch->info.name,req.pro_ch_id,pch->power[0].voltage,
  1319. pch->power[0].current,pch->power[0].power,
  1320. pch->power[0].app_power,pch->power[0].freq,
  1321. pch->power[0].factor,pch->power[0].consump,
  1322. pch->thr.v_upper,pch->thr.v_lower,
  1323. pch->thr.c_upper,pch->thr.p_upper,
  1324. pch->thr.w_upper,
  1325. pch->info.open_delay,pch->info.close_delay,
  1326. pch->info.status,
  1327. pch->info.alarm.l1_v_upper,
  1328. pch->info.alarm.l1_v_lower,pch->info.alarm.l1_c_upper,
  1329. pch->info.alarm.l1_p_upper,pch->info.alarm.l1_w_upper,
  1330. "");
  1331. }
  1332. }
  1333. }else if(strcmp(req.type,"chnWanInfo")==0)
  1334. {
  1335. //CHANEL_WANNING_INFO_TYPE
  1336. if(req.pro_ch_id > 0)
  1337. {
  1338. uint8_t channle = req.pro_ch_id - 1;
  1339. if(channle > p_handle->chs)
  1340. return;
  1341. power_ch_new_t *pch = &p_handle->pch[channle];
  1342. int ph = 0;
  1343. if(p_handle->product->type == PDU_AC_I3O1_H || p_handle->product->type == PDU_AC_I3O1)
  1344. {
  1345. uint8_t wanning = 0;
  1346. uint32_t ph_all_wanning = *(uint32_t*) (&pch->info.alarm);
  1347. ph=pch->info.pse.ph-1;
  1348. wanning = (ph_all_wanning >> (ph*8)) & 0XFF; //get phse wanning
  1349. wanning_type_t wan = *(wanning_type_t *)(&wanning);
  1350. sprintf(ack_str,CHANEL_WANNING_INFO_TYPE,pch->info.name,req.pro_ch_id,
  1351. wan.v_upper,wan.v_lower,wan.c_upper,wan.p_upper,wan.w_upper,g_product_t_ac_type_str[ph]);
  1352. }else
  1353. {
  1354. sprintf(ack_str,CHANEL_WANNING_INFO_TYPE,pch->info.name,req.pro_ch_id,pch->info.alarm.l1_v_upper,
  1355. pch->info.alarm.l1_v_lower,pch->info.alarm.l1_c_upper,
  1356. pch->info.alarm.l1_p_upper,pch->info.alarm.l1_w_upper,"");
  1357. }
  1358. }
  1359. }
  1360. else if(strcmp(req.type,"open")==0 || strcmp(req.type,"close")==0)
  1361. {
  1362. ctrl.cnt_ctrl.status = strcmp(req.type,"open")==0 ? 1 : 0;
  1363. ctrl.cnt_ctrl.chn = req.pro_ch_id - 1;
  1364. set_power_ctrl(NULL,NULL,&ctrl);
  1365. sprintf(ack_str,SUCESS_RSP);
  1366. }else if(strcmp(req.type,"setInterval")==0)
  1367. {
  1368. ctrl.delay.open = req.open;
  1369. ctrl.delay.close = req.close;
  1370. ctrl.delay.chn = req.pro_ch_id -1;
  1371. set_power_delay(NULL,NULL,&ctrl);
  1372. sprintf(ack_str,SUCESS_RSP);
  1373. }else if(strcmp(req.type,"setThreshold")==0)
  1374. {
  1375. ctrl.thr.chn = req.pro_ch_id - 1;
  1376. power_ch_new_t *pch = &p_handle->pch[ctrl.thr.chn];
  1377. ctrl.thr.thr = pch->thr;
  1378. ctrl.thr.thr.v_upper = req.v_max;
  1379. ctrl.thr.thr.v_lower = req.v_min;
  1380. ctrl.thr.thr.c_upper = req.i_max;
  1381. ctrl.thr.thr.p_upper = req.p_max;
  1382. ctrl.thr.thr.w_upper = req.w_max;
  1383. set_power_thr(NULL,NULL,&ctrl);
  1384. sprintf(ack_str,SUCESS_RSP);
  1385. }else if(strcmp(req.type,"clearConsumer")==0)
  1386. {
  1387. ctrl.clear.chn = req.pro_ch_id - 1;
  1388. set_power_consum_clear(NULL,NULL,&ctrl);
  1389. sprintf(ack_str,SUCESS_RSP);
  1390. }
  1391. cJSON_Delete(cjson);
  1392. http_reply(conn, 200, ack_str);
  1393. }
  1394. static void overallStatusMonitoring(void* conn)
  1395. {
  1396. cJSON *cjson=NULL;
  1397. all_power_request req = {0};
  1398. memset(ack_str,0,sizeof(ack_str));
  1399. mg_stream_t *s=(mg_stream_t*)conn;
  1400. struct mg_http_message *hm=s->ev_data;
  1401. char *rx_body_buf=(char*)hm->body.buf;
  1402. char *rx_Head_buf = (char*)hm->head.buf;
  1403. wed_set_t ctrl = {0};
  1404. power_handle_new_t *p_handle = power_get_all();
  1405. cjson = json_to_all_pwr_status_monitor(rx_body_buf,&req);
  1406. if(cjson == NULL)
  1407. return;
  1408. if(strcmp(req.type,"allInfo")==0)
  1409. {
  1410. if(req.ph_id== 0)
  1411. {
  1412. sprintf(ack_str,ALL_INFO_RES_TYPE,req.ph_id,p_handle->total.all.voltage,
  1413. p_handle->total.all.current,
  1414. p_handle->total.all.power,
  1415. p_handle->total.all.app_power,
  1416. p_handle->total.all.factor,
  1417. p_handle->total.all.consump,
  1418. "ALL");
  1419. }else
  1420. {
  1421. sprintf(ack_str,ALL_INFO_RES_TYPE,req.ph_id,p_handle->total.all_l[req.ph_id-1].voltage,
  1422. p_handle->total.all_l[req.ph_id-1].current,
  1423. p_handle->total.all_l[req.ph_id-1].power,
  1424. p_handle->total.all_l[req.ph_id-1].app_power,
  1425. p_handle->total.all_l[req.ph_id-1].factor,
  1426. p_handle->total.all_l[req.ph_id-1].consump,
  1427. g_product_t_ac_type_str[req.ph_id-1]);
  1428. }
  1429. }else if(strcmp(req.type,"open")==0 || strcmp(req.type,"close")==0)
  1430. {
  1431. int status = strcmp(req.type,"open")==0 ? 1 : 0;
  1432. p_handle->set_all_status(status);
  1433. sprintf(ack_str,SUCESS_RSP);
  1434. }else if(strcmp(req.type,"setBatchThreshold")==0)
  1435. {
  1436. *(uint16_t*)(&ctrl.thr.thr.en) = 0xFFFF;
  1437. ctrl.thr.thr.v_upper = req.v_max;
  1438. ctrl.thr.thr.v_lower = req.v_min;
  1439. ctrl.thr.thr.c_upper = req.i_max;
  1440. ctrl.thr.thr.p_upper = req.p_max;
  1441. ctrl.thr.thr.w_upper = req.w_max;
  1442. set_power_batch_thr(NULL,NULL,&ctrl);
  1443. sprintf(ack_str,SUCESS_RSP);
  1444. }
  1445. cJSON_Delete(cjson);
  1446. http_reply(conn, 200, ack_str);
  1447. }
  1448. static void sensorStatusMonitoring(void* conn)
  1449. {
  1450. cJSON *cjson=NULL;
  1451. sensor_request req = {0};
  1452. memset(ack_str,0,sizeof(ack_str));
  1453. mg_stream_t *s=(mg_stream_t*)conn;
  1454. struct mg_http_message *hm=s->ev_data;
  1455. char *rx_body_buf=(char*)hm->body.buf;
  1456. sensor_all_t *sensor = sensor_get_data();
  1457. wed_set_t ctrl = {0};
  1458. cjson = json_to_sensor_status_monitor(rx_body_buf,&req);
  1459. if(cjson == NULL)
  1460. return;
  1461. //SENSOR_INFO_RES_TYPE
  1462. if(strcmp(req.type,"sensorInfo")==0)
  1463. {
  1464. switch(req.sensor_id)
  1465. {
  1466. case NEW_SUB_PKT_TYPE_HUMI:
  1467. {
  1468. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1469. "Humidity",sensor->data[0].val[0].value,
  1470. sensor->data[0].val[0].thr.max,sensor->data[0].val[0].thr.min,
  1471. sensor->data[0].val[0].s_alarm.max_up,sensor->data[0].val[0].s_alarm.min_down,
  1472. sensor->data[0].info.status);
  1473. }
  1474. break;
  1475. case NEW_SUB_PKT_TYPE_TEMP:
  1476. {
  1477. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1478. "Temperature",sensor->data[0].val[1].value,
  1479. sensor->data[0].val[1].thr.max,sensor->data[0].val[1].thr.min,
  1480. sensor->data[0].val[1].s_alarm.max_up,sensor->data[0].val[1].s_alarm.min_down,
  1481. sensor->data[0].info.status);
  1482. }
  1483. break;
  1484. case NEW_SUB_PKT_TYPE_SMOKE:
  1485. {
  1486. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1487. "Smoke",sensor->data[1].val[0].value,
  1488. sensor->data[1].val[0].thr.max,sensor->data[1].val[0].thr.min,
  1489. sensor->data[1].val[0].s_alarm.max_up,sensor->data[1].val[0].s_alarm.min_down,
  1490. sensor->data[1].info.status);
  1491. }
  1492. break;
  1493. case NEW_SUB_PKT_TYPE_CO2:
  1494. {
  1495. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1496. "CO2",sensor->data[2].val[0].value,
  1497. sensor->data[2].val[0].thr.max,sensor->data[2].val[0].thr.min,
  1498. sensor->data[2].val[0].s_alarm.max_up,sensor->data[2].val[0].s_alarm.min_down,
  1499. sensor->data[2].info.status);
  1500. }
  1501. break;
  1502. default:
  1503. break;
  1504. }
  1505. }else if(strcmp(req.type,"sensorSet")==0)
  1506. {
  1507. switch(req.sensor_id)
  1508. {
  1509. case NEW_SUB_PKT_TYPE_HUMI:
  1510. case NEW_SUB_PKT_TYPE_TEMP:
  1511. case NEW_SUB_PKT_TYPE_SMOKE:
  1512. case NEW_SUB_PKT_TYPE_CO2:
  1513. {
  1514. ctrl.sensor.v_max = req.s_max;
  1515. ctrl.sensor.v_min = req.s_min;
  1516. set_sensor_thr(NULL,NULL,req.sensor_id,&ctrl);
  1517. sprintf(ack_str,SUCESS_RSP);
  1518. }
  1519. break;
  1520. }
  1521. }
  1522. cJSON_Delete(cjson);
  1523. http_reply(conn, 200, ack_str);
  1524. }
  1525. static int webSetCallback(void)
  1526. {
  1527. httpAddCallback("/pdu/channelStatusMonitoring", overChannelStatusMonitoring);
  1528. httpAddCallback("/pdu/overallStatusMonitoring", overallStatusMonitoring);
  1529. httpAddCallback("/pdu/sensorStatusMonitoring", sensorStatusMonitoring);
  1530. // httpAddCallback("/pdu/alarmProtect", alarmProtect);
  1531. // httpAddCallback("/pdu/alarmProtect", equipmentMintenance);
  1532. return 0;
  1533. }
  1534. static void web_thread(void *arg)
  1535. {
  1536. #if 0
  1537. mg_conn_t *nc;
  1538. const char *http_addr="http://[::]:80";
  1539. const char *https_addr="https://[::]:443";
  1540. // thread_handle_t *th=(thread_handle_t*)arg;
  1541. // web_handle_t *h=(web_handle_t*)th->attr->arg;
  1542. strcpy(h->rootDir, "/web");
  1543. #ifdef USE_MG716
  1544. mg_log_set(MG_LL_ERROR);
  1545. mg_mgr_init(&h->mgr);
  1546. //mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  1547. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  1548. MG_ERROR(("cannot listen on %s\n", http_addr));
  1549. }
  1550. #else
  1551. mg_mgr_init(&h->mgr, NULL);
  1552. nc = mg_bind(&h->mgr, "80", http_fn);
  1553. strcpy(h->rootDir, "/nor/web");
  1554. mg_set_protocol_http_websocket(nc);
  1555. h->opts.document_root = h->rootDir;
  1556. h->opts.enable_directory_listing = "yes";
  1557. #endif
  1558. webSetCallback();
  1559. while(th->quit==0) {
  1560. mg_mgr_poll(&h->mgr, 50);
  1561. }
  1562. mg_mgr_free(&h->mgr);
  1563. #endif
  1564. }
  1565. int web_init(void)
  1566. {
  1567. //list_cfg_t lc={0,0,10};
  1568. web_handle_t *h=&webHandle;
  1569. memset(h, 0, sizeof(web_handle_t));
  1570. //h->list = list_init(&lc);
  1571. h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
  1572. h->buf = (char*)malloc(h->buflen);
  1573. mg_conn_t *nc;
  1574. const char *http_addr="http://[::]:80";
  1575. const char *https_addr="https://[::]:443";
  1576. // thread_handle_t *th=(thread_handle_t*)arg;
  1577. // web_handle_t *h=(web_handle_t*)th->attr->arg;
  1578. strcpy(h->rootDir, "/");
  1579. #ifdef USE_MG716
  1580. mg_log_set(MG_LL_ERROR);
  1581. mg_mgr_init(&h->mgr);
  1582. //mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  1583. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  1584. MG_ERROR(("cannot listen on %s\n", http_addr));
  1585. }
  1586. #else
  1587. mg_mgr_init(&h->mgr, NULL);
  1588. nc = mg_bind(&h->mgr, "80", http_fn);
  1589. strcpy(h->rootDir, "/nor/web");
  1590. mg_set_protocol_http_websocket(nc);
  1591. h->opts.document_root = h->rootDir;
  1592. h->opts.enable_directory_listing = "yes";
  1593. #endif
  1594. webSetCallback();
  1595. //thread_start(THREAD_ID_WEB, web_thread, h);
  1596. return 0;
  1597. }
  1598. extern EventGroupHandle_t xWatchdogEventGroup;
  1599. #define TASK_WEB_BIT (1 << 0)
  1600. void web_query(void)
  1601. {
  1602. crc32_init_table();
  1603. while(1)
  1604. {
  1605. mg_mgr_poll(&webHandle.mgr, 50);
  1606. xEventGroupSetBits(xWatchdogEventGroup, TASK_WEB_BIT);
  1607. }
  1608. mg_mgr_free(&webHandle.mgr);
  1609. }
  1610. int web_post(int type, void *data, int len)
  1611. {
  1612. struct mg_connection *c;
  1613. web_handle_t *h=&webHandle;
  1614. //return list_append(h->list, type, data, len);
  1615. }