bool SerialWidget::initTraceWidget() { // check if we already have a Trace widget if (!this->traceWidget) { // if not, make one this->traceWidget = new TraceWidget(); if (!this->traceWidget) return false; } connect(this->traceWidget, SIGNAL(sendSerialData(QByteArray)), control,SLOT(sendSerialData(QByteArray))); return true; }
/******************************************************************************* * Function Name : sendSerialData * Description : It processes serial commands * Input : None * Output : None * Return : None *******************************************************************************/ void processSerialInput(void) { static u8 buffer[BUFFER_SIZE]; static u8 bufferSize = 0; static u32 bufferTimeout = TIMEOUT_VALUE; if (bufferSize ==0) bufferTimeout = TIMEOUT_VALUE; if (__io_getcharNonBlocking(buffer+bufferSize)) { bufferSize+=1; } bufferTimeout--; if ((bufferTimeout == 0) || (bufferSize == BUFFER_SIZE)) { if (bufferSize > 0) { sendSerialData(bufferSize, buffer); bufferSize = 0; } } }/* end processSerialInput() */
// Нажата кнопка проверки напряжения разомкнутой цепи батареи void MainWindow::on_btnOpenCircuitVoltageBattery_clicked() { quint16 codeADC=0; // принятый код АЦП float fU=0; // принятое напряжение в вольтах // код порогового напряжения = пороговое напряжение В / коэфф. (вес разряда) + смещение (в коде) quint16 codeLimit=settings.opencircuitbattery_limit/settings.coefADC1 + settings.offsetADC1; // код, пороговое напряжение. int ret=0; // код возврата ошибки if(loop.isRunning()){qDebug()<<"loop.isRunning()!"; return;} // костыль: если цикл уже работает - выйти обратно timerPing->stop(); // остановить пинг baSendArray.clear(); baSendCommand.clear(); baRecvArray.clear(); ui->statusBar->showMessage(tr("Проверка напряжения разомкнутых цепей групп ...")); Log(tr("Проверка напряжения разомкнутой цепи батареи"), "blue"); // сбросить коробочку baSendArray = (baSendCommand="IDLE")+"#"; // подготовить буфер для передачи sendSerialData(); // послать baSendArray в порт // ждём ответа. по сигналу о готовности принятых данных или по таймауту, вывалимся из цикла ret=loop.exec(); if(ret) goto stop; // если не ноль (ошибка таймаута) - вывалиться из режима. если 0, то приняли данные из порта // собрать режим baSendArray=(baSendCommand="UocB")+"#"; if(bDeveloperState) Log(QString("Sending ") + qPrintable(baSendArray), "blue"); QTimer::singleShot(settings.delay_after_IDLE_before_other, this, SLOT(sendSerialData())); ret=loop.exec(); if(ret) goto stop; // опросить baSendArray=baSendCommand+"?#"; QTimer::singleShot(settings.delay_after_start_before_request_ADC1, this, SLOT(sendSerialData())); ret=loop.exec(); if(ret) goto stop; codeADC = getRecvData(baRecvArray); fU = ((codeADC-settings.offsetADC1)*settings.coefADC1); // напряжение в вольтах if(bDeveloperState) Log("Цепь "+battery[iBatteryIndex].circuitbattery+" Receive "+qPrintable(baRecvArray)+" codeADC1=0x"+QString("%1").arg((ushort)codeADC, 0, 16), "blue"); // проанализировать результаты if(codeADC >= codeLimit) // напряжение больше (норма) { Log("Напряжение цепи "+battery[iBatteryIndex].circuitbattery+" = "+QString::number(fU, 'f', 2)+" В. Норма.", "blue"); // если ручной режим, то выдать окно сообщения, и только потом разобрать режим измерения. if(bModeManual) QMessageBox::information(this, tr("Напряжение разомкнутой цепи батареи"), tr("Напряжение цепи ")+battery[iBatteryIndex].circuitbattery+" = "+QString::number(fU, 'f', 2)+" В\nНорма"); } else // напряжение меньше (не норма) { Log("Напряжение цепи "+battery[iBatteryIndex].circuitbattery+" = "+QString::number(fU, 'f', 2)+" В. Не норма!.", "red"); // если ручной режим, то выдать окно сообщения, и только потом разобрать режим измерения. if(bModeManual) QMessageBox::information(this, tr("Напряжение разомкнутой цепи батареи"), tr("Напряжение цепи ")+battery[iBatteryIndex].circuitbattery+" = "+QString::number(fU, 'f', 2)+" В\nНе норма!"); // !!! добавить цепь в список неисправных, запрет проверки батареи под нагрузкой } // разобрать режим baSendArray = (baSendCommand="IDLE")+"#"; QTimer::singleShot(settings.delay_after_request_before_next_ADC1, this, SLOT(sendSerialData())); ret=loop.exec(); if(ret) goto stop; stop: // если отладочный режим, напечатать отладочную инфу if(bDeveloperState) { if(ret==1) Log(tr("Timeout!"), "red"); else if(ret==2) Log(tr("Incorrect reply!"), "red"); } timerPing->start(delay_timerPing); // запустить пинг по выходу из режима baSendArray.clear(); // очистить буфера команд. baSendCommand.clear(); baRecvArray.clear(); }