#define PIN uint8_t
const PIN UNUSED = 255;
class Joystick {
private:
PIN buttonPin; // unused now
PIN verticalPin;
PIN horizontalPin;
int toDigital(PIN pin, int a, int b, int x, int y) {
return map(analogRead(pin), a, b, x, y);
}
public:
const static uint32_t speed = 9600;
Joystick(PIN horizontalPin_, PIN verticalPin_, PIN buttonPin_) {
horizontalPin = horizontalPin_;
verticalPin = verticalPin_;
buttonPin = buttonPin_;
}
~Joystick() {}
void setup() {
pinMode(verticalPin, INPUT);
pinMode(horizontalPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
int getVertical() {
return abs(-analogRead(verticalPin));
}
int getHorizontal() {
return analogRead(horizontalPin);
}
bool isButtonPressed() {
return digitalRead(buttonPin) == LOW;
}
};
class Pedal {
private:
PIN clkPin;
PIN dtPin;
int lastClk;
int state;
int minState;
int maxState;
public:
Pedal(PIN clkPin_, PIN dtPin_) {
clkPin = clkPin_;
dtPin = dtPin_;
lastClk = HIGH;
state = 0;
minState = state;
maxState = state;
}
void setup() {
pinMode(clkPin, INPUT);
pinMode(dtPin, INPUT);
}
void tick() {
int newClk = digitalRead(clkPin);
if (newClk != lastClk) {
lastClk = newClk;
int dtValue = digitalRead(dtPin);
if (newClk == LOW && dtValue == HIGH) {
state++;
}
if (newClk == LOW && dtValue == LOW) {
state--;
}
}
}
int getState() {
if (state < minState) return minState;
if (state > maxState) return maxState;
return state;
}
bool setMaxState() {
bool higher = state >= maxState;
maxState = state;
return higher;
}
bool setMinState() {
bool lower = state <= minState;
minState = state;
return lower;
}
bool isWorking() {
return maxState != minState;
}
};
class PedalsPlate {
private:
Pedal* clutchPedal;
Pedal* breakPedal;
Pedal* gasPedal;
PIN confugurePedalsButtonPin;
public:
const static uint32_t speed = 115200;
PedalsPlate(PIN btn, PIN cC, PIN cD, PIN bC, PIN bD, PIN gC, PIN gD) {
confugurePedalsButtonPin = btn;
clutchPedal = new Pedal(cC, cD);
breakPedal = new Pedal(bC, bD);
gasPedal = new Pedal(gC, gD);
}
~PedalsPlate() {
delete clutchPedal;
delete breakPedal;
delete gasPedal;
}
void setup() {
pinMode(confugurePedalsButtonPin, INPUT_PULLUP);
clutchPedal->setup();
breakPedal->setup();
gasPedal->setup();
}
void tick() {
bool buttonPressed = digitalRead(confugurePedalsButtonPin) == LOW;
if (buttonPressed) {
clutchPedal->setMaxState();
breakPedal->setMaxState();
gasPedal->setMaxState();
}
clutchPedal->tick();
breakPedal->tick();
gasPedal->tick();
}
int getClutchState() {
return clutchPedal->getState();
}
int getBreakState() {
return breakPedal->getState();
}
int getGasState() {
return gasPedal->getState();
}
};
auto joystick = Joystick(A1, A2, UNUSED);
auto pedals = PedalsPlate(7, 8, 9, 10, 11, 12, 13);
void setup() {
Serial.begin(PedalsPlate::speed);
joystick.setup();
pedals.setup();
}
void loop() {
// bool selPressed = joystick.isButtonPressed();
// int ver = joystick.getVertical();
// int hor = joystick.getHorizontal();
// String out = String("vertical:") + String(ver)
// + String(", horizontal:") + String(hor);
// Serial.println(out);
pedals.tick();
int gs = pedals.getGasState();
int bk = pedals.getBreakState();
int ct = pedals.getClutchState();
String out = String("gs:") + String(gs)
+ String(", bk:") + String(bk)
+ String(", ct:") + String(ct);
Serial.println(out);
}