identification: added single sensor LISSY support

Dieser Commit ist enthalten in:
Reinder Feenstra 2022-10-09 23:46:05 +02:00
Ursprung 150f08a1c4
Commit 6da9291914
6 geänderte Dateien mit 83 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -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

Datei anzeigen

@ -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)
{

Datei anzeigen

@ -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
```

Datei anzeigen

@ -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))

Datei anzeigen

@ -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);
/**
* \}
*/

Datei anzeigen

@ -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";