From 1d77dcbfcdd2ba565d649e7bccabdce0e8e5118f Mon Sep 17 00:00:00 2001 From: Yury Shuvakin Date: Fri, 16 Sep 2022 06:57:03 +0300 Subject: [PATCH] Implemented time adjustment on the board --- qml/Screens/BmsServiceScreen.qml | 11 +- qml/Screens/TerminalScreen.qml | 2 + qml/Screens/TimeSettingsScreen.qml | 276 +++++++++++++++++++++++++++++ qml/Screens/qmldir | 1 + qml/qml_items.qrc | 1 + translations/cubo_en.ts | 129 +++++++++++++- translations/cubo_it.ts | 129 +++++++++++++- translations/cubo_ru.qm | Bin 21261 -> 22913 bytes translations/cubo_ru.ts | 129 +++++++++++++- 9 files changed, 668 insertions(+), 10 deletions(-) create mode 100644 qml/Screens/TimeSettingsScreen.qml diff --git a/qml/Screens/BmsServiceScreen.qml b/qml/Screens/BmsServiceScreen.qml index d43d114..64ea283 100644 --- a/qml/Screens/BmsServiceScreen.qml +++ b/qml/Screens/BmsServiceScreen.qml @@ -27,6 +27,10 @@ RowLayout { property string title: qsTr("Network settings") } + Screens.TimeSettingsScreen { + id: timeSettingsScreen + property string title: qsTr("Time settings") + } Layout.fillWidth: true Layout.fillHeight: true @@ -36,7 +40,12 @@ RowLayout { spacing: 20 Repeater { - model: [terminalScreen.title, firmwareUpdateScreen.title, networkSettingsScreen.title] + model: [ + terminalScreen.title, + firmwareUpdateScreen.title, + networkSettingsScreen.title, + timeSettingsScreen.title + ] delegate: Controls.LinkLabel { text: modelData onClicked: stack.currentIndex = index diff --git a/qml/Screens/TerminalScreen.qml b/qml/Screens/TerminalScreen.qml index 11da120..c8f24ce 100644 --- a/qml/Screens/TerminalScreen.qml +++ b/qml/Screens/TerminalScreen.qml @@ -6,6 +6,7 @@ import Controls 1.0 as Controls import Cubo 1.0 ColumnLayout { + id: root spacing: 20 Keys.onReturnPressed: sendButton.clicked() @@ -66,6 +67,7 @@ ColumnLayout { Connections { target: BmsInterface.commands() + enabled: root.visible onPrintReceived: { outputArea.append(str) outputArea.cursorPosition = outputArea.length diff --git a/qml/Screens/TimeSettingsScreen.qml b/qml/Screens/TimeSettingsScreen.qml new file mode 100644 index 0000000..ae60e1f --- /dev/null +++ b/qml/Screens/TimeSettingsScreen.qml @@ -0,0 +1,276 @@ +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 { + id: root + spacing: 20 + + GridLayout { + columns: 2 + rowSpacing: 20 + columnSpacing: 20 + + Controls.TitleLabel { + text: qsTr("Date") + } + + Controls.TitleLabel { + text: qsTr("Time") + } + + Controls.Frame { + GridLayout { + anchors.fill: parent + columns: 3 + columnSpacing: 10 + + Controls.SubtitleLabel { + text: qsTr("Day") + Layout.alignment: Qt.AlignCenter + } + + Controls.SubtitleLabel { + text: qsTr("Month") + Layout.alignment: Qt.AlignCenter + } + + Controls.SubtitleLabel { + text: qsTr("Year") + Layout.alignment: Qt.AlignCenter + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Tumbler { + id: dayTumbler + model: { + switch (monthTumbler.currentIndex) { + case 0: return range(1, 31) + case 1: return range(1, yearTumbler.model[yearTumbler.currentIndex] % 4 || monthTumbler.currentIndex !== 1 ? 28 : 29) + case 2: return range(1, 31) + case 3: return range(1, 30) + case 4: return range(1, 31) + case 5: return range(1, 30) + case 6: return range(1, 31) + case 7: return range(1, 31) + case 8: return range(1, 30) + case 9: return range(1, 31) + case 10: return range(1, 30) + case 11: return range(1, 31) + default: return range(1, 0) + } + } + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + + Tumbler { + id: monthTumbler + model: [ + qsTr("January"), + qsTr("February"), + qsTr("March"), + qsTr("April"), + qsTr("May"), + qsTr("June"), + qsTr("July"), + qsTr("August"), + qsTr("September"), + qsTr("October"), + qsTr("November"), + qsTr("December") + ] + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + + Tumbler { + id: yearTumbler + model: range(1970, 230) + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + } + + Layout.fillWidth: true + } + + Controls.Frame { + GridLayout { + anchors.fill: parent + columns: 3 + columnSpacing: 10 + + Controls.SubtitleLabel { + text: qsTr("Hour") + Layout.alignment: Qt.AlignCenter + } + + Controls.SubtitleLabel { + text: qsTr("Minute") + Layout.alignment: Qt.AlignCenter + } + + Controls.SubtitleLabel { + text: qsTr("Second") + Layout.alignment: Qt.AlignCenter + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Controls.LineSeparator { + Layout.fillWidth: true + } + + Tumbler { + id: hoursTumbler + model: 24 + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + + Tumbler { + id: minutesTumbler + model: 60 + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + + Tumbler { + id: secondsTumbler + model: 60 + delegate: tumblerComponent + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: true + } + } + + Layout.fillWidth: true + } + } + + RowLayout { + spacing: 20 + + Controls.OutlineButton { + text: qsTr("Read from board") + onClicked: BmsInterface.commands().sendTerminalCmd("checkUnixTime") + } + + Controls.OutlineButton { + text: qsTr("Read from computer") + onClicked: { + const date = new Date() + + yearTumbler.currentIndex = date.getFullYear() - 1970 + monthTumbler.currentIndex = date.getMonth() + dayTumbler.currentIndex = date.getDate() - 1 + + hoursTumbler.currentIndex = date.getHours() + minutesTumbler.currentIndex = date.getMinutes() + secondsTumbler.currentIndex = date.getSeconds() + } + } + + Controls.Button { + text: qsTr("Write to board") + onClicked: { + const date = new Date() + + date.setFullYear(yearTumbler.model[yearTumbler.currentIndex]) + date.setMonth(monthTumbler.currentIndex) + date.setDate(dayTumbler.currentIndex + 1) + + date.setHours(hoursTumbler.currentIndex) + date.setMinutes(minutesTumbler.currentIndex) + date.setSeconds(secondsTumbler.currentIndex) + + BmsInterface.commands().sendTerminalCmd("setUnixTime " + Math.round(date / 1000)) + } + } + } + + Component { + id: tumblerComponent + + Controls.SubtitleLabel { + text: modelData + opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } + + Connections { + target: BmsInterface.commands() + enabled: root.visible + onPrintReceived: { + const lines = str.split(/\r?\n/) + for (const line of lines) { + if (line.includes("Year")) { + const value = extractValue(line) + if (value.length === 0) contine + yearTumbler.currentIndex = parseInt(value) + } else if (line.includes("Month")) { + const value = extractValue(line) + if (value.length === 0) contine + monthTumbler.currentIndex = parseInt(value) - 1 + } else if (line.includes("Day")) { + const value = extractValue(line) + if (value.length === 0) contine + dayTumbler.currentIndex = parseInt(value) - 1 + } else if (line.includes("Hours")) { + const value = extractValue(line) + if (value.length === 0) contine + hoursTumbler.currentIndex = parseInt(value) + } else if (line.includes("Minutes")) { + const value = extractValue(line) + if (value.length === 0) contine + minutesTumbler.currentIndex = parseInt(value) + } else if (line.includes("Seconds")) { + const value = extractValue(line) + if (value.length === 0) contine + secondsTumbler.currentIndex = parseInt(value) + } + } + } + + function extractValue(valueHolder) { + const values = valueHolder.split(":") + return values.length < 2 ? "" : values[1].trim() + } + } + + function range(startAt, size) { + return [...Array(size).keys()].map(i => i + startAt); + } + + onVisibleChanged: if (visible) { + BmsInterface.commands().sendTerminalCmd("checkUnixTime") + } +} diff --git a/qml/Screens/qmldir b/qml/Screens/qmldir index 5771621..73b47d6 100644 --- a/qml/Screens/qmldir +++ b/qml/Screens/qmldir @@ -11,3 +11,4 @@ StatusPopup 1.0 StatusPopup.qml TerminalScreen 1.0 TerminalScreen.qml FirmwareUpdateScreen 1.0 FirmwareUpdateScreen.qml NetworkSettingsScreen 1.0 NetworkSettingsScreen.qml +TimeSettingsScreen 1.0 TimeSettingsScreen.qml diff --git a/qml/qml_items.qrc b/qml/qml_items.qrc index 57f92e4..18f98ef 100644 --- a/qml/qml_items.qrc +++ b/qml/qml_items.qrc @@ -45,5 +45,6 @@ Screens/FirmwareUpdateScreen.qml Controls/ProgressBar.qml Screens/NetworkSettingsScreen.qml + Screens/TimeSettingsScreen.qml diff --git a/translations/cubo_en.ts b/translations/cubo_en.ts index c9fcea8..44ec989 100644 --- a/translations/cubo_en.ts +++ b/translations/cubo_en.ts @@ -223,6 +223,11 @@ Network settings + + + Time settings + + BmsSettingsScreen @@ -798,21 +803,139 @@ Reconnect to the board if you want to continue working with it. TerminalScreen - + Clear - + Send - + Help + + TimeSettingsScreen + + + Date + + + + + Time + + + + + Day + + + + + Month + + + + + Year + + + + + January + + + + + February + + + + + March + + + + + April + + + + + May + + + + + June + + + + + July + + + + + August + + + + + September + + + + + October + + + + + November + + + + + December + + + + + Hour + + + + + Minute + + + + + Second + + + + + Read from board + + + + + Read from computer + + + + + Write to board + + + Translator diff --git a/translations/cubo_it.ts b/translations/cubo_it.ts index 16ba504..28258c1 100644 --- a/translations/cubo_it.ts +++ b/translations/cubo_it.ts @@ -223,6 +223,11 @@ Network settings + + + Time settings + + BmsSettingsScreen @@ -798,21 +803,139 @@ Reconnect to the board if you want to continue working with it. TerminalScreen - + Clear - + Send - + Help + + TimeSettingsScreen + + + Date + + + + + Time + + + + + Day + + + + + Month + + + + + Year + + + + + January + + + + + February + + + + + March + + + + + April + + + + + May + + + + + June + + + + + July + + + + + August + + + + + September + + + + + October + + + + + November + + + + + December + + + + + Hour + + + + + Minute + + + + + Second + + + + + Read from board + + + + + Read from computer + + + + + Write to board + + + Translator diff --git a/translations/cubo_ru.qm b/translations/cubo_ru.qm index 6d191b28d95ef530dd1e52b88430b090273f2b6d..d7b9f6eb7ab24910ae4ad57e30c83bcb41e6364b 100644 GIT binary patch delta 2709 zcmZ`(dr(yO6+XNByZgBNQm}y$gayJwO(P*`;HuPJzv#{9yap&ys-tTwL zcfRkO-7+M4aaiOq9BuIZ;G2OR6G8r`p5AlfPq{?WN+Jp&icurx5S7#+{s8ALS6sdg zv7M;u01+D`D%yg074Z-emrj(3ciaz&GB+dI@%|i9XdICreuu^*zK)oH_z96CG?B<( zOjKBo3&SYZOO*Q&kqI$>BT)^25f_Li@=)+IV*B>u`yjEKdT={U?A{1bUKerxsfb@A z7T}&AaRd4IewVm6KP5`NLfo&DP~#88odrJY1aS|LyQr2Nkzwsb;peG%EfQp2qT+QA zQ6QR1mI095>54hMRJN<0NTH^R%=d^S-;(L&ohVdJ)xti+8&ta$9cI-bqQk7Mw0?0n zy3|tF^BhrmGW8ri3xbDe`#CYxDs#o9e{r~eWE`RGlPic)dT2aBN)-GRefBD3(yyTV z`FI~&E%F)J4r#|ki<3fe{+B3t@E=HYTNFBZnJAz{bSCaNrIKH(2mAE~GWF+HDw=qFZcDDP$<$!`8if6~sE(=9|Ff3Tz-IgsAi( z8|X}gd}r86UPF|Amz|8ly~;jLpFIqDW4Y|wz3}aAuJqEU4gijFolyZq-v8wKhw?Eg zE4ZN}&~Ir6cc5k)Q9&(t$=(AZYq_uAfsT=O5~aV-aN>fbla=2? zfoG*tF|QFBYos^L-x2AiT`}Dzi)w0sPd&2SzYRf&e%Tunjwbpr9*n~`$nHBQsX{8(UPOX|o$`QTqOlFY$^a$3=_$&FDVdPJ{F2Cpqg|z9hip39X81XDc zQp{nZ$HNs>!I-?%=M;_S;h8c`vGw{CE*w<+{0Imc|EidLwFkSqLGeZJUJ&S3+&MJ{ z=?fLpf6s)4$9T2Z08v;s@4M<_qM%cJ^b2>1vL(Fv0jxEO@)1PMeBUC|iA-zZdo zP@F41@wrm60ZJ}6DJu*wqM_Z&Eu+_n5?)jOY|{~_djdn1qk47}UW(sVb(A<` zjOw{ac%IbU_ZACxe5m^J9`quM+VVyZc5KKMm!D9#zq}D`k-F!WfJu|7dnQU`aD#wT~r?L%(Eg!00H>54C~EPGWh(wL-0lD7r&yKa3qw zjceC$PlA#C+HFnv?z>65*SH#g3O4PrZyHdrTltlNkg(YaGXWT^9760TrafEhd+*#&erv8ZaeZqp}x&-Zu86@AZ6hI=FE~Tw%R>2 zhO1aCD8>Uex4f*x-10~|bnVN^J?gR&dy{9)|AOXr4N!}xG(mFaKT~m5X3l7CvpnO` z?Got>D%DM2Vw@)*Ec0h6;GgH=h1A&CVxQ+m2oGoyoULGm?u4At+G6u88lhrKSSC>O z{3y3}JnF|%4GUmts68JptFYLt^W7^5W`R&SlNEt8W(Q9h1~~^$7F2bfOWoA8Rf4%e zx4O;RtgE-0+ZsHSsfzl)nbMHofP7_eDi;l7QrtPcW^-Ds&8?8ga~L8tEC^T9AZG?k zoO4lX5-iphPY%%wX22P!GQWF;Noch_s#Y-1yuin~v=wen%(;FZ&545hK8p9&XE6O7 vVe;G;G*7lQ+60}=`ag6DlQM7gpXdg&m4bP;N0VT)HMXp2AAY{*73F^bRV!$s delta 1380 zcmX9;dr(w$7(I9Iz3bk)ESrx6K^ItE5L8$ML|_Fa9?MHjESX7Dlg+HOO!1M@Dv0Lz zsA0j=txePnu(%3vhgvdm}WH5vHk1Z@7~|{{l4#<^WF7sVcP-0 zX*-thd-i@sd0Wu%IH2^a#2|a;Yk*?F zw8WEu_z<(Vvymh{k&Pt9!@1h87#LNL!nHDBFGAUQ4X4TWU}(7qC(T1y`%A#YNVG(0 z0dpxXRqX?;0-mJseFOxbrZP^xRPc+jFg_rdEB|7h2ZE)&6BzMWXpL+j8@)nj@l0Tn zQRtrN08(S06Z)*2$mXRP^3|)r@LJbBA=qhZ)ol3XG!^L7R5$Kq{vJ)+;y_@)G0kNs z2k~=hI(Fs)WA|!$ZUzGZqcpcx=aa;ZqH3ZV6WCgWK;(tB!WFu@I>ud?XvPOBHLPNz`(wQT1j+RZ`2Io)6m)DFn0fV2)2kIOtK&V;1QBcB*R?5F0Au*xdTA|<+3sq}v z1M?_lw6=Zv^HgGlwkLcKkiJiQcmBUXV2uY80$qjTFlR$Q?GbQkK+8p577{k#$upHR zX6Q^s^rH3+U9vimxdFOjyPckfZcDp^>|N89uSsRtq^s`YFo|ut6HPzzT%WGh&3f@W zbXP3ThQF%#^)08pl9ZV6TC#aTnPH|I;)0b$7s;wV-l=TA-NS=<$|rSfz#gZxSCvrZ zFr{PjezJ33={A%D;V28S63Z;oeS!$Q40^H0b}yiuRkNb-Ye8I zTUkK($AjtbsCUv7F5oo}#un?v4=7vK7y413wE_p?`^Ie*+&@Wa>yah_q}dD zCL35_Sny>De=9RQn5`I=eOSb&{%&z lpBF_Kf6HA07)*N{y#+DZz=!) diff --git a/translations/cubo_ru.ts b/translations/cubo_ru.ts index f980922..fb805bb 100644 --- a/translations/cubo_ru.ts +++ b/translations/cubo_ru.ts @@ -235,6 +235,11 @@ Network settings Настройки сети + + + Time settings + Настройки времени + BmsSettingsScreen @@ -833,21 +838,139 @@ Reconnect to the board if you want to continue working with it. TerminalScreen - + Clear Очистить - + Send Отправить - + Help Помощь + + TimeSettingsScreen + + + Date + Дата + + + + Time + Время + + + + Day + День + + + + Month + Месяц + + + + Year + Год + + + + January + Январь + + + + February + Февраль + + + + March + Март + + + + April + Апрель + + + + May + Май + + + + June + Июнь + + + + July + Июль + + + + August + Август + + + + September + Сентябрь + + + + October + Октябрь + + + + November + Ноябрь + + + + December + Декабрь + + + + Hour + Час + + + + Minute + Минута + + + + Second + Секунда + + + + Read from board + Прочитать с платы + + + + Read from computer + Прочитать с компьютера + + + + Write to board + Записать на плату + + Translator