import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtGraphicalEffects 1.0 import Controls 1.0 as Controls import Cubo 1.0 import Utils 1.0 Item { id: root Component { id: cellListHeader RowLayout { spacing: 0 width: ListView.view.width Rectangle { id: numberTab color: Palette.tableHeaderBackgroundColor Layout.preferredHeight: 60 Layout.fillWidth: true Controls.SubtitleLabel { id: indexTitleLabel text: qsTr("#") color: Palette.tableHeaderTextColor anchors.centerIn: parent } } Rectangle { id: voltageTab color: Palette.tableHeaderBackgroundColor Layout.preferredHeight: 60 Layout.fillWidth: true Controls.SubtitleLabel { id: voltageTitleLabel text: qsTr("Voltage") color: Palette.tableHeaderTextColor anchors.centerIn: parent } } Rectangle { id: balancingTab color: Palette.tableHeaderBackgroundColor Layout.preferredHeight: 60 Layout.fillWidth: true Controls.SubtitleLabel { id: balancingTitleLabel text: qsTr("Balancing") color: Palette.tableHeaderTextColor anchors.centerIn: parent } } Layout.fillWidth: true } } Component { id: cellListDelegate RowLayout { spacing: 10 width: ListView.view.width height: 36 Item { Layout.preferredWidth: parent.width / 6 - 24 } Controls.SubtitleLabel { id: indexLabel color: Palette.tableHeaderTextColor horizontalAlignment: Text.AlignHCenter Layout.preferredWidth: 25 Layout.alignment: Qt.AlignCenter } Controls.DotSeparator { Layout.fillWidth: true } Controls.SubtitleLabel { text: modelData.voltage + " " + qsTr("V") color: Palette.tableHeaderTextColor } Controls.DotSeparator { Layout.fillWidth: true } Controls.AvailabilityIndicator { enabled: modelData.balancing Layout.alignment: Qt.AlignCenter } Item { Layout.preferredWidth: parent.width / 6 - 24 } Component.onCompleted: { indexLabel.text = index + ListView.view.indexOffset } } } RowLayout { anchors.fill: parent spacing: 20 Controls.Frame { padding: 1 ListView { id: firstCellGroup anchors.fill: parent clip: true model: [] spacing: 0 boundsBehavior: Flickable.StopAtBounds property int indexOffset: 1 header: cellListHeader delegate: cellListDelegate ScrollBar.vertical: Controls.ScrollBar {} } Layout.fillWidth: true Layout.fillHeight: true } Controls.Frame { padding: 1 visible: secondCellGroup.model.length > 0 ListView { id: secondCellGroup anchors.fill: parent clip: true model: [] spacing: 0 boundsBehavior: Flickable.StopAtBounds property int indexOffset: 17 header: cellListHeader delegate: cellListDelegate ScrollBar.vertical: Controls.ScrollBar {} } Layout.fillWidth: true Layout.fillHeight: true } } Connections { target: BmsInterface.commands() enabled: root.visible onCellsReceived: { firstCellGroup.model = [] var firstModel = [] for (var i = 0; i < Math.min(cellCount, 16); ++i) { firstModel.push({"voltage": Math.abs(MathHelper.roundDouble(cellVoltageArray[i], 3)), "balancing": cellVoltageArray[i] < 0}) } firstCellGroup.model = firstModel if (cellCount > 16) { secondCellGroup.model = [] var secondModel = [] for (var j = 16; j < Math.min(cellCount, 32); ++j) { secondModel.push({"voltage": Math.abs(MathHelper.roundDouble(cellVoltageArray[j], 3)), "balancing": cellVoltageArray[i] < 0}) } secondCellGroup.model = secondModel } } } Connections { target: BmsInterface onPortConnectedChanged: getValues() } onVisibleChanged: getValues() Timer { id: refreshValuesTimer interval: 1000 onTriggered: getValues() } function getValues() { if (BmsInterface.isPortConnected() && visible) { BmsInterface.commands().getCells() refreshValuesTimer.start() } } }