Files
BionxControl/bcvalue.h

168 lines
4.7 KiB
C
Raw Normal View History

2025-12-15 23:05:48 +01:00
/***************************************************************************
2025-12-26 14:07:55 +01:00
BionxControl
2026-01-03 23:51:14 +01:00
© 2025 -2026 christoph holzheuer
2025-12-26 14:07:55 +01:00
christoph.holzheuer@gmail.com
Using:
mhs_can_drv.c
© 2011 - 2023 by MHS-Elektronik GmbH & Co. KG, Germany
Klaus Demlehner, klaus@mhs-elektronik.de
@see www.mhs-elektronik.de
Based on Bionx data type descriptions from:
BigXionFlasher USB V 0.2.4 rev. 97
© 2011-2013 by Thomas Koenig <info@bigxionflasher.org>
@see www.bigxionflasher.org
Bionx Bike Info
© 2018 Thorsten Schmidt (tschmidt@ts-soft.de)
@see www.ts-soft.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
@see https://github.com/bikemike/bionx-bikeinfo
2025-12-15 23:05:48 +01:00
***************************************************************************/
2025-12-28 22:48:18 +01:00
#ifndef BCVALUE_H
#define BCVALUE_H
2025-12-15 20:57:09 +01:00
2025-12-17 17:50:24 +01:00
#include <QObject>
2025-12-15 20:57:09 +01:00
#include <QString>
2025-12-15 23:05:48 +01:00
#include <QList>
2025-12-16 22:42:35 +01:00
#include <QVariant>
2025-12-15 23:05:48 +01:00
2026-01-03 02:50:28 +01:00
#include <expected>
2025-12-15 20:57:09 +01:00
#include <bc.h>
2025-12-17 17:50:24 +01:00
/*
2025-12-19 13:24:18 +01:00
Werte haben verschiedene Längen (1,2 und 4 Byte) und werder auf unterschiedliche Art und Weise
2025-12-29 15:44:06 +01:00
ausgelesen und geschrieben (Siehe BCValueTypeWord). Sie können also Wert-Typen zugeordnet werden. Ein Werttyp
2025-12-19 13:24:18 +01:00
lässet über eine ID identifizieren, die mit der phyikalische Einheit des Wertes überschneiden kann,
2025-12-24 12:11:59 +01:00
aber nicht muss: : Km/h, kWh, BCValueTypeWord ... bilden eigene Typen, SoC, Assistence Level sind auch eigene Typen,
2025-12-19 13:24:18 +01:00
Teilen sich jedoch die Einheit '%'.
2025-12-17 17:50:24 +01:00
Das ist natürlich annalog zu den ItemTypes:
- ein Value hat einen ValueType, der bestimmt folgendes:
2025-12-18 09:30:43 +01:00
- long or short or quad
2025-12-17 17:50:24 +01:00
- unit (mm, km/h, odo ... )
-
*/
2025-12-19 13:24:18 +01:00
2026-01-03 02:50:28 +01:00
using OptDouble = std::optional<double>;
// Enthält den gelesenen Wert oder einen Fehlerstring
using TransmitResult = std::expected<uint32_t,QString>;
// Funktionsobject, um Werte aus der Transmitterschicht zu holden
//using ReadValueFunc = std::function<TransmitResult( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID )>;
2025-12-28 22:48:18 +01:00
class BCValue
2025-12-15 23:05:48 +01:00
{
2026-01-08 20:47:05 +01:00
Q_GADGET
2025-12-15 23:05:48 +01:00
2026-01-11 14:48:51 +01:00
friend class BCXmlLoader;
2025-12-15 23:05:48 +01:00
public:
2026-01-03 02:50:28 +01:00
// Aus dem Type ergibt sich
// später der Editor
enum class ValueType : uint8_t
{
2026-01-07 17:13:35 +01:00
Plain, // nur lesen, sowas wie SerialNo
2026-01-03 02:50:28 +01:00
Bool,
Number,
Float
2026-01-03 02:50:28 +01:00
};
2026-01-07 17:13:35 +01:00
enum class Flag : uint8_t
{
2026-01-07 22:20:39 +01:00
NoFlag = 0x00,
2026-01-02 01:43:49 +01:00
ReadMe = 0x01,
WriteMe = 0x02,
ReadOnly = 0x04,
Locked = 0x08,
Failed = 0x10,
InSync = 0x20,
2026-01-07 17:13:35 +01:00
OK = 0x40,
IsWord = 0x80
};
2026-01-07 17:13:35 +01:00
Q_DECLARE_FLAGS(Flags, Flag )
2026-01-08 20:47:05 +01:00
Q_FLAG(Flags)
2026-01-03 02:50:28 +01:00
BCValue( BCDevice::ID deviceID_, BC::ID registerID_ );
2026-01-07 17:13:35 +01:00
QString formatValue() const;
2026-01-11 14:48:51 +01:00
double calcMinMaxRatio() const;
2026-01-03 13:15:15 +01:00
void dumpValue() const;
2026-01-07 17:13:35 +01:00
bool isWord() const;
2026-01-08 14:55:47 +01:00
bool isReadOnly() const;
2026-01-07 17:13:35 +01:00
2026-01-11 14:48:51 +01:00
Flags& getValueFlags() const noexcept { return valueFlags; }
void setValueFlags(Flags newFlags) { valueFlags = newFlags; }
BCDevice::ID getDeviceID() const noexcept { return deviceID; }
//void setDeviceID(BCDevice::ID newDeviceID) { deviceID = newDeviceID; }
BC::ID getRegisterID() const noexcept { return registerID; }
ValueType getValueType() const noexcept { return valueType; }
int getIndexRow() const noexcept { return indexRow; }
void setIndexRow(int newIndexRow) { indexRow = newIndexRow; }
QString getLabel() const { return label; }
uint32_t getRawValue() const noexcept { return rawValue; }
void setRawValue(uint32_t newRawValue) const { rawValue = newRawValue; }
2026-01-11 20:01:33 +01:00
void setFromDouble( double value )
{}
2026-01-11 14:48:51 +01:00
QString getUnitLabel() const { return unitLabel; }
void setUnitLabel(const QString &newUnitLabel) { unitLabel = newUnitLabel; }
double getFactor() const noexcept { return factor; }
void setFactor(double newFactor) { factor = newFactor; }
const OptDouble getOptMin() const { return optMin; }
void setOptMin(const OptDouble &newOptMin) { optMin = newOptMin; }
const OptDouble getOptMax() const { return optMax; }
void setOptMax(const OptDouble &newOptMax) { optMax = newOptMax; }
protected:
2026-01-08 14:55:47 +01:00
mutable Flags valueFlags{BCValue::Flag::NoFlag};
2026-01-07 17:13:35 +01:00
BCDevice::ID deviceID{BCDevice::ID::Invalid};
BC::ID registerID{BC::ID::Invalid};
ValueType valueType{ValueType::Plain};
int indexRow{-1};
QString label;
2026-01-08 00:25:36 +01:00
mutable uint32_t rawValue{};
2026-01-07 17:13:35 +01:00
QString unitLabel;
double factor{1};
OptDouble optMin;
OptDouble optMax;
2026-01-11 14:48:51 +01:00
2025-12-15 20:57:09 +01:00
};
2026-01-07 17:13:35 +01:00
Q_DECLARE_OPERATORS_FOR_FLAGS(BCValue::Flags)
2026-01-02 01:43:49 +01:00
2026-01-02 16:25:21 +01:00
using BCValuePtr = std::shared_ptr<BCValue>;
using BCValuePtrConst = std::shared_ptr<const BCValue>;
2025-12-28 22:48:18 +01:00
//using BCValueList = QList<BCValue>;
2026-01-02 01:43:49 +01:00
using BCValueList = QList<BCValuePtr>;
2025-12-23 20:47:03 +01:00
2026-01-02 01:52:48 +01:00
Q_DECLARE_METATYPE(const BCValuePtr)
2026-01-03 02:50:28 +01:00
Q_DECLARE_METATYPE(BCValueList)
2025-12-27 18:43:15 +01:00
2025-12-15 20:57:09 +01:00
2025-12-28 22:48:18 +01:00
#endif // BCVALUE_H