cascade.c 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150
  1. #include "cascade.h"
  2. #include "common.h"
  3. #include "elog.h"
  4. #include "cfg.h"
  5. #include "lock.h"
  6. #include "thread.h"
  7. #include "switch_ctrl.h"
  8. #include "modbus_handle.h"
  9. #include "sqlite_handle.h"
  10. #include "paras.h"
  11. #include "cascade_slave_tcp.h"
  12. #include "sys.h"
  13. #include "breaker_detection.h"
  14. #if 1
  15. #define LOGD log_d
  16. #define LOGE log_e
  17. #define LOGW log_w
  18. #else
  19. #define LOGD printf
  20. #define LOGE printf
  21. #define LOGW printf
  22. #endif
  23. #define MB_MAX_LEN 250
  24. typedef struct {
  25. int inited;
  26. pthread_mutex_t mutex; //used for list lock
  27. pthread_mutex_t mutex2; //used for extern call
  28. pthread_mutex_t mutex3; //used for mb_write and mb_read_write
  29. Modbus_Manger m;
  30. int addr;
  31. slave_t slaves[CASCADE_MAX+1];
  32. ModbusInfo_t mInfo;
  33. modbus_mapping_t *map;
  34. cmd_data_t cmd;
  35. int scanAddr;
  36. slave_info_t sInfo; //current slave infomation
  37. breaker_info_t sBreaker;
  38. uint8_t scanner_flag;
  39. }cascade_handle_t;
  40. int cur_dev_addr=0;
  41. static cascade_handle_t casHandle={.inited=0};
  42. static cascade_handle_t casHandle_breaker={.inited=0};
  43. static void* cmd_thread(void *arg);
  44. static void* cmd_NF_thread(void *arg);
  45. //////////////////////////////////////////////////
  46. static inline GlobalDeviceManager* get_dm(void)
  47. {
  48. return &__globalDeviceManage;
  49. }
  50. static inline GlobalDeviceManager* get_dm2(void)
  51. {
  52. return &__globalDeviceManage2;
  53. }
  54. static inline ModbusInfo_t *get_mb(void)
  55. {
  56. return &get_dm()->_globalDevInfo.cascade;
  57. }
  58. static int slave_init(cascade_handle_t *cas)
  59. {
  60. int i;
  61. for(i=0; i<=CASCADE_MAX; i++) {
  62. cas->slaves[i].addr = -1;
  63. cas->slaves[i].err = 0;
  64. }
  65. return 0;
  66. }
  67. static int slave_add(cascade_handle_t *cas, int addr)
  68. {
  69. if(addr<0 || addr>CASCADE_MAX) {
  70. return -1;
  71. }
  72. cas->slaves[addr].addr = addr;
  73. cas->slaves[addr].err = 0;
  74. return 0;
  75. }
  76. static int slave_rm(cascade_handle_t *cas, int addr)
  77. {
  78. if(addr<0 || addr>CASCADE_MAX) {
  79. return -1;
  80. }
  81. cas->slaves[addr].addr = -1;
  82. cas->slaves[addr].err = 0;
  83. return 0;
  84. }
  85. static int slave_cnt(cascade_handle_t *cas)
  86. {
  87. int i,cnt=0;
  88. for(i=0; i<=CASCADE_MAX; i++) {
  89. if(cas->slaves[i].addr>0) {
  90. cnt++;
  91. }
  92. }
  93. return cnt;
  94. }
  95. static slave_t* slave_get(cascade_handle_t *cas, int addr)
  96. {
  97. return &cas->slaves[addr];
  98. }
  99. static int slave_find(cascade_handle_t *cas, int addr)
  100. {
  101. if(cas->slaves[addr].addr>0) {
  102. return 1;
  103. }
  104. return 0;
  105. }
  106. static int slave_get_info(cascade_handle_t *cas)
  107. {
  108. int cnt=0,cnt2;
  109. netswitch_info_t swInfo;
  110. GlobalDeviceManager *dm=get_dm();
  111. GlobalPowerManger *tmp=NULL;
  112. GlobalTreeACManager* tmp3=NULL;
  113. slave_info_t *info=&cas->sInfo;
  114. info->cnt=0;
  115. info->prod.product_type = dm->_globalDevInfo.product.type;
  116. info->prod.product_pwr_type = dm->_globalDevInfo.product.pwr_type;
  117. info->prod.product_id = dm->_globalDevInfo.product.id;
  118. if(!list_empty(&dm->_globalPowerManger.list_Tree_AC)) {
  119. cnt2 = 0;
  120. list_for_each_entry(tmp3, &dm->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  121. {
  122. if(tmp3->product_ph_type<0 || tmp3->product_ph_type>3) {
  123. continue;
  124. }
  125. if(cnt2<3) {
  126. info->all.power[cnt2++] = tmp3->_PowerInfo;
  127. }
  128. }
  129. }
  130. if(!list_empty(&dm->_globalPowerManger.list)) {
  131. cnt = 0;
  132. netswitch_get(&swInfo);
  133. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  134. {
  135. if(tmp->product_saddr==0) {
  136. continue;
  137. }
  138. tmp->_PowerInfo.port = swInfo.port[cnt];
  139. info->ch[cnt].product_saddr = tmp->product_saddr;
  140. info->ch[cnt].product_ch_type = tmp->product_ch_type;
  141. info->ch[cnt].product_ch_addr = tmp->product_ch_addr;
  142. info->ch[cnt].product_ch_id = tmp->product_ch_id;
  143. info->ch[cnt].product_ch_status = tmp->product_ch_status;
  144. info->ch[cnt].product_ch_NF_status = tmp->product_ch_NF_status;
  145. info->ch[cnt].start_delay = tmp->product_ch_start_delay;
  146. info->ch[cnt].stop_delay = tmp->product_ch_stop_delay;
  147. info->ch[cnt].chinfo = tmp->_PowerInfo;
  148. if (tmp->product_ch_type==TREE_AC_TYPE||dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  149. cnt2 = 0;
  150. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
  151. {
  152. info->ch[cnt].pinfo[cnt2].power = tmp3->_PowerInfo;
  153. info->ch[cnt].pinfo[cnt2].phase.product_ph_id = tmp3->product_ph_id;
  154. info->ch[cnt].pinfo[cnt2].phase.product_ph_type = tmp3->product_ph_type;
  155. info->ch[cnt].pinfo[cnt2].phase.product_ph_outputType = tmp3->product_ph_outputType;
  156. info->ch[cnt].pinfo[cnt2].phase.product_ph_outputStatus = tmp3->product_ph_outputStatus;
  157. cnt2++;
  158. }
  159. }
  160. cnt++;
  161. }
  162. }
  163. info->cnt = cnt;
  164. LOGD("___ slave_get_info, cnt: %d\n", info->cnt);
  165. return 0;
  166. }
  167. static int slave_breaker_info(cascade_handle_t *cas)
  168. {
  169. GlobalDeviceManager *dm=get_dm();
  170. GlobalBreakerManager *temp = NULL;
  171. breaker_info_t *breaker=&cas->sBreaker;
  172. int cnt = 0;
  173. //list_for_each_entry(temp, &__globalDeviceManage.g_new_global_breaker.list, list)
  174. lock_s_hold(LOCK_ID_BREAKER);
  175. if(!list_empty(&dm->g_new_global_breaker.list)) {
  176. printf("isnot empty!!!!!\n");
  177. list_for_each_entry(temp,&dm->g_new_global_breaker.list, list)
  178. {
  179. // printf("temp addr %ld temp->next = %ld temp->prev = %ld\n",tmp,tmp->list.prev,tmp->list.next);
  180. breaker ->breaker_chn[cnt].product_id = temp->product_id;
  181. breaker->breaker_chn[cnt].breaker_addrs = temp->breaker_gather_addr;
  182. breaker->breaker_chn[cnt].breaker_status = temp->breaker_status;
  183. breaker->breaker_chn[cnt].breaker_chn = temp->breaker_chn;
  184. breaker->breaker_chn[cnt].breaker_id = temp->breaker_id;
  185. strcpy(breaker->breaker_chn[cnt].breaker_gather_type, temp->breaker_gather_type);
  186. strcpy(breaker->breaker_chn[cnt].breaker_com, temp->breaker_com);
  187. strcpy(breaker->breaker_chn[cnt].breaker_switch_name, temp->breaker_switch_name);
  188. strcpy(breaker->breaker_chn[cnt].breaker_chns_name, temp->breaker_chns_name);
  189. cnt++;
  190. }
  191. }
  192. breaker->cnt = cnt;
  193. lock_s_release(LOCK_ID_BREAKER);
  194. LOGD("___ slave_breaker_info, breaker_all: saddr=0x%x %d\n",(uint32_t)dm,breaker->cnt);
  195. return 0;
  196. }
  197. static int get_pwr_info(int chId, GlobalPowerManger *power)
  198. {
  199. int i;
  200. GlobalPowerManger *tmp=NULL;
  201. GlobalDeviceManager *dm=get_dm();
  202. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  203. {
  204. if(tmp->product_ch_id==chId) {
  205. power->product_id = dm->_globalDevInfo.product.id;
  206. power->product_ch_id = tmp->product_ch_id;
  207. strcpy(power->product_ch_name, tmp->product_ch_name);
  208. power->product_ch_type = tmp->product_ch_type;
  209. power->product_ch_status = tmp->product_ch_status;
  210. power->product_ch_NF_status = tmp->product_ch_NF_status;
  211. power->product_ch_start_delay = tmp->product_ch_start_delay;
  212. power->product_ch_stop_delay = tmp->product_ch_stop_delay;
  213. return 0;
  214. }
  215. }
  216. return -1;
  217. }
  218. static int slave_breaker_update(cascade_breaker_update_t *data)
  219. {
  220. int ret = -1;
  221. if(data)
  222. {
  223. GlobalDeviceManager *dm=get_dm();
  224. GlobalBreakerManager *temp= NULL;
  225. GlobalBreakerManager *pos= NULL;
  226. lock_s_hold(LOCK_ID_BREAKER);
  227. if(!list_empty(&dm->g_new_global_breaker.list)) {
  228. list_for_each_entry_safe(temp,pos,&dm->g_new_global_breaker.list,list)
  229. {
  230. if(temp->breaker_id == data->switch_id)
  231. {
  232. strcpy(temp->breaker_switch_name,data->switch_name);
  233. strcpy(temp->breaker_chns_name,data->breaker_chns);
  234. dev_update_breaker_genera_manage(dm->db,
  235. dm->_globalDevInfo.product.id,data->switch_id,temp);
  236. ret = 0;
  237. break;
  238. }
  239. }
  240. }
  241. lock_s_release(LOCK_ID_BREAKER);
  242. }
  243. return ret;
  244. }
  245. static int slave_breaker_delete(cascade_braeker_delete_t *data)
  246. {
  247. int ret = -1;
  248. if(data)
  249. {
  250. GlobalDeviceManager *dm=get_dm();
  251. GlobalBreakerManager *temp= NULL;
  252. GlobalBreakerManager *pos= NULL;
  253. lock_s_hold(LOCK_ID_BREAKER);
  254. if(!list_empty(&dm->g_new_global_breaker.list)) {
  255. list_for_each_entry_safe(temp,pos,&dm->g_new_global_breaker.list,list)
  256. {
  257. printf("new data !!!!\n");
  258. if(temp == NULL)
  259. {
  260. continue;
  261. }
  262. if(temp->breaker_id == data->switch_id)
  263. {
  264. dev_delete_breaker_manage(dm->db,dm->_globalDevInfo.product.id,data->switch_id);
  265. list_del(&temp->list);
  266. free(temp);
  267. if(!list_empty(&dm->g_new_global_breaker.list))
  268. {
  269. printf("hellosda\n");
  270. }
  271. ret = 0;
  272. break;
  273. }
  274. }
  275. }
  276. lock_s_release(LOCK_ID_BREAKER);
  277. }
  278. return ret;
  279. }
  280. static int slave_breaker_add(cascade_breaker_add_t *data)
  281. {
  282. int r = -1;
  283. if(!data)
  284. {
  285. goto quit;
  286. }
  287. GlobalDeviceManager *dm=get_dm();
  288. char buff[124] = {0};
  289. char id[MAX_BREAKER_ID] = {0};
  290. //bianli shujujiegou
  291. GlobalBreakerManager *temp = NULL;
  292. int i = 1;
  293. lock_s_hold(LOCK_ID_BREAKER);
  294. list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
  295. {
  296. id[temp->breaker_id] = 1;
  297. }
  298. lock_s_release(LOCK_ID_BREAKER);
  299. for(;i < MAX_BREAKER_ID;i++)
  300. {
  301. if(id[i] == 0)
  302. break;
  303. }
  304. if(i > MAX_BREAKER_ID)
  305. {
  306. goto quit;
  307. }
  308. uint32_t jdh = data->jdh;
  309. char jdh_flag = 0;
  310. if((data->cjdz >= BREADER_485_ADDR) && (data->cjdz <= (BREADER_485_ADDR+BREAKER_BOARD_MAX))) //breaker board
  311. {
  312. if(jdh > MAX_BREAKER_CHN || jdh < 1)
  313. {
  314. goto quit;
  315. }
  316. char chn[MAX_BREAKER_CHN] = {0};
  317. lock_s_hold(LOCK_ID_BREAKER);
  318. list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
  319. {
  320. if(temp->breaker_gather_addr == data->cjdz)
  321. {
  322. chn[temp->breaker_chn-1] = 1;
  323. }
  324. }
  325. lock_s_release(LOCK_ID_BREAKER);
  326. if(chn[jdh-1] != 1)
  327. {
  328. //breakerManager->breaker_chn = jdh;
  329. }else
  330. {
  331. jdh_flag = 1;
  332. }
  333. if(jdh_flag == 1)
  334. {
  335. goto quit;
  336. }
  337. }else if(data->cjdz > 0 && data->cjdz <= 30) //controller
  338. {
  339. char chn[2] = {0};
  340. if(jdh > 2 || jdh < 1)
  341. {
  342. goto quit;
  343. }
  344. lock_s_hold(LOCK_ID_BREAKER);
  345. list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
  346. {
  347. if(temp->breaker_gather_addr == data->cjdz)
  348. {
  349. chn[temp->breaker_chn-1] = 1;
  350. }
  351. }
  352. lock_s_release(LOCK_ID_BREAKER);
  353. if(chn[jdh-1] != 1)
  354. {
  355. // breakerManager->breaker_chn = jdh;
  356. }else
  357. {
  358. jdh_flag = 1;
  359. }
  360. if(jdh_flag == 1)
  361. {
  362. goto quit;
  363. }
  364. }else if(data->cjdz == 0) //current board
  365. {
  366. if(jdh != 1)
  367. {
  368. goto quit;
  369. }
  370. lock_s_hold(LOCK_ID_BREAKER);
  371. list_for_each_entry(temp, &dm->g_new_global_breaker.list, list)
  372. {
  373. if(temp->breaker_gather_addr == data->cjdz)
  374. {
  375. jdh_flag = 1;
  376. }
  377. }
  378. lock_s_release(LOCK_ID_BREAKER);
  379. if(jdh_flag)
  380. {
  381. goto quit;
  382. }
  383. }else
  384. {
  385. goto quit;
  386. }
  387. GlobalBreakerManager *breakerManager = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
  388. memset(breakerManager,0,sizeof(GlobalBreakerManager));
  389. breakerManager->product_id = __globalDeviceManage._globalDevInfo.product.id;
  390. breakerManager->breaker_gather_addr = data->cjdz;
  391. strcpy(breakerManager->breaker_com,data->com);
  392. strcpy(breakerManager->breaker_gather_type,data->cjfs);
  393. strcpy(breakerManager->breaker_chns_name,data->breaker_chns);
  394. breakerManager->breaker_chn = jdh;
  395. breakerManager->breaker_id = i;
  396. sprintf(buff,"Breaker_%d",breakerManager->breaker_id);
  397. strcpy(breakerManager->breaker_switch_name,buff);
  398. dev_insert_breaker_genera_manage(dm->db,breakerManager);
  399. lock_s_hold(LOCK_ID_BREAKER);
  400. list_add_tail(&breakerManager->list,&dm->g_new_global_breaker.list);
  401. lock_s_release(LOCK_ID_BREAKER);
  402. r = 0;
  403. return r;
  404. quit:
  405. return r;
  406. }
  407. static int slave_save(cascade_handle_t *cas)
  408. {
  409. int r;
  410. GlobalPowerManger power;
  411. GlobalDeviceManager *dm=get_dm();
  412. if(cas->cmd.obj!=OBJ_CHANNEL) {
  413. return -1;
  414. }
  415. r = get_pwr_info(cas->cmd.chId, &power);
  416. if(r) {
  417. LOGE("____ get_pwr_info failed\n");
  418. return -1;
  419. }
  420. r = dev_update_power_manage_genera_info(dm->db, dm->_globalDevInfo.product.id, cas->cmd.chId, &power);
  421. return r;
  422. }
  423. /////////////////////////////////////////////////////////////////////////////////////////
  424. static int mb_init(cascade_handle_t *cas, char *path, int mode, int addr, uint32_t baud)
  425. {
  426. int r=0;
  427. r = g_modbus_init(&cas->m, path, baud, mode, addr, (mode==MODBUS_MASTER)?"master":"slave", 1);
  428. if(r==0) {
  429. if(mode==MODBUS_SLAVE) {
  430. LOGD("___ set slave addr: %d\n", addr);
  431. cas->addr = addr;
  432. g_modbus_set_slave(&cas->m, addr);
  433. cascade_slave_init();
  434. }
  435. else {
  436. cas->addr = 0;
  437. }
  438. cas->inited = 1;
  439. }
  440. else {
  441. LOGE("___ mb init failed, %s\n", modbus_strerror(errno));
  442. }
  443. return r;
  444. }
  445. static int mb_deinit(cascade_handle_t *cas)
  446. {
  447. g_modbus_deinit(&cas->m);
  448. cas->inited = 0;
  449. return 0;
  450. }
  451. static int _mb_scan(cascade_handle_t *cas, int addr)
  452. {
  453. int r;
  454. uint16_t tmp;
  455. r = g_modbus_read_x_reg(&cas->m, addr, CASCADE_REG_SCAN, 1, &tmp);
  456. return r;
  457. }
  458. static int _mb_read(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
  459. {
  460. int r;
  461. r = g_modbus_read_x_reg(&cas->m, addr, reg, cnt, data);
  462. if(r<0) {
  463. cas->slaves[addr].err++;
  464. if(cas->slaves[addr].err>ERR_MAX) {
  465. slave_rm(cas, addr);
  466. }
  467. }
  468. else {
  469. cas->slaves[addr].err = 0;
  470. }
  471. return r;
  472. }
  473. static int _mb_write(cascade_handle_t *cas, int addr, uint16_t reg, uint16_t *data, int cnt)
  474. {
  475. int r;
  476. r = g_modbus_write_x_reg(&cas->m, addr, reg, cnt, data);
  477. if(r<0) {
  478. cas->slaves[addr].err++;
  479. if(cas->slaves[addr].err>ERR_MAX) {
  480. slave_rm(cas, addr);
  481. }
  482. }
  483. else {
  484. cas->slaves[addr].err = 0;
  485. }
  486. return r;
  487. }
  488. static int _mb_recv(cascade_handle_t *cas, uint8_t *buf)
  489. {
  490. return g_modbus_receive(&cas->m, buf);
  491. }
  492. static int _mb_reply(cascade_handle_t *cas, uint8_t *buff, int reqlen, modbus_mapping_t *map)
  493. {
  494. return g_modbus_reply(&cas->m, buff, reqlen, map);
  495. }
  496. static int _mb_get_timeout(cascade_handle_t *cas)
  497. {
  498. int r,ms=0;
  499. r = g_modbus_get_timeout(&cas->m, &ms);
  500. return ms;
  501. }
  502. static int _mb_set_timeout(cascade_handle_t *cas, int ms)
  503. {
  504. return g_modbus_set_timeout(&cas->m, ms);
  505. }
  506. ////////////////////////////////////////////////////////////
  507. static void print_data(uint8_t *data, int len)
  508. {
  509. int i;
  510. for(i=0; i<len; i++) {
  511. LOGD("0x%02x, ", data[i]);
  512. }
  513. LOGD("\n");
  514. }
  515. static void print_cmd(char *s, cmd_data_t *cmd)
  516. {
  517. int i;
  518. LOGD("__%s__ cmd.obj: %d\n", s, cmd->obj);
  519. LOGD("__%s__ cmd.cmd: %d\n", s, cmd->cmd);
  520. LOGD("__%s__ cmd.chId: %d\n", s, cmd->chId);
  521. //LOGD("__%s__ cmd.time_s: %s\n", s, cmd->time_s);
  522. //LOGD("__%s__ cmd.time_e: %s\n", s, cmd->time_e);
  523. LOGD("\n");
  524. }
  525. static void memswap(uint8_t *buf, int len)
  526. {
  527. int i;
  528. uint8_t tmp;
  529. for(i=0; i<len; i+=2) {
  530. tmp = buf[i];
  531. buf[i] = buf[i+1];
  532. buf[i+1] = tmp;
  533. }
  534. }
  535. static void memcpy_swap(uint8_t *dst, uint8_t *src, int len)
  536. {
  537. int i;
  538. for(i=0; i<len; i+=2) {
  539. dst[i] = src[i+1];
  540. dst[i+1] = src[i];
  541. }
  542. }
  543. static int print_hdr(char *s, mb_hdr_t *h)
  544. {
  545. LOGD("____%s___ h.addr: %d\n", s, h->addr);
  546. LOGD("____%s___ h.func: %d\n", s, h->func);
  547. LOGD("____%s___ h.reg: %d\n", s, h->reg);
  548. LOGD("____%s___ h.regcnt: %d\n", s, h->regcnt);
  549. LOGD("____%s___ h.dlen: %d\n", s, h->dlen);
  550. LOGD("____%s___ h.data: %d\n", s, (int)h->data);
  551. LOGD("\n");
  552. return 0;
  553. }
  554. static int mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
  555. {
  556. h->addr = data[0];
  557. h->func = data[1];
  558. h->reg = data[2]<<8 | data[3];
  559. h->regcnt = data[4]<<8 | data[5];
  560. h->dlen = 0;
  561. h->data = NULL;
  562. if(datalen>8) {
  563. h->dlen = data[6];
  564. h->data = data+7;
  565. memswap(h->data, h->dlen+h->dlen%2);
  566. }
  567. //print_hdr("sss", h);
  568. return 0;
  569. }
  570. #if (CHIP_TYPE == CHIP_T113s)
  571. #define SCAN_TIMEOUT_MS 800
  572. #define RW_TIMEOUT_MS 800
  573. #else
  574. #define SCAN_TIMEOUT_MS 200
  575. #define RW_TIMEOUT_MS 100
  576. #endif
  577. static int mb_scan(cascade_handle_t *cas, int addr)
  578. {
  579. int r,timeout=0;
  580. uint16_t tmp;
  581. pthread_mutex_lock(&cas->mutex3);
  582. timeout = _mb_get_timeout(cas);
  583. _mb_set_timeout(cas, SCAN_TIMEOUT_MS);
  584. r = _mb_scan(cas, addr);
  585. _mb_set_timeout(cas, timeout);
  586. pthread_mutex_unlock(&cas->mutex3);
  587. return r;
  588. }
  589. static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
  590. {
  591. int i,r=0,finish=0,timeout=0;
  592. int rl,xlen,rlen=0,oncelen=MB_MAX_LEN;
  593. uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  594. if(d->dlen<=0) {
  595. return -1;
  596. }
  597. for(i=0; i<10; i++) {
  598. pthread_mutex_lock(&cas->mutex3);
  599. timeout = _mb_get_timeout(cas);
  600. _mb_set_timeout(cas, RW_TIMEOUT_MS);
  601. r = 0; rlen = 0;
  602. while(1) {
  603. if(rlen+oncelen>d->dlen) {
  604. xlen = d->dlen-rlen;
  605. }
  606. else {
  607. xlen = oncelen;
  608. }
  609. xlen += xlen%2;
  610. rl = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen/2);
  611. if(rl<0) {
  612. LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", modbus_strerror(errno), rlen, i);
  613. r = -1; break;
  614. }
  615. if(rlen+rl*2>=d->dlen) {
  616. xlen = d->dlen-rlen;
  617. finish = 1;
  618. }
  619. else {
  620. xlen = rl*2;
  621. }
  622. memcpy((char*)d->data+rlen, buff, xlen);
  623. rlen += xlen;
  624. if(finish) {
  625. break;
  626. }
  627. }
  628. _mb_set_timeout(cas, timeout);
  629. pthread_mutex_unlock(&cas->mutex3);
  630. if(r==0) {
  631. break;
  632. }
  633. }
  634. return r;
  635. }
  636. static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
  637. {
  638. int i,r=0,timeout=0;
  639. int wl,xlen,wlen=0,oncelen=MB_MAX_LEN;
  640. uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  641. if(d->dlen<=0) {
  642. return -1;
  643. }
  644. for(i=0; i<10; i++) {
  645. pthread_mutex_lock(&cas->mutex3);
  646. timeout = _mb_get_timeout(cas);
  647. _mb_set_timeout(cas, RW_TIMEOUT_MS);
  648. r = 0; wlen = 0;
  649. while(1) {
  650. if(wlen+oncelen>d->dlen) {
  651. xlen = d->dlen-wlen;
  652. }
  653. else {
  654. xlen = oncelen;
  655. }
  656. xlen += xlen%2;
  657. memcpy(buff, d->data+wlen, xlen);
  658. wl = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen/2);
  659. if(wl<0) {
  660. LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen/2, modbus_strerror(errno), i);
  661. r = -1; break;
  662. }
  663. if(wlen+wl*2>=d->dlen) {
  664. break;
  665. }
  666. else {
  667. xlen = wl*2;
  668. }
  669. wlen += xlen;
  670. }
  671. _mb_set_timeout(cas, timeout);
  672. pthread_mutex_unlock(&cas->mutex3);
  673. if(r==0) {
  674. break;
  675. }
  676. }
  677. return r;
  678. }
  679. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  680. {
  681. int r=0;
  682. r = mb_write(cas, addr, wd);
  683. if(r==0) {
  684. r = mb_read(cas, addr, rd);
  685. }
  686. return r;
  687. }
  688. static int mb_receive(cascade_handle_t *cas)
  689. {
  690. int r=-1,rc,rlen=0;
  691. mb_hdr_t h;
  692. uint8_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
  693. static int sendlen=0;
  694. cmd_data_t *cmd=NULL;
  695. rc = _mb_recv(cas, buff);
  696. if(rc<0) {
  697. return -1;
  698. }
  699. mb_hdr(buff, rc, &h);
  700. #if 1
  701. //do not know why slave can receive all address data
  702. //LOGD("____mb_receive, %d, %d\n", h.addr, cas->addr);
  703. if(h.addr>0 && h.addr!=cas->addr) {
  704. return -1;
  705. }
  706. #endif
  707. //LOGD("____mb_receive, reg: %d, rc: %d\n", h.reg, rc);
  708. switch(h.reg) {
  709. case CASCADE_REG_SCAN:
  710. {
  711. r = _mb_reply(cas, buff, rc, cas->map);
  712. }
  713. break;
  714. case CASCADE_REG_WRITE:
  715. {
  716. if(h.data) {
  717. cmd = (cmd_data_t*)h.data;
  718. if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
  719. cas->cmd = *cmd;
  720. }
  721. sendlen = 0;
  722. }
  723. else {
  724. return -1;
  725. }
  726. switch(cmd->cmd) {
  727. case CASCADE_CMD_OPEN:
  728. case CASCADE_CMD_CLOSE:
  729. {
  730. cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
  731. if(pcmd) {
  732. *pcmd = *cmd;
  733. thread_start_simp(cmd_thread, pcmd, 4*MB);
  734. }
  735. }
  736. break;
  737. case CASCADE_CMD_OPEN_NF:
  738. case CASCADE_CMD_CLOSE_NF:
  739. {
  740. cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
  741. if(pcmd) {
  742. *pcmd = *cmd;
  743. thread_start_simp(cmd_NF_thread, pcmd, 4*MB);
  744. }
  745. }
  746. break;
  747. case CASCADE_CMD_SAVE:
  748. case CASCADE_CMD_SAVE3:
  749. {
  750. slave_save(cas);
  751. }
  752. break;
  753. case CASCADE_CMD_BREAKER_SAVE_ADD:
  754. {
  755. LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_ADD\n");
  756. LOGD("%d %d %s %s %s\n",cmd->datas.data.jdh,cmd->datas.data.cjdz,cmd->datas.data.cjfs,cmd->datas.data.com,cmd->datas.data.breaker_chns);
  757. slave_breaker_add(&cmd->datas.data);
  758. }
  759. break;
  760. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  761. {
  762. LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_UPDATE\n");
  763. LOGD("%d %s %s\n",cmd->datas.data1.switch_id,cmd->datas.data1.switch_name,cmd->datas.data1.breaker_chns);
  764. slave_breaker_update(&cmd->datas.data1);
  765. }
  766. break;
  767. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  768. {
  769. LOGD("_____ slave CASCADE_CMD_BREAKER_SAVE_DELETE\n");
  770. slave_breaker_delete(&cmd->datas.data2);
  771. }
  772. }
  773. r = _mb_reply(cas, buff, rc, cas->map);
  774. }
  775. break;
  776. case CASCADE_REG_READ:
  777. {
  778. cmd = &cas->cmd;
  779. //LOGD("____ CASCADE_REG_READ %d\n", cmd->cmd);
  780. switch(cmd->cmd) {
  781. case CASCADE_CMD_GET_INFO:
  782. {
  783. LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
  784. slave_get_info(cas);
  785. memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->sInfo+sendlen, h.regcnt*2);
  786. }
  787. break;
  788. case CASCADE_CMD_BREAKER_QUERY:
  789. {
  790. LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
  791. slave_breaker_info(cas);
  792. memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->sBreaker)+sendlen, h.regcnt*2);
  793. }
  794. break;
  795. case CASCADE_CMD_QUERY_CH:
  796. {
  797. LOGD("___ slave CASCADE_CMD_QUERY_CH\n");
  798. slave_get_info(cas);
  799. memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->sInfo)+sendlen, h.regcnt*2);
  800. }
  801. break;
  802. case CASCADE_CMD_QUERY_VOL:break;
  803. case CASCADE_CMD_QUERY_CUR:break;
  804. case CASCADE_CMD_QUERY_PWR:break;
  805. case CASCADE_CMD_QUERY_PWRQ:break;
  806. case CASCADE_CMD_QUERY_HIS:break;
  807. case CASCADE_CMD_QUERY_TOTAL:break;
  808. case CASCADE_CMD_QUERY_TOTAL_PWR:break;
  809. case CASCADE_CMD_BREAKER_GET_INFO:
  810. {
  811. LOGD("_____ slave breaker CASCADE_CMD_GET_INFO\n");
  812. slave_breaker_info(cas);
  813. memcpy(cas->map->tab_registers+(h.reg-CASCADE_REG_OFFSET), ((char*)&cas->sBreaker)+sendlen, h.regcnt*2);
  814. }
  815. break;
  816. }
  817. r = _mb_reply(cas, buff, rc, cas->map);
  818. if(r>0) {
  819. sendlen += h.regcnt*2;
  820. //LOGD("____ slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
  821. }
  822. }
  823. break;
  824. default:
  825. {
  826. Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
  827. LOGD("___ slave XXXXXXXXXXX\n");
  828. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  829. cascade_slave_read(h.reg, h.regcnt);
  830. }
  831. else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
  832. cascade_slave_write(h.reg, h.regcnt);
  833. }
  834. r = _mb_reply(cas, buff, rc,cascade_slave_map());
  835. }
  836. }
  837. return r;
  838. }
  839. /////////////////////////////////////////////////////////////////////////
  840. static int master_scan(cascade_handle_t *cas)
  841. {
  842. int i,r=0;
  843. uint16_t tmp[10];
  844. if(cas->scanAddr>CASCADE_MAX) {
  845. cas->scanAddr = 1;
  846. }
  847. if(!slave_find(cas, cas->scanAddr)) {
  848. r = mb_scan(cas, cas->scanAddr);
  849. if(r>0) {
  850. LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
  851. slave_add(cas, cas->scanAddr);
  852. }
  853. else {
  854. LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
  855. }
  856. }
  857. cas->scanAddr++;
  858. //print_slave(cas);
  859. return 0;
  860. }
  861. ///////////////////////////////////////////////////////////////////////////////////////
  862. static int power_clear(cascade_handle_t *cas);
  863. static int power_init(cascade_handle_t *cas)
  864. {
  865. GlobalDeviceManager *dm=get_dm();
  866. GlobalDeviceManager *dm2=get_dm2();
  867. dm2->_globalDevInfo.product.pwr_type = dm->_globalDevInfo.product.pwr_type;
  868. dm2->_globalDevInfo.product.id = dm->_globalDevInfo.product.id;
  869. strcpy(dm2->_globalDevInfo.product.name, dm->_globalDevInfo.product.name);
  870. strcpy(dm2->_globalDevInfo.product.number, dm->_globalDevInfo.product.number);
  871. strcpy(dm2->_globalDevInfo.product.status, dm->_globalDevInfo.product.status);
  872. INIT_LIST_HEAD(&dm2->_globalPowerManger.list);
  873. INIT_LIST_HEAD(&dm2->_globalPowerManger.list_Tree_AC);
  874. return 0;
  875. }
  876. static int breaker_slave_init(void)
  877. {
  878. //GlobalDeviceManager *dm=get_dm();
  879. GlobalDeviceManager *dm2=get_dm2();
  880. INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
  881. pthread_mutex_init(&dm2->_breaker_mutex,NULL);
  882. return 0;
  883. }
  884. static int power_deinit(cascade_handle_t *cas)
  885. {
  886. GlobalDeviceManager *dm2=get_dm2();
  887. power_clear(cas);
  888. return 0;
  889. }
  890. static int power_clear(cascade_handle_t *cas)
  891. {
  892. GlobalPowerManger *tmp,*pos;
  893. GlobalTreeACManager *tmp3,*pos3;
  894. GlobalDeviceManager *dm2=get_dm2();
  895. if(!list_empty(&dm2->_globalPowerManger.list_Tree_AC)) {
  896. list_for_each_entry_safe(tmp3,pos3,&dm2->_globalPowerManger.list_Tree_AC,list_Tree_AC)
  897. {
  898. if(tmp3==NULL) {
  899. continue;
  900. }
  901. list_del(&tmp3->list_Tree_AC);
  902. free(tmp3);
  903. }
  904. }
  905. if(!list_empty(&dm2->_globalPowerManger.list)) {
  906. list_for_each_entry_safe(tmp,pos,&dm2->_globalPowerManger.list,list)
  907. {
  908. if(tmp==NULL) {
  909. continue;
  910. }
  911. if (tmp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  912. if(list_empty(&tmp->list_Tree_AC)) {
  913. continue;
  914. }
  915. list_for_each_entry_safe(tmp3,pos3,&tmp->list_Tree_AC,list_Tree_AC)
  916. {
  917. if(tmp3==NULL) {
  918. continue;
  919. }
  920. list_del(&tmp3->list_Tree_AC);
  921. free(tmp3);
  922. }
  923. }
  924. list_del(&tmp->list);
  925. free(tmp);
  926. }
  927. }
  928. return 0;
  929. }
  930. static int breaker_clear(cascade_handle_t *cas)
  931. {
  932. GlobalDeviceManager *dm2=get_dm2();
  933. GlobalBreakerManager *temp = NULL;
  934. GlobalBreakerManager *pos = NULL;
  935. pthread_mutex_lock(&dm2->_breaker_mutex);
  936. if(!list_empty(&dm2->g_new_global_breaker.list)) {
  937. list_for_each_entry_safe(temp,pos,&dm2->g_new_global_breaker.list,list)
  938. {
  939. if(temp == NULL)
  940. {
  941. continue;
  942. }
  943. list_del(&temp->list);
  944. free(temp);
  945. }
  946. }
  947. INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
  948. pthread_mutex_unlock(&dm2->_breaker_mutex);
  949. return 0;
  950. }
  951. static int power_add(cascade_handle_t *cas)
  952. {
  953. int i,j,nTac_chn=0,r=-1;
  954. GlobalDeviceManager *dm1=get_dm();
  955. GlobalDeviceManager *dm2=get_dm2();
  956. GlobalPowerManger *tmp=NULL;
  957. GlobalTreeACManager *tmp3=NULL;
  958. slave_info_t *info=&cas->sInfo;
  959. LOGD("____ master add channel to the list, cnt: %d\n", info->cnt);
  960. cascade_lock();
  961. power_clear(cas);
  962. dm2->_globalDevInfo.product.id = cur_dev_addr;
  963. //插入总数据
  964. if(info->prod.product_pwr_type==SmartPDU_Tree_AC_Tree ||
  965. info->prod.product_pwr_type==SmartPDU_Tree_AC_One ||
  966. info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  967. for (int TreeACindex = 0; TreeACindex < 3; TreeACindex++)
  968. {
  969. tmp3 = (GlobalTreeACManager*)malloc(sizeof(GlobalTreeACManager));
  970. if (tmp3 == NULL) {
  971. LOGE("tmp3 malloc error.\n");
  972. goto quit;
  973. }
  974. memset(tmp3, 0, sizeof(GlobalTreeACManager));
  975. tmp3->product_ch_addr = TreeACindex + 1;
  976. tmp3->product_id = info->prod.product_id;
  977. tmp3->product_saddr = 0;
  978. tmp3->product_ch_id = 0;
  979. tmp3->product_ch_addr = TreeACindex + 1;
  980. tmp3->product_ph_id = nTac_chn;
  981. tmp3->product_ph_type = (TreeACindex + 3) % 3;
  982. list_add_tail(&tmp3->list_Tree_AC, &dm2->_globalPowerManger.list_Tree_AC);
  983. nTac_chn++;
  984. }
  985. }
  986. for(i=0; i<info->cnt; i++) {
  987. tmp = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
  988. if(!tmp) {
  989. LOGE("tmp malloc error.\n");
  990. goto quit;
  991. }
  992. memset(tmp, 0, sizeof(GlobalPowerManger));
  993. tmp->product_id = info->prod.product_id;
  994. tmp->product_saddr = info->ch[i].product_saddr;
  995. tmp->product_ch_id = info->ch[i].product_ch_id;
  996. tmp->product_ch_addr = info->ch[i].product_ch_addr;
  997. sprintf(tmp->product_ch_name, "CH%d", tmp->product_ch_id);
  998. tmp->product_ch_type = info->ch[i].product_ch_type;
  999. tmp->product_ch_status = info->ch[i].product_ch_status;
  1000. tmp->product_ch_NF_status = info->ch[i].product_ch_NF_status;
  1001. tmp->product_ch_start_delay = info->ch[i].start_delay;
  1002. tmp->product_ch_stop_delay = info->ch[i].stop_delay;
  1003. tmp->_PowerInfo = info->ch[i].chinfo;
  1004. if(info->ch[i].product_ch_type==TREE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  1005. INIT_LIST_HEAD(&tmp->list_Tree_AC);
  1006. for (j=0; j<3; j++) {
  1007. tmp3 = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  1008. if (tmp3 == NULL) {
  1009. LOGE("tmp3 malloc error.\n");
  1010. goto quit;
  1011. }
  1012. memset(tmp3, 0, sizeof(GlobalTreeACManager));
  1013. tmp3->product_id = info->prod.product_id;
  1014. tmp3->product_saddr = info->ch[i].product_saddr;
  1015. tmp3->product_ch_id = tmp->product_ch_id;
  1016. tmp3->product_ch_addr = info->ch[i].product_ch_addr;
  1017. tmp3->product_ph_id = info->ch[i].pinfo[j].phase.product_ph_id;
  1018. tmp3->product_ph_type = info->ch[i].pinfo[j].phase.product_ph_type;
  1019. tmp3->product_ph_outputType = info->ch[i].pinfo[j].phase.product_ph_outputType;
  1020. tmp3->product_ph_outputStatus = info->ch[i].pinfo[j].phase.product_ph_outputStatus;
  1021. tmp3->_PowerInfo = info->ch[i].pinfo[j].power;
  1022. list_add_tail(&tmp3->list_Tree_AC, &tmp->list_Tree_AC);
  1023. }
  1024. }
  1025. list_add_tail(&tmp->list,&dm2->_globalPowerManger.list);
  1026. }
  1027. cascade_unlock();
  1028. r = 0;
  1029. quit:
  1030. return r;
  1031. }
  1032. static int breaker_add(cascade_handle_t *cas)
  1033. {
  1034. int i,j,r=-1;
  1035. //GlobalDeviceManager *dm1=get_dm();
  1036. GlobalDeviceManager *dm2=get_dm2();
  1037. GlobalBreakerManager *tmp=NULL;
  1038. breaker_info_t *info=&cas->sBreaker;
  1039. //cascade_lock();
  1040. breaker_clear(cas);
  1041. pthread_mutex_lock(&dm2->_breaker_mutex);
  1042. for(i=0; i<info->cnt; i++) {
  1043. tmp = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
  1044. if(!tmp) {
  1045. LOGE("tmp malloc error.\n");
  1046. goto quit;
  1047. }
  1048. memset(tmp, 0, sizeof(GlobalBreakerManager));
  1049. tmp->product_id = cur_dev_addr;
  1050. tmp->breaker_chn = info->breaker_chn[i].breaker_chn;
  1051. tmp->breaker_status = info->breaker_chn[i].breaker_status;
  1052. tmp->breaker_gather_addr = info->breaker_chn[i].breaker_addrs;
  1053. tmp->breaker_id = info->breaker_chn[i].breaker_id;
  1054. strcpy(tmp->breaker_gather_type, info->breaker_chn[i].breaker_gather_type);
  1055. strcpy(tmp->breaker_com, info->breaker_chn[i].breaker_com);
  1056. strcpy(tmp->breaker_chns_name, info->breaker_chn[i].breaker_chns_name);
  1057. strcpy(tmp->breaker_switch_name, info->breaker_chn[i].breaker_switch_name);
  1058. list_add_tail(&tmp->list,&dm2->g_new_global_breaker.list);
  1059. }
  1060. pthread_mutex_unlock(&dm2->_breaker_mutex);
  1061. //cascade_unlock();
  1062. r = 0;
  1063. quit:
  1064. return r;
  1065. }
  1066. static int breaker_update(cascade_handle_t *cas)
  1067. {
  1068. GlobalBreakerManager *tmp=NULL;
  1069. GlobalBreakerManager *tmp3=NULL;
  1070. GlobalDeviceManager *dm2=get_dm2();
  1071. breaker_info_t *info=&cas->sBreaker;
  1072. int cnt = 0;
  1073. LOGD("______ breaker_update, %d\n", info->cnt);
  1074. if(info->cnt==0) {
  1075. LOGE("___ sBreaker.cnt is 0\n");
  1076. return -1;
  1077. }
  1078. if(!list_empty(&dm2->g_new_global_breaker.list)) {
  1079. cnt = 0;
  1080. pthread_mutex_lock(&dm2->_breaker_mutex);
  1081. list_for_each_entry_safe(tmp,tmp3,&dm2->g_new_global_breaker.list,list)
  1082. {
  1083. tmp->breaker_id = info->breaker_chn[cnt].breaker_id;
  1084. tmp->breaker_status = info->breaker_chn[cnt].breaker_status;
  1085. tmp->breaker_gather_addr = info->breaker_chn[cnt].breaker_addrs;
  1086. strcpy(tmp->breaker_gather_type, info->breaker_chn[cnt].breaker_gather_type);
  1087. strcpy(tmp->breaker_com, info->breaker_chn[cnt].breaker_com);
  1088. strcpy(tmp->breaker_chns_name, info->breaker_chn[cnt].breaker_chns_name);
  1089. strcpy(tmp->breaker_switch_name, info->breaker_chn[cnt].breaker_switch_name);
  1090. cnt++;
  1091. }
  1092. pthread_mutex_unlock(&dm2->_breaker_mutex);
  1093. }
  1094. return 0;
  1095. }
  1096. static int power_update(cascade_handle_t *cas)
  1097. {
  1098. int cnt=0;
  1099. GlobalPowerManger *tmp=NULL;
  1100. GlobalTreeACManager *tmp3=NULL;
  1101. GlobalDeviceManager *dm2=get_dm2();
  1102. slave_info_t *info=&cas->sInfo;
  1103. LOGD("______ power_update, %d\n", info->cnt);
  1104. if(info->cnt==0) {
  1105. LOGE("___ sInfo.cnt is 0\n");
  1106. return -1;
  1107. }
  1108. if(!list_empty(&dm2->_globalPowerManger.list_Tree_AC)) {
  1109. cnt = 0;
  1110. list_for_each_entry(tmp3,&dm2->_globalPowerManger.list_Tree_AC,list_Tree_AC)
  1111. {
  1112. if(tmp3==NULL) {
  1113. continue;
  1114. }
  1115. if(cnt<3) {
  1116. tmp3->_PowerInfo = info->all.power[cnt++];
  1117. }
  1118. }
  1119. }
  1120. if(!list_empty(&dm2->_globalPowerManger.list)) {
  1121. cnt = 0;
  1122. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  1123. {
  1124. tmp->_PowerInfo = info->ch[cnt].chinfo;
  1125. if(tmp->product_ch_type==TREE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  1126. if(list_empty(&tmp->list_Tree_AC)) {
  1127. continue;
  1128. }
  1129. int cnt2=0;
  1130. list_for_each_entry(tmp3,&tmp->list_Tree_AC,list_Tree_AC)
  1131. {
  1132. tmp3->_PowerInfo = info->ch[cnt].pinfo[cnt2++].power;
  1133. }
  1134. }
  1135. cnt++;
  1136. }
  1137. }
  1138. return 0;
  1139. }
  1140. static void print_sensor(char *s, sensor_data_t *ss)
  1141. {
  1142. LOGD("__%s__ ss.type: %d\n", s, ss->type);
  1143. LOGD("__%s__ ss.addr: %d\n", s, ss->addr);
  1144. LOGD("__%s__ ss.voltage: %f\n", s, ss->pwr.voltage);
  1145. LOGD("__%s__ ss.current: %f\n", s, ss->pwr.current);
  1146. LOGD("__%s__ ss.power: %f\n", s, ss->pwr.power);
  1147. LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
  1148. LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
  1149. LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
  1150. LOGD("__%s__ ss.status: %d\n", s, ss->pwr.status);
  1151. LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
  1152. LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
  1153. LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
  1154. LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
  1155. LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
  1156. LOGD("\n");
  1157. }
  1158. #define VALUE_OF(m,a,b) ((m[a]<<16)+m[b])
  1159. static int sensor_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
  1160. {
  1161. uint32_t offset = 6000;
  1162. uint32_t value = 0 ;
  1163. uint16_t temp[100];
  1164. int r,cnt = sizeof(sensor_ori_t)/2;
  1165. r = _mb_read(cas, addr, offset, temp, cnt);
  1166. if(r!=cnt) {
  1167. LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
  1168. return -1;
  1169. }
  1170. ss->type = temp[0];
  1171. ss->addr = temp[1];
  1172. ss->pwr.voltage = VALUE_OF(temp,3,2)/1000.0;
  1173. ss->pwr.current = VALUE_OF(temp,5,4)/1000.0;
  1174. ss->pwr.power = VALUE_OF(temp,7,6)/1000.0;
  1175. ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
  1176. ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
  1177. ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
  1178. ss->pwr.status = temp[20];
  1179. ss->temprature = VALUE_OF(temp,15,14)/1000.0;
  1180. ss->humidity = VALUE_OF(temp,17,16)/1000.0;
  1181. ss->warning = VALUE_OF(temp,19,18)/1000.0;
  1182. ss->sensor_status = temp[21];
  1183. //print_sensor("11", ss);
  1184. return 0;
  1185. }
  1186. #define REGS(x) (((x)+(x)%2)/2)
  1187. static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
  1188. {
  1189. int i,r;
  1190. GlobalPowerManger *tmp=NULL;
  1191. GlobalDeviceManager *dm=get_dm();
  1192. GlobalDeviceManager *dm2=get_dm2();
  1193. GlobalDeviceInfo *dev=&dm2->_globalDevInfo;
  1194. data_t rdata,wdata;
  1195. if(cur_dev_addr==0) {
  1196. return -1;
  1197. }
  1198. switch(cmd->cmd) {
  1199. case CASCADE_CMD_OPEN:
  1200. case CASCADE_CMD_CLOSE:
  1201. case CASCADE_CMD_SAVE:
  1202. case CASCADE_CMD_SAVE3:
  1203. case CASCADE_CMD_OPEN_NF:
  1204. case CASCADE_CMD_CLOSE_NF:
  1205. {
  1206. LOGD("____ master CMD: %d\n", cmd->cmd);
  1207. wdata.dlen = sizeof(cmd_data_t);
  1208. wdata.data = (uint8_t*)cmd;
  1209. r = mb_write(cas, cur_dev_addr, &wdata);
  1210. }
  1211. break;
  1212. case CASCADE_CMD_GET_INFO:
  1213. {
  1214. wdata.dlen = sizeof(cmd_data_t);
  1215. wdata.data = (uint8_t*)cmd;
  1216. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*CH_MAX;
  1217. rdata.data = (uint8_t*)&cas->sInfo;
  1218. LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
  1219. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1220. if(r==0) {
  1221. LOGD("______cas->info.cnt: %d\n", cas->sInfo.cnt);
  1222. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
  1223. rdata.data = (uint8_t*)&cas->sInfo;
  1224. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1225. if(r==0) {
  1226. power_add(cas);
  1227. }
  1228. }
  1229. else {
  1230. LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
  1231. }
  1232. }
  1233. break;
  1234. case CASCADE_CMD_BREAKER_GET_INFO:
  1235. {
  1236. wdata.dlen = sizeof(cmd_data_t);
  1237. wdata.data = (uint8_t*)cmd;
  1238. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*CH_MAX;
  1239. rdata.data = (uint8_t*)&cas->sBreaker;
  1240. LOGD("_____ master send CASCADE_CMD_BREAKER_GET_INFO\n");
  1241. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1242. if(r==0) {
  1243. LOGD("______cas->info.cnt: %d\n", cas->sBreaker.cnt);
  1244. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
  1245. rdata.data = (uint8_t*)&cas->sBreaker;
  1246. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1247. if(r==0) {
  1248. breaker_add(cas);
  1249. }
  1250. }
  1251. }
  1252. break;
  1253. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  1254. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  1255. case CASCADE_CMD_BREAKER_SAVE_ADD:
  1256. {
  1257. wdata.dlen = sizeof(cmd_data_t);
  1258. wdata.data = (uint8_t*)cmd;
  1259. r = mb_write(cas, cur_dev_addr, &wdata);
  1260. }
  1261. break;
  1262. default:
  1263. cas->cmd = *cmd;
  1264. r = 0;
  1265. }
  1266. return r;
  1267. }
  1268. static int master_query(cascade_handle_t *cas)
  1269. {
  1270. int i,r;
  1271. GlobalPowerManger *tmp=NULL;
  1272. GlobalDeviceManager *dm2=get_dm2();
  1273. GlobalDeviceInfo *dev=&dm2->_globalDevInfo;
  1274. cmd_data_t *cmd=&cas->cmd;
  1275. data_t rdata,wdata;
  1276. if(cur_dev_addr==0) {
  1277. return -1;
  1278. }
  1279. wdata.dlen = sizeof(cmd_data_t);
  1280. wdata.data = (uint8_t*)cmd;
  1281. switch(cmd->cmd) {
  1282. case CASCADE_CMD_QUERY_CH:
  1283. {
  1284. #if (CHIP_TYPE == CHIP_T113s)
  1285. if(cas->scanner_flag == 1)
  1286. return -1;
  1287. #endif
  1288. //LOGD("__00__ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->sInfo.cnt);
  1289. if(cas->sInfo.cnt==0 || cas->sInfo.cnt>CH_MAX) {
  1290. return -1;
  1291. }
  1292. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
  1293. rdata.data = (uint8_t*)&cas->sInfo;
  1294. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1295. if(r==0) {
  1296. power_update(cas);
  1297. cmd->cmd = CASCADE_CMD_BREAKER_QUERY;
  1298. }
  1299. else {
  1300. LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
  1301. }
  1302. //LOGD("__11__ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->sInfo.cnt);
  1303. }
  1304. break;
  1305. case CASCADE_CMD_BREAKER_QUERY:
  1306. {
  1307. wdata.dlen = sizeof(cmd_data_t);
  1308. wdata.data = (uint8_t*)cmd;
  1309. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*CH_MAX;
  1310. rdata.data = (uint8_t*)&cas->sBreaker;
  1311. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1312. LOGD("____ master query CASCADE_CMD_BREAKER_QUERY, cnt: %d\n", cas->sBreaker.cnt);
  1313. if(cas->sBreaker.cnt==0 || cas->sBreaker.cnt>CH_MAX)
  1314. {
  1315. breaker_clear(cas);
  1316. cmd->cmd = CASCADE_CMD_QUERY_CH;
  1317. return -1;
  1318. }
  1319. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
  1320. rdata.data = (uint8_t*)&cas->sBreaker;
  1321. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1322. if(r == 0)
  1323. {
  1324. breaker_add(cas);
  1325. cmd->cmd = CASCADE_CMD_QUERY_CH;
  1326. }else
  1327. {
  1328. LOGE("____ master query CASCADE_CMD_BREAKER_QUERY failed\n");
  1329. }
  1330. }
  1331. break;
  1332. case CASCADE_CMD_QUERY_VOL:
  1333. {
  1334. if(cmd->obj==OBJ_CHANNEL) {
  1335. //rdata.dlen = sizeof(chInfo);
  1336. //rdata.data = (uint8_t*)&chInfo;
  1337. }
  1338. else if(cmd->obj==OBJ_OVERALL) {
  1339. //rdata.dlen = sizeof(chInfo);
  1340. //rdata.data = (uint8_t*)&chInfo;
  1341. }
  1342. else {
  1343. return -1;
  1344. }
  1345. }
  1346. break;
  1347. case CASCADE_CMD_QUERY_CUR:
  1348. {
  1349. if(cmd->obj==OBJ_CHANNEL) {
  1350. //rdata.dlen = sizeof(chInfo);
  1351. //rdata.data = (uint8_t*)&chInfo;
  1352. }
  1353. else if(cmd->obj==OBJ_OVERALL) {
  1354. //rdata.dlen = sizeof(chInfo);
  1355. //rdata.data = (uint8_t*)&chInfo;
  1356. }
  1357. else {
  1358. return -1;
  1359. }
  1360. }
  1361. break;
  1362. case CASCADE_CMD_QUERY_PWR:
  1363. {
  1364. if(cmd->obj==OBJ_CHANNEL) {
  1365. //rdata.dlen = sizeof(chInfo);
  1366. //rdata.data = (uint8_t*)&chInfo;
  1367. }
  1368. else if(cmd->obj==OBJ_OVERALL) {
  1369. //rdata.dlen = sizeof(chInfo);
  1370. //rdata.data = (uint8_t*)&chInfo;
  1371. }
  1372. else {
  1373. return -1;
  1374. }
  1375. }
  1376. break;
  1377. case CASCADE_CMD_QUERY_PWRQ:
  1378. {
  1379. if(cmd->obj==OBJ_CHANNEL) {
  1380. //rdata.dlen = sizeof(chInfo);
  1381. //rdata.data = (uint8_t*)&chInfo;
  1382. }
  1383. else if(cmd->obj==OBJ_OVERALL) {
  1384. //rdata.dlen = sizeof(chInfo);
  1385. //rdata.data = (uint8_t*)&chInfo;
  1386. }
  1387. else {
  1388. return -1;
  1389. }
  1390. }
  1391. break;
  1392. case CASCADE_CMD_QUERY_HIS:
  1393. {
  1394. if(cmd->obj==OBJ_CHANNEL) {
  1395. //rdata.dlen = sizeof(chInfo);
  1396. //rdata.data = (uint8_t*)&chInfo;
  1397. }
  1398. else if(cmd->obj==OBJ_OVERALL) {
  1399. //rdata.dlen = sizeof(chInfo);
  1400. //rdata.data = (uint8_t*)&chInfo;
  1401. }
  1402. else {
  1403. return -1;
  1404. }
  1405. }
  1406. break;
  1407. case CASCADE_CMD_QUERY_TOTAL:
  1408. {
  1409. if(cmd->obj==OBJ_CHANNEL) {
  1410. //rdata.dlen = sizeof(chInfo);
  1411. //rdata.data = (uint8_t*)&chInfo;
  1412. }
  1413. else if(cmd->obj==OBJ_OVERALL) {
  1414. //rdata.dlen = sizeof(chInfo);
  1415. //rdata.data = (uint8_t*)&chInfo;
  1416. }
  1417. else {
  1418. return -1;
  1419. }
  1420. }
  1421. break;
  1422. case CASCADE_CMD_QUERY_TOTAL_PWR:
  1423. {
  1424. if(cmd->obj==OBJ_CHANNEL) {
  1425. //rdata.dlen = sizeof(chInfo);
  1426. //rdata.data = (uint8_t*)&chInfo;
  1427. }
  1428. else if(cmd->obj==OBJ_OVERALL) {
  1429. //rdata.dlen = sizeof(chInfo);
  1430. //rdata.data = (uint8_t*)&chInfo;
  1431. }
  1432. else {
  1433. return -1;
  1434. }
  1435. }
  1436. break;
  1437. default:
  1438. //LOGD("____ master query cmd: %d\n", cmd->cmd);
  1439. return -1;
  1440. }
  1441. return r;
  1442. }
  1443. static int slave_receive(cascade_handle_t *cas)
  1444. {
  1445. return mb_receive(cas);
  1446. }
  1447. static void* cascade_thread(void *arg)
  1448. {
  1449. int r;
  1450. thread_handle_t *h=(thread_handle_t*)arg;
  1451. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  1452. ModbusInfo_t *info=&cas->mInfo;
  1453. LOGD("__ cascade %s\n", (info->mode==MODBUS_MASTER)?"master":"slave");
  1454. while(h->quit==0) {
  1455. if(info->mode==MODBUS_MASTER) { //主模
  1456. r = master_query(cas);
  1457. sleep(1);
  1458. }
  1459. else { //从模式,等待主设备发起数据请�?
  1460. r = slave_receive(cas);
  1461. }
  1462. }
  1463. pthread_exit(NULL);
  1464. }
  1465. static void* cascade_scan_thread(void *arg)
  1466. {
  1467. int r;
  1468. thread_handle_t *h=(thread_handle_t*)arg;
  1469. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  1470. ModbusInfo_t *info=&cas->mInfo;
  1471. while(h->quit==0) {
  1472. if(info->mode==MODBUS_MASTER) { //master
  1473. r = master_scan(cas);
  1474. }
  1475. sleep(1);
  1476. }
  1477. pthread_exit(NULL);
  1478. }
  1479. static void* cmd_thread(void *arg)
  1480. {
  1481. int i,t=0;
  1482. char temp[100];
  1483. cascade_handle_t *cas=&casHandle;
  1484. slave_info_t *info=&cas->sInfo;
  1485. GlobalDeviceManager *dm=get_dm();
  1486. cmd_data_t *pcmd=(cmd_data_t*)arg;
  1487. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  1488. LOGD("____ slave CASCADE_CMD_OPEN\n");
  1489. }
  1490. else {
  1491. LOGD("____ slave CASCADE_CMD_CLOSE\n");
  1492. }
  1493. int flag=((pcmd->cmd==CASCADE_CMD_OPEN)?1:0);
  1494. if(pcmd->chId == 0xff) {
  1495. int sendAddr = 0;
  1496. for(i=0; i<info->cnt; i++) {
  1497. if(info->ch[i].product_ch_addr>0) {
  1498. if(info->ch[i].product_ch_addr==sendAddr) {
  1499. continue;
  1500. }
  1501. else {
  1502. sendAddr = info->ch[i].product_ch_addr;
  1503. }
  1504. t = g_switch_set_all_ctrl(&dm->_globalRelaySampManger, info->ch[i].product_ch_type, info->ch[i].product_ch_addr, flag);
  1505. if(t<0) {
  1506. LOGE("___ %d %s failed\n", info->ch[i].product_ch_addr, (pcmd->cmd==CASCADE_CMD_OPEN)?"open":"close");
  1507. }
  1508. }
  1509. }
  1510. }
  1511. else {
  1512. GlobalPowerManger *tmp=NULL;
  1513. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  1514. {
  1515. if(tmp->product_ch_id==pcmd->chId) {
  1516. t = g_switch_set_all_chn_ctrl(&dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
  1517. break;
  1518. }
  1519. }
  1520. }
  1521. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  1522. sprintf(temp,"$开启$|$所有$|$通道$");
  1523. }
  1524. else {
  1525. sprintf(temp,"$关闭$|$所有$|$通道$");
  1526. }
  1527. dev_insert_alarm_ctrl(dm->db, dm->_globalDevInfo.product.id,ALARM_TYPE_OPRATION,temp);
  1528. free(pcmd);
  1529. pthread_exit(NULL);
  1530. }
  1531. static void* cmd_NF_thread(void *arg)
  1532. {
  1533. int i,t=0;
  1534. char temp[256];
  1535. cascade_handle_t *cas=&casHandle;
  1536. slave_info_t *info=&cas->sInfo;
  1537. GlobalDeviceManager *dm=get_dm();
  1538. cmd_data_t *pcmd=(cmd_data_t*)arg;
  1539. if(pcmd->cmd==CASCADE_CMD_OPEN_NF) {
  1540. LOGD("____ slave CASCADE_CMD_OPEN_NF\n");
  1541. }
  1542. else {
  1543. LOGD("____ slave CASCADE_CMD_CLOSE_NF\n");
  1544. }
  1545. int flag=(pcmd->cmd==CASCADE_CMD_OPEN_NF)?1:0;
  1546. if(pcmd->obj == OBJ_CHANNEL)
  1547. {
  1548. GlobalPowerManger *tmp=NULL;
  1549. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  1550. {
  1551. if(tmp->product_ch_id==pcmd->chId) {
  1552. t = g_switch_set_t_ac_chn_NF_ctrl(&dm->_globalRelaySampManger, tmp->product_saddr, tmp->product_ch_addr, flag);
  1553. break;
  1554. }
  1555. }
  1556. }
  1557. if(pcmd->cmd==CASCADE_CMD_OPEN_NF) {
  1558. sprintf(temp, "$开启$|$通道$|%d Naught wire!", pcmd->chId);
  1559. }
  1560. else {
  1561. sprintf(temp, "$关闭$|$通道$|%d Naught wire!", pcmd->chId);
  1562. }
  1563. dev_insert_alarm_ctrl(dm->db, dm->_globalDevInfo.product.id,ALARM_TYPE_OPRATION,temp);
  1564. free(pcmd);
  1565. pthread_exit(NULL);
  1566. }
  1567. static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
  1568. {
  1569. int r;
  1570. if(cas->inited) {
  1571. mb_deinit(cas);
  1572. }
  1573. cas->mInfo = *info;
  1574. //LOGD("master init modbus: port: %s, type: %d, baud: %d\n", CASCADE_MODBUS_PORT, info->mode, info->baudrate);
  1575. r = mb_init(cas, CASCADE_MODBUS_PORT, info->mode,
  1576. info->addr, info->baudrate);
  1577. if(r!=0) {
  1578. LOGE("cascade modbus init error.\n");
  1579. return -1;
  1580. }
  1581. #if (CHIP_TYPE == CHIP_T113s)
  1582. cas->scanner_flag = 0;
  1583. #endif
  1584. if (cas->mInfo.mode==MODBUS_SLAVE)
  1585. {
  1586. for (size_t i = 1; i < CASCADE_MAX; i++)
  1587. {
  1588. slave_rm(cas,i);
  1589. }
  1590. }
  1591. return 0;
  1592. }
  1593. #include <net/if.h>
  1594. #include <ifaddrs.h>
  1595. static int get_ipaddr(int family, char *iface, char *addr, char *netmask)
  1596. {
  1597. struct ifaddrs *ifap, *ifa;
  1598. if (getifaddrs(&ifap) == -1) {
  1599. LOGE("___getifaddrs() error\n");
  1600. return -1;
  1601. }
  1602. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  1603. if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
  1604. if(family==AF_INET) {
  1605. struct sockaddr_in *sa,*msk;
  1606. sa = (struct sockaddr_in *) ifa->ifa_addr;
  1607. msk = (struct sockaddr_in *) ifa->ifa_netmask;
  1608. if(addr) {
  1609. inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
  1610. printf("___addr: %s\n", addr);
  1611. }
  1612. if(netmask) {
  1613. inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
  1614. //printf("___netmask: %s\n", netmask);
  1615. }
  1616. }
  1617. else {
  1618. struct sockaddr_in6 *sa,*msk;
  1619. sa = (struct sockaddr_in6 *) ifa->ifa_addr;
  1620. msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
  1621. if(addr) {
  1622. inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
  1623. //printf("___addr6: %s\n", addr);
  1624. }
  1625. if(netmask) {
  1626. inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
  1627. //printf("___netmask6: %s\n", netmask);
  1628. }
  1629. }
  1630. }
  1631. }
  1632. freeifaddrs(ifap);
  1633. return 0;
  1634. }
  1635. int cascade_init(void)
  1636. {
  1637. int r=0;
  1638. cascade_handle_t *cas=&casHandle;
  1639. memset(cas, 0, sizeof(casHandle));
  1640. power_init(cas);
  1641. breaker_slave_init();
  1642. slave_init(cas);
  1643. r = pthread_mutex_init(&cas->mutex, NULL);
  1644. if(r) {
  1645. LOGE("___ cascade mutex init failed\n");
  1646. }
  1647. r = pthread_mutex_init(&cas->mutex2, NULL);
  1648. if(r) {
  1649. LOGE("___ cascade mutex2 init failed\n");
  1650. }
  1651. r = pthread_mutex_init(&cas->mutex3, NULL);
  1652. if(r) {
  1653. LOGE("___ cascade mutex3 init failed\n");
  1654. }
  1655. cas->scanAddr = 1;
  1656. cas->map = modbus_mapping_new_start_address(0,0,0,0,
  1657. CASCADE_REG_READ, MAX_READ_REGS2,
  1658. CASCADE_REG_WRITE, MAX_WRITE_REGS2);
  1659. set_modbus(cas, get_mb());
  1660. cascade_slave_init();
  1661. slave_add(cas, 0);
  1662. thread_start(THREAD_ID_CASCADE, cascade_thread, cas);
  1663. thread_start(THREAD_ID_CASCADE_SCAN, cascade_scan_thread, cas);
  1664. GlobalDeviceManager* dm =get_dm();
  1665. NetworkInfo_t net = {0};
  1666. //sys_get_net(&net,IP_V4);
  1667. int family = AF_INET;
  1668. r = get_ipaddr(family, "eth0", net.ip_address, net.mask);
  1669. uint8_t addr = 0;
  1670. if(!dm->_globalDevInfo.cascade.mode)
  1671. {
  1672. addr = 0XFF;
  1673. }else
  1674. {
  1675. addr = dm->_globalDevInfo.cascade.addr;
  1676. }
  1677. dm->md_tcp = tcp_modbus_init(net.ip_address,CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product.pwr_type);
  1678. if(dm->md_tcp)
  1679. thread_start(THREAD_ID_TCP, tcp_modbus_thread, NULL);
  1680. else
  1681. LOGE("___ TCP Modbus Init Failed!!!!\n");
  1682. return 0;
  1683. }
  1684. int cascade_deinit(void)
  1685. {
  1686. cascade_handle_t *cas=&casHandle;
  1687. thread_stop(THREAD_ID_CASCADE);
  1688. thread_stop(THREAD_ID_CASCADE_SCAN);
  1689. pthread_mutex_destroy(&cas->mutex);
  1690. pthread_mutex_destroy(&cas->mutex2);
  1691. pthread_mutex_destroy(&cas->mutex3);
  1692. modbus_mapping_free(cas->map);
  1693. mb_deinit(cas);
  1694. power_deinit(cas);
  1695. return 0;
  1696. }
  1697. int cascade_set_modbus(ModbusInfo_t *info)
  1698. {
  1699. cascade_handle_t *cas=&casHandle;
  1700. if(!info || info->addr>CASCADE_MAX) {
  1701. return -1;
  1702. }
  1703. return set_modbus(cas, info);
  1704. }
  1705. int cascade_get_dlist(dev_list_t *dl)
  1706. {
  1707. int i,cnt=0;
  1708. slave_t *sl=NULL;
  1709. cascade_handle_t *cas=&casHandle;
  1710. if(!dl) {
  1711. return -1;
  1712. }
  1713. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  1714. if(!sl) {
  1715. return -1;
  1716. }
  1717. for(i=0; i<=CASCADE_MAX; i++) {
  1718. if(cas->slaves[i].addr>=0) {
  1719. sl[cnt++] = cas->slaves[i];
  1720. }
  1721. }
  1722. dl->slave = sl;
  1723. dl->cnt = cnt;
  1724. LOGD("____dev cnt: %d\n", cnt);
  1725. return 0;
  1726. }
  1727. /**
  1728. * @brief 释放级联设备列表
  1729. *
  1730. * 释放给定的级联设备列表(dev_list_t)中的 slave 成员所指向的内存。
  1731. *
  1732. * @param dl 级联设备列表指针
  1733. *
  1734. * @return 成功返回 0,失败返回 -1
  1735. */
  1736. int cascade_free_dlist(dev_list_t *dl)
  1737. {
  1738. if(!dl) {
  1739. return -1;
  1740. }
  1741. free(dl->slave);
  1742. return 0;
  1743. }
  1744. /**
  1745. * @brief 级联请求
  1746. *
  1747. * 根据给定的命令数据执行级联请求,并返回执行结果。
  1748. *
  1749. * @param cmd 命令数据指针
  1750. *
  1751. * @return 执行结果,成功返回0,失败返回-1
  1752. */
  1753. int cascade_request(cmd_data_t *cmd)
  1754. {
  1755. int r=0;
  1756. cascade_handle_t *cas=&casHandle;
  1757. if(!cmd) {
  1758. return -1;
  1759. }
  1760. pthread_mutex_lock(&cas->mutex2);
  1761. #if (CHIP_TYPE == CHIP_T113s)
  1762. cas->scanner_flag = 1;
  1763. #endif
  1764. r = master_cmd(cas, cmd);
  1765. #if (CHIP_TYPE == CHIP_T113s)
  1766. cas->scanner_flag = 0;
  1767. #endif
  1768. pthread_mutex_unlock(&cas->mutex2);
  1769. return r;
  1770. }
  1771. int cascade_get_all(_OverAllPwrAckInfo *all)
  1772. {
  1773. return 0;
  1774. }
  1775. int cascade_get_ch(_OverChnPwrAckInfo *ch)
  1776. {
  1777. GlobalPowerManger *tmp=NULL;
  1778. GlobalTreeACManager *tmp3=NULL;
  1779. _OverChnPwrAckInfo *pch=NULL;
  1780. GlobalDeviceManager* dm2=get_dm2();
  1781. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  1782. {
  1783. if (tmp->product_ch_type==TREE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B){
  1784. int nStatus=-1;//-1则状态不变,0、1则是子状态
  1785. //判断是否三相单输出情况下
  1786. if(tmp->product_ch_type==TREE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  1787. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC) {
  1788. if (2 == tmp3->product_ph_outputType &&1==tmp3->product_ph_outputStatus)
  1789. {//单项并且状态为输出
  1790. nStatus = tmp3->_PowerInfo.status;
  1791. }
  1792. }
  1793. }
  1794. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
  1795. {
  1796. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1797. if (pch == NULL) {
  1798. LOGE("pch malloc err.\n");
  1799. return -1;
  1800. }
  1801. pch->product_name = dm2->_globalDevInfo.product.name;
  1802. pch->product_number = dm2->_globalDevInfo.product.number;
  1803. pch->product_id = dm2->_globalDevInfo.product.id;
  1804. pch->productChName = tmp->product_ch_name;
  1805. pch->productChId = tmp->product_ch_id;
  1806. pch->status = tmp->_PowerInfo.status;
  1807. pch->voltage = tmp->_PowerInfo.voltage;
  1808. pch->current = tmp->_PowerInfo.current;
  1809. pch->power = tmp->_PowerInfo.power;
  1810. pch->freq = tmp->_PowerInfo.freq;
  1811. pch->consumption = tmp->_PowerInfo.consumption;
  1812. pch->factor = tmp->_PowerInfo.factor;
  1813. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1814. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1815. pch->product_type=tmp->product_ch_type;
  1816. pch->product_phType = tmp3->product_ph_type;
  1817. pch->ph_voltage = tmp3->_PowerInfo.voltage;
  1818. pch->ph_current = tmp3->_PowerInfo.current;
  1819. pch->ph_power = tmp3->_PowerInfo.power;
  1820. pch->ph_consumption = tmp3->_PowerInfo.consumption;
  1821. pch->ph_outputType = tmp3->product_ph_outputType;
  1822. pch->ph_outputStatus = tmp3->product_ph_outputStatus;
  1823. if ((dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) &&
  1824. tmp3->product_ph_outputType == 2 && tmp3->product_ph_outputStatus == 2) // 如果是单项输出并且则非输出通道数据为0
  1825. {
  1826. // 3-1模式 单项状态,不输出则数据为空
  1827. pch->ph_voltage = 0.0;
  1828. pch->ph_current = 0.0;
  1829. pch->ph_power = 0.0;
  1830. pch->ph_consumption = 0.0;
  1831. }
  1832. if (nStatus>=0)
  1833. {
  1834. pch->status = nStatus;
  1835. }else {
  1836. pch->status = tmp->_PowerInfo.status;
  1837. }
  1838. list_add_tail(&pch->list, &ch->list);
  1839. }
  1840. }
  1841. else {
  1842. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1843. if (pch == NULL) {
  1844. log_e("_overChnPwrBackInfoTemp malloc err.");
  1845. return -1;
  1846. }
  1847. // 填数据
  1848. pch->product_name = dm2->_globalDevInfo.product.name;
  1849. pch->product_number = dm2->_globalDevInfo.product.number;
  1850. pch->product_id = dm2->_globalDevInfo.product.id;
  1851. pch->productChName = tmp->product_ch_name;
  1852. pch->productChId = tmp->product_ch_id;
  1853. pch->status = tmp->_PowerInfo.status;
  1854. pch->voltage = tmp->_PowerInfo.voltage;
  1855. pch->current = tmp->_PowerInfo.current;
  1856. pch->power = tmp->_PowerInfo.power;
  1857. pch->freq = tmp->_PowerInfo.freq;
  1858. pch->consumption = tmp->_PowerInfo.consumption;
  1859. pch->factor = tmp->_PowerInfo.factor;
  1860. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1861. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1862. list_add_tail(&pch->list, &ch->list);
  1863. }
  1864. }
  1865. return 0;
  1866. }
  1867. int cascade_lock(void)
  1868. {
  1869. cascade_handle_t *cas=&casHandle;
  1870. return pthread_mutex_lock(&cas->mutex);
  1871. }
  1872. int cascade_unlock(void)
  1873. {
  1874. cascade_handle_t *cas=&casHandle;
  1875. return pthread_mutex_unlock(&cas->mutex);
  1876. }