cascade.c 30 KB

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