diff --git a/SocketFMU/SocketFMU/JsonModelDescription.cpp b/SocketFMU/SocketFMU/JsonModelDescription.cpp index 985d0a85031a1e5781866784489ea1cb08143d9b..34e26b0acd8f37e5e91610851a20e9711350a3b0 100644 --- a/SocketFMU/SocketFMU/JsonModelDescription.cpp +++ b/SocketFMU/SocketFMU/JsonModelDescription.cpp @@ -26,6 +26,7 @@ void JsonModelDescription::Load(std::string resourceDir) Channels.push_back(SocketChannel( channel.second.get<std::string>("Name"), channel.second.get<unsigned int>("ValueRef"), - channel.second.get<bool>("IsSender"))); + channel.second.get<bool>("IsSender"), + channel.second.get<bool>("ReverseEndianness"))); } } diff --git a/SocketFMU/SocketFMU/SocketChannel.cpp b/SocketFMU/SocketFMU/SocketChannel.cpp index dc70190ce4adca26d700fb9e93bdd8063a717597..31aac762ea7434eecb2ce1b8d378ec09245692fe 100644 --- a/SocketFMU/SocketFMU/SocketChannel.cpp +++ b/SocketFMU/SocketFMU/SocketChannel.cpp @@ -6,8 +6,8 @@ SocketChannel::SocketChannel() } -SocketChannel::SocketChannel(std::string name, unsigned int valueRef, bool settable) : - _name(name), _valueRef(valueRef), _isSender(settable), _value(0) +SocketChannel::SocketChannel(std::string name, unsigned int valueRef, bool settable, bool reverseEndianness) : + _name(name), _valueRef(valueRef), _isSender(settable), _reverseEndianness(reverseEndianness), _value(0) { } @@ -39,3 +39,8 @@ bool SocketChannel::IsSender() const { return _isSender; } + +bool SocketChannel::ReverseEndianness() const +{ + return _reverseEndianness; +} diff --git a/SocketFMU/SocketFMU/SocketChannel.h b/SocketFMU/SocketFMU/SocketChannel.h index 3cc8161c46e41fda37fac004ea605217b289330b..6afb186c40d38563ae29e9cc5a310b377fd65155 100644 --- a/SocketFMU/SocketFMU/SocketChannel.h +++ b/SocketFMU/SocketFMU/SocketChannel.h @@ -6,10 +6,11 @@ private: std::string _name; unsigned int _valueRef; bool _isSender; + bool _reverseEndianness; double _value; SocketChannel(); public: - SocketChannel(std::string name, unsigned int valueRef, bool settable); + SocketChannel(std::string name, unsigned int valueRef, bool settable, bool reverseEndianness); ~SocketChannel(); std::string GetName(); @@ -17,5 +18,6 @@ public: double GetValue() const; void SetValue(double value); bool IsSender() const; + bool ReverseEndianness() const; }; diff --git a/SocketFMU/SocketFMU/SocketFmiComponent.cpp b/SocketFMU/SocketFMU/SocketFmiComponent.cpp index ad6127b6ebc48ba1b30554497a6d553c5c0fdd79..2a9df17a31155acc730a8e4e39dd07e6f9743e4e 100644 --- a/SocketFMU/SocketFMU/SocketFmiComponent.cpp +++ b/SocketFMU/SocketFMU/SocketFmiComponent.cpp @@ -3,6 +3,7 @@ #include "TcpConnection.h" #include "UdpConnection.h" #include "JsonModelDescription.h" +#include "EndianConverter.h" SocketFmiComponent::SocketFmiComponent() { @@ -84,15 +85,22 @@ void SocketFmiComponent::valuesReceivedCallback(std::shared_ptr<std::vector<doub size_t channel = 0; _mutex.lock(); // received values and channels are sorted by valueRef + + //Log(fmi2Status::fmi2Error, std::string("receivedValues size ") + std::to_string(receivedValues->size()) + std::string(" _channels.size() ") + std::to_string(_channels.size())); while (receivedValue < receivedValues->size() && channel < _channels.size()) { - while (channel < _channels.size()) + bool foundRightChannel = false; + while (!foundRightChannel && channel < _channels.size()) { // Break condition if found -> setvalue if (!_channels[channel].IsSender()) { + if (_channels[channel].ReverseEndianness()) + { + EndianConverter::ReverseEndianness((*receivedValues)[receivedValue]); + } _channels[channel].SetValue((*receivedValues)[receivedValue]); - break; + foundRightChannel = true; } channel++; } @@ -112,7 +120,12 @@ void SocketFmiComponent::DoStep(fmi2Real currentCommunicationPoint, fmi2Real ste { if (channel.IsSender()) { - buff.push_back(channel.GetValue()); + double val = channel.GetValue(); + if (channel.ReverseEndianness()) + { + EndianConverter::ReverseEndianness(val); + } + buff.push_back(val); } } _mutex.unlock(); diff --git a/SocketFMU/SocketFMU_Generator/Models/SocketChannel.cs b/SocketFMU/SocketFMU_Generator/Models/SocketChannel.cs index ca43f05780ff222934674a774609015763987637..fe4e30645424c3530a29f96bca3249ffe21c9269 100644 --- a/SocketFMU/SocketFMU_Generator/Models/SocketChannel.cs +++ b/SocketFMU/SocketFMU_Generator/Models/SocketChannel.cs @@ -7,6 +7,7 @@ private uint _valueRef; private string _displayedUnit; private bool _isSender; + private bool _reverseEndianness; /// <summary> /// Displayed name of the channel @@ -61,6 +62,22 @@ } } + /// <summary> + /// Whether the channel value's endianness should be reversed + /// </summary> + public bool ReverseEndianness + { + get + { + return _reverseEndianness; + } + set + { + Set(ref _reverseEndianness, value); + } + } + + public SocketChannel() { } diff --git a/SocketFMU/SocketFMU_Generator/Views/MainWindow.xaml b/SocketFMU/SocketFMU_Generator/Views/MainWindow.xaml index 486eb237fd0ee5f448f2e628f5c77694615348ce..7196c147de1acfdb45d3ba291840bf253a8f815a 100644 --- a/SocketFMU/SocketFMU_Generator/Views/MainWindow.xaml +++ b/SocketFMU/SocketFMU_Generator/Views/MainWindow.xaml @@ -40,6 +40,10 @@ Binding="{Binding ValueRef}" Header="ValueRef" IsReadOnly="True" /> + <DataGridCheckBoxColumn + Width="Auto" + Binding="{Binding ReverseEndianness}" + Header="Reverse Endianess" /> </DataGrid.Columns> </DataGrid> <StackPanel