cascade.c 59 KB

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