cascade_slave.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  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 BREAKER (4991)
  17. #define CHN_SET_OPEN_DLA_REG (5000)
  18. #define CHN_SET_CLOSE_DLA_REG (5064)
  19. #define CHN_SET_SWITCH_STA_REG (5128)
  20. #define ALL_SET_SWITCH_REG (5192)
  21. #define ELE_ALL_WANNING_REG (5200)
  22. #define ELE_WANNING_REG (5201)
  23. #define ELE_LENTH (65)
  24. #define SENSOR_WANNING_REG (5340)
  25. #define SENSER_LENTH (9)
  26. // #define
  27. #ifdef NORTH_USER_SPECILS
  28. #define SPAECIL_USER_TOTAL_CONSUMER (40 )
  29. #define SPAECIL_USER_TOTAL_POWER (49 )
  30. #define SPAECIL_USER_STATUS (100 )
  31. #define SPAECIL_USER_STATUS_64 (103 )
  32. #define SPAECIL_USER_WANING (2000)
  33. #define SPAECIL_USER_FATAL_64 (2005)
  34. #define SPAECIL_USER_SET_1 (3001)
  35. #define SPAECIL_USER_SET_64 (3004)
  36. enum{
  37. N_SPAECIL_CON = 0,
  38. N_SPAECIL_STA,
  39. N_SPAECIL_WANING,
  40. N_SPAECIL_SET,
  41. };
  42. static mmap_modbus_t north_specil[] = {
  43. [N_SPAECIL_CON ]{.offset = SPAECIL_USER_TOTAL_CONSUMER },
  44. [N_SPAECIL_STA ]{.offset = SPAECIL_USER_STATUS },
  45. [N_SPAECIL_WANING ]{.offset = SPAECIL_USER_WANING },
  46. [N_SPAECIL_SET ]{.offset = SPAECIL_USER_SET_1 },
  47. };
  48. #endif
  49. enum{
  50. TYPE_U16,
  51. TYPE_U32
  52. };
  53. enum{
  54. NO_OPPERATION = 0,
  55. OPEN,
  56. CLOSE,
  57. };
  58. enum {
  59. DS_R_DEV_CHN = 0,
  60. DS_R_OUT_INFO,
  61. DS_R_IN_TOTAL,
  62. DS_R_TEMP_HUM,
  63. DS_R_SWITCH_STA,
  64. DS_R_OPEN_DELAY,
  65. DS_R_CLOSE_DELAY,
  66. DS_R_SENSOR,
  67. DS_R_DRY,
  68. DS_R_BREAKER,
  69. DS_W_OPEN_DELAY,
  70. DS_W_CLOSE_DELAY,
  71. DS_W_CHN_SWITCH_STA,
  72. DS_W_ALL_CHN_STA,
  73. DS_R_ALL_WANIING_STA,
  74. DS_R_WANNING_STA,
  75. DS_R_SENSOR_STA
  76. };
  77. #define TREE_DEV_CHN_REG (6000)
  78. #define TREE_INPUT_A_REG (6001)
  79. #define TREE_INPUT_B_REG (6009)
  80. #define TREE_INPUT_C_REG (6017)
  81. #define TREE_CHN_TOTAL_REG (6025)
  82. #define TREE_CHN_PH_REG (6665)
  83. #define TREE_TEMP_HUM_REG (8585)
  84. #define TREE_CHN_SWITCH_STA_REG (8587)
  85. #define TREE_CHN_OPEN_DLA_REG (8651)
  86. #define TREE_CHN_CLOSE_DLA_REG (8715)
  87. #define TREE_SENSOR_REG (8779)
  88. #define TREE_DRY_REG (8795)
  89. #define TREE_BREKAER (8799)
  90. #define TREE_ELE_3_ALL_WANNING_REG (8810)
  91. #define TREE_ELE_3_WANNING_REG (8814)
  92. #define TREE_SENSOR_WANNING_REG (8920)
  93. #define TREE_CHN_SET_OPEN_DLA_REG (9000)
  94. #define TREE_CHN_SET_CLOSE_DLA_REG (9064)
  95. #define TREE_CHN_SET_SWITCH_STA_REG (9128)
  96. #define TREE_ALL_SET_SWITCH_REG (9192)
  97. enum {
  98. TREE_R_DEV_CHN,
  99. TREE_R_INPUT_ALL_A,
  100. TREE_R_INPUT_ALL_B,
  101. TREE_R_INPUT_ALL_C,
  102. TREE_R_CHN_TOTAL,
  103. TREE_R_CHN_PH_INFO,
  104. TREE_R_TEMP_HUM,
  105. TREE_R_SWITCH_STA,
  106. TREE_R_OPEN_DELAY,
  107. TREE_R_CLOSE_DELAY,
  108. TREE_R_SENSOR,
  109. TREE_R_DRY,
  110. TREE_R_BREAKER,
  111. TREE_W_OPEN_DELAY,
  112. TREE_W_CLOSE_DELAY,
  113. TREE_W_CHN_SWITCH_STA,
  114. TREE_W_ALL_CHN_STA,
  115. TREE_R_ALL_ELE_STA,
  116. TREE_R_ELE_STA,
  117. TREE_R_SENSOR_STA,
  118. };
  119. static inline GlobalDeviceManager* get_dm(void)
  120. {
  121. return &__globalDeviceManage;
  122. }
  123. static inline GlobalDeviceManager* get_dm2(void)
  124. {
  125. return &__globalDeviceManage2;
  126. }
  127. static mmap_modbus_t modbus_single[] = {
  128. [DS_R_DEV_CHN ]{.offset = DEV_CHN_REG },
  129. [DS_R_OUT_INFO ]{.offset = OUT_INFO_REG },
  130. [DS_R_IN_TOTAL ]{.offset = IN_TOTAL_REG },
  131. [DS_R_TEMP_HUM ]{.offset = TEM_HUMAN_REG },
  132. [DS_R_SWITCH_STA ]{.offset = CHN_SWITCH_REG },
  133. [DS_R_OPEN_DELAY ]{.offset = CHN_OPEN_DLA_REG },
  134. [DS_R_CLOSE_DELAY ]{.offset = CHN_CLOSE_DLA_REG },
  135. [DS_R_SENSOR ]{.offset = SENSOR_REG },
  136. [DS_R_DRY ]{.offset = DRY_REG },
  137. [DS_R_BREAKER ]{.offset = BREAKER },
  138. [DS_W_OPEN_DELAY ]{.offset = CHN_SET_OPEN_DLA_REG },
  139. [DS_W_CLOSE_DELAY ]{.offset = CHN_SET_CLOSE_DLA_REG },
  140. [DS_W_CHN_SWITCH_STA]{.offset = CHN_SET_SWITCH_STA_REG },
  141. [DS_W_ALL_CHN_STA ]{.offset = ALL_SET_SWITCH_REG },
  142. [DS_R_ALL_WANIING_STA]{.offset = ELE_ALL_WANNING_REG },
  143. [DS_R_WANNING_STA ]{.offset = ELE_WANNING_REG },
  144. [DS_R_SENSOR_STA ]{.offset = SENSOR_WANNING_REG },
  145. };
  146. static mmap_modbus_t modbus_three[] = {
  147. [TREE_R_DEV_CHN ]{.offset = TREE_DEV_CHN_REG},
  148. [TREE_R_INPUT_ALL_A ]{.offset = TREE_INPUT_A_REG },
  149. [TREE_R_INPUT_ALL_B ]{.offset = TREE_INPUT_B_REG },
  150. [TREE_R_INPUT_ALL_C ]{.offset = TREE_INPUT_C_REG },
  151. [TREE_R_CHN_TOTAL ]{.offset = TREE_CHN_TOTAL_REG },
  152. [TREE_R_CHN_PH_INFO ]{.offset = TREE_CHN_PH_REG },
  153. [TREE_R_TEMP_HUM ]{.offset = TREE_TEMP_HUM_REG },
  154. [TREE_R_SWITCH_STA ]{.offset = TREE_CHN_SWITCH_STA_REG},
  155. [TREE_R_OPEN_DELAY ]{.offset = TREE_CHN_OPEN_DLA_REG },
  156. [TREE_R_CLOSE_DELAY ]{.offset = TREE_CHN_CLOSE_DLA_REG },
  157. [TREE_R_SENSOR ]{.offset = TREE_SENSOR_REG },
  158. [TREE_R_DRY ]{.offset = TREE_DRY_REG },
  159. [TREE_R_BREAKER ]{.offset = TREE_BREKAER },
  160. [TREE_W_OPEN_DELAY ]{.offset = TREE_CHN_SET_OPEN_DLA_REG},
  161. [TREE_W_CLOSE_DELAY ]{.offset = TREE_CHN_SET_CLOSE_DLA_REG},
  162. [TREE_W_CHN_SWITCH_STA ]{.offset = TREE_CHN_SET_SWITCH_STA_REG},
  163. [TREE_W_ALL_CHN_STA ]{.offset = TREE_ALL_SET_SWITCH_REG },
  164. [TREE_R_ALL_ELE_STA ]{.offset = TREE_ELE_3_ALL_WANNING_REG},
  165. [TREE_R_ELE_STA ]{.offset = TREE_ELE_3_WANNING_REG},
  166. [TREE_R_SENSOR_STA ]{.offset = TREE_ELE_3_WANNING_REG},
  167. };
  168. typedef struct {
  169. modbus_mapping_t *map;
  170. }slave_handle_t;
  171. static slave_handle_t slHandle;
  172. modbus_mapping_t *cascade_slave_map()
  173. {
  174. return slHandle.map;
  175. }
  176. int cascade_slave_init(void)
  177. {
  178. slave_handle_t *sh=&slHandle;
  179. GlobalDeviceManager* mgr=get_dm();
  180. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC ||
  181. mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC) // single AC
  182. {
  183. if(sh->map)
  184. {
  185. free(sh->map);
  186. sh->map = NULL;
  187. }
  188. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,5000,0,0); //3000 ge
  189. modbus_single[DS_R_DEV_CHN ].addr = &mgr->single_mmap->dev_chn;
  190. modbus_single[DS_R_OUT_INFO ].addr = &mgr->single_mmap->all_ch;
  191. modbus_single[DS_R_IN_TOTAL ].addr = &mgr->single_mmap->total_valtage;
  192. modbus_single[DS_R_TEMP_HUM ].addr = &mgr->single_mmap->total_temp;
  193. modbus_single[DS_R_SWITCH_STA ].addr = &mgr->single_mmap->chn_status;
  194. modbus_single[DS_R_OPEN_DELAY ].addr = &mgr->single_mmap->open_delay;
  195. modbus_single[DS_R_CLOSE_DELAY ].addr = &mgr->single_mmap->close_delay;
  196. modbus_single[DS_R_SENSOR ].addr = &mgr->single_mmap->cas_sensor[0];
  197. modbus_single[DS_R_DRY ].addr = &mgr->single_mmap->d_node[0];
  198. modbus_single[DS_R_BREAKER ].addr = &mgr->single_mmap->breaker_value;
  199. modbus_single[DS_W_OPEN_DELAY ].addr = &mgr->single_mmap->set_chn_open_delay;
  200. modbus_single[DS_W_CLOSE_DELAY ].addr = &mgr->single_mmap->set_chn_close_delay;
  201. modbus_single[DS_W_CHN_SWITCH_STA ].addr = &mgr->single_mmap->set_chn_switch_status;
  202. modbus_single[DS_W_ALL_CHN_STA ].addr = &mgr->single_mmap->set_chn_all_switch_status;
  203. modbus_single[DS_R_ALL_WANIING_STA ].addr = &mgr->single_mmap->all_ele_wanning;
  204. modbus_single[DS_R_WANNING_STA ].addr = &mgr->single_mmap->channel_ele_wanning[0];
  205. modbus_single[DS_R_SENSOR_STA ].addr = &mgr->single_mmap->sensor_wanning[0];
  206. log_d("single dc address init 4000\n");
  207. }else
  208. {
  209. if(sh->map)
  210. {
  211. free(sh->map);
  212. sh->map = NULL;
  213. }
  214. #ifndef NORTH_USER_SPECILS
  215. sh->map = modbus_mapping_new_start_address(0,0,0,0,TREE_DEV_CHN_REG,7000,0,0);
  216. modbus_three[TREE_R_DEV_CHN ].addr = &mgr->triphasic_mmap->dev_chn;
  217. modbus_three[TREE_R_INPUT_ALL_A ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[0];
  218. modbus_three[TREE_R_INPUT_ALL_B ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[1];
  219. modbus_three[TREE_R_INPUT_ALL_C ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[2];
  220. modbus_three[TREE_R_CHN_TOTAL ].addr = &mgr->triphasic_mmap->chn_info;
  221. modbus_three[TREE_R_CHN_PH_INFO ].addr = &mgr->triphasic_mmap->pw_o_chn;
  222. modbus_three[TREE_R_TEMP_HUM ].addr = &mgr->triphasic_mmap->temperature;
  223. modbus_three[TREE_R_SWITCH_STA ].addr = &mgr->triphasic_mmap->chn_status;
  224. modbus_three[TREE_R_OPEN_DELAY ].addr = &mgr->triphasic_mmap->open_delay;
  225. modbus_three[TREE_R_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->close_delay;
  226. modbus_three[TREE_R_SENSOR ].addr = &mgr->triphasic_mmap->cas_sensor[0];
  227. modbus_three[TREE_R_DRY ].addr = &mgr->triphasic_mmap->d_node[0];
  228. modbus_three[TREE_R_BREAKER ].addr = &mgr->triphasic_mmap->breaker_value;
  229. modbus_three[TREE_W_OPEN_DELAY ].addr = &mgr->triphasic_mmap->set_chn_open_delay;
  230. modbus_three[TREE_W_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->set_chn_close_delay;
  231. modbus_three[TREE_W_CHN_SWITCH_STA ].addr = &mgr->triphasic_mmap->set_chn_switch_status;
  232. modbus_three[TREE_W_ALL_CHN_STA ].addr = &mgr->triphasic_mmap->set_chn_all_switch_status;
  233. modbus_three[TREE_R_ALL_ELE_STA ].addr = &mgr->triphasic_mmap->all_wanning;
  234. modbus_three[TREE_R_ELE_STA ].addr = &mgr->triphasic_mmap->channel_wanning[0];
  235. modbus_three[TREE_R_SENSOR_STA ].addr = &mgr->triphasic_mmap->sensor_wanning[0];
  236. #else
  237. sh->map = modbus_mapping_new_start_address(0,0,0,0,SPAECIL_USER_TOTAL_CONSUMER,4000,0,0);
  238. north_specil[N_SPAECIL_CON ].addr = &mgr->north_user.total_elec_energy;
  239. north_specil[N_SPAECIL_STA ].addr = &mgr->north_user.status_1_16;
  240. north_specil[N_SPAECIL_WANING ].addr = &mgr->north_user.total_wanning;
  241. north_specil[N_SPAECIL_SET ].addr = &mgr->north_user.set_1_16 ;
  242. #endif
  243. log_d("triphasic address init 6000\n");
  244. //return -1;
  245. }
  246. return 0;
  247. }
  248. static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
  249. {
  250. GlobalDeviceManager* mgr=get_dm();
  251. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC ||
  252. mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC){
  253. if(addr >= DEV_CHN_REG && addr <= ALL_SET_SWITCH_REG)
  254. {
  255. if(type == TYPE_U16)
  256. {
  257. uint16_t *base_addr = (uint16_t *)modbus_single[reg_type].addr;
  258. uint32_t step = addr - sh->map->start_registers;
  259. base_addr = base_addr + (addr - modbus_single[reg_type].offset);
  260. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  261. if(num < 126)
  262. {
  263. memcpy(map_addr, base_addr,2*num);
  264. }
  265. }else
  266. {
  267. uint32_t *base_addr = (uint32_t *)modbus_single[reg_type].addr;
  268. uint32_t step = addr - sh->map->start_registers;
  269. base_addr = base_addr + (addr - modbus_single[reg_type].offset) / 2;
  270. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  271. if(num < 126)
  272. {
  273. memcpy(map_addr, base_addr,2*num);
  274. }
  275. }
  276. }
  277. }else
  278. {
  279. if(addr >= TREE_DEV_CHN_REG && addr <= TREE_ALL_SET_SWITCH_REG) {
  280. if(type == TYPE_U16)
  281. {
  282. uint16_t *base_addr = (uint16_t *)modbus_three[reg_type].addr;
  283. uint32_t step = addr - sh->map->start_registers;
  284. base_addr = base_addr + (addr - modbus_three[reg_type].offset);
  285. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  286. if(num < 126)
  287. {
  288. memcpy(map_addr, base_addr,2*num);
  289. }
  290. }else
  291. {
  292. uint32_t *base_addr = (uint32_t *)modbus_three[reg_type].addr;
  293. uint32_t step = addr - sh->map->start_registers;
  294. base_addr = base_addr + (addr - modbus_three[reg_type].offset) / 2;
  295. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  296. if(num < 126)
  297. {
  298. memcpy(map_addr, base_addr,2*num);
  299. }
  300. }
  301. }
  302. }
  303. }
  304. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  305. #ifdef NORTH_USER_SPECILS
  306. {
  307. slave_handle_t *sh=&slHandle;
  308. GlobalDeviceManager* mgr=get_dm();
  309. /*
  310. #define SPAECIL_USER_TOTAL_CONSUMER (40 )
  311. #define SPAECIL_USER_TOTAL_POWER (49 )
  312. #define SPAECIL_USER_STATUS (100 )
  313. #define SPAECIL_USER_STATUS_64 (103 )
  314. #define SPAECIL_USER_WANING (2000)
  315. #define SPAECIL_USER_FATAL_64 (2005)
  316. #define SPAECIL_USER_SET_1 (3001)
  317. #define SPAECIL_USER_SET_64 (3004)
  318. */
  319. switch(addr)
  320. {
  321. case SPAECIL_USER_TOTAL_CONSUMER ... SPAECIL_USER_TOTAL_POWER:
  322. {
  323. int step = addr - SPAECIL_USER_TOTAL_CONSUMER;
  324. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[addr - SPAECIL_USER_TOTAL_CONSUMER]);
  325. uint16_t *offset_addr = (uint16_t*)(north_specil[N_SPAECIL_CON].addr) + step;
  326. memcpy(map_addr,offset_addr,lenth*2);
  327. }
  328. break;
  329. case SPAECIL_USER_STATUS ... SPAECIL_USER_STATUS_64:
  330. {
  331. int step = addr - SPAECIL_USER_STATUS;
  332. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[addr - SPAECIL_USER_TOTAL_CONSUMER]);
  333. uint16_t *offset_addr = (uint16_t*)(north_specil[N_SPAECIL_STA].addr) + step;
  334. memcpy(map_addr,offset_addr,lenth*2);
  335. }
  336. break;
  337. case SPAECIL_USER_WANING ... SPAECIL_USER_FATAL_64:
  338. {
  339. int step = addr - SPAECIL_USER_WANING;
  340. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[addr - SPAECIL_USER_TOTAL_CONSUMER]);
  341. uint16_t *offset_addr = (uint16_t*)(north_specil[N_SPAECIL_WANING].addr) + step;
  342. memcpy(map_addr,offset_addr,lenth*2);
  343. }
  344. break;
  345. default:
  346. break;
  347. }
  348. }
  349. #else
  350. {
  351. slave_handle_t *sh=&slHandle;
  352. switch (addr)
  353. {
  354. case 4000:
  355. slave_read(sh,addr,lenth,DS_R_DEV_CHN,TYPE_U16);
  356. break;
  357. case 4001 ... 4768:
  358. slave_read(sh,addr,lenth,DS_R_OUT_INFO,TYPE_U32);
  359. break;
  360. case 4769 ... 4776:
  361. slave_read(sh,addr,lenth,DS_R_IN_TOTAL,TYPE_U32);
  362. break;
  363. case 4777 ... 4778:
  364. slave_read(sh,addr,lenth,DS_R_TEMP_HUM,TYPE_U16);
  365. case 4779 ... 4842:
  366. slave_read(sh,addr,lenth,DS_R_SWITCH_STA,TYPE_U16);
  367. break;
  368. case 4843 ... 4906:
  369. slave_read(sh,addr,lenth,DS_R_OPEN_DELAY,TYPE_U16);
  370. break;
  371. case 4907 ... 4970:
  372. slave_read(sh,addr,lenth,DS_R_CLOSE_DELAY,TYPE_U16);
  373. break;
  374. case SENSOR_REG ... (DRY_REG-1):
  375. slave_read(sh,addr,lenth,DS_R_SENSOR,TYPE_U32);
  376. break;
  377. case DRY_REG ... BREAKER:
  378. slave_read(sh,addr,lenth,DS_R_DRY,TYPE_U16);
  379. break;
  380. case 5000 ... 5063:
  381. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  382. break;
  383. case 5064 ... 5127:
  384. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  385. break;
  386. case 5128 ... 5191:
  387. slave_read(sh,addr,lenth,DS_W_CHN_SWITCH_STA,TYPE_U16);
  388. break;
  389. case 5192 :
  390. slave_read(sh,addr,lenth,DS_W_ALL_CHN_STA,TYPE_U16);
  391. break;
  392. case ELE_ALL_WANNING_REG ... (ELE_ALL_WANNING_REG + ELE_LENTH):
  393. {
  394. slave_read(sh,addr,lenth,DS_R_ALL_WANIING_STA,TYPE_U16);
  395. }
  396. break;
  397. case SENSOR_WANNING_REG ... (SENSOR_WANNING_REG + SENSER_LENTH):
  398. {
  399. slave_read(sh,addr,lenth,DS_R_SENSOR_STA,TYPE_U16);
  400. }
  401. break;
  402. // triple
  403. case 6000:
  404. slave_read(sh,addr,lenth,TREE_R_DEV_CHN,TYPE_U16);
  405. break;
  406. case 6001 ... 6008:
  407. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_A,TYPE_U32);
  408. break;
  409. case 6009 ... 6016:
  410. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_B,TYPE_U32);
  411. break;
  412. case 6017 ... 6024:
  413. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_C,TYPE_U32);
  414. break;
  415. case 6025 ... 6664:
  416. slave_read(sh,addr,lenth,TREE_R_CHN_TOTAL,TYPE_U32);
  417. break;
  418. case 6665 ... 8584:
  419. slave_read(sh,addr,lenth,TREE_R_CHN_PH_INFO,TYPE_U32);
  420. break;
  421. case 8585 ... 8586:
  422. slave_read(sh,addr,lenth,TREE_R_TEMP_HUM,TYPE_U16);
  423. break;
  424. case 8587 ... 8650:
  425. slave_read(sh,addr,lenth,TREE_R_SWITCH_STA,TYPE_U16);
  426. break;
  427. case 8651 ... 8714:
  428. slave_read(sh,addr,lenth,TREE_R_OPEN_DELAY,TYPE_U16);
  429. break;
  430. case 8715 ... 8778:
  431. slave_read(sh,addr,lenth,TREE_R_CLOSE_DELAY,TYPE_U16);
  432. break;
  433. case TREE_SENSOR_REG ... (TREE_DRY_REG-1):
  434. slave_read(sh,addr,lenth,TREE_R_SENSOR,TYPE_U32);
  435. break;
  436. case TREE_DRY_REG ... TREE_BREKAER:
  437. slave_read(sh,addr,lenth,TREE_R_DRY,TYPE_U16);
  438. break;
  439. case TREE_ELE_3_ALL_WANNING_REG ... (TREE_ELE_3_WANNING_REG-1):
  440. {
  441. slave_read(sh,addr,lenth,TREE_R_ALL_ELE_STA,TYPE_U16);
  442. }
  443. break;
  444. case TREE_ELE_3_WANNING_REG ... (TREE_SENSOR_WANNING_REG-1):
  445. {
  446. slave_read(sh,addr,lenth,TREE_R_ELE_STA,TYPE_U16);
  447. }
  448. break;
  449. case TREE_SENSOR_WANNING_REG ... (TREE_SENSOR_WANNING_REG + SENSER_LENTH):
  450. {
  451. slave_read(sh,addr,lenth,TREE_R_SENSOR_STA,TYPE_U16);
  452. }
  453. break;
  454. default:
  455. break;
  456. }
  457. }
  458. #endif
  459. void cascade_slave_write(uint32_t addr, uint16_t val)
  460. #ifdef NORTH_USER_SPECILS
  461. {
  462. GlobalDeviceManager* mgr=get_dm();
  463. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC
  464. || mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC)
  465. {
  466. }else
  467. {
  468. switch(addr)
  469. {
  470. case SPAECIL_USER_SET_1 ... SPAECIL_USER_SET_64:
  471. {
  472. int step = addr - SPAECIL_USER_SET_1;
  473. uint16_t * offset_addr = (uint16_t*)(north_specil[N_SPAECIL_STA].addr + step);
  474. uint16_t buff[16] = {0};
  475. if(*offset_addr != val)
  476. {
  477. uint16_t data = (*offset_addr ^ val);
  478. for(int i = 0; i < 16;i++)
  479. {
  480. if(data & (1 << i))
  481. {
  482. //buff[i] = 1;
  483. if(val & (1 << i))
  484. {
  485. // open
  486. buff[i] = OPEN;
  487. }else
  488. {
  489. // close
  490. buff[i] = CLOSE;
  491. }
  492. }
  493. }
  494. for(int i = 0; i < 16;i++)
  495. {
  496. if(buff[i])
  497. {
  498. int start_chn = step*16 + i;
  499. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  500. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  501. if(_globalPowerMangerTemp==NULL)
  502. break;
  503. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  504. {
  505. int t_ac_CtrlType=0;
  506. int nRet = 0;
  507. uint16_t write_data = buff[i] == OPEN ? 1 : 0;
  508. _globalPowerMangerTemp->product_ch_status = write_data;
  509. GlobalTreeACManager *_globalTACManager = NULL;
  510. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  511. {
  512. t_ac_CtrlType=_globalTACManager->product_ph_outputType;
  513. }
  514. if (t_ac_CtrlType == 2&&(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  515. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  516. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two
  517. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B))
  518. {
  519. if(_globalPowerMangerTemp->product_ch_type == AC_SINGLE_S_TYPE || _globalPowerMangerTemp->product_ch_type == AC_SINGLE_B_TYPE)
  520. {
  521. if (write_data == 1)
  522. {
  523. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  524. write_data |= ENABLE_TAC_V_UP;
  525. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  526. write_data |= ENABLE_TAC_V_DOWN;
  527. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  528. write_data |= ENABLE_TAC_A_UP;
  529. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  530. write_data |= ENABLE_TAC_W_UP;
  531. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  532. write_data |= ENABLE_TAC_P_UP;
  533. }
  534. g_switch_set_ac_single_s_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr,
  535. (_globalPowerMangerTemp->product_ch_addr- 1), write_data);
  536. break;
  537. }
  538. unsigned short phsts=0;
  539. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  540. {
  541. if (write_data == 1 && _globalTACManager->product_ph_outputStatus==1)
  542. {
  543. phsts=1;
  544. if (_globalTACManager->global_over_manager.product_vol_upper_enable == 1)
  545. phsts |= ENABLE_TAC_V_UP;
  546. if (_globalTACManager->global_over_manager.product_vol_lower_enable == 1)
  547. phsts |= ENABLE_TAC_V_DOWN;
  548. if (_globalTACManager->global_over_manager.product_cur_upper_enable == 1)
  549. phsts |= ENABLE_TAC_A_UP;
  550. if (_globalTACManager->global_over_manager.product_pwr_upper_enable == 1)
  551. phsts |= ENABLE_TAC_W_UP;
  552. if (_globalTACManager->global_over_manager.product_pwrcon_upper_enable == 1)
  553. phsts |= ENABLE_TAC_P_UP;
  554. }else{
  555. phsts=0;
  556. }
  557. nRet= g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  558. _globalTACManager->product_saddr,
  559. _globalTACManager->product_ch_addr - 1,
  560. phsts);
  561. }
  562. g_switch_set_t_ac_chn_NF_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, write_data);
  563. break;
  564. }else
  565. {
  566. if (write_data == 1)
  567. {
  568. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  569. write_data |= ENABLE_TAC_V_UP;
  570. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  571. write_data |= ENABLE_TAC_V_DOWN;
  572. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  573. write_data |= ENABLE_TAC_A_UP;
  574. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  575. write_data |= ENABLE_TAC_W_UP;
  576. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  577. write_data |= ENABLE_TAC_P_UP;
  578. }
  579. /*
  580. if (isgroup)
  581. {
  582. sts |= ENABLE_TAC_STIME;
  583. sts |= ENABLE_TAC_ETIME;
  584. }*/
  585. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One)
  586. {
  587. g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  588. _globalPowerMangerTemp->product_saddr,
  589. _globalPowerMangerTemp->product_ch_addr - 1,
  590. write_data);
  591. }else{
  592. g_switch_set_t_ac_chn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  593. _globalPowerMangerTemp->product_saddr,
  594. _globalPowerMangerTemp->product_ch_addr - 1,
  595. write_data);
  596. }
  597. }
  598. }
  599. }
  600. ////////////////////////////////////////////////////////////////
  601. // if(buff[i] == OPEN)
  602. // {
  603. // *offset_addr |= (1 << i);
  604. // }else
  605. // {
  606. // *offset_addr &= ~(1 << i);
  607. // }
  608. buff[i] = 0;
  609. }
  610. }
  611. }
  612. }
  613. break;
  614. default:
  615. break;
  616. }
  617. }
  618. }
  619. #else
  620. {
  621. slave_handle_t *sh=&slHandle;
  622. GlobalDeviceManager* mgr=get_dm();
  623. uint16_t buff[128] = {0};
  624. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC
  625. || mgr->_globalDevInfo.product.pwr_type == SmartPDU_DC)
  626. {
  627. switch(addr)
  628. {
  629. case 5000 ... 5063:
  630. {
  631. int start_chn = addr - modbus_single[DS_W_OPEN_DELAY].offset;
  632. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  633. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  634. {
  635. if(_globalPowerMangerTemp==NULL)
  636. break;
  637. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  638. {
  639. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC){
  640. _globalPowerMangerTemp->product_ch_start_delay=val;
  641. g_switch_set_ac_single_s_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  642. _globalPowerMangerTemp->product_ch_addr,val);
  643. }else
  644. {
  645. _globalPowerMangerTemp->product_ch_start_delay=val;
  646. g_switch_set_dcpdu_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  647. _globalPowerMangerTemp->product_ch_addr,val/1000);
  648. }
  649. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  650. {
  651. log_e("update pwr general data err.");
  652. }
  653. log_d("val = %d start_chn = %d\n",val,start_chn);
  654. // *(uint16_t *)((uint16_t*)(modbus_single[6].addr) + start_chn) = val;
  655. break;
  656. }
  657. }
  658. }
  659. break;
  660. case 5064 ... 5127:
  661. {
  662. int start_chn = addr - modbus_single[DS_W_CLOSE_DELAY].offset;
  663. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  664. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  665. {
  666. if(_globalPowerMangerTemp==NULL)
  667. break;
  668. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  669. {
  670. if(mgr->_globalDevInfo.product.pwr_type == SmartPDU_AC){
  671. _globalPowerMangerTemp->product_ch_stop_delay=val;
  672. g_switch_set_ac_single_s_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  673. _globalPowerMangerTemp->product_ch_addr,val);
  674. }else
  675. {
  676. _globalPowerMangerTemp->product_ch_stop_delay=val;
  677. g_switch_set_dcpdu_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  678. _globalPowerMangerTemp->product_ch_addr,val/1000);
  679. }
  680. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  681. {
  682. log_e("update pwr general data err.");
  683. }
  684. log_d("val = %d",val);
  685. //*(uint16_t *)((uint16_t*)(modbus_single[7].addr) + start_chn) = val;
  686. //printf("modbus_single[7].addr = %d ",modbus_single[7].addr);
  687. break;
  688. }
  689. }
  690. }
  691. break;
  692. case 5128 ... 5191:
  693. {
  694. int start_chn = addr - modbus_single[DS_W_CHN_SWITCH_STA].offset;
  695. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  696. if (val == 0 || val == 1)
  697. {
  698. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  699. {
  700. if (_globalPowerMangerTemp == NULL)
  701. break;
  702. if ((start_chn + 1) == _globalPowerMangerTemp->product_ch_id)
  703. {
  704. int ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  705. _globalPowerMangerTemp->product_saddr,
  706. _globalPowerMangerTemp->product_ch_addr,
  707. val, false);
  708. // printf("ret = %d 0x%x\n",ret,val);
  709. *(uint16_t *)((uint16_t *)(modbus_single[DS_W_CHN_SWITCH_STA].addr) + start_chn) = val;
  710. break;
  711. }
  712. }
  713. }
  714. }
  715. break;
  716. case 5192:
  717. {
  718. if (val == 0 || val == 1)
  719. {
  720. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  721. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  722. {
  723. if (_globalPowerMangerTemp == NULL)
  724. break;
  725. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  726. // printf("rec = %d 0x%x\n",rec,val);
  727. }
  728. *(uint16_t *)(modbus_single[DS_W_ALL_CHN_STA].addr) = val;
  729. }
  730. }
  731. break;
  732. default:
  733. break;
  734. }
  735. }else{
  736. switch(addr)
  737. {
  738. case 9000 ... 9063:
  739. {
  740. int start_chn = addr - modbus_three[TREE_W_OPEN_DELAY].offset;
  741. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  742. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  743. if(_globalPowerMangerTemp==NULL)
  744. break;
  745. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  746. {
  747. int ret = 0;
  748. _globalPowerMangerTemp->product_ch_start_delay = val;
  749. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  750. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  751. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two
  752. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B
  753. )
  754. {
  755. printf("hwllo every one stop time !!!!\n");
  756. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  757. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  758. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  759. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  760. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  761. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  762. }
  763. else
  764. {
  765. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  766. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  767. }
  768. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  769. {
  770. log_e("update pwr general data err.");
  771. }
  772. break;
  773. }
  774. }
  775. }
  776. break;
  777. case 9064 ... 9127:
  778. {
  779. int start_chn = addr - modbus_three[TREE_W_CLOSE_DELAY].offset;
  780. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  781. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  782. {
  783. if(_globalPowerMangerTemp==NULL)
  784. break;
  785. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  786. {
  787. int ret = 0;
  788. _globalPowerMangerTemp->product_ch_stop_delay = val;
  789. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  790. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  791. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two
  792. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B)
  793. {
  794. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  795. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  796. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  797. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  798. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  799. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  800. }
  801. else
  802. {
  803. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  804. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  805. }
  806. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  807. {
  808. log_e("update pwr general data err.");
  809. }
  810. break;
  811. }
  812. }
  813. }
  814. break;
  815. case 9128 ... 9191:
  816. {
  817. int start_chn = addr - modbus_three[TREE_W_CHN_SWITCH_STA].offset;
  818. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  819. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  820. if(_globalPowerMangerTemp==NULL)
  821. break;
  822. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  823. {
  824. int t_ac_CtrlType=0;
  825. int nRet = 0;
  826. _globalPowerMangerTemp->product_ch_status = val;
  827. GlobalTreeACManager *_globalTACManager = NULL;
  828. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  829. {
  830. t_ac_CtrlType=_globalTACManager->product_ph_outputType;
  831. }
  832. if (t_ac_CtrlType == 2&&(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree
  833. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One
  834. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two
  835. ||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B))
  836. {
  837. if(_globalPowerMangerTemp->product_ch_type == AC_SINGLE_S_TYPE || _globalPowerMangerTemp->product_ch_type == AC_SINGLE_B_TYPE)
  838. {
  839. if (val == 1)
  840. {
  841. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  842. val |= ENABLE_TAC_V_UP;
  843. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  844. val |= ENABLE_TAC_V_DOWN;
  845. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  846. val |= ENABLE_TAC_A_UP;
  847. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  848. val |= ENABLE_TAC_W_UP;
  849. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  850. val |= ENABLE_TAC_P_UP;
  851. }
  852. g_switch_set_ac_single_s_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr,
  853. (_globalPowerMangerTemp->product_ch_addr- 1), val);
  854. break;
  855. }
  856. unsigned short phsts=0;
  857. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  858. {
  859. if (val == 1 && _globalTACManager->product_ph_outputStatus==1)
  860. {
  861. phsts=1;
  862. if (_globalTACManager->global_over_manager.product_vol_upper_enable == 1)
  863. phsts |= ENABLE_TAC_V_UP;
  864. if (_globalTACManager->global_over_manager.product_vol_lower_enable == 1)
  865. phsts |= ENABLE_TAC_V_DOWN;
  866. if (_globalTACManager->global_over_manager.product_cur_upper_enable == 1)
  867. phsts |= ENABLE_TAC_A_UP;
  868. if (_globalTACManager->global_over_manager.product_pwr_upper_enable == 1)
  869. phsts |= ENABLE_TAC_W_UP;
  870. if (_globalTACManager->global_over_manager.product_pwrcon_upper_enable == 1)
  871. phsts |= ENABLE_TAC_P_UP;
  872. }else{
  873. phsts=0;
  874. }
  875. nRet= g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  876. _globalTACManager->product_saddr,
  877. _globalTACManager->product_ch_addr - 1,
  878. phsts);
  879. }
  880. g_switch_set_t_ac_chn_NF_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, val);
  881. break;
  882. }else
  883. {
  884. if (val == 1)
  885. {
  886. if (_globalPowerMangerTemp->global_over_manager.product_vol_upper_enable == 1)
  887. val |= ENABLE_TAC_V_UP;
  888. if (_globalPowerMangerTemp->global_over_manager.product_vol_lower_enable == 1)
  889. val |= ENABLE_TAC_V_DOWN;
  890. if (_globalPowerMangerTemp->global_over_manager.product_cur_upper_enable == 1)
  891. val |= ENABLE_TAC_A_UP;
  892. if (_globalPowerMangerTemp->global_over_manager.product_pwr_upper_enable == 1)
  893. val |= ENABLE_TAC_W_UP;
  894. if (_globalPowerMangerTemp->global_over_manager.product_pwrcon_upper_enable == 1)
  895. val |= ENABLE_TAC_P_UP;
  896. }
  897. /*
  898. if (isgroup)
  899. {
  900. sts |= ENABLE_TAC_STIME;
  901. sts |= ENABLE_TAC_ETIME;
  902. }*/
  903. if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One)
  904. {
  905. g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  906. _globalPowerMangerTemp->product_saddr,
  907. _globalPowerMangerTemp->product_ch_addr - 1,
  908. val);
  909. }else{
  910. g_switch_set_t_ac_chn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  911. _globalPowerMangerTemp->product_saddr,
  912. _globalPowerMangerTemp->product_ch_addr - 1,
  913. val);
  914. }
  915. }
  916. }
  917. }
  918. }
  919. break;
  920. case 9192:
  921. {
  922. if (val == 0 || val == 1)
  923. {
  924. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  925. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  926. {
  927. if (_globalPowerMangerTemp == NULL)
  928. break;
  929. _globalPowerMangerTemp->product_ch_status = val;
  930. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  931. // printf("rec = %d 0x%x\n",rec,val);
  932. g_switch_set_t_ac_chn_NF_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, val);
  933. }
  934. }
  935. }
  936. break;
  937. default:
  938. break;
  939. }
  940. }
  941. }
  942. #endif