cascade.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143
  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 1
  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, 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. return 0;
  278. }
  279. static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
  280. {
  281. int r=0,finish=0;
  282. int xlen,rlen=0,oncelen=MB_MAX_LEN;
  283. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  284. if(d->dlen<=0) {
  285. //LOGE("___ mb_read dlen %d is wrong!\n", d->dlen);
  286. return -1;
  287. }
  288. LOGD("___ mb_read dlen: %d\n", d->dlen);
  289. while(1) {
  290. if(rlen+oncelen>d->dlen) {
  291. xlen = d->dlen-rlen;
  292. }
  293. else {
  294. xlen = oncelen;
  295. }
  296. xlen += xlen%2;
  297. r = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
  298. if(r<0) {
  299. LOGE("___ _mb_read failed, %s, rlen: %d\n", modbus_strerror(errno), rlen);
  300. return -1;
  301. }
  302. if(rlen+r*2>=d->dlen) {
  303. xlen = d->dlen-rlen;
  304. finish = 1;
  305. }
  306. else {
  307. xlen = r*2;
  308. }
  309. memcpy((char*)d->data+rlen, buff, xlen);
  310. rlen += xlen;
  311. if(finish) {
  312. break;
  313. }
  314. }
  315. return 0;
  316. }
  317. static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
  318. {
  319. int r=0;
  320. int xlen,wlen=0,oncelen=MB_MAX_LEN;
  321. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  322. if(d->dlen<=0) {
  323. //LOGE("___ mb_write dlen %d is wrong!\n", d->dlen);
  324. return -1;
  325. }
  326. LOGD("___ mb_write dlen: %d\n", d->dlen);
  327. while(1) {
  328. if(wlen+oncelen>d->dlen) {
  329. xlen = d->dlen-wlen;
  330. }
  331. else {
  332. xlen = oncelen;
  333. }
  334. xlen += xlen%2;
  335. memcpy(buff, d->data+wlen, xlen);
  336. r = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
  337. if(r<0) {
  338. //LOGE("___ _mb_write, addr: %d, reg: %d, cnt: %d\n", addr, CASCADE_REG_WRITE, xlen/2);
  339. LOGE("___ _mb_write failed, errno: %d, %s\n", errno, modbus_strerror(errno));
  340. return -1;
  341. }
  342. if(wlen+r*2>=d->dlen) {
  343. break;
  344. }
  345. else {
  346. xlen = r*2;
  347. }
  348. wlen += xlen;
  349. }
  350. return 0;
  351. }
  352. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  353. {
  354. int r=0;
  355. r = mb_write(cas, addr, wd);
  356. if(r==0) {
  357. r = mb_read(cas, addr, rd);
  358. }
  359. return r;
  360. }
  361. static int mb_receive(cascade_handle_t *cas)
  362. {
  363. int r=0,rlen=0;
  364. mb_hdr_t h;
  365. board_info_t info;
  366. modbus_mapping_t *map=NULL;
  367. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  368. static int precmd=-1;
  369. static int sendlen=0;
  370. r = _mb_recv(cas, buff);
  371. if(r<0) {
  372. return -1;
  373. }
  374. mb_hdr(buff, r, &h);
  375. #if 1
  376. //do not know why slave can receive all address data
  377. if(h.addr>0 && h.addr!=cas->addr) {
  378. return -1;
  379. }
  380. #endif
  381. //LOGD("____ slave recv, reg: %d\n", h.reg);
  382. //如果是非自定义寄存器则跳出
  383. if(h.reg==CASCADE_REG_READ || h.reg==CASCADE_REG_WRITE) {
  384. if(h.data) {
  385. cmd_data_t *cmd = (cmd_data_t*)h.data;
  386. cas->cmd = *cmd;
  387. precmd = cmd->cmd;
  388. sendlen = 0;
  389. }
  390. if(h.reg==CASCADE_REG_WRITE) {
  391. LOGD("____ CASCADE_REG_WRITE, %d\n", cas->cmd.cmd);
  392. switch(cas->cmd.cmd) {
  393. case CASCADE_CMD_OPEN:
  394. case CASCADE_CMD_CLOSE:
  395. {
  396. int i,t=0;
  397. char buff[80];
  398. board_info_t *info=&cas->info;
  399. for(i=0; i<info->cnt; i++) {
  400. if(info->board[i].addr>0) {
  401. 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);
  402. if(t) {
  403. LOGE("___ %d %s failed\n", info->board[i].addr, (cas->cmd.cmd==CASCADE_CMD_OPEN)?"open":"close");
  404. }
  405. }
  406. }
  407. if(cas->cmd.cmd==CASCADE_CMD_OPEN) {
  408. sprintf(buff,"$开启$|$所有$|$通道$");
  409. }
  410. else {
  411. sprintf(buff,"$关闭$|$所有$|$通道$");
  412. }
  413. dev_insert_alarm_ctrl(get_dm()->db,get_dm()->_global_device_info->product_id,3,buff);
  414. }
  415. break;
  416. case CASCADE_CMD_SAVE:
  417. case CASCADE_CMD_SAVE3:
  418. {
  419. slave_save(cas);
  420. }
  421. break;
  422. }
  423. r = _mb_reply(cas, buff, r, cas->map2);
  424. }
  425. else {
  426. if(h.regcnt==1) {
  427. LOGD("____ CASCADE SCAN\n");
  428. r = _mb_reply(cas, buff, r, cas->map2);
  429. }
  430. else {
  431. LOGD("____ CASCADE_REG_READ %d\n", cas->cmd.cmd);
  432. switch(cas->cmd.cmd) {
  433. case CASCADE_CMD_GET_INFO:
  434. {
  435. LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
  436. slave_get_info(cas, 0); //hardread will cost long time
  437. memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->info+sendlen, h.regcnt*2);
  438. }
  439. break;
  440. case CASCADE_CMD_QUERY_CH:
  441. {
  442. LOGD("___ slave CASCADE_CMD_QUERY_CH\n");
  443. slave_get_all_data(cas);
  444. memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)cas->pwrInfo.info)+sendlen, h.regcnt*2);
  445. }
  446. break;
  447. case CASCADE_CMD_QUERY_VOL:break;
  448. case CASCADE_CMD_QUERY_CUR:break;
  449. case CASCADE_CMD_QUERY_PWR:break;
  450. case CASCADE_CMD_QUERY_PWRQ:break;
  451. case CASCADE_CMD_QUERY_HIS:break;
  452. case CASCADE_CMD_QUERY_TOTAL:break;
  453. case CASCADE_CMD_QUERY_TOTAL_PWR:break;
  454. }
  455. r = _mb_reply(cas, buff, r, cas->map2);
  456. if(r>0) {
  457. sendlen += h.regcnt*2;
  458. //LOGD("____ slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
  459. }
  460. }
  461. }
  462. }
  463. else {
  464. Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
  465. LOGD("___ slave XXXXXXXXXXX\n");
  466. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  467. cascade_slave_read(cas, h.reg, h.regcnt);
  468. }
  469. else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
  470. cascade_slave_write(cas, h.reg, h.regcnt);
  471. }
  472. r = _mb_reply(cas, buff, r, cas->map);
  473. }
  474. return r ;
  475. }
  476. /////////////////////////////////////////////////////////////////////////
  477. static int cascade_scan(cascade_handle_t *cas)
  478. {
  479. int i,r=0 ;
  480. uint16_t tmp[10];
  481. if(cas->scanAddr>CASCADE_MAX) {
  482. cas->scanAddr = 1;
  483. }
  484. if(!slave_find(cas, cas->scanAddr)) {
  485. r = _mb_read(cas, cas->scanAddr, CASCADE_REG_READ, tmp, 1);
  486. if(r>0) {
  487. LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
  488. slave_add(cas, cas->scanAddr);
  489. }
  490. else {
  491. LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
  492. }
  493. }
  494. cas->scanAddr++;
  495. //print_slave(cas);
  496. return 0;
  497. }
  498. static void power_init(void)
  499. {
  500. int nGroups=18,chn=1;
  501. GlobalDeviceManager *dm=get_dm();
  502. GlobalDeviceManager *dm2=get_dm2();
  503. dm2->_global_device_info = (GlobalDeviceInfo*)malloc(sizeof(GlobalDeviceInfo));
  504. dm2->_global_device_info->product_pwr_type = SmartPDU_AC;
  505. dm2->_global_device_info->product_id = 1;
  506. //dm2->_global_device_info->product_type_id = 2;
  507. strcpy(dm2->_global_device_info->product_name, dm->_global_device_info->product_name);
  508. strcpy(dm2->_global_device_info->product_number, dm->_global_device_info->product_number);
  509. strcpy(dm2->_global_device_info->product_status, dm->_global_device_info->product_status);
  510. INIT_LIST_HEAD(&dm2->_globalPowerManger.list);
  511. }
  512. static int power_clear(cascade_handle_t *cas)
  513. {
  514. GlobalPowerManger *tmp=NULL;
  515. GlobalDeviceManager *dm2=get_dm2();
  516. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  517. {
  518. if(tmp) {
  519. if(tmp->global_over_manager) {
  520. free(tmp->global_over_manager);
  521. }
  522. list_del(&tmp->list);
  523. free(tmp);
  524. }
  525. }
  526. return 0;
  527. }
  528. static int power_add(cascade_handle_t *cas)
  529. {
  530. int i,j,nGroups=18,chn=1;
  531. GlobalDeviceManager *dm2=get_dm2();
  532. GlobalPowerManger* pm=NULL;
  533. board_info_t *info=&cas->info;
  534. LOGD("__**___ master add channel to the list, cnt: %d\n", info->cnt);
  535. cascade_lock();
  536. power_clear(cas);
  537. for(i=0; i<info->cnt; i++) {
  538. pm = (GlobalPowerManger*)calloc(1, sizeof(GlobalPowerManger));
  539. if(!pm) {
  540. return -1;
  541. }
  542. pm->product_id = dm2->_global_device_info->product_id;
  543. pm->product_saddr = info->board[i].addr;
  544. pm->product_ch_id = i;
  545. pm->product_ch_addr = info->board[i].ch_addr;
  546. sprintf(pm->product_ch_name,"CH%d",pm->product_ch_id);
  547. pm->product_ch_type = info->board[i].type;
  548. pm->product_ch_status = 0;
  549. pm->product_ch_start_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  550. pm->product_ch_stop_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  551. list_add_tail(&pm->list,&dm2->_globalPowerManger.list);
  552. chn++;
  553. }
  554. cascade_unlock();
  555. return 0;
  556. }
  557. static int power_overall_update(cascade_handle_t *cas)
  558. {
  559. GlobalPowerManger *tmp=NULL;
  560. GlobalDeviceManager *dm2=get_dm2();
  561. _OverAllPwrAckInfo *info=&cas->allInfo;
  562. if (dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_Tree ||
  563. dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One)
  564. {
  565. dev_search_latest_t_ac_power_statistic_info(0, 0, info);
  566. dev_search_latest_t_ac_power_statistic_info(0, 1, info);
  567. dev_search_latest_t_ac_power_statistic_info(0, 2, info);
  568. }
  569. else
  570. {
  571. GlobalPowerInfo pwrInfo;
  572. dev_search_latest_power_info(dm2->db, dm2->_global_device_info->product_id, 0, &pwrInfo);
  573. info->voltage = pwrInfo._power_info.voltage ;
  574. info->current = pwrInfo._power_info.current ;
  575. info->power = pwrInfo._power_info.power ;
  576. info->freq = pwrInfo._power_info.freq ;
  577. info->consumption = pwrInfo._power_info.consumption ;
  578. info->factor = pwrInfo._power_info.factor ;
  579. }
  580. return 0;
  581. }
  582. static int power_ch_update(cascade_handle_t *cas)
  583. {
  584. int cnt=0;
  585. GlobalPowerManger *tmp=NULL;
  586. GlobalDeviceManager *dm2=get_dm2();
  587. PowerInfo *info=cas->pwrInfo.info;
  588. if(cas->pwrInfo.cnt==0) {
  589. return -1;
  590. }
  591. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  592. {
  593. if(cnt>cas->pwrInfo.cnt) {
  594. break;
  595. }
  596. tmp->_PowerInfo = info[cnt];
  597. cnt++;
  598. }
  599. return 0;
  600. }
  601. static void print_sensor(char *s, sensor_data_t *ss)
  602. {
  603. LOGD("__%s__ ss.type: %d\n", s, ss->type);
  604. LOGD("__%s__ ss.addr: %d\n", s, ss->addr);
  605. LOGD("__%s__ ss.voltage: %f\n", s, ss->pwr.voltage);
  606. LOGD("__%s__ ss.current: %f\n", s, ss->pwr.current);
  607. LOGD("__%s__ ss.power: %f\n", s, ss->pwr.power);
  608. LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
  609. LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
  610. LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
  611. LOGD("__%s__ ss.status: %d\n", s, ss->pwr.status);
  612. LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
  613. LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
  614. LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
  615. LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
  616. LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
  617. LOGD("\n");
  618. }
  619. #define VALUE_OF(m,a,b) ((m[a]<<16)+m[b])
  620. static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
  621. {
  622. uint32_t offset = 6000;
  623. uint32_t value = 0 ;
  624. uint16_t temp[100];
  625. int r,cnt = sizeof(sensor_ori_t)/2;
  626. r = _mb_read(cas, addr, offset, temp, cnt);
  627. if(r!=cnt) {
  628. LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
  629. return -1;
  630. }
  631. ss->type = temp[0];
  632. ss->addr = temp[1];
  633. ss->pwr.voltage = VALUE_OF(temp,3,2)/1000.0;
  634. ss->pwr.current = VALUE_OF(temp,5,4)/1000.0;
  635. ss->pwr.power = VALUE_OF(temp,7,6)/1000.0;
  636. ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
  637. ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
  638. ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
  639. ss->pwr.status = temp[20];
  640. ss->temprature = VALUE_OF(temp,15,14)/1000.0;
  641. ss->humidity = VALUE_OF(temp,17,16)/1000.0;
  642. ss->warning = VALUE_OF(temp,19,18)/1000.0;
  643. ss->sensor_status = temp[21];
  644. //print_sensor("11", ss);
  645. return 0;
  646. }
  647. #define REGS(x) (((x)+(x)%2)/2)
  648. static int master_request(cascade_handle_t *cas, cmd_data_t *cmd)
  649. {
  650. int i,r;
  651. GlobalPowerManger *tmp=NULL;
  652. GlobalDeviceManager *dm=get_dm();
  653. GlobalDeviceManager *dm2=get_dm2();
  654. GlobalDeviceInfo *dev=&dm2->_global_device_info;
  655. data_t rdata,wdata;
  656. if(cur_dev_addr==0) {
  657. return -1;
  658. }
  659. switch(cmd->cmd) {
  660. case CASCADE_CMD_OPEN:
  661. case CASCADE_CMD_CLOSE:
  662. case CASCADE_CMD_SAVE:
  663. case CASCADE_CMD_SAVE3:
  664. {
  665. wdata.dlen = sizeof(*cmd);
  666. wdata.data = (uint8_t*)cmd;
  667. r = mb_write(&cas->m, cur_dev_addr, &wdata);
  668. }
  669. break;
  670. case CASCADE_CMD_GET_INFO:
  671. {
  672. wdata.dlen = sizeof(*cmd);
  673. wdata.data = (uint8_t*)cmd;
  674. rdata.dlen = sizeof(cas->info);
  675. rdata.data = (uint8_t*)&cas->info;
  676. LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
  677. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  678. if(r==0) {
  679. power_add(cas);
  680. }
  681. else {
  682. LOGE("_____ master request CASCADE_CMD_GET_INFO failed\n");
  683. }
  684. }
  685. break;
  686. default:
  687. return -1;
  688. }
  689. return r;
  690. }
  691. static int master_query(cascade_handle_t *cas)
  692. {
  693. int i,r;
  694. GlobalPowerManger *tmp=NULL;
  695. GlobalDeviceManager *dm2=get_dm2();
  696. GlobalDeviceInfo *dev=&dm2->_global_device_info;
  697. cmd_data_t *cmd=&cas->cmd;
  698. data_t rdata,wdata;
  699. if(cur_dev_addr==0) {
  700. return -1;
  701. }
  702. wdata.dlen = sizeof(*cmd);
  703. wdata.data = (uint8_t*)cmd;
  704. switch(cmd->cmd) {
  705. case CASCADE_CMD_QUERY_CH:
  706. {
  707. LOGD("____ master query CASCADE_CMD_QUERY_CH\n");
  708. if(cas->info.cnt==0) {
  709. return -1;
  710. }
  711. rdata.dlen = sizeof(PowerInfo)*cas->info.cnt;
  712. rdata.data = (uint8_t*)cas->pwrInfo.info;
  713. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  714. LOGD("____ master mb_write_read CASCADE_CMD_QUERY_CH %d\n", r);
  715. if(r==0) {
  716. power_ch_update(cas);
  717. }
  718. }
  719. break;
  720. case CASCADE_CMD_QUERY_VOL:
  721. {
  722. if(cmd->obj==OBJ_CHANNEL) {
  723. //rdata.dlen = sizeof(chInfo);
  724. //rdata.data = (uint8_t*)&chInfo;
  725. }
  726. else if(cmd->obj==OBJ_OVERALL) {
  727. //rdata.dlen = sizeof(chInfo);
  728. //rdata.data = (uint8_t*)&chInfo;
  729. }
  730. else {
  731. return -1;
  732. }
  733. }
  734. break;
  735. case CASCADE_CMD_QUERY_CUR:
  736. {
  737. if(cmd->obj==OBJ_CHANNEL) {
  738. //rdata.dlen = sizeof(chInfo);
  739. //rdata.data = (uint8_t*)&chInfo;
  740. }
  741. else if(cmd->obj==OBJ_OVERALL) {
  742. //rdata.dlen = sizeof(chInfo);
  743. //rdata.data = (uint8_t*)&chInfo;
  744. }
  745. else {
  746. return -1;
  747. }
  748. }
  749. break;
  750. case CASCADE_CMD_QUERY_PWR:
  751. {
  752. if(cmd->obj==OBJ_CHANNEL) {
  753. //rdata.dlen = sizeof(chInfo);
  754. //rdata.data = (uint8_t*)&chInfo;
  755. }
  756. else if(cmd->obj==OBJ_OVERALL) {
  757. //rdata.dlen = sizeof(chInfo);
  758. //rdata.data = (uint8_t*)&chInfo;
  759. }
  760. else {
  761. return -1;
  762. }
  763. }
  764. break;
  765. case CASCADE_CMD_QUERY_PWRQ:
  766. {
  767. if(cmd->obj==OBJ_CHANNEL) {
  768. //rdata.dlen = sizeof(chInfo);
  769. //rdata.data = (uint8_t*)&chInfo;
  770. }
  771. else if(cmd->obj==OBJ_OVERALL) {
  772. //rdata.dlen = sizeof(chInfo);
  773. //rdata.data = (uint8_t*)&chInfo;
  774. }
  775. else {
  776. return -1;
  777. }
  778. }
  779. break;
  780. case CASCADE_CMD_QUERY_HIS:
  781. {
  782. if(cmd->obj==OBJ_CHANNEL) {
  783. //rdata.dlen = sizeof(chInfo);
  784. //rdata.data = (uint8_t*)&chInfo;
  785. }
  786. else if(cmd->obj==OBJ_OVERALL) {
  787. //rdata.dlen = sizeof(chInfo);
  788. //rdata.data = (uint8_t*)&chInfo;
  789. }
  790. else {
  791. return -1;
  792. }
  793. }
  794. break;
  795. case CASCADE_CMD_QUERY_TOTAL:
  796. {
  797. if(cmd->obj==OBJ_CHANNEL) {
  798. //rdata.dlen = sizeof(chInfo);
  799. //rdata.data = (uint8_t*)&chInfo;
  800. }
  801. else if(cmd->obj==OBJ_OVERALL) {
  802. //rdata.dlen = sizeof(chInfo);
  803. //rdata.data = (uint8_t*)&chInfo;
  804. }
  805. else {
  806. return -1;
  807. }
  808. }
  809. break;
  810. case CASCADE_CMD_QUERY_TOTAL_PWR:
  811. {
  812. if(cmd->obj==OBJ_CHANNEL) {
  813. //rdata.dlen = sizeof(chInfo);
  814. //rdata.data = (uint8_t*)&chInfo;
  815. }
  816. else if(cmd->obj==OBJ_OVERALL) {
  817. //rdata.dlen = sizeof(chInfo);
  818. //rdata.data = (uint8_t*)&chInfo;
  819. }
  820. else {
  821. return -1;
  822. }
  823. }
  824. break;
  825. default:
  826. return -1;
  827. }
  828. return r;
  829. }
  830. static int slave_receive(cascade_handle_t *cas)
  831. {
  832. return mb_receive(cas);
  833. }
  834. static void* cascade_thread(void *arg)
  835. {
  836. int r;
  837. thread_handle_t *h=(thread_handle_t*)arg;
  838. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  839. ModbusInfo_t *info=get_mb();
  840. LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
  841. while(h->quit==0) {
  842. if(info->product_modbus_type==0) { //主模
  843. r = master_query(cas);
  844. sleep(5);
  845. }
  846. else { //从模式,等待主设备发起数据请�?
  847. r = slave_receive(cas);
  848. }
  849. }
  850. pthread_exit(NULL);
  851. }
  852. static void* scan_thread(void *arg)
  853. {
  854. int r;
  855. thread_handle_t *h=(thread_handle_t*)arg;
  856. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  857. while(h->quit==0) {
  858. if(get_mb()->product_modbus_type==0) { //master
  859. r = cascade_scan(cas);
  860. }
  861. sleep(1);
  862. }
  863. pthread_exit(NULL);
  864. }
  865. static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
  866. {
  867. int r;
  868. if(cas->inited) {
  869. mb_deinit(cas);
  870. }
  871. cas->inited = 0;
  872. LOGD("master init modbus: port: %s, type: %d, baud: %d\n", INTERL_485_CASCADE_PORT, info->product_modbus_type, info->product_modbus_baud);
  873. r = mb_init(cas, INTERL_485_CASCADE_PORT, info->product_modbus_type,
  874. info->product_modbus_addr, info->product_modbus_baud);
  875. if(r!=0) {
  876. LOGE("cascade modbus init error.\n");
  877. return -1;
  878. }
  879. cas->inited = 1;
  880. return 0;
  881. }
  882. int cascade_init(void)
  883. {
  884. int r=0;
  885. cascade_handle_t *cas=&casHandle;
  886. memset(cas, 0, sizeof(casHandle));
  887. power_init();
  888. slave_init(cas);
  889. pthread_mutex_init(&cas->mutex, NULL);
  890. cas->scanAddr = 1;
  891. cas->pwrInfo.info = malloc(128*sizeof(PowerInfo));
  892. //cas->map = modbus_mapping_new(0,0,MAX_READ_REGS,MAX_WRITE_REGS);
  893. cas->map2 = modbus_mapping_new_start_address(0,0,0,0,
  894. CASCADE_REG_READ, MAX_READ_REGS2,
  895. CASCADE_REG_WRITE, MAX_WRITE_REGS2);
  896. set_modbus(cas, get_mb());
  897. slave_add(cas, 0);
  898. thread_start(THREAD_ID_CASCADE, cascade_thread, cas, 4*MB, 0);
  899. thread_start(THREAD_ID_SCAN, scan_thread, cas, 4*MB, 0);
  900. return 0;
  901. }
  902. int cascade_set_modbus(ModbusInfo_t *info)
  903. {
  904. cascade_handle_t *cas=&casHandle;
  905. if(!info || info->product_modbus_type>1 || info->product_modbus_addr>CASCADE_MAX) {
  906. return -1;
  907. }
  908. return set_modbus(cas, info);
  909. }
  910. int cascade_get_dlist(dev_list_t *dl)
  911. {
  912. int i,cnt=0;
  913. slave_t *sl=NULL;
  914. cascade_handle_t *cas=&casHandle;
  915. if(!dl) {
  916. return -1;
  917. }
  918. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  919. if(!sl) {
  920. return -1;
  921. }
  922. for(i=0; i<=CASCADE_MAX; i++) {
  923. if(cas->slaves[i].addr>=0) {
  924. sl[cnt++] = cas->slaves[i];
  925. }
  926. }
  927. dl->slave = sl;
  928. dl->cnt = cnt;
  929. return 0;
  930. }
  931. int cascade_free_dlist(dev_list_t *dl)
  932. {
  933. if(!dl) {
  934. return -1;
  935. }
  936. free(dl->slave);
  937. return 0;
  938. }
  939. int cascade_request(cmd_data_t *cmd)
  940. {
  941. int r=0;
  942. cascade_handle_t *cas=&casHandle;
  943. if(!cmd) {
  944. return -1;
  945. }
  946. if(cmd->cmd==CASCADE_CMD_QUERY_CH) {
  947. cmd_data_t cmd2=*cmd;
  948. cmd2.cmd = CASCADE_CMD_GET_INFO;
  949. r = master_request(cas, &cmd2);
  950. }
  951. if(r==0) {
  952. cas->cmd = *cmd;
  953. r = master_request(cas, cmd);
  954. }
  955. return r;
  956. }
  957. int cascade_is_offline(int addr)
  958. {
  959. slave_t *sl=slave_get(&casHandle, addr);
  960. return (sl->addr>=ERR_MAX)?1:0;
  961. }
  962. int cascade_lock(void)
  963. {
  964. cascade_handle_t *cas=&casHandle;
  965. return pthread_mutex_lock(&cas->mutex);
  966. }
  967. int cascade_unlock(void)
  968. {
  969. cascade_handle_t *cas=&casHandle;
  970. return pthread_mutex_unlock(&cas->mutex);
  971. }