e3ks_s_comm.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include "plt.h"
  2. #define E3KS_WAIT4STX 0
  3. #define E3KS_WAIT4END 1
  4. /*
  5. Q1回车
  6. UPS 回应:
  7. (208.4 140.0 220.4 034 59.9 2.05 55.0 00110000回车
  8. 代表:
  9. 当前输入电压为: 208.4V.
  10. 最近一次输入市电异常时电压为: 140.0V.
  11. 当前输出电压为is 220.4V.
  12. 当前输出负载百分比为34 %.
  13. 当前输入频率为 59.9 Hz.
  14. 电池单体电压为: 2.05V.
  15. 机器内部温度: 55.0 摄氏度
  16. UPS 状态:UPS 故障, Bypass 动作(旁路供电中), 未关机
  17. UPS b7b6b5b4b3b2b1b0 置1代表发生, 置0代表不发生
  18. b7 1 : 市电异常
  19. b6 1 : 电池低
  20. b5 1 : 旁路工作
  21. b4 1 : UPS 故障
  22. b3 1 : 保留
  23. b2 1 : 自检中
  24. b1 1 : 接收到关机指令, 关机中
  25. b0 0 : 电池模式提示音消除
  26. */
  27. static int e3ks_s_parse_rsp(int idx)
  28. {
  29. struct e3ks_t* dev = &e3ks[idx];
  30. int ret = 0;
  31. char buf[128];
  32. int i;
  33. if( dev->dbg ){
  34. log_dbg("%s, rsp:%s", __func__, dev->recv_buf);
  35. }
  36. // input voltage
  37. buf[0] = dev->recv_buf[1];
  38. buf[1] = dev->recv_buf[2];
  39. buf[2] = dev->recv_buf[3];
  40. buf[3] = dev->recv_buf[4];
  41. buf[4] = dev->recv_buf[5];
  42. buf[5] = 0;
  43. dev->input_voltage = atof(buf);
  44. // output voltage
  45. buf[0] = dev->recv_buf[13];
  46. buf[1] = dev->recv_buf[14];
  47. buf[2] = dev->recv_buf[15];
  48. buf[3] = dev->recv_buf[16];
  49. buf[4] = dev->recv_buf[17];
  50. buf[5] = 0;
  51. dev->output_voltage = atof(buf);
  52. // load occupy
  53. buf[0] = dev->recv_buf[19];
  54. buf[1] = dev->recv_buf[20];
  55. buf[2] = dev->recv_buf[21];
  56. buf[3] = 0;
  57. dev->load_occupy = atoi(buf);
  58. // internal temp
  59. buf[0] = dev->recv_buf[33];
  60. buf[1] = dev->recv_buf[34];
  61. buf[2] = dev->recv_buf[35];
  62. buf[3] = dev->recv_buf[36];
  63. buf[4] = 0;
  64. dev->temp = atoi(buf);
  65. if(dev->recv_buf[38] == '1'){
  66. dev->line_fault = 1;
  67. }else{
  68. dev->line_fault = 0;
  69. }
  70. if(dev->recv_buf[39] == '1'){
  71. dev->bat_low = 1;
  72. }else{
  73. dev->bat_low = 0;
  74. }
  75. if(dev->recv_buf[41] == '1'){
  76. dev->ups_fault = 1;
  77. }else{
  78. dev->ups_fault = 0;
  79. }
  80. return ret;
  81. }
  82. static int e3ks_s_recv_rsp(int idx)
  83. {
  84. struct e3ks_t* dev = &e3ks[idx];
  85. struct comm_t* comm = &dev->comm;
  86. int chanidx = comm->chanidx;
  87. int needprocess = 0;
  88. int nprocess = 0;
  89. chan_serial_ringbuffer_element_t e_arr[256];
  90. int i;
  91. char recvbyte;
  92. int* recvst = &dev->recv_st;
  93. int* recvcnt = &dev->recv_cnt;
  94. char* recvbuf = dev->recv_buf;
  95. int ret = -1;
  96. //chan_lock(chanidx);
  97. needprocess = chan_serial_rxrb_num_items(chanidx);
  98. if( needprocess > 0 ){
  99. nprocess = (needprocess>sizeof(e_arr)/sizeof(chan_serial_ringbuffer_element_t))?(sizeof(e_arr)/sizeof(chan_serial_ringbuffer_element_t)):needprocess;
  100. chan_serial_rxrb_dequeue_arr(chanidx, e_arr, nprocess);
  101. if( dev->dbg == 1 ){
  102. log_dbg("%s, got %d bytes:", __func__, nprocess);
  103. }
  104. }
  105. //chan_unlock(chanidx);
  106. if(nprocess > 0){
  107. for(i = 0; i < nprocess; i++){
  108. recvbyte = e_arr[i].c;
  109. if( dev->dbg == 1 ){
  110. log_dbg("%s, st:%d, got %02X-%c", __func__, *recvst, recvbyte,recvbyte);
  111. }
  112. switch(*recvst){
  113. case E3KS_WAIT4STX:
  114. if(recvbyte == '('){
  115. *recvcnt = 0;
  116. memset(dev->recv_buf, 0, sizeof(dev->recv_buf));
  117. recvbuf[(*recvcnt)++] = recvbyte;
  118. *recvst = E3KS_WAIT4END;
  119. }
  120. break;
  121. case E3KS_WAIT4END:
  122. recvbuf[(*recvcnt)++] = recvbyte;
  123. if( recvbyte == 0x0D ){
  124. return e3ks_s_parse_rsp(idx);
  125. }else{
  126. if( *recvcnt > sizeof(dev->recv_buf) ){
  127. *recvst = E3KS_WAIT4STX;
  128. }
  129. }
  130. break;
  131. default:
  132. *recvst = E3KS_WAIT4STX;
  133. break;
  134. }
  135. }
  136. }
  137. return ret;
  138. }
  139. int e3ks_s_comm_Q1(int idx)
  140. {
  141. struct e3ks_t* dev = &e3ks[idx];
  142. struct comm_t* comm = &dev->comm;
  143. int chanidx = comm->chanidx;
  144. int addr = comm->adr;
  145. int i, cnt, rc;
  146. chan_serial_ringbuffer_element_t e_arr[8];
  147. e_arr[0].c = 0x51;
  148. e_arr[1].c = 0x31;
  149. e_arr[2].c = 0x0D;
  150. chan_serial_rxrb_init(chanidx);
  151. chan_serial_txrb_init(chanidx);
  152. chan_serial_txrb_queue_arr(chanidx, e_arr, 3);
  153. dev->recv_st = E3KS_WAIT4STX;
  154. cnt = 100;
  155. rc = -1;
  156. while( cnt-- > 0 ){
  157. usleep(10000); // 10ms
  158. rc = e3ks_s_recv_rsp(idx);
  159. if( rc == 0 ){
  160. break;
  161. }
  162. }
  163. return rc;
  164. }
  165. void e3ks_s_comm_dac( int idx )
  166. {
  167. struct e3ks_t* dev = &e3ks[idx];
  168. struct comm_t* comm = &dev->comm;
  169. int chanidx = comm->chanidx;
  170. int trycnt = 3;
  171. int ret = -1;
  172. int rc;
  173. if(comm_get_state(comm) != COMMST_NORMAL){
  174. return;
  175. }
  176. comm_start_cal_dac_timing(comm);
  177. while( trycnt-- > 0 ){
  178. rc = e3ks_s_comm_Q1(idx);
  179. if( rc == 0){
  180. break;
  181. }else{
  182. sleep(1); // 1s
  183. }
  184. }
  185. if( rc != 0 ){
  186. comm_set_state(comm, COMMST_ERR);
  187. }else{
  188. comm_stop_cal_dac_timing(comm);
  189. }
  190. }
  191. int e3ks_s_comm_init(int idx)
  192. {
  193. struct e3ks_t* dev = &e3ks[idx];
  194. struct comm_t* comm = &dev->comm;
  195. comm_set_state( comm, COMMST_ERR );
  196. }
  197. int e3ks_s_comm_reset(int idx)
  198. {
  199. struct e3ks_t* dev = &e3ks[idx];
  200. struct comm_t* comm = &dev->comm;
  201. comm_set_state( comm, COMMST_NORMAL );
  202. }