/
signal_capture.ino
93 lines (89 loc) · 2.55 KB
/
signal_capture.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#define DIGITAL_INPUT_PIN 3
#define DIGITAL_OUTPUT_PIN 4
#define BAUD_RATE 57600
#define MAX_SEND_LENGTH 255
// Receiving
bool captureMode = false;
bool lastValue = LOW;
unsigned long last = -1;
unsigned int divisor = 0;
// Sending
bool sendDataMode = false;
unsigned char sendDataLength = 0;
unsigned char sendDataCount = 0;
unsigned char sendRepeats = 0;
unsigned char sendData[MAX_SEND_LENGTH];
void setup() {
pinMode(DIGITAL_INPUT_PIN, INPUT);
pinMode(DIGITAL_OUTPUT_PIN, OUTPUT);
Serial.setTimeout(2000);
Serial.begin(BAUD_RATE);
}
void loop() {
if (captureMode) {
bool value = digitalRead(DIGITAL_INPUT_PIN);
if (value != lastValue) {
lastValue = value;
unsigned long ts = micros();
unsigned long diff = 0;
if (ts < last) {
diff = 0; // Throw away this one bit every 70 hours.
} else {
diff = (ts - last);
}
diff = diff / divisor;
if (diff > 255) {
diff = 255;
}
Serial.write(diff);
last = ts;
}
}
while (Serial.available() > 0) {
unsigned char rcv = Serial.read();
if (sendDataMode) {
if (sendDataLength == 0) {
sendDataLength = rcv;
} else if (sendRepeats == 0) {
sendRepeats = rcv;
byte received = Serial.readBytes((char *)sendData, sendDataLength);
if (received != sendDataLength) {
sendDataMode = false;
Serial.write((byte)0xff);
Serial.write((byte)0x00);
Serial.write((byte)0x00);
return;
}
bool state;
for (int j = 0; j < sendRepeats; j++) {
state = LOW;
for (int i = 0; i < sendDataLength; i++) {
digitalWrite(DIGITAL_OUTPUT_PIN, state);
state = !state;
delayMicroseconds(sendData[i] * divisor);
// TODO: Factor in digitalWrite duration
}
}
digitalWrite(DIGITAL_OUTPUT_PIN, LOW);
sendDataMode = false;
Serial.flush(); // Throw away any commands sent during the sending of the signal
Serial.write((byte)0x00);
}
} else if (rcv == 'D') { // set divisor to next byte
Serial.readBytes((char *)&divisor, 1);
} else if (rcv == 'c') { // start capture
Serial.write((byte)0x00);
captureMode = true;
} else if (rcv == 'C') { // stop capture
Serial.write((byte)0x00);
captureMode = false;
} else if (rcv == 's') { // send some data
sendDataMode = true;
sendDataCount = 0;
sendDataLength = 0;
sendRepeats = 0;
} else {
Serial.println("Unknown data");
}
}
}