mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-15 10:07:26 -05:00
Motorola LRRP request tokens that carry an integer (trigger interval 0x31, trigger distance 0x78 and the unknown parameters 0x42 / 0x44) encode it as a 7-bit variable length integer: each byte holds seven value bits, most significant group first, and the high bit of a byte flags a continuation byte. The parser read a single byte, so a real triggered location start request 09 11 22 03 FF FF EE 52 44 64 42 9C 10 62 57 34 31 84 58 was logged as ID:15663103 TRIGGER ON GPIO TRIGGER EVERY:132 SECS REQUESTED TOKENS [TIME,REQUEST-64,REQUEST-62,HORIZONTAL DIRECTION,TIMESTAMP, UNRECOGNIZED(10,44,58,9C)] and now decodes to ID:FFFFEE PERIODIC INTERVAL:600 SECS PARAM-42:3600 PARAM-44:100 REQUESTED TOKENS [TIME,HORIZONTAL SPEED,HORIZONTAL DIRECTION] The encoding and the token names follow node-dmr-lib (LRRP.js parseLRRPInt/toLRRPInt and its quoted TRBONet captures, DMRConst.js) and Moto.Net (LRRPPacket.cs "using VLQ for most of the fields"). - Add VarInt, a shared 7-bit varint reader, and VarIntToken, a token base class whose byte length is measured from the value and bounded by the remaining payload. Use them for 0x31, 0x78, 0x42 and 0x44. - Add TokenType.fromRequestValue(): 0x34 is the periodic trigger flag in a request and the timestamp in a response. TokenFactory accepts the resolved TokenType so the request path is not re-resolved. - Rename request tokens: 0x31 TRIGGER_INTERVAL (TriggerInterval), 0x4A TRIGGER_CONDITION (TriggerCondition: 02 emergency, 42 pin status change, 50 PTT, 51 PTT emergency), 0x78 TRIGGER_DISTANCE (TriggerDistance), 0x62 HORIZONTAL_SPEED. 0x42 and 0x44 become REQUEST_PARAMETER_42/44 (RequestParameter) with an optional varint value; their meaning is unknown (observed 3600 and 100). Remove TriggerGpio and TriggerOnMove. - Identity: assemble the request id big-endian (it was accumulated LSB-first), render it in hex, and clamp the read to the message. - RequestedTokens: keep a list that holds only unrecognized ids; add getters for the recognized and unrecognized lists. - Remove leftover debug locals from LRRPPacket.parseTokens(). - Add LRRPPacketTest (both captured bodies plus two copies with a corrupted type byte) and VarIntTest. Built with the project's Gradle build (JDK 27 toolchain, in Docker); compileJava, compileTestJava and the 9 new tests pass. Co-authored-by: csmith_ai <carrottop@gmail.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>