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>
GOLAY_WORD_STARTS listed 278 where it should list 378. The word at 378 was
never corrected, and the decoder ran a correction over bits 278-295 that
straddle the already corrected words at 270 and 288.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Golay24.checkAndCorrect indexed the word from bit 0 (getInt(0, 22), xor(12, ...),
flip(index)) and took the parity over the whole message, so it was only right for a
message that is exactly one 24-bit word. P25 TDULC words 2-12 and the DMR voice
superframe words at 24 and 48 were "corrected" in the wrong bits. Decode any other
word in a 24-bit copy and write it back.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A lagging sync detect on the first symbol after a buffer reload, followed by a
coarse timing search that steps all the way left, scores a candidate whose first
sync symbol is one sample before the buffer start. score() only checked the end
of the buffer, so it threw ArrayIndexOutOfBoundsException: Index -1.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- Uses libhydrasdr HIGH_DEFINITION decimation mode by default.
- Tuner controller extends TunerController since libhydrasdr owns the USB device, transfers and real to complex sample conversion.
- Tuners are still discovered by USB bus and port. The controller reads the USB serial string and opens the device by serial number.
- Samples are scaled by 2 to preserve existing levels (-6 dB otherwise).
- Streaming is stopped for sample rate changes because libhydrasdr replaces the sample converter in use by its streaming thread.
- Buffer sample count follows the delivered power-of-2 buffer size and adds the 1.25 MHz sample rate.
Co-authored-by: denny <dennis.sheirer@gmail.com>
* #2535 Heterodyne Channelizer enhancements and corrections.
* #2537 Complex vector oscillator SIMD lane drift.
Realigns the SIMD lanes every 262,144 samples. At frequencies where the
rotation for a set of lanes is nearly a whole or half turn, rounding affects
each lane differently and the lanes drift apart until the next frequency
change, producing spurs at multiples of the sample rate divided by the lane
count. Lane phase error at 3125 Hz with a 50 kHz sample rate was about -38 dBc
after one hour and is now about -83 dBc with 16 lanes and -73 dBc with 8 lanes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* #2537 test updates
* #2537 test updates
---------
Co-authored-by: denny <dennis.sheirer@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>