From cf5f36b50339f8ee8530503dada04b70ca6480d7 Mon Sep 17 00:00:00 2001 From: Youen Toupin Date: Sat, 8 Aug 2015 22:36:24 +0200 Subject: [PATCH] improved high-level protocol --- OneWireIO.ino | 66 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/OneWireIO.ino b/OneWireIO.ino index e3abba5..1e65415 100644 --- a/OneWireIO.ino +++ b/OneWireIO.ino @@ -15,6 +15,19 @@ 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); @@ -33,6 +46,13 @@ 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(); @@ -49,11 +69,47 @@ void owReceive(OneWireSlave::ReceiveEvent evt, byte data) switch (evt) { case OneWireSlave::RE_Byte: - if (data == 0x01) - led.writeHigh(); - else if (data == 0x02) - led.writeLow(); - OneWire.write(&acknowledge, 1, 0); + 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: ;