cascade_slave.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. #include "modbus.h"
  2. #include "common.h"
  3. #include "list.h"
  4. #include "switch_ctrl.h"
  5. #include "cascade.h"
  6. #include "sqlite_handle.h"
  7. #define DEV_CHN_REG (4000)
  8. #define OUT_INFO_REG (4001)
  9. #define IN_TOTAL_REG (4768)
  10. #define TEM_HUMAN_REG (4777)
  11. #define CHN_SWITCH_REG (4779)
  12. #define CHN_OPEN_DLA_REG (4843)
  13. #define CHN_CLOSE_DLA_REG (4907)
  14. #define SENSOR_REG (4971)
  15. #define DRY_REG (4987)
  16. #define CHN_SET_OPEN_DLA_REG (5000)
  17. #define CHN_SET_CLOSE_DLA_REG (5064)
  18. #define CHN_SET_SWITCH_STA_REG (5128)
  19. #define ALL_SET_SWITCH_REG (5192)
  20. enum{
  21. TYPE_U16,
  22. TYPE_U32
  23. };
  24. enum {
  25. DS_R_DEV_CHN = 0,
  26. DS_R_OUT_INFO,
  27. DS_R_IN_TOTAL,
  28. DS_R_TEMP_HUM,
  29. DS_R_SWITCH_STA,
  30. DS_R_OPEN_DELAY,
  31. DS_R_CLOSE_DELAY,
  32. DS_R_SENSOR,
  33. DS_R_DRY,
  34. DS_W_OPEN_DELAY,
  35. DS_W_CLOSE_DELAY,
  36. DS_W_CHN_SWITCH_STA,
  37. DS_W_ALL_CHN_STA
  38. };
  39. #define TREE_DEV_CHN_REG (6000)
  40. #define TREE_INPUT_A_REG (6001)
  41. #define TREE_INPUT_B_REG (6009)
  42. #define TREE_INPUT_C_REG (6017)
  43. #define TREE_CHN_TOTAL_REG (6025)
  44. #define TREE_CHN_PH_REG (6665)
  45. #define TREE_TEMP_HUM_REG (8585)
  46. #define TREE_CHN_SWITCH_STA_REG (8587)
  47. #define TREE_CHN_OPEN_DLA_REG (8651)
  48. #define TREE_CHN_CLOSE_DLA_REG (8715)
  49. #define TREE_SENSOR_REG (8779)
  50. #define TREE_DRY_REG (8795)
  51. #define TREE_CHN_SET_OPEN_DLA_REG (9000)
  52. #define TREE_CHN_SET_CLOSE_DLA_REG (9064)
  53. #define TREE_CHN_SET_SWITCH_STA_REG (9128)
  54. #define TREE_ALL_SET_SWITCH_REG (9192)
  55. enum {
  56. TREE_R_DEV_CHN,
  57. TREE_R_INPUT_ALL_A,
  58. TREE_R_INPUT_ALL_B,
  59. TREE_R_INPUT_ALL_C,
  60. TREE_R_CHN_TOTAL,
  61. TREE_R_CHN_PH_INFO,
  62. TREE_R_TEMP_HUM,
  63. TREE_R_SWITCH_STA,
  64. TREE_R_OPEN_DELAY,
  65. TREE_R_CLOSE_DELAY,
  66. TREE_R_SENSOR,
  67. TREE_R_DRY,
  68. TREE_W_OPEN_DELAY,
  69. TREE_W_CLOSE_DELAY,
  70. TREE_W_CHN_SWITCH_STA,
  71. TREE_W_ALL_CHN_STA
  72. };
  73. static inline GlobalDeviceManager* get_dm(void)
  74. {
  75. return &__globalDeviceManage;
  76. }
  77. static inline GlobalDeviceManager* get_dm2(void)
  78. {
  79. return &__globalDeviceManage2;
  80. }
  81. static mmap_modbus_t modbus_single[] = {
  82. [DS_R_DEV_CHN ]{.offset = DEV_CHN_REG },
  83. [DS_R_OUT_INFO ]{.offset = OUT_INFO_REG },
  84. [DS_R_IN_TOTAL ]{.offset = IN_TOTAL_REG },
  85. [DS_R_TEMP_HUM ]{.offset = TEM_HUMAN_REG },
  86. [DS_R_SWITCH_STA ]{.offset = CHN_SWITCH_REG },
  87. [DS_R_OPEN_DELAY ]{.offset = CHN_OPEN_DLA_REG },
  88. [DS_R_CLOSE_DELAY ]{.offset = CHN_CLOSE_DLA_REG },
  89. [DS_R_SENSOR ]{.offset = SENSOR_REG },
  90. [DS_R_DRY ]{.offset = DRY_REG },
  91. [DS_W_OPEN_DELAY ]{.offset = CHN_SET_OPEN_DLA_REG },
  92. [DS_W_CLOSE_DELAY ]{.offset = CHN_SET_CLOSE_DLA_REG },
  93. [DS_W_CHN_SWITCH_STA]{.offset = CHN_SET_SWITCH_STA_REG },
  94. [DS_W_ALL_CHN_STA ]{.offset = ALL_SET_SWITCH_REG },
  95. };
  96. static mmap_modbus_t modbus_three[] = {
  97. [TREE_R_DEV_CHN ]{.offset = TREE_DEV_CHN_REG},
  98. [TREE_R_INPUT_ALL_A ]{.offset = TREE_INPUT_A_REG },
  99. [TREE_R_INPUT_ALL_B ]{.offset = TREE_INPUT_B_REG },
  100. [TREE_R_INPUT_ALL_C ]{.offset = TREE_INPUT_C_REG },
  101. [TREE_R_CHN_TOTAL ]{.offset = TREE_CHN_TOTAL_REG },
  102. [TREE_R_CHN_PH_INFO ]{.offset = TREE_CHN_PH_REG },
  103. [TREE_R_TEMP_HUM ]{.offset = TREE_TEMP_HUM_REG },
  104. [TREE_R_SWITCH_STA ]{.offset = TREE_CHN_SWITCH_STA_REG},
  105. [TREE_R_OPEN_DELAY ]{.offset = TREE_CHN_OPEN_DLA_REG },
  106. [TREE_R_CLOSE_DELAY ]{.offset = TREE_CHN_CLOSE_DLA_REG },
  107. [TREE_R_SENSOR ]{.offset = TREE_SENSOR_REG },
  108. [TREE_R_DRY ]{.offset = TREE_DRY_REG },
  109. [TREE_W_OPEN_DELAY ]{.offset = TREE_CHN_SET_OPEN_DLA_REG},
  110. [TREE_W_CLOSE_DELAY ]{.offset = TREE_CHN_SET_CLOSE_DLA_REG},
  111. [TREE_W_CHN_SWITCH_STA ]{.offset = TREE_CHN_SET_SWITCH_STA_REG},
  112. [TREE_W_ALL_CHN_STA ]{.offset = TREE_ALL_SET_SWITCH_REG }
  113. };
  114. typedef struct {
  115. modbus_mapping_t *map;
  116. }slave_handle_t;
  117. static slave_handle_t slHandle;
  118. modbus_mapping_t *cascade_slave_map()
  119. {
  120. return slHandle.map;
  121. }
  122. int cascade_slave_init(void)
  123. {
  124. slave_handle_t *sh=&slHandle;
  125. GlobalDeviceManager* mgr=get_dm();
  126. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC ||
  127. mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC) // single AC
  128. {
  129. if(sh->map)
  130. {
  131. free(sh->map);
  132. sh->map = NULL;
  133. }
  134. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,5000,0,0); //3000 ge
  135. modbus_single[DS_R_DEV_CHN ].addr = &mgr->single_mmap->dev_chn;
  136. modbus_single[DS_R_OUT_INFO ].addr = &mgr->single_mmap->all_ch;
  137. modbus_single[DS_R_IN_TOTAL ].addr = &mgr->single_mmap->total_valtage;
  138. modbus_single[DS_R_TEMP_HUM ].addr = &mgr->single_mmap->total_temp;
  139. modbus_single[DS_R_SWITCH_STA ].addr = &mgr->single_mmap->chn_status;
  140. modbus_single[DS_R_OPEN_DELAY ].addr = &mgr->single_mmap->open_delay;
  141. modbus_single[DS_R_CLOSE_DELAY ].addr = &mgr->single_mmap->close_delay;
  142. modbus_single[DS_R_SENSOR ].addr = &mgr->single_mmap->cas_sensor;
  143. modbus_single[DS_R_DRY ].addr = &mgr->single_mmap->d_node;
  144. modbus_single[DS_W_OPEN_DELAY ].addr = &mgr->single_mmap->set_chn_open_delay;
  145. modbus_single[DS_W_CLOSE_DELAY ].addr = &mgr->single_mmap->set_chn_close_delay;
  146. modbus_single[DS_W_CHN_SWITCH_STA ].addr = &mgr->single_mmap->set_chn_switch_status;
  147. modbus_single[DS_W_ALL_CHN_STA ].addr = &mgr->single_mmap->set_chn_all_switch_status;
  148. printf("single dc address init 4000\n");
  149. }else
  150. {
  151. if(sh->map)
  152. {
  153. free(sh->map);
  154. sh->map = NULL;
  155. }
  156. sh->map = modbus_mapping_new_start_address(0,0,0,0,TREE_DEV_CHN_REG,7000,0,0);
  157. modbus_three[TREE_R_DEV_CHN ].addr = &mgr->triphasic_mmap->dev_chn;
  158. modbus_three[TREE_R_INPUT_ALL_A ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[0];
  159. modbus_three[TREE_R_INPUT_ALL_B ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[1];
  160. modbus_three[TREE_R_INPUT_ALL_C ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[2];
  161. modbus_three[TREE_R_CHN_TOTAL ].addr = &mgr->triphasic_mmap->chn_info;
  162. modbus_three[TREE_R_CHN_PH_INFO ].addr = &mgr->triphasic_mmap->pw_o_chn;
  163. modbus_three[TREE_R_TEMP_HUM ].addr = &mgr->triphasic_mmap->temperature;
  164. modbus_three[TREE_R_SWITCH_STA ].addr = &mgr->triphasic_mmap->chn_status;
  165. modbus_three[TREE_R_OPEN_DELAY ].addr = &mgr->triphasic_mmap->open_delay;
  166. modbus_three[TREE_R_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->close_delay;
  167. modbus_single[TREE_R_SENSOR ].addr = &mgr->triphasic_mmap->cas_sensor;
  168. modbus_single[TREE_R_DRY ].addr = &mgr->triphasic_mmap->d_node;
  169. modbus_three[TREE_W_OPEN_DELAY ].addr = &mgr->triphasic_mmap->set_chn_open_delay;
  170. modbus_three[TREE_W_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->set_chn_close_delay;
  171. modbus_three[TREE_W_CHN_SWITCH_STA ].addr = &mgr->triphasic_mmap->set_chn_switch_status;
  172. modbus_three[TREE_W_ALL_CHN_STA ].addr = &mgr->triphasic_mmap->set_chn_all_switch_status;
  173. printf("triphasic address init 6000\n");
  174. //return -1;
  175. }
  176. return 0;
  177. }
  178. static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
  179. {
  180. GlobalDeviceManager* mgr=get_dm();
  181. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC ||
  182. mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC){
  183. if(addr >= DEV_CHN_REG && addr <= ALL_SET_SWITCH_REG)
  184. {
  185. if(type == TYPE_U16)
  186. {
  187. uint16_t *base_addr = (uint16_t *)modbus_single[reg_type].addr;
  188. uint32_t step = addr - sh->map->start_registers;
  189. base_addr = base_addr + (addr - modbus_single[reg_type].offset);
  190. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  191. if(num < 126)
  192. {
  193. memcpy(map_addr, base_addr,2*num);
  194. }
  195. }else
  196. {
  197. uint32_t *base_addr = (uint32_t *)modbus_single[reg_type].addr;
  198. uint32_t step = addr - sh->map->start_registers;
  199. base_addr = base_addr + (addr - modbus_single[reg_type].offset) / 2;
  200. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  201. if(num < 126)
  202. {
  203. memcpy(map_addr, base_addr,2*num);
  204. }
  205. }
  206. }
  207. }else
  208. {
  209. if(addr >= TREE_DEV_CHN_REG && addr <= TREE_ALL_SET_SWITCH_REG) {
  210. if(type == TYPE_U16)
  211. {
  212. uint16_t *base_addr = (uint16_t *)modbus_three[reg_type].addr;
  213. uint32_t step = addr - sh->map->start_registers;
  214. base_addr = base_addr + (addr - modbus_three[reg_type].offset);
  215. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  216. if(num < 126)
  217. {
  218. memcpy(map_addr, base_addr,2*num);
  219. }
  220. }else
  221. {
  222. uint32_t *base_addr = (uint32_t *)modbus_three[reg_type].addr;
  223. uint32_t step = addr - sh->map->start_registers;
  224. base_addr = base_addr + (addr - modbus_three[reg_type].offset) / 2;
  225. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  226. if(num < 126)
  227. {
  228. memcpy(map_addr, base_addr,2*num);
  229. }
  230. }
  231. }
  232. }
  233. }
  234. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  235. {
  236. slave_handle_t *sh=&slHandle;
  237. switch (addr)
  238. {
  239. case 4000:
  240. slave_read(sh,addr,lenth,DS_R_DEV_CHN,TYPE_U16);
  241. break;
  242. case 4001 ... 4768:
  243. slave_read(sh,addr,lenth,DS_R_OUT_INFO,TYPE_U32);
  244. break;
  245. case 4769 ... 4776:
  246. slave_read(sh,addr,lenth,DS_R_IN_TOTAL,TYPE_U32);
  247. break;
  248. case 4777 ... 4778:
  249. slave_read(sh,addr,lenth,DS_R_TEMP_HUM,TYPE_U16);
  250. case 4779 ... 4842:
  251. slave_read(sh,addr,lenth,DS_R_SWITCH_STA,TYPE_U16);
  252. break;
  253. case 4843 ... 4906:
  254. slave_read(sh,addr,lenth,DS_R_OPEN_DELAY,TYPE_U16);
  255. break;
  256. case 4907 ... 4970:
  257. slave_read(sh,addr,lenth,DS_R_CLOSE_DELAY,TYPE_U16);
  258. break;
  259. case SENSOR_REG ... (DRY_REG-1):
  260. slave_read(sh,addr,lenth,DS_R_SENSOR,TYPE_U32);
  261. break;
  262. case DRY_REG ... 4990:
  263. slave_read(sh,addr,lenth,DS_R_DRY,TYPE_U16);
  264. break;
  265. case 5000 ... 5063:
  266. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  267. break;
  268. case 5064 ... 5127:
  269. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  270. break;
  271. case 5128 ... 5191:
  272. slave_read(sh,addr,lenth,DS_W_CHN_SWITCH_STA,TYPE_U16);
  273. break;
  274. case 5192 :
  275. slave_read(sh,addr,lenth,DS_W_ALL_CHN_STA,TYPE_U16);
  276. break;
  277. // triple
  278. case 6000:
  279. slave_read(sh,addr,lenth,TREE_R_DEV_CHN,TYPE_U16);
  280. break;
  281. case 6001 ... 6008:
  282. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_A,TYPE_U32);
  283. break;
  284. case 6009 ... 6016:
  285. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_B,TYPE_U32);
  286. break;
  287. case 6017 ... 6024:
  288. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_C,TYPE_U32);
  289. break;
  290. case 6025 ... 6664:
  291. slave_read(sh,addr,lenth,TREE_R_CHN_TOTAL,TYPE_U32);
  292. break;
  293. case 6665 ... 8584:
  294. slave_read(sh,addr,lenth,TREE_R_CHN_PH_INFO,TYPE_U32);
  295. break;
  296. case 8585 ... 8586:
  297. slave_read(sh,addr,lenth,TREE_R_TEMP_HUM,TYPE_U16);
  298. break;
  299. case 8587 ... 8650:
  300. slave_read(sh,addr,lenth,TREE_R_SWITCH_STA,TYPE_U16);
  301. break;
  302. case 8651 ... 8714:
  303. slave_read(sh,addr,lenth,TREE_R_OPEN_DELAY,TYPE_U16);
  304. break;
  305. case 8715 ... 8778:
  306. slave_read(sh,addr,lenth,TREE_R_CLOSE_DELAY,TYPE_U16);
  307. break;
  308. case TREE_SENSOR_REG ... (TREE_DRY_REG-1):
  309. slave_read(sh,addr,lenth,TREE_R_SENSOR,TYPE_U32);
  310. break;
  311. case TREE_DRY_REG ... 8798:
  312. slave_read(sh,addr,lenth,TREE_R_DRY,TYPE_U16);
  313. break;
  314. default:
  315. break;
  316. }
  317. }
  318. void cascade_slave_write(uint32_t addr, uint16_t val)
  319. {
  320. slave_handle_t *sh=&slHandle;
  321. GlobalDeviceManager* mgr=get_dm();
  322. uint16_t buff[128] = {0};
  323. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC
  324. || mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC)
  325. {
  326. switch(addr)
  327. {
  328. case 5000 ... 5063:
  329. {
  330. int start_chn = addr - modbus_single[DS_W_OPEN_DELAY].offset;
  331. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  332. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  333. {
  334. if(_globalPowerMangerTemp==NULL)
  335. break;
  336. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  337. {
  338. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC){
  339. _globalPowerMangerTemp->product_ch_start_delay=val;
  340. g_switch_set_ac_single_s_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  341. _globalPowerMangerTemp->product_ch_addr,val);
  342. }else
  343. {
  344. _globalPowerMangerTemp->product_ch_start_delay=val;
  345. g_switch_set_dcpdu_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  346. _globalPowerMangerTemp->product_ch_addr,val/1000);
  347. }
  348. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  349. {
  350. log_e("update pwr general data err.");
  351. }
  352. printf("val = %d start_chn = %d\n",val,start_chn);
  353. // *(uint16_t *)((uint16_t*)(modbus_single[6].addr) + start_chn) = val;
  354. break;
  355. }
  356. }
  357. }
  358. break;
  359. case 5064 ... 5127:
  360. {
  361. int start_chn = addr - modbus_single[DS_W_CLOSE_DELAY].offset;
  362. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  363. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  364. {
  365. if(_globalPowerMangerTemp==NULL)
  366. break;
  367. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  368. {
  369. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC){
  370. _globalPowerMangerTemp->product_ch_stop_delay=val;
  371. g_switch_set_ac_single_s_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  372. _globalPowerMangerTemp->product_ch_addr,val);
  373. }else
  374. {
  375. _globalPowerMangerTemp->product_ch_stop_delay=val;
  376. g_switch_set_dcpdu_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  377. _globalPowerMangerTemp->product_ch_addr,val/1000);
  378. }
  379. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  380. {
  381. log_e("update pwr general data err.");
  382. }
  383. printf("val = %d",val);
  384. //*(uint16_t *)((uint16_t*)(modbus_single[7].addr) + start_chn) = val;
  385. //printf("modbus_single[7].addr = %d ",modbus_single[7].addr);
  386. break;
  387. }
  388. }
  389. }
  390. break;
  391. case 5128 ... 5191:
  392. {
  393. int start_chn = addr - modbus_single[DS_W_CHN_SWITCH_STA].offset;
  394. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  395. if (val == 0 || val == 1)
  396. {
  397. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  398. {
  399. if (_globalPowerMangerTemp == NULL)
  400. break;
  401. if ((start_chn + 1) == _globalPowerMangerTemp->product_ch_id)
  402. {
  403. int ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  404. _globalPowerMangerTemp->product_saddr,
  405. _globalPowerMangerTemp->product_ch_addr,
  406. val, false);
  407. // printf("ret = %d 0x%x\n",ret,val);
  408. *(uint16_t *)((uint16_t *)(modbus_single[DS_W_CHN_SWITCH_STA].addr) + start_chn) = val;
  409. break;
  410. }
  411. }
  412. }
  413. }
  414. break;
  415. case 5192:
  416. {
  417. if (val == 0 || val == 1)
  418. {
  419. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  420. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  421. {
  422. if (_globalPowerMangerTemp == NULL)
  423. break;
  424. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  425. // printf("rec = %d 0x%x\n",rec,val);
  426. }
  427. *(uint16_t *)(modbus_single[DS_W_ALL_CHN_STA].addr) = val;
  428. }
  429. }
  430. break;
  431. default:
  432. break;
  433. }
  434. }else{
  435. switch(addr)
  436. {
  437. case 9000 ... 9063:
  438. {
  439. int start_chn = addr - modbus_three[TREE_W_OPEN_DELAY].offset;
  440. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  441. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  442. if(_globalPowerMangerTemp==NULL)
  443. break;
  444. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  445. {
  446. int ret = 0;
  447. _globalPowerMangerTemp->product_ch_start_delay = val;
  448. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  449. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  450. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B
  451. )
  452. {
  453. printf("hwllo every one stop time !!!!\n");
  454. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  455. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  456. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  457. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  458. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  459. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  460. }
  461. else
  462. {
  463. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  464. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  465. }
  466. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  467. {
  468. log_e("update pwr general data err.");
  469. }
  470. break;
  471. }
  472. }
  473. }
  474. break;
  475. case 9064 ... 9127:
  476. {
  477. int start_chn = addr - modbus_three[TREE_W_CLOSE_DELAY].offset;
  478. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  479. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  480. {
  481. if(_globalPowerMangerTemp==NULL)
  482. break;
  483. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  484. {
  485. int ret = 0;
  486. _globalPowerMangerTemp->product_ch_stop_delay = val;
  487. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  488. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  489. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B)
  490. {
  491. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  492. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  493. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  494. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  495. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  496. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  497. }
  498. else
  499. {
  500. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  501. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  502. }
  503. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  504. {
  505. log_e("update pwr general data err.");
  506. }
  507. break;
  508. }
  509. }
  510. }
  511. break;
  512. case 9128 ... 9191:
  513. {
  514. int start_chn = addr - modbus_three[TREE_W_CHN_SWITCH_STA].offset;
  515. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  516. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  517. if(_globalPowerMangerTemp==NULL)
  518. break;
  519. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  520. {
  521. int t_ac_CtrlType=0;
  522. int nRet = 0;
  523. _globalPowerMangerTemp->product_ch_status = val;
  524. GlobalTreeACManager *_globalTACManager = NULL;
  525. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  526. {
  527. t_ac_CtrlType=_globalTACManager->product_ph_outputType;
  528. }
  529. if (t_ac_CtrlType == 2&&(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  530. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  531. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B))
  532. {
  533. if(_globalPowerMangerTemp->product_ch_type == AC_SINGLE_S_TYPE || _globalPowerMangerTemp->product_ch_type == AC_SINGLE_B_TYPE)
  534. {
  535. if (val == 1)
  536. {
  537. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  538. val |= ENABLE_TAC_V_UP;
  539. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  540. val |= ENABLE_TAC_V_DOWN;
  541. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  542. val |= ENABLE_TAC_A_UP;
  543. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  544. val |= ENABLE_TAC_W_UP;
  545. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  546. val |= ENABLE_TAC_P_UP;
  547. }
  548. g_switch_set_ac_single_s_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr,
  549. (_globalPowerMangerTemp->product_ch_addr- 1), val);
  550. break;
  551. }
  552. unsigned short phsts=0;
  553. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  554. {
  555. if (val == 1 && _globalTACManager->product_ph_outputStatus==1)
  556. {
  557. phsts=1;
  558. if (_globalTACManager->global_over_manager.product_vol_upper_enable == 1)
  559. phsts |= ENABLE_TAC_V_UP;
  560. if (_globalTACManager->global_over_manager.product_vol_lower_enable == 1)
  561. phsts |= ENABLE_TAC_V_DOWN;
  562. if (_globalTACManager->global_over_manager.product_cur_upper_enable == 1)
  563. phsts |= ENABLE_TAC_A_UP;
  564. if (_globalTACManager->global_over_manager.product_pwr_upper_enable == 1)
  565. phsts |= ENABLE_TAC_W_UP;
  566. if (_globalTACManager->global_over_manager.product_pwrcon_upper_enable == 1)
  567. phsts |= ENABLE_TAC_P_UP;
  568. }else{
  569. phsts=0;
  570. }
  571. nRet= g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  572. _globalTACManager->product_saddr,
  573. _globalTACManager->product_ch_addr - 1,
  574. phsts);
  575. }
  576. g_switch_set_t_ac_chn_NF_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, val);
  577. break;
  578. }else
  579. {
  580. if (val == 1)
  581. {
  582. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  583. val |= ENABLE_TAC_V_UP;
  584. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  585. val |= ENABLE_TAC_V_DOWN;
  586. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  587. val |= ENABLE_TAC_A_UP;
  588. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  589. val |= ENABLE_TAC_W_UP;
  590. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  591. val |= ENABLE_TAC_P_UP;
  592. }
  593. /*
  594. if (isgroup)
  595. {
  596. sts |= ENABLE_TAC_STIME;
  597. sts |= ENABLE_TAC_ETIME;
  598. }*/
  599. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One)
  600. {
  601. g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  602. _globalPowerMangerTemp->product_saddr,
  603. _globalPowerMangerTemp->product_ch_addr - 1,
  604. val);
  605. }else{
  606. g_switch_set_t_ac_chn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  607. _globalPowerMangerTemp->product_saddr,
  608. _globalPowerMangerTemp->product_ch_addr - 1,
  609. val);
  610. }
  611. }
  612. }
  613. }
  614. }
  615. break;
  616. case 9192:
  617. {
  618. if (val == 0 || val == 1)
  619. {
  620. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  621. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  622. {
  623. if (_globalPowerMangerTemp == NULL)
  624. break;
  625. _globalPowerMangerTemp->product_ch_status = val;
  626. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  627. // printf("rec = %d 0x%x\n",rec,val);
  628. g_switch_set_t_ac_chn_NF_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, val);
  629. }
  630. }
  631. }
  632. break;
  633. default:
  634. break;
  635. }
  636. }
  637. }