From e3c26ffa34133a4dc6f34d9623529fb827650d71 Mon Sep 17 00:00:00 2001 From: "PANIK\\chris" Date: Sun, 21 Dec 2025 18:31:16 +0100 Subject: [PATCH] Reworked data types, part II --- bc.cpp | 16 ++++++++++++++++ bc.h | 14 ++++++++++++++ bccandriver.cpp | 23 +++-------------------- bccandriver.h | 39 ++++++++++++++++----------------------- bccandrivertinycan.cpp | 33 ++++++++++++++++++++++----------- bccandrivertinycan.h | 6 +++--- bcitemdelegate.cpp | 4 ++-- bcmainwindow.cpp | 2 +- bctransmitter.cpp | 8 ++++---- bctransmitter.h | 2 +- bcvalue.cpp | 2 +- bcvalue.h | 4 ++-- 12 files changed, 85 insertions(+), 68 deletions(-) diff --git a/bc.cpp b/bc.cpp index 4fd2ebc..196c27a 100644 --- a/bc.cpp +++ b/bc.cpp @@ -7,6 +7,22 @@ #include #include + +//! erzeugt einen std::runtime_error mit text und optionalem parameter + +BCException::BCException(const QString& what, const QString& param ) + : std::runtime_error( param.isEmpty() ? what.toStdString() : QString( "%1: %2" ).arg(what,param).toStdString( ) ) +{ + +} + +BCException::BCException( const QString& what, int errCode ) + : std::runtime_error( QString( "%1: %2" ).arg(what,errCode).toStdString( ) ) +{ + +} + + namespace bc { diff --git a/bc.h b/bc.h index adb0e6b..3b92bc3 100644 --- a/bc.h +++ b/bc.h @@ -37,6 +37,20 @@ using bcdata_t = uint8_t; + +/** + * @brief Simple exception class + */ + +class BCException : public std::runtime_error +{ + +public: + + BCException( const QString& what, const QString& param="" ); + BCException( const QString& what, int errCode ); +}; + namespace bc { [[maybe_unused]] constexpr static double UNLIMITED_SPEED_VALUE = 70; // Km/h diff --git a/bccandriver.cpp b/bccandriver.cpp index cffbac7..167246f 100644 --- a/bccandriver.cpp +++ b/bccandriver.cpp @@ -10,34 +10,17 @@ BCCanDriver::BCCanDriver(QObject* parent ) } -BCCanDriver::dState BCCanDriver::getState() +BCCanDriver::DriverState BCCanDriver::getState() const { return _driverState; } -void BCCanDriver::setState( dState newState ) +void BCCanDriver::setState( DriverState newState ) { _driverState = newState; } -QString BCCanDriver::stateLabel( dState state ) -{ - switch( (int) state ) - { - case sDriverError: - return stDriverError; - case sIdle: - return stIdle; - - case sLoaded: - return stLoaded; - - case sReady: - return stReady; - }; - -} /** * * @brief Der Slot, der das Initialisieren des Treibers auslöst. @@ -56,7 +39,7 @@ void BCCanDriver::onStartDriver() { // erstmal die Dll Laden: State::sIdle -> State::sLoaded - if( BCCanDriver::sIdle == _driverState ) + if( _driverState == DriverState::NotPresent) _driverState = loadDriver(); emit stateChanged( (int) _driverState ); diff --git a/bccandriver.h b/bccandriver.h index 37cd8f2..c84acb4 100644 --- a/bccandriver.h +++ b/bccandriver.h @@ -58,31 +58,26 @@ class BCCanDriver : public QObject public: - typedef enum + enum class DriverState { - sDriverError = 0, - sIdle, - sLoaded, - sReady, - dStateSize - } dState; - - [[maybe_unused]] constexpr static const char* stDriverError = "Error"; - [[maybe_unused]] constexpr static const char* stIdle = "[not loaded]"; - [[maybe_unused]] constexpr static const char* stLoaded = "[not connected]"; - [[maybe_unused]] constexpr static const char* stReady = "Ready"; - - static QString stateLabel( dState state ); + NotPresent, + Error, + Loaded, + Initialized, + Connected, + Ready + }; + Q_ENUM(DriverState) explicit BCCanDriver( QObject* parent = nullptr ); virtual ~BCCanDriver() = default; - dState getState(); + DriverState getState() const; - virtual BCCanDriver::dState loadDriver() = 0; - virtual BCCanDriver::dState initDriver() = 0; + virtual DriverState loadDriver() = 0; + virtual DriverState initDriver() = 0; - virtual std::optional readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const = 0; + virtual bcdata_t readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const = 0; virtual void writeRawValue( BCDevice::ID deviceID, BC::ID registerID, bcdata_t value ) const = 0; signals: @@ -91,20 +86,18 @@ signals: void statusHint( const QString& msg ) const; void stateChanged( int state ); - void itemReady( const QString& label ); - void itemLoaded( CBCItem& item ); public slots: void onStartDriver(); - //void onLoadItem( CBCItem& item ); protected: - void setState( dState newState ); + void setState( DriverState newState ); - dState _driverState = sIdle; + DriverState _driverState{DriverState::NotPresent}; + //?? int _retries = 5; int _timeOuts = 20; diff --git a/bccandrivertinycan.cpp b/bccandrivertinycan.cpp index 43bf86a..8a4b137 100644 --- a/bccandrivertinycan.cpp +++ b/bccandrivertinycan.cpp @@ -21,7 +21,7 @@ BCCanDriverTinyCan::BCCanDriverTinyCan( QObject* parent ) } -BCCanDriver::dState BCCanDriverTinyCan::loadDriver() +BCCanDriver::DriverState BCCanDriverTinyCan::loadDriver() { //qDebug() << "CanBusControl " << cbc::Version << '\n' << "based on BigXionFlasher (c) 2011-2013 by Thomas Koenig - www.bigxionflasher.org"; @@ -31,8 +31,10 @@ BCCanDriver::dState BCCanDriverTinyCan::loadDriver() if( ::LoadDriver( NULL ) < 0 ) throw std::runtime_error( "Driver Error: 'LoadDriver'" ); + setState(BCCanDriver::DriverState::Loaded); + if( ::CanInitDriver( NULL ) < 0 ) - throw std::runtime_error( "Driver Error: 'InitDriver'" ); + throw std::runtime_error( "Driver Error: 'InitDriver'" ); if( ::CanDeviceOpen( 0, NULL ) < 0 ) throw std::runtime_error( "Driver Error: 'DeviceOpen'" ); @@ -41,6 +43,8 @@ BCCanDriver::dState BCCanDriverTinyCan::loadDriver() ::CanSetMode( 0, OP_CAN_START, CAN_CMD_ALL_CLEAR ); ::CanGetDeviceStatus( 0, &status ); + setState(BCCanDriver::DriverState::Initialized); + if( status.DrvStatus < DRV_STATUS_CAN_OPEN ) throw std::runtime_error( "Driver Error: could not open device." ); @@ -50,9 +54,9 @@ BCCanDriver::dState BCCanDriverTinyCan::loadDriver() throw std::runtime_error( "Driver Error: CAN Status 'BusOff'" ); } - setState(BCCanDriver::sLoaded); + setState(BCCanDriver::DriverState::Ready); - return BCCanDriver::sLoaded; + return BCCanDriver::DriverState::Ready; } @@ -75,13 +79,13 @@ BCCanDriver::dState BCCanDriverTinyCan::loadDriver() */ -BCCanDriver::dState BCCanDriverTinyCan::initDriver() +BCCanDriver::DriverState BCCanDriverTinyCan::initDriver() { qDebug() << "XXX BCCanDriverTinyCan::Driver Init: putting BCDevice::ID::Console in slave mode ... "; // BCDevice::ID::Console already in slave mode. good! if( readRawValue( BCDevice::ID::Console, BC::ID::Cons_Status_Slave ) ) - return BCCanDriver::sReady; + return DriverState::Ready; qDebug() << "BCCanDriverTinyCan::BCCanDriverTinyCan::XXX Driver Init: putting BCDevice::ID::Console in slave mode ... "; @@ -92,7 +96,7 @@ BCCanDriver::dState BCCanDriverTinyCan::initDriver() do { writeRawValue( BCDevice::ID::Console, BC::ID::Cons_Status_Slave, 1 ); - isSlave = *readRawValue( BCDevice::ID::Console, BC::ID::Cons_Status_Slave ); + isSlave = readRawValue( BCDevice::ID::Console, BC::ID::Cons_Status_Slave ); bc::delay_millis( 200 ); } while( retry-- && !isSlave ); @@ -100,20 +104,24 @@ BCCanDriver::dState BCCanDriverTinyCan::initDriver() bc::delay_millis( 500 ); // give the Console some time to settle //if( !isSlave ) emit statusHint( QString("putting BCDevice::ID::Console in slave mode ") + (isSlave ? "done" : "failed") ); + // ist das jetzt irgendwie schlimm, wenn wir keine slave BCDevice::ID::Console haben //return isSlave ? BCCanDriver::connected - return BCCanDriver::sReady; + return DriverState::Ready; } -std::optional BCCanDriverTinyCan::readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const +bcdata_t BCCanDriverTinyCan::readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const { - struct TCanMsg msg; + if( getState() != DriverState::Ready) + throw BCException( "readRawValue error: driver not loaded." ); + + TCanMsg msg; uint32_t device = static_cast(deviceID); uint8_t reg = static_cast (registerID); @@ -137,7 +145,7 @@ std::optional BCCanDriverTinyCan::readRawValue( BCDevice::ID deviceID, bc::delay_millis( cTIMEOUT_MS ); if( timeOuts == -1 ) - throw std::runtime_error( "getValue error: could not send value" ); + throw BCException( "readRawValue error: could not send value" ); retry: @@ -178,6 +186,9 @@ retry: void BCCanDriverTinyCan::writeRawValue( BCDevice::ID deviceID, BC::ID registerID, bcdata_t value ) const { + if( getState() != DriverState::Ready) + throw BCException( "writeRawValue error: driver not loaded." ); + qDebug() << " --- BCCanDriverTinyCan writeRawValue: " << value; uint32_t device = static_cast(deviceID); diff --git a/bccandrivertinycan.h b/bccandrivertinycan.h index ddfa37d..0e264af 100644 --- a/bccandrivertinycan.h +++ b/bccandrivertinycan.h @@ -12,10 +12,10 @@ public: explicit BCCanDriverTinyCan( QObject* parent=nullptr ); virtual ~BCCanDriverTinyCan() = default; - BCCanDriver::dState loadDriver() override; - BCCanDriver::dState initDriver() override; + DriverState loadDriver() override; + DriverState initDriver() override; - std::optional readRawValue ( BCDevice::ID deviceID, BC::ID registerID ) const override; + bcdata_t readRawValue ( BCDevice::ID deviceID, BC::ID registerID ) const override; void writeRawValue( BCDevice::ID deviceID, BC::ID registerID, bcdata_t value ) const override; QString getNodeName( unsigned char id ); diff --git a/bcitemdelegate.cpp b/bcitemdelegate.cpp index 2e463b7..eaf2aba 100644 --- a/bcitemdelegate.cpp +++ b/bcitemdelegate.cpp @@ -99,9 +99,9 @@ void BCItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) co QLabel *lblUnit = editor->findChild("lblUnit"); if (slider && lblUnit) { - bool oldState = slider->blockSignals(true); + bool olDriverState = slider->blockSignals(true); slider->setValue(bc.value.toInt()); - slider->blockSignals(oldState); + slider->blockSignals(olDriverState); lblUnit->setText(QString("%1 %2").arg(bc.value.toInt()).arg( "mm3")); } else { diff --git a/bcmainwindow.cpp b/bcmainwindow.cpp index 132306e..ca80bf3 100644 --- a/bcmainwindow.cpp +++ b/bcmainwindow.cpp @@ -54,7 +54,7 @@ BCMainWindow::BCMainWindow(QWidget *parent) //_valueView->setItemDelegate(_delegate); // Highlight mit Fade-Out: - _delegate->onHighlightRow(2); // 2 Sekunden Fade + //_delegate->onHighlightRow(2); // 2 Sekunden Fade BCTransmitter* transmitter = _valueManager.getTransmitter(); // besser: model::emit dataChanged diff --git a/bctransmitter.cpp b/bctransmitter.cpp index e5272d0..f2df86f 100644 --- a/bctransmitter.cpp +++ b/bctransmitter.cpp @@ -14,12 +14,12 @@ void BCTransmitter::onToggleConnectionState( bool connect ) { if( connect ) { - if( BCCanDriver::sIdle == _canDriver.getState() ) + if( _canDriver.getState() != BCCanDriver::DriverState::Ready ) _canDriver.onStartDriver(); - std::optional hwVersion = _canDriver.readRawValue( BCDevice::ID::Console, BC::ID::Cons_Rev_Hw); + bcdata_t hwVersion = _canDriver.readRawValue( BCDevice::ID::Console, BC::ID::Cons_Rev_Hw); - if(!hwVersion.has_value()) + if(!hwVersion) { qDebug() << "Console not responding"; } @@ -106,7 +106,7 @@ void BCTransmitter::processValueOp( BC::OpID opID ) } } -std::optional BCTransmitter::readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const +bcdata_t BCTransmitter::readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const { return _canDriver.readRawValue( deviceID, registerID ); } diff --git a/bctransmitter.h b/bctransmitter.h index 2f97116..167eff2 100644 --- a/bctransmitter.h +++ b/bctransmitter.h @@ -17,7 +17,7 @@ public: explicit BCTransmitter(QObject *parent = nullptr); - std::optional readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const override; + bcdata_t readRawValue( BCDevice::ID deviceID, BC::ID registerID ) const override; void writeRawValue(BCDevice::ID deviceID, BC::ID registerID, bcdata_t value ) const override; public slots: diff --git a/bcvalue.cpp b/bcvalue.cpp index 8f5bb7a..2a25ea4 100644 --- a/bcvalue.cpp +++ b/bcvalue.cpp @@ -60,7 +60,7 @@ BCValue::BCValue(const BCValueType& valueType_, BCDevice::ID deviceID_, BC::ID r void BCValue::readRawValue( const BCAbstractTransmitter& transmitter ) const { - std::optional result = transmitter.readRawValue( deviceID, registerID ); + bcdata_t result = transmitter.readRawValue( deviceID, registerID ); } diff --git a/bcvalue.h b/bcvalue.h index 0718a8e..c35d57b 100644 --- a/bcvalue.h +++ b/bcvalue.h @@ -61,8 +61,8 @@ class BCAbstractTransmitter public: // - virtual std::optional readRawValue( BCDevice::ID deviceID_, BC::ID registerID_ ) const = 0; - virtual void writeRawValue( BCDevice::ID deviceID_, BC::ID registerID_, uint8_t value_ ) const = 0; + virtual bcdata_t readRawValue( BCDevice::ID deviceID_, BC::ID registerID_ ) const = 0; + virtual void writeRawValue( BCDevice::ID deviceID_, BC::ID registerID_, uint8_t value_ ) const = 0; };