2023-03-28 13:11:50 +00:00
|
|
|
#include <TimerOne.h>
|
|
|
|
|
2023-03-30 03:47:30 +00:00
|
|
|
// config:
|
2023-03-28 13:11:50 +00:00
|
|
|
const int pinData = 6;
|
|
|
|
const int pinStatus = 7;
|
|
|
|
|
2023-03-30 03:47:30 +00:00
|
|
|
// fixed values
|
2023-03-29 19:16:24 +00:00
|
|
|
const int timerDelay = 500;
|
2023-03-29 18:40:53 +00:00
|
|
|
|
2023-03-28 13:11:50 +00:00
|
|
|
void setup(void)
|
|
|
|
{
|
|
|
|
pinMode(pinData, OUTPUT);
|
2023-03-30 04:23:06 +00:00
|
|
|
digitalWrite(pinData, HIGH);
|
2023-03-30 03:47:30 +00:00
|
|
|
|
2023-03-29 18:40:53 +00:00
|
|
|
Timer1.initialize(timerDelay);
|
2023-03-28 13:11:50 +00:00
|
|
|
Timer1.attachInterrupt(clockCycle);
|
|
|
|
Timer1.stop();
|
|
|
|
|
|
|
|
pinMode(pinStatus, INPUT_PULLUP);
|
|
|
|
attachInterrupt(digitalPinToInterrupt(pinStatus), statusCycle, CHANGE);
|
|
|
|
|
|
|
|
Serial.begin(9600);
|
|
|
|
}
|
|
|
|
|
|
|
|
volatile long lastChange = 0;
|
|
|
|
volatile int x = 0;
|
|
|
|
volatile int dataWord = 0;
|
|
|
|
volatile int dataState = 0;
|
|
|
|
volatile int dataDelay = 0;
|
2023-03-29 18:40:53 +00:00
|
|
|
volatile int packetDelay = 0;
|
|
|
|
volatile int packetTail = 0;
|
2023-03-30 04:23:06 +00:00
|
|
|
volatile int clkState = HIGH;
|
2023-03-28 13:11:50 +00:00
|
|
|
|
2023-03-30 04:23:06 +00:00
|
|
|
volatile bool nextKeyReady = false;
|
|
|
|
volatile byte nextKey = 0;
|
|
|
|
|
|
|
|
void typeKey(byte key) {
|
|
|
|
noInterrupts();
|
|
|
|
nextKeyReady = true;
|
|
|
|
nextKey = key;
|
|
|
|
interrupts();
|
|
|
|
}
|
|
|
|
|
|
|
|
void sendKey(byte key) {
|
|
|
|
noInterrupts();
|
|
|
|
dataWord = key;
|
2023-03-29 19:25:28 +00:00
|
|
|
dataState = 8;
|
2023-03-29 18:40:53 +00:00
|
|
|
dataDelay = 0;
|
|
|
|
packetDelay = 0;
|
2023-03-30 04:23:06 +00:00
|
|
|
packetTail = 10;
|
2023-03-28 13:11:50 +00:00
|
|
|
clkState = HIGH;
|
2023-03-30 04:23:06 +00:00
|
|
|
interrupts();
|
2023-03-29 18:40:53 +00:00
|
|
|
Timer1.initialize(timerDelay);
|
2023-03-28 13:11:50 +00:00
|
|
|
Timer1.start();
|
2023-03-30 04:23:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void statusCycle() {
|
|
|
|
long timeNow = millis();
|
|
|
|
long changeDiff = timeNow - lastChange;
|
|
|
|
lastChange = timeNow;
|
|
|
|
if (changeDiff >= 10 && nextKeyReady) {
|
|
|
|
sendKey(nextKey);
|
|
|
|
nextKeyReady = false;
|
2023-03-28 13:11:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void clockCycle(void)
|
|
|
|
{
|
2023-03-28 15:00:33 +00:00
|
|
|
int dataBit = HIGH;
|
2023-03-28 13:11:50 +00:00
|
|
|
if (clkState == LOW) {
|
|
|
|
clkState = HIGH;
|
|
|
|
} else {
|
|
|
|
clkState = LOW;
|
|
|
|
}
|
2023-03-29 18:40:53 +00:00
|
|
|
if (packetDelay > 0) {
|
|
|
|
packetDelay--;
|
|
|
|
} else if (dataDelay > 0) {
|
2023-03-28 15:00:33 +00:00
|
|
|
dataDelay--;
|
2023-03-29 18:40:53 +00:00
|
|
|
dataBit = LOW;
|
2023-03-28 15:00:33 +00:00
|
|
|
} else if (dataState > 0) {
|
|
|
|
int bitToSend = (dataWord >> (dataState - 1)) & 1;
|
|
|
|
dataBit = !bitToSend ? LOW : HIGH;
|
|
|
|
dataState--;
|
2023-03-29 18:40:53 +00:00
|
|
|
} else if (packetTail > 0) {
|
|
|
|
packetTail--;
|
|
|
|
dataBit = LOW;
|
2023-03-28 15:00:33 +00:00
|
|
|
} else {
|
|
|
|
Timer1.stop();
|
|
|
|
}
|
|
|
|
digitalWrite(pinData, dataBit);
|
2023-03-28 13:11:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void loop(void)
|
|
|
|
{
|
2023-03-30 04:23:06 +00:00
|
|
|
delay(50);
|
|
|
|
|
|
|
|
if (Serial.available() > 0) {
|
|
|
|
long key = Serial.parseInt(SKIP_ALL);
|
|
|
|
if (key != 0) {
|
|
|
|
typeKey(key);
|
|
|
|
}
|
|
|
|
}
|
2023-03-28 13:11:50 +00:00
|
|
|
}
|
2023-03-30 04:23:06 +00:00
|
|
|
|