diff --git a/mainwindow.cpp b/mainwindow.cpp index 279b005..e6ff38a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -102,13 +102,16 @@ void MainWindow::on_selectReadFileButton_clicked() void MainWindow::on_readFromSIMMButton_clicked() { + resetAndShowStatusPage(); p->ReadSIMMToFile(ui->chosenReadFile->text()); qDebug() << "Reading from SIMM..."; } void MainWindow::on_writeToSIMMButton_clicked() { + resetAndShowStatusPage(); p->WriteFileToSIMM(ui->chosenWriteFile->text()); + qDebug() << "Writing to SIMM..."; } void MainWindow::on_chosenWriteFile_textEdited(const QString &newText) @@ -130,22 +133,30 @@ void MainWindow::programmerWriteStatusChanged(WriteStatus newStatus) { switch (newStatus) { + case WriteErasing: + ui->statusLabel->setText("Erasing SIMM..."); + break; case WriteComplete: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::information(this, "Write complete", "The write operation finished."); break; case WriteError: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Write error", "An error occurred writing to the SIMM."); break; case WriteCancelled: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Write cancelled", "The write operation was cancelled."); break; case WriteEraseComplete: - // No message needed for this + ui->statusLabel->setText("Writing SIMM..."); break; case WriteEraseFailed: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Write error", "An error occurred erasing the SIMM."); break; case WriteTimedOut: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Write timed out", "The write operation timed out."); break; } @@ -165,6 +176,7 @@ void MainWindow::programmerWriteCompletionLengthChanged(uint32_t len) void MainWindow::on_electricalTestButton_clicked() { + resetAndShowStatusPage(); electricalTestString = ""; p->RunElectricalTest(); } @@ -174,18 +186,23 @@ void MainWindow::programmerElectricalTestStatusChanged(ElectricalTestStatus newS switch (newStatus) { case ElectricalTestStarted: + ui->statusLabel->setText("Running electrical test..."); qDebug() << "Electrical test started"; break; case ElectricalTestPassed: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::information(this, "Test passed", "The electrical test passed successfully."); break; case ElectricalTestFailed: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Test failed", "The electrical test failed:\n\n" + electricalTestString); break; case ElectricalTestTimedOut: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Test timed out", "The electrical test operation timed out."); break; case ElectricalTestCouldntStart: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Communication error", "Unable to communicate with programmer board."); break; } @@ -208,16 +225,23 @@ void MainWindow::programmerReadStatusChanged(ReadStatus newStatus) { switch (newStatus) { + case ReadStarting: + ui->statusLabel->setText("Reading SIMM contents..."); + break; case ReadComplete: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::information(this, "Read complete", "The read operation finished."); break; case ReadError: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Read error", "An error occurred reading from the SIMM."); break; case ReadCancelled: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Read cancelled", "The read operation was cancelled."); break; case ReadTimedOut: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Read timed out", "The read operation timed out."); break; } @@ -237,8 +261,12 @@ void MainWindow::programmerIdentifyStatusChanged(IdentificationStatus newStatus) { switch (newStatus) { + case IdentificationStarting: + ui->statusLabel->setText("Identifying chips..."); + break; case IdentificationComplete: { + ui->pages->setCurrentWidget(ui->controlPage); QString identifyString = "The chips identified themselves as:"; for (int x = 0; x < 4; x++) { @@ -254,9 +282,11 @@ void MainWindow::programmerIdentifyStatusChanged(IdentificationStatus newStatus) break; } case IdentificationError: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Identification error", "An error occurred identifying the chips on the SIMM."); break; case IdentificationTimedOut: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Identification timed out", "The identification operation timed out."); break; } @@ -266,16 +296,23 @@ void MainWindow::programmerFirmwareFlashStatusChanged(FirmwareFlashStatus newSta { switch (newStatus) { + case FirmwareFlashStarting: + ui->statusLabel->setText("Flashing new firmware..."); + break; case FirmwareFlashComplete: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::information(this, "Firmware update complete", "The firmware update operation finished."); break; case FirmwareFlashError: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Firmware update error", "An error occurred writing firmware to the device."); break; case FirmwareFlashCancelled: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Firmware update cancelled", "The firmware update was cancelled."); break; case FirmwareFlashTimedOut: + ui->pages->setCurrentWidget(ui->controlPage); QMessageBox::warning(this, "Firmware update timed out", "The firmware update operation timed out."); break; } @@ -320,6 +357,7 @@ void MainWindow::on_actionUpdate_firmware_triggered() QString filename = QFileDialog::getOpenFileName(this, "Select a firmware image:"); if (!filename.isNull()) { + resetAndShowStatusPage(); p->FlashFirmware(filename); qDebug() << "Updating firmware..."; } @@ -327,10 +365,11 @@ void MainWindow::on_actionUpdate_firmware_triggered() void MainWindow::on_identifyButton_clicked() { + resetAndShowStatusPage(); p->IdentifySIMMChips(); } -void MainWindow::portDiscovered(const QextPortInfo & info) +void MainWindow::portDiscovered(const QextPortInfo &info) { qDebug() << info.portName << "discovered"; @@ -351,7 +390,7 @@ void MainWindow::portDiscovered(const QextPortInfo & info) } } -void MainWindow::portRemoved(const QextPortInfo & info) +void MainWindow::portRemoved(const QextPortInfo &info) { qDebug() << info.portName << "removed"; @@ -363,3 +402,10 @@ void MainWindow::portRemoved(const QextPortInfo & info) } } } + +void MainWindow::resetAndShowStatusPage() +{ + ui->progressBar->setValue(0); + ui->statusLabel->setText("Communicating with programmer..."); + ui->pages->setCurrentWidget(ui->statusPage); +} diff --git a/mainwindow.h b/mainwindow.h index 19a7316..89b9390 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -52,14 +52,16 @@ private slots: void on_identifyButton_clicked(); - void portDiscovered(const QextPortInfo & info); - void portRemoved(const QextPortInfo & info); + void portDiscovered(const QextPortInfo &info); + void portRemoved(const QextPortInfo &info); private: Ui::MainWindow *ui; bool writeFileValid; bool readFileValid; QString electricalTestString; + + void resetAndShowStatusPage(); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 4a03781..602089c 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 557 - 403 + 405 @@ -22,7 +22,10 @@ 0 - + + + 0 + @@ -213,11 +216,24 @@ + + + + + + + 0 + 0 + + Status label: + + Qt::AlignCenter + @@ -243,7 +259,6 @@ - diff --git a/programmer.cpp b/programmer.cpp index 0354269..d2f42b7 100644 --- a/programmer.cpp +++ b/programmer.cpp @@ -373,6 +373,7 @@ void Programmer::handleChar(uint8_t c) // READ SIMM STATE HANDLERS case ReadSIMMWaitingStartReply: + emit readStatusChanged(ReadStarting); curState = ReadSIMMWaitingData; readChunkLenRemaining = READ_CHUNK_SIZE; break; @@ -436,6 +437,7 @@ void Programmer::handleChar(uint8_t c) // Ensure we're in the programmer? // Then do the command correctly qDebug() << "We're in the bootloader, so sending an \"enter programmer\" request."; + emit startStatusChanged(ProgrammerInitializing); sendByte(EnterProgrammer); serialPort->close(); { @@ -449,14 +451,27 @@ void Programmer::handleChar(uint8_t c) serialPort->open(QextSerialPort::ReadWrite); curState = nextState; sendByte(nextSendByte); + // Special case: Send out notification we are starting an erase command. + // I don't have any hooks into the process between now and the erase reply. + if (nextSendByte == EraseChips) + { + emit writeStatusChanged(WriteErasing); + } break; case BootloaderStateInProgrammer: // Good to go... // So change to the next state and send out the next command // to begin whatever sequence of events we expected. qDebug() << "Already in programmer. Good! Do the command now..."; + emit startStatusChanged(ProgrammerInitialized); curState = nextState; sendByte(nextSendByte); + // Special case: Send out notification we are starting an erase command. + // I don't have any hooks into the process between now and the erase reply. + if (nextSendByte == EraseChips) + { + emit writeStatusChanged(WriteErasing); + } break; // TODO: Otherwise, raise an error? } @@ -487,6 +502,7 @@ void Programmer::handleChar(uint8_t c) // Ensure we're in the bootloader? // Then do the command correctly qDebug() << "We're in the programmer, so sending an \"enter bootloader\" request."; + emit startStatusChanged(ProgrammerInitializing); sendByte(EnterBootloader); serialPort->close(); { @@ -506,6 +522,7 @@ void Programmer::handleChar(uint8_t c) // So change to the next state and send out the next command // to begin whatever sequence of events we expected. qDebug() << "Already in bootloader. Good! Do the command now..."; + emit startStatusChanged(ProgrammerInitialized); curState = nextState; sendByte(nextSendByte); break; @@ -518,6 +535,7 @@ void Programmer::handleChar(uint8_t c) if (c == CommandReplyOK) { // Good to go, now waiting for identification data + emit identificationStatusChanged(IdentificationStarting); curState = IdentificationWaitingData; identificationCounter = 0; } @@ -559,6 +577,7 @@ void Programmer::handleChar(uint8_t c) case BootloaderEraseProgramAwaitingStartOKReply: if (c == CommandReplyOK) { + emit firmwareFlashStatusChanged(FirmwareFlashStarting); sendByte(ComputerBootloaderWriteMore); curState = BootloaderEraseProgramWaitingWriteMoreReply; } diff --git a/programmer.h b/programmer.h index 41000a4..d3e873e 100644 --- a/programmer.h +++ b/programmer.h @@ -5,8 +5,15 @@ #include #include +typedef enum StartStatus +{ + ProgrammerInitializing, + ProgrammerInitialized +} StartStatus; + typedef enum ReadStatus { + ReadStarting, ReadComplete, ReadError, ReadCancelled, @@ -15,6 +22,7 @@ typedef enum ReadStatus typedef enum WriteStatus { + WriteErasing, WriteComplete, WriteError, WriteCancelled, @@ -34,6 +42,7 @@ typedef enum ElectricalTestStatus typedef enum IdentificationStatus { + IdentificationStarting, IdentificationComplete, IdentificationError, IdentificationTimedOut @@ -41,6 +50,7 @@ typedef enum IdentificationStatus typedef enum FirmwareFlashStatus { + FirmwareFlashStarting, FirmwareFlashComplete, FirmwareFlashError, FirmwareFlashCancelled, @@ -72,6 +82,8 @@ public: void GetChipIdentity(int chipIndex, uint8_t *manufacturer, uint8_t *device); void FlashFirmware(QString filename); signals: + void startStatusChanged(StartStatus status); + void readStatusChanged(ReadStatus status); void readTotalLengthChanged(uint32_t total); void readCompletionLengthChanged(uint32_t total);