cascade.c 58 KB

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