#include "parallel.h" #include #include "Arduino.h" namespace { constexpr int kParallelDataPins[] = { D9, D8, D7, D6, D5, D4, D3, D2, }; constexpr int kParallelBusyPin = D14; constexpr int kParallelAckPin = D15; constexpr int kParallelPaperoutPin = D12; constexpr int kParallelSelectPin = D11; constexpr int kParallelNibblePins[] = { kParallelSelectPin, kParallelPaperoutPin, kParallelAckPin, kParallelBusyPin, }; constexpr bool kParallelNibbleInverted[] = { false, false, false, true, }; constexpr int kParallelStrobePin = D10; volatile bool strobe_pending = false; volatile uint8_t strobe_byte = 0; void strobeIsr() { strobe_pending = true; strobe_byte = readParallel(); } } // namespace uint8_t readParallel() { uint8_t out = 0; for (int i = 0; i < 8; i++) { if (digitalReadFast(digitalPinToPinName(kParallelDataPins[i])) == HIGH) { out |= (1 << i); } } if (digitalReadFast(digitalPinToPinName(kParallelStrobePin)) == HIGH) { out |= (1 << 8); } return out; } #define BIT(x, n) ((x & (1 << n)) ? HIGH : LOW) void writeParallel(uint8_t nibble) { for (int i = 0; i < 4; i++) { int lvl = BIT(nibble, i); if (kParallelNibbleInverted[i]) { lvl = lvl == HIGH ? LOW : HIGH; } digitalWriteFast(digitalPinToPinName(kParallelNibblePins[i]), lvl); } } bool strobeOccurred(uint8_t &byte) { bool pending; { noInterrupts(); pending = strobe_pending; byte = strobe_byte; strobe_pending = false; interrupts(); } return pending; } void setupParallel() { for (int i = 0; i < sizeof(kParallelDataPins) / sizeof(int); i++) { pinMode(kParallelDataPins[i], INPUT); } for (int i = 0; i < sizeof(kParallelNibblePins) / sizeof(int); i++) { pinMode(kParallelNibblePins[i], OUTPUT); digitalWrite(kParallelNibblePins[i], HIGH); } pinMode(kParallelStrobePin, INPUT); attachInterrupt(digitalPinToInterrupt(kParallelStrobePin), strobeIsr, FALLING); }