Bladeren bron

Schrader TPMS implementation + CRC8 implementation.

antirez 3 jaren geleden
bovenliggende
commit
2a91ac8c7d
7 gewijzigde bestanden met toevoegingen van 93 en 10 verwijderingen
  1. 3 0
      app.h
  2. 20 0
      crc.c
  3. 1 1
      protocols/b4b1.c
  4. 5 5
      protocols/renault_tpms.c
  5. 58 0
      protocols/schrader_tpms.c
  6. 2 2
      protocols/toyota_tpms.c
  7. 4 2
      signal.c

+ 3 - 0
app.h

@@ -180,3 +180,6 @@ void view_exit_settings(ProtoViewApp *app);
 
 /* ui.c */
 void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color);
+
+/* crc.c */
+uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly);

+ 20 - 0
crc.c

@@ -0,0 +1,20 @@
+#include <stdint.h>
+#include <stddef.h>
+
+/* CRC8 with the specified initialization value 'init' and
+ * polynomial 'poly'. */
+uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly)
+{
+    uint8_t crc = init;
+    size_t i, j;
+    for (i = 0; i < len; i++) {
+        crc ^= data[i];
+        for (j = 0; j < 8; j++) {
+            if ((crc & 0x80) != 0)
+                crc = (uint8_t)((crc << 1) ^ poly);
+            else
+                crc <<= 1;
+        }
+    }
+    return crc;
+}

+ 1 - 1
protocols/b4b1.c

@@ -1,7 +1,7 @@
 /* PT/SC remotes. Usually 443.92 Mhz OOK.
  *
  * This line code is used in many remotes such as Princeton chips
- * named PT<number>, Silian Microelectronics SC5262 and others.
+ * named PT2262, Silian Microelectronics SC5262 and others.
  * Basically every 4 pulsee represent a bit, where 1000 means 0, and
  * 1110 means 1. Usually we can read 24 bits of data.
  * In this specific implementation we check for a prelude that is

+ 5 - 5
protocols/renault_tpms.c

@@ -1,7 +1,7 @@
 /* Renault tires TPMS. Usually 443.92 Mhz FSK.
  *
- * Preamble + marshal-encoded bits. 9 Bytes in total if we don't
- * count the preamble. */
+ * Preamble + sync + Manchester bits. ~48us short pulse.
+ * 9 Bytes in total not counting the preamble. */
 
 #include "../app.h"
 
@@ -53,10 +53,10 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView
     snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X",
         raw[0],raw[1],raw[2],raw[3],raw[4],raw[5],
         raw[6],raw[7],raw[8]);
-    snprintf(info->raw,sizeof(info->raw),"Tire ID %02X%02X%02X",
+    snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X",
         raw[3],raw[4],raw[5]);
-    snprintf(info->info1,sizeof(info->info1),"Pressure %.2f kpa", (double)kpa);
-    snprintf(info->info2,sizeof(info->info2),"Temperature %d C", temp);
+    snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa);
+    snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp);
     return true;
 }
 

+ 58 - 0
protocols/schrader_tpms.c

@@ -0,0 +1,58 @@
+/* Schrader TPMS. Usually 443.92 Mhz OOK, 120us pulse len.
+ *
+ * 500us high pulse + Preamble + Manchester coded bits where:
+ * 1 = 10
+ * 0 = 01
+ *
+ * 60 bits of data total (first 4 nibbles is the preamble, 0xF).
+ *
+ * Used in FIAT-Chrysler, Mercedes, ... */
+
+#include "../app.h"
+
+#define USE_TEST_VECTOR 0
+static const char *test_vector = "000000111101010101011010010110010110101001010110100110011001100101010101011010100110100110011010101010101010101010101010101010101010101010101010";
+
+static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) {
+
+    if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */
+        bitmap_set_pattern(bits,numbytes,test_vector);
+        numbits = strlen(test_vector);
+    }
+
+    if (numbits < 64) return false; /* Preamble + data. */
+
+    const char *sync_pattern = "1111010101" "01011010";
+    uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern);
+    if (off == BITMAP_SEEK_NOT_FOUND) return false;
+    FURI_LOG_E(TAG, "Schrader TPMS gap+preamble found");
+
+    off += 10; /* Skip just the long pulse and the first 3 bits of sync, so
+                  that we have the first byte of data with the sync nibble
+                  0011 = 0x3. */
+
+    uint8_t raw[8];
+    uint32_t decoded =
+        convert_from_line_code(raw,sizeof(raw),bits,numbytes,off,
+            "01","10"); /* Manchester code. */
+    FURI_LOG_E(TAG, "Schrader TPMS decoded bits: %lu", decoded);
+
+    if (decoded < 64) return false; /* Require the full 8 bytes. */
+
+    float kpa = (float)raw[5]*2.5;
+    int temp = raw[6]-50;
+
+    snprintf(info->name,sizeof(info->name),"%s","Schrader TPMS");
+    snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X",
+        raw[0],raw[1],raw[2],raw[3],raw[4],raw[5],
+        raw[6],raw[7]);
+    snprintf(info->info1,sizeof(info->info1),"Tire ID %01X%02X%02X%02X",
+        raw[1]&7,raw[2],raw[3],raw[4]); /* Only 28 bits of ID, not 32. */
+    snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa);
+    snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp);
+    return true;
+}
+
+ProtoViewDecoder SchraderTPMSDecoder = {
+    "Schrader TPMS", decode
+};

+ 2 - 2
protocols/toyota_tpms.c

@@ -1,6 +1,6 @@
-/* Ford tires TPMS. Usually 443.92 Mhz FSK (In Europe).
+/* Toyota tires TPMS. Usually 443.92 Mhz FSK (In Europe).
  *
- * Preamble + sync + 64 bits of data.
+ * Preamble + sync + 64 bits of data. ~48us short pulse length.
  *
  * The preamble + sync is something like:
  *

+ 4 - 2
signal.c

@@ -163,7 +163,7 @@ void scan_for_signal(ProtoViewApp *app) {
                 app->signal_decoded = decoded;
                 raw_samples_copy(DetectedSamples,copy);
                 raw_samples_center(DetectedSamples,i);
-                FURI_LOG_E(TAG, "Displayed sample updated (%d samples %lu us)",
+                FURI_LOG_E(TAG, "===> Displayed sample updated (%d samples %lu us)",
                     (int)thislen, DetectedSamples->short_pulse_dur);
 
                 /* Adjust raw view scale if the signal has an high
@@ -382,12 +382,14 @@ extern ProtoViewDecoder Oregon2Decoder;
 extern ProtoViewDecoder B4B1Decoder;
 extern ProtoViewDecoder RenaultTPMSDecoder;
 extern ProtoViewDecoder ToyotaTPMSDecoder;
+extern ProtoViewDecoder SchraderTPMSDecoder;
 
 ProtoViewDecoder *Decoders[] = {
     &Oregon2Decoder,        /* Oregon sensors v2.1 protocol. */
     &B4B1Decoder,           /* PT, SC, ... 24 bits remotes. */
     &RenaultTPMSDecoder,    /* Renault TPMS. */
     &ToyotaTPMSDecoder,     /* Toyota TPMS. */
+    &SchraderTPMSDecoder,   /* Schrader TPMS. */
     NULL
 };
 
@@ -407,7 +409,7 @@ bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info) {
 
     /* We call the decoders with an offset a few samples before the actual
      * signal detected and for a len of a few bits after its end. */
-    uint32_t before_samples = 10;
+    uint32_t before_samples = 20;
     uint32_t after_samples = 100;
 
     uint8_t *bitmap = malloc(bitmap_size);