cascade.c 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152
  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("0.0.0.0",CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product.pwr_type);
  1678. if(dm->md_tcp){
  1679. LOGD("___ TCP Modbus Init sucessful!!!!\n");
  1680. thread_start(THREAD_ID_TCP, tcp_modbus_thread, NULL);
  1681. }
  1682. else
  1683. LOGE("___ TCP Modbus Init Failed!!!!\n");
  1684. return 0;
  1685. }
  1686. int cascade_deinit(void)
  1687. {
  1688. cascade_handle_t *cas=&casHandle;
  1689. thread_stop(THREAD_ID_CASCADE);
  1690. thread_stop(THREAD_ID_CASCADE_SCAN);
  1691. pthread_mutex_destroy(&cas->mutex);
  1692. pthread_mutex_destroy(&cas->mutex2);
  1693. pthread_mutex_destroy(&cas->mutex3);
  1694. modbus_mapping_free(cas->map);
  1695. mb_deinit(cas);
  1696. power_deinit(cas);
  1697. return 0;
  1698. }
  1699. int cascade_set_modbus(ModbusInfo_t *info)
  1700. {
  1701. cascade_handle_t *cas=&casHandle;
  1702. if(!info || info->addr>CASCADE_MAX) {
  1703. return -1;
  1704. }
  1705. return set_modbus(cas, info);
  1706. }
  1707. int cascade_get_dlist(dev_list_t *dl)
  1708. {
  1709. int i,cnt=0;
  1710. slave_t *sl=NULL;
  1711. cascade_handle_t *cas=&casHandle;
  1712. if(!dl) {
  1713. return -1;
  1714. }
  1715. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  1716. if(!sl) {
  1717. return -1;
  1718. }
  1719. for(i=0; i<=CASCADE_MAX; i++) {
  1720. if(cas->slaves[i].addr>=0) {
  1721. sl[cnt++] = cas->slaves[i];
  1722. }
  1723. }
  1724. dl->slave = sl;
  1725. dl->cnt = cnt;
  1726. LOGD("____dev cnt: %d\n", cnt);
  1727. return 0;
  1728. }
  1729. /**
  1730. * @brief 释放级联设备列表
  1731. *
  1732. * 释放给定的级联设备列表(dev_list_t)中的 slave 成员所指向的内存。
  1733. *
  1734. * @param dl 级联设备列表指针
  1735. *
  1736. * @return 成功返回 0,失败返回 -1
  1737. */
  1738. int cascade_free_dlist(dev_list_t *dl)
  1739. {
  1740. if(!dl) {
  1741. return -1;
  1742. }
  1743. free(dl->slave);
  1744. return 0;
  1745. }
  1746. /**
  1747. * @brief 级联请求
  1748. *
  1749. * 根据给定的命令数据执行级联请求,并返回执行结果。
  1750. *
  1751. * @param cmd 命令数据指针
  1752. *
  1753. * @return 执行结果,成功返回0,失败返回-1
  1754. */
  1755. int cascade_request(cmd_data_t *cmd)
  1756. {
  1757. int r=0;
  1758. cascade_handle_t *cas=&casHandle;
  1759. if(!cmd) {
  1760. return -1;
  1761. }
  1762. pthread_mutex_lock(&cas->mutex2);
  1763. #if (CHIP_TYPE == CHIP_T113s)
  1764. cas->scanner_flag = 1;
  1765. #endif
  1766. r = master_cmd(cas, cmd);
  1767. #if (CHIP_TYPE == CHIP_T113s)
  1768. cas->scanner_flag = 0;
  1769. #endif
  1770. pthread_mutex_unlock(&cas->mutex2);
  1771. return r;
  1772. }
  1773. int cascade_get_all(_OverAllPwrAckInfo *all)
  1774. {
  1775. return 0;
  1776. }
  1777. int cascade_get_ch(_OverChnPwrAckInfo *ch)
  1778. {
  1779. GlobalPowerManger *tmp=NULL;
  1780. GlobalTreeACManager *tmp3=NULL;
  1781. _OverChnPwrAckInfo *pch=NULL;
  1782. GlobalDeviceManager* dm2=get_dm2();
  1783. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  1784. {
  1785. if (tmp->product_ch_type==TREE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B){
  1786. int nStatus=-1;//-1则状态不变,0、1则是子状态
  1787. //判断是否三相单输出情况下
  1788. if(tmp->product_ch_type==TREE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  1789. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC) {
  1790. if (2 == tmp3->product_ph_outputType &&1==tmp3->product_ph_outputStatus)
  1791. {//单项并且状态为输出
  1792. nStatus = tmp3->_PowerInfo.status;
  1793. }
  1794. }
  1795. }
  1796. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
  1797. {
  1798. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1799. if (pch == NULL) {
  1800. LOGE("pch malloc err.\n");
  1801. return -1;
  1802. }
  1803. pch->product_name = dm2->_globalDevInfo.product.name;
  1804. pch->product_number = dm2->_globalDevInfo.product.number;
  1805. pch->product_id = dm2->_globalDevInfo.product.id;
  1806. pch->productChName = tmp->product_ch_name;
  1807. pch->productChId = tmp->product_ch_id;
  1808. pch->status = tmp->_PowerInfo.status;
  1809. pch->voltage = tmp->_PowerInfo.voltage;
  1810. pch->current = tmp->_PowerInfo.current;
  1811. pch->power = tmp->_PowerInfo.power;
  1812. pch->freq = tmp->_PowerInfo.freq;
  1813. pch->consumption = tmp->_PowerInfo.consumption;
  1814. pch->factor = tmp->_PowerInfo.factor;
  1815. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1816. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1817. pch->product_type=tmp->product_ch_type;
  1818. pch->product_phType = tmp3->product_ph_type;
  1819. pch->ph_voltage = tmp3->_PowerInfo.voltage;
  1820. pch->ph_current = tmp3->_PowerInfo.current;
  1821. pch->ph_power = tmp3->_PowerInfo.power;
  1822. pch->ph_consumption = tmp3->_PowerInfo.consumption;
  1823. pch->ph_outputType = tmp3->product_ph_outputType;
  1824. pch->ph_outputStatus = tmp3->product_ph_outputStatus;
  1825. if ((dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) &&
  1826. tmp3->product_ph_outputType == 2 && tmp3->product_ph_outputStatus == 2) // 如果是单项输出并且则非输出通道数据为0
  1827. {
  1828. // 3-1模式 单项状态,不输出则数据为空
  1829. pch->ph_voltage = 0.0;
  1830. pch->ph_current = 0.0;
  1831. pch->ph_power = 0.0;
  1832. pch->ph_consumption = 0.0;
  1833. }
  1834. if (nStatus>=0)
  1835. {
  1836. pch->status = nStatus;
  1837. }else {
  1838. pch->status = tmp->_PowerInfo.status;
  1839. }
  1840. list_add_tail(&pch->list, &ch->list);
  1841. }
  1842. }
  1843. else {
  1844. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1845. if (pch == NULL) {
  1846. log_e("_overChnPwrBackInfoTemp malloc err.");
  1847. return -1;
  1848. }
  1849. // 填数据
  1850. pch->product_name = dm2->_globalDevInfo.product.name;
  1851. pch->product_number = dm2->_globalDevInfo.product.number;
  1852. pch->product_id = dm2->_globalDevInfo.product.id;
  1853. pch->productChName = tmp->product_ch_name;
  1854. pch->productChId = tmp->product_ch_id;
  1855. pch->status = tmp->_PowerInfo.status;
  1856. pch->voltage = tmp->_PowerInfo.voltage;
  1857. pch->current = tmp->_PowerInfo.current;
  1858. pch->power = tmp->_PowerInfo.power;
  1859. pch->freq = tmp->_PowerInfo.freq;
  1860. pch->consumption = tmp->_PowerInfo.consumption;
  1861. pch->factor = tmp->_PowerInfo.factor;
  1862. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1863. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1864. list_add_tail(&pch->list, &ch->list);
  1865. }
  1866. }
  1867. return 0;
  1868. }
  1869. int cascade_lock(void)
  1870. {
  1871. cascade_handle_t *cas=&casHandle;
  1872. return pthread_mutex_lock(&cas->mutex);
  1873. }
  1874. int cascade_unlock(void)
  1875. {
  1876. cascade_handle_t *cas=&casHandle;
  1877. return pthread_mutex_unlock(&cas->mutex);
  1878. }