diff --git a/protocols/pvchat.c b/protocols/pvchat.c index 2e65cde6d6d..79cfc2762f5 100644 --- a/protocols/pvchat.c +++ b/protocols/pvchat.c @@ -17,7 +17,7 @@ * * The message starts with a preamble + a sync pattern: * - * preamble = 10101010101010101010101010101010 + * preamble = 1010101010101010 x 3 * sync = 1100110011001100 * * The a variable amount of bytes follow, where each bit @@ -50,15 +50,23 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView const char *sync_pattern = "1010101010101010" "1100110011001100"; uint8_t sync_len = 32; - // This is a variable length message, however the minimum length - // requires a sender len byte (of value zero) and the terminator - // FF 00 plus checksum: a total of 4 bytes. + /* This is a variable length message, however the minimum length + * requires a sender len byte (of value zero) and the terminator + * FF 00 plus checksum: a total of 4 bytes. */ if (numbits-sync_len < 8*4) return false; uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); if (off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Chat preamble+sync found"); + /* If there is room on the left, let's mark the start of the message + * a bit before: we don't try to detect all the preamble, but only + * the first part, however it is likely present. */ + if (off >= 16) { + off -= 16; + sync_len += 16; + } + info->start_off = off; off += sync_len; /* Skip preamble and sync. */ @@ -73,7 +81,7 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView // The message needs to have a two bytes terminator before // the checksum. uint32_t j; - for (j = 0; j < sizeof(raw)-2; j++) + for (j = 0; j < sizeof(raw)-1; j++) if (raw[j] == 0xff && raw[j+1] == 0xaa) break; if (j == sizeof(raw)-1) { @@ -84,7 +92,7 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView uint32_t datalen = j+3; // If the terminator was found at j, then // we need to sum three more bytes to have // the len: FF itself, AA, checksum. - info->pulses_count = 8*3*datalen; + info->pulses_count = sync_len + 8*3*datalen; // Check if the control sum matches. if (sum_bytes(raw,datalen-1,0) != raw[datalen-1]) { @@ -118,8 +126,8 @@ static void build_message(RawSamplesBuffer *samples, ProtoViewFieldSet *fs) Our protocol needs three symbol times to send a bit, so 300 us per bit = 3.33 kBaud. */ - // Preamble: 16 alternating 100us pulse/gap pairs. - for (int j = 0; j < 16; j++) { + // Preamble: 24 alternating 100us pulse/gap pairs. + for (int j = 0; j < 24; j++) { raw_samples_add(samples,true,te); raw_samples_add(samples,false,te); }