identification: added single sensor LISSY support
Dieser Commit ist enthalten in:
Ursprung
150f08a1c4
Commit
6da9291914
@ -257,6 +257,7 @@ bool SimulationIOHandler::send(const Message& message)
|
||||
case OPC_MULTI_SENSE:
|
||||
case OPC_D4:
|
||||
case OPC_MULTI_SENSE_LONG:
|
||||
case OPC_E4:
|
||||
case OPC_PEER_XFER:
|
||||
case OPC_SL_RD_DATA:
|
||||
assert(!hasResponse(message)); // no response
|
||||
|
||||
@ -682,6 +682,20 @@ void Kernel::receive(const Message& message)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OPC_E4:
|
||||
EventLoop::call(
|
||||
[this, lissy=static_cast<const Uhlenbrock::Lissy&>(message)]()
|
||||
{
|
||||
m_identificationController->identificationEvent(
|
||||
IdentificationController::defaultIdentificationChannel,
|
||||
lissy.sensorAddress(),
|
||||
IdentificationEventType::Seen,
|
||||
lissy.decoderAddress(),
|
||||
Direction::Unknown,
|
||||
lissy.category());
|
||||
});
|
||||
break;
|
||||
|
||||
case OPC_PEER_XFER:
|
||||
if(isResponse)
|
||||
{
|
||||
|
||||
@ -321,3 +321,20 @@ serial number = 1100008306
|
||||
|
||||
version = 1.00
|
||||
```
|
||||
|
||||
## LISSY
|
||||
|
||||
68610: single sensor lissy format:
|
||||
```
|
||||
2022-10-09 22:45:43.034066 loconet_1 D2002: RX: E4 [E4 08 00 00 01 00 03 11] // sensor_address=1 decoder_address=3 category=1
|
||||
2022-10-09 22:55:17.651995 loconet_1 D2002: RX: E4 [E4 08 03 00 01 00 63 72] // sensor_address=1 decoder_address=99 category=4
|
||||
2022-10-09 23:03:55.056175 loconet_1 D2002: RX: E4 [E4 08 02 00 01 0F 50 4F] // sensor_address=1 decoder_address=2000 category=3
|
||||
2022-10-09 23:09:03.150772 loconet_1 D2002: RX: E4 [E4 08 02 00 7F 0F 50 31] // sensor_address=127 decoder_address=2000 category=3
|
||||
2022-10-09 23:12:03.391446 loconet_1 D2002: RX: E4 [E4 08 02 1F 7F 0F 50 2E] // sensor_address=4095 decoder_address=2000 category=3
|
||||
^^ ^^^^^ ^^^^^
|
||||
| | \ decoder address: [high 7] [low 7]
|
||||
| |
|
||||
| \ sensor address: [high 5] [low 7]
|
||||
|
|
||||
\ category: 0-3 => 1-4
|
||||
```
|
||||
|
||||
@ -107,6 +107,7 @@ void setSlot(Message& message, uint8_t slot)
|
||||
case OPC_SW_STATE:
|
||||
case OPC_SW_ACK:
|
||||
case OPC_LOCO_ADR:
|
||||
case OPC_E4:
|
||||
case OPC_PEER_XFER:
|
||||
case OPC_SL_RD_DATA:
|
||||
case OPC_IMM_PACKET:
|
||||
@ -222,6 +223,7 @@ bool isValidResponse(const Message& request, const Message& response)
|
||||
case OPC_MULTI_SENSE:
|
||||
case OPC_D4:
|
||||
case OPC_MULTI_SENSE_LONG:
|
||||
case OPC_E4:
|
||||
case OPC_PEER_XFER:
|
||||
case OPC_SL_RD_DATA:
|
||||
assert(!hasResponse(request));
|
||||
@ -379,6 +381,15 @@ std::string toString(const Message& message)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OPC_E4:
|
||||
{
|
||||
const auto& lissy = static_cast<const Uhlenbrock::Lissy&>(message);
|
||||
s.append(" LISSY:");
|
||||
s.append(" sensorAddress=").append(std::to_string(lissy.sensorAddress()));
|
||||
s.append(" decoderAddress=").append(std::to_string(lissy.decoderAddress()));
|
||||
s.append(" category=").append(std::to_string(lissy.category()));
|
||||
break;
|
||||
}
|
||||
case OPC_PEER_XFER:
|
||||
{
|
||||
if(Uhlenbrock::LNCVReadResponse::check(message))
|
||||
|
||||
@ -1769,6 +1769,44 @@ namespace Uhlenbrock
|
||||
};
|
||||
static_assert(sizeof(LNCVStop) == 15);
|
||||
|
||||
/**
|
||||
* \}
|
||||
* \group lissy LISSY
|
||||
* \{
|
||||
*/
|
||||
|
||||
struct Lissy : Message
|
||||
{
|
||||
uint8_t len = 8;
|
||||
uint8_t data1 = 0;
|
||||
uint8_t sensorAddressHigh = 0;
|
||||
uint8_t sensorAddressLow = 0;
|
||||
uint8_t decoderAddressHigh = 0;
|
||||
uint8_t decoderAddressLow = 0;
|
||||
uint8_t checksum = 0;
|
||||
|
||||
Lissy()
|
||||
: Message(OPC_E4)
|
||||
{
|
||||
}
|
||||
|
||||
uint16_t sensorAddress() const
|
||||
{
|
||||
return static_cast<uint16_t>(sensorAddressHigh & 0x1F) << 7 | sensorAddressLow;
|
||||
}
|
||||
|
||||
uint16_t decoderAddress() const
|
||||
{
|
||||
return static_cast<uint16_t>(decoderAddressHigh) << 7 | decoderAddressLow;
|
||||
}
|
||||
|
||||
uint8_t category() const
|
||||
{
|
||||
return (data1 & 0x03) + 1;
|
||||
}
|
||||
};
|
||||
static_assert(sizeof(Lissy) == 8);
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
||||
@ -67,6 +67,7 @@ enum OpCode : uint8_t
|
||||
|
||||
// variable byte message opcodes:
|
||||
OPC_MULTI_SENSE_LONG = 0XE0, // based on reverse engineering, see loconet.md
|
||||
OPC_E4 = 0xE4, // based on reverse engineering, see loconet.md
|
||||
OPC_PEER_XFER = 0xE5,
|
||||
OPC_SL_RD_DATA = 0xE7,
|
||||
OPC_IMM_PACKET = 0xED,
|
||||
@ -101,6 +102,7 @@ constexpr std::string_view toString(OpCode value)
|
||||
case OPC_MULTI_SENSE: return "OPC_MULTI_SENSE";
|
||||
case OPC_D4: return "OPC_D4";
|
||||
case OPC_MULTI_SENSE_LONG: return "OPC_MULTI_SENSE_LONG";
|
||||
case OPC_E4: return "OPC_E4";
|
||||
case OPC_PEER_XFER: return "OPC_PEER_XFER";
|
||||
case OPC_SL_RD_DATA: return "OPC_SL_RD_DATA";
|
||||
case OPC_IMM_PACKET: return "OPC_IMM_PACKET";
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren