Files
BionxControl/bcvalue.h

154 lines
4.5 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-12 23:06:36 +01:00
QString formatValue() const;
double calcMinMaxRatio() const;
void dumpValue() const;
bool isWord() const;
bool isReadOnly() const;
Flags& getValueFlags() const noexcept { return _valueFlags; }
void setValueFlags(Flags newFlags) { _valueFlags = newFlags; }
BCDevice::ID getDeviceID() const noexcept { return _deviceID; }
BC::ID getRegisterID() const noexcept { return _registerID; }
uint32_t getRawValue() const noexcept { return _rawValue; }
void setRawValue(uint32_t newRawValue) const { _rawValue = newRawValue; }
void setFromDouble( double value );
ValueType getValueType() const noexcept { return _valueType; }
int getIndexRow() const noexcept { return _indexRow; }
void setIndexRow(int newIndexRow) { _indexRow = newIndexRow; }
QString getLabel() const { return _label; }
QString getUnitLabel() const { return _unitLabel; }
double getFactor() const noexcept { return _factor; }
const OptDouble getOptMin() const { return _optMin; }
const OptDouble getOptMax() const { return _optMax; }
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-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