cascade_slave.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. #include "modbus_handle.h"
  8. #define DEV_CHN_REG (4000)
  9. #define OUT_INFO_REG (4001)
  10. #define IN_TOTAL_REG (4768)
  11. #define TEM_HUMAN_REG (4777)
  12. #define CHN_SWITCH_REG (4779)
  13. #define CHN_OPEN_DLA_REG (4843)
  14. #define CHN_CLOSE_DLA_REG (4907)
  15. #define CHN_SET_OPEN_DLA_REG (5000)
  16. #define CHN_SET_CLOSE_DLA_REG (5064)
  17. #define CHN_SET_SWITCH_STA_REG (5128)
  18. #define ALL_SET_SWITCH_REG (5192)
  19. #define For85_DEV_CHN_REG (4000)
  20. #define For85_ALL_OVER (4100)
  21. #define For85_SET_ADDR (4101)
  22. #define For85_SET_RECOVERY (4102)
  23. #define For85_SET_REBOOT (4103)
  24. #define For85_CONESUMER_CLEAR (4104)
  25. enum{
  26. D_For85_DEV_CHN_REG=0,
  27. };
  28. static mmap_modbus_t For85[] = {
  29. [D_For85_DEV_CHN_REG ]{.offset = For85_DEV_CHN_REG },
  30. };
  31. enum{
  32. TYPE_U16,
  33. TYPE_U32
  34. };
  35. // enum {
  36. // DS_R_DEV_CHN = 0,
  37. // DS_R_OUT_INFO,
  38. // DS_R_IN_TOTAL,
  39. // DS_R_TEMP_HUM,
  40. // DS_R_SWITCH_STA,
  41. // DS_R_OPEN_DELAY,
  42. // DS_R_CLOSE_DELAY,
  43. // DS_W_OPEN_DELAY,
  44. // DS_W_CLOSE_DELAY,
  45. // DS_W_CHN_SWITCH_STA,
  46. // DS_W_ALL_CHN_STA
  47. // };
  48. // #define TREE_DEV_CHN_REG (6000)
  49. // #define TREE_INPUT_A_REG (6001)
  50. // #define TREE_INPUT_B_REG (6009)
  51. // #define TREE_INPUT_C_REG (6017)
  52. // #define TREE_CHN_TOTAL_REG (6025)
  53. // #define TREE_CHN_PH_REG (6665)
  54. // #define TREE_TEMP_HUM_REG (8585)
  55. // #define TREE_CHN_SWITCH_STA_REG (8587)
  56. // #define TREE_CHN_OPEN_DLA_REG (8651)
  57. // #define TREE_CHN_CLOSE_DLA_REG (8715)
  58. // #define TREE_CHN_SET_OPEN_DLA_REG (9000)
  59. // #define TREE_CHN_SET_CLOSE_DLA_REG (9064)
  60. // #define TREE_CHN_SET_SWITCH_STA_REG (9128)
  61. // #define TREE_ALL_SET_SWITCH_REG (9192)
  62. // enum {
  63. // TREE_R_DEV_CHN,
  64. // TREE_R_INPUT_ALL_A,
  65. // TREE_R_INPUT_ALL_B,
  66. // TREE_R_INPUT_ALL_C,
  67. // TREE_R_CHN_TOTAL,
  68. // TREE_R_CHN_PH_INFO,
  69. // TREE_R_TEMP_HUM,
  70. // TREE_R_SWITCH_STA,
  71. // TREE_R_OPEN_DELAY,
  72. // TREE_R_CLOSE_DELAY,
  73. // TREE_W_OPEN_DELAY,
  74. // TREE_W_CLOSE_DELAY,
  75. // TREE_W_CHN_SWITCH_STA,
  76. // TREE_W_ALL_CHN_STA
  77. // };
  78. // #define DEV_CHN_REG (4000)
  79. // #define SWITCH_STATUE_REG (4001)
  80. // #define POWER_INFO_REG (4002)
  81. // #define TEPM_HUM_REG (4016)
  82. // #define SENCOR_STATUS (4018)
  83. // enum{
  84. // IP_DEV_CHN,
  85. // IP_SWITCH_STATUE,
  86. // IP_POWER_INFO,
  87. // IP_TEMP_HUM,
  88. // IP_SENCOR_STATUS,
  89. // };
  90. static inline GlobalDeviceManager* get_dm(void)
  91. {
  92. return &__globalDeviceManage;
  93. }
  94. // static inline GlobalDeviceManager* get_dm2(void)
  95. // {
  96. // return &__globalDeviceManage2;
  97. // }
  98. // static mmap_modbus_t modbus_single[] = {
  99. // [DS_R_DEV_CHN ]{.offset = DEV_CHN_REG },
  100. // [DS_R_OUT_INFO ]{.offset = OUT_INFO_REG },
  101. // [DS_R_IN_TOTAL ]{.offset = IN_TOTAL_REG },
  102. // [DS_R_TEMP_HUM ]{.offset = TEM_HUMAN_REG },
  103. // [DS_R_SWITCH_STA ]{.offset = CHN_SWITCH_REG },
  104. // [DS_R_OPEN_DELAY ]{.offset = CHN_OPEN_DLA_REG },
  105. // [DS_R_CLOSE_DELAY ]{.offset = CHN_CLOSE_DLA_REG },
  106. // [DS_W_OPEN_DELAY ]{.offset = CHN_SET_OPEN_DLA_REG },
  107. // [DS_W_CLOSE_DELAY ]{.offset = CHN_SET_CLOSE_DLA_REG },
  108. // [DS_W_CHN_SWITCH_STA]{.offset = CHN_SET_SWITCH_STA_REG },
  109. // [DS_W_ALL_CHN_STA ]{.offset = ALL_SET_SWITCH_REG },
  110. // };
  111. // static mmap_modbus_t modbus_three[] = {
  112. // [TREE_R_DEV_CHN ]{.offset = TREE_DEV_CHN_REG},
  113. // [TREE_R_INPUT_ALL_A ]{.offset = TREE_INPUT_A_REG },
  114. // [TREE_R_INPUT_ALL_B ]{.offset = TREE_INPUT_B_REG },
  115. // [TREE_R_INPUT_ALL_C ]{.offset = TREE_INPUT_C_REG },
  116. // [TREE_R_CHN_TOTAL ]{.offset = TREE_CHN_TOTAL_REG },
  117. // [TREE_R_CHN_PH_INFO ]{.offset = TREE_CHN_PH_REG },
  118. // [TREE_R_TEMP_HUM ]{.offset = TREE_TEMP_HUM_REG },
  119. // [TREE_R_SWITCH_STA ]{.offset = TREE_CHN_SWITCH_STA_REG},
  120. // [TREE_R_OPEN_DELAY ]{.offset = TREE_CHN_OPEN_DLA_REG },
  121. // [TREE_R_CLOSE_DELAY ]{.offset = TREE_CHN_CLOSE_DLA_REG },
  122. // [TREE_W_OPEN_DELAY ]{.offset = TREE_CHN_SET_OPEN_DLA_REG},
  123. // [TREE_W_CLOSE_DELAY ]{.offset = TREE_CHN_SET_CLOSE_DLA_REG},
  124. // [TREE_W_CHN_SWITCH_STA ]{.offset = TREE_CHN_SET_SWITCH_STA_REG},
  125. // [TREE_W_ALL_CHN_STA ]{.offset = TREE_ALL_SET_SWITCH_REG }
  126. // };
  127. typedef struct {
  128. modbus_mapping_t *map;
  129. }slave_handle_t;
  130. static slave_handle_t slHandle;
  131. modbus_mapping_t *cascade_slave_map()
  132. {
  133. return slHandle.map;
  134. }
  135. int cascade_slave_init(void)
  136. {
  137. slave_handle_t *sh=&slHandle;
  138. GlobalDeviceManager* mgr=get_dm();
  139. if(sh->map)
  140. {
  141. free(sh->map);
  142. sh->map = 0;
  143. }
  144. sh->map = modbus_mapping_new_start_address(0,0,0,0,For85_DEV_CHN_REG,200,0,0); //3000 ge
  145. For85[D_For85_DEV_CHN_REG].addr = &mgr->for85_data.addr;
  146. return 0;
  147. }
  148. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  149. {
  150. slave_handle_t *sh=&slHandle;
  151. switch (addr)
  152. {
  153. case For85_DEV_CHN_REG ... For85_ALL_OVER:
  154. {
  155. uint16_t *base_addr = (uint16_t *)For85[D_For85_DEV_CHN_REG].addr;
  156. uint32_t step = addr - sh->map->start_registers;
  157. base_addr = base_addr + (addr - For85[D_For85_DEV_CHN_REG].offset);
  158. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  159. if(lenth < 126)
  160. {
  161. memcpy(map_addr, base_addr,2*lenth);
  162. }
  163. }
  164. break;
  165. }
  166. }
  167. void cascade_slave_write(void* manager,uint32_t addr,uint16_t val)
  168. {
  169. GlobalDeviceManager* mgr=get_dm();
  170. switch(addr)
  171. {
  172. case For85_SET_ADDR:
  173. {
  174. dev_set_485_saddr(mgr->db,val,mgr->_global_device_info);
  175. Modbus_Manger *modbus_manger = (Modbus_Manger *)(manager);
  176. pthread_mutex_lock(&modbus_manger->mutex);
  177. modbus_set_slave(modbus_manger->mb, addr);
  178. pthread_mutex_unlock(&modbus_manger->mutex);
  179. }
  180. break;
  181. case For85_SET_RECOVERY:
  182. {
  183. sqlite3_close(mgr->db);
  184. system("cp -r /opt/pdu_dat_bak.db /opt/pdu_dat.db");
  185. system("reboot -f");
  186. }
  187. break;
  188. case For85_SET_REBOOT:
  189. {
  190. sqlite3_close(mgr->db);
  191. system("reboot -f");
  192. }
  193. break;
  194. case For85_CONESUMER_CLEAR:
  195. {
  196. mgr->_global_device_info->consumer = 0.0;
  197. }
  198. break;
  199. default:
  200. break;
  201. }
  202. }