From 4dd1f951937f0f3e45f8720762fdc3985688ad17 Mon Sep 17 00:00:00 2001 From: Yury Shuvakin Date: Tue, 13 Sep 2022 15:20:09 +0300 Subject: [PATCH] Added board firmware update functionality --- ENNOID-BMS-Tool.pro | 8 +- bmsinterface.cpp | 34 ++-- bmsinterface.h | 6 +- commands.cpp | 31 ++-- commands.h | 6 +- firmwareupdatehelper.cpp | 29 ++++ firmwareupdatehelper.h | 17 ++ main.cpp | 2 + qml/Controls/ProgressBar.qml | 38 +++++ qml/Controls/qmldir | 1 + qml/MainWindow.qml | 79 ++++++++-- qml/Screens/BmsServiceScreen.qml | 70 +++------ qml/Screens/DebugInformationScreen.qml | 1 + qml/Screens/FirmwareUpdateScreen.qml | 126 +++++++++++++++ qml/Screens/TerminalScreen.qml | 74 +++++++++ qml/Screens/qmldir | 2 + qml/qml_items.qrc | 3 + translations/cubo_en.ts | 198 ++++++++++++++++++----- translations/cubo_it.ts | 198 ++++++++++++++++++----- translations/cubo_ru.qm | Bin 18191 -> 20442 bytes translations/cubo_ru.ts | 210 ++++++++++++++++++++----- 21 files changed, 908 insertions(+), 225 deletions(-) create mode 100644 firmwareupdatehelper.cpp create mode 100644 firmwareupdatehelper.h create mode 100644 qml/Controls/ProgressBar.qml create mode 100644 qml/Screens/FirmwareUpdateScreen.qml create mode 100644 qml/Screens/TerminalScreen.qml diff --git a/ENNOID-BMS-Tool.pro b/ENNOID-BMS-Tool.pro index 11e49b2..c0e3eb9 100644 --- a/ENNOID-BMS-Tool.pro +++ b/ENNOID-BMS-Tool.pro @@ -70,9 +70,9 @@ release_android { UI_DIR = build/android/obj } -build_mobile { - DEFINES += USE_MOBILE -} +#build_mobile { +# DEFINES += USE_MOBILE +#} SOURCES += main.cpp\ # akbmonitorpage.cpp \ @@ -104,6 +104,7 @@ SOURCES += main.cpp\ utility.cpp \ bmsinterface.cpp \ translator.cpp \ + firmwareupdatehelper.cpp \ # visualizationchart.cpp \ # visualizationpage.cpp @@ -138,6 +139,7 @@ HEADERS += \ #mainwindow.h \ utility.h \ bmsinterface.h \ translator.h \ + firmwareupdatehelper.h \ # visualizationchart.h \ # visualizationpage.h diff --git a/bmsinterface.cpp b/bmsinterface.cpp index eb7d654..2503edc 100644 --- a/bmsinterface.cpp +++ b/bmsinterface.cpp @@ -113,8 +113,8 @@ BMSInterface::BMSInterface(QObject *parent) : QObject(parent) connect(mCommands, SIGNAL(dataToSend(QByteArray&)),this, SLOT(cmdDataToSend(QByteArray&))); connect(mCommands, SIGNAL(fwVersionReceived(int,int,QString,QByteArray)),this, SLOT(fwVersionReceived(int,int,QString,QByteArray))); connect(mCommands, SIGNAL(ackReceived(QString)), this, SLOT(ackReceived(QString))); - connect(mbmsConfig, SIGNAL(updated()), this, SLOT(bmsconfUpdated())); - connect(mbmsConfig, SIGNAL(stored()), this, SLOT(bmsconfStored())); + connect(mbmsConfig, SIGNAL(updated()), this, SLOT(bmsConfUpdated())); + connect(mbmsConfig, SIGNAL(stored()), this, SLOT(bmsConfStored())); } BMSInterface::~BMSInterface() @@ -628,7 +628,6 @@ void BMSInterface::ignoreCanChange(bool ignore) #ifdef HAS_SERIALPORT void BMSInterface::serialDataAvailable() { - bool b = true; while (mSerialPort->bytesAvailable() > 0) { mPacket->processData(mSerialPort->readAll()); } @@ -660,7 +659,6 @@ void BMSInterface::serialPortError(QSerialPort::SerialPortError error) void BMSInterface::tcpInputConnected() { - bool b = true; mTcpConnected = true; updateFwRx(false); } @@ -673,7 +671,6 @@ void BMSInterface::tcpInputDisconnected() void BMSInterface::tcpInputDataAvailable() { - bool b = true; while (mTcpSocket->bytesAvailable() > 0) { mPacket->processData(mTcpSocket->readAll()); } @@ -748,9 +745,13 @@ void BMSInterface::timerSlot() if (mIsUploadingFw) { updateFwRx(false); mFwRetries = 0; - if (fwStatus.compare("FW Upload Done") == 0) { + if (mCommands->getFirmwareUploadSuccess()) + { + disconnectPort(); emit fwUploadStatus(fwStatus, 1.0, false); - } else { + } + else + { emit fwUploadStatus(fwStatus, 0.0, false); } } @@ -796,7 +797,7 @@ void BMSInterface::fwVersionReceived(int major, int minor, QString hw, QByteArra { QList > fwPairs = getSupportedFirmwarePairs(); - QString strUuid = Utility::uuid2Str(uuid, true); + QString strUuid = uuid.toHex().toUpper(); if (fwPairs.isEmpty()) { emit messageDialog(tr("Not Supported Firmwares"), @@ -862,17 +863,6 @@ void BMSInterface::fwVersionReceived(int major, int minor, QString hw, QByteArra } auto fwStr = tr("Firmware version: %1.%2, Hardware: %3, UUID: %4").arg(major).arg(minor).arg(hw).arg(strUuid); - -// QString fwStr; -// fwStr.sprintf("ENNOID-BMS Firmware Version %d.%d", major, minor); -// if (!hw.isEmpty()) { -// fwStr += ", Hardware: " + hw; -// } - -// if (!strUuid.isEmpty()) { -// fwStr += ", UUID: " + strUuid; -// } - emit statusMessage(fwStr, true); #if 0 } @@ -891,13 +881,15 @@ void BMSInterface::fwVersionReceived(int major, int minor, QString hw, QByteArra } } -void BMSInterface::bmsconfUpdated() +void BMSInterface::bmsConfUpdated() { emit statusMessage(tr("BMS configuration updated"), true); + emit bmsConfigurationUpdated(); } -void BMSInterface::bmsconfStored() { +void BMSInterface::bmsConfStored() { emit statusMessage(tr("BMS configuration stored to Flash"), true); + emit bmsConfigurationStored(); } void BMSInterface::ackReceived(QString ackType) diff --git a/bmsinterface.h b/bmsinterface.h index da0a34e..2ff7d05 100644 --- a/bmsinterface.h +++ b/bmsinterface.h @@ -127,6 +127,8 @@ signals: void autoConnectProgressUpdated(double progress, bool isOngoing); void autoConnectFinished(); void pairingListUpdated(); + void bmsConfigurationUpdated(); + void bmsConfigurationStored(); public slots: @@ -150,8 +152,8 @@ private slots: void packetReceived(QByteArray &data); void cmdDataToSend(QByteArray &data); void fwVersionReceived(int major, int minor, QString hw, QByteArray uuid); - void bmsconfUpdated(); - void bmsconfStored(); + void bmsConfUpdated(); + void bmsConfStored(); void ackReceived(QString ackType); private: diff --git a/commands.cpp b/commands.cpp index c89da80..5d04fad 100644 --- a/commands.cpp +++ b/commands.cpp @@ -39,6 +39,8 @@ Commands::Commands(QObject *parent) : QObject(parent) mFimwarePtr = 0; mFirmwareTimer = 0; mFirmwareRetries = 0; + mFirmwareIsBootloader = false; + mFirmwareUploadSuccess = false; mFirmwareUploadStatus = "FW Upload Status"; mCheckNextbmsConfig = false; @@ -457,12 +459,12 @@ void Commands::firmwareUploadUpdate(bool isTimeout) const int timeout = 350; if (mFirmwareState == 0) { - mFirmwareUploadStatus = "Buffer Erase"; + mFirmwareUploadStatus = tr("Buffer erase"); if (isTimeout) { // Erase timed out, abort. mFirmwareIsUploading = false; mFimwarePtr = 0; - mFirmwareUploadStatus = "Buffer Erase Timeout"; + mFirmwareUploadStatus = tr("Buffer erase timeout"); } else { mFirmwareState++; mFirmwareRetries = retries; @@ -470,7 +472,7 @@ void Commands::firmwareUploadUpdate(bool isTimeout) firmwareUploadUpdate(true); } } else if (mFirmwareState == 1) { - mFirmwareUploadStatus = "CRC/Size Write"; + mFirmwareUploadStatus = tr("CRC/Size write"); if (isTimeout) { if (mFirmwareRetries > 0) { mFirmwareRetries--; @@ -479,7 +481,7 @@ void Commands::firmwareUploadUpdate(bool isTimeout) mFirmwareIsUploading = false; mFimwarePtr = 0; mFirmwareState = 0; - mFirmwareUploadStatus = "CRC/Size Write Timeout"; + mFirmwareUploadStatus = tr("CRC/Size write timeout"); return; } @@ -498,7 +500,7 @@ void Commands::firmwareUploadUpdate(bool isTimeout) firmwareUploadUpdate(true); } } else if (mFirmwareState == 2) { - mFirmwareUploadStatus = "FW Data Write"; + mFirmwareUploadStatus = tr("Firmware data write"); if (isTimeout) { if (mFirmwareRetries > 0) { mFirmwareRetries--; @@ -507,7 +509,7 @@ void Commands::firmwareUploadUpdate(bool isTimeout) mFirmwareIsUploading = false; mFimwarePtr = 0; mFirmwareState = 0; - mFirmwareUploadStatus = "FW Data Write Timeout"; + mFirmwareUploadStatus = tr("Firmware data write timeout"); return; } @@ -534,7 +536,8 @@ void Commands::firmwareUploadUpdate(bool isTimeout) mFirmwareIsUploading = false; mFimwarePtr = 0; mFirmwareState = 0; - mFirmwareUploadStatus = "FW Upload Done"; + mFirmwareUploadSuccess = true; + mFirmwareUploadStatus = tr("Firmware update completed!\n\nReconnect to the board if you want to continue working with it."); // Upload done. Enter bootloader! if (!mFirmwareIsBootloader) { @@ -616,7 +619,8 @@ void Commands::startFirmwareUpload(QByteArray &newFirmware, bool isBootloader) mFirmwareRetries = 5; mNewFirmware.clear(); mNewFirmware.append(newFirmware); - mFirmwareUploadStatus = "Buffer Erase"; + mFirmwareUploadSuccess = false; + mFirmwareUploadStatus = tr("Buffer erase"); if (mFirmwareIsBootloader) { firmwareUploadUpdate(true); @@ -628,7 +632,12 @@ void Commands::startFirmwareUpload(QByteArray &newFirmware, bool isBootloader) } } -double Commands::getFirmwareUploadProgress() +bool Commands::getFirmwareUploadSuccess() const +{ + return mFirmwareUploadSuccess; +} + +double Commands::getFirmwareUploadProgress() const { if (mFirmwareIsUploading) { return (double)mFimwarePtr / (double)mNewFirmware.size(); @@ -637,7 +646,7 @@ double Commands::getFirmwareUploadProgress() } } -QString Commands::getFirmwareUploadStatus() +QString Commands::getFirmwareUploadStatus() const { return mFirmwareUploadStatus; } @@ -648,7 +657,7 @@ void Commands::cancelFirmwareUpload() mFirmwareIsUploading = false; mFimwarePtr = 0; mFirmwareState = 0; - mFirmwareUploadStatus = "Cancelled"; + mFirmwareUploadStatus = tr("Cancelled"); } } diff --git a/commands.h b/commands.h index cdd0cca..d83f32a 100644 --- a/commands.h +++ b/commands.h @@ -47,8 +47,9 @@ public: Q_INVOKABLE int getCanSendId(); void setbmsConfig(ConfigParams *bmsConfig); Q_INVOKABLE void startFirmwareUpload(QByteArray &newFirmware, bool isBootloader = false); - Q_INVOKABLE double getFirmwareUploadProgress(); - Q_INVOKABLE QString getFirmwareUploadStatus(); + Q_INVOKABLE double getFirmwareUploadProgress() const; + Q_INVOKABLE QString getFirmwareUploadStatus() const; + Q_INVOKABLE bool getFirmwareUploadSuccess() const; Q_INVOKABLE void cancelFirmwareUpload(); void checkbmsConfig(); Q_INVOKABLE void storeBMSConfig(); @@ -112,6 +113,7 @@ private: int mFirmwareTimer; int mFirmwareRetries; bool mFirmwareIsBootloader; + bool mFirmwareUploadSuccess; QString mFirmwareUploadStatus; ConfigParams *mbmsConfig; diff --git a/firmwareupdatehelper.cpp b/firmwareupdatehelper.cpp new file mode 100644 index 0000000..84bc1bd --- /dev/null +++ b/firmwareupdatehelper.cpp @@ -0,0 +1,29 @@ +#include "firmwareupdatehelper.h" + +#include "bmsinterface.h" + +#include +#include + + +FirmwareUpdateHelper::FirmwareUpdateHelper(QObject *parent) : QObject(parent) +{ +} + +bool FirmwareUpdateHelper::uploadFirmware(QString filename, BMSInterface *interface) +{ + QFile file(filename); + + if (!file.open(QIODevice::ReadOnly)) + { + interface->emitMessageDialog(tr("Upload error"), + tr("Could not open file. Make sure that the path is valid."), + false); + return false; + } + + auto data = file.readAll(); + interface->commands()->startFirmwareUpload(data, false); + + return true; +} diff --git a/firmwareupdatehelper.h b/firmwareupdatehelper.h new file mode 100644 index 0000000..d6411c1 --- /dev/null +++ b/firmwareupdatehelper.h @@ -0,0 +1,17 @@ +#ifndef FIRMWAREUPDATEHELPER_H +#define FIRMWAREUPDATEHELPER_H + +#include + +class BMSInterface; + +class FirmwareUpdateHelper : public QObject +{ + Q_OBJECT + +public: + explicit FirmwareUpdateHelper(QObject *parent = nullptr); + Q_INVOKABLE bool uploadFirmware(QString filename, BMSInterface *interface); +}; + +#endif // FIRMWAREUPDATEHELPER_H diff --git a/main.cpp b/main.cpp index d4a3022..97718a3 100644 --- a/main.cpp +++ b/main.cpp @@ -21,6 +21,7 @@ #include "bmsinterface.h" #include "utility.h" #include "translator.h" +#include "firmwareupdatehelper.h" #include #include @@ -73,6 +74,7 @@ int main(int argc, char *argv[]) qmlRegisterSingletonType("Cubo", 1, 0, "Translator", translatorSingletontypeProvider); qmlRegisterType("Cubo", 1, 0, "Commands"); qmlRegisterType("Cubo", 1, 0, "ConfigParams"); + qmlRegisterType("Cubo", 1, 0, "FirmwareUpdateHelper"); engine.addImportPath(QStringLiteral("qrc:/")); engine.load(QUrl(QStringLiteral("qrc:/MainWindow.qml"))); diff --git a/qml/Controls/ProgressBar.qml b/qml/Controls/ProgressBar.qml new file mode 100644 index 0000000..1807537 --- /dev/null +++ b/qml/Controls/ProgressBar.qml @@ -0,0 +1,38 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +import Utils 1.0 + +ProgressBar { + id: control + padding: 2 + + background: Rectangle { + implicitWidth: 250 + implicitHeight: 26 + border.width: 1 + border.color: Palette.borderColor + color: Palette.screenBackgroundColor + radius: 5 + } + + contentItem: Item { + implicitWidth: 250 + implicitHeight: 24 + + Rectangle { + width: control.visualPosition * parent.width + height: parent.height + radius: 5 + color: Palette.alternativeBackgroundColor + } + + Text { + text: Math.floor((control.value / control.to) * 100) + '%' + anchors.centerIn: parent + color: Palette.textColor + font.pixelSize: 18 + font.weight: Font.Bold + } + } +} diff --git a/qml/Controls/qmldir b/qml/Controls/qmldir index 29ecb8f..aa01916 100644 --- a/qml/Controls/qmldir +++ b/qml/Controls/qmldir @@ -25,3 +25,4 @@ MenuItemDelegate 1.0 MenuItemDelegate.qml ScrollIndicator 1.0 ScrollIndicator.qml OutlineImageButton 1.0 OutlineImageButton.qml ImageButton 1.0 ImageButton.qml +ProgressBar 1.0 ProgressBar.qml diff --git a/qml/MainWindow.qml b/qml/MainWindow.qml index a2b34d9..1aa0b07 100644 --- a/qml/MainWindow.qml +++ b/qml/MainWindow.qml @@ -131,17 +131,8 @@ ApplicationWindow { RowLayout { id: topBar - property var labels: [ - qsTr("AKB monitor"), - qsTr("Cell monitor"), - qsTr("BMS settings"), - qsTr("Visualization"), - qsTr("Information output"), - qsTr("Terminal"), - ] - Label { - text: topBar.labels[stack.currentIndex] + text: stack.itemAt(stack.currentIndex).title font.pixelSize: 38 font.weight: Font.Bold color: Palette.textColor @@ -316,12 +307,15 @@ ApplicationWindow { Layout.bottomMargin: 30 Screens.AkbMonitorScreen { + property string title: qsTr("AKB monitor") } Screens.CellMonitorScreen { + property string title: qsTr("Cell monitor") } Screens.BmsSettingsScreen { + property string title: qsTr("BMS settings") onNeedWait: { if (active) { busyPopup.text = text @@ -333,10 +327,12 @@ ApplicationWindow { } Screens.VisualizationScreen { + property string title: qsTr("Visualization") } Screens.DebugInformationScreen { id: debugScreen + property string title: qsTr("Information output") } Screens.BmsServiceScreen { @@ -357,8 +353,6 @@ ApplicationWindow { serialLabel.text = "-" firmwareLabel.text = "-" } - - debugScreen.printMessage(BmsInterface.getConnectedPortName(), true) } onMessageDialog: { @@ -389,6 +383,22 @@ ApplicationWindow { } } } + + onFwUploadStatus: { + if (isOngoing) { + if (!progressPopup.opened) { + progressPopup.open() + } + + progressPopup.text = status + progressPopup.progress = progress + } else { + progressPopup.close() + BmsInterface.emitMessageDialog(qsTr("Firmware update"), status, true) + } + } + + onBmsConfigurationStored: busyPopup.close() } Connections { @@ -440,7 +450,6 @@ ApplicationWindow { onOpened: { hideStatusTimer.start() - busyPopup.close() } } @@ -477,6 +486,8 @@ ApplicationWindow { font.pixelSize: 20 Layout.alignment: Qt.AlignCenter horizontalAlignment: Text.AlignHCenter + leftPadding: 10 + rightPadding: 10 background: Rectangle { color: Palette.textColor @@ -490,6 +501,48 @@ ApplicationWindow { onClosed: hideBusyTimer.stop() } + Popup { + id: progressPopup + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + modal: true + closePolicy: Popup.NoAutoClose + + property alias text: progressText.text + property alias progress: progressBar.value + + background: Rectangle { + color: "transparent" + } + + ColumnLayout { + Controls.ProgressBar { + id: progressBar + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: 500 + } + + Controls.SubtitleLabel { + text: "asdfzasdf" + id: progressText + color: Palette.alternativeTextColor + maximumLineCount: 3 + wrapMode: Text.Wrap + font.pixelSize: 20 + Layout.alignment: Qt.AlignCenter + horizontalAlignment: Text.AlignHCenter + leftPadding: 10 + rightPadding: 10 + + background: Rectangle { + color: Palette.textColor + opacity: 0.3 + radius: 6 + } + } + } + } + Timer { id: hideBusyTimer interval: 30000 diff --git a/qml/Screens/BmsServiceScreen.qml b/qml/Screens/BmsServiceScreen.qml index 11da120..93c23a8 100644 --- a/qml/Screens/BmsServiceScreen.qml +++ b/qml/Screens/BmsServiceScreen.qml @@ -1,74 +1,46 @@ import QtQuick 2.12 -import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import Controls 1.0 as Controls -import Cubo 1.0 +import Screens 1.0 as Screens -ColumnLayout { +RowLayout { spacing: 20 - Keys.onReturnPressed: sendButton.clicked() - Keys.onEnterPressed: sendButton.clicked() + property string title: stack.itemAt(stack.currentIndex).title - Controls.Frame { - Flickable { - id: outputFlickable - clip: true - anchors.fill: parent - boundsBehavior: Flickable.StopAtBounds + StackLayout { + id: stack - TextArea.flickable: Controls.TextArea { - id: outputArea - } + Screens.TerminalScreen { + id: terminalScreen + property string title: qsTr("Terminal") + } - ScrollBar.horizontal: Controls.ScrollBar {} - ScrollBar.vertical: Controls.ScrollBar {} + Screens.FirmwareUpdateScreen { + id: firmwareUpdateScreen + property string title: qsTr("Firmware update") } Layout.fillWidth: true Layout.fillHeight: true } - RowLayout { + ColumnLayout { spacing: 20 - Controls.Button { - text: qsTr("Clear") - Layout.preferredWidth: 120 - onClicked: outputArea.clear() - } - - Controls.TextField { - id: commandField - implicitHeight: 52 - Layout.fillWidth: true - } - - Controls.Button { - id: sendButton - text: qsTr("Send") - Layout.preferredWidth: 120 - onClicked: { - BmsInterface.commands().sendTerminalCmd(commandField.text) - commandField.clear() + Repeater { + model: [terminalScreen.title, firmwareUpdateScreen.title] + delegate: Controls.LinkLabel { + text: modelData + onClicked: stack.currentIndex = index } } - Controls.Button { - text: qsTr("Help") - Layout.preferredWidth: 120 - onClicked: BmsInterface.commands().sendTerminalCmd("help") + Item { + Layout.fillHeight: true } - Layout.fillWidth: true - } - - Connections { - target: BmsInterface.commands() - onPrintReceived: { - outputArea.append(str) - outputArea.cursorPosition = outputArea.length - } + Layout.preferredWidth: 180 } } diff --git a/qml/Screens/DebugInformationScreen.qml b/qml/Screens/DebugInformationScreen.qml index c59e51f..381653b 100644 --- a/qml/Screens/DebugInformationScreen.qml +++ b/qml/Screens/DebugInformationScreen.qml @@ -38,6 +38,7 @@ ColumnLayout { Connections { target: BmsInterface onStatusMessage: printMessage(msg, isGood) + onPortConnectedChanged: printMessage(BmsInterface.getConnectedPortName(), true) } function printMessage(msg, isGood) { diff --git a/qml/Screens/FirmwareUpdateScreen.qml b/qml/Screens/FirmwareUpdateScreen.qml new file mode 100644 index 0000000..8fe1a70 --- /dev/null +++ b/qml/Screens/FirmwareUpdateScreen.qml @@ -0,0 +1,126 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Dialogs 1.2 +import Qt.labs.settings 1.1 + +import Controls 1.0 as Controls +import Cubo 1.0 + +ColumnLayout { + spacing: 20 + + Controls.Frame { + padding: 35 + + ColumnLayout { + anchors.fill: parent + spacing: 20 + + Controls.TitleLabel { + text: qsTr("Board information") + Layout.fillWidth: true + } + + RowLayout { + spacing: 10 + + Controls.ContentLabel { + text: qsTr("Firmware") + } + + Controls.DotSeparator { + Layout.fillWidth: true + } + + Controls.ContentLabel { + id: firmwareLabel + } + + Layout.fillWidth: true + } + + RowLayout { + spacing: 10 + + Controls.ContentLabel { + text: qsTr("Hardware") + } + + Controls.DotSeparator { + Layout.fillWidth: true + } + + Controls.ContentLabel { + id: hardwareLabel + } + + Layout.fillWidth: true + } + + RowLayout { + spacing: 10 + + Controls.ContentLabel { + text: qsTr("UUID") + } + + Controls.DotSeparator { + Layout.fillWidth: true + } + + Controls.ContentLabel { + id: uuidLabel + } + + Layout.fillWidth: true + } + } + + Layout.fillWidth: true + } + + Controls.Button { + text: qsTr("Upload firmware") + onClicked: firmwareFileDialog.open() + + FileDialog { + id: firmwareFileDialog + title: qsTr("Select firmware file") + folder: shortcuts.documents + nameFilters: [ qsTr("Firmware files (*.bin)"), qsTr("All files (*)") ] + onAccepted: { + if (BmsInterface.isPortConnected()) { + updateHelper.uploadFirmware(firmwareFileDialog.fileUrl.toString().replace(/^(file:\/{3})/, ""), BmsInterface) + } + } + } + + Settings { + category: "firmwareUpdate" + property alias folder: firmwareFileDialog.folder + } + } + + Item { + Layout.fillWidth: true + } + + FirmwareUpdateHelper { + id: updateHelper + } + + Connections { + target: BmsInterface.commands() + onFwVersionReceived: { + firmwareLabel.text = major + "." + minor + hardwareLabel.text = hw + uuidLabel.text = bufferToHex(uuid) + } + } + + function bufferToHex(buffer) { + return [...new Uint8Array(buffer)] + .map(b => b.toString(16).padStart(2, "0")) + .join("").toUpperCase(); + } +} diff --git a/qml/Screens/TerminalScreen.qml b/qml/Screens/TerminalScreen.qml new file mode 100644 index 0000000..11da120 --- /dev/null +++ b/qml/Screens/TerminalScreen.qml @@ -0,0 +1,74 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 + +import Controls 1.0 as Controls +import Cubo 1.0 + +ColumnLayout { + spacing: 20 + + Keys.onReturnPressed: sendButton.clicked() + Keys.onEnterPressed: sendButton.clicked() + + Controls.Frame { + Flickable { + id: outputFlickable + clip: true + anchors.fill: parent + boundsBehavior: Flickable.StopAtBounds + + TextArea.flickable: Controls.TextArea { + id: outputArea + } + + ScrollBar.horizontal: Controls.ScrollBar {} + ScrollBar.vertical: Controls.ScrollBar {} + } + + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + spacing: 20 + + Controls.Button { + text: qsTr("Clear") + Layout.preferredWidth: 120 + onClicked: outputArea.clear() + } + + Controls.TextField { + id: commandField + implicitHeight: 52 + Layout.fillWidth: true + } + + Controls.Button { + id: sendButton + text: qsTr("Send") + Layout.preferredWidth: 120 + onClicked: { + BmsInterface.commands().sendTerminalCmd(commandField.text) + commandField.clear() + } + } + + Controls.Button { + text: qsTr("Help") + Layout.preferredWidth: 120 + onClicked: BmsInterface.commands().sendTerminalCmd("help") + } + + Layout.fillWidth: true + } + + Connections { + target: BmsInterface.commands() + onPrintReceived: { + outputArea.append(str) + outputArea.cursorPosition = outputArea.length + } + } +} diff --git a/qml/Screens/qmldir b/qml/Screens/qmldir index ea698af..b1e6ce1 100644 --- a/qml/Screens/qmldir +++ b/qml/Screens/qmldir @@ -8,3 +8,5 @@ DebugInformationScreen 1.0 DebugInformationScreen.qml ConnectionDialog 1.0 ConnectionDialog.qml MessageDialog 1.0 MessageDialog.qml StatusPopup 1.0 StatusPopup.qml +TerminalScreen 1.0 TerminalScreen.qml +FirmwareUpdateScreen 1.0 FirmwareUpdateScreen.qml diff --git a/qml/qml_items.qrc b/qml/qml_items.qrc index ec37fbc..df8193c 100644 --- a/qml/qml_items.qrc +++ b/qml/qml_items.qrc @@ -41,5 +41,8 @@ Controls/ScrollIndicator.qml Controls/OutlineImageButton.qml Controls/ImageButton.qml + Screens/TerminalScreen.qml + Screens/FirmwareUpdateScreen.qml + Controls/ProgressBar.qml diff --git a/translations/cubo_en.ts b/translations/cubo_en.ts index 31c6dfa..ee3b9f5 100644 --- a/translations/cubo_en.ts +++ b/translations/cubo_en.ts @@ -128,80 +128,80 @@ - + Serial port error: - + TCP Error - + No firmware read response - + Read Firmware Version - + Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. - + Not Supported Firmwares - + This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file. - - + + Error - - + + The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer. - - + + Warning - + The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed. - + The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed. - + Firmware version: %1.%2, Hardware: %3, UUID: %4 - + BMS configuration updated - + BMS configuration stored to Flash @@ -209,18 +209,13 @@ BmsServiceScreen - - Clear + + Terminal - - Send - - - - - Help + + Firmware update @@ -482,10 +477,53 @@ Wait, please. Commands - + BMS configuration is set + + + + Buffer erase + + + + + Buffer erase timeout + + + + + CRC/Size write + + + + + CRC/Size write timeout + + + + + Firmware data write + + + + + Firmware data write timeout + + + + + Firmware update completed! + +Reconnect to the board if you want to continue working with it. + + + + + Cancelled + + ConfigParams @@ -550,6 +588,62 @@ Wait, please. + + FirmwareUpdateHelper + + + Upload error + + + + + Could not open file. Make sure that the path is valid. + + + + + FirmwareUpdateScreen + + + Board information + + + + + Firmware + + + + + Hardware + + + + + UUID + + + + + Upload firmware + + + + + Select firmware file + + + + + Firmware files (*.bin) + + + + + All files (*) + + + MainWindow @@ -564,13 +658,13 @@ Wait, please. - + AKB monitor - + Cell monitor @@ -581,7 +675,7 @@ Wait, please. - + Visualization @@ -601,38 +695,38 @@ Wait, please. - + BMS settings - + Information output - - Terminal - - - - - + + Disconnected - + Serial number - + Connected - + + Firmware update + + + + Tool started @@ -658,6 +752,24 @@ Wait, please. + + TerminalScreen + + + Clear + + + + + Send + + + + + Help + + + Translator diff --git a/translations/cubo_it.ts b/translations/cubo_it.ts index b3d08d7..69db95b 100644 --- a/translations/cubo_it.ts +++ b/translations/cubo_it.ts @@ -128,80 +128,80 @@ - + Serial port error: - + TCP Error - + No firmware read response - + Read Firmware Version - + Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. - + Not Supported Firmwares - + This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file. - - + + Error - - + + The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer. - - + + Warning - + The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed. - + The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed. - + Firmware version: %1.%2, Hardware: %3, UUID: %4 - + BMS configuration updated - + BMS configuration stored to Flash @@ -209,18 +209,13 @@ BmsServiceScreen - - Clear + + Terminal - - Send - - - - - Help + + Firmware update @@ -482,10 +477,53 @@ Wait, please. Commands - + BMS configuration is set + + + + Buffer erase + + + + + Buffer erase timeout + + + + + CRC/Size write + + + + + CRC/Size write timeout + + + + + Firmware data write + + + + + Firmware data write timeout + + + + + Firmware update completed! + +Reconnect to the board if you want to continue working with it. + + + + + Cancelled + + ConfigParams @@ -550,6 +588,62 @@ Wait, please. + + FirmwareUpdateHelper + + + Upload error + + + + + Could not open file. Make sure that the path is valid. + + + + + FirmwareUpdateScreen + + + Board information + + + + + Firmware + + + + + Hardware + + + + + UUID + + + + + Upload firmware + + + + + Select firmware file + + + + + Firmware files (*.bin) + + + + + All files (*) + + + MainWindow @@ -564,13 +658,13 @@ Wait, please. - + AKB monitor - + Cell monitor @@ -581,7 +675,7 @@ Wait, please. - + Visualization @@ -601,38 +695,38 @@ Wait, please. - + BMS settings - + Information output - - Terminal - - - - - + + Disconnected - + Serial number - + Connected - + + Firmware update + + + + Tool started @@ -658,6 +752,24 @@ Wait, please. + + TerminalScreen + + + Clear + + + + + Send + + + + + Help + + + Translator diff --git a/translations/cubo_ru.qm b/translations/cubo_ru.qm index 41d8cdc15b7444633792ed76fc8bb9a01490ed6f..c84772bf48f3e4f7b60928773886b945d21c8a99 100644 GIT binary patch delta 3167 zcmb7F4OCO-8Gdi_1(Hi3q7)cva-s4orU3#12|p%)Ai7q5x^Atmkz6EgNN7l)mSI{u zj&-%|XmC4r4BKtG)vaqCYCUUbrv=)1=33_LYR9x%S=ZXL&bit-d&Zu7Q&Ou)PvO9u z@4Mf9-uHc;=l$~7qug6NxS;ibGx^AegWHa#E_mtAr+)KS8amGSa(2aOIQJE7lfc^gvrRNc)ypEWUIE7e1G~bA5MqER58`fC`#6Ccd ziWQ{F7_7pFUQ#{%C!*pPDJP?oDAPnM7H=XdYzoJUx&1#(3f@J%-%=6Pm}%fO1u9t? zj@eb=XnlkRCYp(suBEYpD5A7w^v07vA-d@~`nU@F#%H;t!vm;#h)XF<$9^-HHiU}V zc`kk84AH`!+^cynqLT~UnFpJQtXA%9u}EZlkGpI_alEBOk?@PPL<{Z=E#xwT-HLC& z`3lJCSL{Bx9j~ue9Bmhfq7NueZEqyXZBR^}&LGksQ@pzY1XUF)dHo5Lw?kQEuoGFd z%JM0YW_w7vX2}JjjBe#OJCx}CfU9qiuc&k`+u zgAE#?uKmAku*Xbfx{)2^Td zgk$NdP_x1i?28^djx-r3qCb{oUCz|{O{qjtZE71I55C6L57ySgfTVtS0%?nR^|qdB zEDx&>9UcejGwN4|JJIIL>J#Z`w^Xf3x$Gy>RA>r~d*I(qnuavUUfig09S4swrJ6_I zpTzk-&G+{rZ?O8DX5z^{xblSN)Rvt{_<-iZOQYbWN;CCQIm|b}$Icyub5HWgYyOCK zQurnJ{~H2qi!nf=poWQ<$^F9hj+8Glp8Xbp5?JJR?hO7g%#pcF)Iu`7C(QEuEynS z?{@e^A<*G;_{EUbkP;d#$qZE*5{LT@r{)FqES1@CzLJ^3?~wp3JF5Z?_SBM(qwuG- z1zKB0pCI}ionkaL)OK%syTjw`pJ|taj93W%ZH5shrV_v(2OxgoY=#)i?a^$YsF3N<)?2Gr}f_SQ^h1dA22R<%$tAL>cGN-XEgHmePD zK&iwN&*q|^3Rzdl$hJgQD8DYb+lK8*i7xp2{G6nq^rTdNY5|xHCv&kXgh?!NifWvc z+$}wsF2O8A7s;1?EyJHANeLMvlH494AUs7vi?_YQE&4^fGnMBX#1^l| zBewVjzgO_LiNZRs!{-!St-=OxKG$^sF{1D6r*HzjECeDcSbOns~mTWLT3Q;?{9OU4pi6Skn(m4T@JU)X_P#cFx_6Wd`HxZ?het%HArKvhnSLN zd63M6N+ih&z?dDMAYz0eZF7g)>u}TCUFN-4GJz+nWOD3c&${{1IBNurnJ5p!jG`K8DXQq&qV_fI*WY3-}Ii!zE{_GM{ z*TPcLJwE$ex$^Af$ul)=`e{qyeh4Nsif+lMt<&EMl1pZRoWf6}5!T#XS2fFF*kzG? zKTR7%sz4gB$mHkCqi>HO>OOVNbU8DC4{t28D!$AY+@Ylj!@n+$;f6mcDOH4OiZV5E fO`@;e<#D(}iH4jjR`mvxF7hmFlwq^=FZ}-jcj)db delta 1228 zcmY+DYfw~W7{~wTvdf;cXE`Dy2*gz`a#?p_!CIHw3Jd|MGfQfdR0fMN6O6Tj65$%e z7#7yJFohB(0g+=LXi1r=RzxJUA-Xveg&~*K5=KMHYG|^D_EVpJ=Q-zn-}5}b_j!Ie z$-Hrtv6}`;1Fqa@ZygH{KL7No&#svP{!IXpKw>R%J8_=gbpRV*BhC@e0E$h(1{d)O zAmtjdir$X_QFm{I+wl=Ko4I@3@D7!ERX4_N`Di&@rv2PBWPerKKpf^Ci* zCdPh*edYVl$wL==+SNweOWCoCFu-eooocfH30BrU9SwxsU~krx0wxWY8oHTI>EzPy zlNVz#SDd&6L?7Xv+RIUyUvPD&Qz^YsuBnJ(M#s$_BEPBmJli@9=wtbyHI+a{Hy^C( z0_@^EA90^#>VM>S9os^pZ}WQ!qNx6T{DE_GK>RO!yEYQoG|sz3Z~Acw?@FL`nPm!H zrV|K%M^SKnrK}i5Z9)j(`?K{>hY0opgE zbZa}|i?n#KGhNj%V72AI9Xx({;6YoPey z3G(G#Ena?|_A`HbXu2oP=L)bR=%kuENaC}i)mu$3Q)8;s&BHeV?U34i?mZIO;bBy} z`feS?VUpx?=}W-hBKffthX~S+!)|KK<5J0Snx0HQ>G|Ovfc;3S&R?NcdNGc?>zbw7 zvo11nTWVn@Y2y5)!EeLu)Pj0x1f)z@lBVyGB9v%K-fyG?{5;IEYHY94L}m4A8h^FY zjaO-!w)xY9F`7PqYAx+!nky>_Z^-m!1Ad}|+q{b|aAY#i+j;9ECG?dno}C~w`SP0N z5g@Kh4jCS%bz5ZXE~ABde@?FIqgInf32(B diff --git a/translations/cubo_ru.ts b/translations/cubo_ru.ts index e348d0c..321d217 100644 --- a/translations/cubo_ru.ts +++ b/translations/cubo_ru.ts @@ -128,80 +128,80 @@ Поддержка последовательного порта не включена в этой сборке утилиты. - + Serial port error: Ошибка последовательного порта: - + TCP Error Ошибка TCP - + No firmware read response Нет ответа на чтение прошивки - + Read Firmware Version Чтение версии прошивки - + Could not read firmware version. Make sure that selected port really belongs to the ENNOID-BMS. Не удалось прочитать версию прошивки. Убедитесь, что выбранный порт действительно принадлежит ENNOID-BMS. - + Not Supported Firmwares Не поддерживаемые прошивки - + This version of ENNOID-BMS Tool does not seem to have any supported firmwares. Something is probably wrong with the BMS configuration file. Эта версия утилиты не имеет поддерживаемых прошивок. Вероятно, что-то не так с файлом конфигурации BMS. - - + + Error Ошибка - - + + The firmware on the connected ENNOID-BMS is too old. Please update it using a programmer. Прошивка подключенного ENNOID-BMS устарела. Пожалуйста, обновите его с помощью программатора. - - + + Warning Внимание - + The connected ENNOID-BMS has newer firmware than this version of the ENNOID-BMS Tool supports. It is recommended that you update the ENNOID-BMS Tool to the latest version. Alternatively, the firmware on the connected ENNOID-BMS can be downgraded in the firmware page. Until then, limited communication mode will be used where only the firmware can be changed. Подключенный ENNOID-BMS имеет более новую прошивку, чем поддерживает эта версия инструмента ENNOID-BMS. Рекомендуется обновить инструмент ENNOID-BMS до последней версии. Кроме того, прошивку подключенного ENNOID-BMS можно понизить на странице прошивки. До тех пор будет использоваться ограниченный режим связи, при котором можно будет изменить только прошивку. - + The connected ENNOID-BMS has too old firmware. Since the connected ENNOID-BMS has firmware with bootloader support, it can be updated from the Firmware page. Until then, limited communication mode will be used where only the firmware can be changed. Подключенный ENNOID-BMS имеет слишком старую прошивку. Поскольку подключенный ENNOID-BMS имеет встроенное ПО с поддержкой загрузчика, его можно обновить со страницы встроенного ПО. До тех пор будет использоваться ограниченный режим связи, при котором можно будет изменить только прошивку. - + Firmware version: %1.%2, Hardware: %3, UUID: %4 Версия прошивки: %1.%2, Оборудование: %3, UUID: %4 - + BMS configuration updated Конфигурация BMS обновлена - + BMS configuration stored to Flash Конфигурация BMS сохранена во флэш-памяти @@ -209,19 +209,26 @@ BmsServiceScreen - Clear - Очистить + Очистить - Send - Отправить + Отправить - Help - Помощь + Помощь + + + + Terminal + Терминал + + + + Firmware update + Обновление прошивки @@ -487,10 +494,59 @@ Wait, please. Commands - + BMS configuration is set Конфигурация BMS установлена + + + + Buffer erase + Стирание буфера + + + + Buffer erase timeout + Таймаут стирания буфера + + + + CRC/Size write + Запись контрольной суммы + + + + CRC/Size write timeout + Таймаут записи контрольной суммы + + + + Firmware data write + Запись данных прошивки + + + + Firmware data write timeout + Таймаут записи данных прошивки + + + + Firmware update completed! + +Reconnect to the board if you want to continue working with it. + Обновление прошивки завершено! + +Выполните повторное подключение к плате, если хотите продолжить работу с ней. + + + Firmware update completed + Обновление прошивки завершено + + + + Cancelled + Отменено + ConfigParams @@ -555,6 +611,62 @@ Wait, please. Очистить + + FirmwareUpdateHelper + + + Upload error + Ошибка загрузки + + + + Could not open file. Make sure that the path is valid. + Не удалось открыть файл. Убедитесь что путь валидный. + + + + FirmwareUpdateScreen + + + Board information + Информация о плате + + + + Firmware + Прошивка + + + + Hardware + Оборудование + + + + UUID + + + + + Upload firmware + Загрузить прошивку + + + + Select firmware file + Выберите файл прошивки + + + + Firmware files (*.bin) + Файлы прошивок (*.bin) + + + + All files (*) + Все файлы (*) + + MainWindow @@ -573,13 +685,13 @@ Wait, please. - + AKB monitor Монитор АКБ - + Cell monitor Монитор ячеек @@ -590,7 +702,7 @@ Wait, please. - + Visualization Визуализация @@ -610,22 +722,26 @@ Wait, please. Подключение - + BMS settings Настройка BMS - + Information output Вывод информации - - Terminal - Терминал + + Firmware update + Обновление прошивки - + Terminal + Терминал + + + Tool started Утилита запущена @@ -634,18 +750,18 @@ Wait, please. Выход - - + + Disconnected Отключено - + Serial number Серийный номер - + Connected Подключено @@ -671,6 +787,24 @@ Wait, please. Не удалось автоматически подключиться. Убедитесь, что USB-кабель подключен и ENNOID-BMS включен. + + TerminalScreen + + + Clear + Очистить + + + + Send + Отправить + + + + Help + Помощь + + Translator