#include "adjust_page.h" #include "ui_adjust_page.h" #include "IMEKeyBoard/keyboard_num.h" Adjust_Page::Adjust_Page(QWidget *parent, Work_Thread *thread) : custom_dialog(parent), ui(new Ui::Adjust_Page) { ui->setupUi(this); work_thread = thread; ////// set_btn_beep(ui->adj_tabwidget,SIGNAL(currentChanged(int))); set_btn_beep(ui->pushButton_Exit,SIGNAL(pressed())); //tab1 set_btn_beep(ui->pushButton_vc_get1,SIGNAL(pressed())); set_btn_beep(ui->pushButton_vc_get2,SIGNAL(pressed())); set_btn_beep(ui->pushButton_vc_cal,SIGNAL(pressed())); set_btn_beep(ui->pushButton_vc_read,SIGNAL(pressed())); set_btn_beep(ui->pushButton_vc_reset,SIGNAL(pressed())); set_btn_beep(ui->edit_vc_adj1,SIGNAL(custom_click())); set_btn_beep(ui->edit_vc_adj2,SIGNAL(custom_click())); //tab2 set_btn_beep(ui->pushButton_ic_get1,SIGNAL(pressed())); set_btn_beep(ui->pushButton_ic_get2,SIGNAL(pressed())); set_btn_beep(ui->pushButton_ic_cal,SIGNAL(pressed())); set_btn_beep(ui->pushButton_ic_read,SIGNAL(pressed())); set_btn_beep(ui->pushButton_ic_reset,SIGNAL(pressed())); set_btn_beep(ui->edit_ic_adj1,SIGNAL(custom_click())); set_btn_beep(ui->edit_ic_adj2,SIGNAL(custom_click())); set_btn_beep(ui->edit_chgvol,SIGNAL(custom_click())); set_btn_beep(ui->edit_chgcurr,SIGNAL(custom_click())); set_btn_beep(ui->pushButto_startchg,SIGNAL(pressed())); set_btn_beep(ui->pushButto_startdis,SIGNAL(pressed())); set_btn_beep(ui->pushButto_stopchg,SIGNAL(pressed())); //tab3 set_btn_beep(ui->pushButton_II_set,SIGNAL(pressed())); set_btn_beep(ui->ledit_II_offset,SIGNAL(custom_click())); set_btn_beep(ui->ledit_II_slope,SIGNAL(custom_click())); ////// connect(ui->adj_tabwidget,SIGNAL(currentChanged(int)),this,SLOT(TabChanged(int))); connect(ui->pushButton_Exit,SIGNAL(released()),this,SLOT(BtnReleased())); //tab1 connect(ui->pushButton_vc_get1,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_vc_get2,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_vc_cal,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_vc_read,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_vc_reset,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->edit_vc_adj1,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->edit_vc_adj2,SIGNAL(custom_click()),this,SLOT(leditAction())); //tab2 connect(ui->pushButton_ic_get1,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_ic_get2,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_ic_cal,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_ic_read,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButton_ic_reset,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->edit_ic_adj1,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->edit_ic_adj2,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->edit_chgvol,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->edit_chgcurr,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->pushButto_startchg,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButto_startdis,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->pushButto_stopchg,SIGNAL(released()),this,SLOT(BtnReleased())); //tab3 connect(ui->pushButton_II_set,SIGNAL(released()),this,SLOT(BtnReleased())); connect(ui->ledit_II_offset,SIGNAL(custom_click()),this,SLOT(leditAction())); connect(ui->ledit_II_slope,SIGNAL(custom_click()),this,SLOT(leditAction())); timer_500ms = new QTimer(this); connect(timer_500ms,SIGNAL(timeout()),this,SLOT(DSP_UpdateSlot())); } Adjust_Page::~Adjust_Page() { delete ui; delete timer_500ms; } void Adjust_Page::showAdjustPage() { work_thread->setWorkThreadCMD(work_thread->CMD_GetAdjParamSet); cmdExecState = 2; stateCnt = 0; DSP_UpdateSlot(); connect(work_thread,SIGNAL(sendCMD_Result(int)),this,SLOT(recvCMD_Result(int))); timer_500ms->start(500); this->exec(); } void Adjust_Page::closeAdjustPage() { timer_500ms->stop(); disconnect(work_thread,SIGNAL(sendCMD_Result(int)),this,SLOT(recvCMD_Result(int))); this->close(); } void Adjust_Page::TabChanged(int index) { (void)index; work_thread->setWorkThreadCMD(work_thread->CMD_GetAdjParamSet); cmdExecState = 2; } void Adjust_Page::DSP_UpdateSlot() { QString stateerr; stateerr.sprintf("State = 0x%X,Error = 0x%X",work_thread->modTestData_Origin.State,work_thread->modTestData_Origin.Error); ui->label_stateerrorcode->setText(stateerr); if(ui->adj_tabwidget->currentIndex() == 0){ ui->label_vc_vol1->setText(QString::number(((float)work_thread->modTestData_Origin.ADCVdc/1000),'f',3)); } else if(ui->adj_tabwidget->currentIndex() == 1){ if(ADJ_STATE_DISCHARGE == work_thread->adjWorkState){ ui->label_adjworkstate->setText(tr("状态:正在放电!")); } else if(ADJ_STATE_CHARGE == work_thread->adjWorkState){ ui->label_adjworkstate->setText(tr("状态:正在充电!")); } else{ ui->label_adjworkstate->setText(tr("状态:停止")); } ui->label_ic_vol1->setText(QString::number(((float)work_thread->modTestData_Origin.ADCVdc/1000),'f',3)); qint32 ADCIdc = work_thread->modTestData_Origin.ADCIdc; if(ADCIdc < 0){ ADCIdc *= -1; } ui->label_ic1->setText(QString::number(((float)ADCIdc/1000),'f',3)); } if(work_thread->adjWorkState != ADJ_STATE_STOPPED){ if(work_thread->modTestData.State == 0){ stateCnt++; if(stateCnt >= 10){ stateCnt = 0; work_thread->setWorkThreadCMD(work_thread->CMD_AdjStopTest); } } else{ stateCnt = 0; } } else{ stateCnt = 0; } } void Adjust_Page::updateAdjParamRead(){ ui->label_slope1->setText(QString::number(work_thread->adjParamSet.Vslope)); ui->label_offset1->setText(QString::number(work_thread->adjParamSet.Voffset)); ui->label_ic_slope1->setText(QString::number(work_thread->adjParamSet.Islope)); ui->label_ic_offset1->setText(QString::number(work_thread->adjParamSet.Ioffset)); } void Adjust_Page::recvCMD_Result(int res) { if(res < 0){ popBox(tr("操作失败!")); } if(2 == cmdExecState){ updateAdjParamRead(); } cmdExecState = 0; } void Adjust_Page::getTestParam(const quint8 adjst) { testParam = work_thread->testParam; if(ADJ_STATE_CHARGE == adjst){ CHARGE_PARAM_SET param; param.Vchg = ui->edit_chgvol->text().toDouble()*100; param.Ichg = ui->edit_chgcurr->text().toDouble()*100; param.Tchg = 600; testParam.chgParam.sum_vol_high = param.Vchg;//cell_vol_high = param.Vchg; testParam.chgParam.chg_curr = param.Ichg; if(testParam.chgParam.chg_time < param.Tchg){ testParam.chgParam.chg_time = param.Tchg; } } else if(ADJ_STATE_DISCHARGE == adjst){ DISCHG_PARAM_SET param; param.Vdis = ui->edit_chgvol->text().toDouble()*100; param.Idis = ui->edit_chgcurr->text().toDouble()*100; param.Tdis = 600; testParam.disParam.sum_vol_low = param.Vdis;//cell_vol_low = param.Vdis; testParam.disParam.dis_curr = param.Idis; if(testParam.disParam.dis_time < param.Tdis){ testParam.disParam.dis_time = param.Tdis; } } } int Adjust_Page::adjStartErrorCheck(const quint8 st){ if( (work_thread->modTestData.Error & MOD_ERROR_VOL) || (work_thread->modTestData.ADCVdc< VOL_TOO_LOW || work_thread->modTestData.ADCVdc>VOL_TOO_HIGH) ){ return -1; } double vol = work_thread->modTestData.ADCVdc; quint16 volmin = (quint16)(vol * 0.8); quint16 volmax = (quint16)(vol * 1.2); if(ADJ_STATE_CHARGE == st){ CHARGE_PARAM_SET param; param.Vchg = ui->edit_chgvol->text().toDouble()*100; param.Ichg = ui->edit_chgcurr->text().toDouble()*100; if( (param.Vchg < work_thread->modTestData.ADCVdc+10) || (param.Vchg > volmax) ){ return -2; } if(param.Ichg < 10){ return -3; } } else{ DISCHG_PARAM_SET param; param.Vdis = ui->edit_chgvol->text().toDouble()*100; param.Idis = ui->edit_chgcurr->text().toDouble()*100; if( (param.Vdis+10 > work_thread->modTestData.ADCVdc) || (param.Vdis < volmin) ){ return -2; } if(param.Idis < 10){ return -3; } } return 0; } void Adjust_Page::BtnReleased() { QPushButton *pb = dynamic_cast(sender()); if(pb == ui->pushButton_Exit) { if( (work_thread->adjWorkState != ADJ_STATE_STOPPED) || (work_thread->modTestData.State != 0) ){ work_thread->setWorkThreadCMD(work_thread->CMD_AdjStopTest); } closeAdjustPage(); } else if(pb == ui->pushButto_startchg) { int staerr = adjStartErrorCheck(ADJ_STATE_CHARGE); if(-1 == staerr){ popBox(tr("输入电压异常!")); } else if( -2 == staerr){ popBox(tr("设定电压错误!")); } else if( -3 == staerr){ popBox(tr("设定电流错误!")); } else{ cmdExecState = 1;//启动 getTestParam(ADJ_STATE_CHARGE); work_thread->saveTestParam(testParam); work_thread->setWorkThreadCMD(work_thread->CMD_AdjStartChr); } } else if(pb == ui->pushButto_startdis) { int staerr = adjStartErrorCheck(ADJ_STATE_DISCHARGE); if(-1 == staerr){ popBox(tr("输入电压异常!")); } else if( -2 == staerr){ popBox(tr("设定电压错误!")); } else if( -3 == staerr){ popBox(tr("设定电流错误!")); } else{ cmdExecState = 1; getTestParam(ADJ_STATE_DISCHARGE); work_thread->saveTestParam(testParam); work_thread->setWorkThreadCMD(work_thread->CMD_AdjStartDis); } } else if(pb == ui->pushButto_stopchg) { work_thread->setWorkThreadCMD(work_thread->CMD_AdjStopTest); } else if(pb == ui->pushButton_vc_get1) { now_value1 = work_thread->modTestData_Origin.ADCVdc; adj_value1 = ui->edit_vc_adj1->text().toDouble()*1000; now_value2 = 0; adj_value2 = 0; } else if(pb == ui->pushButton_vc_get2) { now_value2 = work_thread->modTestData_Origin.ADCVdc; adj_value2 = ui->edit_vc_adj2->text().toDouble()*1000; } else if(pb == ui->pushButton_vc_cal) { ADJ_PARAM_SET tempadj = work_thread->adjParamSet; quint16 tslope = 0; qint16 toffset = 0; //1 point if(now_value2==0 && adj_value2==0){ double tmpdat_y = now_value1; tmpdat_y -= tempadj.Voffset; tmpdat_y *= 10000; tmpdat_y /= tempadj.Vslope; //qDebug("origin vol = %d",tmpdat_y); double newk = (adj_value1-tempadj.Voffset); if(tmpdat_y > 0.1){ newk /= tmpdat_y; } else{ newk = 0; } toffset = tempadj.Voffset; tslope = (quint16)(newk*10000); } //2 point else{ double orign_v1 = now_value1; orign_v1 -= tempadj.Voffset; orign_v1 *= 10000; orign_v1 /= tempadj.Vslope; double orign_v2 = now_value2; orign_v2 -= tempadj.Voffset; orign_v2 *= 10000; orign_v2 /= tempadj.Vslope; //qDebug("origin_v1 = %d, origin_v2 = %d",orign_v1,orign_v2); if(orign_v1 != orign_v2){ double vslop = adj_value2-adj_value1; vslop /= (orign_v2-orign_v1);//k = (y2-y1)/x2-x1) tslope = (quint16)(vslop*10000); vslop *= orign_v2; //b = y2-kx2 toffset = (qint16)(adj_value2-vslop); } } ui->label_slope2->setText(QString::number(tslope)); ui->label_offset2->setText(QString::number(toffset)); if(toffset>-1000&&toffset<1000&&tslope>8000&&tslope<12000) { tempadj.Vslope = tslope; tempadj.Voffset = toffset; work_thread->saveAdjParam(tempadj); } cmdExecState = 3;//校准--写 } else if(pb == ui->pushButton_vc_reset) { ADJ_PARAM_SET tempadj = work_thread->adjParamSet; tempadj.Voffset = 0; tempadj.Vslope = 10000; ui->label_slope2->setText(QString::number(tempadj.Vslope)); ui->label_offset2->setText(QString::number(tempadj.Voffset)); work_thread->saveAdjParam(tempadj); cmdExecState = 3; } else if(pb == ui->pushButton_ic_get1) { now_value1 = work_thread->modTestData_Origin.ADCIdc; if(now_value1 < 0){ now_value1 *= -1; } adj_value1 = ui->edit_ic_adj1->text().toDouble()*1000; now_value2 = 0; adj_value2 = 0; } else if(pb == ui->pushButton_ic_get2) { now_value2 = work_thread->modTestData_Origin.ADCIdc; if(now_value2 < 0){ now_value2 *= -1; } adj_value2 = ui->edit_ic_adj2->text().toDouble()*1000; } else if(pb == ui->pushButton_ic_cal) { ADJ_PARAM_SET tempadj = work_thread->adjParamSet; quint16 tslope = 0; qint16 toffset = 0; //1 point if(now_value2==0 && adj_value2==0){ double tmpdat_y = now_value1; tmpdat_y -= tempadj.Ioffset; tmpdat_y *= 10000; tmpdat_y /= tempadj.Islope; //qDebug("origin curr = %d",tmpdat_y); double newk = (adj_value1-tempadj.Ioffset); if(tmpdat_y > 0.1){ newk /= tmpdat_y; } else{ newk = 0; } toffset = tempadj.Ioffset; tslope = (quint16)(newk*10000); } //2 point else{ double orign_v1 = now_value1; orign_v1 -= tempadj.Ioffset; orign_v1 *= 10000; orign_v1 /= tempadj.Islope; double orign_v2 = now_value2; orign_v2 -= tempadj.Ioffset; orign_v2 *= 10000; orign_v2 /= tempadj.Islope; //qDebug("origin_I1 = %d, origin_I2 = %d",orign_v1,orign_v2); if(orign_v1 != orign_v2){ double vslop = adj_value2-adj_value1; vslop /= (orign_v2-orign_v1);//k = (y2-y1)/x2-x1) tslope = (quint16)(vslop*10000); vslop *= orign_v2; //b = y2-kx2 toffset = (qint16)(adj_value2-vslop); } } ui->label_ic_slope2->setText(QString::number(tslope)); ui->label_ic_offset2->setText(QString::number(toffset)); if(toffset>-1000&&toffset<1000&&tslope>8000&&tslope<12000) { tempadj.Islope = tslope; tempadj.Ioffset = toffset; work_thread->saveAdjParam(tempadj); } cmdExecState = 3;//校准--写 } else if(pb == ui->pushButton_II_set) { ADJ_PARAM_SET tempadj = work_thread->adjParamSet; quint16 tslope = ui->ledit_II_slope->text().toInt(); qint16 toffset = ui->ledit_II_offset->text().toInt(); if(toffset>-1000&&toffset<1000&&tslope>8000&&tslope<12000) { tempadj.Islope = tslope; tempadj.Ioffset = toffset; //qDebug("tslope = %d,toffset = %d",tslope,toffset); work_thread->saveAdjParam(tempadj); } cmdExecState = 3;//校准--写 } else if(pb == ui->pushButton_ic_reset) { ADJ_PARAM_SET tempadj = work_thread->adjParamSet; tempadj.Ioffset = 0; tempadj.Islope = 10000; ui->label_ic_slope2->setText(QString::number(tempadj.Islope)); ui->label_ic_offset2->setText(QString::number(tempadj.Ioffset)); work_thread->saveAdjParam(tempadj); cmdExecState = 3; } else if(pb==ui->pushButton_vc_read || pb==ui->pushButton_ic_read) { work_thread->setWorkThreadCMD(work_thread->CMD_GetAdjParamSet); cmdExecState = 2; //读 } } void Adjust_Page::leditAction() { Custom_LineEdit *le = dynamic_cast(sender()); if(le == ui->edit_vc_adj1) { setEditInput(le, ui->label_vc_adj1, 0, 110, 3); } else if(le == ui->edit_vc_adj2) { setEditInput(le, ui->label_vc_adj1, 0, 110, 3); } else if(le == ui->edit_ic_adj1) { setEditInput(le, ui->label_ic_adj1, 0, 15, 3); } else if(le == ui->edit_ic_adj2) { setEditInput(le, ui->label_ic_adj2, 0, 15, 3); } else if(le == ui->edit_chgvol) { paramEdited = false; setEditInput(le, ui->label_chgvolset, 0, (VOLTAGE_MAX+0.2), 2); if(ADJ_STATE_STOPPED != work_thread->adjWorkState){ if(paramEdited) { getTestParam(work_thread->adjWorkState); work_thread->saveTestParam(testParam); } } } else if(le == ui->edit_chgcurr) { paramEdited = false; setEditInput(le, ui->label_chgcurrset, 1, (CURRENT_MAX+0.2), 2); if(ADJ_STATE_STOPPED != work_thread->adjWorkState){ if(paramEdited) { getTestParam(work_thread->adjWorkState); work_thread->saveTestParam(testParam); } } } else if(le == ui->ledit_II_offset) { setEditInputEx(le, ui->label_II_offset, -1000, 1000, 0); } else if(le == ui->ledit_II_slope) { setEditInputEx(le, ui->label_II_slope, 8000, 12000, 0); } } void Adjust_Page::setEditInput(Custom_LineEdit *edit, QLabel *lable, float min, float max, int floatNum) { QString origcolor = edit->styleSheet(); //edit->setStyleSheet("color:red"); KeyBoard_Num keyboard(this, INPUT_DATA, lable->text()); keyboard.execKeyboard(); DATA_KB_RTN kbdata = keyboard.get_kb_data(); if(kbdata.If_OK) { float input = kbdata.set_text.toFloat(); if(input>=min && input<=max) { edit->setText(QString::number(input,'f',floatNum)); paramEdited = true; } else edit->setStyleSheet(origcolor); } else edit->setStyleSheet(origcolor); } void Adjust_Page::setEditInputEx(Custom_LineEdit *edit, QLabel *lable, float min, float max, int floatNum) { QString origcolor = edit->styleSheet(); //edit->setStyleSheet("color:red"); KeyBoard_Num keyboard(this, INPUT_DATE, lable->text()); keyboard.execKeyboard(); DATA_KB_RTN kbdata = keyboard.get_kb_data(); if(kbdata.If_OK) { float input = kbdata.set_text.toFloat(); if(input>=min && input<=max) { edit->setText(QString::number(input,'f',floatNum)); } else edit->setStyleSheet(origcolor); } else edit->setStyleSheet(origcolor); } void Adjust_Page::popBox(QString msg) { MessageBox box(this,msg,MessageBox::Ok,work_thread); box.exec(); }