|
|
|
@@ -49,29 +49,61 @@ struct HostPacketDecoder |
|
|
|
auto packetTimestamp = reader.read<PacketTimestamp>();
|
|
|
|
deviceIndex &= 63; // top bit is used as a direction indicator
|
|
|
|
|
|
|
|
while (processNextMessage (handler, reader, deviceIndex, packetTimestamp))
|
|
|
|
{}
|
|
|
|
bool topologyChanged = false;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
auto nextMessageType = getMessageType (reader);
|
|
|
|
|
|
|
|
if (nextMessageType == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
topologyChanged |= messageIncludesTopologyChange (nextMessageType);
|
|
|
|
|
|
|
|
if (! processNextMessage (handler, reader, (MessageFromDevice) nextMessageType, deviceIndex, packetTimestamp))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (topologyChanged)
|
|
|
|
handler.notifyDetectorTopologyChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,
|
|
|
|
TopologyIndex deviceIndex, PacketTimestamp packetTimestamp)
|
|
|
|
static uint32 getMessageType (Packed7BitArrayReader& reader)
|
|
|
|
{
|
|
|
|
if (reader.getRemainingBits() < MessageType::bits)
|
|
|
|
return false;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
auto messageType = reader.read<MessageType>().get();
|
|
|
|
|
|
|
|
if (messageType == 0)
|
|
|
|
return false;
|
|
|
|
return reader.read<MessageType>().get();
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool messageIncludesTopologyChange (uint32 messageType)
|
|
|
|
{
|
|
|
|
switch ((MessageFromDevice) messageType)
|
|
|
|
{
|
|
|
|
case MessageFromDevice::deviceTopology:
|
|
|
|
case MessageFromDevice::deviceTopologyExtend:
|
|
|
|
case MessageFromDevice::deviceTopologyEnd:
|
|
|
|
case MessageFromDevice::deviceVersion:
|
|
|
|
case MessageFromDevice::deviceName:
|
|
|
|
return true;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,
|
|
|
|
MessageFromDevice messageType, TopologyIndex deviceIndex,
|
|
|
|
PacketTimestamp packetTimestamp)
|
|
|
|
{
|
|
|
|
switch (messageType)
|
|
|
|
{
|
|
|
|
case MessageFromDevice::deviceTopology: return handleTopology (handler, reader, true);
|
|
|
|
case MessageFromDevice::deviceTopologyExtend: return handleTopology (handler, reader, false);
|
|
|
|
case MessageFromDevice::deviceTopologyEnd: return handleTopologyEnd (handler, reader);
|
|
|
|
case MessageFromDevice::deviceVersionList: return handleVersion (handler, reader);
|
|
|
|
case MessageFromDevice::deviceNameList: return handleName (handler, reader);
|
|
|
|
case MessageFromDevice::deviceVersion: return handleVersion (handler, reader);
|
|
|
|
case MessageFromDevice::deviceName: return handleName (handler, reader);
|
|
|
|
case MessageFromDevice::touchStart: return handleTouch (handler, reader, deviceIndex, packetTimestamp, true, false);
|
|
|
|
case MessageFromDevice::touchMove: return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, false);
|
|
|
|
case MessageFromDevice::touchEnd: return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, true);
|
|
|
|
|