diff --git a/extplane-plugin/xplaneplugin.cpp b/extplane-plugin/xplaneplugin.cpp index 6f105e1..c5b722a 100644 --- a/extplane-plugin/xplaneplugin.cpp +++ b/extplane-plugin/xplaneplugin.cpp @@ -142,7 +142,7 @@ void XPlanePlugin::updateDataRef(DataRef *ref) { { IntArrayDataRef *iaRef = qobject_cast(ref); int arrayLength = iaRef->value().size(); - if(arrayLength <= 0) { + if(arrayLength == 0) { arrayLength = XPLMGetDatavi(iaRef->ref(), nullptr, 0, 0); iaRef->setLength(arrayLength); } @@ -210,13 +210,25 @@ void XPlanePlugin::changeDataRef(DataRef *ref) case extplaneRefTypeFloatArray: { FloatArrayDataRef *faRef = qobject_cast(ref); - XPLMSetDatavf(ref->ref(), faRef->valueArray(), 0, faRef->value().size()); + while(!faRef->changedIndices.empty()) { + XPLMSetDatavf(ref->ref(), faRef->valueArray() + faRef->changedIndices.front().first, + faRef->changedIndices.front().first, + faRef->changedIndices.front().second - faRef->changedIndices.front().first + 1 + ); + faRef->changedIndices.pop_front(); + } break; } case extplaneRefTypeIntArray: { IntArrayDataRef *iaRef = qobject_cast(ref); - XPLMSetDatavi(ref->ref(), iaRef->valueArray(), 0, iaRef->value().size()); + while(!iaRef->changedIndices.empty()) { + XPLMSetDatavi(ref->ref(), iaRef->valueArray() + iaRef->changedIndices.front().first, + iaRef->changedIndices.front().first, + iaRef->changedIndices.front().second - iaRef->changedIndices.front().first + 1 + ); + iaRef->changedIndices.pop_front(); + } break; } case extplaneRefTypeInt: diff --git a/extplane-server/datarefs/dataref.h b/extplane-server/datarefs/dataref.h index eb7509a..869b658 100644 --- a/extplane-server/datarefs/dataref.h +++ b/extplane-server/datarefs/dataref.h @@ -18,7 +18,6 @@ enum { extplaneRefTypeData = 32 }; - /** * Base class for DataRefs. */ diff --git a/extplane-server/datarefs/floatarraydataref.cpp b/extplane-server/datarefs/floatarraydataref.cpp index 275bb07..e965724 100644 --- a/extplane-server/datarefs/floatarraydataref.cpp +++ b/extplane-server/datarefs/floatarraydataref.cpp @@ -72,6 +72,12 @@ void FloatArrayDataRef::setValue(QString &newValue) { float value = values[i].toFloat(&ok); if(ok) { _valueArray[i] = value; + if(changedIndices.empty() || changedIndices.back().second != (i-1)) + { + changedIndices.push_back(std::pair(i, i)); + } else { + changedIndices.back().second = i; + } } else if(!values.at(i).isEmpty()) { INFO << "Invalid value " << values.at(i) << "in array"; } diff --git a/extplane-server/datarefs/floatarraydataref.h b/extplane-server/datarefs/floatarraydataref.h index 0388416..7849fd1 100644 --- a/extplane-server/datarefs/floatarraydataref.h +++ b/extplane-server/datarefs/floatarraydataref.h @@ -11,6 +11,7 @@ #include "dataref.h" #include +#include class FloatArrayDataRef : public DataRef { Q_OBJECT @@ -19,6 +20,7 @@ class FloatArrayDataRef : public DataRef { FloatArrayDataRef(QObject *parent, QString name, void* ref); ~FloatArrayDataRef(); std::vector &value(); + std::list> changedIndices; virtual void updateValue(); virtual QString valueString(); virtual void setValue(QString &newValue); diff --git a/extplane-server/datarefs/intarraydataref.cpp b/extplane-server/datarefs/intarraydataref.cpp index 47a92e4..1bcae02 100644 --- a/extplane-server/datarefs/intarraydataref.cpp +++ b/extplane-server/datarefs/intarraydataref.cpp @@ -1,7 +1,7 @@ #include "intarraydataref.h" #include "../../util/console.h" -#include #include +#include IntArrayDataRef::IntArrayDataRef(QObject *parent, QString name, void *ref) : DataRef(parent, name, ref) { _typeString = "ia"; @@ -18,7 +18,9 @@ std::vector & IntArrayDataRef::value() { return _values; } +// Copies values from valuearray to value list and emits changed as needed void IntArrayDataRef::updateValue() { + Q_ASSERT(_length > 0); bool valuesChanged = false; for(int i=0;i<_length;i++){ if(_values.at(i) != _valueArray[i]) { @@ -62,23 +64,30 @@ void IntArrayDataRef::setValue(QString &newValue) { int value = values[i].toInt(&ok); if(ok) { _valueArray[i] = value; + if(changedIndices.empty() || changedIndices.back().second != (i-1)) + { + changedIndices.push_back(std::pair(i, i)); + } else { + changedIndices.back().second = i; + } } else if(!values.at(i).isEmpty()) { INFO << "Invalid value " << values.at(i) << "in array"; } } - emit changed(this); + updateValue(); } void IntArrayDataRef::setLength(int newLength) { - Q_ASSERT(newLength > 0); + Q_ASSERT(newLength >= 0); + _values.resize(newLength); std::fill(_values.begin(), _values.end(), -9999); if(_valueArray) delete[] _valueArray; _valueArray = new int[newLength]; _length = newLength; } -int* IntArrayDataRef::valueArray() +int *IntArrayDataRef::valueArray() { Q_ASSERT(_valueArray); return _valueArray; diff --git a/extplane-server/datarefs/intarraydataref.h b/extplane-server/datarefs/intarraydataref.h index f76b1bb..eb604d7 100644 --- a/extplane-server/datarefs/intarraydataref.h +++ b/extplane-server/datarefs/intarraydataref.h @@ -2,8 +2,8 @@ #define IntArrayDataRef_H #include "dataref.h" -#include #include +#include class IntArrayDataRef : public DataRef { Q_OBJECT @@ -12,6 +12,7 @@ class IntArrayDataRef : public DataRef { IntArrayDataRef(QObject *parent, QString name, void* ref); ~IntArrayDataRef(); std::vector &value(); + std::list> changedIndices; virtual void updateValue(); virtual QString valueString(); virtual void setValue(QString &newValue); diff --git a/protocoldefs.h b/protocoldefs.h index 2e1448f..c5e0162 100644 --- a/protocoldefs.h +++ b/protocoldefs.h @@ -5,7 +5,7 @@ // Network protocol, currently always 1 #define EXTPLANE_PROTOCOL 1 // Feature revision, every time we add a new feature or bug fix, this should be incremented so that clients can know how old the plugin is -#define EXTPLANE_VERSION 1010 +#define EXTPLANE_VERSION 1011 // Base of udp ports. Bind to this + client_id #define UDP_OUT_PORT_BASE 52000