cascade_slave.c 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  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 "sys.h"
  8. #include "thread.h"
  9. #include "sensor_handle.h"
  10. #define DEV_CHN_REG (4000)
  11. #define OUT_INFO_REG (4001)
  12. #define IN_TOTAL_REG (4768)
  13. #define TEM_HUMAN_REG (4777)
  14. #define CHN_SWITCH_REG (4779)
  15. #define CHN_OPEN_DLA_REG (4843)
  16. #define CHN_CLOSE_DLA_REG (4907)
  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. enum{
  22. TYPE_U16,
  23. TYPE_U32
  24. };
  25. enum {
  26. DS_R_DEV_CHN = 0,
  27. DS_R_OUT_INFO,
  28. DS_R_IN_TOTAL,
  29. DS_R_TEMP_HUM,
  30. DS_R_SWITCH_STA,
  31. DS_R_OPEN_DELAY,
  32. DS_R_CLOSE_DELAY,
  33. DS_W_OPEN_DELAY,
  34. DS_W_CLOSE_DELAY,
  35. DS_W_CHN_SWITCH_STA,
  36. DS_W_ALL_CHN_STA
  37. };
  38. #define TREE_DEV_CHN_REG (6000)
  39. #define TREE_INPUT_A_REG (6001)
  40. #define TREE_INPUT_B_REG (6009)
  41. #define TREE_INPUT_C_REG (6017)
  42. #define TREE_CHN_TOTAL_REG (6025)
  43. #define TREE_CHN_PH_REG (6665)
  44. #define TREE_TEMP_HUM_REG (8585)
  45. #define TREE_CHN_SWITCH_STA_REG (8587)
  46. #define TREE_CHN_OPEN_DLA_REG (8651)
  47. #define TREE_CHN_CLOSE_DLA_REG (8715)
  48. #define TREE_CHN_SET_OPEN_DLA_REG (9000)
  49. #define TREE_CHN_SET_CLOSE_DLA_REG (9064)
  50. #define TREE_CHN_SET_SWITCH_STA_REG (9128)
  51. #define TREE_ALL_SET_SWITCH_REG (9192)
  52. enum {
  53. TREE_R_DEV_CHN,
  54. TREE_R_INPUT_ALL_A,
  55. TREE_R_INPUT_ALL_B,
  56. TREE_R_INPUT_ALL_C,
  57. TREE_R_CHN_TOTAL,
  58. TREE_R_CHN_PH_INFO,
  59. TREE_R_TEMP_HUM,
  60. TREE_R_SWITCH_STA,
  61. TREE_R_OPEN_DELAY,
  62. TREE_R_CLOSE_DELAY,
  63. TREE_W_OPEN_DELAY,
  64. TREE_W_CLOSE_DELAY,
  65. TREE_W_CHN_SWITCH_STA,
  66. TREE_W_ALL_CHN_STA
  67. };
  68. #define DEV_CHN_REG (4000)
  69. #define DEV_IP_MAC (4001)
  70. #define POWER_INFO_REG (4007) //32*16
  71. #define POWER_LENTH (542)
  72. #define WARNING_485_IP (4600)
  73. #define W_LENTH (32)
  74. #define IP_SET_SADDR_VOLTAGE_MAX (4600)
  75. #define IP_SET_SADDR_VOLTAGE_MIN (4700)
  76. #define IP_SET_CUREENT_MAX (4800)
  77. #define IP_SET_POWER_MAX (4900)
  78. #define IP_SET_CONSUMER_MAX (5000)
  79. enum{
  80. DS_IP_DEV_CHN,
  81. DS_IP_MAC,
  82. DS_POWER_INFO_REG,
  83. DS_WANNING_REG,
  84. };
  85. static inline GlobalDeviceManager* get_dm(void)
  86. {
  87. return &__globalDeviceManage;
  88. }
  89. static inline GlobalDeviceManager* get_dm2(void)
  90. {
  91. return &__globalDeviceManage2;
  92. }
  93. static mmap_modbus_t modbus_single[] = {
  94. [DS_R_DEV_CHN ]{.offset = DEV_CHN_REG },
  95. [DS_R_OUT_INFO ]{.offset = OUT_INFO_REG },
  96. [DS_R_IN_TOTAL ]{.offset = IN_TOTAL_REG },
  97. [DS_R_TEMP_HUM ]{.offset = TEM_HUMAN_REG },
  98. [DS_R_SWITCH_STA ]{.offset = CHN_SWITCH_REG },
  99. [DS_R_OPEN_DELAY ]{.offset = CHN_OPEN_DLA_REG },
  100. [DS_R_CLOSE_DELAY ]{.offset = CHN_CLOSE_DLA_REG },
  101. [DS_W_OPEN_DELAY ]{.offset = CHN_SET_OPEN_DLA_REG },
  102. [DS_W_CLOSE_DELAY ]{.offset = CHN_SET_CLOSE_DLA_REG },
  103. [DS_W_CHN_SWITCH_STA]{.offset = CHN_SET_SWITCH_STA_REG },
  104. [DS_W_ALL_CHN_STA ]{.offset = ALL_SET_SWITCH_REG },
  105. };
  106. static mmap_modbus_t modbus_three[] = {
  107. [TREE_R_DEV_CHN ]{.offset = TREE_DEV_CHN_REG},
  108. [TREE_R_INPUT_ALL_A ]{.offset = TREE_INPUT_A_REG },
  109. [TREE_R_INPUT_ALL_B ]{.offset = TREE_INPUT_B_REG },
  110. [TREE_R_INPUT_ALL_C ]{.offset = TREE_INPUT_C_REG },
  111. [TREE_R_CHN_TOTAL ]{.offset = TREE_CHN_TOTAL_REG },
  112. [TREE_R_CHN_PH_INFO ]{.offset = TREE_CHN_PH_REG },
  113. [TREE_R_TEMP_HUM ]{.offset = TREE_TEMP_HUM_REG },
  114. [TREE_R_SWITCH_STA ]{.offset = TREE_CHN_SWITCH_STA_REG},
  115. [TREE_R_OPEN_DELAY ]{.offset = TREE_CHN_OPEN_DLA_REG },
  116. [TREE_R_CLOSE_DELAY ]{.offset = TREE_CHN_CLOSE_DLA_REG },
  117. [TREE_W_OPEN_DELAY ]{.offset = TREE_CHN_SET_OPEN_DLA_REG},
  118. [TREE_W_CLOSE_DELAY ]{.offset = TREE_CHN_SET_CLOSE_DLA_REG},
  119. [TREE_W_CHN_SWITCH_STA ]{.offset = TREE_CHN_SET_SWITCH_STA_REG},
  120. [TREE_W_ALL_CHN_STA ]{.offset = TREE_ALL_SET_SWITCH_REG }
  121. };
  122. static mmap_modbus_t ip[] ={
  123. [DS_IP_DEV_CHN ]{.offset = DEV_CHN_REG },
  124. [DS_IP_MAC ]{.offset = DEV_IP_MAC },
  125. [DS_POWER_INFO_REG ]{.offset = POWER_INFO_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. #if 0
  136. int cascade_slave_init(void)
  137. {
  138. slave_handle_t *sh=&slHandle;
  139. GlobalDeviceManager* mgr=get_dm();
  140. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  141. mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC) // single AC
  142. {
  143. if(sh->map)
  144. {
  145. free(sh->map);
  146. sh->map = NULL;
  147. }
  148. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,5000,0,0); //3000 ge
  149. modbus_single[DS_R_DEV_CHN ].addr = &mgr->single_mmap->dev_chn;
  150. modbus_single[DS_R_OUT_INFO ].addr = &mgr->single_mmap->all_ch;
  151. modbus_single[DS_R_IN_TOTAL ].addr = &mgr->single_mmap->total_valtage;
  152. modbus_single[DS_R_TEMP_HUM ].addr = &mgr->single_mmap->total_temp;
  153. modbus_single[DS_R_SWITCH_STA ].addr = &mgr->single_mmap->chn_status;
  154. modbus_single[DS_R_OPEN_DELAY ].addr = &mgr->single_mmap->open_delay;
  155. modbus_single[DS_R_CLOSE_DELAY ].addr = &mgr->single_mmap->close_delay;
  156. modbus_single[DS_W_OPEN_DELAY ].addr = &mgr->single_mmap->set_chn_open_delay;
  157. modbus_single[DS_W_CLOSE_DELAY ].addr = &mgr->single_mmap->set_chn_close_delay;
  158. modbus_single[DS_W_CHN_SWITCH_STA ].addr = &mgr->single_mmap->set_chn_switch_status;
  159. modbus_single[DS_W_ALL_CHN_STA ].addr = &mgr->single_mmap->set_chn_all_switch_status;
  160. printf("single dc address init 4000\n");
  161. }else
  162. {
  163. if(sh->map)
  164. {
  165. free(sh->map);
  166. sh->map = NULL;
  167. }
  168. sh->map = modbus_mapping_new_start_address(0,0,0,0,TREE_DEV_CHN_REG,7000,0,0);
  169. modbus_three[TREE_R_DEV_CHN ].addr = &mgr->triphasic_mmap->dev_chn;
  170. modbus_three[TREE_R_INPUT_ALL_A ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[0];
  171. modbus_three[TREE_R_INPUT_ALL_B ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[1];
  172. modbus_three[TREE_R_INPUT_ALL_C ].addr = &mgr->triphasic_mmap->i_total.pw_i_total[2];
  173. modbus_three[TREE_R_CHN_TOTAL ].addr = &mgr->triphasic_mmap->chn_info;
  174. modbus_three[TREE_R_CHN_PH_INFO ].addr = &mgr->triphasic_mmap->pw_o_chn;
  175. modbus_three[TREE_R_TEMP_HUM ].addr = &mgr->triphasic_mmap->temperature;
  176. modbus_three[TREE_R_SWITCH_STA ].addr = &mgr->triphasic_mmap->chn_status;
  177. modbus_three[TREE_R_OPEN_DELAY ].addr = &mgr->triphasic_mmap->open_delay;
  178. modbus_three[TREE_R_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->close_delay;
  179. modbus_three[TREE_W_OPEN_DELAY ].addr = &mgr->triphasic_mmap->set_chn_open_delay;
  180. modbus_three[TREE_W_CLOSE_DELAY ].addr = &mgr->triphasic_mmap->set_chn_close_delay;
  181. modbus_three[TREE_W_CHN_SWITCH_STA ].addr = &mgr->triphasic_mmap->set_chn_switch_status;
  182. modbus_three[TREE_W_ALL_CHN_STA ].addr = &mgr->triphasic_mmap->set_chn_all_switch_status;
  183. printf("triphasic address init 6000\n");
  184. //return -1;
  185. }
  186. return 0;
  187. }
  188. static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
  189. {
  190. GlobalDeviceManager* mgr=get_dm();
  191. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  192. mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC){
  193. if(addr >= DEV_CHN_REG && addr <= ALL_SET_SWITCH_REG)
  194. {
  195. if(type == TYPE_U16)
  196. {
  197. uint16_t *base_addr = (uint16_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);
  200. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  201. if(num < 126)
  202. {
  203. memcpy(map_addr, base_addr,2*num);
  204. }
  205. }else
  206. {
  207. uint32_t *base_addr = (uint32_t *)modbus_single[reg_type].addr;
  208. uint32_t step = addr - sh->map->start_registers;
  209. base_addr = base_addr + (addr - modbus_single[reg_type].offset) / 2;
  210. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  211. if(num < 126)
  212. {
  213. memcpy(map_addr, base_addr,2*num);
  214. }
  215. }
  216. }
  217. }else
  218. {
  219. if(addr >= TREE_DEV_CHN_REG && addr <= TREE_ALL_SET_SWITCH_REG) {
  220. if(type == TYPE_U16)
  221. {
  222. uint16_t *base_addr = (uint16_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);
  225. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  226. if(num < 126)
  227. {
  228. memcpy(map_addr, base_addr,2*num);
  229. }
  230. }else
  231. {
  232. uint32_t *base_addr = (uint32_t *)modbus_three[reg_type].addr;
  233. uint32_t step = addr - sh->map->start_registers;
  234. base_addr = base_addr + (addr - modbus_three[reg_type].offset) / 2;
  235. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  236. if(num < 126)
  237. {
  238. memcpy(map_addr, base_addr,2*num);
  239. }
  240. }
  241. }
  242. }
  243. }
  244. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  245. {
  246. slave_handle_t *sh=&slHandle;
  247. switch (addr)
  248. {
  249. case 4000:
  250. slave_read(sh,addr,lenth,DS_R_DEV_CHN,TYPE_U16);
  251. break;
  252. case 4001 ... 4768:
  253. slave_read(sh,addr,lenth,DS_R_OUT_INFO,TYPE_U32);
  254. break;
  255. case 4769 ... 4776:
  256. slave_read(sh,addr,lenth,DS_R_IN_TOTAL,TYPE_U32);
  257. break;
  258. case 4777 ... 4778:
  259. slave_read(sh,addr,lenth,DS_R_TEMP_HUM,TYPE_U16);
  260. case 4779 ... 4842:
  261. slave_read(sh,addr,lenth,DS_R_SWITCH_STA,TYPE_U16);
  262. break;
  263. case 4843 ... 4906:
  264. slave_read(sh,addr,lenth,DS_R_OPEN_DELAY,TYPE_U16);
  265. break;
  266. case 4907 ... 4970:
  267. slave_read(sh,addr,lenth,DS_R_CLOSE_DELAY,TYPE_U16);
  268. break;
  269. case 5000 ... 5063:
  270. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  271. break;
  272. case 5064 ... 5127:
  273. slave_read(sh,addr,lenth,DS_W_OPEN_DELAY,TYPE_U16);
  274. break;
  275. case 5128 ... 5191:
  276. slave_read(sh,addr,lenth,DS_W_CHN_SWITCH_STA,TYPE_U16);
  277. break;
  278. case 5192 :
  279. slave_read(sh,addr,lenth,DS_W_ALL_CHN_STA,TYPE_U16);
  280. break;
  281. // triple
  282. case 6000:
  283. slave_read(sh,addr,lenth,TREE_R_DEV_CHN,TYPE_U16);
  284. break;
  285. case 6001 ... 6008:
  286. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_A,TYPE_U32);
  287. break;
  288. case 6009 ... 6016:
  289. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_B,TYPE_U32);
  290. break;
  291. case 6017 ... 6024:
  292. slave_read(sh,addr,lenth,TREE_R_INPUT_ALL_C,TYPE_U32);
  293. break;
  294. case 6025 ... 6664:
  295. slave_read(sh,addr,lenth,TREE_R_CHN_TOTAL,TYPE_U32);
  296. break;
  297. case 6665 ... 8584:
  298. slave_read(sh,addr,lenth,TREE_R_CHN_PH_INFO,TYPE_U32);
  299. break;
  300. case 8585 ... 8586:
  301. slave_read(sh,addr,lenth,TREE_R_TEMP_HUM,TYPE_U16);
  302. break;
  303. case 8587 ... 8650:
  304. slave_read(sh,addr,lenth,TREE_R_SWITCH_STA,TYPE_U16);
  305. break;
  306. case 8651 ... 8714:
  307. slave_read(sh,addr,lenth,TREE_R_OPEN_DELAY,TYPE_U16);
  308. break;
  309. case 8715 ... 8778:
  310. slave_read(sh,addr,lenth,TREE_R_CLOSE_DELAY,TYPE_U16);
  311. break;
  312. default:
  313. break;
  314. }
  315. }
  316. void cascade_slave_write(uint32_t addr, uint16_t val)
  317. {
  318. slave_handle_t *sh=&slHandle;
  319. GlobalDeviceManager* mgr=get_dm();
  320. uint16_t buff[128] = {0};
  321. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC
  322. || mgr->_globalDevInfo.product_pwr_type == SmartPDU_DC)
  323. {
  324. switch(addr)
  325. {
  326. case 5000 ... 5063:
  327. {
  328. int start_chn = addr - modbus_single[DS_W_OPEN_DELAY].offset;
  329. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  330. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  331. {
  332. if(_globalPowerMangerTemp==NULL)
  333. break;
  334. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  335. {
  336. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC){
  337. _globalPowerMangerTemp->product_ch_start_delay=val;
  338. g_switch_set_ac_single_s_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  339. _globalPowerMangerTemp->product_ch_addr,val);
  340. }else
  341. {
  342. _globalPowerMangerTemp->product_ch_start_delay=val;
  343. g_switch_set_dcpdu_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  344. _globalPowerMangerTemp->product_ch_addr,val/1000);
  345. }
  346. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  347. {
  348. log_e("update pwr general data err.");
  349. }
  350. printf("val = %d start_chn = %d\n",val,start_chn);
  351. // *(uint16_t *)((uint16_t*)(modbus_single[6].addr) + start_chn) = val;
  352. break;
  353. }
  354. }
  355. }
  356. break;
  357. case 5064 ... 5127:
  358. {
  359. int start_chn = addr - modbus_single[DS_W_CLOSE_DELAY].offset;
  360. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  361. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  362. {
  363. if(_globalPowerMangerTemp==NULL)
  364. break;
  365. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  366. {
  367. if(mgr->_globalDevInfo.product_pwr_type == SmartPDU_AC){
  368. _globalPowerMangerTemp->product_ch_stop_delay=val;
  369. g_switch_set_ac_single_s_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  370. _globalPowerMangerTemp->product_ch_addr,val);
  371. }else
  372. {
  373. _globalPowerMangerTemp->product_ch_stop_delay=val;
  374. g_switch_set_dcpdu_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_saddr,
  375. _globalPowerMangerTemp->product_ch_addr,val/1000);
  376. }
  377. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  378. {
  379. log_e("update pwr general data err.");
  380. }
  381. printf("val = %d",val);
  382. //*(uint16_t *)((uint16_t*)(modbus_single[7].addr) + start_chn) = val;
  383. //printf("modbus_single[7].addr = %d ",modbus_single[7].addr);
  384. break;
  385. }
  386. }
  387. }
  388. break;
  389. case 5128 ... 5191:
  390. {
  391. int start_chn = addr - modbus_single[DS_W_CHN_SWITCH_STA].offset;
  392. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  393. if (val == 0 || val == 1)
  394. {
  395. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  396. {
  397. if (_globalPowerMangerTemp == NULL)
  398. break;
  399. if ((start_chn + 1) == _globalPowerMangerTemp->product_ch_id)
  400. {
  401. int ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  402. _globalPowerMangerTemp->product_saddr,
  403. _globalPowerMangerTemp->product_ch_addr,
  404. val, false);
  405. // printf("ret = %d 0x%x\n",ret,val);
  406. *(uint16_t *)((uint16_t *)(modbus_single[DS_W_CHN_SWITCH_STA].addr) + start_chn) = val;
  407. break;
  408. }
  409. }
  410. }
  411. }
  412. break;
  413. case 5192:
  414. {
  415. if (val == 0 || val == 1)
  416. {
  417. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  418. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  419. {
  420. if (_globalPowerMangerTemp == NULL)
  421. break;
  422. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  423. // printf("rec = %d 0x%x\n",rec,val);
  424. }
  425. *(uint16_t *)(modbus_single[DS_W_ALL_CHN_STA].addr) = val;
  426. }
  427. }
  428. break;
  429. default:
  430. break;
  431. }
  432. }else{
  433. switch(addr)
  434. {
  435. case 9000 ... 9063:
  436. {
  437. int start_chn = addr - modbus_three[TREE_W_OPEN_DELAY].offset;
  438. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  439. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  440. if(_globalPowerMangerTemp==NULL)
  441. break;
  442. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  443. {
  444. int ret = 0;
  445. _globalPowerMangerTemp->product_ch_start_delay = val;
  446. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  447. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  448. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B
  449. )
  450. {
  451. printf("hwllo every one stop time !!!!\n");
  452. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  453. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  454. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  455. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  456. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  457. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  458. }
  459. else
  460. {
  461. ret = g_switch_set_t_ac_start_time_delay(&__globalDeviceManage._globalRelaySampManger,
  462. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  463. }
  464. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  465. {
  466. log_e("update pwr general data err.");
  467. }
  468. break;
  469. }
  470. }
  471. }
  472. break;
  473. case 9064 ... 9127:
  474. {
  475. int start_chn = addr - modbus_three[TREE_W_CLOSE_DELAY].offset;
  476. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  477. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  478. {
  479. if(_globalPowerMangerTemp==NULL)
  480. break;
  481. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  482. {
  483. int ret = 0;
  484. _globalPowerMangerTemp->product_ch_stop_delay = val;
  485. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  486. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  487. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  488. {
  489. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  490. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  491. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  492. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 1, val / 1000);
  493. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  494. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3 + 2, val / 1000);
  495. }
  496. else
  497. {
  498. ret = g_switch_set_t_ac_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,
  499. _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr - 1) * 3, val / 1000);
  500. }
  501. if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
  502. {
  503. log_e("update pwr general data err.");
  504. }
  505. break;
  506. }
  507. }
  508. }
  509. break;
  510. case 9128 ... 9191:
  511. {
  512. int start_chn = addr - modbus_three[TREE_W_CHN_SWITCH_STA].offset;
  513. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  514. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list){
  515. if(_globalPowerMangerTemp==NULL)
  516. break;
  517. if((start_chn+1) == _globalPowerMangerTemp->product_ch_id)
  518. {
  519. int t_ac_CtrlType=0;
  520. int nRet = 0;
  521. _globalPowerMangerTemp->product_ch_status = val;
  522. GlobalTreeACManager *_globalTACManager = NULL;
  523. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  524. {
  525. t_ac_CtrlType=_globalTACManager->product_ph_outputType;
  526. }
  527. if (t_ac_CtrlType == 2&&(__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree
  528. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One
  529. ||__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B))
  530. {
  531. if(_globalPowerMangerTemp->product_ch_type == AC_SINGLE_S_TYPE || _globalPowerMangerTemp->product_ch_type == AC_SINGLE_B_TYPE)
  532. {
  533. if (val == 1)
  534. {
  535. if (_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable == 1)
  536. val |= ENABLE_TAC_V_UP;
  537. if (_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable == 1)
  538. val |= ENABLE_TAC_V_DOWN;
  539. if (_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable == 1)
  540. val |= ENABLE_TAC_A_UP;
  541. if (_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable == 1)
  542. val |= ENABLE_TAC_W_UP;
  543. if (_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable == 1)
  544. val |= ENABLE_TAC_P_UP;
  545. }
  546. g_switch_set_ac_single_s_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_saddr,
  547. (_globalPowerMangerTemp->product_ch_addr- 1), val);
  548. break;
  549. }
  550. unsigned short phsts=0;
  551. list_for_each_entry(_globalTACManager, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  552. {
  553. if (val == 1 && _globalTACManager->product_ph_outputStatus==1)
  554. {
  555. phsts=1;
  556. if (_globalTACManager->global_over_manager->product_vol_upper_enable == 1)
  557. phsts |= ENABLE_TAC_V_UP;
  558. if (_globalTACManager->global_over_manager->product_vol_lower_enable == 1)
  559. phsts |= ENABLE_TAC_V_DOWN;
  560. if (_globalTACManager->global_over_manager->product_cur_upper_enable == 1)
  561. phsts |= ENABLE_TAC_A_UP;
  562. if (_globalTACManager->global_over_manager->product_pwr_upper_enable == 1)
  563. phsts |= ENABLE_TAC_W_UP;
  564. if (_globalTACManager->global_over_manager->product_pwrcon_upper_enable == 1)
  565. phsts |= ENABLE_TAC_P_UP;
  566. }else{
  567. phsts=0;
  568. }
  569. nRet= g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  570. _globalTACManager->product_saddr,
  571. _globalTACManager->product_ch_addr - 1,
  572. phsts);
  573. }
  574. break;
  575. }else
  576. {
  577. if (val == 1)
  578. {
  579. if (_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable == 1)
  580. val |= ENABLE_TAC_V_UP;
  581. if (_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable == 1)
  582. val |= ENABLE_TAC_V_DOWN;
  583. if (_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable == 1)
  584. val |= ENABLE_TAC_A_UP;
  585. if (_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable == 1)
  586. val |= ENABLE_TAC_W_UP;
  587. if (_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable == 1)
  588. val |= ENABLE_TAC_P_UP;
  589. }
  590. /*
  591. if (isgroup)
  592. {
  593. sts |= ENABLE_TAC_STIME;
  594. sts |= ENABLE_TAC_ETIME;
  595. }*/
  596. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One)
  597. {
  598. g_switch_set_t_ac_phchn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  599. _globalPowerMangerTemp->product_saddr,
  600. _globalPowerMangerTemp->product_ch_addr - 1,
  601. val);
  602. }else{
  603. g_switch_set_t_ac_chn_ctrl(&__globalDeviceManage._globalRelaySampManger,
  604. _globalPowerMangerTemp->product_saddr,
  605. _globalPowerMangerTemp->product_ch_addr - 1,
  606. val);
  607. }
  608. }
  609. }
  610. }
  611. }
  612. break;
  613. case 9192:
  614. {
  615. if (val == 0 || val == 1)
  616. {
  617. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  618. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  619. {
  620. if (_globalPowerMangerTemp == NULL)
  621. break;
  622. _globalPowerMangerTemp->product_ch_status = val;
  623. int rec = g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp->product_ch_type, _globalPowerMangerTemp->product_saddr, val);
  624. // printf("rec = %d 0x%x\n",rec,val);
  625. }
  626. }
  627. }
  628. break;
  629. default:
  630. break;
  631. }
  632. }
  633. }
  634. #endif
  635. int cascade_slave_init(void)
  636. {
  637. slave_handle_t *sh=&slHandle;
  638. GlobalDeviceManager* mgr=get_dm();
  639. if(sh->map)
  640. {
  641. free(sh->map);
  642. sh->map = NULL;
  643. }
  644. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,2000,0,0); //3000 ge
  645. ip[DS_IP_DEV_CHN ].addr = &mgr->mmp->dev_chn;
  646. ip[DS_IP_MAC ].addr = &mgr->mmp->mac[0];
  647. ip[DS_POWER_INFO_REG ].addr = &mgr->mmp->data[0];
  648. return 0;
  649. }
  650. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  651. {
  652. slave_handle_t *sh=&slHandle;
  653. switch(addr)
  654. {
  655. case DEV_CHN_REG:
  656. {
  657. uint16_t *base_addr = (uint16_t *)ip[DS_IP_DEV_CHN].addr;
  658. uint32_t step = addr - sh->map->start_registers;
  659. base_addr = base_addr + (addr - ip[DS_IP_DEV_CHN].offset);
  660. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  661. if(lenth < 126)
  662. {
  663. memcpy(map_addr, base_addr,2*lenth);
  664. }
  665. }
  666. break;
  667. case DEV_IP_MAC:
  668. {
  669. uint16_t *base_addr = (uint16_t *)ip[DS_IP_MAC].addr;
  670. uint32_t step = addr - sh->map->start_registers;
  671. base_addr = base_addr + (addr - ip[DS_IP_MAC].offset);
  672. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  673. if(lenth < 126)
  674. {
  675. memcpy(map_addr, base_addr,2*lenth);
  676. }
  677. }
  678. case POWER_INFO_REG ... (POWER_INFO_REG+POWER_LENTH):
  679. {
  680. uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
  681. uint32_t step = addr - sh->map->start_registers;
  682. base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
  683. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  684. if(lenth < 126)
  685. {
  686. memcpy(map_addr, base_addr,2*lenth);
  687. }
  688. }
  689. break;
  690. case WARNING_485_IP ... (WARNING_485_IP+W_LENTH):
  691. {
  692. uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
  693. uint32_t step = addr - sh->map->start_registers;
  694. base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
  695. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  696. if(lenth < 126)
  697. {
  698. memcpy(map_addr, base_addr,2*lenth);
  699. }
  700. }
  701. break;
  702. default:
  703. break;
  704. }
  705. }
  706. static void memswap(uint8_t *buf, int len)
  707. {
  708. int i;
  709. uint8_t tmp;
  710. for(i=0; i<len; i+=2) {
  711. tmp = buf[i];
  712. buf[i] = buf[i+1];
  713. buf[i+1] = tmp;
  714. }
  715. }
  716. static int _mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
  717. {
  718. h->addr = data[0];
  719. h->func = data[1];
  720. h->reg = data[2]<<8 | data[3];
  721. h->regcnt = data[4]<<8 | data[5];
  722. h->dlen = 0;
  723. h->data = NULL;
  724. if(datalen>8) {
  725. h->dlen = data[6];
  726. h->data = data+7;
  727. memswap(h->data, h->dlen+h->dlen%2);
  728. }
  729. //print_hdr("sss", h);
  730. return 0;
  731. }
  732. int cascade_set_ip_modbus(ModbusInfo_t *info)
  733. {
  734. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  735. g_modbus_deinit(&_globalDeviceManager->sensor_modbus_manager);
  736. if(info->product_modbus_type > 0)
  737. {
  738. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  739. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  740. info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  741. info->product_modbus_type,
  742. info->product_modbus_addr,
  743. "ip to user",
  744. 1);
  745. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,info->product_modbus_addr);
  746. }else
  747. {
  748. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  749. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  750. info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  751. info->product_modbus_type,
  752. info->product_modbus_addr,
  753. "sensor",
  754. 1);
  755. }
  756. _globalDeviceManager->_globalDevInfo._gmodbus_info.product_modbus_type = info->product_modbus_type;
  757. return 0;
  758. }
  759. void* ip_cascade_thread(void *arg)
  760. {
  761. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  762. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  763. uint8_t query[512] = {0};
  764. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  765. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  766. devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  767. devInfo->_gmodbus_info.product_modbus_type,
  768. devInfo->_gmodbus_info.product_modbus_addr,
  769. "ip to user",
  770. 1);
  771. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
  772. cascade_slave_init();
  773. int r = 0;
  774. mb_hdr_t h;
  775. while (_globalDeviceManager->dev_samp_flag)
  776. {
  777. r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
  778. if(r > 0)
  779. {
  780. _mb_hdr(query,r,&h);
  781. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  782. cascade_slave_read(h.reg, h.regcnt);
  783. g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
  784. }
  785. }else
  786. {
  787. log_d("modbus err!!!!\n");
  788. }
  789. }
  790. pthread_exit(NULL);
  791. }
  792. int tcp_modbus_receive(Modbus_Manger_Tcp *tcp, uint8_t *req)
  793. {
  794. int ret = 0 ;
  795. pthread_mutex_lock(&tcp->mutex);
  796. ret = modbus_receive(tcp->ctx, req);
  797. pthread_mutex_unlock(&tcp->mutex);
  798. return ret ;
  799. }
  800. int tcp_modbus_reply(Modbus_Manger_Tcp *tcp, uint8_t *req, int reqlen, modbus_mapping_t *map)
  801. {
  802. int ret = 0 ;
  803. pthread_mutex_lock(&tcp->mutex);
  804. ret = modbus_reply(tcp->ctx, req, reqlen, map);
  805. pthread_mutex_unlock(&tcp->mutex);
  806. return ret ;
  807. }
  808. int tcp_modbus_set_slave(Modbus_Manger_Tcp *tcp, int saddr)
  809. {
  810. int ret = 0 ;
  811. pthread_mutex_lock(&tcp->mutex);
  812. ret = modbus_set_slave(tcp->ctx, saddr);
  813. pthread_mutex_unlock(&tcp->mutex);
  814. return ret ;
  815. }
  816. Modbus_Manger_Tcp* tcp_modbus_init(const char* ip, uint16_t port,uint8_t addr,int power_type)
  817. {
  818. Modbus_Manger_Tcp* tcp = NULL;
  819. tcp = (Modbus_Manger_Tcp*)malloc(sizeof(Modbus_Manger_Tcp));
  820. if(!tcp)
  821. {
  822. log_d("malloc modubus manger faield!!!\n");
  823. goto err1;
  824. }
  825. memset(tcp, 0, sizeof(Modbus_Manger_Tcp));
  826. tcp->ctx = modbus_new_tcp(ip, port);
  827. if(!tcp->ctx)
  828. {
  829. log_d("malloc modbus_tcp ctx faield!!!\n");
  830. goto err2;
  831. }
  832. struct timeval response_timeout;
  833. response_timeout.tv_sec = 1;
  834. response_timeout.tv_usec = 0;
  835. modbus_set_response_timeout(tcp->ctx, 0,800000);
  836. modbus_set_byte_timeout(tcp->ctx,0,50000);
  837. modbus_set_error_recovery(tcp->ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
  838. modbus_set_slave(tcp->ctx,addr);
  839. pthread_mutex_init(&tcp->mutex,NULL);
  840. strcpy(tcp->ip,ip);
  841. tcp->port = port;
  842. tcp->slave_id = addr;
  843. tcp->power_type = power_type;
  844. return tcp;
  845. err2:
  846. free(tcp);
  847. err1:
  848. return tcp;
  849. }
  850. void tcp_modbus_deinit(Modbus_Manger_Tcp **tcp)
  851. {
  852. Modbus_Manger_Tcp** tmp = tcp;
  853. if(tmp)
  854. {
  855. if(*tmp)
  856. {
  857. modbus_close((*tmp)->ctx);
  858. modbus_free((*tmp)->ctx);
  859. free(*tmp);
  860. *tmp = 0;
  861. }
  862. }
  863. }
  864. void* tcp_modbus_thread(void *arg)
  865. {
  866. //GlobalDeviceManager *mgr = (GlobalDeviceManager *)(arg);
  867. GlobalDeviceManager *mgr = get_dm();
  868. Modbus_Manger_Tcp *tcp = mgr->md_tcp;
  869. tcp->connection = modbus_tcp_listen(tcp->ctx,CASCADE_SLAVE_CONNECTION);
  870. modbus_tcp_accept(tcp->ctx,&tcp->connection);
  871. uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] = {0};
  872. mb_hdr_t h;
  873. log_d("start tcp modbus thread!!!\n");
  874. int rc = 0;
  875. while(1)
  876. {
  877. if(tcp->ctx){
  878. rc = tcp_modbus_receive(tcp,query);
  879. if(rc > 0)
  880. {
  881. _mb_hdr(&query[6],rc,&h);
  882. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  883. cascade_slave_read(h.reg, h.regcnt);
  884. tcp_modbus_reply(tcp,query,rc,cascade_slave_map());
  885. }
  886. //r = _mb_reply(cas, buff, rc,cascade_slave_map());
  887. }
  888. }
  889. }
  890. }
  891. void sensor_or_cascade_init()
  892. {
  893. //GlobalDeviceManager* dm =get_dm();
  894. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  895. //INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
  896. //INIT_LIST_HEAD(&dm->_globalSensorManger.list);
  897. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  898. //uint8_t query[512] = {0};
  899. int ret = 0;
  900. // ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
  901. // _globalDeviceManager->_globalDevInfo.product_id,
  902. // &_globalDeviceManager->_globalSensorManger);
  903. //dev_get_sensor_info
  904. // GlobalSensorManger *temp = (GlobalSensorManger*)malloc(sizeof(GlobalSensorManger));
  905. // if(!temp)
  906. // return;
  907. // dev_get_sensor_info(_globalDeviceManager->db,0,0,temp);
  908. // list_add_tail(&temp->list,&_globalDeviceManager->_globalSensorManger.list);
  909. //dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"sensor");
  910. cascade_slave_init();
  911. if(devInfo->_gmodbus_info.product_modbus_type > 0)
  912. {
  913. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  914. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  915. devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
  916. devInfo->_gmodbus_info.product_modbus_type,
  917. devInfo->_gmodbus_info.product_modbus_addr,
  918. "ip to user",
  919. 1);
  920. g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
  921. }else
  922. {
  923. int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  924. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  925. INTERL_SENSOR_MODBUS_BAUD, // _globalSensorMangerTemp->sensor_baud,
  926. 0,
  927. 0,
  928. "ip to user",
  929. 1);
  930. }
  931. pthread_mutex_init(&_globalDeviceManager->_sensor_update,NULL);
  932. thread_start(THREAD_ID_SENSOR, thread_sensor_or_485, _globalDeviceManager, 5*MB, 0);
  933. }
  934. extern void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType);
  935. void * thread_sensor_or_485(void*arg)
  936. {
  937. thread_handle_t *h=(thread_handle_t*)arg;
  938. //GlobalDeviceManager* _globalDeviceManager = (GlobalDeviceManager*)h->arg;
  939. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  940. GlobalSensorManger *_globalSensorMangerTemp;
  941. int ret = 0;
  942. GlobalSensorInfo _globalSensorInfo;
  943. struct tm *t;
  944. struct timeval tv;
  945. struct timezone tz;
  946. int r = 0;
  947. mb_hdr_t mb_h;
  948. GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
  949. uint8_t query[512] = {0};
  950. float temperature = 0.0;
  951. float humidity = 0.0;
  952. int nSaveIndex = 1;
  953. char strTable[] = "Table_SensorInfo";
  954. char strTemp[64] = {0};
  955. // dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable); // 查询日志最大点
  956. // int nMaxIndex = 2000000000;
  957. // int nDeleteNumber = 1000 / 120000 * 3600 * 24 * 30 * 10; // 1/60s;
  958. while(_globalDeviceManager->dev_samp_flag)
  959. {
  960. if(devInfo->_gmodbus_info.product_modbus_type > 0)
  961. {
  962. //printf("12323451541545135435\n");
  963. //dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable);
  964. // pthread_mutex_lock(&__globalDeviceManage._sensor_update);
  965. // pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
  966. list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  967. {
  968. if(_globalSensorMangerTemp->product_id == 0){
  969. switch (_globalSensorMangerTemp->sensor_type)
  970. {
  971. case SENSOR_TYPE_TEMPERATURE:
  972. {
  973. _globalSensorInfo.val1 = 0.0;
  974. _globalSensorInfo.val2 = 0.0;
  975. _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  976. _globalDeviceManager->g_modebus_read.temprature=0.0;
  977. _globalDeviceManager->g_modebus_read.humidity=0.0;
  978. _globalSensorMangerTemp->sensor_status = 1;
  979. }
  980. default:
  981. break;
  982. }
  983. break;
  984. }
  985. }
  986. r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
  987. if(r > 0)
  988. {
  989. _mb_hdr(query,r,&mb_h);
  990. if(mb_h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  991. cascade_slave_read(mb_h.reg, mb_h.regcnt);
  992. g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
  993. }
  994. }else
  995. {
  996. log_d("modbus err!!!!\n");
  997. }
  998. }else
  999. {
  1000. //printf("--------------------------\n");
  1001. // if (nSaveIndex > nMaxIndex)
  1002. // {
  1003. // dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strTable);
  1004. // }
  1005. // pthread_mutex_lock(&__globalDeviceManage._sensor_update);
  1006. //list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  1007. //{
  1008. // if(_globalSensorMangerTemp->product_id == 0)
  1009. // {
  1010. // switch (_globalSensorMangerTemp->sensor_type)
  1011. // {
  1012. // case SENSOR_TYPE_TEMPERATURE: // 温湿度
  1013. // {
  1014. // // printf("get \n");
  1015. // float temperature = 0.0;
  1016. // float humidity = 0.0;
  1017. // ret = _g_sensor_get_temperature_value((void *)&_globalDeviceManager->sensor_modbus_manager,
  1018. // _globalSensorMangerTemp->sensor_addr,
  1019. // &temperature,
  1020. // &humidity);
  1021. // if (ret == -1)
  1022. // {
  1023. // _globalSensorMangerTemp->sensor_status = 1;
  1024. // }
  1025. // else
  1026. // {
  1027. // _globalSensorMangerTemp->sensor_status = 0;
  1028. // }
  1029. // // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
  1030. // // printf("get temperature=%f humidity=%f\n",temperature,humidity);
  1031. // gettimeofday(&tv, &tz);
  1032. // t = localtime(&tv.tv_sec);
  1033. // sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
  1034. // t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
  1035. // _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
  1036. // _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
  1037. // _globalSensorInfo.val1 = temperature;
  1038. // _globalSensorInfo.val2 = humidity;
  1039. // _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;
  1040. // _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  1041. // _globalDeviceManager->g_modebus_read.temprature=temperature *1000;
  1042. // _globalDeviceManager->g_modebus_read.humidity=humidity *1000;
  1043. // }
  1044. // break;
  1045. // default:
  1046. // break;
  1047. // }
  1048. // // 通用功能
  1049. // // 写入数据库
  1050. // gettimeofday(&tv, NULL);
  1051. // time_t now;
  1052. // time(&now);
  1053. // t = localtime(&now);
  1054. // char buffer[80];
  1055. // strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  1056. // memset(_globalSensorMangerTemp->Cur_sensor_info.samp_time, 0, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time));
  1057. // strftime(_globalSensorMangerTemp->Cur_sensor_info.samp_time, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time), "%Y-%m-%d %H:%M:%S", t);
  1058. // sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  1059. // strcat(_globalSensorMangerTemp->Cur_sensor_info.samp_time, buffer);
  1060. // if (difftime(now, _globalSensorMangerTemp->Cur_sensor_info.product_log_time) > (30000 / 1000))
  1061. // {
  1062. // _globalSensorMangerTemp->Cur_sensor_info.product_log_time = now;
  1063. // // 插入数据库
  1064. // ret = dev_insert_sensor_info(_globalDeviceManager->db, &_globalSensorMangerTemp->Cur_sensor_info, &nSaveIndex);
  1065. // if (ret != 0)
  1066. // {
  1067. // log_e("sensor_temp_write database error.");
  1068. // }
  1069. // }
  1070. // if (_globalSensorMangerTemp->sensor_status == 0)
  1071. // {
  1072. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_UPPER);
  1073. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_LOWER);
  1074. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_UPPER);
  1075. // sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_LOWER);
  1076. // }
  1077. // break;
  1078. // }
  1079. // }
  1080. // pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
  1081. sleep(1);
  1082. }
  1083. }
  1084. pthread_exit(NULL);
  1085. return NULL;
  1086. }