fix: input monitor / output monitor didn't work

dynamic_cast was used while not fully constructed
Dieser Commit ist enthalten in:
Reinder Feenstra 2022-08-21 23:33:30 +02:00
Ursprung 8e0de0e410
Commit a308165ed1
12 geänderte Dateien mit 36 neuen und 40 gelöschten Zeilen

Datei anzeigen

@ -30,11 +30,9 @@
#include "../../utils/inrange.hpp"
#include "../../world/world.hpp"
InputController::InputController(IdObject& interface, InputListColumn columns)
InputController::InputController(IdObject& interface)
: inputs{&interface, "inputs", nullptr, PropertyFlags::ReadOnly | PropertyFlags::NoStore | PropertyFlags::SubObject}
{
inputs.setValueInternal(std::make_shared<InputList>(interface, inputs.name(), columns));
Attributes::addDisplayName(inputs, DisplayName::Hardware::inputs);
}
@ -130,9 +128,10 @@ std::shared_ptr<InputMonitor> InputController::inputMonitor(uint32_t channel)
return monitor;
}
void InputController::addToWorld()
void InputController::addToWorld(InputListColumn columns)
{
auto& object = interface();
inputs.setValueInternal(std::make_shared<InputList>(object, inputs.name(), columns));
object.world().inputControllers->add(std::dynamic_pointer_cast<InputController>(object.shared_from_this()));
}

Datei anzeigen

@ -73,9 +73,9 @@ class InputController
InputMap m_inputs;
std::unordered_map<uint32_t, std::weak_ptr<InputMonitor>> m_inputMonitors;
InputController(IdObject& interface, InputListColumn columns);
InputController(IdObject& interface);
void addToWorld();
void addToWorld(InputListColumn columns);
void destroying();
public:

Datei anzeigen

@ -26,7 +26,6 @@
#include "../../../core/objectlist.hpp"
#include "inputlistcolumn.hpp"
#include "../../../core/method.hpp"
//#include "../input.hpp"
#include "../monitor/inputmonitor.hpp"
class Input;

Datei anzeigen

