#include <MsTimer2.h>
volatile uint8_t currentByte = 0;
volatile int8_t currentBit = 7;
volatile uint8_t payloadSize;
volatile bool dataSent = true;
volatile byte payload[64];
// bit de 1 va durer 2 x 58 µs : HIGH 58 µs et LOW 58 µs
// bit de 0 va durer 4x 58 µs : HIGH 116 µs et LOW 116 µs
// tx est appelé toutes les 58µs
void tx() {
enum tState : byte {NEXT_BIT, ZERO_1, ZERO_2, ZERO_3, ZERO_4, UN_1, UN_2};
static tState etat = NEXT_BIT;
if (dataSent) {
dataSent = true;
currentBit = 7;
currentByte = 0;
etat = NEXT_BIT;
return;
}
switch (etat) {
case NEXT_BIT:
if (currentBit == 7) Serial.println();
if (bitRead(payload[currentByte], currentBit) == 0) {
etat = ZERO_1;
Serial.print(F("[0"));
} else {
etat = UN_1;
Serial.print(F("[1"));
}
break;
case ZERO_1:
Serial.write('-');
etat = ZERO_2;
break;
case ZERO_2:
Serial.write('x');
etat = ZERO_3;
break;
case ZERO_3:
Serial.write('-');
etat = ZERO_4;
break;
case ZERO_4:
Serial.write(']');
if (--currentBit < 0) {
currentByte++;
currentBit = 7;
dataSent = (currentByte >= payloadSize);
}
etat = NEXT_BIT;
break;
case UN_1:
Serial.write('x');
etat = UN_2;
break;
case UN_2:
Serial.write(']');
if (--currentBit < 0) {
currentByte++;
currentBit = 7;
dataSent = (currentByte >= payloadSize);
}
etat = NEXT_BIT;
break;
}
}
void setPayload() {
noInterrupts();
payload[0] = 0b11110000;
payload[1] = 0b10101010;
payload[2] = 0b00001111;
payloadSize = 3;
currentBit = 7;
currentByte = 0;
dataSent = false;
interrupts();
}
void setup() {
Serial.begin(115200);
MsTimer2::set(5, tx); // 5ms period
setPayload();
MsTimer2::start();
}
void loop() {}