From 649c9ed2a04465a52f311a2e058fa3444f42506b Mon Sep 17 00:00:00 2001 From: Yury Shuvakin Date: Sun, 26 Mar 2023 23:45:49 +0300 Subject: [PATCH] Added fault state popup --- commands.cpp | 102 +++++++++++++----- commands.h | 5 +- datatypes.h | 18 ++++ main.cpp | 3 + qml/Icons/error-state.svg | 12 +++ qml/Icons/good-state.svg | 12 +++ qml/Icons/info-state.svg | 12 +++ qml/Icons/neutral-state.svg | 12 +++ qml/Icons/warning-state.svg | 12 +++ qml/MainWindow.qml | 61 +++++++++-- qml/Screens/DebugInformationScreen.qml | 18 +--- qml/Screens/StatePopup.qml | 97 +++++++++++++++++ qml/Screens/qmldir | 1 + qml/qml_icons.qrc | 5 + qml/qml_items.qrc | 1 + translations/cubo_en.ts | 143 +++++++++++++++++++++++-- translations/cubo_it.ts | 143 +++++++++++++++++++++++-- translations/cubo_ru.qm | Bin 26010 -> 28694 bytes translations/cubo_ru.ts | 143 +++++++++++++++++++++++-- 19 files changed, 715 insertions(+), 85 deletions(-) create mode 100644 qml/Icons/error-state.svg create mode 100644 qml/Icons/good-state.svg create mode 100644 qml/Icons/info-state.svg create mode 100644 qml/Icons/neutral-state.svg create mode 100644 qml/Icons/warning-state.svg create mode 100644 qml/Screens/StatePopup.qml diff --git a/commands.cpp b/commands.cpp index 7988b75..1d5a026 100644 --- a/commands.cpp +++ b/commands.cpp @@ -161,7 +161,7 @@ void Commands::processPacket(QByteArray data) values.opState = opStateToStr((OperationalStateTypedef)vb.vbPopFrontUint8()); values.balanceActive = vb.vbPopFrontUint8(); - values.faultState = faultStateToStr((bms_fault_code)vb.vbPopFrontUint8()); + values.faultState = faultStateToString((bms_fault_code)vb.vbPopFrontUint8()); emit valuesReceived(values); } break; @@ -271,6 +271,12 @@ void Commands::processPacket(QByteArray data) emit ackReceived(tr("Network settings applied successfully")); break; } + case COMM_GET_FAULT_STATE: + { + const auto state = static_cast(vb.vbPopFrontUint16()); + emit faultStateReceived(faultStateToType(state), faultStateToString(state)); + break; + } default: break; } @@ -367,6 +373,13 @@ void Commands::setNetSettings(QStringList settings) emitData(vb); } +void Commands::getFaultState() +{ + VByteArray vb; + vb.vbAppendInt8(COMM_GET_FAULT_STATE); + emitData(vb); +} + void Commands::sendTerminalCmd(QString cmd) { VByteArray vb; @@ -615,34 +628,67 @@ QString Commands::opStateToStr(OperationalStateTypedef fault) } } -QString Commands::faultStateToStr(bms_fault_code fault) +QString Commands::faultStateToString(bms_fault_code fault) { - switch (fault) { - case FAULT_CODE_NONE: return "System OK"; - case FAULT_CODE_PACK_OVER_VOLTAGE: return "Pack overvoltage"; - case FAULT_CODE_PACK_UNDER_VOLTAGE: return "Pack undervoltage"; - case FAULT_CODE_LOAD_OVER_VOLTAGE: return "Load overvoltage"; - case FAULT_CODE_LOAD_UNDER_VOLTAGE: return "Load undervoltage"; - case FAULT_CODE_CHARGER_OVER_VOLTAGE: return "Charger overvoltage"; - case FAULT_CODE_CHARGER_UNDER_VOLTAGE: return "Charger undervoltgae"; - case FAULT_CODE_CELL_HARD_OVER_VOLTAGE: return "Cell hard overvoltage"; - case FAULT_CODE_CELL_HARD_UNDER_VOLTAGE: return "Cell hard undervoltage"; - case FAULT_CODE_CELL_SOFT_OVER_VOLTAGE: return "Cell soft overvoltage"; - case FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE: return "Cell soft undervoltage"; - case FAULT_CODE_MAX_UVP_OVP_ERRORS: return "MAX OVP/UVP errors"; - case FAULT_CODE_MAX_UVT_OVT_ERRORS: return "MAX OVT/UVT errors"; - case FAULT_CODE_OVER_CURRENT: return "Over current"; - case FAULT_CODE_OVER_TEMP_BMS: return "Over temp BMS"; - case FAULT_CODE_UNDER_TEMP_BMS: return "Under temp BMS"; - case FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS: return "Discharge over temp cell"; - case FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS: return "Discharge under temp cell"; - case FAULT_CODE_CHARGE_OVER_TEMP_CELLS: return "Charge over temp cell"; - case FAULT_CODE_CHARGE_UNDER_TEMP_CELLS: return "Charge under temp cell"; - case FAULT_CODE_PRECHARGE_TIMEOUT: return "Precharge timeout"; - case FAULT_CODE_DISCHARGE_RETRY: return "Discharge retry"; - case FAULT_CODE_CHARGE_RETRY: return "Charge retry"; - case FAULT_CODE_CHARGER_DISCONNECT: return "Charge retry"; - default: return "Unknown fault"; + switch (fault) + { + case FAULT_CODE_NONE: return tr("System ok"); + case FAULT_CODE_PACK_OVER_VOLTAGE: return tr("Pack overvoltage"); + case FAULT_CODE_PACK_UNDER_VOLTAGE: return tr("Pack undervoltage"); + case FAULT_CODE_LOAD_OVER_VOLTAGE: return tr("Load overvoltage"); + case FAULT_CODE_LOAD_UNDER_VOLTAGE: return tr("Load undervoltage"); + case FAULT_CODE_CHARGER_OVER_VOLTAGE: return tr("Charger overvoltage"); + case FAULT_CODE_CHARGER_UNDER_VOLTAGE: return tr("Charger undervoltgae"); + case FAULT_CODE_CELL_HARD_OVER_VOLTAGE: return tr("Cell hard overvoltage"); + case FAULT_CODE_CELL_HARD_UNDER_VOLTAGE: return tr("Cell hard undervoltage"); + case FAULT_CODE_CELL_SOFT_OVER_VOLTAGE: return tr("Cell soft overvoltage"); + case FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE: return tr("Cell soft undervoltage"); + case FAULT_CODE_MAX_UVP_OVP_ERRORS: return tr("Too high or too low voltage"); + case FAULT_CODE_MAX_UVT_OVT_ERRORS: return tr("Too high or too low temperature"); + case FAULT_CODE_OVER_CURRENT: return tr("Over current"); + case FAULT_CODE_OVER_TEMP_BMS: return tr("Over temperature BMS"); + case FAULT_CODE_UNDER_TEMP_BMS: return tr("Under temperature BMS"); + case FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS: return tr("Discharge over temperature cell"); + case FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS: return tr("Discharge under temperature cell"); + case FAULT_CODE_CHARGE_OVER_TEMP_CELLS: return tr("Charge over temperature cell"); + case FAULT_CODE_CHARGE_UNDER_TEMP_CELLS: return tr("Charge under temperature cell"); + case FAULT_CODE_PRECHARGE_TIMEOUT: return tr("Precharge timeout"); + case FAULT_CODE_DISCHARGE_RETRY: return tr("Discharge retry"); + case FAULT_CODE_CHARGE_RETRY: return tr("Charge retry"); + case FAULT_CODE_CHARGER_DISCONNECT: return tr("Charge retry"); + default: return tr("Unknown state"); + } +} + +DataTypes::StateType Commands::faultStateToType(bms_fault_code fault) +{ + switch (fault) + { + case FAULT_CODE_NONE: return DataTypes::StateType::Good; + case FAULT_CODE_PACK_OVER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_PACK_UNDER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_LOAD_OVER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_LOAD_UNDER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CHARGER_OVER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CHARGER_UNDER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CELL_HARD_OVER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CELL_HARD_UNDER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CELL_SOFT_OVER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE: return DataTypes::StateType::Error; + case FAULT_CODE_MAX_UVP_OVP_ERRORS: return DataTypes::StateType::Error; + case FAULT_CODE_MAX_UVT_OVT_ERRORS: return DataTypes::StateType::Error; + case FAULT_CODE_OVER_CURRENT: return DataTypes::StateType::Error; + case FAULT_CODE_OVER_TEMP_BMS: return DataTypes::StateType::Error; + case FAULT_CODE_UNDER_TEMP_BMS: return DataTypes::StateType::Error; + case FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS: return DataTypes::StateType::Error; + case FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS: return DataTypes::StateType::Error; + case FAULT_CODE_CHARGE_OVER_TEMP_CELLS: return DataTypes::StateType::Error; + case FAULT_CODE_CHARGE_UNDER_TEMP_CELLS: return DataTypes::StateType::Error; + case FAULT_CODE_PRECHARGE_TIMEOUT: return DataTypes::StateType::Warning; + case FAULT_CODE_DISCHARGE_RETRY: return DataTypes::StateType::Info; + case FAULT_CODE_CHARGE_RETRY: return DataTypes::StateType::Info; + case FAULT_CODE_CHARGER_DISCONNECT: return DataTypes::StateType::Info; + default: return DataTypes::StateType::Info; } } diff --git a/commands.h b/commands.h index bc8a7b9..5818e7a 100644 --- a/commands.h +++ b/commands.h @@ -72,6 +72,7 @@ signals: void valuesSetupReceived(BMS_VALUES values); void pingCanRx(QVector devs, bool isTimeout); void netSettingsReceived(QStringList settings); + void faultStateReceived(DataTypes::StateType faultType, QString faultString); public slots: void processPacket(QByteArray data); @@ -84,6 +85,7 @@ public slots: void getNetSettings(); void getNetDefaultSettings(); void setNetSettings(QStringList settings); + void getFaultState(); void sendTerminalCmd(QString cmd); void setDetect(disp_pos_mode mode); void samplePrint(debug_sampling_mode mode, int sample_len, int dec); @@ -102,7 +104,8 @@ private: void emitData(QByteArray data); void firmwareUploadUpdate(bool isTimeout); QString opStateToStr(OperationalStateTypedef fault); - QString faultStateToStr(bms_fault_code fault); + QString faultStateToString(bms_fault_code fault); + DataTypes::StateType faultStateToType(bms_fault_code fault); QTimer *mTimer; bool mSendCan; diff --git a/datatypes.h b/datatypes.h index 24f9de8..16aad99 100644 --- a/datatypes.h +++ b/datatypes.h @@ -84,6 +84,8 @@ typedef enum { FAULT_CODE_PRECHARGE_TIMEOUT, FAULT_CODE_DISCHARGE_RETRY, FAULT_CODE_CHARGE_RETRY, + FAULT_CODE_CAN_DELAYED_POWER_DOWN, + FAULT_CODE_NOT_USED_TIMEOUT, FAULT_CODE_CHARGER_DISCONNECT } bms_fault_code; @@ -419,6 +421,7 @@ typedef enum { COMM_GET_BMS_NET_SETTINGS, COMM_GET_BMS_NET_DEFAULT_SETTINGS, COMM_SET_BMS_NET_SETTINGS, + COMM_GET_FAULT_STATE, } COMM_PACKET_ID; typedef struct { @@ -469,4 +472,19 @@ typedef enum { OP_STATE_FORCEON, // 11 } OperationalStateTypedef; +namespace DataTypes +{ + Q_NAMESPACE + + enum class StateType + { + Neutral, + Info, + Good, + Warning, + Error + }; + Q_ENUM_NS(StateType); +} + #endif // DATATYPES_H diff --git a/main.cpp b/main.cpp index 625ae49..76ea02d 100644 --- a/main.cpp +++ b/main.cpp @@ -79,6 +79,9 @@ int main(int argc, char *argv[]) qmlRegisterType("Cubo", 1, 0, "FirmwareUpdateHelper"); qmlRegisterType("Cubo", 1, 0, "CurrentTableModel"); + qmlRegisterUncreatableMetaObject(DataTypes::staticMetaObject, "Cubo", 1, 0, "DataTypes", "Error: only enums"); + qRegisterMetaType("DataTypes::StateType"); + engine.addImportPath(QStringLiteral("qrc:/")); engine.load(QUrl(QStringLiteral("qrc:/MainWindow.qml"))); diff --git a/qml/Icons/error-state.svg b/qml/Icons/error-state.svg new file mode 100644 index 0000000..4102a6c --- /dev/null +++ b/qml/Icons/error-state.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/qml/Icons/good-state.svg b/qml/Icons/good-state.svg new file mode 100644 index 0000000..9634ce2 --- /dev/null +++ b/qml/Icons/good-state.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/qml/Icons/info-state.svg b/qml/Icons/info-state.svg new file mode 100644 index 0000000..cf7a785 --- /dev/null +++ b/qml/Icons/info-state.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/qml/Icons/neutral-state.svg b/qml/Icons/neutral-state.svg new file mode 100644 index 0000000..7bddb43 --- /dev/null +++ b/qml/Icons/neutral-state.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/qml/Icons/warning-state.svg b/qml/Icons/warning-state.svg new file mode 100644 index 0000000..1a30dc4 --- /dev/null +++ b/qml/Icons/warning-state.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/qml/MainWindow.qml b/qml/MainWindow.qml index 918b46d..bba6b59 100644 --- a/qml/MainWindow.qml +++ b/qml/MainWindow.qml @@ -353,11 +353,16 @@ ApplicationWindow { onPortConnectedChanged: { connectionStatusLabel.text = Qt.binding(function(){ return BmsInterface.isPortConnected() ? qsTr("Connected") : qsTr("Disconnected") }) connectionStatusIndicator.enabled = BmsInterface.isPortConnected() + faultStateTimer.running = BmsInterface.isPortConnected() + if (BmsInterface.isPortConnected()) { BmsInterface.commands().getBMSconf() + BmsInterface.commands().getFaultState() } else { serialLabel.text = "-" firmwareLabel.text = "-" + statusPopup.queue = [] + faultStatePopup.lastState = "" } } @@ -419,6 +424,17 @@ ApplicationWindow { onFwVersionReceived: { firmwareLabel.text = major + "." + minor } + onFaultStateReceived: { + if (faultStatePopup.lastState != faultString) { + faultStatePopup.close() + faultStatePopup.lastState = faultString + faultStatePopup.text = faultString + faultStatePopup.type = faultType + faultStatePopup.open() + + Qt.callLater(debugScreen.printMessage, faultString, faultStatePopup.color) + } + } } Screens.ConnectionDialog { @@ -457,12 +473,12 @@ ApplicationWindow { onOpened: { hideStatusTimer.start() } - } - Timer { - id: hideStatusTimer - interval: 3000 - onTriggered: statusPopup.close() + Timer { + id: hideStatusTimer + interval: 3000 + onTriggered: statusPopup.close() + } } Popup { @@ -505,6 +521,12 @@ ApplicationWindow { onOpened: hideBusyTimer.start() onClosed: hideBusyTimer.stop() + + Timer { + id: hideBusyTimer + interval: 30000 + onTriggered: busyPopup.close() + } } Popup { @@ -549,10 +571,29 @@ ApplicationWindow { } } - Timer { - id: hideBusyTimer - interval: 30000 - onTriggered: busyPopup.close() + Screens.StatePopup { + id: faultStatePopup + x: parent.width - width - 45 + y: 18 + + property var lastState: "" + + onOpened: { + hideStateTimer.start() + } + + Timer { + id: hideStateTimer + interval: 3000 + onTriggered: faultStatePopup.close() + } + + Timer { + id: faultStateTimer + interval: 50000 + repeat: true + onTriggered: BmsInterface.commands().getFaultState() + } } background: Rectangle { @@ -561,6 +602,6 @@ ApplicationWindow { Component.onCompleted: { connectionDialog.open() - Qt.callLater(debugScreen.printMessage, qsTr("Tool started"), true) + Qt.callLater(debugScreen.printMessage, qsTr("Tool started")) } } diff --git a/qml/Screens/DebugInformationScreen.qml b/qml/Screens/DebugInformationScreen.qml index 381653b..e954190 100644 --- a/qml/Screens/DebugInformationScreen.qml +++ b/qml/Screens/DebugInformationScreen.qml @@ -37,23 +37,15 @@ ColumnLayout { Connections { target: BmsInterface - onStatusMessage: printMessage(msg, isGood) - onPortConnectedChanged: printMessage(BmsInterface.getConnectedPortName(), true) + onStatusMessage: printMessage(msg, isGood ? Palette.textColor : Palette.invalidColor) + onPortConnectedChanged: printMessage(BmsInterface.getConnectedPortName()) } - function printMessage(msg, isGood) { - var message = "" - - if (!isGood) { - message += "" - } + function printMessage(msg, color = Palette.textColor) { + var message = "" message += new Date().toLocaleString(Qt.locale("en-US"), "dd.MM.yyyy hh:mm:ss") + ": " + msg - - if (!isGood) { - message += "" - } - + message += "" message += "
" outputArea.insert(outputArea.length, message) diff --git a/qml/Screens/StatePopup.qml b/qml/Screens/StatePopup.qml new file mode 100644 index 0000000..3267469 --- /dev/null +++ b/qml/Screens/StatePopup.qml @@ -0,0 +1,97 @@ +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 Utils 1.0 + +Popup { + id: root + closePolicy: Popup.NoAutoClose + + property string text: "" + property var type: DataTypes.StateType.Info + property color color: switch (type) { + case DataTypes.StateType.Info: + return "#0A72BA" + case DataTypes.StateType.Good: + return "#009352" + case DataTypes.StateType.Warning: + return "#E5C207" + case DataTypes.StateType.Error: + return "#CF3200" + case DataTypes.StateType.Neutral: + default: + return "#838D97" + } + + property var icon: switch (type) { + case DataTypes.StateType.Info: + return "qrc:/Icons/info-state.svg" + case DataTypes.StateType.Good: + return "qrc:/Icons/good-state.svg" + case DataTypes.StateType.Warning: + return "qrc:/Icons/warning-state.svg" + case DataTypes.StateType.Error: + return "qrc:/Icons/error-state.svg" + case DataTypes.StateType.Neutral: + default: + return "qrc:/Icons/neutral-state.svg" + } + + + + RowLayout { + spacing: 15 + + Image { + source: root.icon + Layout.leftMargin: 5 + } + + Controls.SubtitleLabel { + id: label + text: root.text + maximumLineCount: 10 + wrapMode: Text.Wrap + } + } + + background: Rectangle { + radius: 6 + color: "#F7F8FC" + + Rectangle { + radius: 6 + anchors.fill: parent + color: Qt.rgba(root.color.r, root.color.g, root.color.b, 0.1) + } + + Rectangle { + radius: 6 + width: 4 + height: parent.height + anchors.left: parent.left + color: root.color + } + } + + enter: Transition { + NumberAnimation { + property: "opacity" + from: 0.0 + to: 1.0 + duration: 300 + } + } + + exit: Transition { + NumberAnimation { + property: "opacity" + from: 1.0 + to: 0.0 + duration: 2500 + } + } +} diff --git a/qml/Screens/qmldir b/qml/Screens/qmldir index 1b900e3..621f21a 100644 --- a/qml/Screens/qmldir +++ b/qml/Screens/qmldir @@ -14,3 +14,4 @@ NetworkSettingsScreen 1.0 NetworkSettingsScreen.qml TimeSettingsScreen 1.0 TimeSettingsScreen.qml CanSettingsScreen 1.0 CanSettingsScreen.qml TemperatureMonitorScreen 1.0 TemperatureMonitorScreen.qml +StatePopup 1.0 StatePopup.qml diff --git a/qml/qml_icons.qrc b/qml/qml_icons.qrc index dfffef1..f161628 100644 --- a/qml/qml_icons.qrc +++ b/qml/qml_icons.qrc @@ -19,5 +19,10 @@ Icons/russian-flag.svg Icons/refresh.svg Icons/temperature.svg + Icons/error-state.svg + Icons/good-state.svg + Icons/info-state.svg + Icons/neutral-state.svg + Icons/warning-state.svg diff --git a/qml/qml_items.qrc b/qml/qml_items.qrc index 6f5045f..95df15e 100644 --- a/qml/qml_items.qrc +++ b/qml/qml_items.qrc @@ -49,5 +49,6 @@ Controls/RadioButton.qml Screens/TemperatureMonitorScreen.qml Screens/CanSettingsScreen.qml + Screens/StatePopup.qml diff --git a/translations/cubo_en.ts b/translations/cubo_en.ts index dc09868..3eaaa01 100644 --- a/translations/cubo_en.ts +++ b/translations/cubo_en.ts @@ -588,45 +588,166 @@ Wait, please. - - + + 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. - + + System ok + + + + + Pack overvoltage + + + + + Pack undervoltage + + + + + Load overvoltage + + + + + Load undervoltage + + + + + Charger overvoltage + + + + + Charger undervoltgae + + + + + Cell hard overvoltage + + + + + Cell hard undervoltage + + + + + Cell soft overvoltage + + + + + Cell soft undervoltage + + + + + Too high or too low voltage + + + + + Too high or too low temperature + + + + + Over current + + + + + Over temperature BMS + + + + + Under temperature BMS + + + + + Discharge over temperature cell + + + + + Discharge under temperature cell + + + + + Charge over temperature cell + + + + + Charge under temperature cell + + + + + Precharge timeout + + + + + Discharge retry + + + + + + Charge retry + + + + + Unknown state + + + + Cancelled @@ -833,12 +954,12 @@ Reconnect to the board if you want to continue working with it. - + Firmware update - + Tool started diff --git a/translations/cubo_it.ts b/translations/cubo_it.ts index ba08213..55e4344 100644 --- a/translations/cubo_it.ts +++ b/translations/cubo_it.ts @@ -588,45 +588,166 @@ Wait, please. - - + + 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. - + + System ok + + + + + Pack overvoltage + + + + + Pack undervoltage + + + + + Load overvoltage + + + + + Load undervoltage + + + + + Charger overvoltage + + + + + Charger undervoltgae + + + + + Cell hard overvoltage + + + + + Cell hard undervoltage + + + + + Cell soft overvoltage + + + + + Cell soft undervoltage + + + + + Too high or too low voltage + + + + + Too high or too low temperature + + + + + Over current + + + + + Over temperature BMS + + + + + Under temperature BMS + + + + + Discharge over temperature cell + + + + + Discharge under temperature cell + + + + + Charge over temperature cell + + + + + Charge under temperature cell + + + + + Precharge timeout + + + + + Discharge retry + + + + + + Charge retry + + + + + Unknown state + + + + Cancelled @@ -833,12 +954,12 @@ Reconnect to the board if you want to continue working with it. - + Firmware update - + Tool started diff --git a/translations/cubo_ru.qm b/translations/cubo_ru.qm index fc9b69cfb2d8ddf65c0db0f397c90275a69bd3d6..8bd9399ffcc4cdb761e24d037f11d82ed7f4dec7 100644 GIT binary patch delta 3875 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 Настройки сети успешно применены - - + + 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. @@ -676,12 +676,133 @@ Reconnect to the board if you want to continue working with it. Выполните повторное подключение к плате, если хотите продолжить работу с ней. + + + System ok + Система в порядке + + + + Pack overvoltage + Напряжение пакета превышено + + + + Pack undervoltage + Напряжение пакета занижено + + + + Load overvoltage + Напряжение загрузки превышено + + + + Load undervoltage + Напряжение загрузки занижено + + + + Charger overvoltage + Напряжение зарядки завышено + + + + Charger undervoltgae + Напряжение зарядки занижено + + + + Cell hard overvoltage + Напряжение ячейки сильно завышено + + + + Cell hard undervoltage + Напряжение ячейки сильно занижено + + + + Cell soft overvoltage + Напряжение ячейки завышено + + + + Cell soft undervoltage + Напряжение ячейки занижено + + + + Too high or too low voltage + Слишком высокий или низкий вольтаж + + + + Too high or too low temperature + Слишком высокая или низкая температура + + + + Over current + Превышен ток + + + + Over temperature BMS + Превышена температура BMS + + + + Under temperature BMS + Занижена температура BMS + + + + Discharge over temperature cell + Превышена температура разряда ячейки + + + + Discharge under temperature cell + Занижена температура разряда ячейки + + + + Charge over temperature cell + Превышена температура заряда ячейки + + + + Charge under temperature cell + Занижена температура заряда ячейки + + + + Precharge timeout + Тайм-аут предварительной зарядки + + + + Discharge retry + Попытка рязряда + + + + + Charge retry + Попытка заряда + + + + Unknown state + Неизвестное состояние + Firmware update completed Обновление прошивки завершено - + Cancelled Отменено @@ -876,7 +997,7 @@ Reconnect to the board if you want to continue working with it. Вывод информации - + Firmware update Обновление прошивки @@ -885,7 +1006,7 @@ Reconnect to the board if you want to continue working with it. Терминал - + Tool started Утилита запущена