Bugfixes
[rtl-433.git] / src / devices / waveman.c
1 #include "rtl_433.h"
2
3 static int waveman_callback(bitbuffer_t *bitbuffer) {
4     uint8_t *b = bitbuffer->bb[0];
5     /* Two bits map to 2 states, 0 1 -> 0 and 1 1 -> 1 */
6     int i;
7     uint8_t nb[3] = {0};
8     data_t *data;
9     char id_str[2];
10
11     /* @todo iterate through all rows */
12
13     /* Reject codes of wrong length */
14     if ( 24 != bitbuffer->bits_per_row[0])
15       return 0;
16
17     /*
18      * Catch the case triggering false positive for other transmitters.
19      * example: Brennstuhl RCS 2044SN
20      * @todo is this message valid at all??? if not then put more validation below
21      *       instead of this special case
22      */
23     if ( 0xFF == b[0] &&
24          0xFF == b[1] &&
25          0xFF == b[2] )
26         return 0;
27
28     /* Test if the bit stream conforms to the rule of every odd bit being set to one */
29     if (((b[0]&0x55)==0x55) && ((b[1]&0x55)==0x55) && ((b[2]&0x55)==0x55) && ((b[3]&0x55)==0x00)) {
30         /* Extract data from the bit stream */
31         for (i=0 ; i<3 ; i++) {
32             nb[i] |= ((b[i]&0xC0)==0xC0) ? 0x00 : 0x01;
33             nb[i] |= ((b[i]&0x30)==0x30) ? 0x00 : 0x02;
34             nb[i] |= ((b[i]&0x0C)==0x0C) ? 0x00 : 0x04;
35             nb[i] |= ((b[i]&0x03)==0x03) ? 0x00 : 0x08;
36         }
37
38         id_str[0] = 'A'+nb[0];
39         id_str[1] = 0;
40         data = data_make("model", NULL,   DATA_STRING, "Waveman Switch Transmitter",
41                          "id", NULL,      DATA_STRING, id_str,
42                          "channel", NULL, DATA_INT, (nb[1]>>2)+1,
43                          "button", NULL,  DATA_INT, (nb[1]&3)+1,
44                          "state", NULL,   DATA_STRING, (nb[2]==0xe) ? "on" : "off",
45                          NULL);
46         data_acquired_handler(data);
47
48         return 1;
49     }
50     return 0;
51 }
52
53 static char *output_fields[] = {
54         "model",
55         "id",
56         "channel",
57         "button",
58         "state",
59         NULL
60 };
61
62
63 r_device waveman = {
64     .name           = "Waveman Switch Transmitter",
65     .modulation     = OOK_PULSE_PWM_RAW,
66     .short_limit    = 1000,
67     .long_limit     = 8000,
68     .reset_limit    = 30000,
69     .json_callback  = &waveman_callback,
70     .disabled       = 0,
71     .demod_arg      = 1,        // Remove startbit
72     .fields         = output_fields
73 };