bkds.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. #include "plt.h"
  2. static struct bkd_shm_t *SHM = NULL;
  3. static int sbmu_idx = 1;
  4. static void bkds_gen_datetimestr(char *buf, int len)
  5. {
  6. time_t timep;
  7. struct tm *tsp;
  8. char tmpbuf[32];
  9. time(&timep);
  10. // tsp = gmtime(&timep);
  11. tsp = localtime(&timep);
  12. sprintf(tmpbuf, "%04d-%02d-%02d %02d:%02d:%02d", tsp->tm_year + 1900, tsp->tm_mon + 1, tsp->tm_mday,
  13. tsp->tm_hour, tsp->tm_min, tsp->tm_sec);
  14. strncpy(buf, tmpbuf, len);
  15. }
  16. extern int VERSION[3];
  17. static int bkds_proc_get_ctn_data()
  18. {
  19. char itm_buf[2048];
  20. char buf[128];
  21. unsigned short *faults = pcs_get_faults();
  22. unsigned short *warns = pcs_get_warns();
  23. itm_buf[0] = 0;
  24. int i = 0;
  25. char itm_buf_sys[1024];
  26. char itm_buf_pcs[1024 * 2];
  27. char itm_buf_bms[1024];
  28. char itm_buf_meter[1024 * 2];
  29. char itm_buf_ac[1024];
  30. char itm_buf_ems[1024];
  31. char itm_buf_plc[1024 * 2];
  32. char itm_buf_th[1024];
  33. char itm_buf_gas[1024];
  34. char itm_buf_chan[1024 * 4];
  35. char itm_buf_mqtt[1024];
  36. char itm_buf_temp[4096];
  37. char itm_buf_ups[1024];
  38. // sys
  39. sprintf(itm_buf_sys, "\"info\":\"%s\",\"idx_in_ess\":%d,\"sw_version\":\"%d.%d.%d\",\"bkd_head_version\":\"%s\",\"state\":\"%s\",\
  40. \"step\":%d,\"err\":\"%s\",\"ap\":%d,\"soc\":%.1f,\"aps\":%d,\
  41. \"chgable\":%d,\"dhgable\":%d,\"tick\":%d,\"socc\":%.1f,\"socd\":%.1f,\
  42. \"cell_otp\":%d,\"cell_utp\":%d,\"bsytikchk_en\":%d,\"bsytikchk_from_host\":%d,\"bsytikchk_timeout\":%d,\
  43. \"pcs_bsytiksnd_en\":%d,\"norm_e\":%d,\"norm_p\":%d",
  44. ctn_get_info(), ctn_get_idx_in_ess(), VERSION[0], VERSION[1], VERSION[2], BKD_HEAD_VERSION, ctn_get_state_str(),
  45. ctn_get_step(), ctn_get_err_str(), ctn_get_ap(), ctn_get_soc(), ctn_get_aps(),
  46. ctn_get_chgable(), ctn_get_dhgable(), ctn_get_tick(), ctn_get_socc(), ctn_get_socd(),
  47. ctn_get_cell_otp(), ctn_get_cell_utp(), ctn_get_bsytikchk_en(), ctn_get_bsytikchk_from_host(), ctn_get_bsytikchk_timeout(),
  48. ctn_get_pcs_bsytiksnd_en(), ctn_get_norm_cap(), ctn_get_norm_pow());
  49. // pcs
  50. pcs_get_bkds_data(itm_buf_temp);
  51. sprintf(itm_buf_pcs, ",%s", itm_buf_temp);
  52. // pack
  53. pack_get_bkds_mbmu_data(itm_buf_temp);
  54. sprintf(itm_buf_bms, ",%s", itm_buf_temp);
  55. // meter
  56. memset(itm_buf_meter, 0, sizeof(itm_buf_meter));
  57. meter_get_bkds_data(itm_buf_temp);
  58. sprintf(itm_buf_meter, ",%s", itm_buf_temp);
  59. // ac
  60. memset(itm_buf_ac, 0, sizeof(itm_buf_ac));
  61. // ac_get_bkds_data(itm_buf_temp);
  62. sprintf(itm_buf_ac, ",%s", itm_buf_temp);
  63. // ems
  64. sprintf(itm_buf_ems, ",\"ems\":\
  65. {\
  66. \"state\":\"%s\",\"tick\":%d,\"tick_ave\":%d,\"tick_cur\":%d,\"tick_max\":%d,\
  67. \"con_com_ap\":%d,\"con_com_ae\":%.1f,\"con_pos_ae\":%.1f,\"con_neg_ae\":%.1f,\"load_com_ap\":%d,\
  68. \"load_com_ae\":%.1f,\"load_pos_ae\":%.1f,\"load_neg_ae\":%.1f\
  69. }\
  70. ",
  71. ems_get_state_str(), ems_get_tick(), ems_get_tick_ave(), ems_get_tick_cur(), ems_get_transf_con_com_ap(),
  72. ems_get_tick_max(), ems_get_transf_con_com_ae(), ems_get_transf_con_pos_ae(), ems_get_transf_con_neg_ae(), ems_get_transf_load_com_ap(),
  73. ems_get_transf_load_com_ae(), ems_get_transf_load_pos_ae(), ems_get_transf_load_neg_ae());
  74. // plc
  75. plc_get_bkds_data(itm_buf_temp);
  76. sprintf(itm_buf_plc, ",%s", itm_buf_temp);
  77. // ups
  78. ups_get_bkds_data(itm_buf_temp);
  79. sprintf(itm_buf_ups, ",%s", itm_buf_temp);
  80. // log_info("%s,ups:%s\n",__func__,itm_buf_ups);
  81. // re_ws_n
  82. memset(itm_buf_th, 0, sizeof(itm_buf_th));
  83. env_get_bkds_data(DEVM_RS_WS_N, itm_buf_temp);
  84. sprintf(itm_buf_th, "%s", itm_buf_temp);
  85. // gas
  86. memset(itm_buf_gas, 0, sizeof(itm_buf_gas));
  87. env_get_bkds_data(DEVM_SGA500E, itm_buf_temp);
  88. sprintf(itm_buf_gas, ",%s", itm_buf_temp);
  89. // log_info("%s,gas:%s\n",__func__,itm_buf_gas);
  90. // chan
  91. memset(itm_buf_chan, 0, sizeof(itm_buf_chan));
  92. chan_get_bkds_data(itm_buf_chan);
  93. // log_info("%s,chan:%s\n",__func__,itm_buf_chan);
  94. // mqtt
  95. memset(itm_buf_mqtt, 0, sizeof(itm_buf_mqtt));
  96. sprintf(itm_buf_mqtt, ",\"mqtt\":[");
  97. // tbmqtt
  98. memset(itm_buf_temp, 0, sizeof(itm_buf_temp));
  99. sprintf(itm_buf_temp, "{\"info\":\"%s\",\"state\":\"%s\",\"stp\":%d,\"err\":\"%s\",\"tick\":%d,\
  100. \"tick_max\":%.1f,\"enable\":%d,\"tz\":%d,\"servip\":\"%s\",\"servport\":%d,\
  101. \"client_id\":\"%s\",\"txbuf_usage\":%.1f,\"access_token\":\"%s\"}",
  102. "tb", tb_get_state_str(), tb_get_stp(), tb_get_err_str(), tb_get_tick(),
  103. tb_get_timing_max(), tb_get_enable(), tbmqtt_get_tz(), tb_get_servip_str(), tb_get_servport(), tb_get_client_id(),
  104. tb_get_txbuf_usage(), tb_get_access_token());
  105. strcat(itm_buf_mqtt, itm_buf_temp);
  106. strcat(itm_buf_mqtt, ",");
  107. // cloud mqtt
  108. memset(itm_buf_temp, 0, sizeof(itm_buf_temp));
  109. sprintf(itm_buf_temp, "{\"info\":\"%s\",\"state\":\"%s\",\"stp\":%d,\"err\":\"%s\",\"tick\":%d,\
  110. \"tick_ave\":%.1f,\"tick_cur\":%.1f,\"tick_max\":%.1f,\"enable\":%d,\"tz\":%d,\
  111. \"servip\":\"%s\",\"servport\":%d,\"client_id\":\"%s\",\"txbuf_usage\":%.1f,\"access_token\":\"%s\"}",
  112. "cloud", cloud_get_state_str(), cloud_get_stp(), cloud_get_err_str(), cloud_get_tick(),
  113. cloud_get_timing_ave(), cloud_get_timing_cur(), cloud_get_timing_max(), cloud_get_enable(), cloud_get_tz(),
  114. cloud_get_servip_str(), cloud_get_servport(), cloud_get_client_id(), cloud_get_txbuf_usage(), cloud_get_access_token());
  115. strcat(itm_buf_mqtt, itm_buf_temp);
  116. strcat(itm_buf_mqtt, "]");
  117. // log_info("%s,mqtt:%s\n",__func__,itm_buf_mqtt);
  118. bkds_gen_datetimestr(buf, sizeof(buf));
  119. // log_info("%s,bms:%s\n",__func__,itm_buf_bms);
  120. sprintf(SHM->rsp.buf, "{\"dt\":\"%s\",\"values\":{%s%s%s%s%s%s%s%s\
  121. ,\"env\":{%s%s}\
  122. ,\"comm\":{%s%s}}}",
  123. buf,
  124. itm_buf_sys, itm_buf_pcs, itm_buf_bms, itm_buf_meter, itm_buf_ac, itm_buf_ems,
  125. itm_buf_plc, itm_buf_ups, itm_buf_th, itm_buf_gas, itm_buf_chan, itm_buf_mqtt);
  126. printf("%s,value:%s\n", __func__, SHM->rsp.buf);
  127. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  128. SHM->rsp.serial = SHM->cmd.serial;
  129. SHM->rsp.ready = 1;
  130. }
  131. static int bkds_proc_get_bms(int sub_idx)
  132. {
  133. char itm_buf_mbmu[1024];
  134. char itm_buf_sbmu_sum[1024 * 3];
  135. char itm_buf_sbmu_summary[1024];
  136. char itm_buf_sbmu_mod[1024 * 5];
  137. char buf[128];
  138. char itm_buf_temp[1024];
  139. int i = 0;
  140. // mbu
  141. sprintf(itm_buf_mbmu, "\"mbmu\":\
  142. {\
  143. \"info\":\"%s\",\"model\":\"%s\",\"state\":\"%s\",\"step\":%d,\"err\":\"%s\",\
  144. \"tick\":%d,\"chan_idx\":%d,\"adr\":%d,\"comm_state\":\"%s\",\"emshbsnd_en\":%d,\
  145. \"bmshbchk_en\":%d,\"sbmu_idx\":%d,\"sbmu_nbr\":%d,\"mod_nbr_in_sbmu\":%d,\"cell_nbr_in_mod\":%d,\
  146. \"temp_nbr_in_mod\":%d,\"v\":%d,\"c\":%d,\"soc\":%.1f,\"cellvave\":%.3f,\
  147. \"cellvmax\":%.3f,\"cellvmin\":%.3f,\"celltave\":%d,\"celltmax\":%d,\"celltmin\":%d,\
  148. \"maxdhgc\":%d,\"maxchgc\":%d\
  149. }",
  150. "bms", pack_get_model_str(), pack_get_state_str(), pack_get_step(), pack_get_err_str(),
  151. pack_get_tick(), pack_get_chan_idx(), pack_get_adr(), pack_get_comm_state_str(), pack_is_emshb_sending_en(),
  152. pack_is_bmshb_check_en(), sub_idx, pack_get_sbmu_nbr(), pack_get_mod_nbr_in_sbmu(), pack_get_cell_nbr_in_mod(),
  153. pack_get_temp_nbr_in_mod(), pack_get_v(), pack_get_c(), pack_get_soc(), pack_get_cellvave(),
  154. pack_get_cellvmax(), pack_get_cellvmin(), pack_get_celltave(), pack_get_celltmax(), pack_get_celltmin(),
  155. pack_get_max_dhgc(), pack_get_max_chgc());
  156. // sbmu_summary
  157. sprintf(itm_buf_sbmu_sum, ",\"sbmu_summary\":[");
  158. for (i = 1; i <= pack_get_sbmu_nbr(); i++)
  159. {
  160. sprintf(itm_buf_temp, "{\"v\":%d,\"c\":%d,\"soc\":%.1f,\"soh\":%d}",
  161. pack_get_sub_v(i), pack_get_sub_c(i), pack_get_sub_soc(i), pack_get_sub_soh(i));
  162. strcat(itm_buf_sbmu_sum, itm_buf_temp);
  163. if (i != pack_get_sbmu_nbr())
  164. {
  165. strcat(itm_buf_sbmu_sum, ",");
  166. }
  167. }
  168. strcat(itm_buf_sbmu_sum, "]");
  169. // sbmu--summary
  170. sprintf(itm_buf_sbmu_summary, ",\"sbmu\":{\"summary\":{\
  171. \"v\":%d,\"c\":%d,\"soc\":%.1f,\"soh\":%d\
  172. }",
  173. pack_get_sub_v(sub_idx), pack_get_sub_c(sub_idx), pack_get_sub_soc(sub_idx), pack_get_sub_soh(sub_idx));
  174. // mode
  175. sprintf(itm_buf_sbmu_mod, ",\"mod\":[");
  176. for (i = 1; i <= pack_get_mod_nbr_in_sbmu(); i++)
  177. {
  178. sprintf(itm_buf_temp, "{\"cellv\":[");
  179. int j = 0;
  180. char temp_buf[1024];
  181. // cell
  182. double cellv_max = -1.0;
  183. double cellv_min = 5.0;
  184. double cellv_ave = 0.0;
  185. double v = 0.0;
  186. for (j = 1; j <= pack_get_cell_nbr_in_mod(); j++)
  187. {
  188. v = pack_get_sub_module_cellv(sub_idx, i, j);
  189. sprintf(temp_buf, "%.3f", v);
  190. strcat(itm_buf_temp, temp_buf);
  191. if (j != pack_get_cell_nbr_in_mod())
  192. {
  193. strcat(itm_buf_temp, ",");
  194. }
  195. cellv_ave += v / pack_get_cell_nbr_in_mod();
  196. if (cellv_max < v)
  197. cellv_max = v;
  198. if (cellv_min > v)
  199. cellv_min = v;
  200. }
  201. strcat(itm_buf_temp, "],\"cellt\":[");
  202. // tmp
  203. int cellt_max = -100;
  204. int cellt_min = 100;
  205. int cellt_ave = 0.0;
  206. int t = 0;
  207. for (j = 1; j <= pack_get_temp_nbr_in_mod(); j++)
  208. {
  209. t = pack_get_sub_module_cellt(sub_idx, i, j);
  210. sprintf(temp_buf, "%d", t);
  211. strcat(itm_buf_temp, temp_buf);
  212. if (j != pack_get_temp_nbr_in_mod())
  213. {
  214. strcat(itm_buf_temp, ",");
  215. }
  216. cellt_ave += t / pack_get_temp_nbr_in_mod();
  217. if (cellt_max < t)
  218. cellt_max = t;
  219. if (cellt_min > t)
  220. cellt_min = t;
  221. }
  222. strcat(itm_buf_temp, "],");
  223. // vmax....
  224. sprintf(temp_buf, "\"vmax\":%.3f,\"vave\":%.3f,\"vmin\":%.3f,\"tmax\":%d,\"tave\":%d,\"tmin\":%d",
  225. cellv_max, cellv_ave, cellv_min, cellt_max, cellt_ave, cellt_min);
  226. strcat(itm_buf_temp, temp_buf);
  227. strcat(itm_buf_temp, "}");
  228. strcat(itm_buf_sbmu_mod, itm_buf_temp);
  229. if (i != pack_get_mod_nbr_in_sbmu())
  230. {
  231. strcat(itm_buf_sbmu_mod, ",");
  232. }
  233. }
  234. strcat(itm_buf_sbmu_mod, "]");
  235. // log_info("%s,mqtt:%s\n",__func__,itm_buf_mqtt);
  236. bkds_gen_datetimestr(buf, sizeof(buf));
  237. // log_info("%s,bms:%s\n",__func__,itm_buf_bms);
  238. sprintf(SHM->rsp.buf, "{\"dt\":\"%s\",\"values\":{%s%s%s%s}}}", buf,
  239. itm_buf_mbmu, itm_buf_sbmu_sum, itm_buf_sbmu_summary, itm_buf_sbmu_mod);
  240. // printf("%s,value:%s\n",__func__,SHM->rsp.buf);
  241. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  242. SHM->rsp.serial = SHM->cmd.serial;
  243. SHM->rsp.ready = 1;
  244. }
  245. static int bkds_proc_get_ems()
  246. {
  247. char itm_buf_ems[1024 * 4];
  248. char itm_buf_pcurv_info[1024];
  249. char itm_buf_pcurv_data[1024];
  250. char buf[128];
  251. sprintf(itm_buf_ems, "\
  252. \"state\":\"%s\",\"step\":%d,\"err\":\"%s\",\"tick\":%d,\"tick_ave\":%d,\
  253. \"tick_cur\":%d,\"tick_max\":%d,\"pow_reg_en\":%d,\"lo\":%d,\"hi\":%d,\
  254. \"timer\":%d,\"intv\":%d,\"aps_min\":%d,\"aps_max\":%d,\"conm_model\":\"%s\",\
  255. \"conm_idx\":%d,\"conm_com_ap\":%f,\"conm_com_ae\":%f,\"conm_pos_ae\":%f,\"conm_neg_ae\":%f,\
  256. \"loadm_model\":\"%s\",\"loadm_idx\":%d,\"loadm_com_ap\":%f,\"loadm_com_ae\":%f,\"loadm_pos_ae\":%f,\
  257. \"loadm_neg_ae\":%f,\"timeseg_idx\":%d,\"timeseg_status\":\"%s\",\"timeseg_type\":\"%s\",\"estats_step\":%d,\
  258. \"day_sharp_pos_ae\":%f,\"day_sharp_neg_ae\":%f,\"day_peak_pos_ae\":%f,\"day_peak_neg_ae\":%f,\"day_flat_pos_ae\":%f,\
  259. \"day_flat_neg_ae\":%f,\"day_valley_pos_ae\":%f,\"day_valley_neg_ae\":%f,\"mode\":\"%s\"\
  260. ",
  261. ems_get_state_str(), ems_get_step(), ems_get_err_str(), ems_get_tick(), ems_get_tick_ave(),
  262. ems_get_tick_cur(), ems_get_tick_max(), ems_get_regulate_en(), ems_get_reglo(), ems_get_reghi(),
  263. ems_get_pow_reg_timer(), ems_get_pow_reg_intv(), ems_get_pow_reg_aps_min(), ems_get_pow_reg_aps_max(), ems_get_transf_conm_model_str(),
  264. ems_get_transf_conm_idx(), ems_get_transf_con_com_ap(), ems_get_transf_con_com_ae(), ems_get_transf_con_pos_ae(), ems_get_transf_con_neg_ae(),
  265. ems_get_transf_load_model_str(), ems_get_transf_loadm_idx(), ems_get_transf_load_com_ap(), ems_get_transf_load_com_ae(), ems_get_transf_load_pos_ae(),
  266. ems_get_transf_load_neg_ae(), ems_get_timeseg_idx(), ems_get_timeseg_status_str(), ems_get_timeseg_type_str(), ems_get_estats_step(),
  267. ems_get_day_sharp_pos_ae(), ems_get_day_sharp_neg_ae(), ems_get_day_peak_pos_ae(), ems_get_day_peak_neg_ae(), ems_get_day_flat_pos_ae(),
  268. ems_get_day_flat_neg_ae(), ems_get_day_valley_pos_ae(), ems_get_day_valley_neg_ae(), ems_get_modestr());
  269. sprintf(itm_buf_pcurv_info, ",\"pcurv\":{\
  270. \"idx\":%d,\"info\":\"%s\",\"status\":\"%s\",\"resolution\":%d,\"aps\":%d\
  271. ",
  272. ems_get_pcurv_idx(), ems_get_pcurv_info_str(), ems_get_pcurv_status_str(), 15, ems_get_pcurv_aps());
  273. sprintf(itm_buf_pcurv_data, ",\"values\":[");
  274. char temp_buf[100];
  275. int i = 0;
  276. int hh = 0;
  277. int mm = 0;
  278. struct pcurv_t *pc = ems_get_pcurv_t();
  279. for (i < 0; i < 96; i++)
  280. { // 5min 1 point -> 15min 1 point
  281. hh = i * 15 / 60;
  282. mm = i * 15 % 60;
  283. mm = mm / 5 * 5;
  284. sprintf(temp_buf, "%d", pc->aps[hh][mm]);
  285. strcat(itm_buf_pcurv_data, temp_buf);
  286. if (i < 96 - 1)
  287. {
  288. strcat(itm_buf_pcurv_data, ",");
  289. }
  290. }
  291. strcat(itm_buf_pcurv_data, "]");
  292. // log_info("%s,mqtt:%s\n",__func__,itm_buf_mqtt);
  293. bkds_gen_datetimestr(buf, sizeof(buf));
  294. // log_info("%s,bms:%s\n",__func__,itm_buf_bms);
  295. sprintf(SHM->rsp.buf, "{\"dt\":\"%s\",\"values\":{%s%s%s}}}", buf,
  296. itm_buf_ems, itm_buf_pcurv_info, itm_buf_pcurv_data);
  297. printf("%s,value:%s\n", __func__, SHM->rsp.buf);
  298. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  299. SHM->rsp.serial = SHM->cmd.serial;
  300. SHM->rsp.ready = 1;
  301. }
  302. static int bkds_proc_ctn_send_cmd()
  303. {
  304. if (strcmp(SHM->cmd.buf, "stdby") == 0)
  305. {
  306. ctn_send_cmd(CMD_SM_STDBY);
  307. }
  308. else if (strcmp(SHM->cmd.buf, "stop") == 0)
  309. {
  310. ctn_send_cmd(CMD_SM_STOP);
  311. }
  312. else if (strcmp(SHM->cmd.buf, "ready") == 0)
  313. {
  314. ctn_send_cmd(CMD_SM_READY);
  315. }
  316. else if (strcmp(SHM->cmd.buf, "offgrid") == 0)
  317. {
  318. ctn_send_cmd(CMD_SM_OFFGRID);
  319. }
  320. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  321. SHM->rsp.serial = SHM->cmd.serial;
  322. SHM->rsp.ready = 1;
  323. }
  324. static int bkds_proc_ctn_set_bystikchk_en()
  325. {
  326. int ret = 0;
  327. if (SHM->cmd.buf[0] == 0)
  328. {
  329. return -1;
  330. }
  331. int bystikchk_en = atoi(SHM->cmd.buf);
  332. if (bystikchk_en != 1 && bystikchk_en != 0)
  333. {
  334. return -1;
  335. }
  336. else
  337. {
  338. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, bystikchk_en);
  339. (bystikchk_en == 1) ? ctn_enable_bsytikchk() : ctn_disable_bsytikchk();
  340. }
  341. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  342. SHM->rsp.serial = SHM->cmd.serial;
  343. SHM->rsp.ready = 1;
  344. return ret;
  345. }
  346. static int bkds_proc_ctn_set_pcs_bystikchk_en()
  347. {
  348. int ret = 0;
  349. if (SHM->cmd.buf[0] == 0)
  350. {
  351. return -1;
  352. }
  353. int bystikchk_en = atoi(SHM->cmd.buf);
  354. if (bystikchk_en != 1 && bystikchk_en != 0)
  355. {
  356. return -1;
  357. }
  358. else
  359. {
  360. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, bystikchk_en);
  361. (bystikchk_en == 1) ? ctn_enable_pcs_bsytiksnd() : ctn_disable_pcs_bsytiksnd();
  362. }
  363. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  364. SHM->rsp.serial = SHM->cmd.serial;
  365. SHM->rsp.ready = 1;
  366. return ret;
  367. }
  368. static int bkds_proc_ctn_set_socd()
  369. {
  370. int ret = 0;
  371. if (SHM->cmd.buf[0] == 0)
  372. {
  373. return -1;
  374. }
  375. double socd = atof(SHM->cmd.buf);
  376. log_info("%s,cmd:%s,param:%f", __func__, SHM->cmd.szcmd, socd);
  377. ctn_set_socd(socd);
  378. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  379. SHM->rsp.serial = SHM->cmd.serial;
  380. SHM->rsp.ready = 1;
  381. return ret;
  382. }
  383. static int bkds_proc_ctn_set_socc()
  384. {
  385. int ret = 0;
  386. if (SHM->cmd.buf[0] == 0)
  387. {
  388. return -1;
  389. }
  390. double socc = atof(SHM->cmd.buf);
  391. ctn_set_socc(socc);
  392. log_info("%s,cmd:%s,param:%f", __func__, SHM->cmd.szcmd, socc);
  393. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  394. SHM->rsp.serial = SHM->cmd.serial;
  395. SHM->rsp.ready = 1;
  396. return ret;
  397. }
  398. static int bkds_proc_ctn_save_param()
  399. {
  400. int ret = 0;
  401. ctn_cfg_save_socd();
  402. ctn_cfg_save_socc();
  403. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  404. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  405. SHM->rsp.serial = SHM->cmd.serial;
  406. SHM->rsp.ready = 1;
  407. return ret;
  408. }
  409. static int bkds_proc_bms_set_sbmu_idx()
  410. {
  411. int ret = 0;
  412. if (SHM->cmd.buf[0] == 0)
  413. {
  414. return -1;
  415. }
  416. int idx = atoi(SHM->cmd.buf);
  417. if (idx < 1 || idx > pack_get_sbmu_nbr())
  418. {
  419. return -1;
  420. }
  421. else
  422. {
  423. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, idx);
  424. sbmu_idx = idx;
  425. }
  426. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  427. SHM->rsp.serial = SHM->cmd.serial;
  428. SHM->rsp.ready = 1;
  429. return ret;
  430. }
  431. static int bkds_proc_bms_set_sm_cmd()
  432. {
  433. int ret = 0;
  434. int cmd = 0;
  435. if (SHM->cmd.buf[0] == 0)
  436. {
  437. return -1;
  438. }
  439. cmd = atoi(SHM->cmd.buf);
  440. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  441. pack_send_sm_cmd(cmd);
  442. return ret;
  443. }
  444. static int bkds_proc_bms_set_emshsnd_en()
  445. {
  446. int ret = 0;
  447. if (SHM->cmd.buf[0] == 0)
  448. {
  449. return -1;
  450. }
  451. int en = atoi(SHM->cmd.buf);
  452. if (en != 1 && en != 0)
  453. {
  454. return -1;
  455. }
  456. else
  457. {
  458. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, en);
  459. pack_set_emshb_sending_en(en);
  460. }
  461. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  462. SHM->rsp.serial = SHM->cmd.serial;
  463. SHM->rsp.ready = 1;
  464. return ret;
  465. }
  466. static int bkds_proc_bms_set_bmsshbchk_en()
  467. {
  468. int ret = 0;
  469. if (SHM->cmd.buf[0] == 0)
  470. {
  471. return -1;
  472. }
  473. int en = atoi(SHM->cmd.buf);
  474. if (en != 1 && en != 0)
  475. {
  476. return -1;
  477. }
  478. else
  479. {
  480. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, en);
  481. pack_set_bmshb_chk_en(en);
  482. }
  483. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  484. SHM->rsp.serial = SHM->cmd.serial;
  485. SHM->rsp.ready = 1;
  486. return ret;
  487. }
  488. static int bkds_proc_pcs_set_sm_cmd()
  489. {
  490. int ret = 0;
  491. int cmd = 0;
  492. if (SHM->cmd.buf[0] == 0)
  493. {
  494. return -1;
  495. }
  496. cmd = atoi(SHM->cmd.buf);
  497. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  498. pcs_send_sm_cmd(cmd);
  499. return ret;
  500. }
  501. static int bkds_proc_pcs_set_dev_startcmd()
  502. {
  503. int ret = 0;
  504. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  505. pcs_set_dev_startcmd();
  506. return ret;
  507. }
  508. static int bkds_proc_pcs_set_dev_stopcmd()
  509. {
  510. int ret = 0;
  511. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  512. pcs_set_dev_stopcmd();
  513. return ret;
  514. }
  515. static int bkds_proc_pcs_set_dev_idlecmd()
  516. {
  517. int ret = 0;
  518. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  519. pcs_set_dev_idlecmd();
  520. return ret;
  521. }
  522. static int bkds_proc_pcs_set_dev_resetcmd()
  523. {
  524. int ret = 0;
  525. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  526. pcs_set_dev_resetcmd();
  527. return ret;
  528. }
  529. static int bkds_proc_pcs_set_aps()
  530. {
  531. int ret = 0;
  532. int aps = 0;
  533. if (SHM->cmd.buf[0] == 0)
  534. {
  535. return -1;
  536. }
  537. aps = atoi(SHM->cmd.buf);
  538. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, aps);
  539. pcs_set_aps(aps);
  540. return ret;
  541. }
  542. static int bkds_proc_pcs_set_dev_datetime()
  543. {
  544. int ret = 0;
  545. int aps = 0;
  546. int y, m, d, h, min, s;
  547. log_info("%s,cmd:%s,param:%s", __func__, SHM->cmd.szcmd, "none");
  548. misc_get_datetime(&y, &m, &d, &h, &min, &s);
  549. pcs_set_datetime(y, m, d, h, min, s);
  550. return ret;
  551. }
  552. static int bkds_proc_pcs_set_dac_param_en()
  553. {
  554. int ret = 0;
  555. int en = 0;
  556. if (SHM->cmd.buf[0] == 0)
  557. {
  558. return -1;
  559. }
  560. en = atoi(SHM->cmd.buf);
  561. if (en != 1 && en != 0)
  562. {
  563. return -1;
  564. }
  565. else
  566. {
  567. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, en);
  568. pcs_set_dac_param_en(en);
  569. }
  570. return ret;
  571. }
  572. static int bkds_proc_ems_save_pcurv()
  573. {
  574. int ret = 0;
  575. int idx = 0;
  576. if (SHM->cmd.buf[0] == 0)
  577. {
  578. return -1;
  579. }
  580. idx = atoi(SHM->cmd.buf);
  581. if (idx < 1 && idx > 16)
  582. {
  583. return -1;
  584. }
  585. else
  586. {
  587. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, idx);
  588. ems_save_pcurv(idx);
  589. }
  590. return ret;
  591. }
  592. static int bkds_proc_ems_set_pcurv_idx()
  593. {
  594. int ret = 0;
  595. int idx = 0;
  596. if (SHM->cmd.buf[0] == 0)
  597. {
  598. return -1;
  599. }
  600. idx = atoi(SHM->cmd.buf);
  601. if (idx < 1 && idx > 16)
  602. {
  603. return -1;
  604. }
  605. else
  606. {
  607. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, idx);
  608. ems_set_pcurv(idx);
  609. }
  610. return ret;
  611. }
  612. static int bkds_proc_meter_set_sm_cmd()
  613. {
  614. int ret = 0;
  615. int cmd = 0;
  616. if (SHM->cmd.buf[0] == 0)
  617. {
  618. return -1;
  619. }
  620. cmd = atoi(SHM->cmd.buf);
  621. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  622. meter_send_sm_cmd_all(cmd);
  623. return ret;
  624. }
  625. static int bkds_proc_ems_set_pcurv()
  626. {
  627. int ret = 0;
  628. int idx = 0;
  629. int start_hh = 0;
  630. int start_mm = 0;
  631. int end_hh = 0;
  632. int end_mm = 0;
  633. int aps = 0;
  634. if (SHM->cmd.buf[0] == 0)
  635. {
  636. return -1;
  637. }
  638. cJSON *root = cJSON_Parse(SHM->cmd.buf);
  639. if (root == NULL)
  640. {
  641. return -2;
  642. }
  643. cJSON *start_Item = cJSON_GetObjectItem(root, "start");
  644. if (start_Item == NULL)
  645. {
  646. return -3;
  647. }
  648. cJSON *start_hh_Item = cJSON_GetObjectItem(start_Item, "hh");
  649. cJSON *start_nn_Item = cJSON_GetObjectItem(start_Item, "nn");
  650. if (start_hh_Item == NULL || start_nn_Item == NULL)
  651. {
  652. return -4;
  653. }
  654. start_hh = atoi(cJSON_GetStringValue(start_hh_Item));
  655. start_mm = atoi(cJSON_GetStringValue(start_nn_Item));
  656. cJSON *end_Item = cJSON_GetObjectItem(root, "end");
  657. if (start_Item == NULL)
  658. {
  659. return -5;
  660. }
  661. cJSON *end_hh_Item = cJSON_GetObjectItem(end_Item, "hh");
  662. cJSON *end_nn_Item = cJSON_GetObjectItem(end_Item, "nn");
  663. if (end_hh_Item == NULL || end_nn_Item == NULL)
  664. {
  665. return -6;
  666. }
  667. end_hh = atoi(cJSON_GetStringValue(end_hh_Item));
  668. end_mm = atoi(cJSON_GetStringValue(end_nn_Item));
  669. cJSON *aps_Item = cJSON_GetObjectItem(root, "aps");
  670. if (aps_Item == NULL)
  671. {
  672. return -7;
  673. }
  674. aps = atoi(cJSON_GetStringValue(aps_Item));
  675. log_info("%s,start:%d,%d,end:%d,%d", __func__, start_hh, start_mm, end_hh, end_mm, aps);
  676. ems_edit_pcurv(start_hh, start_mm, end_hh, end_mm, aps);
  677. cJSON_Delete(root);
  678. return ret;
  679. }
  680. static int bkds_proc_evn_set_sm_cmd()
  681. {
  682. int ret = 0;
  683. int cmd = 0;
  684. if (SHM->cmd.buf[0] == 0)
  685. {
  686. return -1;
  687. }
  688. cmd = atoi(SHM->cmd.buf);
  689. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  690. env_send_sm_cmd_all(DEVM_RS_WS_N, cmd);
  691. env_send_sm_cmd_all(DEVM_SGA500E, cmd);
  692. return ret;
  693. }
  694. static int bkds_proc_plc_set_sm_cmd()
  695. {
  696. int ret = 0;
  697. int cmd = 0;
  698. if (SHM->cmd.buf[0] == 0)
  699. {
  700. return -1;
  701. }
  702. cmd = atoi(SHM->cmd.buf);
  703. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  704. plc_send_sm_cmd(cmd);
  705. return ret;
  706. }
  707. static int bkds_proc_ups_set_sm_cmd()
  708. {
  709. int ret = 0;
  710. int cmd = 0;
  711. if (SHM->cmd.buf[0] == 0)
  712. {
  713. return -1;
  714. }
  715. cmd = atoi(SHM->cmd.buf);
  716. log_info("%s,cmd:%s,param:%d", __func__, SHM->cmd.szcmd, cmd);
  717. ups_send_sm_cmd(cmd);
  718. return ret;
  719. }
  720. static int bkds_proc_cmd()
  721. {
  722. if (strcmp(SHM->cmd.szcmd, "bms_set_sbmu_idx") == 0)
  723. {
  724. bkds_proc_bms_set_sbmu_idx();
  725. }
  726. else if (strcmp(SHM->cmd.szcmd, "ctn_set_bsytikchk_en") == 0)
  727. {
  728. bkds_proc_ctn_set_bystikchk_en();
  729. }
  730. else if (strcmp(SHM->cmd.szcmd, "ctn_set_pcs_bsytiksnd_en") == 0)
  731. {
  732. bkds_proc_ctn_set_pcs_bystikchk_en();
  733. }
  734. else if (strcmp(SHM->cmd.szcmd, "ctn_set_socd") == 0)
  735. {
  736. bkds_proc_ctn_set_socd();
  737. }
  738. else if (strcmp(SHM->cmd.szcmd, "ctn_set_socc") == 0)
  739. {
  740. bkds_proc_ctn_set_socc();
  741. }
  742. else if (strcmp(SHM->cmd.szcmd, "ctn_save_param") == 0)
  743. {
  744. bkds_proc_ctn_save_param();
  745. }
  746. else if (strcmp(SHM->cmd.szcmd, "bms_set_sm_cmd") == 0)
  747. {
  748. bkds_proc_bms_set_sm_cmd();
  749. }
  750. else if (strcmp(SHM->cmd.szcmd, "bms_set_emshbsnd_en") == 0)
  751. {
  752. bkds_proc_bms_set_emshsnd_en();
  753. }
  754. else if (strcmp(SHM->cmd.szcmd, "bms_set_bmshbchk_en") == 0)
  755. {
  756. bkds_proc_bms_set_bmsshbchk_en();
  757. }
  758. else if (strcmp(SHM->cmd.szcmd, "pcs_set_sm_cmd") == 0)
  759. {
  760. bkds_proc_bms_set_sm_cmd();
  761. }
  762. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dev_startcmd") == 0)
  763. {
  764. bkds_proc_pcs_set_dev_startcmd();
  765. }
  766. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dev_stopcmd") == 0)
  767. {
  768. bkds_proc_pcs_set_dev_stopcmd();
  769. }
  770. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dev_idlecmd") == 0)
  771. {
  772. bkds_proc_pcs_set_dev_idlecmd();
  773. }
  774. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dev_resetcmd") == 0)
  775. {
  776. bkds_proc_pcs_set_dev_resetcmd();
  777. }
  778. else if (strcmp(SHM->cmd.szcmd, "pcs_set_aps") == 0)
  779. {
  780. bkds_proc_pcs_set_aps();
  781. }
  782. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dev_datetime") == 0)
  783. {
  784. bkds_proc_pcs_set_dev_datetime();
  785. }
  786. else if (strcmp(SHM->cmd.szcmd, "pcs_set_dac_param_en") == 0)
  787. {
  788. bkds_proc_pcs_set_dac_param_en();
  789. }
  790. else if (strcmp(SHM->cmd.szcmd, "set_pcurv") == 0)
  791. {
  792. bkds_proc_ems_set_pcurv();
  793. }
  794. else if (strcmp(SHM->cmd.szcmd, "set_pcurv_idx") == 0)
  795. {
  796. bkds_proc_ems_set_pcurv_idx();
  797. }
  798. else if (strcmp(SHM->cmd.szcmd, "save_pcurv") == 0)
  799. {
  800. bkds_proc_ems_save_pcurv();
  801. }
  802. else if (strcmp(SHM->cmd.szcmd, "plc_set_sm_cmd") == 0)
  803. {
  804. bkds_proc_plc_set_sm_cmd();
  805. }
  806. else if (strcmp(SHM->cmd.szcmd, "evn_set_sm_cmd") == 0)
  807. {
  808. bkds_proc_evn_set_sm_cmd();
  809. }
  810. else if (strcmp(SHM->cmd.szcmd, "meter_set_sm_cmd") == 0)
  811. {
  812. bkds_proc_meter_set_sm_cmd();
  813. }
  814. else if (strcmp(SHM->cmd.szcmd, "ups_set_sm_cmd") == 0)
  815. {
  816. bkds_proc_ups_set_sm_cmd();
  817. }
  818. else
  819. {
  820. log_info("%s,unkown cmd:%s", __func__, SHM->cmd.szcmd);
  821. return -1;
  822. }
  823. }
  824. static int bkds_proc_ctn_set_aps()
  825. {
  826. ctn_set_aps(atoi(SHM->cmd.buf));
  827. strcpy(SHM->rsp.szcmd, SHM->cmd.szcmd);
  828. SHM->rsp.serial = SHM->cmd.serial;
  829. SHM->rsp.ready = 1;
  830. }
  831. static thrd_bkds(void *param)
  832. {
  833. syslog(LOG_INFO, "%s, ++", __func__);
  834. sleep(10);
  835. while (1)
  836. {
  837. if (SHM->cmd.ready == 1)
  838. {
  839. SHM->cmd.ready = 0;
  840. if (strcmp(SHM->cmd.szcmd, "set_ctn_cmd") == 0)
  841. {
  842. bkds_proc_ctn_send_cmd();
  843. }
  844. else if (strcmp(SHM->cmd.szcmd, "ctn_get_data") == 0)
  845. {
  846. bkds_proc_get_ctn_data();
  847. }
  848. else if (strcmp(SHM->cmd.szcmd, "bms_get_data") == 0)
  849. {
  850. if (sbmu_idx < 1 || sbmu_idx > 10)
  851. {
  852. sbmu_idx = 1;
  853. }
  854. bkds_proc_get_bms(sbmu_idx);
  855. }
  856. else if (strcmp(SHM->cmd.szcmd, "set_ctn_aps") == 0)
  857. {
  858. bkds_proc_ctn_set_aps();
  859. }
  860. else if (strcmp(SHM->cmd.szcmd, "get_ems_data") == 0)
  861. {
  862. bkds_proc_get_ems();
  863. }
  864. else
  865. {
  866. bkds_proc_cmd();
  867. }
  868. }
  869. usleep(10000); // 10ms
  870. }
  871. }
  872. int bkds_init()
  873. {
  874. pthread_t xthrd;
  875. int ret = 0;
  876. int shm_id = -1;
  877. void *shared_memory = NULL;
  878. shm_id = shmget((key_t)BKDSHMID, sizeof(struct bkd_shm_t), 0666 | IPC_CREAT);
  879. if (shm_id < 0)
  880. {
  881. switch (errno)
  882. {
  883. case EINVAL:
  884. syslog(LOG_INFO, "%s shmget fail:EINVAL\n", __func__);
  885. break;
  886. case EEXIST:
  887. syslog(LOG_INFO, "%s shmget fail:EEXIST\n", __func__);
  888. break;
  889. case EIDRM:
  890. syslog(LOG_INFO, "%s shmget fail:EIDRM\n", __func__);
  891. break;
  892. case ENOSPC:
  893. syslog(LOG_INFO, "%s shmget fail:ENOSPC\n", __func__);
  894. break;
  895. case ENOENT:
  896. syslog(LOG_INFO, "%s shmget fail:ENOENT\n", __func__);
  897. break;
  898. case EACCES:
  899. syslog(LOG_INFO, "%s shmget fail:EACCES\n", __func__);
  900. break;
  901. case ENOMEM:
  902. syslog(LOG_INFO, "%s shmget fail:ENOMEM\n", __func__);
  903. break;
  904. default:
  905. syslog(LOG_INFO, "%s shmget fail:unknown err\n", __func__);
  906. break;
  907. }
  908. ret = -1;
  909. goto leave;
  910. }
  911. shared_memory = shmat(shm_id, NULL, 0);
  912. if (shared_memory == NULL)
  913. {
  914. ret = -2;
  915. syslog(LOG_INFO, "%s shmat fail\n", __func__);
  916. goto leave;
  917. }
  918. else
  919. {
  920. SHM = (struct bkd_shm_t *)shared_memory;
  921. SHM->cmd.ready = 0;
  922. SHM->rsp.ready = 0;
  923. if (pthread_create(&xthrd, NULL, thrd_bkds, NULL) != 0)
  924. {
  925. ret = -3;
  926. syslog(LOG_INFO, "%s, create thread bkds fail\n", __func__);
  927. }
  928. }
  929. leave:
  930. return ret;
  931. }