power.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  1. #include "mb.h"
  2. #include "cfg.h"
  3. #include "web.h"
  4. #include "list.h"
  5. #include "paras.h"
  6. #include "power.h"
  7. #include "thread.h"
  8. #include "datadef.h"
  9. #include "wanning.h"
  10. #include "beep.h"
  11. #include "time.h"
  12. #include "snmp.h"
  13. #include "led.h"
  14. #include "math.h"
  15. #define SECOND_MIL 20
  16. enum
  17. {
  18. STR_POWER_ID_OVER,
  19. STR_POWER_ID_LOW,
  20. STR_POWER_ID_MAXS,
  21. STR_POWER_ID_MIN,
  22. STR_POWER_ID_VOL,
  23. STR_POWER_ID_CUR,
  24. STR_POWER_ID_POWER,
  25. STR_POWER_ID_CONSUMER,
  26. STR_POWER_ID_MAX
  27. };
  28. enum{
  29. CTRL_3_3 = 8,
  30. CTRL_3_2,
  31. };
  32. const char *lang_power_str[2][STR_POWER_ID_MAX]={
  33. {
  34. "超过",
  35. "低于",
  36. "最大",
  37. "最小",
  38. "电压",
  39. "电流",
  40. "功率",
  41. "耗电量",
  42. },
  43. {
  44. "over",
  45. "below",
  46. "max",
  47. "min",
  48. "voltage",
  49. "current",
  50. "power",
  51. "consumer",
  52. },
  53. };
  54. enum
  55. {
  56. STR_LOSE_ID,
  57. STR_LOSE_MAX,
  58. };
  59. const char *lang_lose_string[2][STR_LOSE_MAX]={
  60. {
  61. "缺相",
  62. },
  63. {
  64. "phase lose"
  65. },
  66. };
  67. extern AlarmTrapinfo data;
  68. #define LIMIT_HOF(x) (x*1.1f)
  69. #define LIMIT_LOF(x) (x*0.9f)
  70. static power_handle_new_t pwr_Handle ={0};
  71. static int write_reg(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt);
  72. static int read_reg(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  73. {
  74. (void)(h);
  75. int i,r=0;
  76. for(i=0; i<POWER_RETRY_TIMES; i++) {
  77. r = mb_read(MB_ID_POWER, addr, reg, data, cnt, POWER_BOARD_TIMEOUT);
  78. if(r==cnt) {
  79. break;
  80. }
  81. }
  82. return (r==cnt)?0:-1;
  83. }
  84. static int write_reg(void *h, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  85. {
  86. (void)(h);
  87. int i,r=0;
  88. for(i=0; i<POWER_RETRY_TIMES; i++) {
  89. r = mb_write(MB_ID_POWER, addr, reg, data, cnt);
  90. if(r==cnt) break;
  91. }
  92. return (r==cnt)?0:-1;
  93. }
  94. static int total_proc(power_handle_new_t *h)
  95. {
  96. power_t tmp[3]={0};
  97. power_t tmp_all = {0};
  98. lock_on(h->lck);
  99. if(h->product->type==PDU_AC_I3O1 || h->product->type==PDU_AC_I3O1_H)
  100. {
  101. for(int i = 0; i < h->chs;i++)
  102. {
  103. int k = h->pch[i].info.pse.ph - 1;
  104. tmp[k].consump += h->pch[i].power[k].consump;
  105. tmp[k].voltage = (tmp[k].voltage > h->pch[i].power[k].voltage ) ? tmp[k].voltage : h->pch[i].power[k].voltage;
  106. tmp[k].current += ( h->pch[i].power[k].current);
  107. tmp[k].power += h->pch[i].power[k].power;
  108. tmp[k].reactive_power += h->pch[i].power[k].reactive_power;
  109. tmp[k].app_power += h->pch[i].power[k].app_power;
  110. }
  111. for(int i = 0 ; i < 3;++i)
  112. {
  113. tmp[i].factor = tmp[i].app_power > 0 ?(tmp[i].power /tmp[i].app_power) : 0.0;
  114. h->total.all_l[i] = tmp[i];
  115. tmp_all.consump += tmp[i].consump;
  116. tmp_all.voltage = tmp_all.voltage > tmp[i].voltage ? tmp_all.voltage: tmp[i].voltage;
  117. tmp_all.current += tmp[i].current;
  118. tmp_all.power += tmp[i].power;
  119. tmp_all.reactive_power += tmp[i].reactive_power;
  120. tmp_all.app_power += tmp[i].app_power;
  121. }
  122. tmp_all.factor = tmp_all.app_power > 0 ? (tmp_all.power / tmp_all.app_power) : 0.0;
  123. }else if(h->product->type==PDU_AC_I3O3)
  124. {
  125. for(int i = 0 ;i < h->chs;i++)
  126. {
  127. float chn_total_p = 0.0;
  128. for(int k=0; k<3; k++) {
  129. tmp[k].consump += h->pch[i].power[k].consump;
  130. tmp[k].voltage = (tmp[k].voltage > h->pch[i].power[k].voltage ) ? tmp[k].voltage : h->pch[i].power[k].voltage;
  131. tmp[k].current += ( h->pch[i].power[k].current);
  132. tmp[k].power += h->pch[i].power[k].power;
  133. tmp[k].reactive_power += h->pch[i].power[k].reactive_power;
  134. tmp[k].app_power += h->pch[i].power[k].app_power;
  135. }
  136. }
  137. for(int i = 0 ; i < 3;++i)
  138. {
  139. tmp[i].factor = tmp[i].app_power > 0 ?(tmp[i].power /tmp[i].app_power) : 0;
  140. h->total.all_l[i] = tmp[i];
  141. tmp_all.consump += tmp[i].consump;
  142. tmp_all.voltage = tmp_all.voltage > tmp[i].voltage ? tmp_all.voltage: tmp[i].voltage;
  143. tmp_all.current += tmp[i].current;
  144. tmp_all.power += tmp[i].power;
  145. tmp_all.reactive_power += tmp[i].reactive_power;
  146. tmp_all.app_power += tmp[i].app_power;
  147. }
  148. tmp_all.factor = tmp_all.app_power > 0 ? (tmp_all.power / tmp_all.app_power) : 0.0;
  149. }else if(h->product->type==PDU_AC_I3O2)
  150. {
  151. for(int i = 0 ;i < h->chs;i++)
  152. {
  153. int left = h->pch[i].info.pse.ph2.ph_l-1;
  154. int right = h->pch[i].info.pse.ph2.ph_l -1;
  155. tmp[left].consump += (h->pch[i].power[left].consump);
  156. tmp[left].voltage = (tmp[left].voltage > h->pch[i].power[left].voltage) ? tmp[left].voltage : h->pch[i].power[left].voltage;
  157. tmp[left].current += ( h->pch[i].power[left].current);
  158. tmp[left].power += h->pch[i].power[left].power;
  159. tmp[left].reactive_power += h->pch[i].power[left].reactive_power;
  160. tmp[left].app_power +=h->pch[i].power[left].app_power;
  161. tmp[right].consump += (h->pch[i].power[right].consump);
  162. tmp[right].voltage = (tmp[right].voltage > h->pch[i].power[right].voltage) ? tmp[right].voltage : h->pch[i].power[right].voltage;
  163. tmp[right].current += ( h->pch[i].power[right].current);
  164. tmp[right].power += h->pch[i].power[right].power;
  165. tmp[right].reactive_power += h->pch[i].power[right].reactive_power;
  166. tmp[right].app_power +=h->pch[i].power[right].app_power;
  167. }
  168. for(int i = 0 ; i < 3;++i)
  169. {
  170. tmp[i].factor = tmp[i].app_power > 0 ?(tmp[i].power /tmp[i].app_power) : 0;
  171. h->total.all_l[i] = tmp[i];
  172. tmp_all.consump += tmp[i].consump;
  173. tmp_all.voltage = tmp_all.voltage > tmp[i].voltage ? tmp_all.voltage: tmp[i].voltage;
  174. tmp_all.current += tmp[i].current;
  175. tmp_all.power += tmp[i].power;
  176. tmp_all.reactive_power += tmp[i].reactive_power;
  177. tmp_all.app_power += tmp[i].app_power;
  178. }
  179. tmp_all.factor = tmp_all.app_power > 0 ? (tmp_all.power / tmp_all.app_power) : 0.0;
  180. }else if(PDU_AC_I1O1 == h->product->type)
  181. {
  182. float chn_total_p = 0.0;
  183. for(int i = 0; i < h->chs;i++)
  184. {
  185. tmp_all.consump += h->pch[i].power[0].consump;
  186. tmp_all.voltage = (tmp_all.voltage > h->pch[i].power[0].voltage) ? tmp_all.voltage : h->pch[i].power[0].voltage;
  187. tmp_all.current += ( h->pch[i].power[0].current);
  188. tmp_all.reactive_power += h->pch[i].power[0].reactive_power;
  189. tmp_all.power += h->pch[i].power[0].power;
  190. tmp_all.app_power +=(h->pch[i].power[0].app_power);
  191. }
  192. tmp_all.factor = tmp_all.app_power > 0 ? (tmp_all.power / tmp_all.app_power) > 1 ? 0.999: (tmp_all.power / tmp_all.app_power) : 0;
  193. }else if(PDU_DC_I1O1 == h->product->type)
  194. {
  195. for(int i = 0; i < h->chs;i++)
  196. {
  197. tmp_all.consump += h->pch[i].power[0].consump;
  198. tmp_all.voltage = (tmp_all.voltage > h->pch[i].power[0].voltage) ? tmp_all.voltage : h->pch[i].power[0].voltage;
  199. tmp_all.current += ( h->pch[i].power[0].current);
  200. tmp_all.power += h->pch[i].power[0].power;
  201. tmp_all.app_power +=(h->pch[i].power[0].app_power);
  202. }
  203. tmp_all.factor = 1;
  204. }
  205. h->total.all = tmp_all;
  206. lock_off(h->lck);
  207. return 0;
  208. }
  209. typedef struct
  210. {
  211. uint8_t id;
  212. uint8_t wanning_type;
  213. uint8_t power_type;
  214. uint8_t ph_info;
  215. uint8_t over;
  216. uint8_t max_min;
  217. uint8_t ele_info;
  218. }op_wanning_info;
  219. static void wanning_operation(op_wanning_info *info,char *name)
  220. {
  221. waning_info_t w_info= {0};
  222. uint8_t lang = paras_get()->sys.lang;
  223. time_t t=time(NULL);
  224. struct tm *tm=localtime(&t);
  225. w_info.type = info->wanning_type;
  226. sprintf(w_info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  227. if(info->power_type == PDU_AC_I1O1 || info->power_type == PDU_DC_I1O1)
  228. {
  229. if(lang == 0)
  230. sprintf(w_info.waning_context,"%s%s%s%s!",name,lang_power_str[lang][info->over],lang_power_str[lang][info->max_min],lang_power_str[lang][info->ele_info]);
  231. else
  232. sprintf(w_info.waning_context,"%s %s %s %s!",name,lang_power_str[lang][info->over],lang_power_str[lang][info->max_min],lang_power_str[lang][info->ele_info]);
  233. }else
  234. {
  235. char buff[20] = {0};
  236. sprintf(buff,"L%d",info->ph_info);
  237. if(lang == 0)
  238. sprintf(w_info.waning_context,"%s%s%s%s%s!",name,buff,lang_power_str[lang][info->over],lang_power_str[lang][info->max_min],lang_power_str[lang][info->ele_info]);
  239. else
  240. sprintf(w_info.waning_context,"%s %s %s %s %s!",name,buff,lang_power_str[lang][info->over],lang_power_str[lang][info->max_min],lang_power_str[lang][info->ele_info]);
  241. }
  242. wanning_insert(w_info);
  243. if(paras_get()->snmp.trapmode == 1)
  244. {
  245. data.ID = info->id;
  246. data.Alarmid = ALARM_TYPE_POWER;
  247. memcpy(data.AlarmDate,w_info.date,32);
  248. memcpy(data.AlarmContext,w_info.waning_context,64);
  249. snmp_alarm_trap(&data,0);
  250. }
  251. beep_set(BEEP_MODE_WARN1);
  252. led_set(LED_MODE_WARN1);
  253. }
  254. static void lose_operation(char *name,int id,uint8_t ph)
  255. {
  256. waning_info_t w_info= {0};
  257. uint8_t lang = paras_get()->sys.lang;
  258. time_t t=time(NULL);
  259. struct tm *tm=localtime(&t);
  260. sprintf(w_info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
  261. if(lang == 0)
  262. sprintf(w_info.waning_context,"%sL%d%s!",name,ph,lang_lose_string[lang][STR_LOSE_ID]);
  263. else
  264. sprintf(w_info.waning_context,"%s L%d %s!",name,ph,lang_lose_string[lang][STR_LOSE_ID]);
  265. wanning_insert(w_info);
  266. if(paras_get()->snmp.trapmode == 1)
  267. {
  268. data.ID = id;
  269. data.Alarmid = ALARM_TYPE_POWER;
  270. memcpy(data.AlarmDate,w_info.date,32);
  271. memcpy(data.AlarmContext,w_info.waning_context,64);
  272. snmp_alarm_trap(&data,0);
  273. }
  274. beep_set(BEEP_MODE_WARN1);
  275. led_set(LED_MODE_WARN1);
  276. }
  277. static void power_thread(void *arg)
  278. {
  279. int r;
  280. thread_handle_t *th=(thread_handle_t*)arg;
  281. power_handle_new_t *h=(power_handle_new_t*)th->attr->arg;
  282. while(th->quit==0) {
  283. for(int i = 1;i < h->brd_max;i++)
  284. {
  285. if(h->board[i].flag)
  286. {
  287. h->get_board_power_info(h->board[i].board_new.addr);
  288. rt_thread_mdelay(40);
  289. }
  290. }
  291. total_proc(h);
  292. //usleep(10000);
  293. }
  294. }
  295. static void b_ac_power_get(uint8_t addr)
  296. {
  297. power_handle_new_t *h = &pwr_Handle;
  298. power_t *pwr=NULL,power={0};
  299. uint16_t offset,tmp[144]={0};
  300. power_ch_new_t *pch=NULL;
  301. alarm_all_t alarm_stat = {0};
  302. int r = 0;
  303. lock_on(h->lck);
  304. uint32_t val;
  305. offset = POWER_AC_CUR_INFO_L;
  306. r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*12);
  307. if (r== 0) {
  308. for (int i=0; i<h->board[addr].board_new.cnt; i++) {
  309. if(h->product->type == PDU_AC_I3O1 || h->product->type == PDU_AC_I3O1_H)
  310. {
  311. // _id = 0 ,1 , 2
  312. uint8_t _id =h->board[addr].board_new.p_ch[i].info.pse.ph - 1;
  313. pwr = &h->board[addr].board_new.p_ch[i].power[_id];
  314. }else
  315. pwr = &h->board[addr].board_new.p_ch[i].power[0];
  316. int idx = i * 12;
  317. val = (tmp[1 + idx] << 16) | tmp[0 + idx];
  318. pwr->voltage = val / 1000.0;
  319. val = (tmp[3 + idx] << 16) | tmp[2 + idx];
  320. pwr->current = val / 1000.0;
  321. val = (tmp[5 + idx] << 16) | tmp[4 + idx];
  322. pwr->power = val / 1000.0;
  323. val = (tmp[7 + idx] << 16) | tmp[6 + idx];
  324. pwr->freq = val / 1000.0;
  325. val = (tmp[9 + idx] << 16) | tmp[8 + idx];
  326. pwr->consump = val / 1000.0;
  327. val = (tmp[11 + idx] << 16) | tmp[10 + idx];
  328. pwr->factor = val / 1000.0;
  329. if(pwr->factor >0.01)
  330. {
  331. pwr->app_power = pwr->power / pwr->factor;
  332. }else
  333. {
  334. pwr->app_power = pwr->power;
  335. }
  336. if(pwr->factor >0.01)
  337. {
  338. float app_power2 = pwr->app_power * pwr->app_power;
  339. float power2 = pwr->power * pwr->power;
  340. double f = (double)(app_power2) - power2;
  341. if(f < 0.0)
  342. pwr->reactive_power = 0;
  343. else
  344. pwr->reactive_power = (float)sqrt(f);
  345. }else
  346. {
  347. pwr->reactive_power = 0;
  348. }
  349. pwr->power /= 1000.0;
  350. pwr->app_power /= 1000.0;
  351. pwr->reactive_power /= 1000.0;
  352. }
  353. }else
  354. {
  355. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset, h->board[addr].board_new.cnt);
  356. }
  357. offset = POWER_AC_STAT_INFO_L;
  358. memset(tmp,0,sizeof(tmp));
  359. r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt);
  360. if (r==0)
  361. {
  362. for (int i=0; i< h->board[addr].board_new.cnt; i++)
  363. {
  364. pch = &h->board[addr].board_new.p_ch[i];
  365. alarm_stat = pch->info.alarm;
  366. pch->info.status = tmp[i] & (0x01);
  367. op_wanning_info info={0};
  368. if(h->product->type == PDU_AC_I3O1 || h->product->type == PDU_AC_I3O1_H)
  369. {
  370. uint8_t _id = pch->info.pse.ph -1;
  371. switch(_id)
  372. {
  373. case 0:
  374. {
  375. pch->info.alarm.l1_v_upper = (tmp[i] & BIT(2))?1:0;
  376. pch->info.alarm.l1_v_lower = (tmp[i] & BIT(4))?1:0;
  377. pch->info.alarm.l1_c_upper = (tmp[i] & BIT(6))?1:0;
  378. pch->info.alarm.l1_p_upper = (tmp[i] & BIT(8))?1:0;
  379. pch->info.alarm.l1_w_upper = (tmp[i] & BIT(10))?1:0;
  380. }
  381. break;
  382. case 1:
  383. {
  384. pch->info.alarm.l2_v_upper = (tmp[i] & BIT(2))?1:0;
  385. pch->info.alarm.l2_v_lower = (tmp[i] & BIT(4))?1:0;
  386. pch->info.alarm.l2_c_upper = (tmp[i] & BIT(6))?1:0;
  387. pch->info.alarm.l2_p_upper = (tmp[i] & BIT(8))?1:0;
  388. pch->info.alarm.l2_w_upper = (tmp[i] & BIT(10))?1:0;
  389. }
  390. break;
  391. case 2:
  392. {
  393. pch->info.alarm.l3_v_upper = (tmp[i] & BIT(2))?1:0;
  394. pch->info.alarm.l3_v_lower = (tmp[i] & BIT(4))?1:0;
  395. pch->info.alarm.l3_c_upper = (tmp[i] & BIT(6))?1:0;
  396. pch->info.alarm.l3_p_upper = (tmp[i] & BIT(8))?1:0;
  397. pch->info.alarm.l3_w_upper = (tmp[i] & BIT(10))?1:0;
  398. }
  399. break;
  400. default:
  401. break;
  402. }
  403. }else
  404. {
  405. pch->info.alarm.l1_v_upper = (tmp[i] & BIT(2))?1:0;
  406. pch->info.alarm.l1_v_lower = (tmp[i] & BIT(4))?1:0;
  407. pch->info.alarm.l1_c_upper = (tmp[i] & BIT(6))?1:0;
  408. pch->info.alarm.l1_p_upper = (tmp[i] & BIT(8))?1:0;
  409. pch->info.alarm.l1_w_upper = (tmp[i] & BIT(10))?1:0;
  410. }
  411. info.id = i;
  412. info.wanning_type = ALARM_TYPE_POWER;
  413. info.power_type = h->product->type;
  414. if(h->product->type == PDU_AC_I3O1 || h->product->type == PDU_AC_I3O1_H)
  415. {
  416. info.ph_info = pch->info.pse.ph;
  417. uint8_t _id = pch->info.pse.ph-1;
  418. switch(_id)
  419. {
  420. case 0:
  421. {
  422. if(!alarm_stat.l1_v_upper && pch->info.alarm.l1_v_upper)
  423. {
  424. info.ele_info = STR_POWER_ID_VOL;
  425. info.max_min = STR_POWER_ID_MAXS;
  426. info.over = STR_POWER_ID_OVER;
  427. wanning_operation(&info,pch->info.name);
  428. }
  429. if(!alarm_stat.l1_v_lower && pch->info.alarm.l1_v_lower)
  430. {
  431. info.ele_info = STR_POWER_ID_VOL;
  432. info.max_min = STR_POWER_ID_MIN;
  433. info.over = STR_POWER_ID_LOW;
  434. wanning_operation(&info,pch->info.name);
  435. }
  436. if(!alarm_stat.l1_c_upper && pch->info.alarm.l1_c_upper)
  437. {
  438. info.ele_info = STR_POWER_ID_CUR;
  439. info.max_min = STR_POWER_ID_MAXS;
  440. info.over = STR_POWER_ID_OVER;
  441. wanning_operation(&info,pch->info.name);
  442. }
  443. if(!alarm_stat.l1_p_upper && pch->info.alarm.l1_p_upper)
  444. {
  445. info.ele_info = STR_POWER_ID_POWER;
  446. info.max_min = STR_POWER_ID_MAXS;
  447. info.over = STR_POWER_ID_OVER;
  448. wanning_operation(&info,pch->info.name);
  449. }
  450. if(!alarm_stat.l1_w_upper && pch->info.alarm.l1_w_upper)
  451. {
  452. info.ele_info = STR_POWER_ID_CONSUMER;
  453. info.max_min = STR_POWER_ID_MAXS;
  454. info.over = STR_POWER_ID_OVER;
  455. wanning_operation(&info,pch->info.name);
  456. }
  457. }
  458. break;
  459. case 1:
  460. {
  461. if(!alarm_stat.l2_v_upper && pch->info.alarm.l2_v_upper)
  462. {
  463. info.ele_info = STR_POWER_ID_VOL;
  464. info.max_min = STR_POWER_ID_MAXS;
  465. info.over = STR_POWER_ID_OVER;
  466. wanning_operation(&info,pch->info.name);
  467. }
  468. if(!alarm_stat.l2_v_lower && pch->info.alarm.l2_v_lower)
  469. {
  470. info.ele_info = STR_POWER_ID_VOL;
  471. info.max_min = STR_POWER_ID_MIN;
  472. info.over = STR_POWER_ID_LOW;
  473. wanning_operation(&info,pch->info.name);
  474. }
  475. if(!alarm_stat.l2_c_upper && pch->info.alarm.l2_c_upper)
  476. {
  477. info.ele_info = STR_POWER_ID_CUR;
  478. info.max_min = STR_POWER_ID_MAXS;
  479. info.over = STR_POWER_ID_OVER;
  480. wanning_operation(&info,pch->info.name);
  481. }
  482. if(!alarm_stat.l2_p_upper && pch->info.alarm.l2_p_upper)
  483. {
  484. info.ele_info = STR_POWER_ID_POWER;
  485. info.max_min = STR_POWER_ID_MAXS;
  486. info.over = STR_POWER_ID_OVER;
  487. wanning_operation(&info,pch->info.name);
  488. }
  489. if(!alarm_stat.l2_w_upper && pch->info.alarm.l2_w_upper)
  490. {
  491. info.ele_info = STR_POWER_ID_CONSUMER;
  492. info.max_min = STR_POWER_ID_MAXS;
  493. info.over = STR_POWER_ID_OVER;
  494. wanning_operation(&info,pch->info.name);
  495. }
  496. }
  497. break;
  498. case 2:
  499. {
  500. if(!alarm_stat.l3_v_upper && pch->info.alarm.l3_v_upper)
  501. {
  502. info.ele_info = STR_POWER_ID_VOL;
  503. info.max_min = STR_POWER_ID_MAXS;
  504. info.over = STR_POWER_ID_OVER;
  505. wanning_operation(&info,pch->info.name);
  506. }
  507. if(!alarm_stat.l3_v_lower && pch->info.alarm.l3_v_lower)
  508. {
  509. info.ele_info = STR_POWER_ID_VOL;
  510. info.max_min = STR_POWER_ID_MIN;
  511. info.over = STR_POWER_ID_LOW;
  512. wanning_operation(&info,pch->info.name);
  513. }
  514. if(!alarm_stat.l3_c_upper && pch->info.alarm.l3_c_upper)
  515. {
  516. info.ele_info = STR_POWER_ID_CUR;
  517. info.max_min = STR_POWER_ID_MAXS;
  518. info.over = STR_POWER_ID_OVER;
  519. wanning_operation(&info,pch->info.name);
  520. }
  521. if(!alarm_stat.l3_p_upper && pch->info.alarm.l3_p_upper)
  522. {
  523. info.ele_info = STR_POWER_ID_POWER;
  524. info.max_min = STR_POWER_ID_MAXS;
  525. info.over = STR_POWER_ID_OVER;
  526. wanning_operation(&info,pch->info.name);
  527. }
  528. if(!alarm_stat.l3_w_upper && pch->info.alarm.l3_w_upper)
  529. {
  530. info.ele_info = STR_POWER_ID_CONSUMER;
  531. info.max_min = STR_POWER_ID_MAXS;
  532. info.over = STR_POWER_ID_OVER;
  533. wanning_operation(&info,pch->info.name);
  534. }
  535. }
  536. break;
  537. default:
  538. break;
  539. }
  540. }else
  541. {
  542. if(!alarm_stat.l1_v_upper && pch->info.alarm.l1_v_upper)
  543. {
  544. info.ele_info = STR_POWER_ID_VOL;
  545. info.max_min = STR_POWER_ID_MAXS;
  546. info.over = STR_POWER_ID_OVER;
  547. wanning_operation(&info,pch->info.name);
  548. }
  549. if(!alarm_stat.l1_v_lower && pch->info.alarm.l1_v_lower)
  550. {
  551. info.ele_info = STR_POWER_ID_VOL;
  552. info.max_min = STR_POWER_ID_MIN;
  553. info.over = STR_POWER_ID_LOW;
  554. wanning_operation(&info,pch->info.name);
  555. }
  556. if(!alarm_stat.l1_c_upper && pch->info.alarm.l1_c_upper)
  557. {
  558. info.ele_info = STR_POWER_ID_CUR;
  559. info.max_min = STR_POWER_ID_MAXS;
  560. info.over = STR_POWER_ID_OVER;
  561. wanning_operation(&info,pch->info.name);
  562. }
  563. if(!alarm_stat.l1_p_upper && pch->info.alarm.l1_p_upper)
  564. {
  565. info.ele_info = STR_POWER_ID_POWER;
  566. info.max_min = STR_POWER_ID_MAXS;
  567. info.over = STR_POWER_ID_OVER;
  568. wanning_operation(&info,pch->info.name);
  569. }
  570. if(!alarm_stat.l1_w_upper && pch->info.alarm.l1_w_upper)
  571. {
  572. info.ele_info = STR_POWER_ID_CONSUMER;
  573. info.max_min = STR_POWER_ID_MAXS;
  574. info.over = STR_POWER_ID_OVER;
  575. wanning_operation(&info,pch->info.name);
  576. }
  577. }
  578. }
  579. }
  580. else{
  581. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset, h->board[addr].board_new.cnt);
  582. }
  583. lock_off(h->lck);
  584. }
  585. static void b_ac_delay_get(uint8_t addr)
  586. {
  587. power_handle_new_t *h = &pwr_Handle;
  588. power_t *pwr=NULL,power={0};
  589. uint16_t offset,tmp[144]={0};
  590. power_ch_new_t *pch=NULL;
  591. int r = 0;
  592. offset = POWER_AC_OPEN_DELAY_TIME_L;
  593. r =read_reg(NULL,addr, offset, tmp, h->board[addr].board_new.cnt);
  594. if(r == 0)
  595. {
  596. for(int i = 0; i < h->board[addr].board_new.cnt;i++)
  597. {
  598. pch = &h->board[addr].board_new.p_ch[i];
  599. pch->info.open_delay = tmp[i] / 1000;
  600. }
  601. }
  602. offset = POWER_AC_CLOSE_DELAY_TIME_L;
  603. r =read_reg(NULL,addr, offset, tmp, h->board[addr].board_new.cnt);
  604. if(r == 0)
  605. {
  606. for(int i = 0; i < h->board[addr].board_new.cnt;i++)
  607. {
  608. pch = &h->board[addr].board_new.p_ch[i];
  609. pch->info.close_delay = tmp[i] / 1000;
  610. }
  611. }
  612. }
  613. static void b_ac_thr_get(uint8_t addr)
  614. {
  615. power_handle_new_t *h = &pwr_Handle;
  616. power_t *pwr=NULL;
  617. uint16_t offset,tmp[144]={0};
  618. power_ch_new_t *pch=NULL;
  619. int r = 0;
  620. if(h->board[addr].board_new.cnt < 8)
  621. {
  622. offset = POWER_AC_THRESHOLD_L;
  623. r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt * 16);
  624. if(r == 0)
  625. {
  626. for (int i=0; i<h->board[addr].board_new.cnt; i++) {
  627. pch = &h->board[addr].board_new.p_ch[i];
  628. int index = i*16;
  629. pch->thr.v_upper = ((tmp[1+index]<<16)|tmp[0+index])/1000.0;
  630. pch->thr.v_lower = ((tmp[3+index]<<16)|tmp[2+index])/1000.0;
  631. pch->thr.c_upper = ((tmp[5+index]<<16)|tmp[4+index])/1000.0;
  632. pch->thr.p_upper = ((tmp[9+index]<<16)|tmp[8+index])/1000.0;
  633. pch->thr.w_upper = ((tmp[13+index]<<16)|tmp[12+index])/1000.0;
  634. }
  635. }
  636. }else
  637. {
  638. offset = POWER_AC_THRESHOLD_L;
  639. r = read_reg(NULL, addr, offset, tmp, 7 * 16);
  640. if(r == 0)
  641. {
  642. for (int i=0; i < 7; i++) {
  643. pch = &h->board[addr].board_new.p_ch[i];
  644. int index = i*16;
  645. pch->thr.v_upper = ((tmp[1+index]<<16)|tmp[0+index])/1000.0;
  646. pch->thr.v_lower = ((tmp[3+index]<<16)|tmp[2+index])/1000.0;
  647. pch->thr.c_upper = ((tmp[5+index]<<16)|tmp[4+index])/1000.0;
  648. pch->thr.p_upper = ((tmp[9+index]<<16)|tmp[8+index])/1000.0;
  649. pch->thr.w_upper = ((tmp[13+index]<<16)|tmp[12+index])/1000.0;
  650. }
  651. }
  652. offset = POWER_AC_THRESHOLD_L + (16*7);
  653. r = read_reg(NULL,addr, offset, tmp, (h->board[addr].board_new.cnt-7) * 16);
  654. if(r == 0)
  655. {
  656. for (int i=0; i< (h->board[addr].board_new.cnt-7); i++) {
  657. pch = &h->board[addr].board_new.p_ch[i+7];
  658. int index = i*16;
  659. pch->thr.v_upper = ((tmp[1+index]<<16)|tmp[0+index]) / 1000.0;
  660. pch->thr.v_lower = ((tmp[3+index]<<16)|tmp[2+index]) / 1000.0;
  661. pch->thr.c_upper = ((tmp[5+index]<<16)|tmp[4+index]) / 1000.0;
  662. pch->thr.p_upper = ((tmp[9+index]<<16)|tmp[8+index]) / 1000.0;
  663. pch->thr.w_upper = ((tmp[13+index]<<16)|tmp[12+index]) / 1000.0;
  664. }
  665. }
  666. }
  667. }
  668. static void b_ac_set_delay(uint8_t addr,uint8_t b_addr,uint16_t delay_open, uint16_t delay_close)
  669. {
  670. power_handle_new_t *h = &pwr_Handle;
  671. uint16_t tmp[2]={0};
  672. power_ch_new_t *pch=NULL;
  673. int r = 0;
  674. pch = &h->board[addr].board_new.p_ch[b_addr];
  675. tmp[0] = delay_open*1000;
  676. uint16_t offset = POWER_AC_OPEN_DELAY_TIME_L+b_addr;
  677. r = write_reg(NULL, addr, offset, tmp, 1);
  678. if(r != 0)
  679. {
  680. r = write_reg(NULL, addr, offset, tmp, 1);
  681. }
  682. if(r == 0)
  683. {
  684. pch->info.open_delay = delay_open;
  685. }
  686. offset = POWER_AC_CLOSE_DELAY_TIME_L + b_addr;
  687. tmp[0] = delay_close*1000;
  688. r = write_reg(NULL, addr, offset, tmp, 1);
  689. if(r != 0)
  690. {
  691. r = write_reg(NULL, addr, offset, tmp, 1);
  692. }
  693. if(r == 0)
  694. {
  695. pch->info.close_delay = delay_close;
  696. }
  697. }
  698. static void b_ac_set_thr(uint8_t addr,uint8_t b_addr,thr_t *thr)
  699. {
  700. power_handle_new_t *h = &pwr_Handle;
  701. power_ch_new_t *pch=NULL;
  702. int r = 0;
  703. uint16_t offset = 0;
  704. uint32_t data_temp = 0 ;
  705. uint16_t data_buf[16] = {0};
  706. //电压上限
  707. data_temp = (thr->v_upper*1000);
  708. data_buf[0] = data_temp;
  709. data_buf[1] = data_temp>>16;
  710. //电压下限
  711. data_temp = (thr->v_lower*1000);
  712. data_buf[2] = data_temp;
  713. data_buf[3] = data_temp>>16;
  714. //电流上限
  715. data_temp = (thr->c_upper*1000);
  716. data_buf[4] = data_temp;
  717. data_buf[5] = data_temp>>16;
  718. //电流下限
  719. data_temp = (0);
  720. data_buf[6] = data_temp;
  721. data_buf[7] = data_temp>>16;
  722. //功率上限
  723. data_temp = (thr->p_upper)*1000;
  724. data_buf[8] = data_temp;
  725. data_buf[9] = data_temp>>16;
  726. //功率下限
  727. data_temp = 0;
  728. data_buf[10] = data_temp;
  729. data_buf[11] = data_temp>>16;
  730. //电能上限
  731. data_temp = (thr->w_upper)*1000;
  732. data_buf[12] = data_temp;
  733. data_buf[13] = data_temp>>16;
  734. //电能下限
  735. data_temp = 0;
  736. data_buf[14] = data_temp;
  737. data_buf[15] = data_temp>>16;
  738. offset = POWER_AC_THRESHOLD_L + (b_addr*16);
  739. r = write_reg(NULL,addr, offset, data_buf, 16);
  740. if(r < 0)
  741. {
  742. r = write_reg(NULL,addr, offset, data_buf, 16);
  743. }
  744. if(r == 0)
  745. {
  746. pch = &h->board[addr].board_new.p_ch[b_addr];
  747. pch->thr = *thr;
  748. }else
  749. {
  750. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,b_addr);
  751. }
  752. }
  753. static void b_ac_set_batch_thr(uint8_t addr,thr_t *thr)
  754. {
  755. power_handle_new_t *h = &pwr_Handle;
  756. power_ch_new_t *pch=NULL;
  757. int r = 0;
  758. uint16_t offset = 0;
  759. uint32_t data_temp = 0 ;
  760. int count = h->board[addr].board_new.cnt;
  761. for(int i = 0;i < count;i++)
  762. {
  763. uint16_t data_buf[16] = {0};
  764. offset = POWER_AC_THRESHOLD_L + (i * 16);
  765. //电压上限
  766. data_temp = (thr->v_upper*1000);
  767. data_buf[0] = data_temp;
  768. data_buf[1] = data_temp>>16;
  769. //电压下限
  770. data_temp = (thr->v_lower*1000);
  771. data_buf[2] = data_temp;
  772. data_buf[3] = data_temp>>16;
  773. //电流上限
  774. data_temp = (thr->c_upper*1000);
  775. data_buf[4] = data_temp;
  776. data_buf[5] = data_temp>>16;
  777. //电流下限
  778. data_temp = (0);
  779. data_buf[6] = data_temp;
  780. data_buf[7] = data_temp>>16;
  781. //功率上限
  782. data_temp = (thr->p_upper)*1000;
  783. data_buf[8] = data_temp;
  784. data_buf[9] = data_temp>>16;
  785. //功率下限
  786. data_temp = 0;
  787. data_buf[10] = data_temp;
  788. data_buf[11] = data_temp>>16;
  789. //电能上限
  790. data_temp = (thr->w_upper)*1000;
  791. data_buf[12] = data_temp;
  792. data_buf[13] = data_temp>>16;
  793. //电能下限
  794. data_temp = 0;
  795. data_buf[14] = data_temp;
  796. data_buf[15] = data_temp>>16;
  797. r = write_reg(NULL,addr, offset, data_buf, 16);
  798. if(r < 0)
  799. {
  800. r = write_reg(NULL,addr, offset, data_buf, 16);
  801. }
  802. if(r == 0)
  803. {
  804. pch = &h->board[addr].board_new.p_ch[i];
  805. pch->thr = *thr;
  806. }else
  807. {
  808. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,count);
  809. }
  810. }
  811. }
  812. static void b_ac_set_status(uint8_t addr,uint8_t b_addr,uint8_t status)
  813. {
  814. int r;
  815. uint16_t st= status,offset,tmp[2]={0};
  816. offset = POWER_AC_CH_STAT_L + b_addr;
  817. tmp[0] = st;
  818. r = write_reg(NULL, addr, offset, tmp, 1);
  819. if(r != 0)
  820. {
  821. r = write_reg(NULL, addr, offset, tmp, 1);
  822. }
  823. if(r != 0)
  824. {
  825. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,b_addr);
  826. }
  827. }
  828. static void b_ac_set_consumer_clear(uint8_t addr,uint8_t b_addr)
  829. {
  830. int r =0;
  831. uint16_t val = 1;
  832. uint16_t offset = POWER_AC_RESET_CONSUMP + b_addr;
  833. r = write_reg(NULL, addr, offset, &val, 1);
  834. if(r != 0)
  835. {
  836. r = write_reg(NULL, addr, offset, &val, 1);
  837. }
  838. if(r != 0)
  839. {
  840. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,b_addr);
  841. }
  842. }
  843. static void b_ac_set_all_status(uint8_t status)
  844. {
  845. int r = 0;
  846. power_handle_new_t *h = &pwr_Handle;
  847. for(int j = 1; j < 33;j++)
  848. {
  849. if(h->board[j].flag)
  850. {
  851. uint16_t switch_ctrl[8] = {0};
  852. for (size_t i = 0; i < h->board[j].board_new.cnt; i++)
  853. {
  854. switch_ctrl[i] = status;
  855. if(status==1)
  856. {
  857. switch_ctrl[i] |= (1<<11);
  858. }else
  859. {
  860. switch_ctrl[i] |= (1<<12);
  861. }
  862. }
  863. r = write_reg(NULL,j, POWER_AC_CH_STAT_L, &switch_ctrl[0], h->board[j].board_new.cnt);
  864. if(r != 0)
  865. {
  866. r = write_reg(NULL,j, POWER_AC_CH_STAT_L, &switch_ctrl[0], h->board[j].board_new.cnt);
  867. }
  868. if(r != 0)
  869. {
  870. LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", j, POWER_AC_CH_STAT_L, POWER_AC_CH_STAT_L,h->board[j].board_new.cnt);
  871. }
  872. }
  873. }
  874. }
  875. static void b_ac_set_all_consumer_clear(uint8_t addr)
  876. {
  877. //todo
  878. }
  879. static void b_dc_power_get(uint8_t addr)
  880. {
  881. }
  882. static void b_dc_delay_get(uint8_t addr)
  883. {
  884. //todo
  885. }
  886. static void b_dc_thr_get(uint8_t addr)
  887. {
  888. //todo
  889. }
  890. static void b_dc_set_delay(uint8_t addr,uint8_t b_addr,uint16_t delay_open, uint16_t delay_close)
  891. {
  892. //todo
  893. }
  894. static void b_dc_set_thr(uint8_t addr,uint8_t b_addr,thr_t *th)
  895. {
  896. //todo
  897. }
  898. static void b_dc_set_status(uint8_t addr,uint8_t b_addr,uint8_t status)
  899. {
  900. //todo
  901. }
  902. static void b_dc_set_consumer_clear(uint8_t addr,uint8_t b_addr)
  903. {
  904. //todo
  905. }
  906. static void b_dc_set_all_status(uint8_t status)
  907. {
  908. }
  909. static void b_dc_set_all_consumer_clear(uint8_t addr)
  910. {
  911. }
  912. static void b_3_3_ac_power_get(uint8_t addr)
  913. {
  914. }
  915. static void b_3_3_ac_delay_get(uint8_t addr)
  916. {
  917. }
  918. static void b_3_3_ac_thr_get(uint8_t addr)
  919. {
  920. }
  921. static void b_3_3_ac_set_delay(uint8_t addr,uint8_t b_addr,uint16_t delay_open, uint16_t delay_close)
  922. {
  923. }
  924. static void b_3_3_ac_set_thr(uint8_t addr,uint8_t b_addr,thr_t *th)
  925. {
  926. }
  927. static void b_3_3_ac_set_status(uint8_t addr,uint8_t b_addr,uint8_t status)
  928. {
  929. }
  930. static void b_3_3_ac_set_consumer_clear(uint8_t addr,uint8_t b_addr)
  931. {
  932. }
  933. static void b_3_3_ac_set_all_status(uint8_t status)
  934. {
  935. }
  936. static void b_3_3_ac_set_all_consumer_clear(uint8_t addr)
  937. {
  938. }
  939. static void b_3_2_ac_power_get(uint8_t addr)
  940. {
  941. }
  942. static void b_3_2_ac_delay_get(uint8_t addr)
  943. {
  944. }
  945. static void b_3_2_ac_thr_get(uint8_t addr)
  946. {
  947. }
  948. static void b_3_2_ac_set_delay(uint8_t addr,uint8_t b_addr,uint16_t delay_open, uint16_t delay_close)
  949. {
  950. }
  951. static void b_3_2_ac_set_thr(uint8_t addr,uint8_t b_addr,thr_t *th)
  952. {
  953. }
  954. static void b_3_2_ac_set_status(uint8_t addr,uint8_t b_addr,uint8_t status)
  955. {
  956. }
  957. static void b_3_2_ac_set_consumer_clear(uint8_t addr,uint8_t b_addr)
  958. {
  959. }
  960. static void b_3_2_ac_set_all_status(uint8_t status)
  961. {
  962. }
  963. static void b_3_2_ac_set_all_consumer_clear(uint8_t addr)
  964. {
  965. }
  966. static int board_scan()
  967. {
  968. int cnts = 0;
  969. power_handle_new_t *h = &pwr_Handle;
  970. paras_data_t* para=paras_get();
  971. uint16_t tmp[2] = {0};
  972. int r =0;
  973. uint8_t board_count = 0;
  974. h->power_type = h->product->type;
  975. for(int i =1; i <h->brd_max;i++)
  976. {
  977. uint8_t cnt =0;
  978. //board_count ++;
  979. if(h->product->type==PDU_AC_I1O1 || h->product->type==PDU_AC_I3O1_H || h->product->type==PDU_AC_I3O1) {
  980. r = read_reg(NULL, i, POWER_AC_GET_INFO, tmp, 1);
  981. if(r==0) {
  982. board_count++;
  983. cnt =tmp[0]&0xFF;
  984. h->board[i].flag =1;
  985. h->board[i].board_new.addr = i;
  986. LOGD("___ board scan addr %d ok, type: %d, chs: %d\n", i, h->product->type, cnt);
  987. if((cnts + cnt) > h->ch_max)
  988. {
  989. cnts = h->ch_max;
  990. h->board[i].board_new.cnt = h->ch_max - cnts;
  991. break;
  992. }else
  993. {
  994. cnts += cnt;
  995. h->board[i].board_new.cnt = cnt;
  996. }
  997. }else
  998. {
  999. LOGD("___ board scan addr %d failed\n", i);
  1000. }
  1001. }
  1002. else {
  1003. r = read_reg(NULL, i, POWER_DC_INFO, tmp, 2);
  1004. if(r==0)
  1005. {
  1006. board_count++;
  1007. cnt = tmp[0]&0xFF;
  1008. h->board[i].flag =1;
  1009. h->board[i].board_new.addr = i;
  1010. if(h->product->type == PDU_AC_I3O3) cnt /= 3;
  1011. if(h->product->type == PDU_AC_I3O2) cnt /= 2;
  1012. LOGD("___ board scan addr %d ok, type: %d, chs: %d\n", i, h->product->type, cnt);
  1013. if((cnts + cnt) > h->ch_max)
  1014. {
  1015. cnts = h->ch_max;
  1016. h->board[i].board_new.cnt = h->ch_max - cnts;
  1017. break;
  1018. }else
  1019. {
  1020. cnts += cnt;
  1021. h->board[i].board_new.cnt = cnt;
  1022. }
  1023. }
  1024. }
  1025. }
  1026. h->chs = cnts;
  1027. h->brd_cnt = board_count;
  1028. //
  1029. h->pch = calloc(1, sizeof(power_ch_new_t) * h->chs);
  1030. LOGD("__ power init ch_mem=%d sizeof(power_ch_new_t)=%d\n",sizeof(power_ch_new_t) * h->chs,sizeof(power_ch_new_t));
  1031. memset(h->pch,0,sizeof(power_ch_new_t)*h->chs);
  1032. power_ch_new_t * p_start = h->pch;
  1033. char temp[16] = {0};
  1034. int index = 1;
  1035. for(int i =1; i <h->brd_max;i++)
  1036. {
  1037. if(h->board[i].flag)
  1038. {
  1039. for(int j = 0;j<h->board[i].board_new.cnt;j++)
  1040. {
  1041. p_start[j].info.sch = j;
  1042. p_start[j].info.addr = i;
  1043. sprintf(temp,"CH-%d",index++);
  1044. strcpy(p_start[j].info.name,temp);
  1045. }
  1046. h->board[i].board_new.p_ch = p_start;
  1047. p_start += h->board[i].board_new.cnt;
  1048. }
  1049. }
  1050. if(h->product->type==PDU_AC_I3O1 || h->product->type==PDU_AC_I3O1_H)
  1051. {
  1052. for(int i = 0; i < h->chs;i++)
  1053. {
  1054. h->pch[i].info.pse.ph = para->phase_seq.phase_seq[i] -'0';
  1055. }
  1056. }
  1057. if(h->product->type==PDU_AC_I1O1 || h->product->type==PDU_AC_I3O1_H || h->product->type==PDU_AC_I3O1) {
  1058. h->get_board_power_info = b_ac_power_get;
  1059. h->get_board_delay_info = b_ac_delay_get;
  1060. h->get_board_thr_info = b_ac_thr_get;
  1061. h->set_all_consumer_clear = b_ac_set_all_consumer_clear;
  1062. h->set_all_status = b_ac_set_all_status;
  1063. h->set_consumer_clear = b_ac_set_consumer_clear;
  1064. h->set_delay = b_ac_set_delay;
  1065. h->set_status = b_ac_set_status;
  1066. h->set_thr = b_ac_set_thr;
  1067. h->set_batch_thr = b_ac_set_batch_thr;
  1068. }else if(h->product->type==PDU_DC_I1O1) {
  1069. h->get_board_power_info = b_dc_power_get;
  1070. h->get_board_delay_info = b_dc_delay_get;
  1071. h->get_board_thr_info = b_dc_thr_get;
  1072. h->set_all_consumer_clear = b_dc_set_all_consumer_clear;
  1073. h->set_all_status = b_dc_set_all_status;
  1074. h->set_consumer_clear = b_dc_set_consumer_clear;
  1075. h->set_delay = b_dc_set_delay;
  1076. h->set_status = b_dc_set_status;
  1077. h->set_thr = b_dc_set_thr;
  1078. }else if(h->product->type==PDU_AC_I3O3) {
  1079. h->get_board_power_info = b_3_3_ac_power_get;
  1080. h->get_board_delay_info = b_3_3_ac_delay_get;
  1081. h->get_board_thr_info = b_3_3_ac_thr_get;
  1082. h->set_all_consumer_clear = b_3_3_ac_set_all_consumer_clear;
  1083. h->set_all_status = b_3_3_ac_set_all_status;
  1084. h->set_consumer_clear = b_3_3_ac_set_consumer_clear;
  1085. h->set_delay = b_3_3_ac_set_delay;
  1086. h->set_status = b_3_3_ac_set_status;
  1087. h->set_thr = b_3_3_ac_set_thr;
  1088. }else if(h->product->type==PDU_AC_I3O2) {
  1089. h->get_board_power_info = b_3_2_ac_power_get;
  1090. h->get_board_delay_info = b_3_2_ac_delay_get;
  1091. h->get_board_thr_info = b_3_2_ac_thr_get;
  1092. h->set_all_consumer_clear = b_3_2_ac_set_all_consumer_clear;
  1093. h->set_all_status = b_3_2_ac_set_all_status;
  1094. h->set_consumer_clear = b_3_2_ac_set_consumer_clear;
  1095. h->set_delay = b_3_2_ac_set_delay;
  1096. h->set_status = b_3_2_ac_set_status;
  1097. h->set_thr = b_3_2_ac_set_thr;
  1098. }
  1099. return 0;
  1100. }
  1101. int power_init(void)
  1102. {
  1103. power_handle_new_t *h = &pwr_Handle;
  1104. paras_data_t *p=paras_get();
  1105. mb_para_t para={
  1106. .mode = MB_MODE_MASTER,
  1107. .type = MB_TYPE_RTU,
  1108. .para = {
  1109. .rtu = {
  1110. .dev = POWER_PORT, //设备名
  1111. .baudrate = 115200, //波特率
  1112. .parity = 0, //校验位
  1113. .pin = -1, //收发控制引脚, <0 表示不使用
  1114. .lvl = 0, //发送控制电平
  1115. }
  1116. }
  1117. };
  1118. memset(h, 0, sizeof(power_handle_new_t));
  1119. h->lck = lock_init();
  1120. h->brd_max = POWER_BOARD_MAX;
  1121. h->ch_max = POWER_BOARD_MAX;
  1122. h->product = &p->prod;
  1123. board_scan();
  1124. for(int i = 1;i < h->brd_max;i++)
  1125. {
  1126. if(h->board[i].flag)
  1127. {
  1128. h->get_board_delay_info(h->board[i].board_new.addr);
  1129. h->get_board_thr_info(h->board[i].board_new.addr);
  1130. }
  1131. }
  1132. thread_start(THREAD_ID_POWER, power_thread, h);
  1133. return 0;
  1134. }
  1135. int power_data_get(power_handle_new_t *all)
  1136. {
  1137. return 0;
  1138. }
  1139. int power_data_get_board_cnt()
  1140. {
  1141. return pwr_Handle.brd_cnt;
  1142. }
  1143. power_handle_new_t * power_get_all(void)
  1144. {
  1145. return &pwr_Handle;
  1146. }
  1147. int power_breaker_get(breaker_all_t *all)
  1148. {
  1149. // int i,j,idx=0;
  1150. // power_handle_t *h=&pwrHandle;
  1151. //
  1152. // if(!all) {
  1153. // return -1;
  1154. // }
  1155. //
  1156. // lock_on(h->lck);
  1157. // all->cnt = 0;
  1158. // for(i=1; i<=h->cnt; i++) {
  1159. // if(h->pbrd[i]) {
  1160. // all->cnt += h->pbrd[i]->chs;
  1161. // }
  1162. // }
  1163. // if(all->cnt>0) {
  1164. // all->data = (breaker_data_t*)malloc(sizeof(breaker_data_t)*all->cnt);
  1165. // if(all->data) {
  1166. // for(i=1; i<=h->cnt; i++) {
  1167. // if(h->pbrd[i]) {
  1168. // for(j=0; j<2; j++) {
  1169. // if(h->pbrd[i]->brk[j].info.addr>0) {
  1170. // all->data[idx++] = h->pbrd[i]->brk[j];
  1171. // }
  1172. // }
  1173. // }
  1174. // }
  1175. // }
  1176. // else {
  1177. // all->cnt = 0;
  1178. // }
  1179. // }
  1180. // lock_off(h->lck);
  1181. return 0;
  1182. }