Index: scripts/date_time_set.sh =================================================================== diff -u --- scripts/date_time_set.sh (revision 0) +++ scripts/date_time_set.sh (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -0,0 +1,11 @@ +#!/bin/sh + +# hardcode PST +rm -f /etc/localtime +ln -s /usr/share/zoneinfo/America/Los_Angeles /etc/localtime + +timedatectl set-time $1 + +# set the hwclock from the system time +hwclock -w + Index: sources/gui/qml/pages/SettingsDateTimeSet.qml =================================================================== diff -u -rb5a7852d2637f7969680fbd3d2c821a6a74a8ccd -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/gui/qml/pages/SettingsDateTimeSet.qml (.../SettingsDateTimeSet.qml) (revision b5a7852d2637f7969680fbd3d2c821a6a74a8ccd) +++ sources/gui/qml/pages/SettingsDateTimeSet.qml (.../SettingsDateTimeSet.qml) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -88,6 +88,7 @@ textInput.text: vDateTime.hour onEnterPressed: { _keyboard.setVisible(false) + vDateTime.hour = textInput.text } } @@ -116,6 +117,7 @@ textInput.text: vDateTime.minute onEnterPressed: { _keyboard.setVisible(false) + vDateTime.minute = textInput.text } } @@ -148,6 +150,7 @@ textInput.text: vDateTime.month onEnterPressed: { _keyboard.setVisible(false) + vDateTime.month = textInput.text } } @@ -176,6 +179,7 @@ textInput.text: vDateTime.day onEnterPressed: { _keyboard.setVisible(false) + vDateTime.day = textInput.text } } @@ -205,9 +209,24 @@ textInput.text: vDateTime.year onEnterPressed: { _keyboard.setVisible(false) + vDateTime.year = textInput.text } } + NotificationBarSmall { id: _notification + imageAutoSize: true + height : 25 + color: "transparent" + imageSource : "" + text : vDateTime.status + textColor: Colors.textMain + textfontSize: Fonts.fontPixelTextRectExtra + anchors { + bottom: _save.top + bottomMargin: Variables.settingsDateTimeSetMargin + } + } + TouchRect { id: _save anchors { bottom: parent.bottom Index: sources/gui/qml/pages/SettingsHome.qml =================================================================== diff -u -r632f698e13711e6544a28c7a72d276d2bf5f000e -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/gui/qml/pages/SettingsHome.qml (.../SettingsHome.qml) (revision 632f698e13711e6544a28c7a72d276d2bf5f000e) +++ sources/gui/qml/pages/SettingsHome.qml (.../SettingsHome.qml) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -134,7 +134,8 @@ SettingsItem { id: _itemDateTimeSet title : qsTr("Set Date and Time") onClicked: { - push(_dateTimeSet); + vDateTime.doGetCurrentTime() + push(_dateTimeSet) } } } Index: sources/storage/StorageGlobals.cpp =================================================================== diff -u -rc77365fa76422bc2150e58d483c446325b50f4b8 -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision c77365fa76422bc2150e58d483c446325b50f4b8) +++ sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -68,4 +68,7 @@ const char *Wifi_Set_DNS = "wifi_set_dns.sh"; const char *Wifi_Set_Static_IP = "wifi_set_static_ip.sh"; const char *Wifi_Start_WPA_Supplicant = "wifi_start_wpa_supplicant.sh"; + + // Date and Time + const char *Date_Time_Set = "date_time_set.sh"; } Index: sources/storage/StorageGlobals.h =================================================================== diff -u -rc77365fa76422bc2150e58d483c446325b50f4b8 -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision c77365fa76422bc2150e58d483c446325b50f4b8) +++ sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -54,4 +54,7 @@ extern const char *Wifi_Set_DNS; extern const char *Wifi_Set_Static_IP; extern const char *Wifi_Start_WPA_Supplicant; + + // Date and Time + extern const char *Date_Time_Set; } Index: sources/view/VAlert.cpp =================================================================== diff -u -re92ad4dc0e95b4e4cc1408146fb48a6e33169d52 -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/view/VAlert.cpp (.../VAlert.cpp) (revision e92ad4dc0e95b4e4cc1408146fb48a6e33169d52) +++ sources/view/VAlert.cpp (.../VAlert.cpp) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -24,52 +24,19 @@ connect(&_GuiController, SIGNAL(didAlertRequest(GuiAlertRequestData)), this, SLOT(onActionReceive(GuiAlertRequestData))); - connect(this, SIGNAL(didRequestShowAlert()), - this, SLOT(onUpdateAlertVisible())); - - connect(this, SIGNAL(didRequestShowAlert()), - this, SLOT(onUpdateAlertVisible())); - // outgoing connect(this, SIGNAL(didAlertResponse(GuiAlertResponseData)), &_GuiController, SLOT(doAlertResponse(GuiAlertResponseData))); - - startTimer(_timerInterval); } /*! - * \brief VAlert::onUpdateAlertVisible - * Updates the alert visible status - */ -void VAlert::onUpdateAlertVisible() -{ - _alertVisible = true; -} - -/*! - * \brief VAlert::timerEvent - * Repeatedly checks the queue for any new alerts to display - * Displays the next alert in the queue if no alert is visible - * \param event (QTimerEvent) - the timer event - */ -void VAlert::timerEvent(QTimerEvent *event) -{ - Q_UNUSED(event) - if (!_alertVisible && !_queue.isEmpty()) - { - showAlert(_queue.dequeue()); - } -} - -/*! * \brief VAlert::doUserAlertRequest * Called when an alert is closed as the user has made a request through * the alert dialog * \param confirmed - (bool) true if user confirms, false if they cancel */ void VAlert::doAlertResponse(const bool &confirmed) { - _alertVisible = false; GuiAlertResponseData data; data.id = alertID(); data.confirmed = confirmed; @@ -83,19 +50,6 @@ */ void VAlert::onActionReceive(const GuiAlertRequestData &request) { - if (_queue.size() > _maxQueueSize) - return; - - _queue.enqueue(request); -} - -/*! - * \brief VAlert::showAlert - * Updates the alert with the specified information - * \param request (GuiAlertRequestData) - the alert information - */ -void VAlert::showAlert(const GuiAlertRequestData &request) -{ alertID(request.id); title(request.title); description(request.description); Index: sources/view/VAlert.h =================================================================== diff -u -re92ad4dc0e95b4e4cc1408146fb48a6e33169d52 -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/view/VAlert.h (.../VAlert.h) (revision e92ad4dc0e95b4e4cc1408146fb48a6e33169d52) +++ sources/view/VAlert.h (.../VAlert.h) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -52,21 +52,14 @@ PROPERTY(GuiAlertID , alertID, GuiAlertID::ID_Alert_None) // coco end - QQueue _queue; const int _timerInterval = 1000; // ms - const int _maxQueueSize = 1000; - bool _alertVisible = false; - void timerEvent(QTimerEvent* event); - void showAlert(const GuiAlertRequestData &request); - signals: void didRequestShowAlert(); void didAlertResponse(GuiAlertResponseData); public slots: void doAlertResponse(const bool &confirmed); - void onUpdateAlertVisible(); private slots: void onActionReceive(const GuiAlertRequestData &request); Index: sources/view/VDateTime.cpp =================================================================== diff -u -rb5a7852d2637f7969680fbd3d2c821a6a74a8ccd -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/view/VDateTime.cpp (.../VDateTime.cpp) (revision b5a7852d2637f7969680fbd3d2c821a6a74a8ccd) +++ sources/view/VDateTime.cpp (.../VDateTime.cpp) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -1,12 +1,14 @@ // Qt +#include // Project #include "VDateTime.h" #include "Logger.h" using namespace View; using namespace Gui; +using namespace Storage; VIEW_DEF_CLASS(VDateTime) @@ -23,27 +25,29 @@ connect(this, SIGNAL(didAdjustment(const AdjustDGDateTimeRequestData)), &_GuiController, SLOT(doAdjustment(const AdjustDGDateTimeRequestData))); - connect(this, SIGNAL(didRequestShowAlert(const GuiAlertRequestData)), - &_GuiController, SLOT(doAlertRequest(const GuiAlertRequestData))); - // incoming connect(&_GuiController, SIGNAL(didActionReceive(const AdjustHDDateTimeResponseData)), this, SLOT(doActionReceive(const AdjustHDDateTimeResponseData))); connect(&_GuiController, SIGNAL(didActionReceive(const AdjustDGDateTimeResponseData)), this, SLOT(doActionReceive(const AdjustDGDateTimeResponseData))); + connect(&_process, SIGNAL(finished(int)), + this, SLOT(onFinishedSetDateUI(const int))); + startTimer(_timerInterval); } /*! - * \brief VDateTime::timerEvent + * \brief VDateTime::doGetCurrentTime * Reads and displays the current date and time - * \param event (QTimerEvent*) the timer event */ -void VDateTime::timerEvent(QTimerEvent *event) +void VDateTime::doGetCurrentTime() { - Q_UNUSED(event); + _setDateTimeHD = NOT_SET; + _setDateTimeDG = NOT_SET; + _setDateTimeUI = NOT_SET; + status(""); _currentTime = QDateTime::currentDateTime(); hour (_currentTime.toString("hh")); minute(_currentTime.toString("mm")); @@ -120,31 +124,48 @@ dgDateTimeReq.mEpoch = epoch; emit didAdjustment(hdDateTimeReq); emit didAdjustment(dgDateTimeReq); + + status("Setting date and time..."); + + // 2021-03-16 16:24:00 + QString setTime = QString("%1-%2-%3 %4:%5:%6").arg(year()).arg(month()).arg(day()).arg(hour()).arg(minute()).arg(second()); + _process.start(Date_Time_Set, QStringList() << setTime); } /*! + * \brief VDateTime::onFinishedSetDateUI + * Called when the process that sets the UI date and time has finished. + * \param vExitCode - (int) the exit code of the process + */ +void VDateTime::onFinishedSetDateUI(const int &vExitCode) +{ + LOG_DEBUG(QString("%1 - exit code %2").arg(__FUNCTION__).arg(vExitCode)); + if (vExitCode == 0) + { + _setDateTimeUI = SUCCESS; + } else { + _setDateTimeUI = FAILURE; + } + updateStatus(); +} + +/*! * \brief VDateTime::doActionReceive * Called when we receive a response back from the HD after requesting to * set the epoch * \param vResponse (AdjustHDDateTimeResponseData) - the response */ void VDateTime::doActionReceive(const AdjustHDDateTimeResponseData &vResponse) { - GuiAlertRequestData alert; - alert.acknowledgeOnly = true; - alert.id = GuiAlertID::ID_Alert_Set_DG_RTC_Response; + if (vResponse.mAccepted == 1) { - // alert the user that the request was successful. - alert.title = tr("Success"); - alert.description = tr("Successfully set the HD date and time."); - didRequestShowAlert(alert); + _setDateTimeHD = SUCCESS; } else { - alert.title = tr("Failure"); - alert.description = tr("The HD rejected the date and time setting."); - didRequestShowAlert(alert); + _setDateTimeHD = FAILURE; } + updateStatus(); } /*! @@ -155,19 +176,40 @@ */ void VDateTime::doActionReceive(const AdjustDGDateTimeResponseData &vResponse) { - GuiAlertRequestData alert; - alert.acknowledgeOnly = true; - alert.id = GuiAlertID::ID_Alert_Set_DG_RTC_Response; if (vResponse.mAccepted == 1) { - alert.title = tr("Success"); - alert.description = tr("Successfully set the DG date and time."); - didRequestShowAlert(alert); + _setDateTimeDG = SUCCESS; } else { - alert.title = tr("Failure"); - alert.description = tr("The DG rejected the date and time setting."); - didRequestShowAlert(alert); + _setDateTimeDG = FAILURE; } + updateStatus(); +} +/*! + * \brief VDateTime::updateStatus + * Update the notification bar's status + */ +void VDateTime::updateStatus() +{ + status(QString("HD: %1 DG: %2 UI: %3").arg(enumToString(_setDateTimeHD)) + .arg(enumToString(_setDateTimeDG)) + .arg(enumToString(_setDateTimeUI))); } + +/** + * \brief VDateTime::enumToString + * Convenience functiont to convert an enum to a string + * \param vEnum - the enum value + * \return QString - the enum name + */ +QString VDateTime::enumToString(DateTimeSetStatus vEnum) +{ + const QMetaObject *mo = qt_getEnumMetaObject(vEnum); + int enumIdx = mo->indexOfEnumerator(qt_getEnumName(vEnum)); + QString text = mo->enumerator(enumIdx).valueToKey(vEnum); + if (!text.isEmpty() ) { + return text; + } + return QString("[%1] Unknown DateTime Status").arg(vEnum); +} Index: sources/view/VDateTime.h =================================================================== diff -u -rb5a7852d2637f7969680fbd3d2c821a6a74a8ccd -r079aae9751fe0d234adaa470bc7d23980d5e7692 --- sources/view/VDateTime.h (.../VDateTime.h) (revision b5a7852d2637f7969680fbd3d2c821a6a74a8ccd) +++ sources/view/VDateTime.h (.../VDateTime.h) (revision 079aae9751fe0d234adaa470bc7d23980d5e7692) @@ -4,6 +4,7 @@ // Qt #include #include +#include // Project #include "VView.h" @@ -25,39 +26,56 @@ class VDateTime : public QObject { Q_OBJECT -private: // friends friend class ::tst_views; - int _timerInterval = 1000; // ms - QDateTime _currentTime; - void timerEvent(QTimerEvent *event); - VIEW_DEC_CLASS(VDateTime) protected: // coco begin validated: Has been validated manually - PROPERTY(QString, hour, 0) - PROPERTY(QString, minute, 0) - PROPERTY(QString, second, 0) - PROPERTY(QString, month, 0) - PROPERTY(QString, day, 0) - PROPERTY(QString, year, 0) + PROPERTY(QString, hour, "00") + PROPERTY(QString, minute, "00") + PROPERTY(QString, second, "00") + PROPERTY(QString, month, "01") + PROPERTY(QString, day, "01") + PROPERTY(QString, year, "2020") + PROPERTY(QString, status, "") // coco end +public: + enum DateTimeSetStatus { + NOT_SET = 0, + SUCCESS, + FAILURE + }; + Q_ENUM(DateTimeSetStatus) + public slots: void doSetHour(const int &vHour); void doSetMinute(const int &vMinute); void doSetMonth(const int &vMonth); void doSetDay(const int &vDay); void doSetYear(const int &vYear); void doSave(); + void doGetCurrentTime(); signals: void didAdjustment(const AdjustHDDateTimeRequestData); void didAdjustment(const AdjustDGDateTimeRequestData); - void didRequestShowAlert(const GuiAlertRequestData); private slots: void doActionReceive(const AdjustHDDateTimeResponseData &vResponse); void doActionReceive(const AdjustDGDateTimeResponseData &vResponse); + void onFinishedSetDateUI(const int &vExitCode); +private: + int _timerInterval = 1000; // ms + QDateTime _currentTime; + QProcess _process; + + QString enumToString(DateTimeSetStatus vEnum); + DateTimeSetStatus _setDateTimeHD = NOT_SET; + DateTimeSetStatus _setDateTimeDG = NOT_SET; + DateTimeSetStatus _setDateTimeUI = NOT_SET; + + void updateStatus(); + }; }