// SPDX-License-Identifier: LGPL-3.0-or-later /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2013 - 2024, nymea GmbH * Copyright (C) 2024 - 2025, chargebyte austria GmbH * * This file is part of libnymea-app. * * libnymea-app is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * libnymea-app is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libnymea-app. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "types.h" #include Types *Types::s_instance = nullptr; Types::Types(QObject *parent) : QObject(parent) { } Types *Types::instance() { if (!s_instance) { s_instance = new Types(); } return s_instance; } Types::UnitSystem Types::unitSystem() const { return m_unitSystem; } void Types::setUnitSystem(Types::UnitSystem unitSystem) { if (m_unitSystem != unitSystem) { m_unitSystem = unitSystem; emit unitSystemChanged(); } } QString Types::toUiUnit(Types::Unit unit) const { Types::Unit uiUnit = unit; if (m_unitSystem == UnitSystemImperial) { switch (unit) { case Types::UnitDegreeCelsius: uiUnit = Types::UnitDegreeFahrenheit; break; case Types::UnitGram: uiUnit = Types::UnitOunce; break; case Types::UnitKiloGram: uiUnit = Types::UnitPound; break; case Types::UnitMilliMeter: case Types::UnitCentiMeter: uiUnit = Types::UnitInch; break; case Types::UnitMeter: uiUnit = Types::UnitFoot; break; case Types::UnitKiloMeter: uiUnit = Types::UnitMile; break; case Types::UnitMeterPerSecond: uiUnit = Types::UnitFootPerSecond; break; case Types::UnitKiloMeterPerHour: uiUnit = Types::UnitMilePerHour; break; case Types::UnitMilliBar: case Types::UnitBar: uiUnit = Types::UnitPoundsPerSquareInch; break; case Types::UnitLiter: uiUnit = Types::UnitFluidOunce; break; default: uiUnit = unit; } } switch (uiUnit) { case Types::UnitNone: return ""; case Types::UnitSeconds: return "s"; case Types::UnitMinutes: return "m"; case Types::UnitHours: return "h"; case Types::UnitUnixTime: return "datetime"; case Types::UnitMeterPerSecond: return "m/s"; case Types::UnitKiloMeterPerHour: return "km/h"; case Types::UnitDegree: return "°"; case Types::UnitRadiant: return "rad"; case Types::UnitDegreeCelsius: return "°C"; case Types::UnitDegreeKelvin: return "°K"; case Types::UnitMired: return "mir"; case Types::UnitMilliBar: return "mbar"; case Types::UnitBar: return "bar"; case Types::UnitPascal: return "Pa"; case Types::UnitHectoPascal: return "hPa"; case Types::UnitAtmosphere: return "atm"; case Types::UnitLumen: return "lm"; case Types::UnitLux: return "lx"; case Types::UnitCandela: return "cd"; case Types::UnitMilliMeter: return "mm"; case Types::UnitCentiMeter: return "cm"; case Types::UnitMeter: return "m"; case Types::UnitKiloMeter: return "km"; case Types::UnitGram: return "g"; case Types::UnitKiloGram: return "kg"; case Types::UnitDezibel: return "db"; case Types::UnitBpm: return "bpm"; case Types::UnitKiloByte: return "kB"; case Types::UnitMegaByte: return "MB"; case Types::UnitGigaByte: return "GB"; case Types::UnitTeraByte: return "TB"; case Types::UnitMilliWatt: return "mW"; case Types::UnitWatt: return "W"; case Types::UnitKiloWatt: return "kW"; case Types::UnitKiloWattHour: return "kWh"; case Types::UnitEuroPerMegaWattHour: return "€/MWh"; case Types::UnitEuroCentPerKiloWattHour: return "ct/kWh"; case Types::UnitPercentage: return "%"; case Types::UnitPartsPerMillion: return "ppm"; case Types::UnitPartsPerBillion: return "ppb"; case Types::UnitEuro: return "€"; case Types::UnitDollar: return "$"; case Types::UnitHertz: return "Hz"; case Types::UnitAmpere: return "A"; case Types::UnitMilliAmpere: return "mA"; case Types::UnitVolt: return "V"; case Types::UnitMilliVolt: return "mV"; case Types::UnitVoltAmpere: return "VA"; case Types::UnitVoltAmpereReactive: return "VAR"; case Types::UnitAmpereHour: return "Ah"; case Types::UnitMicroSiemensPerCentimeter: return "µS/cm"; case Types::UnitDuration: return "s"; // Units not in nymea:core case Types::UnitDegreeFahrenheit: return "°F"; case Types::UnitOunce: return "oz"; case Types::UnitPound: return "lb"; case Types::UnitInch: return "in"; case Types::UnitFoot: return "ft"; case Types::UnitMile: return "mi"; case Types::UnitFootPerSecond: return "fps"; case Types::UnitMilePerHour: return "mph"; case Types::UnitPoundsPerSquareInch: return "psi"; case Types::UnitNewton: return "N"; case Types::UnitNewtonMeter: return "Nm"; case Types::UnitRpm: return "rpm"; case Types::UnitMilligramPerLiter: return "mg/l"; case Types::UnitLiter: return "l"; case Types::UnitFluidOunce: return "fl oz"; case Types::UnitMicroGrammPerCubicalMeter: return "µg/m³"; } return ""; } QVariant Types::toUiValue(const QVariant &value, Types::Unit unit) const { if (m_unitSystem == UnitSystemImperial) { switch (unit) { case Types::UnitDegreeCelsius: // To Fahrenheit return (value.toDouble() * 9/5) + 32; case Types::UnitGram: // To Ounce return value.toDouble() / 28.35; case Types::UnitKiloGram: // To Pound return value.toDouble() * 2.205; case Types::UnitMilliMeter: // To Inch return value.toDouble() / 25.4; case Types::UnitCentiMeter: // To Inch return value.toDouble() / 2.54; case Types::UnitMeter: // To Feet return value.toDouble() * 3.281; case Types::UnitKiloMeter: // To Mile return value.toDouble() / 1.609; case Types::UnitMeterPerSecond: // To foot per second return value.toDouble() * 3.281; case Types::UnitKiloMeterPerHour: // To miles per hour return value.toDouble() / 1.609; case Types::UnitMilliBar: // To pounds per square inch (psi) return value.toDouble() * 0.01450377; case Types::UnitBar: // To pounds per square inch (psi) return value.toDouble() * 14.50377; case Types::UnitLiter: // To fl. oz return value.toDouble() * 33.814; default: return value; } } return value; }