diff --git a/led_blaster.cpp b/led_blaster.cpp new file mode 100644 index 0000000..f2c88a3 --- /dev/null +++ b/led_blaster.cpp @@ -0,0 +1,32 @@ +#define LED_PIN 13 + +#define LED_ON_MS 35 +#define LED_OFF_MS 460 + +#include + +namespace LedBlaster { + void setup() { + pinMode(LED_PIN, OUTPUT); + } + + void emit_0() { + digitalWrite(LED_PIN, HIGH); + delayMicroseconds(LED_ON_MS); + + digitalWrite(LED_PIN, LOW); + delayMicroseconds(LED_OFF_MS); + } + + void emit_1() { + delayMicroseconds(LED_ON_MS + LED_OFF_MS); + } + + void emit_byte(uint8_t serial_byte) { + emit_0(); + + for (int i = 0; i < 8; i++) { + bitRead(serial_byte, i) ? emit_1() : emit_0(); + } + } +} diff --git a/led_blaster.h b/led_blaster.h new file mode 100644 index 0000000..e1af3fb --- /dev/null +++ b/led_blaster.h @@ -0,0 +1,13 @@ +#ifndef LED_BLASTER_H +#define LED_BLASTER_H + +#include + +namespace LedBlaster { + void setup(); + void emit_0(); + void emit_1(); + void emit_byte(uint8_t serial_byte); +} + +#endif diff --git a/notebook_adapter.cpp b/notebook_adapter.cpp new file mode 100644 index 0000000..b27043f --- /dev/null +++ b/notebook_adapter.cpp @@ -0,0 +1,55 @@ +#ifndef NOTEBOOK_ADAPTER_H +#define NOTEBOOK_ADAPTER_H + +#define COMMAND_PING 'x' +#define COMMAND_QUERY '?' +#define COMMAND_TRANSMIT 'U' +#define COMMAND_QUERY_PAYLOAD "M764" + +#define PING_EXPIRE_MS 1000 + +#include + +namespace NotebookAdapter { + unsigned long last_ping_ms = 0; + bool command_mode = true; + + void emulate_command_mode(uint8_t serial_byte) { + switch(serial_byte) { + case COMMAND_PING: + Serial.write(COMMAND_PING); + + break; + + case COMMAND_QUERY: + Serial.print(COMMAND_QUERY_PAYLOAD); + Serial.write(0); + + break; + + case COMMAND_TRANSMIT: + Serial.write(COMMAND_TRANSMIT); + command_mode = false; + + break; + } + } + + void emulate_data_mode(uint8_t serial_byte) { + if (millis() - last_ping_ms > PING_EXPIRE_MS) { + command_mode = true; + } + + Serial.write(serial_byte); + + last_ping_ms = millis(); + } + + void emulate(uint8_t serial_byte) { + void(*function)(uint8_t) = command_mode ? emulate_command_mode : emulate_data_mode; + + function(serial_byte); + } +} + +#endif diff --git a/notebook_adapter.h b/notebook_adapter.h new file mode 100644 index 0000000..b33f448 --- /dev/null +++ b/notebook_adapter.h @@ -0,0 +1,12 @@ +#ifndef NOTEBOOK_ADAPTER_H +#define NOTEBOOK_ADAPTER_H + +#include + +namespace NotebookAdapter { + void emulate_command_mode(uint8_t serial_byte); + void emulate_data_mode(uint8_t serial_byte); + void emulate(uint8_t serial_byte); +} + +#endif diff --git a/timex-datalink-arduino.ino b/timex-datalink-arduino.ino index 203c45b..3b48037 100644 --- a/timex-datalink-arduino.ino +++ b/timex-datalink-arduino.ino @@ -1,87 +1,16 @@ -#define LED_PIN 13 - -#define LED_ON_MS 35 -#define LED_OFF_MS 460 - -#define COMMAND_PING 'x' -#define COMMAND_QUERY '?' -#define COMMAND_TRANSMIT 'U' -#define HANDSHAKE_PAYLOAD "M764" - -#define PING_EXPIRE_MS 1000 - -unsigned long last_ping_ms = 0; -bool command_mode = true; - -void led_emit_0() { - digitalWrite(LED_PIN, HIGH); - delayMicroseconds(LED_ON_MS); - - digitalWrite(LED_PIN, LOW); - delayMicroseconds(LED_OFF_MS); -} - -void led_emit_1() { - delayMicroseconds(LED_ON_MS + LED_OFF_MS); -} - -void led_emit_byte(uint8_t serial_byte) { - led_emit_0(); - - for (int i = 0; i < 8; i++) { - bitRead(serial_byte, i) ? led_emit_1() : led_emit_0(); - } -} - -void emulate_notebook_adapter_command(uint8_t serial_byte) { - switch(serial_byte) { - case COMMAND_PING: - Serial.write(COMMAND_PING); - - break; - - case COMMAND_QUERY: - Serial.print(HANDSHAKE_PAYLOAD); - Serial.write(0); - - break; - - case COMMAND_TRANSMIT: - Serial.write(COMMAND_TRANSMIT); - command_mode = false; - - break; - } -} - -void emulate_notebook_adapter_data(uint8_t serial_byte) { - if (millis() - last_ping_ms > PING_EXPIRE_MS) { - command_mode = true; - } - - Serial.write(serial_byte); - - last_ping_ms = millis(); -} - -void emulate_notebook_adapter(uint8_t serial_byte) { - void(*function)(uint8_t) = command_mode ? emulate_notebook_adapter_command : emulate_notebook_adapter_data; - - function(serial_byte); -} +#include "led_blaster.h" +#include "notebook_adapter.h" void setup() { Serial.begin(9600); - pinMode(LED_PIN, OUTPUT); + LedBlaster::setup(); } void loop() { int serial_byte = Serial.read(); - if (serial_byte == -1) { - return; + if (serial_byte != -1) { + LedBlaster::emit_byte(serial_byte); + NotebookAdapter::emulate(serial_byte); } - - led_emit_byte(serial_byte); - emulate_notebook_adapter(serial_byte); }