cascade_slave.c 52 KB

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