#include "plt.h" #define DELAY_CNT (200) // 10ms * DELAY_CNT static unsigned char dlt645_cal_chksum(int old_chk_sum, char *buf, int buf_sz) { unsigned int SumVal = old_chk_sum; int i; for (i = 0; i < buf_sz; i++) { SumVal += buf[i]; } return (SumVal & 0xFF); } #define METER_STX 0x68 #define ADR 0xaa #define METER_ADRLEN 6 #define METER_EDX 0x16 static void dlt645_pack_d07_frame(int idx, unsigned long inRulerID) { int i; struct dlt645_t *dev = &dlt645[idx]; int chan_idx = dev->comm.chanidx; // struct chan_t* chan = &sta.chan[chan_idx]; S_D07_RULER_INFO info = {0}; char dump_buf[1024]; int ret = get_d07_ruler_info(inRulerID, &info); if (ret != E_D07_OK) { log_dbg("%s, invalid ruler id", __func__); return; } unsigned char ucCtrl = 0; S_D07_CTRL_CODE stCtrl = {0}; int dir = 0; char addr[64] = {0}; // 地址 S_D07_PACK_FRAME pack_frame = {0}; int length = 0; char buffer[256] = {0}; chan_serial_ringbuffer_element_t e_arr[256]; char data[256] = {0}; char user[256] = {0}; F_D07_RULER_TRANS func = NULL; strcpy(addr, dev->szaddr); dir = E_D07_CTRL_DIR_S2M; stCtrl.direct = (E_D07_CTRL_DIR)dir; func = info.func; if (info.type == E_D07_RULER_TYPE_COMB_HAVE_POWER_TOTAL) { sprintf(user, "%6.2f", dev->com_active_e / dev->pratio); } else if (info.type == E_D07_RULER_TYPE_FORTH_HAVE_POWER_TOTAL) { sprintf(user, "%6.2f", dev->pos_active_e / dev->pratio); } else if (info.type == E_D07_RULER_TYPE_BACK_HAVE_POWER_TOTAL) { sprintf(user, "%6.2f", dev->neg_active_e / dev->pratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_A_VOLT) { sprintf(user, "%3.1f", dev->ua / dev->vratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_B_VOLT) { sprintf(user, "%3.1f", dev->ub / dev->vratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_C_VOLT) { sprintf(user, "%3.1f", dev->uc / dev->vratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_A_ELEC) { sprintf(user, "%3.3f", dev->ia / dev->cratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_B_ELEC) { sprintf(user, "%3.3f", dev->ib / dev->cratio); } else if (info.type == E_D07_RULER_TYPE_PHASE_C_ELEC) { sprintf(user, "%3.3f", dev->ic / dev->cratio); } else if (info.type == E_D07_RULER_TYPE_INSTANT_HAVE_POWER_RATE_TOTAL) { sprintf(user, "%2.4f", (double)dev->com_active_p / dev->pratio); } else if (info.type == E_D07_RULER_TYPE_UNKNOWN) { log_dbg("%s, info.type == E_D07_RULER_TYPE_UNKNOWN", __func__); return; } else { log_dbg("%s, TYPE_UNKNOWN", __func__); return; } func(E_D07_TRANS_U2F, user, data); // log_dbg("%s, user:%s, data:%s", __func__, user, data); stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data = data; pack_frame.data_len = info.len + 4; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); // 将结构封装成字节 if (ret != E_D07_OK) { log_dbg("%s, \ntrans_d07ctrl_struct2char failed %d\n", __func__, ret); return; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("%s, \npack frame failed %d\n", __func__, ret); return; } for (i = 0; i < length; i++) { e_arr[i].c = buffer[i]; } // misc_dump(dump_buf, buffer, length); // log_dbg("%s, try to send %d bytes:%s", __func__, length, dump_buf); chan_lock(chan_idx); chan_serial_txrb_queue_arr(chan_idx, e_arr, length); chan_unlock(chan_idx); } static void dlt645_handle_d07_frame(int idx) { int i, j = 0; int ret = 0; S_D07_UNPACK stUnPack = {0}; S_D07_RULER_INFO info = {0}; struct dlt645_t *dev = &dlt645[idx]; char *buf = dev->recvbuf; int len = dev->recvcnt; ret = unpack_d07_frame(buf, len, &stUnPack); if (ret != E_D07_OK) { log_dbg("%s, \n unpack fail! (error = %d : ", __func__, ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("%s, incomplete frame)\n", __func__); break; case E_D07_ERRO_FRAME_0x68: log_dbg("%s, start byte 0x68 possition error)\n", __func__); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("%s, chksum err)\n", __func__); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("%s, end byte 0x16 err)\n", __func__); break; default: break; } return; } if (strcmp(stUnPack.address, dev->szaddr) == 0) { dlt645_pack_d07_frame(idx, stUnPack.ruler_id); } else { log_dbg("%s, addr not match: %s - %s", __func__, stUnPack.address, dev->szaddr); } } static void dlt645_proc_recv(int idx) { struct dlt645_t *dev = &dlt645[idx]; int chan_idx = dev->comm.chanidx; // struct chan_t* chan = &sta.chan[chan_idx]; size_t needprocess = 0; int nprocess = 0; chan_serial_ringbuffer_element_t e_arr[128]; int i; char recvbyte; int *st = &dev->recvst; int *recvcnt = &dev->recvcnt; int *recvcnt2 = &dev->recvcnt2; char *recvbuf = dev->recvbuf; int *tick = &dev->tick; int *dl = &dev->dl; unsigned char chksum = 0; S_D07_UNPACK unpack; chan_lock(chan_idx); needprocess = chan_serial_rxrb_num_items(chan_idx); 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(chan_idx, e_arr, nprocess); // log_dbg("%s, got %d bytes", __func__, nprocess); } chan_unlock(chan_idx); if (nprocess > 0) { for (i = 0; i < nprocess; i++) { recvbyte = e_arr[i].c; // log_dbg("%s, st:%d, got %02X-%c", __func__, *st, recvbyte,recvbyte); switch (*st) { case MRECV_WAIT4STX: if (recvbyte == METER_STX) { *recvcnt = 0; recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_ADDR; *recvcnt2 = 0; *tick = 0; } break; case MRECV_ADDR: recvbuf[(*recvcnt)++] = recvbyte; if (++(*recvcnt2) == METER_ADRLEN) { *st = MRECV_STX2; *tick = 0; } break; case MRECV_STX2: if (recvbyte == METER_STX) { recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_CTRL; *tick = 0; } else { *st = MRECV_WAIT4STX; } break; case MRECV_CTRL: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_DL; *tick = 0; break; case MRECV_DL: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_D; *tick = 0; *recvcnt2 = 0; *dl = recvbyte; break; case MRECV_D: recvbuf[(*recvcnt)++] = recvbyte; if (++(*recvcnt2) == *dl) { *st = MRECV_CS; *tick = 0; } break; case MRECV_CS: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_ETX; *tick = 0; break; case MRECV_ETX: recvbuf[(*recvcnt)++] = recvbyte; chksum = dlt645_cal_chksum(0, recvbuf, *recvcnt - 2); if (chksum == recvbuf[*recvcnt - 2]) { // chksum ok // log_dbg("%s, get cmd frame", __func__); dlt645_handle_d07_frame(idx); } else { log_dbg("%s, chksum err %d/%d", __func__, chksum, recvbuf[*recvcnt - 2]); } *st = MRECV_WAIT4STX; break; } } } else { if ((*tick)++ > 100) { *st = MRECV_WAIT4STX; } } } static int dlt645_recv_rsp(int idx) { struct dlt645_t *dev = &dlt645[idx]; int chan_idx = dev->comm.chanidx; // struct chan_t* chan = &sta.chan[chan_idx]; int needprocess = 0; int nprocess = 0; chan_serial_ringbuffer_element_t e_arr[128]; int i; char recvbyte; int *st = &dev->recvst; int *recvcnt = &dev->recvcnt; int *recvcnt2 = &dev->recvcnt2; char *recvbuf = dev->recvbuf; int *tick = &dev->tick; int *dl = &dev->dl; unsigned char chksum = 0; S_D07_UNPACK unpack; int ret = -1; chan_lock(chan_idx); needprocess = chan_serial_rxrb_num_items(chan_idx); 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(chan_idx, e_arr, nprocess); // log_dbg("%s, got %d bytes", __func__, nprocess); } chan_unlock(chan_idx); if (nprocess > 0) { for (i = 0; i < nprocess; i++) { recvbyte = e_arr[i].c; // log_dbg("%s, st:%d, got %02X-%c", __func__, *st, recvbyte,recvbyte); switch (*st) { case MRECV_WAIT4STX: if (recvbyte == METER_STX) { *recvcnt = 0; recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_ADDR; *recvcnt2 = 0; *tick = 0; } break; case MRECV_ADDR: recvbuf[(*recvcnt)++] = recvbyte; if (++(*recvcnt2) == METER_ADRLEN) { *st = MRECV_STX2; *tick = 0; } break; case MRECV_STX2: if (recvbyte == METER_STX) { recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_CTRL; *tick = 0; } else { *st = MRECV_WAIT4STX; } break; case MRECV_CTRL: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_DL; *tick = 0; break; case MRECV_DL: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_D; *tick = 0; *recvcnt2 = 0; *dl = recvbyte; break; case MRECV_D: recvbuf[(*recvcnt)++] = recvbyte; if (++(*recvcnt2) == *dl) { *st = MRECV_CS; *tick = 0; } break; case MRECV_CS: recvbuf[(*recvcnt)++] = recvbyte; *st = MRECV_ETX; *tick = 0; break; case MRECV_ETX: recvbuf[(*recvcnt)++] = recvbyte; chksum = dlt645_cal_chksum(0, recvbuf, *recvcnt - 2); if (chksum == recvbuf[*recvcnt - 2]) { // chksum ok // log_dbg("%s, get cmd frame", __func__); return 0; // dlt645_handle_d07_frame(idx); } else { log_dbg("%s, chksum err %d/%d", __func__, chksum, recvbuf[*recvcnt - 2]); } *st = MRECV_WAIT4STX; break; } } } else { if ((*tick)++ > 100) { *st = MRECV_WAIT4STX; } } return ret; } int dlt645_read_com_ae(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int i, cnt, rc; int ret = -1; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_COMB_HAVE_POWER_TOTAL; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_COMB_HAVE_POWER_TOTAL) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->com_active_e = stUnPack.data_unpack.fPower * dev->pratio; // log_dbg("%s, com_ae = %.2f", __func__, dev->com_active_e); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_com_ap(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_INSTANT_HAVE_POWER_RATE_TOTAL; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_INSTANT_HAVE_POWER_RATE_TOTAL) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->com_active_p = stUnPack.data_unpack.fPower * dev->pratio; // log_dbg("%s, com_ap = %.1f", __func__, dev->com_active_p); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_ua(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_A_VOLT; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_PHASE_A_VOLT) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->ua = stUnPack.data_unpack.fPower * dev->vratio; // log_dbg("%s, ua = %.1f", __func__, dev->ua); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_ub(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_B_VOLT; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != inRulerID) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->ub = stUnPack.data_unpack.fPower * dev->vratio; // log_dbg("%s, ub = %.1f", __func__, dev->ub); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_uc(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_C_VOLT; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != inRulerID) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->uc = stUnPack.data_unpack.fPower * dev->vratio; // log_dbg("%s, uc = %.1f", __func__, dev->uc); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_ia(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_A_ELEC; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_PHASE_A_ELEC) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->ia = stUnPack.data_unpack.fPower * dev->cratio; // log_dbg("%s, ia = %.3f", __func__, dev->ia); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_ib(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_B_ELEC; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != inRulerID) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->ib = stUnPack.data_unpack.fPower * dev->cratio; // log_dbg("%s, ib = %.3f", __func__, dev->ib); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_ic(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_PHASE_C_ELEC; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != inRulerID) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->ic = stUnPack.data_unpack.fPower * dev->cratio; // log_dbg("%s, ic = %.3f", __func__, dev->ic); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_pos_ae(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_FORTH_HAVE_POWER_TOTAL; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_FORTH_HAVE_POWER_TOTAL) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->pos_active_e = stUnPack.data_unpack.fPower * dev->pratio; // log_dbg("%s, pos_ae = %.2f", __func__, dev->pos_active_e); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } int dlt645_read_neg_ae(int idx) { int num = 1; struct dlt645_t *dev = &dlt645[idx]; char addr[64] = {0}; unsigned long inRulerID; S_D07_RULER_INFO info = {0}; F_D07_RULER_TRANS func = NULL; S_D07_PACK_FRAME pack_frame = {0}; S_D07_UNPACK stUnPack = {0}; unsigned char ucCtrl = 0; int length = 0; char buffer[256] = {0}; int ret, i, cnt, rc; chan_serial_ringbuffer_element_t e[256]; // log_dbg("%s, ++", __func__); inRulerID = E_D07_RULER_TYPE_BACK_HAVE_POWER_TOTAL; ret = get_d07_ruler_info(inRulerID, &info); S_D07_CTRL_CODE stCtrl = {0}; strcpy(addr, dev->szaddr); stCtrl.direct = E_D07_CTRL_DIR_M2S; stCtrl.funcode = E_D07_CTRL_READ_DATA; pack_frame.data_len = 4; pack_frame.data = NULL; ret = trans_d07ctrl_struct2char(&ucCtrl, &stCtrl); if (ret != E_D07_OK) { log_dbg("\ntrans_d07ctrl_struct2char failed %d\n", ret); ret = -1; goto leave; } pack_frame.ruler_id = inRulerID; pack_frame.ctrl_code = ucCtrl; memcpy(pack_frame.address, addr, 13); ret = pack_d07_frame_by_data(&pack_frame, buffer, &length); if (ret != E_D07_OK) { log_dbg("\npack frame failed %d\n", ret); ret = -1; goto leave; } // dlt645api_show_packet(length, buffer); for (i = 0; i < length; i++) { e[i].c = buffer[i]; // log_dbg("%02X ", buffer[i]); } // chan_lock(dev->comm.chanidx); chan_serial_rxrb_init(dev->comm.chanidx); chan_serial_txrb_init(dev->comm.chanidx); chan_serial_txrb_queue_arr(dev->comm.chanidx, e, length); dev->recvst = MRECV_WAIT4STX; cnt = DELAY_CNT; while (cnt-- > 0) { usleep(10000); /* 10ms */ rc = dlt645_recv_rsp(idx); if (rc == 0) { break; } } // chan_unlock(dev->comm.chanidx); if (rc == 0) { // log_dbg("frame is : "); // for(i = 0; i < dev->recvcnt; i++){ // log_dbg("%02X ",dev->recvbuf[i]); // } // dlt645api_debug_switch(D07_ON); rc = dlt645api_unpack_d07_frame(dev->recvbuf, dev->recvcnt, &stUnPack); // dlt645api_debug_switch(D07_OFF); if (ret != E_D07_OK) { log_dbg("\n error! (error = %d : ", ret); switch (ret) { case E_D07_ERRO_FRAME_UNCOMP: log_dbg("frame not complete)\n"); break; case E_D07_ERRO_FRAME_0x68: log_dbg("start 0x68 position err)\n"); break; case E_D07_ERRO_FRAME_CHECK_SUM: log_dbg("chksum error)\n"); break; case E_D07_ERRO_FRAME_END_0x16: log_dbg("end 0x16 err)\n"); break; default: break; } ret = -1; goto leave; } if (stUnPack.ruler_id != E_D07_RULER_TYPE_BACK_HAVE_POWER_TOTAL) { log_dbg("%s, stUnPack.ruler_id not correct ", __func__); ret = -1; goto leave; } else { dev->neg_active_e = stUnPack.data_unpack.fPower * dev->pratio; // log_dbg("%s, neg_ae = %.2f", __func__, dev->neg_active_e); ret = 0; goto leave; } } else { ret = -1; goto leave; } leave: if (ret < 0) { log_dbg("%s, --, ret:%d", __func__, ret); } return ret; } #if 0 void dlt645_comm_dac(int idx) { struct dlt645_t* dev = &dlt645[idx]; struct comm_t* comm = &dev->comm; int trycnt; if(comm_get_state(comm) != COMMST_NORMAL){ return; } comm_start_cal_dac_timing(comm); trycnt = 0; while( 1 ){ if( dlt645_read_com_ap(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ if( dev->comm.dac.stp == 0 ){ /* com_ae */ trycnt = 0; while( 1 ){ if( dlt645_read_com_ae(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 1; }else if( dev->comm.dac.stp == 1 ){ trycnt = 0; while( 1 ){ if( dlt645_read_pos_ae(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 2; }else if( dev->comm.dac.stp == 2 ){ trycnt = 0; while( 1 ){ if( dlt645_read_neg_ae(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 3; }else if( dev->comm.dac.stp == 3 ){ trycnt = 0; while( 1 ){ if( dlt645_read_ua(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 4; }else if( dev->comm.dac.stp == 4 ){ trycnt = 0; while( 1 ){ if( dlt645_read_ub(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 5; }else if( dev->comm.dac.stp == 5 ){ trycnt = 0; while( 1 ){ if( dlt645_read_uc(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 6; }else if( dev->comm.dac.stp == 6 ){ trycnt = 0; while( 1 ){ if( dlt645_read_ia(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 7; }else if( dev->comm.dac.stp == 7 ){ trycnt = 0; while( 1 ){ if( dlt645_read_ib(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 8; }else if( dev->comm.dac.stp == 8 ){ /* ic */ trycnt = 0; while( 1 ){ if( dlt645_read_ic(idx) == 0){ break; }else{ if( trycnt++ >= 3 ){ comm_set_state(comm, COMMST_ERR); return; }else{ usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 0; comm_stop_cal_dac_timing(comm); }else{ dev->comm.dac.stp = 0; } } #endif void dlt645_comm_dac(int idx) { struct dlt645_t *dev = &dlt645[idx]; struct comm_t *comm = &dev->comm; int trycnt; if (comm_get_state(comm) != COMMST_NORMAL) { return; } comm_start_cal_dac_timing(comm); trycnt = 0; while (1) { if (dlt645_read_com_ap(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ trycnt = 0; while (1) { if (dlt645_read_com_ae(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ trycnt = 0; while (1) { if (dlt645_read_pos_ae(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ trycnt = 0; while (1) { if (dlt645_read_neg_ae(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ if (dev->comm.dac.stp == 0) { trycnt = 0; while (1) { if (dlt645_read_ua(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 1; } else if (dev->comm.dac.stp == 1) { trycnt = 0; while (1) { if (dlt645_read_ub(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 2; } else if (dev->comm.dac.stp == 2) { trycnt = 0; while (1) { if (dlt645_read_uc(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 3; } else if (dev->comm.dac.stp == 3) { trycnt = 0; while (1) { if (dlt645_read_ia(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 4; } else if (dev->comm.dac.stp == 4) { trycnt = 0; while (1) { if (dlt645_read_ib(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 5; } else if (dev->comm.dac.stp == 5) { /* ic */ trycnt = 0; while (1) { if (dlt645_read_ic(idx) == 0) { break; } else { if (trycnt++ >= 3) { comm_set_state(comm, COMMST_ERR); return; } else { usleep(100000); /* 100ms */ } } } usleep(100000); /* 100ms */ dev->comm.dac.stp = 0; } else { dev->comm.dac.stp = 0; } comm_stop_cal_dac_timing(comm); } int dlt645_comm_init(int idx) { struct dlt645_t *dev = &dlt645[idx]; struct comm_t *comm = &dev->comm; dev->recvst = MRECV_WAIT4STX; comm->dac.stp = 0; comm_set_state(comm, COMMST_ERR); } int dlt645_comm_reset(int idx) { struct dlt645_t *dev = &dlt645[idx]; struct comm_t *comm = &dev->comm; dev->recvst = MRECV_WAIT4STX; comm_set_state(comm, COMMST_NORMAL); }