From 8204cba1ab2566d53736e729b3929df59f0889cd Mon Sep 17 00:00:00 2001 From: Wojtek Rzepecki Date: Tue, 2 Feb 2021 14:16:27 +0100 Subject: [PATCH] [EGD-5575] Add battery file test Battery file existence test for harness test suit. Minor changes to file saving applied. --- .../linux/battery-charger/battery_charger.cpp | 7 +- .../bsp/battery-charger/battery_charger.cpp | 71 ++++++++++++------- .../bsp/battery-charger/battery_charger.hpp | 2 + .../filesystem/FilesystemEndpoint.cpp | 9 ++- .../service-desktop/parser/ParserUtils.hpp | 4 +- .../service-evtmgr/WorkerEvent.cpp | 3 + .../service-desktop/test_battery_file.py | 13 ++++ 7 files changed, 81 insertions(+), 28 deletions(-) create mode 100644 test/pytest/service-desktop/test_battery_file.py diff --git a/module-bsp/board/linux/battery-charger/battery_charger.cpp b/module-bsp/board/linux/battery-charger/battery_charger.cpp index 4fb5187c8adb23ac5147b6d26c3fa3d366dd9119..7666cbe7b02f5ac13beec92b1b41f8e3e97c2b4b 100644 --- a/module-bsp/board/linux/battery-charger/battery_charger.cpp +++ b/module-bsp/board/linux/battery-charger/battery_charger.cpp @@ -49,8 +49,8 @@ namespace bsp::battery_charger std::uint8_t notification = 0; switch (static_cast(buff[0])) { case chargerPlugStateChange: - notification = static_cast(batteryIRQSource::INOKB); - plugged = !plugged; + notification = static_cast(batteryIRQSource::INOKB); + plugged = !plugged; targetQueueHandle = IRQQueueHandle; break; case batteryLevelUp: @@ -144,4 +144,7 @@ namespace bsp::battery_charger return static_cast(batteryINTBSource::SOCOnePercentChange); } + void chargingFinishedAction() + {} + } // namespace bsp::battery_charger diff --git a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp index cad9338bd42fce669e8a3e17896ceb90d405845c..fdeb8f316a4af271e81853423744de841d1bf52e 100644 --- a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +++ b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp @@ -20,7 +20,7 @@ namespace bsp::battery_charger { constexpr std::uint32_t i2cSubaddresSize = 1; - const auto cfgFile = purefs::dir::getCurrentOSPath() / "batteryFuelGaugeConfig.cfg"; + const auto cfgFile = purefs::dir::getUserDiskPath() / "batteryFuelGaugeConfig.cfg"; constexpr auto registersToStore = 0xFF + 1; constexpr std::uint16_t ENABLE_ALL_IRQ_MASK = 0xF8; @@ -37,7 +37,7 @@ namespace bsp::battery_charger constexpr std::uint8_t maxTemperatureDegrees = 50; constexpr std::uint8_t minTemperatureDegrees = 5; - constexpr std::uint16_t maxVoltagemV = 4350; + constexpr std::uint16_t maxVoltagemV = 4400; constexpr std::uint16_t minVoltagemV = 3600; constexpr auto currentSenseGain = 0.15625; // mA @@ -227,36 +227,22 @@ namespace bsp::battery_charger return batteryRetval::OK; } - batteryRetval loadConfiguration() + batteryRetval resetFuelGaugeModel() { - std::ifstream file(cfgFile.c_str(), std::ios::binary | std::ios::in); - if (!file.is_open()) { - LOG_WARN("Configuration file [%s] could not be opened. Loading initial configuration.", - cfgFile.c_str()); - if (configureFuelGaugeBatteryModel() == batteryRetval::OK) { - return batteryRetval::OK; - } - else { - return batteryRetval::ChargerError; - } - } + auto regVal = fuelGaugeRead(Registers::CONFIG2_REG); - std::uint16_t regVal; - for (auto i = 0; i < registersToStore; ++i) { - file.read(reinterpret_cast(®Val), sizeof(std::uint16_t)); - if (fuelGaugeWrite(static_cast(i), regVal) != kStatus_Success) { - LOG_ERROR("Writing register 0x%x failed.", i); - file.close(); - return batteryRetval::ChargerError; - } - } - file.close(); + std::uint16_t toWrite = regVal.second | static_cast(CONFIG2::LdMdl); + if (fuelGaugeWrite(Registers::CONFIG2_REG, toWrite) != kStatus_Success) { + LOG_ERROR("resetFuelGaugeModel failed."); + return batteryRetval::ChargerError; + } return batteryRetval::OK; } batteryRetval storeConfiguration() { + LOG_INFO("Storing fuel gauge configuration..."); std::ofstream file(cfgFile.c_str(), std::ios::binary | std::ios::out); if (!file.is_open()) { LOG_WARN("Configuration file [%s] could not be opened.", cfgFile.c_str()); @@ -277,6 +263,37 @@ namespace bsp::battery_charger return batteryRetval::OK; } + batteryRetval loadConfiguration() + { + std::ifstream file(cfgFile.c_str(), std::ios::binary | std::ios::in); + if (!file.is_open()) { + LOG_WARN("Configuration file [%s] could not be opened. Loading initial configuration.", + cfgFile.c_str()); + if (configureFuelGaugeBatteryModel() == batteryRetval::OK) { + storeConfiguration(); + resetFuelGaugeModel(); + return batteryRetval::OK; + } + else { + return batteryRetval::ChargerError; + } + } + + std::uint16_t regVal; + for (auto i = 0; i < registersToStore; ++i) { + file.read(reinterpret_cast(®Val), sizeof(std::uint16_t)); + if (fuelGaugeWrite(static_cast(i), regVal) != kStatus_Success) { + LOG_ERROR("Writing register 0x%x failed.", i); + file.close(); + return batteryRetval::ChargerError; + } + } + file.close(); + resetFuelGaugeModel(); + + return batteryRetval::OK; + } + batteryRetval setChargingDischargingThresholds(std::uint8_t chargedThresholdPercent, std::uint8_t dischargedThresholdPercent) { @@ -534,6 +551,12 @@ namespace bsp::battery_charger fuelGaugeWrite(Registers::STATUS_REG, 0x0000); } + void chargingFinishedAction() + { + LOG_DEBUG("Charging finished."); + storeConfiguration(); + } + BaseType_t INOKB_IRQHandler() { BaseType_t xHigherPriorityTaskWoken = pdFALSE; diff --git a/module-bsp/bsp/battery-charger/battery_charger.hpp b/module-bsp/bsp/battery-charger/battery_charger.hpp index 843501baa1e54c40610c3075a04f44f0a5fd933a..334d44a846dc8ab7197e76492ac31db0bfdbdef7 100644 --- a/module-bsp/bsp/battery-charger/battery_charger.hpp +++ b/module-bsp/bsp/battery-charger/battery_charger.hpp @@ -58,6 +58,8 @@ namespace bsp::battery_charger std::uint16_t getStatusRegister(); + void chargingFinishedAction(); + BaseType_t INOKB_IRQHandler(); BaseType_t INTB_IRQHandler(); diff --git a/module-services/service-desktop/endpoints/filesystem/FilesystemEndpoint.cpp b/module-services/service-desktop/endpoints/filesystem/FilesystemEndpoint.cpp index 888266d3506d1c06a9640eeae6025573b14cc164..2213f4b4c5868c86e76c4fd89cb0a3042200138c 100644 --- a/module-services/service-desktop/endpoints/filesystem/FilesystemEndpoint.cpp +++ b/module-services/service-desktop/endpoints/filesystem/FilesystemEndpoint.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "FilesystemEndpoint.hpp" @@ -64,6 +64,13 @@ auto FilesystemEndpoint::run(Context &context) -> sys::ReturnCodes LOG_ERROR("download command failed, can't write %" PRIu32 " bytes to: %s", fileSize, tmpFilePath.c_str()); } } + else if (cmd == parserFSM::json::filesystem::commands::checkFile) { + fs::path filePath = context.getBody()[parserFSM::json::fileName].string_value(); + LOG_DEBUG("Checking file: %s", filePath.c_str()); + + context.setResponseBody(json11::Json::object{{json::fileExists, std::filesystem::exists(filePath)}}); + returnCode = sys::ReturnCodes::Success; + } else { LOG_ERROR("unknown command: %s", cmd.c_str()); } diff --git a/module-services/service-desktop/parser/ParserUtils.hpp b/module-services/service-desktop/parser/ParserUtils.hpp index d312e7eac58649b16e8882deb9cac5444685bf71..b9522cd42cba813d712d6c4952b64fe8f4d544b0 100644 --- a/module-services/service-desktop/parser/ParserUtils.hpp +++ b/module-services/service-desktop/parser/ParserUtils.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -131,6 +131,7 @@ namespace parserFSM inline constexpr auto errorCode = "errorCode"; inline constexpr auto statusCode = "statusCode"; inline constexpr auto updateHistory = "updateHistory"; + inline constexpr auto fileExists = "fileExists"; namespace filesystem { @@ -140,6 +141,7 @@ namespace parserFSM inline constexpr auto upload = "upload"; inline constexpr auto rm = "rm"; inline constexpr auto download = "download"; + inline constexpr auto checkFile = "checkFile"; } // namespace commands } // namespace filesystem diff --git a/module-services/service-evtmgr/WorkerEvent.cpp b/module-services/service-evtmgr/WorkerEvent.cpp index da106a5851bda56716b3010774d9265f54cefa26..9c18fab98e2917767f6ccc49d3e524c6c49fa0f6 100644 --- a/module-services/service-evtmgr/WorkerEvent.cpp +++ b/module-services/service-evtmgr/WorkerEvent.cpp @@ -109,6 +109,9 @@ bool WorkerEvent::handleMessage(uint32_t queueID) bsp::battery_charger::clearAllIRQs(); auto message = std::make_shared(); message->plugged = bsp::battery_charger::getChargeStatus(); + if (!message->plugged) { + bsp::battery_charger::chargingFinishedAction(); + } sys::Bus::SendUnicast(message, service::name::evt_manager, this->service); } } diff --git a/test/pytest/service-desktop/test_battery_file.py b/test/pytest/service-desktop/test_battery_file.py new file mode 100644 index 0000000000000000000000000000000000000000..b20c7472ed4b9ef5d7fa60931ec1c29390342afe --- /dev/null +++ b/test/pytest/service-desktop/test_battery_file.py @@ -0,0 +1,13 @@ +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md +import pytest +from harness.interface.defs import status + +@pytest.mark.rt1051 +@pytest.mark.service_desktop_test +def test_battery_file(harness): + body = {"command" : "checkFile" , "fileName" : "/sys/user/batteryFuelGaugeConfig.cfg"} + ret = harness.endpoint_request("filesystemUpload", "post", body) + + assert ret["status"] == status["OK"] + assert ret["body"]["fileExists"] == True