Add support for Nissan Leaf TPMS (#2536)
Co-authored-by: Alex Wilson <alex.david.wilson@gmail.com>
This commit is contained in:
parent
a7e5aaf283
commit
d34e48dedc
5 changed files with 119 additions and 0 deletions
|
@ -333,6 +333,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md).
|
||||||
[245]* ThermoPro TX-2C Thermometer and Humidity sensor
|
[245]* ThermoPro TX-2C Thermometer and Humidity sensor
|
||||||
[246] TFA 30.3151 Weather Station
|
[246] TFA 30.3151 Weather Station
|
||||||
[247] Bresser water leakage
|
[247] Bresser water leakage
|
||||||
|
[248]* Nissan TPMS
|
||||||
|
|
||||||
* Disabled by default, use -R n or a conf file to enable
|
* Disabled by default, use -R n or a conf file to enable
|
||||||
|
|
||||||
|
|
|
@ -474,6 +474,7 @@ convert si
|
||||||
# protocol 245 # ThermoPro TX-2C Thermometer and Humidity sensor
|
# protocol 245 # ThermoPro TX-2C Thermometer and Humidity sensor
|
||||||
protocol 246 # TFA 30.3151 Weather Station
|
protocol 246 # TFA 30.3151 Weather Station
|
||||||
protocol 247 # Bresser water leakage
|
protocol 247 # Bresser water leakage
|
||||||
|
# protocol 248 # Nissan TPMS
|
||||||
|
|
||||||
## Flex devices (command line option "-X")
|
## Flex devices (command line option "-X")
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,7 @@
|
||||||
DECL(thermopro_tx2c) \
|
DECL(thermopro_tx2c) \
|
||||||
DECL(tfa_303151) \
|
DECL(tfa_303151) \
|
||||||
DECL(bresser_leakage) \
|
DECL(bresser_leakage) \
|
||||||
|
DECL(tpms_nissan) \
|
||||||
|
|
||||||
/* Add new decoders here. */
|
/* Add new decoders here. */
|
||||||
|
|
||||||
|
|
|
@ -237,6 +237,7 @@ add_library(r_433 STATIC
|
||||||
devices/tpms_jansite.c
|
devices/tpms_jansite.c
|
||||||
devices/tpms_jansite_solar.c
|
devices/tpms_jansite_solar.c
|
||||||
devices/tpms_kia.c
|
devices/tpms_kia.c
|
||||||
|
devices/tpms_nissan.c
|
||||||
devices/tpms_pmv107j.c
|
devices/tpms_pmv107j.c
|
||||||
devices/tpms_porsche.c
|
devices/tpms_porsche.c
|
||||||
devices/tpms_renault.c
|
devices/tpms_renault.c
|
||||||
|
|
115
src/devices/tpms_nissan.c
Normal file
115
src/devices/tpms_nissan.c
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/** @file
|
||||||
|
Nissan FSK 37 bit Manchester encoded checksummed TPMS data.
|
||||||
|
Reference issue: https://github.com/merbanan/rtl_433/issues/1024
|
||||||
|
|
||||||
|
Copyright (C) 2021 Alex Wilson <alex.david.wilson@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
Nissan FSK 37 bit Manchester encoded checksummed TPMS data.
|
||||||
|
|
||||||
|
Data format:
|
||||||
|
|
||||||
|
MODE:3d TPMS_ID:24h (PSI+THREE)*FOUR=8d UNKNOWN:2b
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "decoder.h"
|
||||||
|
|
||||||
|
static int tpms_nissan_decode(r_device *decoder, bitbuffer_t *bitbuffer, unsigned row, unsigned bitpos)
|
||||||
|
{
|
||||||
|
bitbuffer_t packet_bits = {0};
|
||||||
|
|
||||||
|
bitbuffer_manchester_decode(bitbuffer, row, bitpos, &packet_bits, 113);
|
||||||
|
bitbuffer_invert(&packet_bits); // Manchester (G.E. Thomas) Decoded
|
||||||
|
|
||||||
|
// FIXME Debug stuff
|
||||||
|
// fprintf(stderr, "packet_bits:\n");
|
||||||
|
// bitbuffer_print(&packet_bits);
|
||||||
|
|
||||||
|
// fprintf(stderr, "%s : bits %d\n", __func__, packet_bits.bits_per_row[0]);
|
||||||
|
if (packet_bits.bits_per_row[0] < 37) {
|
||||||
|
return DECODE_FAIL_SANITY; // sanity check failed
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *b = packet_bits.bb[0];
|
||||||
|
|
||||||
|
// TODO Is there any parity or other checks we can preform to return
|
||||||
|
// DECODE_ABORT_EARLY or DECODE_FAIL_MIC
|
||||||
|
|
||||||
|
// MODE:3d
|
||||||
|
int mode = b[0] >> 5;
|
||||||
|
|
||||||
|
// TPMS_ID:24h
|
||||||
|
int id = (unsigned)((b[0] & 0x1F) << 19) | (b[1] << 11) | (b[2] << 3) | (b[3] >> 5);
|
||||||
|
|
||||||
|
// (PSI+THREE)*FOUR=8d
|
||||||
|
int pressure_raw = ((b[3] & 0x1F) << 3) | (b[4] >> 5);
|
||||||
|
float pressure_psi = (double)(pressure_raw / 4.0) - 3.0;
|
||||||
|
|
||||||
|
// UNKNOWN:2b
|
||||||
|
int unknown = (b[4] & 0x1F) >> 3;
|
||||||
|
|
||||||
|
char id_str[7];
|
||||||
|
snprintf(id_str, sizeof(id_str), "%06x", id);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
data_t *data = data_make(
|
||||||
|
"model", "", DATA_STRING, "Nissan",
|
||||||
|
"type", "", DATA_STRING, "TPMS",
|
||||||
|
"id", "", DATA_STRING, id_str,
|
||||||
|
"mode", "", DATA_INT, mode,
|
||||||
|
"pressure_psi", "Pressure", DATA_FORMAT, "%.1f PSI", DATA_DOUBLE, (double)(pressure_psi / 4.0) - 3.0,
|
||||||
|
"unknown", "", DATA_INT, unknown,
|
||||||
|
NULL);
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
decoder_output_data(decoder, data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @sa tpms_nissan_decode() */
|
||||||
|
static int tpms_nissan_callback(r_device *decoder, bitbuffer_t *bitbuffer)
|
||||||
|
{
|
||||||
|
// preamble is f5 55 55 55 e
|
||||||
|
uint8_t const preamble_pattern[5] = {0xf5, 0x55, 0x55, 0x55, 0xe0}; // 36 bits
|
||||||
|
|
||||||
|
unsigned bitpos = 0;
|
||||||
|
int ret = 0;
|
||||||
|
int events = 0;
|
||||||
|
|
||||||
|
// Find a preamble with enough bits after it that it could be a complete packet
|
||||||
|
while ((bitpos = bitbuffer_search(bitbuffer, 0, bitpos, preamble_pattern, 36)) + 77 <=
|
||||||
|
bitbuffer->bits_per_row[0]) {
|
||||||
|
ret = tpms_nissan_decode(decoder, bitbuffer, 0, bitpos + 36);
|
||||||
|
if (ret > 0)
|
||||||
|
events += ret;
|
||||||
|
bitpos += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return events > 0 ? events : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char const *const output_fields[] = {
|
||||||
|
"model",
|
||||||
|
"type",
|
||||||
|
"id",
|
||||||
|
"mode",
|
||||||
|
"pressure_psi",
|
||||||
|
"unknown",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
r_device const tpms_nissan = {
|
||||||
|
.name = "Nissan TPMS",
|
||||||
|
.modulation = FSK_PULSE_PCM,
|
||||||
|
.short_width = 120, // TODO The preamble plus pre-MC data is 113, what should this be?
|
||||||
|
.long_width = 120, // FSK
|
||||||
|
.reset_limit = 250, // Maximum gap size before End Of Message [us]. TODO What should this be?
|
||||||
|
.decode_fn = &tpms_nissan_callback,
|
||||||
|
.disabled = 1, // no MIC, disabled by default
|
||||||
|
.fields = output_fields,
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue