cascade.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. #include "cascade.h"
  2. #include "mb.h"
  3. #include "lock.h"
  4. #include "list.h"
  5. #include "modbus.h"
  6. #include <rtthread.h>
  7. #include <unistd.h>
  8. #include "pthread.h"
  9. #include "stdio.h"
  10. #include "string.h"
  11. #include "power.h"
  12. #include "paras.h"
  13. #include "thread.h"
  14. #define REGS(x) (((x)+(x)%2)/2)
  15. typedef void * handle_t;
  16. typedef struct {
  17. mb_inst_t *hinst;
  18. uint8_t mode;
  19. uint8_t type;
  20. rt_thread_t tid;
  21. uint8_t quit;
  22. }mb_handle_t;
  23. typedef struct {
  24. union {
  25. md_ac_dc_t ac_dc;
  26. md_3_ac_t ac_3;
  27. }data;
  28. }north_data_t;
  29. typedef struct cascade_saddr{
  30. uint8_t addr;
  31. uint16_t channels;
  32. power_ch_new_t ch[POWER_SLAVE_CH_MAX];
  33. }slave_info_t;
  34. typedef union{
  35. slave_info_t info;
  36. north_data_t north;
  37. }cascade_data_cache;
  38. typedef struct cascade_info{
  39. uint8_t switch_flag;
  40. uint8_t saddr;
  41. uint8_t read_addr;
  42. uint8_t md_type;
  43. uint32_t bund;
  44. uint8_t quit;
  45. lock_t lock;
  46. slave_t slaves[POWER_CASCADE_MAX+1];
  47. cmd_data_t cmd;
  48. cascade_data_cache *chache;
  49. rt_timer_t cascade_timer;
  50. }cascade_handle_t;
  51. static int sendlen=0; //级联读取offset
  52. static cascade_handle_t slave_info = {0}; //自维护全局变量
  53. static mb_cascade_fun_t func = {0}; //匹配mdbus 回调函数
  54. const mb_cb_table_t mb_table = {
  55. .read_disc = mb_port_read_disc, //读离散量输入
  56. .read_coil = mb_port_read_coil, //读线圈
  57. .write_coil = mb_port_write_coil, //写线圈
  58. .read_input = mb_port_read_input, //读输入寄存器
  59. .read_hold = mb_port_read_hold, //读保持寄存器
  60. .write_hold = mb_port_write_hold, //写保持寄存器
  61. };
  62. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd);
  63. static int master_query(cascade_handle_t *cas);
  64. static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth);
  65. static int slave_get_info(cascade_handle_t *cas);
  66. static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cmd);
  67. static void slave_rm(uint8_t addr);
  68. static void memswap(uint8_t *buf, int len);
  69. static void * my_memcpy_byte(void *dst, const void *src, int n);
  70. static uint8_t master_scan(cascade_handle_t *cas);
  71. static int _mb_write(cascade_handle_t *cas, int addr, data_t *d);
  72. static int _mb_read(cascade_handle_t *cas, int addr, data_t *d);
  73. static void* off_on_thread(void *arg); //主机控制从机开关线程
  74. static void memswap(uint8_t *buf, int len)
  75. {
  76. int i;
  77. uint8_t tmp;
  78. for(i=0; i<len; i+=2) {
  79. tmp = buf[i];
  80. buf[i] = buf[i+1];
  81. buf[i+1] = tmp;
  82. }
  83. }
  84. static void slave_rm(uint8_t addr)
  85. {
  86. if(addr > 0 && addr < POWER_SLAVE_CH_MAX)
  87. {
  88. slave_info.slaves[addr].addr = 0;
  89. slave_info.slaves[addr].err = 0;
  90. }
  91. }
  92. static uint8_t master_scan(cascade_handle_t *cas)
  93. {
  94. static uint8_t slave_addr = 1;
  95. if(slave_addr > POWER_CASCADE_MAX)
  96. {
  97. slave_addr = 1;
  98. }
  99. if(cas->slaves[slave_addr].addr == 0)
  100. {
  101. //scan
  102. uint16_t value = 0;
  103. lock_on(cas->lock);
  104. int r = mb_read(MB_ID_CASCADE,slave_addr,CASCADE_REG_SCAN,&value,1,300);
  105. lock_off(cas->lock);
  106. if(r > 0)
  107. {
  108. LOGD("scan slave addr %d !!!\n",slave_addr);
  109. cas->slaves[slave_addr].addr = slave_addr;
  110. cas->slaves[slave_addr].err = 0;
  111. }
  112. }
  113. slave_addr++;
  114. }
  115. static int slave_get_info(cascade_handle_t *cas)
  116. {
  117. slave_info_t *info = &cas->chache->info;
  118. power_handle_new_t *p_handle = power_get_all();
  119. info->channels = p_handle->chs;
  120. for(int i=0; i < info->channels;i++)
  121. {
  122. info->ch[i] = p_handle->pch[i];
  123. }
  124. LOGD("slave will send %d channels to master!!!!\n",info->channels);
  125. return 0;
  126. }
  127. static void *my_memcpy_byte(void *dst, const void *src, int n)
  128. {
  129. if (dst == NULL || src == NULL || n <= 0)
  130. return NULL;
  131. char * pdst = (char *)dst;
  132. char * psrc = (char *)src;
  133. if (pdst > psrc && pdst < psrc + n)
  134. {
  135. pdst = pdst + n - 1;
  136. psrc = psrc + n - 1;
  137. while (n--)
  138. *pdst-- = *psrc--;
  139. }
  140. else
  141. {
  142. while (n--)
  143. *pdst++ = *psrc++;
  144. }
  145. return dst;
  146. }
  147. static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
  148. {
  149. cmd_data_t *cmd=NULL;
  150. pthread_t id = 0;
  151. power_handle_new_t *p_handle = power_get_all();
  152. switch (reg)
  153. {
  154. case CASCADE_REG_SCAN:
  155. break;
  156. case CASCADE_REG_WRITE:
  157. {
  158. cmd = (cmd_data_t*)(r_w_data);
  159. if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
  160. //slave_info.cmd = *cmd;
  161. memcpy(&slave_info.cmd,r_w_data,sizeof(cmd_data_t));
  162. sendlen = slave_info.cmd.c_m.sendlen_offset;
  163. }
  164. //LOGD("____write_____ %d\n",lenth);
  165. // sendlen = 0;
  166. switch(cmd->cmd)
  167. {
  168. case CASCADE_CMD_OPEN:
  169. case CASCADE_CMD_CLOSE:
  170. {
  171. cmd_data_t *pcmd=malloc(sizeof(cmd_data_t));
  172. if(pcmd) {
  173. *pcmd = *cmd;
  174. pthread_create(&id,NULL,off_on_thread,pcmd);
  175. pthread_detach(id);
  176. }
  177. }
  178. break;
  179. case CASCADE_CMD_OPEN_NF:
  180. case CASCADE_CMD_CLOSE_NF:
  181. {
  182. }
  183. break;
  184. case CASCADE_CMD_SAVE:
  185. case CASCADE_CMD_SAVE3:
  186. {
  187. }
  188. break;
  189. case CASCADE_CMD_BREAKER_SAVE_ADD:
  190. {
  191. }
  192. break;
  193. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  194. {
  195. }
  196. break;
  197. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  198. {
  199. }
  200. break;
  201. }
  202. }
  203. break;
  204. case CASCADE_REG_READ:
  205. {
  206. cmd = &slave_info.cmd;
  207. switch(cmd->cmd)
  208. {
  209. case CASCADE_CMD_GET_INFO:
  210. {
  211. uint8_t * base_addr = (uint8_t *)&p_handle->pch[0];
  212. //my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
  213. memcpy(r_w_data,base_addr+sendlen,lenth*2);
  214. memswap(r_w_data,lenth*2);
  215. LOGD("____read_____ readlen = %d,sendlen = %d power_ch_t size=%d\n",lenth,sendlen,sizeof(power_ch_t));
  216. }
  217. break;
  218. case CASCADE_CMD_QUERY_CH:
  219. {
  220. uint8_t * base_addr = (uint8_t *)&p_handle->pch[0];
  221. my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
  222. memswap(r_w_data,lenth*2);
  223. }
  224. break;
  225. case CASCADE_CMD_BREAKER_QUERY:
  226. break;
  227. case CASCADE_CMD_QUERY_VOL:break;
  228. case CASCADE_CMD_QUERY_CUR:break;
  229. case CASCADE_CMD_QUERY_PWR:break;
  230. case CASCADE_CMD_QUERY_PWRQ:break;
  231. case CASCADE_CMD_QUERY_HIS:break;
  232. case CASCADE_CMD_QUERY_TOTAL:break;
  233. case CASCADE_CMD_QUERY_TOTAL_PWR:break;
  234. case CASCADE_CMD_BREAKER_GET_INFO:break;
  235. }
  236. //sendlen += lenth*2;
  237. }
  238. break;
  239. default:
  240. {
  241. }
  242. break;
  243. }
  244. }
  245. static int _mb_write(cascade_handle_t *cas, int addr, data_t *d)
  246. {
  247. int i = 0,r=0,timeout=0;
  248. int wl,xlen,wlen=0,oncelen=250;
  249. uint8_t retry = 5;
  250. uint8_t buff[MB_BUF_SIZE+100];
  251. if(d->dlen<=0) {
  252. return -1;
  253. }
  254. lock_on(cas->lock);
  255. for(;i < retry;i++)
  256. {
  257. while(1)
  258. {
  259. if(wlen+oncelen>d->dlen) {
  260. xlen = d->dlen-wlen;
  261. } else
  262. {
  263. xlen = oncelen;
  264. }
  265. xlen += xlen%2;
  266. memcpy(buff, d->data+wlen, xlen);
  267. //交换数据
  268. memswap(buff,xlen%2+xlen);
  269. wl = mb_write(MB_ID_CASCADE, addr, CASCADE_REG_WRITE, (uint16_t*)buff, xlen/2);
  270. if(wl<=0) {
  271. LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d errno = %d \n", addr, CASCADE_REG_WRITE, xlen/2,"write failed",i+1,wl);
  272. if(addr >0 && addr < POWER_SLAVE_CH_MAX)
  273. {
  274. slave_info.slaves[addr].err ++;
  275. if(slave_info.slaves[addr].err > 5)
  276. {
  277. slave_rm(addr);
  278. }
  279. }
  280. r = -1;
  281. break;
  282. }else
  283. {
  284. slave_info.slaves[addr].err = 0;
  285. r = 0;
  286. }
  287. if(wlen+wl*2>=d->dlen) {
  288. break;
  289. }else {
  290. xlen = wl*2;
  291. }
  292. wlen += xlen;
  293. }
  294. if(r == 0)
  295. break;
  296. }
  297. lock_off(cas->lock);
  298. return r;
  299. }
  300. static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
  301. {
  302. int i=0,r=0,finish=0,timeout=0;
  303. int rl,xlen,rlen=0,oncelen=250;
  304. uint8_t retry = 5;
  305. uint16_t buff[MB_BUF_SIZE];
  306. if(d->dlen<=0) {
  307. return -1;
  308. }
  309. lock_on(cas->lock);
  310. for(i =0;i < retry;i++)
  311. {
  312. while(1) {
  313. if(rlen+oncelen>d->dlen) {
  314. xlen = d->dlen-rlen;
  315. }else{
  316. xlen = oncelen;
  317. }
  318. xlen += xlen%2;
  319. rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,100);
  320. if(rl<=0) {
  321. LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, i+1);
  322. if(addr >0 && addr < POWER_SLAVE_CH_MAX)
  323. {
  324. cas->slaves[addr].err ++;
  325. if(cas->slaves[addr].err > 5)
  326. {
  327. slave_rm(addr);
  328. }
  329. }
  330. r = -1; break;
  331. }else
  332. {
  333. cas->slaves[addr].err =0;
  334. }
  335. if(rlen+rl*2>=d->dlen) {
  336. xlen = d->dlen-rlen;
  337. finish = 1;
  338. }else
  339. {
  340. xlen = rl*2;
  341. }
  342. memcpy((char*)d->data+rlen, buff, xlen);
  343. rlen += xlen;
  344. if(finish) {
  345. r = 0;
  346. break;
  347. }
  348. }
  349. if(r==0)
  350. break;
  351. }
  352. lock_off(cas->lock);
  353. return r;
  354. }
  355. static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  356. {
  357. int r =0;
  358. r = _mb_write(cas, addr,wd);
  359. if(r==0) {
  360. r = _mb_read(cas, addr,rd);
  361. }
  362. return r;
  363. }
  364. static int mb_write_read_n(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
  365. {
  366. int i=0,r=0,finish=0,timeout=0;
  367. int rl,xlen,rlen=0,oncelen=250;
  368. uint16_t buff[MB_BUF_SIZE];
  369. while(1) {
  370. //set sendlen = rlen;
  371. cas->cmd.c_m.sendlen_offset = rlen;
  372. wd->dlen = sizeof(cmd_data_t);
  373. wd->data = (uint8_t*)&(cas->cmd);
  374. r = _mb_write(cas, addr,wd);
  375. //set need transport len
  376. if(rlen+oncelen>rd->dlen) {
  377. xlen = rd->dlen-rlen;
  378. }else{
  379. xlen = oncelen;
  380. }
  381. xlen += xlen%2;
  382. lock_on(cas->lock);
  383. while(1)
  384. {
  385. rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,200);
  386. if(rl<=0) {
  387. if(addr >0 && addr < POWER_SLAVE_CH_MAX) {
  388. cas->slaves[addr].err ++;
  389. LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d ernno=%d\n", "read error", rlen, cas->slaves[addr].err,rl);
  390. if(cas->slaves[addr].err > 5) {
  391. slave_rm(addr);
  392. lock_off(cas->lock);
  393. goto fail;
  394. }
  395. }else {
  396. lock_off(cas->lock);
  397. goto fail;
  398. }
  399. }else {
  400. cas->slaves[addr].err =0;
  401. break;
  402. }
  403. }
  404. lock_off(cas->lock);
  405. if(rlen+rl*2>=rd->dlen) {
  406. xlen = rd->dlen-rlen;
  407. finish = 1;
  408. }else {
  409. xlen = rl*2;
  410. }
  411. memcpy((char*)rd->data+rlen, buff, xlen);
  412. rlen += xlen;
  413. if(finish) {
  414. r = 0;
  415. break;
  416. }
  417. }
  418. fail:
  419. return r;
  420. }
  421. static void* off_on_thread(void *arg)
  422. {
  423. cascade_handle_t *cas=&slave_info;
  424. cmd_data_t *pcmd=(cmd_data_t*)arg;
  425. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  426. // LOGD("____ slave CASCADE_CMD_OPEN\n");
  427. }
  428. else {
  429. // LOGD("____ slave CASCADE_CMD_CLOSE\n");
  430. }
  431. int flag=((pcmd->cmd==CASCADE_CMD_OPEN)?1:0);
  432. if(pcmd->chId == 0xff) {
  433. // all
  434. }else
  435. {
  436. //one
  437. }
  438. if(pcmd->cmd==CASCADE_CMD_OPEN) {
  439. // sprintf(temp,"$开启$|$所有$|$通道$");
  440. }
  441. else {
  442. // sprintf(temp,"$关闭$|$所有$|$通道$");
  443. }
  444. //data base
  445. free(pcmd);
  446. pthread_exit(NULL);
  447. }
  448. static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cmd)
  449. {
  450. int i,r;
  451. data_t rdata,wdata;
  452. if(cur_dev_addr==0) {
  453. return -1;
  454. }
  455. switch(cmd->cmd) {
  456. case CASCADE_CMD_OPEN:
  457. case CASCADE_CMD_CLOSE:
  458. case CASCADE_CMD_SAVE:
  459. case CASCADE_CMD_SAVE3:
  460. case CASCADE_CMD_OPEN_NF:
  461. case CASCADE_CMD_CLOSE_NF:
  462. {
  463. LOGD("____ master CMD: %d\n", cmd->cmd);
  464. wdata.dlen = sizeof(cmd_data_t);
  465. wdata.data = (uint8_t*)cmd;
  466. r = _mb_write(cas, cur_dev_addr, &wdata);
  467. }
  468. break;
  469. case CASCADE_CMD_GET_INFO:
  470. {
  471. wdata.dlen = sizeof(cmd_data_t);
  472. wdata.data = (uint8_t*)cmd;
  473. // rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*POWER_SLAVE_CH_MAX;
  474. // rdata.data = (uint8_t*)cas->info;
  475. uint16_t value = 0;
  476. r = mb_read(MB_ID_CASCADE,cur_dev_addr,4000,&value,1,100);//获取通道数
  477. //r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  478. LOGD("r = %d value=%d\n",r,value);
  479. if(r == 1)
  480. {
  481. uint8_t chanels = value & 0xff;
  482. if(chanels == 0 || chanels > 100)
  483. {
  484. cas->chache->info.channels = 0;
  485. LOGD("get slave channels %d!!!\n",chanels);
  486. }else
  487. {
  488. if(chanels >= POWER_SLAVE_CH_MAX)
  489. chanels = POWER_SLAVE_CH_MAX;
  490. cas->chache->info.channels = chanels;
  491. //rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
  492. rdata.dlen = sizeof(power_ch_t)*cas->chache->info.channels;
  493. rdata.data = (uint8_t*)&(cas->chache->info.ch);
  494. r = mb_write_read_n(cas, cur_dev_addr, &wdata, &rdata);
  495. if(r==0) {
  496. }else
  497. {
  498. LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
  499. }
  500. }
  501. }
  502. // if(r==0) {
  503. // rdata.dlen = sizeof(slave_info_t)-sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
  504. // rdata.data = (uint8_t*)&cas->info;
  505. // r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
  506. // if(r==0) {
  507. // }else
  508. // {
  509. // LOGE("_____ master CASCADE_CMD_GET_INFO read failed\n");
  510. // }
  511. // }
  512. // else {
  513. // LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
  514. // }
  515. }
  516. break;
  517. case CASCADE_CMD_BREAKER_GET_INFO:
  518. {
  519. }
  520. break;
  521. case CASCADE_CMD_BREAKER_SAVE_UPDATE:
  522. case CASCADE_CMD_BREAKER_SAVE_DELETE:
  523. case CASCADE_CMD_BREAKER_SAVE_ADD:
  524. {
  525. }
  526. break;
  527. default:
  528. cas->cmd = *cmd;
  529. r = 0;
  530. }
  531. return r;
  532. }
  533. static void timer1_callback(void *parameter)
  534. {
  535. #if 0
  536. timer1_cnt++;
  537. rt_kprintf("timer1 callback execute %d times\n", timer1_cnt);
  538. /* 执行5次后,将自身周期修改为250ms */
  539. if (timer1_cnt == 5) {
  540. rt_kprintf("timer1 change period to 250ms.\n");
  541. rt_timer_control(timer1, RT_TIMER_CTRL_SET_TIME, (void *)250);
  542. }
  543. #endif
  544. }
  545. uint8_t cascade_init(void)
  546. {
  547. paras_data_t* p_d = paras_get();
  548. memset(&slave_info,0,sizeof(slave_info));
  549. slave_info.quit = 1;
  550. slave_info.lock = lock_init();
  551. slave_info.md_type = p_d->cas.mode;
  552. slave_info.chache = (cascade_data_cache *) malloc(sizeof(cascade_data_cache));
  553. if(slave_info.chache == NULL)
  554. {
  555. lock_deinit(slave_info.lock);
  556. return -1;
  557. }
  558. //slave_info.cascade_timer = rt_timer_create("cascade_timer",timer1_callback,RT_NULL,10,RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_HARD_TIMER);
  559. LOGD("__casecde__malloc size if cascade %d\n",sizeof(cascade_data_cache));
  560. if(p_d->cas.mode == MB_MODE_SLAVE)
  561. {
  562. mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
  563. mb_set_cb(MB_ID_CASCADE, &mb_table);
  564. func.slave_func = slave_func;
  565. mb_set_cascade_cb(MB_ID_CASCADE,&func);
  566. memset(&slave_info.chache->north,0,sizeof(north_data_t));
  567. //rt_timer_start(slave_info.cascade_timer);
  568. }else if(p_d->cas.mode == MB_MODE_MASTER)
  569. {
  570. memset(&slave_info.chache->info,0,sizeof(slave_info_t));
  571. }else
  572. {
  573. LOGE("cascede mode type is err ____ %d!!!\n",p_d->cas.mode);
  574. free(slave_info.chache);
  575. slave_info.chache = 0;
  576. return -1;
  577. }
  578. slave_info.quit = 0;
  579. slave_info.read_addr = 1;
  580. LOGD("scan thread!!!\n");
  581. thread_start(THREAD_ID_CAS_SCAN,cascade_scan_thread,NULL);
  582. sleep(1);
  583. LOGD("cascade thread!!!\n");
  584. thread_start(THREAD_ID_CAS_TH,cascade_thread,NULL);
  585. return 0;
  586. }
  587. void cascade_reset_new(uint8_t mode,uint8_t addr,uint32_t baund)
  588. {
  589. slave_info.switch_flag = 1;
  590. paras_data_t* p_d = paras_get();
  591. if(baund != p_d->cas.baud)
  592. {
  593. mb_deinit_n(MB_ID_CASCADE);
  594. mb_para_t m_para = {0};
  595. m_para.type = MB_TYPE_RTU;
  596. m_para.para.rtu.baudrate = baund;
  597. m_para.para.rtu.dev = CASCADE_PORT;
  598. m_para.para.rtu.parity = 0;
  599. m_para.para.rtu.pin = -1;
  600. m_para.para.rtu.lvl = 0;
  601. mb_init_n(MB_ID_CASCADE,&m_para);
  602. }
  603. if(mode != slave_info.md_type)
  604. {
  605. if(mode == MB_MODE_MASTER)
  606. {
  607. slave_info.md_type = MB_MODE_MASTER;
  608. memset(&slave_info.chache->info,0,sizeof(slave_info_t));
  609. //rt_timer_stop(slave_info.cascade_timer);
  610. }else
  611. {
  612. slave_info.md_type = MB_MODE_SLAVE;
  613. mb_set_addr(MB_ID_CASCADE,addr);
  614. mb_set_cb(MB_ID_CASCADE, &mb_table);
  615. func.slave_func = slave_func;
  616. mb_set_cascade_cb(MB_ID_CASCADE,&func);
  617. memset(&slave_info.chache->north,0,sizeof(north_data_t));
  618. //rt_timer_start(slave_info.cascade_timer);
  619. }
  620. }else
  621. {
  622. if(mode == MB_MODE_SLAVE)
  623. {
  624. if(addr != p_d->cas.addr)
  625. {
  626. mb_set_addr(MB_ID_CASCADE,addr);
  627. }
  628. }
  629. }
  630. p_d->cas.addr = addr;
  631. p_d->cas.baud = baund;
  632. p_d->cas.mode = mode;
  633. paras_save();
  634. slave_info.switch_flag = 0;
  635. }
  636. void cascade_reset(uint8_t mode,uint8_t addr)
  637. {
  638. slave_info.switch_flag = 1;
  639. paras_data_t* p_d = paras_get();
  640. if((p_d->cas.mode == MB_MODE_MASTER) && (slave_info.md_type != MB_MODE_MASTER))
  641. {
  642. slave_info.md_type = MB_MODE_MASTER;
  643. memset(&slave_info.chache->info,0,sizeof(slave_info_t));
  644. }else if((p_d->cas.mode == MB_MODE_SLAVE) && (slave_info.md_type != MB_MODE_SLAVE))
  645. {
  646. slave_info.md_type = MB_MODE_SLAVE;
  647. mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
  648. mb_set_cb(MB_ID_CASCADE, &mb_table);
  649. func.slave_func = slave_func;
  650. mb_set_cascade_cb(MB_ID_CASCADE,&func);
  651. memset(&slave_info.chache->north,0,sizeof(north_data_t));
  652. }else if(p_d->cas.mode == MB_MODE_SLAVE)
  653. {
  654. mb_set_addr(MB_ID_CASCADE,p_d->cas.addr);
  655. }else
  656. {
  657. return ;
  658. }
  659. paras_save();
  660. slave_info.switch_flag = 0;
  661. }
  662. void cascade_scan_thread(void *arg)
  663. {
  664. while(slave_info.quit == 0)
  665. {
  666. if(slave_info.switch_flag)
  667. {
  668. sleep(1);
  669. continue;
  670. }
  671. if(slave_info.md_type == MB_MODE_MASTER)
  672. {
  673. master_scan(&slave_info);
  674. sleep(1);
  675. }else //做从机//拷贝数据到北向
  676. {
  677. paras_data_t* p_data = paras_get();
  678. power_handle_new_t *all = power_get_all();
  679. if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
  680. {
  681. int channels = all->chs;
  682. slave_info.chache->north.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | channels);
  683. int cnt = all->chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
  684. //电量信息
  685. for(int i = 0; i < cnt;i++)
  686. {
  687. slave_info.chache->north.data.ac_dc.power[i].voltage = all->pch[i].power[0].voltage *1000;
  688. slave_info.chache->north.data.ac_dc.power[i].current = all->pch[i].power[0].current *1000;
  689. slave_info.chache->north.data.ac_dc.power[i].power = all->pch[i].power[0].power *1000;
  690. slave_info.chache->north.data.ac_dc.power[i].consumer = all->pch[i].power[0].consump *1000;
  691. slave_info.chache->north.data.ac_dc.power[i].factor = all->pch[i].power[0].factor *1000;
  692. slave_info.chache->north.data.ac_dc.power[i].freq = all->pch[i].power[0].freq *1000;
  693. }
  694. //总信息
  695. //slave_info.chache->north.data.ac_dc.power_all. = all.ttl.total;
  696. slave_info.chache->north.data.ac_dc.power_all.all_consumer = all->total.all.consump *1000;
  697. slave_info.chache->north.data.ac_dc.power_all.all_current = all->total.all.current *1000;
  698. slave_info.chache->north.data.ac_dc.power_all.all_power = all->total.all.power *1000;
  699. slave_info.chache->north.data.ac_dc.power_all.all_voltage = all->total.all.voltage *1000;
  700. //温湿度
  701. slave_info.chache->north.data.ac_dc.temp = 0; //后续加上传感器数据
  702. slave_info.chache->north.data.ac_dc.humity = 0;
  703. for(int i = 0; i < cnt;i++)
  704. slave_info.chache->north.data.ac_dc.switch_stu[i] = 0;
  705. for(int i = 0; i < cnt;i++)
  706. {
  707. slave_info.chache->north.data.ac_dc.delay_open[i] = all->pch[i].info.open_delay;
  708. }
  709. for(int i = 0; i < cnt;i++)
  710. {
  711. slave_info.chache->north.data.ac_dc.delay_close[i] = all->pch[i].info.close_delay;
  712. }
  713. }else
  714. {
  715. int channels = all->chs > 0 ? all->chs: 0;
  716. slave_info.chache->north.data.ac_3.dev_cnt = (p_data->prod.type << 8 | channels);
  717. for(int i = A_P; i <= C_P;i++)
  718. {
  719. slave_info.chache->north.data.ac_3.ac_3_all_pw[i].consumer = all->total.all_l[i].consump *1000;
  720. slave_info.chache->north.data.ac_3.ac_3_all_pw[i].current = all->total.all_l[i].current *1000;
  721. slave_info.chache->north.data.ac_3.ac_3_all_pw[i].power = all->total.all_l[i].power *1000;
  722. slave_info.chache->north.data.ac_3.ac_3_all_pw[i].voltage = all->total.all_l[i].voltage *1000;
  723. }
  724. int cnt = all->chs > POWER_SLAVE_CH_MAX ? POWER_SLAVE_CH_MAX : channels;
  725. for(int i = 0; i < cnt;i++)
  726. {
  727. //总体信息
  728. }
  729. for(int i = 0; i < cnt;i++)
  730. {
  731. for(int j = A_P; j <= C_P;j++)
  732. {
  733. slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_consumer = all->pch[i].power[j].consump * 1000;
  734. slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_current = all->pch[i].power[j].current * 1000;
  735. slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_power = all->pch[i].power[j].power * 1000;
  736. slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_voltage = all->pch[i].power[j].voltage * 1000;
  737. slave_info.chache->north.data.ac_3.ac_3_chn_p[i][j].p_status = all->pch[i].info.status;
  738. }
  739. }
  740. for(int i = 0; i < cnt;i++)
  741. {
  742. slave_info.chache->north.data.ac_3.delay_open[i] = all->pch[i].info.open_delay;
  743. }
  744. for(int i = 0; i < cnt;i++)
  745. {
  746. slave_info.chache->north.data.ac_3.delay_close[i] = all->pch[i].info.close_delay;
  747. }
  748. }
  749. //LOGD("cpy data to north user\n");
  750. //slave_get_info(&slave_info);
  751. }
  752. sleep(1);
  753. }
  754. }
  755. void cascade_thread(void *arg)
  756. {
  757. LOGD("__ cascade %s\n", (slave_info.md_type==MB_MODE_MASTER)?"master":"slave");
  758. while(slave_info.quit==0) {
  759. if(slave_info.switch_flag)
  760. {
  761. sleep(1);
  762. continue;
  763. }
  764. if(slave_info.md_type==MB_MODE_MASTER) { //主模
  765. cmd_data_t cmd;
  766. cmd.cmd = CASCADE_CMD_GET_INFO;
  767. cmd.obj = OBJ_OVERALL;
  768. slave_info.cmd = cmd;
  769. master_cmd(&slave_info,slave_info.read_addr,&cmd);
  770. sleep(1);
  771. }
  772. else { //从模式,等待主设备发起数据请求
  773. mb_slave_poll(MB_ID_CASCADE);
  774. }
  775. }
  776. pthread_exit(NULL);
  777. }
  778. int cascade_request(cmd_data_t *cmd)
  779. {
  780. master_cmd(&slave_info,1,cmd);
  781. return 0;
  782. }
  783. int mb_port_read_disc(u16 addr, u8 *pbit)//读离散量输入, 返回 : 0-成功, -2-地址错误
  784. {
  785. MB_ASSERT(pbit != NULL);
  786. return(-2);
  787. }
  788. int mb_port_read_coil(u16 addr, u8 *pbit)//读线圈, 返回 : 0-成功, -2-地址错误
  789. {
  790. MB_ASSERT(pbit != NULL);
  791. return(-2);
  792. }
  793. int mb_port_write_coil(u16 addr, u8 bit)//写线圈, 返回 : 0-成功, -2-地址错误, -4-设备故障
  794. {
  795. return(-2);
  796. }
  797. int mb_port_read_input(u16 addr, u16 *preg)//读输入寄存器, 返回 : 0-成功, -2-地址错误
  798. {
  799. MB_ASSERT(preg != NULL);
  800. return(-2);
  801. }
  802. int mb_port_read_hold(u16 addr, u16 *preg)//读保持寄存器, 返回 : 0-成功, -2-地址错误
  803. {
  804. MB_ASSERT(preg != NULL);
  805. uint16_t *data = NULL;
  806. if( AC_DC_DEV_CHN_REG <= addr && addr <= AC_DC_DRY_REG)
  807. {
  808. data = (uint16_t*)(&slave_info.chache->north.data.ac_dc);
  809. uint32_t offset = addr - AC_DC_DEV_CHN_REG;
  810. *preg = *(data+offset);
  811. return 0;
  812. }
  813. if(AC_3_DEV_CHN_REG <= addr && addr <= AC_3_DRY_REG)
  814. {
  815. data = (uint16_t*)(&slave_info.chache->north.data.ac_3);
  816. uint32_t offset = addr - AC_3_DEV_CHN_REG;
  817. *preg = *(data+offset);
  818. return 0;
  819. }
  820. return(-2);
  821. }
  822. int mb_port_write_hold(u16 addr, u16 reg)//写保持寄存器, 返回 : 0-成功, -2-地址错误, -3-值非法, -4-设备故障
  823. {
  824. power_handle_new_t *power = power_get_all();
  825. power_ch_new_t * pch = NULL;
  826. if(AC_DC_SET_DELAY_OPEN <= addr && addr <= AC_DC_ALL_SET_SWITCH_REG)
  827. {
  828. switch(addr)
  829. {
  830. case AC_DC_SET_DELAY_OPEN ... (AC_DC_SET_DELAY_CLOSE-1):
  831. {
  832. uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
  833. if(channel < power->chs)
  834. {
  835. pch = &power->pch[channel];
  836. uint16_t reg_close = power->pch[channel].info.close_delay;
  837. power->set_delay(pch->info.addr,pch->info.sch,reg,reg_close);
  838. }
  839. }
  840. break;
  841. case AC_DC_SET_DELAY_CLOSE ...(AC_DC_CHN_SET_SWITCH_STA_REG - 1):
  842. {
  843. uint16_t channel = addr - AC_DC_SET_DELAY_CLOSE;
  844. if(channel < power->chs)
  845. {
  846. pch = &power->pch[channel];
  847. uint16_t reg_open = power->pch[channel].info.open_delay;
  848. power->set_delay(power->pch[channel].info.addr,power->pch[channel].info.sch,reg_open,reg);
  849. }
  850. }
  851. break;
  852. case AC_DC_CHN_SET_SWITCH_STA_REG ... (AC_DC_ALL_SET_SWITCH_REG-1):
  853. {
  854. uint16_t channel = addr - AC_DC_CHN_SET_SWITCH_STA_REG;
  855. if(channel < power->chs)
  856. {
  857. pch = &power->pch[channel];
  858. power->set_status(pch->info.addr,pch->info.sch,reg);
  859. }
  860. }
  861. break;
  862. case AC_DC_ALL_SET_SWITCH_REG:
  863. {
  864. power->set_all_status(reg);
  865. }
  866. break;
  867. }
  868. return 0;
  869. }
  870. if(AC_3_SET_DELAY_OPEN <= addr && addr <= AC_3_ALL_SET_SWITCH_REG )
  871. {
  872. switch(addr)
  873. {
  874. case AC_3_SET_DELAY_OPEN ... (AC_3_SET_DELAY_CLOSE-1):
  875. {
  876. uint16_t channel = addr - AC_DC_SET_DELAY_OPEN;
  877. if(channel < power->chs)
  878. {
  879. pch = &power->pch[channel];
  880. uint16_t reg_close = power->pch[channel].info.close_delay;
  881. power->set_delay(pch->info.addr,pch->info.sch,reg,reg_close);
  882. }
  883. }
  884. break;
  885. case AC_3_SET_DELAY_CLOSE ... (AC_3_CHN_SET_SWITCH_STA_REG-1):
  886. {
  887. uint16_t channel = addr - AC_DC_SET_DELAY_CLOSE;
  888. if(channel < power->chs)
  889. {
  890. pch = &power->pch[channel];
  891. uint16_t reg_open = power->pch[channel].info.open_delay;
  892. power->set_delay(power->pch[channel].info.addr,power->pch[channel].info.sch,reg_open,reg);
  893. }
  894. }
  895. break;
  896. case AC_3_CHN_SET_SWITCH_STA_REG ... (AC_3_ALL_SET_SWITCH_REG -1):
  897. {
  898. uint16_t channel = addr - AC_DC_CHN_SET_SWITCH_STA_REG;
  899. if(channel < power->chs)
  900. {
  901. pch = &power->pch[channel];
  902. power->set_status(pch->info.addr,pch->info.sch,reg);
  903. }
  904. }
  905. break;
  906. case AC_3_ALL_SET_SWITCH_REG:
  907. {
  908. power->set_all_status(reg);
  909. }
  910. break;
  911. }
  912. }
  913. return(-2);
  914. }
  915. uint8_t cascade_read_slave(uint8_t addr)
  916. {
  917. memset(&slave_info.chache->info,0,sizeof(slave_info_t));
  918. slave_info.read_addr = addr;
  919. }
  920. int cascade_get_dlist(dev_list_t *dl)
  921. {
  922. int i,cnt=0;
  923. slave_t *sl=NULL;
  924. if(!dl) {
  925. return -1;
  926. }
  927. sl = (slave_t*)malloc(sizeof(slave_t)*(POWER_CASCADE_MAX+1));
  928. if(!sl) {
  929. return -1;
  930. }
  931. for(i=0; i<=POWER_CASCADE_MAX; i++) {
  932. if(slave_info.slaves[i].addr>=0) {
  933. sl[cnt++] = slave_info.slaves[i];
  934. }
  935. }
  936. dl->slave = sl;
  937. dl->cnt = cnt;
  938. LOGD("____dev cnt: %d\n", cnt);
  939. }
  940. int cascade_free_dlist(dev_list_t *dl)
  941. {
  942. if(!dl) {
  943. return -1;
  944. }
  945. free(dl->slave);
  946. return 0;
  947. }
  948. int cascade_lock(int flag)
  949. {
  950. cascade_handle_t *h=&slave_info;
  951. if(flag) {
  952. lock_on(h->lock);
  953. }
  954. else {
  955. lock_off(h->lock);
  956. }
  957. return 0;
  958. }