From 41544ff50812e5428c65e15d244695302227d924 Mon Sep 17 00:00:00 2001 From: Stefan Sterz Date: Mon, 18 Jan 2016 22:30:36 +0100 Subject: [PATCH] implement part of the protocol --- arduino/src/sketch.ino | 86 ++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/arduino/src/sketch.ino b/arduino/src/sketch.ino index f230732..b049b2b 100644 --- a/arduino/src/sketch.ino +++ b/arduino/src/sketch.ino @@ -2,7 +2,9 @@ RCSwitch mySwitch = RCSwitch(); -int mode = 0; +uint8_t message[8]; +int index = 0; +boolean com = false; boolean on = false; void setup() @@ -13,28 +15,74 @@ void setup() void loop() { - if(Serial.available()) { - mode = Serial.read(); - - switch (mode) { - - case 126: - - if(on) { - controlRCOutlets("0FFF0FFF0000"); - Serial.println("Light is off."); - on = false; - } else { - controlRCOutlets("0FFF0FFF000F"); - Serial.println("Light is on."); - on = true; - } - - break; + while(Serial.available()) { + if(index > 0 || (Serial.peek() >= 80 && Serial.peek() <= 95)) { + message[index++] = Serial.read(); + if(index > 7){ + decodeMessage(); + index = 0; + } } } } +void decodeMessage() { + if(com) { + int cmd = message[0]; + int pin = message[1] - 97; + int val[6]; + memcpy(val, message + 2, 6); + + switch (cmd) { + //case 80: break; + //case 81: break; + //case 82: break; + //case 83: break; + //case 84: break; + //case 85: break; + //case 86: break; + case 87: switchLight(val); break; + //case 88: break; + //case 89: break; + default: break; + } + + } else if(message[0] == 90) { + + com = true; + Serial.println("Ready!"); + + } else { + + Serial.println("Arduino not configured for communication!"); + + } +} + +void switchLight(int val[]) { + + String triStateCode = ""; + + for(int i = 0; i < 6; i++) + { + String triStatePart = String(val[i], HEX); + triStatePart = (triStatePart.length() < 2) ? String("0" + triStatePart) : triStatePart; + triStateCode.concat(triStatePart); + } + char triState[triStateCode.length()]; + triStateCode.toCharArray(triState, triStateCode.length()); + + if(on) { + controlRCOutlets(triState); + Serial.println("Light is off."); + on = false; + } else { + controlRCOutlets(triState); + Serial.println("Light is on."); + on = true; + } +} + void controlRCOutlets(const char* sCodeWord) { mySwitch.sendTriState(sCodeWord); delay(1000);