Files
BionxControl/bcvalue.h

174 lines
5.1 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:
2026-01-21 17:07:00 +01:00
mhsMEMBER _canMEMBER _drv.c
2025-12-26 14:07:55 +01:00
© 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
***************************************************************************/
2026-02-09 16:03:09 +01:00
#ifndef BC_VALUEMEMBER_H
#define BC_VALUEMEMBER_H
2026-01-21 17:07:00 +01:00
#include <expected>
2025-12-15 20:57:09 +01:00
2025-12-15 23:05:48 +01:00
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
2026-01-21 17:07:00 +01:00
//using ReadValueFunc = std::function<TransmitResult( const BCAbstractTransmitter& transmitter, uint32MEMBER _t deviceID, uint8MEMBER _t registerID )>;
2026-01-03 02:50:28 +01:00
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-21 17:07:00 +01:00
//Q_PROPERTY(Flags valueFlags MEMBER _valueFlags )
Q_PROPERTY(BCDevice::ID deviceID MEMBER _deviceID READ deviceID )
Q_PROPERTY(BC::ID registerID MEMBER _registerID READ registerID )
Q_PROPERTY(ValueType valueType MEMBER _valueType READ valueType )
Q_PROPERTY(int indexRow MEMBER _indexRow READ indexRow)
Q_PROPERTY(QString label MEMBER _label READ label )
Q_PROPERTY(uint32_t rawValue MEMBER _rawValue READ rawValue )
Q_PROPERTY(QString unitLabel MEMBER _unitLabel READ unitLabel )
Q_PROPERTY(double factor MEMBER _factor )
//QMEMBER _PROPERTY(OptDouble MEMBER _optMin)
//QMEMBER _PROPERTY(OptDouble MEMBER _optMax)
2026-01-22 22:16:19 +01:00
struct ValueRange
{
int value{0};
int min{0};
int max{0};
double ratio{1};
};
2026-01-21 17:07:00 +01:00
BCValue( BCDevice::ID deviceID, BC::ID registerID );
2026-01-03 02:50:28 +01:00
2026-01-12 23:06:36 +01:00
QString formatValue() const;
double calcMinMaxRatio() const;
void dumpValue() const;
bool isWord() const;
bool isReadOnly() const;
2026-01-13 16:29:02 +01:00
bool testFlag( Flag flag ) const;
void setFlag( Flag flag, bool state=true ) const;
2026-01-12 23:06:36 +01:00
2026-01-19 16:44:52 +01:00
BCDevice::ID deviceID() const noexcept;
BC::ID registerID() const noexcept;
2026-01-12 23:06:36 +01:00
2026-01-19 16:44:52 +01:00
uint32_t rawValue() const noexcept;
2026-01-16 23:46:58 +01:00
void setRawValue(uint32_t newRawValue) const;
2026-01-12 23:06:36 +01:00
void setFromDouble( double value );
2026-01-19 16:44:52 +01:00
ValueType valueType() const noexcept;
int indexRow() const noexcept;
2026-01-21 17:07:00 +01:00
2026-01-16 23:46:58 +01:00
void setIndexRow(int newIndexRow);
2026-01-19 16:44:52 +01:00
QString label() const;
QString unitLabel() const;
2026-01-22 22:16:19 +01:00
bool valuesForSlider( ValueRange& valueRange ) const;
2026-01-11 14:48:51 +01:00
2026-01-21 17:07:00 +01:00
QString toString() const;
2026-01-11 14:48:51 +01:00
protected:
2026-01-12 23:06:36 +01:00
mutable Flags _valueFlags{BCValue::Flag::NoFlag};
BCDevice::ID _deviceID{BCDevice::ID::Invalid};
BC::ID _registerID{BC::ID::Invalid};
ValueType _valueType{ValueType::Plain};
int _indexRow{-1};
QString _label;
mutable uint32_t _rawValue{};
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-21 17:07:00 +01:00
Q_DECLARE_METATYPE(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
2026-01-21 17:07:00 +01:00
// Generischer Operator für ALLE GADGETs
inline QTextStream& operator<<(QTextStream& out, const BCValue& obj);
2025-12-15 20:57:09 +01:00
2025-12-28 22:48:18 +01:00
#endif // BCVALUE_H