cascade.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164
  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||tmp->product_ch_type==DOUBLE_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,800);
  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(!get_dm()->upgread_flag)
  829. {
  830. if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
  831. cascade_slave_read(h.reg, h.regcnt);
  832. }
  833. else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
  834. cascade_slave_write(h.reg, h.regcnt);
  835. }
  836. r = _mb_reply(cas, buff, rc,cascade_slave_map());
  837. }
  838. }
  839. }
  840. return r;
  841. }
  842. /////////////////////////////////////////////////////////////////////////
  843. static int master_scan(cascade_handle_t *cas)
  844. {
  845. int i,r=0;
  846. uint16_t tmp[10];
  847. if(cas->scanAddr>CASCADE_MAX) {
  848. cas->scanAddr = 1;
  849. }
  850. if(!slave_find(cas, cas->scanAddr)) {
  851. r = mb_scan(cas, cas->scanAddr);
  852. if(r>0) {
  853. LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
  854. slave_add(cas, cas->scanAddr);
  855. }
  856. else {
  857. LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
  858. }
  859. }
  860. cas->scanAddr++;
  861. //print_slave(cas);
  862. return 0;
  863. }
  864. ///////////////////////////////////////////////////////////////////////////////////////
  865. static int power_clear(cascade_handle_t *cas);
  866. static int power_init(cascade_handle_t *cas)
  867. {
  868. GlobalDeviceManager *dm=get_dm();
  869. GlobalDeviceManager *dm2=get_dm2();
  870. dm2->_globalDevInfo.product.pwr_type = dm->_globalDevInfo.product.pwr_type;
  871. dm2->_globalDevInfo.product.id = dm->_globalDevInfo.product.id;
  872. strcpy(dm2->_globalDevInfo.product.name, dm->_globalDevInfo.product.name);
  873. strcpy(dm2->_globalDevInfo.product.number, dm->_globalDevInfo.product.number);
  874. strcpy(dm2->_globalDevInfo.product.status, dm->_globalDevInfo.product.status);
  875. INIT_LIST_HEAD(&dm2->_globalPowerManger.list);
  876. INIT_LIST_HEAD(&dm2->_globalPowerManger.list_Tree_AC);
  877. return 0;
  878. }
  879. static int breaker_slave_init(void)
  880. {
  881. //GlobalDeviceManager *dm=get_dm();
  882. GlobalDeviceManager *dm2=get_dm2();
  883. INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
  884. pthread_mutex_init(&dm2->_breaker_mutex,NULL);
  885. return 0;
  886. }
  887. static int power_deinit(cascade_handle_t *cas)
  888. {
  889. GlobalDeviceManager *dm2=get_dm2();
  890. power_clear(cas);
  891. return 0;
  892. }
  893. static int power_clear(cascade_handle_t *cas)
  894. {
  895. GlobalPowerManger *tmp,*pos;
  896. GlobalTreeACManager *tmp3,*pos3;
  897. GlobalDeviceManager *dm2=get_dm2();
  898. if(!list_empty(&dm2->_globalPowerManger.list_Tree_AC)) {
  899. list_for_each_entry_safe(tmp3,pos3,&dm2->_globalPowerManger.list_Tree_AC,list_Tree_AC)
  900. {
  901. if(tmp3==NULL) {
  902. continue;
  903. }
  904. list_del(&tmp3->list_Tree_AC);
  905. free(tmp3);
  906. }
  907. }
  908. if(!list_empty(&dm2->_globalPowerManger.list)) {
  909. list_for_each_entry_safe(tmp,pos,&dm2->_globalPowerManger.list,list)
  910. {
  911. if(tmp==NULL) {
  912. continue;
  913. }
  914. if (tmp->product_ch_type==TREE_AC_TYPE||tmp->product_ch_type==DOUBLE_AC_TYPE||__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  915. if(list_empty(&tmp->list_Tree_AC)) {
  916. continue;
  917. }
  918. list_for_each_entry_safe(tmp3,pos3,&tmp->list_Tree_AC,list_Tree_AC)
  919. {
  920. if(tmp3==NULL) {
  921. continue;
  922. }
  923. list_del(&tmp3->list_Tree_AC);
  924. free(tmp3);
  925. }
  926. }
  927. list_del(&tmp->list);
  928. free(tmp);
  929. }
  930. }
  931. return 0;
  932. }
  933. static int breaker_clear(cascade_handle_t *cas)
  934. {
  935. GlobalDeviceManager *dm2=get_dm2();
  936. GlobalBreakerManager *temp = NULL;
  937. GlobalBreakerManager *pos = NULL;
  938. pthread_mutex_lock(&dm2->_breaker_mutex);
  939. if(!list_empty(&dm2->g_new_global_breaker.list)) {
  940. list_for_each_entry_safe(temp,pos,&dm2->g_new_global_breaker.list,list)
  941. {
  942. if(temp == NULL)
  943. {
  944. continue;
  945. }
  946. list_del(&temp->list);
  947. free(temp);
  948. }
  949. }
  950. INIT_LIST_HEAD(&dm2->g_new_global_breaker.list);
  951. pthread_mutex_unlock(&dm2->_breaker_mutex);
  952. return 0;
  953. }
  954. static int power_add(cascade_handle_t *cas)
  955. {
  956. int i,j,nTac_chn=0,r=-1;
  957. GlobalDeviceManager *dm1=get_dm();
  958. GlobalDeviceManager *dm2=get_dm2();
  959. GlobalPowerManger *tmp=NULL;
  960. GlobalTreeACManager *tmp3=NULL;
  961. slave_info_t *info=&cas->sInfo;
  962. LOGD("____ master add channel to the list, cnt: %d\n", info->cnt);
  963. cascade_lock();
  964. power_clear(cas);
  965. dm2->_globalDevInfo.product.id = cur_dev_addr;
  966. //插入总数据
  967. if(info->prod.product_pwr_type==SmartPDU_Tree_AC_Tree ||
  968. info->prod.product_pwr_type==SmartPDU_Tree_AC_One ||
  969. info->prod.product_pwr_type==SmartPDU_Tree_AC_Two ||
  970. info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  971. for (int TreeACindex = 0; TreeACindex < 3; TreeACindex++)
  972. {
  973. tmp3 = (GlobalTreeACManager*)malloc(sizeof(GlobalTreeACManager));
  974. if (tmp3 == NULL) {
  975. LOGE("tmp3 malloc error.\n");
  976. goto quit;
  977. }
  978. memset(tmp3, 0, sizeof(GlobalTreeACManager));
  979. tmp3->product_ch_addr = TreeACindex + 1;
  980. tmp3->product_id = info->prod.product_id;
  981. tmp3->product_saddr = 0;
  982. tmp3->product_ch_id = 0;
  983. tmp3->product_ch_addr = TreeACindex + 1;
  984. tmp3->product_ph_id = nTac_chn;
  985. tmp3->product_ph_type = (TreeACindex + 3) % 3;
  986. list_add_tail(&tmp3->list_Tree_AC, &dm2->_globalPowerManger.list_Tree_AC);
  987. nTac_chn++;
  988. }
  989. }
  990. for(i=0; i<info->cnt; i++) {
  991. tmp = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
  992. if(!tmp) {
  993. LOGE("tmp malloc error.\n");
  994. goto quit;
  995. }
  996. memset(tmp, 0, sizeof(GlobalPowerManger));
  997. tmp->product_id = info->prod.product_id;
  998. tmp->product_saddr = info->ch[i].product_saddr;
  999. tmp->product_ch_id = info->ch[i].product_ch_id;
  1000. tmp->product_ch_addr = info->ch[i].product_ch_addr;
  1001. sprintf(tmp->product_ch_name, "CH%d", tmp->product_ch_id);
  1002. tmp->product_ch_type = info->ch[i].product_ch_type;
  1003. tmp->product_ch_status = info->ch[i].product_ch_status;
  1004. tmp->product_ch_NF_status = info->ch[i].product_ch_NF_status;
  1005. tmp->product_ch_start_delay = info->ch[i].start_delay;
  1006. tmp->product_ch_stop_delay = info->ch[i].stop_delay;
  1007. tmp->_PowerInfo = info->ch[i].chinfo;
  1008. if(info->ch[i].product_ch_type==TREE_AC_TYPE||info->ch[i].product_ch_type==DOUBLE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  1009. INIT_LIST_HEAD(&tmp->list_Tree_AC);
  1010. for (j=0; j<3; j++) {
  1011. tmp3 = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  1012. if (tmp3 == NULL) {
  1013. LOGE("tmp3 malloc error.\n");
  1014. goto quit;
  1015. }
  1016. memset(tmp3, 0, sizeof(GlobalTreeACManager));
  1017. tmp3->product_id = info->prod.product_id;
  1018. tmp3->product_saddr = info->ch[i].product_saddr;
  1019. tmp3->product_ch_id = tmp->product_ch_id;
  1020. tmp3->product_ch_addr = info->ch[i].product_ch_addr;
  1021. tmp3->product_ph_id = info->ch[i].pinfo[j].phase.product_ph_id;
  1022. tmp3->product_ph_type = info->ch[i].pinfo[j].phase.product_ph_type;
  1023. tmp3->product_ph_outputType = info->ch[i].pinfo[j].phase.product_ph_outputType;
  1024. tmp3->product_ph_outputStatus = info->ch[i].pinfo[j].phase.product_ph_outputStatus;
  1025. tmp3->_PowerInfo = info->ch[i].pinfo[j].power;
  1026. list_add_tail(&tmp3->list_Tree_AC, &tmp->list_Tree_AC);
  1027. }
  1028. }
  1029. list_add_tail(&tmp->list,&dm2->_globalPowerManger.list);
  1030. }
  1031. cascade_unlock();
  1032. r = 0;
  1033. quit:
  1034. return r;
  1035. }
  1036. static int breaker_add(cascade_handle_t *cas)
  1037. {
  1038. int i,j,r=-1;
  1039. //GlobalDeviceManager *dm1=get_dm();
  1040. GlobalDeviceManager *dm2=get_dm2();
  1041. GlobalBreakerManager *tmp=NULL;
  1042. breaker_info_t *info=&cas->sBreaker;
  1043. //cascade_lock();
  1044. breaker_clear(cas);
  1045. pthread_mutex_lock(&dm2->_breaker_mutex);
  1046. for(i=0; i<info->cnt; i++) {
  1047. tmp = (GlobalBreakerManager*) malloc(sizeof(GlobalBreakerManager));
  1048. if(!tmp) {
  1049. LOGE("tmp malloc error.\n");
  1050. goto quit;
  1051. }
  1052. memset(tmp, 0, sizeof(GlobalBreakerManager));
  1053. tmp->product_id = cur_dev_addr;
  1054. tmp->breaker_chn = info->breaker_chn[i].breaker_chn;
  1055. tmp->breaker_status = info->breaker_chn[i].breaker_status;
  1056. tmp->breaker_gather_addr = info->breaker_chn[i].breaker_addrs;
  1057. tmp->breaker_id = info->breaker_chn[i].breaker_id;
  1058. strcpy(tmp->breaker_gather_type, info->breaker_chn[i].breaker_gather_type);
  1059. strcpy(tmp->breaker_com, info->breaker_chn[i].breaker_com);
  1060. strcpy(tmp->breaker_chns_name, info->breaker_chn[i].breaker_chns_name);
  1061. strcpy(tmp->breaker_switch_name, info->breaker_chn[i].breaker_switch_name);
  1062. list_add_tail(&tmp->list,&dm2->g_new_global_breaker.list);
  1063. }
  1064. pthread_mutex_unlock(&dm2->_breaker_mutex);
  1065. //cascade_unlock();
  1066. r = 0;
  1067. quit:
  1068. return r;
  1069. }
  1070. static int breaker_update(cascade_handle_t *cas)
  1071. {
  1072. GlobalBreakerManager *tmp=NULL;
  1073. GlobalBreakerManager *tmp3=NULL;
  1074. GlobalDeviceManager *dm2=get_dm2();
  1075. breaker_info_t *info=&cas->sBreaker;
  1076. int cnt = 0;
  1077. LOGD("______ breaker_update, %d\n", info->cnt);
  1078. if(info->cnt==0) {
  1079. LOGE("___ sBreaker.cnt is 0\n");
  1080. return -1;
  1081. }
  1082. if(!list_empty(&dm2->g_new_global_breaker.list)) {
  1083. cnt = 0;
  1084. pthread_mutex_lock(&dm2->_breaker_mutex);
  1085. list_for_each_entry_safe(tmp,tmp3,&dm2->g_new_global_breaker.list,list)
  1086. {
  1087. tmp->breaker_id = info->breaker_chn[cnt].breaker_id;
  1088. tmp->breaker_status = info->breaker_chn[cnt].breaker_status;
  1089. tmp->breaker_gather_addr = info->breaker_chn[cnt].breaker_addrs;
  1090. strcpy(tmp->breaker_gather_type, info->breaker_chn[cnt].breaker_gather_type);
  1091. strcpy(tmp->breaker_com, info->breaker_chn[cnt].breaker_com);
  1092. strcpy(tmp->breaker_chns_name, info->breaker_chn[cnt].breaker_chns_name);
  1093. strcpy(tmp->breaker_switch_name, info->breaker_chn[cnt].breaker_switch_name);
  1094. cnt++;
  1095. }
  1096. pthread_mutex_unlock(&dm2->_breaker_mutex);
  1097. }
  1098. return 0;
  1099. }
  1100. static int power_update(cascade_handle_t *cas)
  1101. {
  1102. int cnt=0;
  1103. GlobalPowerManger *tmp=NULL;
  1104. GlobalTreeACManager *tmp3=NULL;
  1105. GlobalDeviceManager *dm2=get_dm2();
  1106. slave_info_t *info=&cas->sInfo;
  1107. LOGD("______ power_update, %d\n", info->cnt);
  1108. if(info->cnt==0) {
  1109. LOGE("___ sInfo.cnt is 0\n");
  1110. return -1;
  1111. }
  1112. if(!list_empty(&dm2->_globalPowerManger.list_Tree_AC)) {
  1113. cnt = 0;
  1114. list_for_each_entry(tmp3,&dm2->_globalPowerManger.list_Tree_AC,list_Tree_AC)
  1115. {
  1116. if(tmp3==NULL) {
  1117. continue;
  1118. }
  1119. if(cnt<3) {
  1120. tmp3->_PowerInfo = info->all.power[cnt++];
  1121. }
  1122. }
  1123. }
  1124. if(!list_empty(&dm2->_globalPowerManger.list)) {
  1125. cnt = 0;
  1126. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  1127. {
  1128. tmp->_PowerInfo = info->ch[cnt].chinfo;
  1129. if(tmp->product_ch_type==TREE_AC_TYPE||tmp->product_ch_type==DOUBLE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
  1130. if(list_empty(&tmp->list_Tree_AC)) {
  1131. continue;
  1132. }
  1133. int cnt2=0;
  1134. list_for_each_entry(tmp3,&tmp->list_Tree_AC,list_Tree_AC)
  1135. {
  1136. tmp3->_PowerInfo = info->ch[cnt].pinfo[cnt2++].power;
  1137. }
  1138. }
  1139. cnt++;
  1140. }
  1141. }
  1142. return 0;
  1143. }
  1144. static void print_sensor(char *s, sensor_data_t *ss)
  1145. {
  1146. LOGD("__%s__ ss.type: %d\n", s, ss->type);
  1147. LOGD("__%s__ ss.addr: %d\n", s, ss->addr);
  1148. LOGD("__%s__ ss.voltage: %f\n", s, ss->pwr.voltage);
  1149. LOGD("__%s__ ss.current: %f\n", s, ss->pwr.current);
  1150. LOGD("__%s__ ss.power: %f\n", s, ss->pwr.power);
  1151. LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
  1152. LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
  1153. LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
  1154. LOGD("__%s__ ss.status: %d\n", s, ss->pwr.status);
  1155. LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
  1156. LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
  1157. LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
  1158. LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
  1159. LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
  1160. LOGD("\n");
  1161. }
  1162. #define VALUE_OF(m,a,b) ((m[a]<<16)+m[b])
  1163. static int sensor_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
  1164. {
  1165. uint32_t offset = 6000;
  1166. uint32_t value = 0 ;
  1167. uint16_t temp[100];
  1168. int r,cnt = sizeof(sensor_ori_t)/2;
  1169. r = _mb_read(cas, addr, offset, temp, cnt);
  1170. if(r!=cnt) {
  1171. LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
  1172. return -1;
  1173. }
  1174. ss->type = temp[0];
  1175. ss->addr = temp[1];
  1176. ss->pwr.voltage = VALUE_OF(temp,3,2)/1000.0;
  1177. ss->pwr.current = VALUE_OF(temp,5,4)/1000.0;
  1178. ss->pwr.power = VALUE_OF(temp,7,6)/1000.0;
  1179. ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
  1180. ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
  1181. ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
  1182. ss->pwr.status = temp[20];
  1183. ss->temprature = VALUE_OF(temp,15,14)/1000.0;
  1184. ss->humidity = VALUE_OF(temp,17,16)/1000.0;
  1185. ss->warning = VALUE_OF(temp,19,18)/1000.0;
  1186. ss->sensor_status = temp[21];
  1187. //print_sensor("11", ss);
  1188. return 0;
  1189. }
  1190. #define REGS(x) (((x)+(x)%2)/2)
  1191. static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
  1192. {
  1193. int i,r;
  1194. GlobalPowerManger *tmp=NULL;
  1195. GlobalDeviceManager *dm=get_dm();
  1196. GlobalDeviceManager *dm2=get_dm2();
  1197. GlobalDeviceInfo *dev=&dm2->_globalDevInfo;
  1198. data_t rdata,wdata;
  1199. if(cur_dev_addr==0) {
  1200. return -1;
  1201. }
  1202. switch(cmd->cmd) {
  1203. case CASCADE_CMD_OPEN:
  1204. case CASCADE_CMD_CLOSE:
  1205. case CASCADE_CMD_SAVE:
  1206. case CASCADE_CMD_SAVE3:
  1207. case CASCADE_CMD_OPEN_NF:
  1208. case CASCADE_CMD_CLOSE_NF:
  1209. {
  1210. LOGD("____ master CMD: %d\n", cmd->cmd);
  1211. wdata.dlen = sizeof(cmd_data_t);
  1212. wdata.data = (uint8_t*)cmd;
  1213. r = mb_write(cas, cur_dev_addr, &wdata);
  1214. }
  1215. break;
  1216. case CASCADE_CMD_GET_INFO:
  1217. {
  1218. wdata.dlen = sizeof(cmd_data_t);
  1219. wdata.data = (uint8_t*)cmd;
  1220. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*CH_MAX;
  1221. rdata.data = (uint8_t*)&cas->sInfo;
  1222. LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
  1223. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1224. if(r==0) {
  1225. LOGD("______cas->info.cnt: %d\n", cas->sInfo.cnt);
  1226. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
  1227. rdata.data = (uint8_t*)&cas->sInfo;
  1228. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1229. if(r==0) {
  1230. power_add(cas);
  1231. }
  1232. }
  1233. else {
  1234. LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
  1235. }
  1236. }
  1237. break;
  1238. case CASCADE_CMD_BREAKER_GET_INFO:
  1239. {
  1240. wdata.dlen = sizeof(cmd_data_t);
  1241. wdata.data = (uint8_t*)cmd;
  1242. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*CH_MAX;
  1243. rdata.data = (uint8_t*)&cas->sBreaker;
  1244. LOGD("_____ master send CASCADE_CMD_BREAKER_GET_INFO\n");
  1245. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1246. if(r==0) {
  1247. LOGD("______cas->info.cnt: %d\n", cas->sBreaker.cnt);
  1248. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
  1249. rdata.data = (uint8_t*)&cas->sBreaker;
  1250. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1251. if(r==0) {
  1252. breaker_add(cas);
  1253. }
  1254. }
  1255. }
  1256. break;
  1257. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  1258. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  1259. case CASCADE_CMD_BREAKER_SAVE_ADD:
  1260. {
  1261. wdata.dlen = sizeof(cmd_data_t);
  1262. wdata.data = (uint8_t*)cmd;
  1263. r = mb_write(cas, cur_dev_addr, &wdata);
  1264. }
  1265. break;
  1266. default:
  1267. cas->cmd = *cmd;
  1268. r = 0;
  1269. }
  1270. return r;
  1271. }
  1272. static int master_query(cascade_handle_t *cas)
  1273. {
  1274. int i,r;
  1275. GlobalPowerManger *tmp=NULL;
  1276. GlobalDeviceManager *dm2=get_dm2();
  1277. GlobalDeviceInfo *dev=&dm2->_globalDevInfo;
  1278. cmd_data_t *cmd=&cas->cmd;
  1279. data_t rdata,wdata;
  1280. if(cur_dev_addr==0) {
  1281. return -1;
  1282. }
  1283. wdata.dlen = sizeof(cmd_data_t);
  1284. wdata.data = (uint8_t*)cmd;
  1285. switch(cmd->cmd) {
  1286. case CASCADE_CMD_QUERY_CH:
  1287. {
  1288. #if (CHIP_TYPE == CHIP_T113s)
  1289. if(cas->scanner_flag == 1)
  1290. return -1;
  1291. #endif
  1292. //LOGD("__00__ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->sInfo.cnt);
  1293. if(cas->sInfo.cnt==0 || cas->sInfo.cnt>CH_MAX) {
  1294. return -1;
  1295. }
  1296. rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
  1297. rdata.data = (uint8_t*)&cas->sInfo;
  1298. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1299. if(r==0) {
  1300. power_update(cas);
  1301. cmd->cmd = CASCADE_CMD_BREAKER_QUERY;
  1302. }
  1303. else {
  1304. LOGE("____ master query CASCADE_CMD_QUERY_CH failed\n");
  1305. }
  1306. //LOGD("__11__ master query CASCADE_CMD_QUERY_CH, cnt: %d\n", cas->sInfo.cnt);
  1307. }
  1308. break;
  1309. case CASCADE_CMD_BREAKER_QUERY:
  1310. {
  1311. wdata.dlen = sizeof(cmd_data_t);
  1312. wdata.data = (uint8_t*)cmd;
  1313. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*CH_MAX;
  1314. rdata.data = (uint8_t*)&cas->sBreaker;
  1315. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1316. LOGD("____ master query CASCADE_CMD_BREAKER_QUERY, cnt: %d\n", cas->sBreaker.cnt);
  1317. if(cas->sBreaker.cnt==0 || cas->sBreaker.cnt>CH_MAX)
  1318. {
  1319. breaker_clear(cas);
  1320. cmd->cmd = CASCADE_CMD_QUERY_CH;
  1321. return -1;
  1322. }
  1323. rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);
  1324. rdata.data = (uint8_t*)&cas->sBreaker;
  1325. r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  1326. if(r == 0)
  1327. {
  1328. breaker_add(cas);
  1329. cmd->cmd = CASCADE_CMD_QUERY_CH;
  1330. }else
  1331. {
  1332. LOGE("____ master query CASCADE_CMD_BREAKER_QUERY failed\n");
  1333. }
  1334. }
  1335. break;
  1336. case CASCADE_CMD_QUERY_VOL:
  1337. {
  1338. if(cmd->obj==OBJ_CHANNEL) {
  1339. //rdata.dlen = sizeof(chInfo);
  1340. //rdata.data = (uint8_t*)&chInfo;
  1341. }
  1342. else if(cmd->obj==OBJ_OVERALL) {
  1343. //rdata.dlen = sizeof(chInfo);
  1344. //rdata.data = (uint8_t*)&chInfo;
  1345. }
  1346. else {
  1347. return -1;
  1348. }
  1349. }
  1350. break;
  1351. case CASCADE_CMD_QUERY_CUR:
  1352. {
  1353. if(cmd->obj==OBJ_CHANNEL) {
  1354. //rdata.dlen = sizeof(chInfo);
  1355. //rdata.data = (uint8_t*)&chInfo;
  1356. }
  1357. else if(cmd->obj==OBJ_OVERALL) {
  1358. //rdata.dlen = sizeof(chInfo);
  1359. //rdata.data = (uint8_t*)&chInfo;
  1360. }
  1361. else {
  1362. return -1;
  1363. }
  1364. }
  1365. break;
  1366. case CASCADE_CMD_QUERY_PWR:
  1367. {
  1368. if(cmd->obj==OBJ_CHANNEL) {
  1369. //rdata.dlen = sizeof(chInfo);
  1370. //rdata.data = (uint8_t*)&chInfo;
  1371. }
  1372. else if(cmd->obj==OBJ_OVERALL) {
  1373. //rdata.dlen = sizeof(chInfo);
  1374. //rdata.data = (uint8_t*)&chInfo;
  1375. }
  1376. else {
  1377. return -1;
  1378. }
  1379. }
  1380. break;
  1381. case CASCADE_CMD_QUERY_PWRQ:
  1382. {
  1383. if(cmd->obj==OBJ_CHANNEL) {
  1384. //rdata.dlen = sizeof(chInfo);
  1385. //rdata.data = (uint8_t*)&chInfo;
  1386. }
  1387. else if(cmd->obj==OBJ_OVERALL) {
  1388. //rdata.dlen = sizeof(chInfo);
  1389. //rdata.data = (uint8_t*)&chInfo;
  1390. }
  1391. else {
  1392. return -1;
  1393. }
  1394. }
  1395. break;
  1396. case CASCADE_CMD_QUERY_HIS:
  1397. {
  1398. if(cmd->obj==OBJ_CHANNEL) {
  1399. //rdata.dlen = sizeof(chInfo);
  1400. //rdata.data = (uint8_t*)&chInfo;
  1401. }
  1402. else if(cmd->obj==OBJ_OVERALL) {
  1403. //rdata.dlen = sizeof(chInfo);
  1404. //rdata.data = (uint8_t*)&chInfo;
  1405. }
  1406. else {
  1407. return -1;
  1408. }
  1409. }
  1410. break;
  1411. case CASCADE_CMD_QUERY_TOTAL:
  1412. {
  1413. if(cmd->obj==OBJ_CHANNEL) {
  1414. //rdata.dlen = sizeof(chInfo);
  1415. //rdata.data = (uint8_t*)&chInfo;
  1416. }
  1417. else if(cmd->obj==OBJ_OVERALL) {
  1418. //rdata.dlen = sizeof(chInfo);
  1419. //rdata.data = (uint8_t*)&chInfo;
  1420. }
  1421. else {
  1422. return -1;
  1423. }
  1424. }
  1425. break;
  1426. case CASCADE_CMD_QUERY_TOTAL_PWR:
  1427. {
  1428. if(cmd->obj==OBJ_CHANNEL) {
  1429. //rdata.dlen = sizeof(chInfo);
  1430. //rdata.data = (uint8_t*)&chInfo;
  1431. }
  1432. else if(cmd->obj==OBJ_OVERALL) {
  1433. //rdata.dlen = sizeof(chInfo);
  1434. //rdata.data = (uint8_t*)&chInfo;
  1435. }
  1436. else {
  1437. return -1;
  1438. }
  1439. }
  1440. break;
  1441. default:
  1442. //LOGD("____ master query cmd: %d\n", cmd->cmd);
  1443. return -1;
  1444. }
  1445. return r;
  1446. }
  1447. static int slave_receive(cascade_handle_t *cas)
  1448. {
  1449. return mb_receive(cas);
  1450. }
  1451. static void* cascade_thread(void *arg)
  1452. {
  1453. int r;
  1454. thread_handle_t *h=(thread_handle_t*)arg;
  1455. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  1456. ModbusInfo_t *info=&cas->mInfo;
  1457. LOGD("__ cascade %s\n", (info->mode==MODBUS_MASTER)?"master":"slave");
  1458. while(h->quit==0) {
  1459. if(info->mode==MODBUS_MASTER) { //主模
  1460. r = master_query(cas);
  1461. sleep(1);
  1462. }
  1463. else { //从模式,等待主设备发起数据请�?
  1464. r = slave_receive(cas);
  1465. }
  1466. }
  1467. pthread_exit(NULL);
  1468. }
  1469. static void* cascade_scan_thread(void *arg)
  1470. {
  1471. int r;
  1472. thread_handle_t *h=(thread_handle_t*)arg;
  1473. cascade_handle_t *cas=(cascade_handle_t*)h->arg;
  1474. ModbusInfo_t *info=&cas->mInfo;
  1475. while(h->quit==0) {
  1476. if(info->mode==MODBUS_MASTER) { //master
  1477. r = master_scan(cas);
  1478. }
  1479. sleep(1);
  1480. }
  1481. pthread_exit(NULL);
  1482. }
  1483. static void* cmd_thread(void *arg)
  1484. {
  1485. int i,t=0;
  1486. char temp[100];
  1487. cascade_handle_t *cas=&casHandle;
  1488. slave_info_t *info=&cas->sInfo;
  1489. GlobalDeviceManager *dm=get_dm();
  1490. cmd_data_t *pcmd=(cmd_data_t*)arg;
  1491. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  1492. LOGD("____ slave CASCADE_CMD_OPEN\n");
  1493. }
  1494. else {
  1495. LOGD("____ slave CASCADE_CMD_CLOSE\n");
  1496. }
  1497. if(dm->upgread_flag)
  1498. {
  1499. free(pcmd);
  1500. pthread_exit(NULL);
  1501. }
  1502. int flag=((pcmd->cmd==CASCADE_CMD_OPEN)?1:0);
  1503. if(pcmd->chId == 0xff) {
  1504. int sendAddr = 0;
  1505. for(i=0; i<info->cnt; i++) {
  1506. if(info->ch[i].product_ch_addr>0) {
  1507. if(info->ch[i].product_ch_addr==sendAddr) {
  1508. continue;
  1509. }
  1510. else {
  1511. sendAddr = info->ch[i].product_ch_addr;
  1512. }
  1513. t = g_switch_set_all_ctrl(&dm->_globalRelaySampManger, info->ch[i].product_ch_type, info->ch[i].product_ch_addr, flag);
  1514. if(t<0) {
  1515. LOGE("___ %d %s failed\n", info->ch[i].product_ch_addr, (pcmd->cmd==CASCADE_CMD_OPEN)?"open":"close");
  1516. }
  1517. }
  1518. }
  1519. }
  1520. else {
  1521. GlobalPowerManger *tmp=NULL;
  1522. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  1523. {
  1524. if(tmp->product_ch_id==pcmd->chId) {
  1525. t = g_switch_set_all_chn_ctrl(&dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
  1526. break;
  1527. }
  1528. }
  1529. }
  1530. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  1531. sprintf(temp,"$开启$|$所有$|$通道$");
  1532. }
  1533. else {
  1534. sprintf(temp,"$关闭$|$所有$|$通道$");
  1535. }
  1536. dev_insert_alarm_ctrl(dm->db, dm->_globalDevInfo.product.id,ALARM_TYPE_OPRATION,temp);
  1537. free(pcmd);
  1538. pthread_exit(NULL);
  1539. }
  1540. static void* cmd_NF_thread(void *arg)
  1541. {
  1542. int i,t=0;
  1543. char temp[256];
  1544. cascade_handle_t *cas=&casHandle;
  1545. slave_info_t *info=&cas->sInfo;
  1546. GlobalDeviceManager *dm=get_dm();
  1547. cmd_data_t *pcmd=(cmd_data_t*)arg;
  1548. if(dm->upgread_flag)
  1549. {
  1550. free(pcmd);
  1551. pthread_exit(NULL);
  1552. }
  1553. if(pcmd->cmd==CASCADE_CMD_OPEN_NF) {
  1554. LOGD("____ slave CASCADE_CMD_OPEN_NF\n");
  1555. }
  1556. else {
  1557. LOGD("____ slave CASCADE_CMD_CLOSE_NF\n");
  1558. }
  1559. int flag=(pcmd->cmd==CASCADE_CMD_OPEN_NF)?1:0;
  1560. if(pcmd->obj == OBJ_CHANNEL)
  1561. {
  1562. GlobalPowerManger *tmp=NULL;
  1563. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  1564. {
  1565. if(tmp->product_ch_id==pcmd->chId) {
  1566. t = g_switch_set_t_ac_chn_NF_ctrl(&dm->_globalRelaySampManger, tmp->product_saddr, tmp->product_ch_addr, flag);
  1567. break;
  1568. }
  1569. }
  1570. }
  1571. if(pcmd->cmd==CASCADE_CMD_OPEN_NF) {
  1572. sprintf(temp, "$开启$|$通道$|%d Naught wire!", pcmd->chId);
  1573. }
  1574. else {
  1575. sprintf(temp, "$关闭$|$通道$|%d Naught wire!", pcmd->chId);
  1576. }
  1577. dev_insert_alarm_ctrl(dm->db, dm->_globalDevInfo.product.id,ALARM_TYPE_OPRATION,temp);
  1578. free(pcmd);
  1579. pthread_exit(NULL);
  1580. }
  1581. static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
  1582. {
  1583. int r;
  1584. if(cas->inited) {
  1585. mb_deinit(cas);
  1586. }
  1587. cas->mInfo = *info;
  1588. //LOGD("master init modbus: port: %s, type: %d, baud: %d\n", CASCADE_MODBUS_PORT, info->mode, info->baudrate);
  1589. r = mb_init(cas, CASCADE_MODBUS_PORT, info->mode,
  1590. info->addr, info->baudrate);
  1591. if(r!=0) {
  1592. LOGE("cascade modbus init error.\n");
  1593. return -1;
  1594. }
  1595. #if (CHIP_TYPE == CHIP_T113s)
  1596. cas->scanner_flag = 0;
  1597. #endif
  1598. if (cas->mInfo.mode==MODBUS_SLAVE)
  1599. {
  1600. for (size_t i = 1; i < CASCADE_MAX; i++)
  1601. {
  1602. slave_rm(cas,i);
  1603. }
  1604. }
  1605. return 0;
  1606. }
  1607. #include <net/if.h>
  1608. #include <ifaddrs.h>
  1609. static int get_ipaddr(int family, char *iface, char *addr, char *netmask)
  1610. {
  1611. struct ifaddrs *ifap, *ifa;
  1612. if (getifaddrs(&ifap) == -1) {
  1613. LOGE("___getifaddrs() error\n");
  1614. return -1;
  1615. }
  1616. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  1617. if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
  1618. if(family==AF_INET) {
  1619. struct sockaddr_in *sa,*msk;
  1620. sa = (struct sockaddr_in *) ifa->ifa_addr;
  1621. msk = (struct sockaddr_in *) ifa->ifa_netmask;
  1622. if(addr) {
  1623. inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
  1624. printf("___addr: %s\n", addr);
  1625. }
  1626. if(netmask) {
  1627. inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
  1628. //printf("___netmask: %s\n", netmask);
  1629. }
  1630. }
  1631. else {
  1632. struct sockaddr_in6 *sa,*msk;
  1633. sa = (struct sockaddr_in6 *) ifa->ifa_addr;
  1634. msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
  1635. if(addr) {
  1636. inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
  1637. //printf("___addr6: %s\n", addr);
  1638. }
  1639. if(netmask) {
  1640. inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
  1641. //printf("___netmask6: %s\n", netmask);
  1642. }
  1643. }
  1644. }
  1645. }
  1646. freeifaddrs(ifap);
  1647. return 0;
  1648. }
  1649. int cascade_init(void)
  1650. {
  1651. int r=0;
  1652. cascade_handle_t *cas=&casHandle;
  1653. memset(cas, 0, sizeof(casHandle));
  1654. power_init(cas);
  1655. breaker_slave_init();
  1656. slave_init(cas);
  1657. r = pthread_mutex_init(&cas->mutex, NULL);
  1658. if(r) {
  1659. LOGE("___ cascade mutex init failed\n");
  1660. }
  1661. r = pthread_mutex_init(&cas->mutex2, NULL);
  1662. if(r) {
  1663. LOGE("___ cascade mutex2 init failed\n");
  1664. }
  1665. r = pthread_mutex_init(&cas->mutex3, NULL);
  1666. if(r) {
  1667. LOGE("___ cascade mutex3 init failed\n");
  1668. }
  1669. cas->scanAddr = 1;
  1670. cas->map = modbus_mapping_new_start_address(0,0,0,0,
  1671. CASCADE_REG_READ, MAX_READ_REGS2,
  1672. CASCADE_REG_WRITE, MAX_WRITE_REGS2);
  1673. set_modbus(cas, get_mb());
  1674. cascade_slave_init();
  1675. slave_add(cas, 0);
  1676. thread_start(THREAD_ID_CASCADE, cascade_thread, cas);
  1677. thread_start(THREAD_ID_CASCADE_SCAN, cascade_scan_thread, cas);
  1678. GlobalDeviceManager* dm =get_dm();
  1679. NetworkInfo_t net = {0};
  1680. //sys_get_net(&net,IP_V4);
  1681. int family = AF_INET;
  1682. //r = get_ipaddr(family, "eth0", net.ip_address, net.mask);
  1683. uint8_t addr = 0;
  1684. if(!dm->_globalDevInfo.cascade.mode)
  1685. {
  1686. addr = 0XFF;
  1687. }else
  1688. {
  1689. addr = dm->_globalDevInfo.cascade.addr;
  1690. }
  1691. dm->md_tcp = tcp_modbus_init("0.0.0.0",CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product.pwr_type);
  1692. if(dm->md_tcp){
  1693. LOGD("___ TCP Modbus Init sucessful!!!!\n");
  1694. thread_start(THREAD_ID_TCP, tcp_modbus_thread, NULL);
  1695. }
  1696. else
  1697. LOGE("___ TCP Modbus Init Failed!!!!\n");
  1698. return 0;
  1699. }
  1700. int cascade_deinit(void)
  1701. {
  1702. cascade_handle_t *cas=&casHandle;
  1703. thread_stop(THREAD_ID_CASCADE);
  1704. thread_stop(THREAD_ID_CASCADE_SCAN);
  1705. pthread_mutex_destroy(&cas->mutex);
  1706. pthread_mutex_destroy(&cas->mutex2);
  1707. pthread_mutex_destroy(&cas->mutex3);
  1708. modbus_mapping_free(cas->map);
  1709. mb_deinit(cas);
  1710. power_deinit(cas);
  1711. return 0;
  1712. }
  1713. int cascade_set_modbus(ModbusInfo_t *info)
  1714. {
  1715. cascade_handle_t *cas=&casHandle;
  1716. if(!info || info->addr>CASCADE_MAX) {
  1717. return -1;
  1718. }
  1719. return set_modbus(cas, info);
  1720. }
  1721. int cascade_get_dlist(dev_list_t *dl)
  1722. {
  1723. int i,cnt=0;
  1724. slave_t *sl=NULL;
  1725. cascade_handle_t *cas=&casHandle;
  1726. if(!dl) {
  1727. return -1;
  1728. }
  1729. sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
  1730. if(!sl) {
  1731. return -1;
  1732. }
  1733. for(i=0; i<=CASCADE_MAX; i++) {
  1734. if(cas->slaves[i].addr>=0) {
  1735. sl[cnt++] = cas->slaves[i];
  1736. }
  1737. }
  1738. dl->slave = sl;
  1739. dl->cnt = cnt;
  1740. LOGD("____dev cnt: %d\n", cnt);
  1741. return 0;
  1742. }
  1743. /**
  1744. * @brief 释放级联设备列表
  1745. *
  1746. * 释放给定的级联设备列表(dev_list_t)中的 slave 成员所指向的内存。
  1747. *
  1748. * @param dl 级联设备列表指针
  1749. *
  1750. * @return 成功返回 0,失败返回 -1
  1751. */
  1752. int cascade_free_dlist(dev_list_t *dl)
  1753. {
  1754. if(!dl) {
  1755. return -1;
  1756. }
  1757. free(dl->slave);
  1758. return 0;
  1759. }
  1760. /**
  1761. * @brief 级联请求
  1762. *
  1763. * 根据给定的命令数据执行级联请求,并返回执行结果。
  1764. *
  1765. * @param cmd 命令数据指针
  1766. *
  1767. * @return 执行结果,成功返回0,失败返回-1
  1768. */
  1769. int cascade_request(cmd_data_t *cmd)
  1770. {
  1771. int r=0;
  1772. cascade_handle_t *cas=&casHandle;
  1773. if(!cmd) {
  1774. return -1;
  1775. }
  1776. pthread_mutex_lock(&cas->mutex2);
  1777. #if (CHIP_TYPE == CHIP_T113s)
  1778. cas->scanner_flag = 1;
  1779. #endif
  1780. r = master_cmd(cas, cmd);
  1781. #if (CHIP_TYPE == CHIP_T113s)
  1782. cas->scanner_flag = 0;
  1783. #endif
  1784. pthread_mutex_unlock(&cas->mutex2);
  1785. return r;
  1786. }
  1787. int cascade_get_all(_OverAllPwrAckInfo *all)
  1788. {
  1789. return 0;
  1790. }
  1791. int cascade_get_ch(_OverChnPwrAckInfo *ch)
  1792. {
  1793. GlobalPowerManger *tmp=NULL;
  1794. GlobalTreeACManager *tmp3=NULL;
  1795. _OverChnPwrAckInfo *pch=NULL;
  1796. GlobalDeviceManager* dm2=get_dm2();
  1797. list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
  1798. {
  1799. if (tmp->product_ch_type==TREE_AC_TYPE||tmp->product_ch_type==DOUBLE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B){
  1800. int nStatus=-1;//-1则状态不变,0、1则是子状态
  1801. //判断是否三相单输出情况下
  1802. if(tmp->product_ch_type==TREE_AC_TYPE||tmp->product_ch_type==DOUBLE_AC_TYPE||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) {
  1803. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC) {
  1804. if (2 == tmp3->product_ph_outputType &&1==tmp3->product_ph_outputStatus)
  1805. {//单项并且状态为输出
  1806. nStatus = tmp3->_PowerInfo.status;
  1807. }
  1808. }
  1809. }
  1810. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
  1811. {
  1812. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1813. if (pch == NULL) {
  1814. LOGE("pch malloc err.\n");
  1815. return -1;
  1816. }
  1817. pch->product_name = dm2->_globalDevInfo.product.name;
  1818. pch->product_number = dm2->_globalDevInfo.product.number;
  1819. pch->product_id = dm2->_globalDevInfo.product.id;
  1820. pch->productChName = tmp->product_ch_name;
  1821. pch->productChId = tmp->product_ch_id;
  1822. pch->status = tmp->_PowerInfo.status;
  1823. pch->voltage = tmp->_PowerInfo.voltage;
  1824. pch->current = tmp->_PowerInfo.current;
  1825. pch->power = tmp->_PowerInfo.power;
  1826. pch->freq = tmp->_PowerInfo.freq;
  1827. pch->consumption = tmp->_PowerInfo.consumption;
  1828. pch->factor = tmp->_PowerInfo.factor;
  1829. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1830. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1831. pch->product_type=tmp->product_ch_type;
  1832. pch->product_phType = tmp3->product_ph_type;
  1833. pch->ph_voltage = tmp3->_PowerInfo.voltage;
  1834. pch->ph_current = tmp3->_PowerInfo.current;
  1835. pch->ph_power = tmp3->_PowerInfo.power;
  1836. pch->ph_consumption = tmp3->_PowerInfo.consumption;
  1837. pch->ph_outputType = tmp3->product_ph_outputType;
  1838. pch->ph_outputStatus = tmp3->product_ph_outputStatus;
  1839. if ((dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two||dm2->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B) &&
  1840. tmp3->product_ph_outputType == 2 && tmp3->product_ph_outputStatus == 2) // 如果是单项输出并且则非输出通道数据为0
  1841. {
  1842. // 3-1模式 单项状态,不输出则数据为空
  1843. pch->ph_voltage = 0.0;
  1844. pch->ph_current = 0.0;
  1845. pch->ph_power = 0.0;
  1846. pch->ph_consumption = 0.0;
  1847. }
  1848. if (nStatus>=0)
  1849. {
  1850. pch->status = nStatus;
  1851. }else {
  1852. pch->status = tmp->_PowerInfo.status;
  1853. }
  1854. list_add_tail(&pch->list, &ch->list);
  1855. }
  1856. }
  1857. else {
  1858. pch = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
  1859. if (pch == NULL) {
  1860. log_e("_overChnPwrBackInfoTemp malloc err.");
  1861. return -1;
  1862. }
  1863. // 填数据
  1864. pch->product_name = dm2->_globalDevInfo.product.name;
  1865. pch->product_number = dm2->_globalDevInfo.product.number;
  1866. pch->product_id = dm2->_globalDevInfo.product.id;
  1867. pch->productChName = tmp->product_ch_name;
  1868. pch->productChId = tmp->product_ch_id;
  1869. pch->status = tmp->_PowerInfo.status;
  1870. pch->voltage = tmp->_PowerInfo.voltage;
  1871. pch->current = tmp->_PowerInfo.current;
  1872. pch->power = tmp->_PowerInfo.power;
  1873. pch->freq = tmp->_PowerInfo.freq;
  1874. pch->consumption = tmp->_PowerInfo.consumption;
  1875. pch->factor = tmp->_PowerInfo.factor;
  1876. pch->product_ch_start_delay = tmp->product_ch_start_delay;
  1877. pch->product_ch_stop_delay = tmp->product_ch_stop_delay;
  1878. list_add_tail(&pch->list, &ch->list);
  1879. }
  1880. }
  1881. return 0;
  1882. }
  1883. int cascade_lock(void)
  1884. {
  1885. cascade_handle_t *cas=&casHandle;
  1886. return pthread_mutex_lock(&cas->mutex);
  1887. }
  1888. int cascade_unlock(void)
  1889. {
  1890. cascade_handle_t *cas=&casHandle;
  1891. return pthread_mutex_unlock(&cas->mutex);
  1892. }