#include #include #include #include #include "cc1101.h" #include "hcs200.h" void http_door_open(); void serial_door_open(); ESP8266WebServer http_service(80); CC1101 radio(D0 /* GDO0 */, D2 /* GDO2 */, D8 /* SS */); #define PIN_HCS200_ENABLE D3 #define PIN_HCS200_DATA D1 //#define HCS200_TEST HCS200 hcs200; void setup() { Serial.begin(9600); pinMode(PIN_HCS200_ENABLE, OUTPUT); digitalWrite(PIN_HCS200_ENABLE, LOW); pinMode(PIN_HCS200_DATA, INPUT); if (!radio.setup()) Serial.println("Radio not found!"); else if (!radio.setISM(CC1101::FREQ_434MHZ)) Serial.println("Unable to set radio frequency"); else { Serial.println("Radio found"); (void)radio.idle(); } WiFiManager wifiManager; wifiManager.setConfigPortalTimeout(600); Serial.printf_P(PSTR("Setting up WiFi\n")); WiFi.hostname("door"); if (!wifiManager.autoConnect("a-door-able")) { Serial.printf_P(PSTR("Failed to connect and hit timeout\n")); delay(5000); ESP.restart(); } if (!MDNS.begin("door")) Serial.println("Error setting up MDNS responder!"); MDNS.addService("http", "tcp", 80); http_service.on("/", HTTP_GET, []() { http_service.send_P(200, PSTR("text/plain"), PSTR("I'm a-door-able")); }); http_service.on("/door/open", HTTP_PUT, http_door_open); http_service.begin(); Serial.println("Started listening"); } void ICACHE_RAM_ATTR on_hcs200_isr() { hcs200.on_isr(digitalRead(PIN_HCS200_DATA)); } bool hcs200_get_keycode(HCS200_Keycode &keycode) { #if !defined(HCS200_TEST) hcs200.reset(); attachInterrupt(digitalPinToInterrupt(PIN_HCS200_DATA), on_hcs200_isr, CHANGE); digitalWrite(PIN_HCS200_ENABLE, HIGH); uint8_t maxloop = 255; while(--maxloop) { if (hcs200.decode(keycode)) break; delay(1); } digitalWrite(PIN_HCS200_ENABLE, LOW); detachInterrupt(digitalPinToInterrupt(PIN_HCS200_DATA)); return (maxloop != 0); #else keycode.encrypted = 0xDEAD; keycode.serial = 0xC0DE; keycode.buttons = HCS200_Keycode::BM_S0; keycode.lowbat = false; return true; #endif } void http_door_open() { if (!radio.register_check()) { http_service.send_P(500, PSTR("text/plain"), PSTR("Radio error")); return; } HCS200_Keycode keycode; if (!hcs200_get_keycode(keycode)) { http_service.send_P(500, PSTR("text/plain"), PSTR("No data from HCS200")); return; } Serial.print("Got keycode: "); keycode.print(Serial); if (!radio.transmit()) { http_service.send_P(500, PSTR("text/plain"), PSTR("Unable to enable radio transmit mode")); return; } long count = constrain(http_service.arg("count").toInt(), 2, 10); for (unsigned short i = 0; i < count; i++) keycode.send([&](int value) { radio.setGDO0(value); }); (void)radio.idle(); Serial.println("Sending done"); http_service.send_P(200, PSTR("text/plain"), PSTR("OK")); } void serial_door_open(Print &stream) { if (!radio.register_check()) { stream.println("Radio error"); return; } HCS200_Keycode keycode; bool key_valid = hcs200_get_keycode(keycode); if (!key_valid) stream.println("No data from HCS200"); stream.print("HCS200 decoder state: "); hcs200.print_state(stream); if (!key_valid) return; stream.print("Got keycode: "); keycode.print(stream); if (!radio.transmit()) { stream.println("Unable to enable radio transmit mode"); return; } /* send twice */ keycode.send([&](int value) { radio.setGDO0(value); }); keycode.send([&](int value) { radio.setGDO0(value); }); (void)radio.idle(); stream.println("Sending done"); } void loop() { MDNS.update(); http_service.handleClient(); if (Serial.available() > 0) { (void)Serial.read(); serial_door_open(Serial); } delay(1); }