236 lines
5.5 KiB
C++
236 lines
5.5 KiB
C++
#include <RCSwitch.h>
|
|
#include <IRremote.h>
|
|
|
|
// Necessary IR Globals
|
|
int RECV_PIN = 10;
|
|
IRrecv irrecv(RECV_PIN);
|
|
IRsend irsend;
|
|
decode_results results;
|
|
|
|
uint8_t message[8];
|
|
int index = 0;
|
|
boolean com = false;
|
|
int irReceive = 0;
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(9600);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
|
|
if (irReceive > millis() && irrecv.decode(&results)) {
|
|
|
|
irRead(&results);
|
|
irrecv.resume();
|
|
|
|
} else {
|
|
|
|
while(Serial.available()) {
|
|
uint8_t x = Serial.read();
|
|
if(index > 0 || (x >= 80 && x <= 95)) {
|
|
message[index++] = x;
|
|
if(index > 7){
|
|
decodeMessage();
|
|
index = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void decodeMessage() {
|
|
|
|
int cmd = message[0];
|
|
int pin = (message[1] - 97 < 0 || message[1] - 97 > 19)? -1 : message[1] - 97 ;
|
|
|
|
if(com) {
|
|
uint8_t val[6];
|
|
memcpy(val, message + 2, 6);
|
|
|
|
switch (cmd) {
|
|
//case 80: break;
|
|
case 81: setMode(val[0], pin); break;
|
|
case 82: digitalW(val[0], pin); break;
|
|
case 83: digitalR(pin); break;
|
|
case 84: analogW(val, pin); break;
|
|
case 85: analogR(pin); break;
|
|
case 86: handleRCDecimal(val, pin); break;
|
|
case 87: sendRCTristate(val, pin); break;
|
|
case 88: irSend(val[0], val[1], lastFourToLong(val)); break;
|
|
case 89: irrecv.enableIRIn();
|
|
irReceive = millis() + 10000;
|
|
break;
|
|
default: break;
|
|
}
|
|
|
|
} else if(cmd == 90) {
|
|
|
|
com = true;
|
|
setMode(0, pin);
|
|
digitalWrite(pin, HIGH);
|
|
Serial.println("Ready!");
|
|
|
|
} else {
|
|
|
|
Serial.println("Arduino not configured for communication!");
|
|
|
|
}
|
|
}
|
|
|
|
void setMode(uint8_t val, int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
|
|
if (val == 0) {
|
|
pinMode(pin, OUTPUT);
|
|
} else {
|
|
pinMode(pin, INPUT);
|
|
}
|
|
|
|
}
|
|
|
|
void digitalW(uint8_t val, int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
pinMode(pin, OUTPUT);
|
|
|
|
if(val == 0) {
|
|
digitalWrite(pin, LOW);
|
|
} else {
|
|
digitalWrite(pin, HIGH);
|
|
}
|
|
|
|
Serial.print(pin);
|
|
Serial.print('::');
|
|
Serial.println(val);
|
|
}
|
|
|
|
void digitalR(int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
pinMode(pin, INPUT);
|
|
int digraw = digitalRead(pin);
|
|
Serial.print(pin);
|
|
Serial.print('::');
|
|
Serial.println(digraw);
|
|
|
|
}
|
|
|
|
void analogW(uint8_t val[], int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
pinMode(pin, OUTPUT);
|
|
analogWrite(pin,firsTwoToInt(val));
|
|
Serial.print(pin);
|
|
Serial.print(' wrote ');
|
|
Serial.println((int)val);
|
|
|
|
}
|
|
|
|
void analogR(int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
pinMode(pin, INPUT);
|
|
int rval = analogRead(pin);
|
|
Serial.print(pin);
|
|
Serial.print("::");
|
|
Serial.println(rval);
|
|
|
|
}
|
|
|
|
void handleRCDecimal(uint8_t val[], int pin) {
|
|
|
|
if (pin == -1) { Serial.println("badpin"); return; }
|
|
unsigned int length = firsTwoToInt(val);
|
|
unsigned long value = lastFourToLong(val);
|
|
RCSwitch rc = RCSwitch();
|
|
rc.enableTransmit(pin);
|
|
rc.send(value, length);
|
|
Serial.print('RC Decimal: ');
|
|
Serial.println(value);
|
|
}
|
|
|
|
void sendRCTristate (uint8_t val[], int pin) {
|
|
|
|
if(pin == -1) { Serial.println("badpin"); return; }
|
|
|
|
String triStateCode = "";
|
|
RCSwitch rc = RCSwitch();
|
|
rc.enableTransmit(pin);
|
|
|
|
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() + 1];
|
|
triStateCode.toUpperCase();
|
|
triStateCode.toCharArray(triState, triStateCode.length() + 1);
|
|
|
|
rc.sendTriState(triState);
|
|
delay(500);
|
|
Serial.print("RC-Tristate send: ");
|
|
Serial.println(triState);
|
|
}
|
|
|
|
void irSend(int type, int length, unsigned long val) {
|
|
|
|
for(int i = 0; i < 3; i++) {
|
|
switch (type) {
|
|
case RC5: irsend.sendRC5(val, length); break;
|
|
case RC6: irsend.sendRC6(val, length); break;
|
|
case NEC: if (i) { irsend.sendNEC(REPEAT, length);
|
|
} else { irsend.sendNEC(val, length);} break;
|
|
case SONY: irsend.sendSony(val, length); break;
|
|
case PANASONIC: irsend.sendPanasonic(length, val); break;
|
|
case JVC: irsend.sendJVC(val, length, i); break;
|
|
case SAMSUNG: irsend.sendSAMSUNG(val, length); break;
|
|
case WHYNTER: irsend.sendWhynter(val, length); break;
|
|
case LG: irsend.sendLG(val, length); break;
|
|
case DISH: irsend.sendDISH(val, length); break;
|
|
case DENON: irsend.sendDenon(val, length); break;
|
|
}
|
|
delay(10);
|
|
}
|
|
}
|
|
|
|
void irRead(decode_results *results) {
|
|
|
|
int codeType = results->decode_type;
|
|
|
|
if (codeType == UNKNOWN) {
|
|
|
|
Serial.println("Unknown IR Protocol!");
|
|
|
|
} else {
|
|
|
|
if (codeType == NEC) {
|
|
if (results->value == REPEAT) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
unsigned long codeValue = results->value;
|
|
int codeLen = results->bits;
|
|
Serial.print(codeType);
|
|
Serial.print('::');
|
|
Serial.print(codeLen);
|
|
Serial.print('::');
|
|
Serial.println(codeValue);
|
|
}
|
|
}
|
|
|
|
// Helpers
|
|
|
|
unsigned int firsTwoToInt(uint8_t val[]) {
|
|
return val[0] * 256 + val[1];
|
|
}
|
|
|
|
unsigned long lastFourToLong(uint8_t val[]) {
|
|
return val[2]*16777216 + val[3]*65536 + val[4]*256 + val[5];
|
|
}
|