123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "plt.h"
- #define E3KS_WAIT4STX 0
- #define E3KS_WAIT4END 1
- /*
- Q1回车
- UPS 回应:
- (208.4 140.0 220.4 034 59.9 2.05 55.0 00110000回车
- 代表:
- 当前输入电压为: 208.4V.
- 最近一次输入市电异常时电压为: 140.0V.
- 当前输出电压为is 220.4V.
- 当前输出负载百分比为34 %.
- 当前输入频率为 59.9 Hz.
- 电池单体电压为: 2.05V.
- 机器内部温度: 55.0 摄氏度
- UPS 状态:UPS 故障, Bypass 动作(旁路供电中), 未关机
- UPS b7b6b5b4b3b2b1b0 置1代表发生, 置0代表不发生
- b7 1 : 市电异常
- b6 1 : 电池低
- b5 1 : 旁路工作
- b4 1 : UPS 故障
- b3 1 : 保留
- b2 1 : 自检中
- b1 1 : 接收到关机指令, 关机中
- b0 0 : 电池模式提示音消除
- */
- static int e3ks_s_parse_rsp(int idx)
- {
- struct e3ks_t* dev = &e3ks[idx];
- int ret = 0;
- char buf[128];
- int i;
- if( dev->dbg ){
- log_dbg("%s, rsp:%s", __func__, dev->recv_buf);
- }
- // input voltage
- buf[0] = dev->recv_buf[1];
- buf[1] = dev->recv_buf[2];
- buf[2] = dev->recv_buf[3];
- buf[3] = dev->recv_buf[4];
- buf[4] = dev->recv_buf[5];
- buf[5] = 0;
- dev->input_voltage = atof(buf);
- // output voltage
- buf[0] = dev->recv_buf[13];
- buf[1] = dev->recv_buf[14];
- buf[2] = dev->recv_buf[15];
- buf[3] = dev->recv_buf[16];
- buf[4] = dev->recv_buf[17];
- buf[5] = 0;
- dev->output_voltage = atof(buf);
- // load occupy
- buf[0] = dev->recv_buf[19];
- buf[1] = dev->recv_buf[20];
- buf[2] = dev->recv_buf[21];
- buf[3] = 0;
- dev->load_occupy = atoi(buf);
- // internal temp
- buf[0] = dev->recv_buf[33];
- buf[1] = dev->recv_buf[34];
- buf[2] = dev->recv_buf[35];
- buf[3] = dev->recv_buf[36];
- buf[4] = 0;
- dev->temp = atoi(buf);
- if(dev->recv_buf[38] == '1'){
- dev->line_fault = 1;
- }else{
- dev->line_fault = 0;
- }
- if(dev->recv_buf[39] == '1'){
- dev->bat_low = 1;
- }else{
- dev->bat_low = 0;
- }
- if(dev->recv_buf[41] == '1'){
- dev->ups_fault = 1;
- }else{
- dev->ups_fault = 0;
- }
- return ret;
- }
- static int e3ks_s_recv_rsp(int idx)
- {
- struct e3ks_t* dev = &e3ks[idx];
- struct comm_t* comm = &dev->comm;
- int chanidx = comm->chanidx;
- int needprocess = 0;
- int nprocess = 0;
- chan_serial_ringbuffer_element_t e_arr[256];
- int i;
- char recvbyte;
- int* recvst = &dev->recv_st;
- int* recvcnt = &dev->recv_cnt;
- char* recvbuf = dev->recv_buf;
- int ret = -1;
-
- //chan_lock(chanidx);
- needprocess = chan_serial_rxrb_num_items(chanidx);
- if( needprocess > 0 ){
- nprocess = (needprocess>sizeof(e_arr)/sizeof(chan_serial_ringbuffer_element_t))?(sizeof(e_arr)/sizeof(chan_serial_ringbuffer_element_t)):needprocess;
- chan_serial_rxrb_dequeue_arr(chanidx, e_arr, nprocess);
- if( dev->dbg == 1 ){
- log_dbg("%s, got %d bytes:", __func__, nprocess);
- }
- }
- //chan_unlock(chanidx);
- if(nprocess > 0){
- for(i = 0; i < nprocess; i++){
- recvbyte = e_arr[i].c;
- if( dev->dbg == 1 ){
- log_dbg("%s, st:%d, got %02X-%c", __func__, *recvst, recvbyte,recvbyte);
- }
- switch(*recvst){
- case E3KS_WAIT4STX:
- if(recvbyte == '('){
- *recvcnt = 0;
- memset(dev->recv_buf, 0, sizeof(dev->recv_buf));
- recvbuf[(*recvcnt)++] = recvbyte;
- *recvst = E3KS_WAIT4END;
- }
- break;
- case E3KS_WAIT4END:
- recvbuf[(*recvcnt)++] = recvbyte;
- if( recvbyte == 0x0D ){
- return e3ks_s_parse_rsp(idx);
- }else{
- if( *recvcnt > sizeof(dev->recv_buf) ){
- *recvst = E3KS_WAIT4STX;
- }
- }
- break;
- default:
- *recvst = E3KS_WAIT4STX;
- break;
- }
- }
- }
- return ret;
- }
- int e3ks_s_comm_Q1(int idx)
- {
- struct e3ks_t* dev = &e3ks[idx];
- struct comm_t* comm = &dev->comm;
- int chanidx = comm->chanidx;
- int addr = comm->adr;
- int i, cnt, rc;
- chan_serial_ringbuffer_element_t e_arr[8];
- e_arr[0].c = 0x51;
- e_arr[1].c = 0x31;
- e_arr[2].c = 0x0D;
- chan_serial_rxrb_init(chanidx);
- chan_serial_txrb_init(chanidx);
- chan_serial_txrb_queue_arr(chanidx, e_arr, 3);
- dev->recv_st = E3KS_WAIT4STX;
- cnt = 100;
- rc = -1;
- while( cnt-- > 0 ){
- usleep(10000); // 10ms
- rc = e3ks_s_recv_rsp(idx);
- if( rc == 0 ){
- break;
- }
- }
- return rc;
- }
- void e3ks_s_comm_dac( int idx )
- {
- struct e3ks_t* dev = &e3ks[idx];
- struct comm_t* comm = &dev->comm;
- int chanidx = comm->chanidx;
- int trycnt = 3;
- int ret = -1;
- int rc;
- if(comm_get_state(comm) != COMMST_NORMAL){
- return;
- }
- comm_start_cal_dac_timing(comm);
- while( trycnt-- > 0 ){
- rc = e3ks_s_comm_Q1(idx);
- if( rc == 0){
- break;
- }else{
- sleep(1); // 1s
- }
- }
- if( rc != 0 ){
- comm_set_state(comm, COMMST_ERR);
- }else{
- comm_stop_cal_dac_timing(comm);
- }
- }
- int e3ks_s_comm_init(int idx)
- {
- struct e3ks_t* dev = &e3ks[idx];
- struct comm_t* comm = &dev->comm;
- comm_set_state( comm, COMMST_ERR );
- }
- int e3ks_s_comm_reset(int idx)
- {
- struct e3ks_t* dev = &e3ks[idx];
- struct comm_t* comm = &dev->comm;
- comm_set_state( comm, COMMST_NORMAL );
- }
|