--- /dev/null
+/* Kerui PIR sensor
+*
+* Code derrived from akhan_100F14.c
+*
+* Such as
+* http://www.ebay.co.uk/sch/i.html?_from=R40&_trksid=p2050601.m570.l1313.TR0.TRC0.H0.Xkerui+pir.TRS0&_nkw=kerui+pir&_sacat=0
+*/
+
+#include "rtl_433.h"
+#include "pulse_demod.h"
+#include "util.h"
+#include "data.h"
+
+static int kerui_callback(bitbuffer_t *bitbuffer) {
+
+ int isKerui = 0;
+ data_t *data;
+ char time_str[LOCAL_TIME_BUFLEN];
+ uint32_t ID;
+ uint32_t dataBits;
+
+ char *CMD;
+
+ bitrow_t *bb = bitbuffer->bb;
+
+ for (int i=0; i<bitbuffer->num_rows; i++) {
+ uint8_t *b = bb[i];
+
+ //invert bits, short pulse is 0, long pulse is 1
+ b[0] = ~b[0];
+ b[1] = ~b[1];
+ b[2] = ~b[2];
+
+ unsigned bits = bitbuffer->bits_per_row[i];
+
+ if (bits == 25) {
+ local_time_str(0, time_str);
+
+ ID = (b[0] << 12) | (b[1] << 4) | (b[2] >> 4);
+ dataBits = b[2] & 0x0F;
+
+ switch (dataBits) {
+ case 0xa:
+ isKerui = 1;
+ CMD = "0xa (PIR)";
+ break;
+ case 0xe:
+ isKerui = 1;
+ CMD = "0xe (DOOR)";
+ break;
+ default:
+ isKerui = 0;
+ break;
+ }
+
+ }
+
+ if (isKerui == 1) break;
+
+ }
+
+ if (isKerui == 1) {
+ data = data_make( "time", "", DATA_STRING, time_str,
+ "device", "", DATA_STRING, "Kerui Sensor",
+ "id", "ID (20bit)", DATA_FORMAT, "0x%x", DATA_INT, ID,
+ "data", "Data (4bit)", DATA_STRING, CMD,
+ NULL);
+ data_acquired_handler(data);
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+static char *output_fields[] = {
+ "time",
+ "device",
+ "id",
+ "data",
+ "other",
+ NULL
+};
+
+PWM_Precise_Parameters pwm_precise_parameters_kerui = {
+ .pulse_tolerance = 20,
+ .pulse_sync_width = 0,
+};
+
+r_device kerui = {
+ .name = "Kerui Sensor",
+ .modulation = OOK_PULSE_PWM_RAW,
+ .short_limit = 340,
+ .long_limit = 1200,
+ .reset_limit = 1800,
+ .json_callback = &kerui_callback,
+ .disabled = 0,
+ .demod_arg = (uintptr_t)&pwm_precise_parameters_kerui,
+};