Редизайн на основе текущей ветки мейнстрима + новые устройства.
[rtl-433.git] / src / devices / springfield.c
diff --git a/src/devices/springfield.c b/src/devices/springfield.c
new file mode 100755 (executable)
index 0000000..4f603b0
--- /dev/null
@@ -0,0 +1,91 @@
+#include "rtl_433.h"
+#include "data.h"
+#include "util.h"
+
+// Actually 37 bits for all but last transmission which is 36 bits
+#define        NUM_BITS        36
+
+static int springfield_callback(bitbuffer_t *bitbuffer) {
+       int ret = 0;
+       char time_str[LOCAL_TIME_BUFLEN];
+       int row;
+       int cs;
+       int i;
+       int nibble[NUM_BITS/4+1];
+       int sid, battery, transmit, channel, temp;
+       float tempC;
+       int moisture, uk1;
+       int checksum;
+       data_t *data;
+       long tmpData;
+       long savData = 0;
+
+       local_time_str(0, time_str);
+
+       for(row = 0; row < bitbuffer->num_rows; row++) {
+               if(bitbuffer->bits_per_row[row] == NUM_BITS || bitbuffer->bits_per_row[row] == NUM_BITS + 1) {
+                       cs = 0;
+                       tmpData = (bitbuffer->bb[row][0] << 24) + (bitbuffer->bb[row][1] << 16) + (bitbuffer->bb[row][2] << 8) + bitbuffer->bb[row][3];
+                       for(i = 0; i < (NUM_BITS/4); i++) {
+                               if((i & 0x01) == 0x01)
+                                       nibble[i] = bitbuffer->bb[row][i >> 1] & 0x0f;
+                               else
+                                       nibble[i] = bitbuffer->bb[row][i >> 1] >> 0x04;
+                               if(i < 7) cs ^= nibble[i];
+                       }
+                       cs = (cs & 0xF);
+                       checksum = nibble[7];
+                       if(checksum == cs && tmpData != savData) {
+                               savData = tmpData;
+                               sid      = (nibble[0] << 4) + nibble[1];
+                               battery  = (nibble[2] >> 3) & 0x01;
+                               transmit = (nibble[2] >> 2) & 0x01;
+                               channel  = (nibble[2] & 0x03) + 1;
+                               temp     = ((nibble[3] << 8) + (nibble[4] << 4) + nibble[5]);
+                               if(temp >= 0xf00) temp = temp - 0x1000;
+                               tempC    = temp / 10.0;
+                               moisture =  nibble[6];
+                               uk1      =  nibble[8];  /* unknown. */
+
+                               data = data_make(
+                                       "time",                 "",                             DATA_STRING,    time_str,
+                                       "model",                "",                             DATA_STRING,    "Springfield Temperature & Moisture",
+                                       "sid",                  "SID",                  DATA_INT,               sid,
+                                       "channel",              "Channel",              DATA_INT,               channel,
+                                       "battery",              "Battery",              DATA_STRING,    battery ? "LOW" : "OK",
+                                       "transmit",             "Transmit",             DATA_STRING,    transmit ? "MANUAL" : "AUTO",
+                                       "temperature_C","Temperature",  DATA_FORMAT,    "%.01f C",                              DATA_DOUBLE,    tempC,
+                                       "moisture",             "Moisture",             DATA_INT,               moisture,
+//                                     "uk1",                  "uk1",                  DATA_INT,               uk1,
+                                       NULL);
+                               data_acquired_handler(data);
+                               ret++;
+                       }
+               }
+       }
+       return ret;
+}
+
+static char *output_fields[] = {
+  "time",
+  "model",
+  "sid",
+  "channel",
+  "battery",
+  "transmit",
+  "temperature_C",
+  "moisture",
+  NULL
+};
+
+r_device springfield = {
+  .name           = "Springfield Temperature and Soil Moisture",
+  .modulation     = OOK_PULSE_PPM_RAW, 
+  .short_limit    = 500 * 4,
+  .long_limit     = 1000 * 4, 
+  .reset_limit    = 2300 * 4,
+  .json_callback  = &springfield_callback,
+  .disabled       = 0,
+  .demod_arg      = 0,
+  .fields         = output_fields
+};