@ -40,8 +40,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
DCCPlusPlusInterface::DCCPlusPlusInterface(World& world, std::string_view _id)
: Interface(world, _id)
, DecoderController(*this, decoderListColumns)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, device{this, "device", "", PropertyFlags::ReadWrite | PropertyFlags::Store}
, baudrate{this, "baudrate", 115200, PropertyFlags::ReadWrite | PropertyFlags::Store}
, dccplusplus{this, "dccplusplus", nullptr, PropertyFlags::ReadOnly | PropertyFlags::Store | PropertyFlags::SubObject}
@ -193,8 +193,8 @@ void DCCPlusPlusInterface::addToWorld()
{
Interface::addToWorld();
DecoderController::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void DCCPlusPlusInterface::loaded()

Datei anzeigen

@ -39,8 +39,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
ECoSInterface::ECoSInterface(World& world, std::string_view _id)
: Interface(world, _id)
, DecoderController(*this, decoderListColumns)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, hostname{this, "hostname", "", PropertyFlags::ReadWrite | PropertyFlags::Store}
, ecos{this, "ecos", nullptr, PropertyFlags::ReadOnly | PropertyFlags::Store | PropertyFlags::SubObject}
{
@ -188,8 +188,8 @@ void ECoSInterface::addToWorld()
{
Interface::addToWorld();
DecoderController::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void ECoSInterface::destroying()

Datei anzeigen

@ -37,7 +37,7 @@ constexpr auto inputListColumns = InputListColumn::Id | InputListColumn::Name |
HSI88Interface::HSI88Interface(World& world, std::string_view _id)
: Interface(world, _id)
, InputController(*this, inputListColumns)
, InputController(static_cast<IdObject&>(*this))
, m_ioContext{1}
, m_serialPort{m_ioContext}
, device{this, "device", "", PropertyFlags::ReadWrite | PropertyFlags::Store}
@ -63,7 +63,6 @@ HSI88Interface::HSI88Interface(World& world, std::string_view _id)
}}
{
name = "HSI-88";
inputs.setValueInternal(std::make_shared<InputList>(*this, inputs.name(), inputListColumns));
const bool editable = contains(m_world.state, WorldState::Edit);
@ -114,7 +113,7 @@ void HSI88Interface::inputSimulateChange(uint32_t channel, uint32_t address)
void HSI88Interface::addToWorld()
{
Interface::addToWorld();
InputController::addToWorld();
InputController::addToWorld(inputListColumns);
}
void HSI88Interface::destroying()

Datei anzeigen

@ -42,8 +42,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
LocoNetInterface::LocoNetInterface(World& world, std::string_view _id)
: Interface(world, _id)
, DecoderController(*this, decoderListColumns)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, type{this, "type", LocoNetInterfaceType::Serial, PropertyFlags::ReadWrite | PropertyFlags::Store,
[this](LocoNetInterfaceType /*value*/)
{
@ -235,8 +235,8 @@ void LocoNetInterface::addToWorld()
{
Interface::addToWorld();
DecoderController::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void LocoNetInterface::loaded()

Datei anzeigen

@ -37,8 +37,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
TraintasticDIYInterface::TraintasticDIYInterface(World& world, std::string_view _id)
: Interface(world, _id)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, type{this, "type", TraintasticDIYInterfaceType::Serial, PropertyFlags::ReadWrite | PropertyFlags::Store,
[this](TraintasticDIYInterfaceType /*value*/)
{
@ -184,8 +184,8 @@ bool TraintasticDIYInterface::setOnline(bool& value, bool simulation)
void TraintasticDIYInterface::addToWorld()
{
Interface::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void TraintasticDIYInterface::loaded()

Datei anzeigen

@ -42,8 +42,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
XpressNetInterface::XpressNetInterface(World& world, std::string_view _id)
: Interface(world, _id)
, DecoderController(*this, decoderListColumns)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, type{this, "type", XpressNetInterfaceType::Serial, PropertyFlags::ReadWrite | PropertyFlags::Store,
[this](XpressNetInterfaceType /*value*/)
{
@ -291,8 +291,8 @@ void XpressNetInterface::addToWorld()
{
Interface::addToWorld();
DecoderController::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void XpressNetInterface::loaded()

Datei anzeigen

@ -39,8 +39,8 @@ constexpr auto outputListColumns = OutputListColumn::Id | OutputListColumn::Name
Z21Interface::Z21Interface(World& world, std::string_view _id)
: Interface(world, _id)
, DecoderController(*this, decoderListColumns)
, InputController(*this, inputListColumns)
, OutputController(*this, outputListColumns)
, InputController(static_cast<IdObject&>(*this))
, OutputController(static_cast<IdObject&>(*this))
, hostname{this, "hostname", "192.168.1.203", PropertyFlags::ReadWrite | PropertyFlags::Store}
, port{this, "port", 21105, PropertyFlags::ReadWrite | PropertyFlags::Store}
, z21{this, "z21", nullptr, PropertyFlags::ReadOnly | PropertyFlags::Store | PropertyFlags::SubObject}
@ -221,8 +221,8 @@ void Z21Interface::addToWorld()
{
Interface::addToWorld();
DecoderController::addToWorld();
InputController::addToWorld();
OutputController::addToWorld();
InputController::addToWorld(inputListColumns);
OutputController::addToWorld(outputListColumns);
}
void Z21Interface::destroying()

Datei anzeigen

@ -29,11 +29,9 @@
#include "../../utils/inrange.hpp"
#include "../../world/world.hpp"
OutputController::OutputController(IdObject& interface, OutputListColumn columns)
OutputController::OutputController(IdObject& interface)
: outputs{&interface, "outputs", nullptr, PropertyFlags::ReadOnly | PropertyFlags::NoStore | PropertyFlags::SubObject}
{
outputs.setValueInternal(std::make_shared<OutputList>(interface, outputs.name(), columns));
Attributes::addDisplayName(outputs, DisplayName::Hardware::outputs);
}
@ -129,9 +127,10 @@ std::shared_ptr<OutputKeyboard> OutputController::outputKeyboard(uint32_t channe
return keyboard;
}
void OutputController::addToWorld()
void OutputController::addToWorld(OutputListColumn columns)
{
auto& object = interface();
outputs.setValueInternal(std::make_shared<OutputList>(object, outputs.name(), columns));
object.world().outputControllers->add(std::dynamic_pointer_cast<OutputController>(object.shared_from_this()));
}

Datei anzeigen

@ -72,9 +72,9 @@ class OutputController
OutputMap m_outputs;
std::unordered_map<uint32_t, std::weak_ptr<OutputKeyboard>> m_outputKeyboards;
OutputController(IdObject& interface, OutputListColumn columns);
OutputController(IdObject& interface);
void addToWorld();
void addToWorld(OutputListColumn columns);
void destroying();
public: