Index: sources/ApplicationPost.cpp =================================================================== diff -u -r12e7b6dda53cf8db7707c7fa55dcf6137e7d6997 -r6c6f1f5d466badd9b4fd67be7c907234c342b2a2 --- sources/ApplicationPost.cpp (.../ApplicationPost.cpp) (revision 12e7b6dda53cf8db7707c7fa55dcf6137e7d6997) +++ sources/ApplicationPost.cpp (.../ApplicationPost.cpp) (revision 6c6f1f5d466badd9b4fd67be7c907234c342b2a2) @@ -1,48 +1,270 @@ /*! * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * - * \file ApplicationPost.cpp - * \author (last) Behrouz NematiPour - * \date (last) 20-Aug-2020 - * \author (original) Behrouz NematiPour - * \date (original) 24-Sep-2019 + * \file ApplicationPost.cpp + * \author (last) Behrouz NematiPour + * \date (last) 19-Apr-2023 + * \author (original) Behrouz NematiPour + * \date (original) 26-Aug-2020 * */ #include "ApplicationPost.h" +// Qt +#include +#include +// Project +#include "Logger.h" +#include "FileHandler.h" + /*! * \brief ApplicationPost::ApplicationPost * \details Constructor * \param parent - QObject parent owner object. * Qt handles the children destruction by their parent objects life-cycle. */ -ApplicationPost::ApplicationPost(QObject *parent) : QObject(parent) +ApplicationPost::ApplicationPost(QObject *parent) : QObject(parent) { } + +/*! + * \brief ApplicationPost::start + * \details Starting the post application initialization + * \return + */ +void ApplicationPost::start() { + QString postLogFileName = QDir::tempPath() + "/" + Storage::POST_LOG; + if (Storage::FileHandler::read(postLogFileName, _content)) { + _isShaSum = checkShaSum (); + _isCANBus = checkCANBus (); + _isDisplay = checkDisplay (); + _isTouch = checkTouch (); + _isSDCard = checkSDCard (); + _isRtc = checkRtc (); + _isWiFi = checkWiFi (); // is not mandatory and the device can still be used without it. Alarm will be triggered to notify user in Active Alarm List. + _isBluetooth = checkBluetooth (); // is not mandatory and the device can still be used without it. Alarm will be triggered to notify user in Active Alarm List. + _isCloudSync = checkCloudSync (); // is not mandatory and the device can still be used without it. Alarm will be triggered to notify user in Active Alarm List. + _isEthernet = checkEthernet (); // this is not a Fault and not required the application to stop. No Alarm will be triggered. + _isSound = checkSound (); // this is not a Fault and not required the application to stop. No Alarm will be triggered. + _isYearCheck = checkYear (); + // WARNING: + // all of the checks have to be done, + // although some are not failing the final result, + // so they need to be assigned to a variable and then, AND(&&) them, + // otherwise on the first fail rest of the checks will not run by compiler optimization. + _isDone = isShaSum () && + isCANBus () && + isDisplay () && + isTouch () && + isSDCard () && + isRtc () && + isWiFi () && + isBluetooth () && + isCloudSync () && + // isEthernet () && // it is being executed to get the information but is not part of the POST failure. + // isSound () && + isYearCheck () + ; + } + else { + // TODO: Ignored for now but this could be a FileSystem check failure, and the post.log has to always exist. + // _done = false; + LOG_APPED(tr("The POST log file could not be read.")); + } + emit didDone(_isDone); +} +/*! + * \brief ApplicationPost::checkShaSum + * \details Checks the File System Integrity + * \return false if there is an issue [Not effects the UI Final POST result for now (always true)]. + */ +bool ApplicationPost::checkShaSum() +{ + bool ok = _content.contains(_postmsg_shasum + _postmsg_postfix_passed); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_SHASUM); + emit didShaSum(ok); + return ok; } /*! - * \brief ApplicationPost::init - * \details Initialization - * \return true + * \brief ApplicationPost::checkCANBus + * \details Checks the CANBus driver is loaded and the bus is functional + * \return false if there is an issue. */ -bool ApplicationPost::init() +bool ApplicationPost::checkCANBus() { - return true; + bool ok = _content.contains(_postmsg_canbus + _postmsg_postfix_passed); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_CANBUS); + emit didCANBus(ok); + return ok; } /*! - * \brief ApplicationPost::start - * \details Starting the post application initialization - * \return + * \brief ApplicationPost::checkDisplay + * \details Checks the display driver is loaded + * \return false if there is an issue [No Implementation yet (always true)]. */ -bool ApplicationPost::start() +bool ApplicationPost::checkDisplay() { - // coco begin validated: Is a placeholder and has not been implemented yet - return true; + bool ok = true; + //TODO: do the test : not a good test has been found yet. + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_DISPLAY); + emit didDisplay(ok); + return ok; } -// coco end + +/*! + * \brief ApplicationPost::checkTouchScreen + * \details Checks the touch driver is loaded + * \return false if there is an issue. + */ +bool ApplicationPost::checkTouch() +{ + bool ok = _content.contains(_postmsg_touch + _postmsg_postfix_passed); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_TOUCH); + emit didTouch(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkSDCard + * \details Checks the SD-Card drive is loaded and functional + * \return false if there is an issue. + */ +bool ApplicationPost::checkSDCard() +{ + bool ok = _content.contains(_postmsg_sdcard + _postmsg_postfix_passed); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_SDCARD); + emit didSDCard(ok); + return ok; +} + +/*! + * \brief ApplicationPost::CRC + * \details Checks the RTC driver is loaded and functional + * \return false if there is an issue + */ +bool ApplicationPost::checkRtc() +{ + bool ok = _content.contains(_postmsg_rtc + _postmsg_postfix_passed); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_RTC); + emit didRtc(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkEthernet + * \details Checks the Ethernet driver is loaded and functional. + * \return false if there is an issue [Removed from the PRS (always true)]. + */ +bool ApplicationPost::checkEthernet() +{ + bool ok = false; + int posDev = -1; + int posMac = -1; + QString section = ""; + posDev = _content.indexOf( _devEthernet ); if ( posDev < 0 ) goto lOut; + section = _content.mid(posDev, _macAppearLen); + posMac = section.indexOf(_macEthernetLabel); if ( posMac < 0 ) goto lOut; + _macEthernet = section.mid(posMac + _macEthernetLabel.length(), _macAddrssLen).toUpper(); if ( _macEthernet.isEmpty() ) goto lOut; + ok = true; + +lOut: + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_ETHERNET); + emit didEthernet(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkWiFi + * \details Checks the WiFi driver is loaded and functional + * \return false if there is an issue. + */ +bool ApplicationPost::checkWiFi() +{ + bool ok = false; + int posDev = -1; + int posMac = -1; + QString section = ""; + posDev = _content.indexOf( _devWireless ); if ( posDev < 0 ) goto lOut; + section = _content.mid(posDev, _macAppearLen); + posMac = section.indexOf(_macWirelessLabel); if ( posMac < 0 ) goto lOut; + _macWireless = section.mid(posMac + _macWirelessLabel.length(), _macAddrssLen).toUpper(); if ( _macWireless.isEmpty() ) goto lOut; + ok = _content.contains(_postmsg_wifi + _postmsg_postfix_passed); + +lOut: + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_WIFI); + emit didWiFi(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkBluetooth + * \details Checks the Bluetooth driver is loaded and functional + * \return false if there is an issue. + */ +bool ApplicationPost::checkBluetooth() +{ + bool ok = false; + int posDev = -1; + int posMac = -1; + QString section = ""; + posDev = _content.indexOf( _devBluetooth ); if ( posDev < 0 ) goto lOut; + section = _content.mid(posDev, _macAppearLen); + posMac = section.indexOf(_macBluetoothLabel); if ( posMac < 0 ) goto lOut; + _macBluetooth = section.mid(posMac + _macBluetoothLabel.length(), _macAddrssLen).toUpper(); if ( _macBluetooth.isEmpty() ) goto lOut; + ok = _content.contains(_postmsg_bluetooth + _postmsg_postfix_passed); + +lOut: + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_BLUETOOTH); + emit didBluetooth(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkCloudSync + * \details Checks the CloudSync service is loaded and functional + * \return false if there is an issue. + */ +bool ApplicationPost::checkCloudSync() +{ + bool ok = true; + if (! gDisableCloudSyncFailStop ) { + ok = _content.contains(_postmsg_cloudsync + _postmsg_postfix_passed); + } + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_CLOUDSYNC); + emit didCloudSync(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkSound + * \details Checks the sound driver is loaded. + * \return false if there is an issue [No Implementation yet (always true)]. + */ +bool ApplicationPost::checkSound() +{ + bool ok = true; + // do the test + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_SOUND); + emit didSound(ok); + return ok; +} + +/*! + * \brief ApplicationPost::checkYear + * \details Checks if the year is greater than or equal to 2022. + * \return false if there is an issue. + */ +bool ApplicationPost::checkYear() +{ + QDate currentDate = QDate::currentDate(); + bool ok = currentDate.year() >= _yearMinimum; + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_HD_UI_POST_FAILURE_INVALID_YEAR); + emit didYearCheck(ok); + return ok; +}