marklin_can: fixes for master changes

see #11 and #72
Dieser Commit ist enthalten in:
Reinder Feenstra 2023-07-10 22:45:16 +02:00
Ursprung 54ba3664a6
Commit 779b8f3fb4
4 geänderte Dateien mit 44 neuen und 14 gelöschten Zeilen

Datei anzeigen

@ -57,6 +57,7 @@ std::pair<uint16_t, uint16_t> DecoderController::decoderAddressMinMax(DecoderPro
case DecoderProtocol::Selectrix: case DecoderProtocol::Selectrix:
return {1, 112}; return {1, 112};
case DecoderProtocol::MFX:
case DecoderProtocol::None: case DecoderProtocol::None:
return noAddressMinMax; return noAddressMinMax;
} }
@ -69,6 +70,7 @@ tcb::span<const uint8_t> DecoderController::decoderSpeedSteps(DecoderProtocol pr
static constexpr std::array<uint8_t, 3> dccSpeedSteps{{14, 28, 128}}; static constexpr std::array<uint8_t, 3> dccSpeedSteps{{14, 28, 128}};
static constexpr std::array<uint8_t, 3> motorolaSpeedSteps{{14, 27, 28}}; static constexpr std::array<uint8_t, 3> motorolaSpeedSteps{{14, 27, 28}};
static constexpr std::array<uint8_t, 1> selectrixSpeedSteps{{32}}; static constexpr std::array<uint8_t, 1> selectrixSpeedSteps{{32}};
static constexpr std::array<uint8_t, 1> mfxSpeedSteps{{126}};
switch(protocol) switch(protocol)
{ {
@ -82,6 +84,9 @@ tcb::span<const uint8_t> DecoderController::decoderSpeedSteps(DecoderProtocol pr
case DecoderProtocol::Selectrix: case DecoderProtocol::Selectrix:
return selectrixSpeedSteps; return selectrixSpeedSteps;
case DecoderProtocol::MFX:
return mfxSpeedSteps;
case DecoderProtocol::None: case DecoderProtocol::None:
return {}; return {};
} }

Datei anzeigen

@ -59,6 +59,26 @@ MarklinCANInterface::MarklinCANInterface(World& world, std::string_view _id)
m_interfaceItems.insertBefore(inputs, notes); m_interfaceItems.insertBefore(inputs, notes);
} }
tcb::span<const DecoderProtocol> MarklinCANInterface::decoderProtocols() const
{
static constexpr std::array<DecoderProtocol, 4> protocols{DecoderProtocol::DCCShort, DecoderProtocol::DCCLong, DecoderProtocol::MFX, DecoderProtocol::Motorola};
return tcb::span<const DecoderProtocol>{protocols.data(), protocols.size()};
}
tcb::span<const uint8_t> MarklinCANInterface::decoderSpeedSteps(DecoderProtocol protocol) const
{
static constexpr std::array<uint8_t, 4> dccLongSpeedSteps{{28, 128}}; // 14 not supported for long addresses
switch(protocol)
{
case DecoderProtocol::DCCLong:
return dccLongSpeedSteps;
default:
return DecoderController::decoderSpeedSteps(protocol);
}
}
void MarklinCANInterface::decoderChanged(const Decoder& decoder, DecoderChangeFlags changes, uint32_t functionNumber) void MarklinCANInterface::decoderChanged(const Decoder& decoder, DecoderChangeFlags changes, uint32_t functionNumber)
{ {
if(m_kernel) if(m_kernel)

Datei anzeigen

@ -60,6 +60,8 @@ class MarklinCANInterface final
MarklinCANInterface(World& world, std::string_view _id); MarklinCANInterface(World& world, std::string_view _id);
// DecoderController: // DecoderController:
tcb::span<const DecoderProtocol> decoderProtocols() const final;
tcb::span<const uint8_t> decoderSpeedSteps(DecoderProtocol protocol) const final;
void decoderChanged(const Decoder& decoder, DecoderChangeFlags changes, uint32_t functionNumber) final; void decoderChanged(const Decoder& decoder, DecoderChangeFlags changes, uint32_t functionNumber) final;
// InputController: // InputController:

Datei anzeigen

@ -42,9 +42,15 @@ static std::tuple<bool, DecoderProtocol, uint16_t> uidToProtocolAddress(uint32_t
if(inRange(uid, UID::Range::locomotiveMFX)) if(inRange(uid, UID::Range::locomotiveMFX))
return {true, DecoderProtocol::MFX, uid - UID::Range::locomotiveMFX.first}; return {true, DecoderProtocol::MFX, uid - UID::Range::locomotiveMFX.first};
if(inRange(uid, UID::Range::locomotiveDCC)) if(inRange(uid, UID::Range::locomotiveDCC))
return {true, DecoderProtocol::DCC, uid - UID::Range::locomotiveDCC.first}; {
//! \todo Handle long address < 128
return {false, DecoderProtocol::Auto, 0}; const uint16_t address = uid - UID::Range::locomotiveDCC.first;
if(address <= DCC::addressShortMax)
return {true, DecoderProtocol::DCCShort, address};
else
return {true, DecoderProtocol::DCCLong, address};
}
return {false, DecoderProtocol::None, 0};
} }
Kernel::Kernel(const Config& config, bool simulation) Kernel::Kernel(const Config& config, bool simulation)
@ -175,8 +181,7 @@ void Kernel::receive(const Message& message)
EventLoop::call( EventLoop::call(
[this, protocol=protocol, address=address]() [this, protocol=protocol, address=address]()
{ {
const bool longAddress = (protocol == DecoderProtocol::DCC) && DCC::isLongAddress(address); if(const auto& decoder = m_decoderController->getDecoder(protocol, address))
if(const auto& decoder = m_decoderController->getDecoder(protocol, address, longAddress))
decoder->emergencyStop.setValueInternal(true); decoder->emergencyStop.setValueInternal(true);
}); });
} }
@ -209,8 +214,7 @@ void Kernel::receive(const Message& message)
EventLoop::call( EventLoop::call(
[this, protocol=protocol, address=address, throttle=Decoder::speedStepToThrottle(locomotiveSpeed.speed(), LocomotiveSpeed::speedMax)]() [this, protocol=protocol, address=address, throttle=Decoder::speedStepToThrottle(locomotiveSpeed.speed(), LocomotiveSpeed::speedMax)]()
{ {
const bool longAddress = (protocol == DecoderProtocol::DCC) && DCC::isLongAddress(address); if(const auto& decoder = m_decoderController->getDecoder(protocol, address))
if(const auto& decoder = m_decoderController->getDecoder(protocol, address, longAddress))
{ {
decoder->emergencyStop.setValueInternal(false); decoder->emergencyStop.setValueInternal(false);
decoder->throttle.setValueInternal(throttle); decoder->throttle.setValueInternal(throttle);
@ -249,8 +253,7 @@ void Kernel::receive(const Message& message)
EventLoop::call( EventLoop::call(
[this, protocol=protocol, address=address, direction]() [this, protocol=protocol, address=address, direction]()
{ {
const bool longAddress = (protocol == DecoderProtocol::DCC) && DCC::isLongAddress(address); if(const auto& decoder = m_decoderController->getDecoder(protocol, address))
if(const auto& decoder = m_decoderController->getDecoder(protocol, address, longAddress))
decoder->direction.setValueInternal(direction); decoder->direction.setValueInternal(direction);
}); });
} }
@ -270,8 +273,7 @@ void Kernel::receive(const Message& message)
EventLoop::call( EventLoop::call(
[this, protocol=protocol, address=address, number=locomotiveFunction.number(), value=locomotiveFunction.isOn()]() [this, protocol=protocol, address=address, number=locomotiveFunction.number(), value=locomotiveFunction.isOn()]()
{ {
const bool longAddress = (protocol == DecoderProtocol::DCC) && DCC::isLongAddress(address); if(const auto& decoder = m_decoderController->getDecoder(protocol, address))
if(const auto& decoder = m_decoderController->getDecoder(protocol, address, longAddress))
decoder->setFunctionValue(number, value); decoder->setFunctionValue(number, value);
}); });
} }
@ -363,7 +365,8 @@ void Kernel::decoderChanged(const Decoder& decoder, DecoderChangeFlags changes,
switch(decoder.protocol.value()) switch(decoder.protocol.value())
{ {
case DecoderProtocol::DCC: case DecoderProtocol::DCCShort:
case DecoderProtocol::DCCLong:
uid = UID::locomotiveDCC(decoder.address); uid = UID::locomotiveDCC(decoder.address);
break; break;
@ -375,9 +378,9 @@ void Kernel::decoderChanged(const Decoder& decoder, DecoderChangeFlags changes,
uid = UID::locomotiveMFX(decoder.address); uid = UID::locomotiveMFX(decoder.address);
break; break;
case DecoderProtocol::Auto: case DecoderProtocol::None:
case DecoderProtocol::Selectrix: case DecoderProtocol::Selectrix:
case DecoderProtocol::Custom: assert(false);
break; break;
} }