X-Git-Url: https://git.rvb.name/rtl-433.git/blobdiff_plain/ca13278b24eb61443559bcb61e64627fba3d8823..6d15c6f967221af825cf84e3ed12b96c763b127b:/src/devices/schraeder.c diff --git a/src/devices/schraeder.c b/src/devices/schraeder.c new file mode 100644 index 0000000..3629076 --- /dev/null +++ b/src/devices/schraeder.c @@ -0,0 +1,96 @@ +/* Schraeder TPMS protocol + * + * Copyright © 2016 Benjamin Larsson + * + * 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. + */ + +/** + * Packet payload: 8,5 bytes, 17 nibbles + * + * 01 23 45 67 89 AB CD EF 0 + * [00] {68} 7f 67 03 a3 8b 20 04 94 9 + * SP UU UI II II IU UU UC C + * + * S = sync + * P = preamble (0xf) + * U = unknown + * I = id + * C = CRC8 from nibble 1 to E + */ + +#include "rtl_433.h" +#include "pulse_demod.h" +#include "util.h" + + +static int schraeder_callback(bitbuffer_t *bitbuffer) { + char time_str[LOCAL_TIME_BUFLEN]; + bitrow_t *bb = bitbuffer->bb; + uint32_t serial_id = 0; + data_t *data; + char hexid[20] = {0}; + uint8_t work_buffer[9]; + int i; + + /* Reject wrong amount of bits */ + if ( bitbuffer->bits_per_row[0] != 68) + return 0; + + /* shift the buffer 4 bits for the crc8 calculation */ + for (i=0 ; i<8 ; i++) + work_buffer[i] = (bb[0][i]&0x0F)<<4 | (bb[0][i+1]&0xF0) >> 4; + + /* Calculate the crc */ + if (work_buffer[7] != crc8(work_buffer, 7, 0x07, 0xf0)) { + return 0; + } + + local_time_str(0, time_str); + + /* Get serial number id */ + serial_id = (bb[0][2]&0x0F) << 20 | bb[0][3] << 12 | bb[0][4] << 4 | (bb[0][5]&0xF0) >> 4; + sprintf(hexid, "%X", serial_id); + + if (debug_output >= 1) { + fprintf(stderr, "Schraeder TPMS decoder\n"); + bitbuffer_print(bitbuffer); + fprintf(stderr, "id = 0x%X\n", serial_id); + fprintf(stderr, "CRC = %x\n", crc8(work_buffer, 7, 0x07, 0xf0)); + } + + data = data_make("time", "", DATA_STRING, time_str, + "model", "", DATA_STRING, "Schraeder", + "type", "", DATA_STRING, "TPMS", + "id", "ID", DATA_STRING, hexid, + "crc", "", DATA_STRING, "OK", + NULL); + + data_acquired_handler(data); + return 0; +} + +static char *output_fields[] = { + "time", + "model", + "id", + "flags", + "pressure", + "temperature_C", + "depth", + NULL +}; + +r_device schraeder = { + .name = "Schraeder TPMS", + .modulation = OOK_PULSE_MANCHESTER_ZEROBIT, + .short_limit = 30*4, + .long_limit = 0, + .reset_limit = 120*4, + .json_callback = &schraeder_callback, + .disabled = 0, + .fields = output_fields, +};