|
|
|
#include "Arduino.h"
|
|
|
|
#include "LowLevel.h"
|
|
|
|
#include "SerialChannel.h"
|
|
|
|
#include "OneWireSlave.h"
|
|
|
|
|
|
|
|
#define LEDPin 13
|
|
|
|
#define OWPin 2
|
|
|
|
|
|
|
|
#ifdef ENABLE_SERIAL_CHANNEL
|
|
|
|
SerialChannel debug("debug");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
Pin led(LEDPin);
|
|
|
|
|
|
|
|
byte owROM[7] = { 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
|
|
|
|
|
|
|
|
byte acknowledge = 0x42;
|
|
|
|
byte commandCheckError = 0xF1;
|
|
|
|
|
|
|
|
int turnOnTimeoutSeconds = 5 * 60;
|
|
|
|
|
|
|
|
const byte CMD_TurnOn = 0x01;
|
|
|
|
const byte CMD_TurnOff = 0x02;
|
|
|
|
const byte CMD_ReadState = 0x03;
|
|
|
|
|
|
|
|
const byte ANS_StateIsOn = 0x01;
|
|
|
|
const byte ANS_StateIsOff = 0x02;
|
|
|
|
|
|
|
|
volatile byte command = 0x0;
|
|
|
|
volatile long turnOnStartTime = 0;
|
|
|
|
|
|
|
|
void owReceive(OneWireSlave::ReceiveEvent evt, byte data);
|
|
|
|
|
|
|
|
void setup()
|
|
|
|
{
|
|
|
|
led.outputMode();
|
|
|
|
led.writeLow();
|
|
|
|
|
|
|
|
OneWire.setReceiveCallback(&owReceive);
|
|
|
|
OneWire.begin(owROM, OWPin);
|
|
|
|
|
|
|
|
Serial.begin(9600);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop()
|
|
|
|
{
|
|
|
|
delay(1);
|
|
|
|
|
|
|
|
long now = millis();
|
|
|
|
if (now > turnOnStartTime + (long)turnOnTimeoutSeconds * 1000 || now < turnOnStartTime)
|
|
|
|
{
|
|
|
|
led.writeLow();
|
|
|
|
turnOnStartTime = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
cli();//disable interrupts
|
|
|
|
#ifdef ENABLE_SERIAL_CHANNEL
|
|
|
|
SerialChannel::swap();
|
|
|
|
#endif
|
|
|
|
sei();//enable interrupts
|
|
|
|
|
|
|
|
#ifdef ENABLE_SERIAL_CHANNEL
|
|
|
|
SerialChannel::flush();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void owReceive(OneWireSlave::ReceiveEvent evt, byte data)
|
|
|
|
{
|
|
|
|
switch (evt)
|
|
|
|
{
|
|
|
|
case OneWireSlave::RE_Byte:
|
|
|
|
if (command == 0x00)
|
|
|
|
{
|
|
|
|
command = data;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (data == (0xFF-command)) // to check there is no communication error, the master must send the command, and then its inverse
|
|
|
|
{
|
|
|
|
byte receivedCommand = command;
|
|
|
|
command = 0x0;
|
|
|
|
switch (receivedCommand)
|
|
|
|
{
|
|
|
|
case CMD_TurnOn:
|
|
|
|
turnOnStartTime = millis();
|
|
|
|
led.writeHigh();
|
|
|
|
OneWire.write(&acknowledge, 1, NULL);
|
|
|
|
break;
|
|
|
|
case CMD_TurnOff:
|
|
|
|
led.writeLow();
|
|
|
|
turnOnStartTime = 0;
|
|
|
|
OneWire.write(&acknowledge, 1, NULL);
|
|
|
|
break;
|
|
|
|
case CMD_ReadState:
|
|
|
|
bool state = led.read();
|
|
|
|
static byte response[2];
|
|
|
|
response[0] = state ? ANS_StateIsOn : ANS_StateIsOff;
|
|
|
|
response[1] = 0xFF - response[0];
|
|
|
|
OneWire.write(response, 2, NULL);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
command = 0x0;
|
|
|
|
OneWire.write(&commandCheckError, 1, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OneWireSlave::RE_Reset:
|
|
|
|
case OneWireSlave::RE_Error:
|
|
|
|
command = 0x0;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|