cascade.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268
  1. #include "cascade.h"
  2. #include "common.h"
  3. #include "elog.h"
  4. #include "modbus_handle.h"
  5. #include "cfg.h"
  6. #include "thread.h"
  7. #include "switch_ctrl.h"
  8. #include "paras.h"
  9. #if 0
  10. #define LOGD log_d
  11. #define LOGE log_e
  12. #define LOGW log_w
  13. #else
  14. #define LOGD printf
  15. #define LOGE printf
  16. #define LOGW printf
  17. #endif
  18. #define MB_MAX_LEN 250
  19. //#define MB_PARA_SIM
  20. //#define SLAVE_DATA_SIM
  21. #ifdef MB_PARA_SIM
  22. #define MB_MASTER 0
  23. #endif
  24. int cur_dev_addr=1;
  25. static cascade_handle_t casHandle={.inited=0};
  26. static void* cmd_thread(void *arg);
  27. //////////////////////////////////////////////////
  28. static inline GlobalDeviceManager* get_dm(void)
  29. {
  30. return &__globalDeviceManage;
  31. }
  32. static inline GlobalDeviceManager* get_dm2(void)
  33. {
  34. return &__globalDeviceManage2;
  35. }
  36. static inline ModbusInfo_t *get_mb(void)
  37. {
  38. #ifdef MB_PARA_SIM
  39. static ModbusInfo_t mbinfo={
  40. #if (MB_MASTER==1)
  41. .product_modbus_type=0,
  42. #else
  43. .product_modbus_type=1,
  44. #endif
  45. .product_modbus_addr=1,
  46. .product_modbus_baud=115200,
  47. };
  48. return &mbinfo;
  49. #else
  50. return &get_dm()->_global_device_info->_gmodbus_info;
  51. #endif
  52. }
  53. static int slave_init(cascade_handle_t *cas)
  54. {
  55. int i;
  56. for(i=0; i<=CASCADE_MAX; i++) {
  57. cas->slaves[i].addr = -1;
  58. cas->slaves[i].err = 0;
  59. }
  60. return 0;
  61. }
  62. static int slave_add(cascade_handle_t *cas, int addr)
  63. {
  64. if(addr<=0) {
  65. return -1;
  66. }
  67. cas->slaves[addr].addr = addr;
  68. cas->slaves[addr].err = 0;
  69. return 0;
  70. }
  71. static int slave_rm(cascade_handle_t *cas, int addr)
  72. {
  73. if(addr<=0) {
  74. return -1;
  75. }
  76. cas->slaves[addr].addr = -1;
  77. cas->slaves[addr].err = 0;
  78. return 0;
  79. }
  80. static int slave_cnt(cascade_handle_t *cas)
  81. {
  82. int i,cnt=0;
  83. for(i=1; i<=CASCADE_MAX; i++) {
  84. if(cas->slaves[i].addr>0) {
  85. cnt++;
  86. }
  87. }
  88. return cnt;
  89. }
  90. static slave_t* slave_get(cascade_handle_t *cas, int addr)
  91. {
  92. return &cas->slaves[addr];
  93. }
  94. static int slave_find(cascade_handle_t *cas, int addr)
  95. {
  96. if(cas->slaves[addr].addr>0) {
  97. return 1;
  98. }
  99. return 0;
  100. }
  101. static int slave_get_info(cascade_handle_t *cas, int hardread)
  102. {
  103. int i,j,r;
  104. uint8_t type,maxChn;
  105. GlobalPowerManger *tmp=NULL;
  106. GlobalDeviceManager *dm=get_dm();
  107. board_info_t *info=&cas->info;
  108. info->cnt = 0;
  109. #ifdef SLAVE_DATA_SIM
  110. for(j=1; j<10; j++) {
  111. info->channel[info->cnt].addr = 1;
  112. info->channel[info->cnt].type = 3;
  113. info->channel[info->cnt].ch_addr = 4;
  114. info->cnt++;
  115. }
  116. #else
  117. if(hardread) {
  118. for(i=1; i<MAX_CHN_COUNT; i++) {
  119. r = g_switch_get_type(&dm->_globalRelaySampManger, i, &type, &maxChn,
  120. dm->_global_device_info->product_pwr_type);
  121. if(r==0) {
  122. for(j=0; j<maxChn; j++) {
  123. info->channel[info->cnt].addr = i;
  124. info->channel[info->cnt].type = type;
  125. info->channel[info->cnt].ch_addr = j+1;
  126. info->cnt++;
  127. }
  128. }
  129. }
  130. }
  131. else {
  132. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  133. {
  134. if(tmp->product_saddr==0) {
  135. continue;
  136. }
  137. info->channel[info->cnt].addr = tmp->product_saddr;
  138. info->channel[info->cnt].type = tmp->product_ch_type;
  139. info->channel[info->cnt].ch_addr = tmp->product_ch_addr;
  140. info->cnt++;
  141. }
  142. }
  143. #endif
  144. LOGD("___ slave_get_info, cnt: %d\n", info->cnt);
  145. return 0;
  146. }
  147. static int get_ac_info(int nCh, int nType, power_info_t *info)
  148. {
  149. GlobalDeviceManager *dm=get_dm();
  150. GlobalTreeACManager *tmp = NULL;
  151. list_for_each_entry(tmp, &dm->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  152. {
  153. if (tmp->product_ch_id != nCh ||tmp->product_ph_type!=nType){
  154. continue;
  155. }
  156. info->pwrinfo = tmp->_PowerInfo;
  157. //info->start_delay = tmp->product_ch_start_delay;
  158. //info->stop_delay = tmp->product_ch_start_delay;
  159. return 0;
  160. }
  161. return -1;
  162. }
  163. static int slave_get_ch_data(cascade_handle_t *cas)
  164. {
  165. GlobalDeviceManager *dm=get_dm();
  166. GlobalPowerManger *tmp=NULL;
  167. power_info_t *power=cas->chInfo.power;
  168. cas->chInfo.cnt=0;
  169. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  170. {
  171. if(tmp) {
  172. power[cas->chInfo.cnt].pwrinfo = tmp->_PowerInfo;
  173. power[cas->chInfo.cnt].start_delay = tmp->product_ch_start_delay;
  174. power[cas->chInfo.cnt].stop_delay = tmp->product_ch_stop_delay;
  175. cas->chInfo.cnt++;
  176. }
  177. }
  178. return 0;
  179. }
  180. static int get_pwr_info(board_info_t *info, int chId, GlobalPowerManger *power)
  181. {
  182. int i;
  183. GlobalPowerManger *tmp=NULL;
  184. GlobalDeviceManager *dm=get_dm();
  185. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  186. {
  187. if(tmp->product_ch_id==chId) {
  188. power->product_id = dm->_global_device_info->product_id;
  189. power->product_ch_id = tmp->product_ch_id;
  190. strcpy(power->product_ch_name, tmp->product_ch_name);
  191. power->product_ch_type = tmp->product_ch_type;
  192. power->product_ch_status = tmp->product_ch_status;
  193. power->product_ch_start_delay = tmp->product_ch_start_delay;
  194. power->product_ch_stop_delay = tmp->product_ch_stop_delay;
  195. return 0;
  196. }
  197. }
  198. return -1;
  199. }
  200. static int slave_save(cascade_handle_t *cas)
  201. {
  202. int r;
  203. GlobalPowerManger power;
  204. GlobalDeviceManager *dm=get_dm();
  205. if(cas->cmd.obj!=OBJ_CHANNEL) {
  206. return -1;
  207. }
  208. r = get_pwr_info(cas, cas->cmd.chId, &power);
  209. if(r) {
  210. LOGE("____ get_pwr_info failed\n");
  211. return -1;
  212. }
  213. r = dev_update_power_manage_genera_info(dm->db, dm->_global_device_info->product_id, cas->cmd.chId, &power);
  214. return r;
  215. }
  216. /////////////////////////////////////////////////////////////////////////////////////////
  217. static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32_t baud)
  218. {
  219. int r;
  220. r = g_modbus_init(&cas->m, path, baud, type, addr, type?"master":"slave", 0);
  221. if(r==0 && type>0) {
  222. if(type>0) {
  223. LOGD("___ set slave addr: %d\n", addr);
  224. cas->addr = addr;
  225. g_modbus_set_slave(&cas->m, addr);
  226. cascade_slave_map_init(cas);
  227. }
  228. else {
  229. cas->addr = 0;
  230. }
  231. cas->inited = 1;
  232. }
  233. else {
  234. LOGE("___ mb init failed, %s\n", modbus_strerror(errno));
  235. }
  236. return 0;
  237. }
  238. static int mb_deinit(cascade_handle_t *cas)
  239. {
  240. g_modbus_deinit(&cas->m);
  241. return 0;
  242. }
  243. static int _mb_scan(cascade_handle_t *cas, int addr)
  244. {
  245. uint16_t tmp;
  246. return g_modbus_read_x_reg(&cas->m, addr, CASCADE_REG_SCAN, 1, &tmp);
  247. }
  248. static int _mb_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
  249. {
  250. int r;
  251. r = g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
  252. if(r<0) {
  253. cas->slaves[addr].err++;
  254. if(cas->slaves[addr].err>ERR_MAX) {
  255. slave_rm(cas, addr);
  256. }
  257. }
  258. else {
  259. cas->slaves[addr].err = 0;
  260. }
  261. return r;
  262. }
  263. static int _mb_write(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
  264. {
  265. int r;
  266. r = g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
  267. if(r<0) {
  268. cas->slaves[addr].err++;
  269. if(cas->slaves[addr].err>ERR_MAX) {
  270. slave_rm(cas, addr);
  271. }
  272. }
  273. else {
  274. cas->slaves[addr].err = 0;
  275. }
  276. return r;
  277. }
  278. static int _mb_recv(cascade_handle_t *cas, uint8_t *buf)
  279. {
  280. return g_modbus_receive(&cas->m, buf);
  281. }
  282. static int _mb_reply(cascade_handle_t *cas, uint8_t *buff, int reqlen, modbus_mapping_t *map)
  283. {
  284. return g_modbus_reply(&cas->m, buff, reqlen, map);
  285. }
  286. ////////////////////////////////////////////////////////////
  287. static void print_data(uint8_t *data, int len)
  288. {
  289. int i;
  290. for(i=0; i<len; i++) {
  291. LOGD("0x%02x, ", data[i]);
  292. }
  293. LOGD("\n");
  294. }
  295. static void print_cmd(char *s, cmd_data_t *cmd)
  296. {
  297. int i;
  298. LOGD("__%s__ cmd.obj: %d\n", s, cmd->obj);
  299. LOGD("__%s__ cmd.cmd: %d\n", s, cmd->cmd);
  300. LOGD("__%s__ cmd.chId: %d\n", s, cmd->chId);
  301. //LOGD("__%s__ cmd.time_s: %s\n", s, cmd->time_s);
  302. //LOGD("__%s__ cmd.time_e: %s\n", s, cmd->time_e);
  303. LOGD("\n");
  304. }
  305. static void memswap(uint8_t *buf, int len)
  306. {
  307. int i;
  308. uint8_t tmp;
  309. for(i=0; i<len; i+=2) {
  310. tmp = buf[i];
  311. buf[i] = buf[i+1];
  312. buf[i+1] = tmp;
  313. }
  314. }
  315. static void memcpy_swap(uint8_t *dst, uint8_t *src, int len)
  316. {
  317. int i;
  318. for(i=0; i<len; i+=2) {
  319. dst[i] = src[i+1];
  320. dst[i+1] = src[i];
  321. }
  322. }
  323. static int print_hdr(char *s, mb_hdr_t *h)
  324. {
  325. LOGD("____%s___ h.addr: %d\n", s, h->addr);
  326. LOGD("____%s___ h.func: %d\n", s, h->func);
  327. LOGD("____%s___ h.reg: %d\n", s, h->reg);
  328. LOGD("____%s___ h.regcnt: %d\n", s, h->regcnt);
  329. LOGD("____%s___ h.dlen: %d\n", s, h->dlen);
  330. LOGD("____%s___ h.data: %d\n", s, h->data);
  331. LOGD("\n");
  332. return 0;
  333. }
  334. static int mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
  335. {
  336. h->addr = data[0];
  337. h->func = data[1];
  338. h->reg = data[2]<<8 | data[3];
  339. h->regcnt = data[4]<<8 | data[5];
  340. h->dlen = 0;
  341. h->data = NULL;
  342. if(datalen>8) {
  343. h->dlen = data[6];
  344. h->data = data+7;
  345. memswap(h->data, h->dlen+h->dlen%2);
  346. }
  347. //print_hdr("sss", h);
  348. return 0;
  349. }
  350. static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
  351. {
  352. int r=0,finish=0;
  353. int xlen,rlen=0,oncelen=MB_MAX_LEN;
  354. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  355. if(d->dlen<=0) {
  356. //LOGE("___ mb_read dlen %d is wrong!\n", d->dlen);
  357. return -1;
  358. }
  359. //LOGD("___ mb_read dlen: %d\n", d->dlen);
  360. while(1) {
  361. if(rlen+oncelen>d->dlen) {
  362. xlen = d->dlen-rlen;
  363. }
  364. else {
  365. xlen = oncelen;
  366. }
  367. xlen += xlen%2;
  368. r = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
  369. if(r<0) {
  370. LOGE("___ _mb_read failed, %s, rlen: %d\n", modbus_strerror(errno), rlen);
  371. return -1;
  372. }
  373. if(rlen+r*2>=d->dlen) {
  374. xlen = d->dlen-rlen;
  375. finish = 1;
  376. }
  377. else {
  378. xlen = r*2;
  379. }
  380. memcpy((char*)d->data+rlen, buff, xlen);
  381. rlen += xlen;
  382. if(finish) {
  383. break;
  384. }
  385. }
  386. return 0;
  387. }
  388. static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
  389. {
  390. int r=0;
  391. int xlen,wlen=0,oncelen=MB_MAX_LEN;
  392. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  393. if(d->dlen<=0) {
  394. //LOGE("___ mb_write dlen %d is wrong!\n", d->dlen);
  395. return -1;
  396. }
  397. //LOGD("___ mb_write dlen: %d\n", d->dlen);
  398. while(1) {
  399. if(wlen+oncelen>d->dlen) {
  400. xlen = d->dlen-wlen;
  401. }
  402. else {
  403. xlen = oncelen;
  404. }
  405. xlen += xlen%2;
  406. memcpy(buff, d->data+wlen, xlen);
  407. r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
  408. if(r<0) {
  409. LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d, %s\n", addr, CASCADE_REG_WRITE, xlen/2, modbus_strerror(errno));
  410. return -1;
  411. }
  412. if(wlen+r*2>=d->dlen) {
  413. break;
  414. }
  415. else {
  416. xlen = r*2;
  417. }
  418. wlen += xlen;
  419. }
  420. return 0;
  421. }
  422. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  423. {
  424. int r=0;
  425. r = mb_write(cas, addr, wd);
  426. if(r==0) {
  427. r = mb_read(cas, addr, rd);
  428. }
  429. return r;
  430. }
  431. static int mb_receive(cascade_handle_t *cas)
  432. {
  433. int r=-1,rc,rlen=0;
  434. mb_hdr_t h;
  435. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  436. static int sendlen=0;
  437. cmd_data_t *cmd=NULL;
  438. rc = _mb_recv(cas, buff);
  439. if(rc<0) {
  440. return -1;
  441. }
  442. mb_hdr(buff, rc, &h);
  443. #if 1
  444. //do not know why slave can receive all address data
  445. if(h.addr>0 && h.addr!=cas->addr) {
  446. return -1;
  447. }
  448. #endif
  449. switch(h.reg) {
  450. case CASCADE_REG_SCAN:
  451. {
  452. r = _mb_reply(cas, buff, rc, cas->map2);
  453. }
  454. break;
  455. case CASCADE_REG_WRITE:
  456. {
  457. if(h.data) {
  458. cmd = (cmd_data_t*)h.data;
  459. if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
  460. cas->cmd = *cmd;
  461. }
  462. sendlen = 0;
  463. }
  464. switch(cmd->cmd) {
  465. case CASCADE_CMD_OPEN:
  466. case CASCADE_CMD_CLOSE:
  467. {
  468. cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
  469. if(pcmd) {
  470. *pcmd = *cmd;
  471. thread_start_simp(cmd_thread, pcmd, 4*MB);
  472. }
  473. }
  474. break;
  475. case CASCADE_CMD_SAVE:
  476. case CASCADE_CMD_SAVE3:
  477. {
  478. slave_save(cas);
  479. }
  480. break;
  481. }
  482. r = _mb_reply(cas, buff, rc, cas->map2);
  483. }
  484. break;
  485. case CASCADE_REG_READ:
  486. {
  487. cmd = &cas->cmd;
  488. //LOGD("____ CASCADE_REG_READ %d\n", cmd->cmd);
  489. switch(cmd->cmd) {
  490. case CASCADE_CMD_GET_INFO:
  491. {
  492. LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
  493. slave_get_info(cas, 0); //hardread will cost long time
  494. memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->info+sendlen, h.regcnt*2);
  495. }
  496. break;
  497. case CASCADE_CMD_QUERY_CH:
  498. {
  499. LOGD("___ slave CASCADE_CMD_QUERY_CH\n");
  500. slave_get_ch_data(cas);
  501. memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->chInfo)+sendlen, h.regcnt*2);
  502. }
  503. break;
  504. case CASCADE_CMD_QUERY_VOL:break;
  505. case CASCADE_CMD_QUERY_CUR:break;
  506. case CASCADE_CMD_QUERY_PWR:break;
  507. case CASCADE_CMD_QUERY_PWRQ:break;
  508. case CASCADE_CMD_QUERY_HIS:break;
  509. case CASCADE_CMD_QUERY_TOTAL:break;
  510. case CASCADE_CMD_QUERY_TOTAL_PWR:break;
  511. }
  512. r = _mb_reply(cas, buff, rc, cas->map2);
  513. if(r>0) {
  514. sendlen += h.regcnt*2;
  515. //LOGD("____ slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
  516. }
  517. }
  518. break;
  519. default:
  520. {
  521. Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
  522. LOGD("___ slave XXXXXXXXXXX\n");
  523. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  524. cascade_slave_read(cas, h.reg, h.regcnt);
  525. }
  526. else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
  527. cascade_slave_write(cas, h.reg, h.regcnt);
  528. }
  529. r = _mb_reply(cas, buff, rc, cas->map);
  530. }
  531. }
  532. return r ;
  533. }
  534. /////////////////////////////////////////////////////////////////////////
  535. static int master_scan(cascade_handle_t *cas)
  536. {
  537. int i,r=0 ;
  538. uint16_t tmp[10];
  539. if(cas->scanAddr>CASCADE_MAX) {
  540. cas->scanAddr = 1;
  541. }
  542. if(!slave_find(cas, cas->scanAddr)) {
  543. r = _mb_scan(cas, cas->scanAddr);
  544. if(r>0) {
  545. LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
  546. slave_add(cas, cas->scanAddr);
  547. }
  548. else {
  549. //LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
  550. }
  551. }
  552. cas->scanAddr++;
  553. //print_slave(cas);
  554. return 0;
  555. }
  556. static void power_init(void)
  557. {
  558. int nGroups=18,chn=1;
  559. GlobalDeviceManager *dm=get_dm();
  560. GlobalDeviceManager *dm2=get_dm2();
  561. dm2->_global_device_info = (GlobalDeviceInfo*)malloc(sizeof(GlobalDeviceInfo));
  562. dm2->_global_device_info->product_pwr_type = SmartPDU_AC;
  563. dm2->_global_device_info->product_id = 1;
  564. //dm2->_global_device_info->product_type_id = 2;
  565. strcpy(dm2->_global_device_info->product_name, dm->_global_device_info->product_name);
  566. strcpy(dm2->_global_device_info->product_number, dm->_global_device_info->product_number);
  567. strcpy(dm2->_global_device_info->product_status, dm->_global_device_info->product_status);
  568. INIT_LIST_HEAD(&dm2->_globalPowerManger.list);
  569. }
  570. static int power_clear(cascade_handle_t *cas)
  571. {
  572. GlobalPowerManger *pos,*tmp=NULL;
  573. GlobalDeviceManager *dm2=get_dm2();
  574. if(list_empty(&dm2->_globalPowerManger.list)) {
  575. return -1;
  576. }
  577. #if 0
  578. list_for_each_entry(tmp,&dm2->_globalPowerManger.list,list)
  579. {
  580. list_del(&tmp->list);
  581. free(tmp);
  582. }
  583. #else
  584. list_for_each_entry_safe(pos,tmp,&dm2->_globalPowerManger.list,list)
  585. {
  586. list_del(&pos->list);
  587. free(pos);
  588. }
  589. #endif
  590. return 0;
  591. }
  592. static int power_add(cascade_handle_t *cas)
  593. {
  594. int i,j,nGroups=18,chn=1;
  595. GlobalDeviceManager *dm2=get_dm2();
  596. GlobalPowerManger* pm=NULL;
  597. board_info_t *info=&cas->info;
  598. LOGD("____ master add channel to the list, cnt: %d\n", info->cnt);
  599. cascade_lock();
  600. power_clear(cas);
  601. for(i=0; i<info->cnt; i++) {
  602. pm = (GlobalPowerManger*)calloc(1, sizeof(GlobalPowerManger));
  603. if(!pm) {
  604. return -1;
  605. }
  606. pm->product_id = dm2->_global_device_info->product_id;
  607. pm->product_saddr = info->channel[i].addr;
  608. pm->product_ch_id = i+1;
  609. pm->product_ch_addr = info->channel[i].ch_addr;
  610. sprintf(pm->product_ch_name,"CH%d",pm->product_ch_id);
  611. pm->product_ch_type = info->channel[i].type;
  612. pm->product_ch_status = 0;
  613. pm->product_ch_start_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  614. pm->product_ch_stop_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  615. list_add_tail(&pm->list,&dm2->_globalPowerManger.list);
  616. chn++;
  617. }
  618. cascade_unlock();
  619. return 0;
  620. }
  621. static int power_all_update(cascade_handle_t *cas)
  622. {
  623. GlobalPowerManger *tmp=NULL;
  624. GlobalDeviceManager *dm2=get_dm2();
  625. int type=cas->allInfo.type;
  626. //power_info_t *power=cas->chInfo.power;
  627. if(list_empty(&dm2->_globalPowerManger.list)) {
  628. return -1;
  629. }
  630. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  631. {
  632. if(tmp) {
  633. }
  634. }
  635. return 0;
  636. }
  637. static int power_ch_update(cascade_handle_t *cas)
  638. {
  639. int cnt=0;
  640. GlobalPowerManger *tmp=NULL;
  641. GlobalDeviceManager *dm2=get_dm2();
  642. power_info_t *power=cas->chInfo.power;
  643. if(cas->chInfo.cnt==0 || list_empty(&dm2->_globalPowerManger.list)) {
  644. LOGE("___ chInfo.cnt is 0\n");
  645. return -1;
  646. }
  647. //LOGD("___ chInfo.info[0].status: %d\n", power[0].pwrinfo.status);
  648. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  649. {
  650. tmp->_PowerInfo = power[cnt].pwrinfo;
  651. tmp->product_ch_start_delay = power[cnt].start_delay;
  652. tmp->product_ch_stop_delay = power[cnt].stop_delay;
  653. cnt++;
  654. }
  655. return 0;
  656. }
  657. static void print_sensor(char *s, sensor_data_t *ss)
  658. {
  659. LOGD("__%s__ ss.type: %d\n", s, ss->type);
  660. LOGD("__%s__ ss.addr: %d\n", s, ss->addr);
  661. LOGD("__%s__ ss.voltage: %f\n", s, ss->pwr.voltage);
  662. LOGD("__%s__ ss.current: %f\n", s, ss->pwr.current);
  663. LOGD("__%s__ ss.power: %f\n", s, ss->pwr.power);
  664. LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
  665. LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
  666. LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
  667. LOGD("__%s__ ss.status: %d\n", s, ss->pwr.status);
  668. LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
  669. LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
  670. LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
  671. LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
  672. LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
  673. LOGD("\n");
  674. }
  675. #define VALUE_OF(m,a,b) ((m[a]<<16)+m[b])
  676. static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
  677. {
  678. uint32_t offset = 6000;
  679. uint32_t value = 0 ;
  680. uint16_t temp[100];
  681. int r,cnt = sizeof(sensor_ori_t)/2;
  682. r = _mb_read(cas, addr, offset, temp, cnt);
  683. if(r!=cnt) {
  684. LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
  685. return -1;
  686. }
  687. ss->type = temp[0];
  688. ss->addr = temp[1];
  689. ss->pwr.voltage = VALUE_OF(temp,3,2)/1000.0;
  690. ss->pwr.current = VALUE_OF(temp,5,4)/1000.0;
  691. ss->pwr.power = VALUE_OF(temp,7,6)/1000.0;
  692. ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
  693. ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
  694. ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
  695. ss->pwr.status = temp[20];
  696. ss->temprature = VALUE_OF(temp,15,14)/1000.0;
  697. ss->humidity = VALUE_OF(temp,17,16)/1000.0;
  698. ss->warning = VALUE_OF(temp,19,18)/1000.0;
  699. ss->sensor_status = temp[21];
  700. //print_sensor("11", ss);
  701. return 0;
  702. }
  703. #define REGS(x) (((x)+(x)%2)/2)
  704. static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
  705. {
  706. int i,r;
  707. GlobalPowerManger *tmp=NULL;
  708. GlobalDeviceManager *dm=get_dm();
  709. GlobalDeviceManager *dm2=get_dm2();
  710. GlobalDeviceInfo *dev=&dm2->_global_device_info;
  711. data_t rdata,wdata;
  712. if(cur_dev_addr==0) {
  713. return -1;
  714. }
  715. switch(cmd->cmd) {
  716. case CASCADE_CMD_OPEN:
  717. case CASCADE_CMD_CLOSE:
  718. case CASCADE_CMD_SAVE:
  719. case CASCADE_CMD_SAVE3:
  720. {
  721. LOGD("____ master CMD: %d\n", cmd->cmd);
  722. wdata.dlen = sizeof(cmd_data_t);
  723. wdata.data = (uint8_t*)cmd;
  724. r = mb_write(cas, cur_dev_addr, &wdata);
  725. }
  726. break;
  727. case CASCADE_CMD_GET_INFO:
  728. {
  729. wdata.dlen = sizeof(cmd_data_t);
  730. wdata.data = (uint8_t*)cmd;
  731. rdata.dlen = 1;
  732. rdata.data = (uint8_t*)&cas->info.cnt;
  733. LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
  734. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  735. if(r==0) {
  736. LOGD("______cas->info.cnt: %d\n", cas->info.cnt);
  737. rdata.dlen = sizeof(cas->info.cnt);
  738. rdata.data = (uint8_t*)&cas->info;
  739. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  740. if(r==0) {
  741. power_add(cas);
  742. }
  743. }
  744. else {
  745. LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
  746. }
  747. }
  748. break;
  749. default:
  750. cas->cmd = *cmd;
  751. r = 0;
  752. }
  753. return r;
  754. }
  755. static int master_query(cascade_handle_t *cas)
  756. {
  757. int i,r;
  758. GlobalPowerManger *tmp=NULL;
  759. GlobalDeviceManager *dm2=get_dm2();
  760. GlobalDeviceInfo *dev=dm2->_global_device_info;
  761. cmd_data_t *cmd=&cas->cmd;
  762. data_t rdata,wdata;
  763. if(cur_dev_addr==0) {
  764. return -1;
  765. }
  766. wdata.dlen = sizeof(*cmd);
  767. wdata.data = (uint8_t*)cmd;
  768. switch(cmd->cmd) {
  769. case CASCADE_CMD_QUERY_CH:
  770. {
  771. //LOGD("____ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->info.cnt);
  772. if(cas->info.cnt==0) {
  773. return -1;
  774. }
  775. cas->chInfo.cnt = 0;
  776. rdata.dlen = sizeof(uint8_t)+sizeof(power_info_t)*cas->info.cnt;
  777. rdata.data = (uint8_t*)&cas->chInfo;
  778. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  779. if(r==0) {
  780. power_ch_update(cas);
  781. }
  782. else {
  783. LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
  784. }
  785. }
  786. break;
  787. case CASCADE_CMD_QUERY_VOL:
  788. {
  789. if(cmd->obj==OBJ_CHANNEL) {
  790. //rdata.dlen = sizeof(chInfo);
  791. //rdata.data = (uint8_t*)&chInfo;
  792. }
  793. else if(cmd->obj==OBJ_OVERALL) {
  794. //rdata.dlen = sizeof(chInfo);
  795. //rdata.data = (uint8_t*)&chInfo;
  796. }
  797. else {
  798. return -1;
  799. }
  800. }
  801. break;
  802. case CASCADE_CMD_QUERY_CUR:
  803. {
  804. if(cmd->obj==OBJ_CHANNEL) {
  805. //rdata.dlen = sizeof(chInfo);
  806. //rdata.data = (uint8_t*)&chInfo;
  807. }
  808. else if(cmd->obj==OBJ_OVERALL) {
  809. //rdata.dlen = sizeof(chInfo);
  810. //rdata.data = (uint8_t*)&chInfo;
  811. }
  812. else {
  813. return -1;
  814. }
  815. }
  816. break;
  817. case CASCADE_CMD_QUERY_PWR:
  818. {
  819. if(cmd->obj==OBJ_CHANNEL) {
  820. //rdata.dlen = sizeof(chInfo);
  821. //rdata.data = (uint8_t*)&chInfo;
  822. }
  823. else if(cmd->obj==OBJ_OVERALL) {
  824. //rdata.dlen = sizeof(chInfo);
  825. //rdata.data = (uint8_t*)&chInfo;
  826. }
  827. else {
  828. return -1;
  829. }
  830. }
  831. break;
  832. case CASCADE_CMD_QUERY_PWRQ:
  833. {
  834. if(cmd->obj==OBJ_CHANNEL) {
  835. //rdata.dlen = sizeof(chInfo);
  836. //rdata.data = (uint8_t*)&chInfo;
  837. }
  838. else if(cmd->obj==OBJ_OVERALL) {
  839. //rdata.dlen = sizeof(chInfo);
  840. //rdata.data = (uint8_t*)&chInfo;
  841. }
  842. else {
  843. return -1;
  844. }
  845. }
  846. break;
  847. case CASCADE_CMD_QUERY_HIS:
  848. {
  849. if(cmd->obj==OBJ_CHANNEL) {
  850. //rdata.dlen = sizeof(chInfo);
  851. //rdata.data = (uint8_t*)&chInfo;
  852. }
  853. else if(cmd->obj==OBJ_OVERALL) {
  854. //rdata.dlen = sizeof(chInfo);
  855. //rdata.data = (uint8_t*)&chInfo;
  856. }
  857. else {
  858. return -1;
  859. }
  860. }
  861. break;
  862. case CASCADE_CMD_QUERY_TOTAL:
  863. {
  864. if(cmd->obj==OBJ_CHANNEL) {
  865. //rdata.dlen = sizeof(chInfo);
  866. //rdata.data = (uint8_t*)&chInfo;
  867. }
  868. else if(cmd->obj==OBJ_OVERALL) {
  869. //rdata.dlen = sizeof(chInfo);
  870. //rdata.data = (uint8_t*)&chInfo;
  871. }
  872. else {
  873. return -1;
  874. }
  875. }
  876. break;
  877. case CASCADE_CMD_QUERY_TOTAL_PWR:
  878. {
  879. if(cmd->obj==OBJ_CHANNEL) {
  880. //rdata.dlen = sizeof(chInfo);
  881. //rdata.data = (uint8_t*)&chInfo;
  882. }
  883. else if(cmd->obj==OBJ_OVERALL) {
  884. //rdata.dlen = sizeof(chInfo);
  885. //rdata.data = (uint8_t*)&chInfo;
  886. }
  887. else {
  888. return -1;
  889. }
  890. }
  891. break;
  892. default:
  893. LOGD("____ master query cmd: %d\n", cmd->cmd);
  894. return -1;
  895. }
  896. return r;
  897. }
  898. static int slave_receive(cascade_handle_t *cas)
  899. {
  900. return mb_receive(cas);
  901. }
  902. static void* cascade_thread(void *arg)
  903. {
  904. int r;
  905. thread_handle_t *h=(thread_handle_t*)arg;
  906. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  907. ModbusInfo_t *info=get_mb();
  908. LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
  909. while(h->quit==0) {
  910. if(info->product_modbus_type==0) { //主模
  911. r = master_query(cas);
  912. sleep(1);
  913. }
  914. else { //从模式,等待主设备发起数据请�?
  915. r = slave_receive(cas);
  916. }
  917. }
  918. pthread_exit(NULL);
  919. }
  920. static void* scan_thread(void *arg)
  921. {
  922. int r;
  923. thread_handle_t *h=(thread_handle_t*)arg;
  924. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  925. while(h->quit==0) {
  926. if(get_mb()->product_modbus_type==0) { //master
  927. r = master_scan(cas);
  928. }
  929. sleep(1);
  930. }
  931. pthread_exit(NULL);
  932. }
  933. static void* cmd_thread(void *arg)
  934. {
  935. int i,t=0;
  936. char temp[100];
  937. cascade_handle_t *cas=&casHandle;
  938. board_info_t *info=&cas->info;
  939. GlobalDeviceManager *dm=get_dm();
  940. cmd_data_t *pcmd=(cmd_data_t*)arg;
  941. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  942. LOGD("____ slave CASCADE_CMD_OPEN\n");
  943. }
  944. else {
  945. LOGD("____ slave CASCADE_CMD_CLOSE\n");
  946. }
  947. int flag=(pcmd->cmd==CASCADE_CMD_OPEN)?1:0;
  948. if(pcmd->chId == 0xff) {
  949. int sendAddr = 0;
  950. for(i=0; i<info->cnt; i++) {
  951. if(info->channel[i].addr>0) {
  952. if(info->channel[i].addr==sendAddr) {
  953. continue;
  954. }
  955. else {
  956. sendAddr = info->channel[i].addr;
  957. }
  958. t = g_switch_set_all_ctrl(&dm->_globalRelaySampManger, info->channel[i].type, info->channel[i].addr, flag);
  959. if(t<0) {
  960. LOGE("___ %d %s failed\n", info->channel[i].addr, (pcmd->cmd==CASCADE_CMD_OPEN)?"open":"close");
  961. }
  962. }
  963. }
  964. }
  965. else {
  966. GlobalPowerManger *tmp=NULL;
  967. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  968. {
  969. if(tmp->product_ch_id==pcmd->chId) {
  970. t = g_switch_set_all_chn_ctrl(&dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
  971. break;
  972. }
  973. }
  974. }
  975. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  976. sprintf(temp,"$开启$|$所有$|$通道$");
  977. }
  978. else {
  979. sprintf(temp,"$关闭$|$所有$|$通道$");
  980. }
  981. dev_insert_alarm_ctrl(dm->db, dm->_global_device_info->product_id,3,temp);
  982. free(pcmd);
  983. pthread_exit(NULL);
  984. }
  985. static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
  986. {
  987. int r;
  988. if(cas->inited) {
  989. mb_deinit(cas);
  990. }
  991. cas->inited = 0;
  992. LOGD("master init modbus: port: %s, type: %d, baud: %d\n", CASCADE_MODBUS_PORT, info->product_modbus_type, info->product_modbus_baud);
  993. r = mb_init(cas, CASCADE_MODBUS_PORT, info->product_modbus_type,
  994. info->product_modbus_addr, info->product_modbus_baud);
  995. if(r!=0) {
  996. LOGE("cascade modbus init error.\n");
  997. return -1;
  998. }
  999. cas->inited = 1;
  1000. return 0;
  1001. }
  1002. int cascade_init(void)
  1003. {
  1004. int r=0;
  1005. list_cfg_t lc;
  1006. cascade_handle_t *cas=&casHandle;
  1007. memset(cas, 0, sizeof(casHandle));
  1008. power_init();
  1009. slave_init(cas);
  1010. pthread_mutex_init(&cas->mutex, NULL);
  1011. cas->scanAddr = 1;
  1012. cas->map2 = modbus_mapping_new_start_address(0,0,0,0,
  1013. CASCADE_REG_READ, MAX_READ_REGS2,
  1014. CASCADE_REG_WRITE, MAX_WRITE_REGS2);
  1015. set_modbus(cas, get_mb());
  1016. slave_add(cas, 0);
  1017. thread_start(THREAD_ID_CASCADE, cascade_thread, cas, 4*MB, 0);
  1018. thread_start(THREAD_ID_SCAN, scan_thread, cas, 4*MB, 0);
  1019. return 0;
  1020. }
  1021. int cascade_set_modbus(ModbusInfo_t *info)
  1022. {
  1023. cascade_handle_t *cas=&casHandle;
  1024. if(!info || info->product_modbus_addr>CASCADE_MAX) {
  1025. return -1;
  1026. }
  1027. return set_modbus(cas, info);
  1028. }
  1029. int cascade_get_dlist(dev_list_t *dl)
  1030. {
  1031. int i,cnt=0;
  1032. slave_t *sl=NULL;
  1033. cascade_handle_t *cas=&casHandle;
  1034. if(!dl) {
  1035. return -1;
  1036. }
  1037. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  1038. if(!sl) {
  1039. return -1;
  1040. }
  1041. for(i=0; i<=CASCADE_MAX; i++) {
  1042. if(cas->slaves[i].addr>=0) {
  1043. sl[cnt++] = cas->slaves[i];
  1044. }
  1045. }
  1046. dl->slave = sl;
  1047. dl->cnt = cnt;
  1048. return 0;
  1049. }
  1050. int cascade_free_dlist(dev_list_t *dl)
  1051. {
  1052. if(!dl) {
  1053. return -1;
  1054. }
  1055. free(dl->slave);
  1056. return 0;
  1057. }
  1058. int cascade_request(cmd_data_t *cmd)
  1059. {
  1060. int r=0;
  1061. cascade_handle_t *cas=&casHandle;
  1062. if(!cmd) {
  1063. return -1;
  1064. }
  1065. if(cmd->cmd==CASCADE_CMD_QUERY_CH) {
  1066. cmd_data_t cmd2=*cmd;
  1067. cmd2.cmd = CASCADE_CMD_GET_INFO;
  1068. r = master_cmd(cas, &cmd2);
  1069. }
  1070. if(r==0) {
  1071. r = master_cmd(cas, cmd);
  1072. }
  1073. return r;
  1074. }
  1075. int cascade_lock(void)
  1076. {
  1077. cascade_handle_t *cas=&casHandle;
  1078. return pthread_mutex_lock(&cas->mutex);
  1079. }
  1080. int cascade_unlock(void)
  1081. {
  1082. cascade_handle_t *cas=&casHandle;
  1083. return pthread_mutex_unlock(&cas->mutex);
  1084. }