Crash protection. part I
This commit is contained in:
@@ -43,20 +43,11 @@
|
||||
using namespace Qt::StringLiterals;
|
||||
|
||||
|
||||
void processEventsFor(int milliseconds)
|
||||
{
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
|
||||
while (timer.elapsed() < milliseconds) {
|
||||
QApplication::processEvents(QEventLoop::AllEvents, 50);
|
||||
}
|
||||
}
|
||||
|
||||
BCValueManager::BCValueManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
loadTypeData();
|
||||
createValueTypes();
|
||||
|
||||
qRegisterMetaType<BCValue>("BCValue");
|
||||
|
||||
@@ -65,7 +56,7 @@ BCValueManager::BCValueManager(QObject *parent)
|
||||
// 4. Verbindungen herstellen (Signal/Slot über Thread-Grenzen)
|
||||
|
||||
// A) Befehl senden (Manager -> Runner)
|
||||
connect(this, &BCValueManager::valueCreated, &_transmitter, &BCTransmitter::enqueueValue);
|
||||
connect(this, &BCValueManager::sendValueCommand, &_transmitter, &BCTransmitter::enqueueValueCommand);
|
||||
|
||||
// B) Ergebnisse empfangen (Runner -> Manager)
|
||||
//connect(&_transmitter, &BCTransmitter::commandFinished, this, &BCValueManager::onCommandFinished);
|
||||
@@ -88,6 +79,49 @@ BCValueManager::~BCValueManager()
|
||||
}
|
||||
|
||||
|
||||
void BCValueManager::createValueTypes()
|
||||
{
|
||||
/*
|
||||
Invalid = 0x0,
|
||||
"Text"
|
||||
"Number"
|
||||
"Float"
|
||||
"Percent"
|
||||
"KWh"
|
||||
"Watt"
|
||||
"Km"
|
||||
"Kmh"
|
||||
"Mm"
|
||||
"Sec"
|
||||
"SoC"
|
||||
"Odo"
|
||||
"Date"
|
||||
|
||||
*/
|
||||
//_valueTypes.insert( { BCValueType::TypeID::Invalid, "Invalid" } );
|
||||
|
||||
_valueTypes.insert( "Invalid", { BCValueType::TypeID::Invalid, "Invalid" } );
|
||||
_valueTypes.insert( "Text", { BCValueType::TypeID::Text } );
|
||||
_valueTypes.insert( "Number", { BCValueType::TypeID::Number } );
|
||||
|
||||
_valueTypes.insert( "Byte", { BCValueType::TypeID::Byte } );
|
||||
_valueTypes.insert( "Word", { BCValueType::TypeID::Word } );
|
||||
_valueTypes.insert( "Quad", { BCValueType::TypeID::Quad } );
|
||||
|
||||
_valueTypes.insert( "Float", { BCValueType::TypeID::Float, "", 1.5625} );
|
||||
_valueTypes.insert( "Percent",{ BCValueType::TypeID::Percent, "%", 1.5625 } );
|
||||
_valueTypes.insert( "KWh", { BCValueType::TypeID::KWh, "kwh", 1.5625 } );
|
||||
_valueTypes.insert( "Watt", { BCValueType::TypeID::Watt, "w", 1.5625 } );
|
||||
_valueTypes.insert( "Km", { BCValueType::TypeID::Km, "km", 1.5625 } );
|
||||
_valueTypes.insert( "Kmh", { BCValueType::TypeID::Kmh, "km/h", 0.1 } );
|
||||
_valueTypes.insert( "Mm", { BCValueType::TypeID::Mm, "mm", 1.5625 } );
|
||||
_valueTypes.insert( "Sec", { BCValueType::TypeID::Sec, "s", 1.5625 } );
|
||||
_valueTypes.insert( "SoC", { BCValueType::TypeID::SoC, "%", 1.5625 } );
|
||||
_valueTypes.insert( "Odo", { BCValueType::TypeID::Odo, "km", 1.5625 } );
|
||||
_valueTypes.insert( "Assist", { BCValueType::TypeID::Assist, "", 0 ,4 } );
|
||||
_valueTypes.insert( "Assist", { BCValueType::TypeID::AssistFac, "%" } );
|
||||
_valueTypes.insert( "Date", { BCValueType::TypeID::Date } );
|
||||
}
|
||||
|
||||
void BCValueManager::onCommandFinished(int id, bool success)
|
||||
{
|
||||
@@ -100,75 +134,40 @@ void BCValueManager::onRunnerMessage(const QString &msg)
|
||||
}
|
||||
|
||||
|
||||
void BCValueManager::onToggleConnectionState( bool connect )
|
||||
{
|
||||
if( connect )
|
||||
{
|
||||
if( BCCanDriver::sIdle == _canDriver.getState() )
|
||||
_canDriver.onStartDriver();
|
||||
|
||||
int hwVersion = _canDriver.getValue( BCDevice::ID::Console, BC::ID::Cons_Rev_Hw);
|
||||
|
||||
if (hwVersion == 0)
|
||||
{
|
||||
qDebug() << "Console not responding";
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
swVersion = getValue(CONSOLE, CONSOLE_REF_SW);
|
||||
printf( "Console information:" _NL
|
||||
" hardware version ........: %02d" _NL
|
||||
" software version ........: %02d" _NL
|
||||
" assistance level ........: %d" _NL,
|
||||
hwVersion, swVersion,
|
||||
getValue(CONSOLE, CONSOLE_ASSIST_INITLEVEL)
|
||||
);
|
||||
|
||||
if (!gNoSerialNumbers)
|
||||
printf( " part number .............: %05d" _NL
|
||||
" item number .............: %05d" _NL _NL,
|
||||
((getValue(CONSOLE, CONSOLE_SN_PN_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_PN_LO)),
|
||||
((getValue(CONSOLE, CONSOLE_SN_ITEM_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_ITEM_LO))
|
||||
);
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
qDebug() << " ---HAIL to the kings: " << hwVersion;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BCValueManager::onSyncFromDevice()
|
||||
{
|
||||
qDebug() << " ---Syncing";
|
||||
if( _currentDeviceID != BCDevice::ID::Invalid)
|
||||
if( _currentDeviceID != BCDevice::ID::Invalid )
|
||||
{
|
||||
|
||||
BCValueList& currentList = _valueModels[_currentDeviceID]->getValueList();
|
||||
|
||||
BCValue& value = currentList[4];
|
||||
|
||||
for( const BCValue& value : currentList )
|
||||
if( _valueModels.contains(_currentDeviceID) )
|
||||
{
|
||||
qDebug() << " --- value: " << value.label;
|
||||
|
||||
// statt '_transmitter.enqueueValue( value )' entkoppeln
|
||||
// wir das eleganter über emit valueCreated()
|
||||
BCValueModel* model = _valueModels[_currentDeviceID];
|
||||
BCValueList& currentList = model->getValueList();
|
||||
|
||||
//_transmitter.enqueueValue( value );
|
||||
emit valueCreated(value);
|
||||
//BCValue& value = currentList[4];
|
||||
|
||||
emit valueTouched( value.rowInModel );
|
||||
for( const BCValue& value : currentList )
|
||||
{
|
||||
qDebug() << " --- value: " << value.label;
|
||||
|
||||
processEventsFor(500);
|
||||
//QApplication::processEvents();
|
||||
// Thread schlafen lassen (Simulation einer blockierenden Operation)
|
||||
//QThread::msleep(500);
|
||||
// statt '_transmitter.enqueueValueCommand( value )' entkoppeln
|
||||
// wir das eleganter über emit sendValueCommand()
|
||||
|
||||
}
|
||||
//_transmitter.enqueueValueCommand( value );
|
||||
emit sendValueCommand( BC::OpID::ReadValue, value);
|
||||
|
||||
emit valueTouched( value.rowInModel );
|
||||
|
||||
bc::processEventsFor(500);
|
||||
|
||||
//QApplication::processEvents();
|
||||
// Thread schlafen lassen (Simulation einer blockierenden Operation)
|
||||
//QThread::msleep(500);
|
||||
|
||||
}
|
||||
} // if contains
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,6 +178,11 @@ std::optional<BCValueModel*> BCValueManager::getModel(BCDevice::ID deviceID )
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
BCTransmitter* BCValueManager::getTransmitter()
|
||||
{
|
||||
return &_transmitter;
|
||||
};
|
||||
|
||||
void BCValueManager::loadBikeData()
|
||||
{
|
||||
auto printAttrs = [](const QXmlStreamReader& xml)
|
||||
@@ -229,7 +233,7 @@ void BCValueManager::loadBikeData()
|
||||
qDebug() << " --- Device: " << _xml.name() << ": " << deviceType << " : " << deviceID;
|
||||
|
||||
_currentDeviceID = BCDevice::ID( deviceID.value() );
|
||||
BCValueList parsedValues;
|
||||
BCValueList parsedValues;
|
||||
loadDeviceData( parsedValues );
|
||||
if( parsedValues.count() )
|
||||
{
|
||||
@@ -288,19 +292,16 @@ void BCValueManager::loadDeviceData( BCValueList& parsedValues )
|
||||
.ID = id,
|
||||
.Label = _xml.attributes().value(BCTags::Label).toString(),
|
||||
.Default = _xml.attributes().value(BCTags::Default).toString(),
|
||||
.Current = _xml.attributes().value(BCTags::Current).toString(),
|
||||
.Enabled = _xml.attributes().value(BCTags::Enabled).toString(),
|
||||
.UnitType = _xml.attributes().value(BCTags::UnitType).toString(),
|
||||
.Min = _xml.attributes().value(BCTags::Min).toString(),
|
||||
.Max = _xml.attributes().value(BCTags::Max).toString(),
|
||||
.Factor = _xml.attributes().value(BCTags::Factor).toString()
|
||||
};
|
||||
|
||||
// __fix! können ungültige werte erzeugt werden ?
|
||||
//BCValue newValue = BCValue::makeValue( _currentDeviceID, params );
|
||||
//if(newValue)
|
||||
// parsedValues.push_back( newValue );
|
||||
parsedValues.push_back( makeValue( _currentDeviceID, params ) );
|
||||
std::optional<BCValue> newValue = makeValue( _currentDeviceID, params );
|
||||
if(newValue)
|
||||
parsedValues.push_back( *newValue );
|
||||
}
|
||||
|
||||
//printAttrs (_xml);
|
||||
@@ -308,48 +309,57 @@ void BCValueManager::loadDeviceData( BCValueList& parsedValues )
|
||||
}
|
||||
}
|
||||
|
||||
void BCValueManager::loadTypeData()
|
||||
std::optional<BCValue> BCValueManager::makeValue( BCDevice::ID deviceID, const BCValueParams& params )
|
||||
{
|
||||
|
||||
/*
|
||||
Invalid = 0x0,
|
||||
"Text"
|
||||
"Number"
|
||||
"Float"
|
||||
"Percent"
|
||||
"KWh"
|
||||
"Watt"
|
||||
"Km"
|
||||
"Kmh"
|
||||
"Mm"
|
||||
"Sec"
|
||||
"SoC"
|
||||
"Odo"
|
||||
"Date"
|
||||
auto setIfExists = [&]( QStringView source, optDouble& target )
|
||||
{
|
||||
if( !source.isEmpty() )
|
||||
{
|
||||
bool ok;
|
||||
double testVal = source.toDouble(&ok);
|
||||
if (ok)
|
||||
target = testVal;
|
||||
}
|
||||
};
|
||||
*/
|
||||
|
||||
static QMetaEnum s_bcValueEnum{QMetaEnum::fromType<BC::ID>()};
|
||||
|
||||
/*
|
||||
Wir brauchen:
|
||||
- einen gültige ID String um die enum ID herauszufinden.
|
||||
- einen gültige UnitType String um den ValueType herauszufinden.
|
||||
|
||||
*/
|
||||
//_valueTypes.insert( { BCValueType::TypeID::Invalid, "Invalid" } );
|
||||
|
||||
_valueTypes.insert( "Invalid", { BCValueType::TypeID::Invalid, "Invalid" } );
|
||||
_valueTypes.insert( "Text", { BCValueType::TypeID::Text } );
|
||||
_valueTypes.insert( "Number", { BCValueType::TypeID::Number } );
|
||||
std::optional<BCValue> newValue;
|
||||
|
||||
_valueTypes.insert( "Float", { BCValueType::TypeID::Float, "", 1.5625} );
|
||||
_valueTypes.insert( "Percent",{ BCValueType::TypeID::Percent, "%", 1.5625 } );
|
||||
_valueTypes.insert( "KWh", { BCValueType::TypeID::KWh, "kwh", 1.5625 } );
|
||||
_valueTypes.insert( "Watt", { BCValueType::TypeID::Watt, "w", 1.5625 } );
|
||||
_valueTypes.insert( "Km", { BCValueType::TypeID::Km, "km", 1.5625 } );
|
||||
_valueTypes.insert( "Kmh", { BCValueType::TypeID::Kmh, "km/h", 0.1 } );
|
||||
_valueTypes.insert( "Mm", { BCValueType::TypeID::Mm, "mm", 1.5625 } );
|
||||
_valueTypes.insert( "Sec", { BCValueType::TypeID::Sec, "s", 1.5625 } );
|
||||
_valueTypes.insert( "SoC", { BCValueType::TypeID::SoC, "%", 1.5625 } );
|
||||
_valueTypes.insert( "Odo", { BCValueType::TypeID::Odo, "km", 1.5625 } );
|
||||
_valueTypes.insert( "Assist", { BCValueType::TypeID::Assist, "", 0 ,4 } );
|
||||
_valueTypes.insert( "Assist", { BCValueType::TypeID::AssistFac, "%" } );
|
||||
_valueTypes.insert( "Date", { BCValueType::TypeID::Date } );
|
||||
std::optional<quint64> IDVal = s_bcValueEnum.keyToValue64( params.ID.toLatin1().constData() );
|
||||
if( IDVal.has_value() )
|
||||
{
|
||||
if( _valueTypes.contains( params.UnitType ) )
|
||||
{
|
||||
|
||||
const BCValueType& valueType = _valueTypes[params.UnitType];
|
||||
newValue = BCValue( valueType, deviceID, static_cast<BC::ID>(IDVal.value()) );
|
||||
|
||||
/*
|
||||
setIfExists( params.Factor, newValue.factor );
|
||||
setIfExists( params.Min, newValue.min );
|
||||
setIfExists( params.Max, newValue.max );
|
||||
*/
|
||||
newValue->label = params.Label;
|
||||
newValue->defaultValue = params.Default;
|
||||
/*
|
||||
|
||||
//qDebug() << " --- created: " << params.Label;
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
// --- NEU: Speichern mit QXmlStreamWriter ---
|
||||
@@ -394,43 +404,3 @@ void BCValueManager::saveBikeData()
|
||||
|
||||
|
||||
|
||||
BCValue BCValueManager::makeValue( BCDevice::ID deviceID, const BCValueParams& params )
|
||||
{
|
||||
|
||||
auto setIfExists = [&]( QStringView source, optDouble& target )
|
||||
{
|
||||
if( !source.isEmpty() )
|
||||
{
|
||||
bool ok;
|
||||
double testVal = source.toDouble(&ok);
|
||||
if (ok)
|
||||
target = testVal;
|
||||
}
|
||||
};
|
||||
|
||||
static QMetaEnum s_bcValueEnum{QMetaEnum::fromType<BC::ID>()};
|
||||
|
||||
/*
|
||||
Wir brauchen:
|
||||
- eine gültige ID
|
||||
|
||||
*/
|
||||
BCValue newValue{};
|
||||
|
||||
auto IDVal = s_bcValueEnum.keyToValue64( params.ID.toLatin1().constData() );
|
||||
if( IDVal.has_value() )
|
||||
{
|
||||
newValue = BCValue( deviceID, BC::ID( IDVal.value() ) );
|
||||
/*
|
||||
setIfExists( params.Factor, newValue.factor );
|
||||
setIfExists( params.Min, newValue.min );
|
||||
setIfExists( params.Max, newValue.max );
|
||||
*/
|
||||
newValue.defaultValue.setValue( params.Label );
|
||||
newValue.value.setValue( params.Current );
|
||||
newValue.label = params.Label;
|
||||
//qDebug() << " --- created: " << params.Label;
|
||||
}
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user