TeensyPwm/rotary.cpp
2015-02-14 20:13:55 +01:00

111 lines
2.0 KiB
C++

#include <Arduino.h>
#include <stdint.h>
#include "hardware.h"
#include "rotary.h"
volatile int rotaryCount = 0;
volatile bool switchState = false;
volatile unsigned long lastEvent = 0;
int myDigitalRead(int a) {
int r = 0;
for (uint32_t i = 0; i < DEBOUNCING_REPEAT; i++) {
if (digitalRead(a) == HIGH) {
r++;
} else {
r--;
}
}
int res = -1;
if (r >= (DEBOUNCING_REPEAT / 2)) {
res = 1;
} else if (r <= -1 * (DEBOUNCING_REPEAT / 2)) {
res = 0;
}
return res;
}
void rotary_a_interrupt() {
uint32_t currentEvent = millis();
if ((lastEvent == 0) || (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent)) {
lastEvent = currentEvent;
int a = myDigitalRead(ROTARY_A);
int b = myDigitalRead(ROTARY_B);
if (((a != -1) && (b != -1))) {
if (a == b) {
rotaryCount++;
} else {
rotaryCount--;
}
}
}
}
void rotary_b_interrupt() {
uint32_t currentEvent = millis();
if ((lastEvent == 0) || (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent)) {
lastEvent = currentEvent;
int a = myDigitalRead(ROTARY_A);
int b = myDigitalRead(ROTARY_B);
if (((a != -1) && (b != -1))) {
if (a == b) {
rotaryCount--;
} else {
rotaryCount++;
}
}
}
}
void switch_interrupt() {
unsigned long currentEvent = millis();
if ((lastEvent == 0) || (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent)) {
lastEvent = currentEvent;
switchState = true;
}
}
void rotaryInit() {
pinMode(SWITCH, INPUT_PULLUP);
pinMode(ROTARY_A, INPUT_PULLUP);
pinMode(ROTARY_B, INPUT_PULLUP);
attachInterrupt(SWITCH, switch_interrupt, FALLING);
attachInterrupt(ROTARY_A, rotary_a_interrupt, CHANGE);
attachInterrupt(ROTARY_B, rotary_b_interrupt, CHANGE);
}
int getAndResetRotaryCount() {
int res = 0;
noInterrupts();
res = rotaryCount;
rotaryCount = 0;
interrupts();
return res;
}
bool getAndResetSwitchState() {
bool res = false;
noInterrupts();
res = switchState;
switchState = false;
interrupts();
return res;
}