For Telliskivi2 2014
Fork of HumanInterface by
Diff: HumanInterface.cpp
- Revision:
- 0:ccf47494061b
- Child:
- 1:9b2455659c7d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HumanInterface.cpp Thu Sep 19 13:13:10 2013 +0000 @@ -0,0 +1,111 @@ +#include "HumanInterface.h" + +HumanInterface::HumanInterface (Serial *pc, PCA9555 *ioExt, + unsigned int yellowLedPin, unsigned int blueLedPin, unsigned int redLedPin, + unsigned int goalButtonPin, unsigned int startButtonPin, unsigned int ballSensePin): + extIO(ioExt), yellowLed(ioExt, yellowLedPin), blueLed(ioExt, blueLedPin), redLed(ioExt, redLedPin),// blue,yellow,red 12,11,13 + goalButton(ioExt, goalButtonPin), startButton(ioExt, startButtonPin), ballSense(ioExt, ballSensePin) { + redBlinking = false; + blueBlinking = false; + yellowBlinking = false; + + goalLastState = goalButton.read(); + startLastState = startButton.read(); + ballLastState = ballSense.read(); + + ioExt->change(this, &HumanInterface::extChangedCallback); + + setGoal(UNSET); + + ledTicker.attach(this, &HumanInterface::blinkLeds, 0.2); +} + +void HumanInterface::setError(bool state) { + if (state) { + redBlinking = true; + } else { + redBlinking = false; + redLed.clear(); + } +} + + +void HumanInterface::setGoal(Goal goal) { + if (goal == YELLOW) { + yellowLed.set(); + blueLed.clear(); + blueBlinking = false; + yellowBlinking = false; + } else if (goal == BLUE) { + yellowLed.clear(); + blueLed.set(); + blueBlinking = false; + yellowBlinking = false; + } else if (goal == UNSET) { + yellowLed.clear(); + blueLed.clear(); + blueBlinking = true; + yellowBlinking = true; + } +} + +void HumanInterface::blinkLeds(void) { + if (redBlinking) + redLed.toggle(); + if (blueBlinking) + blueLed.toggle(); + if (yellowBlinking) + yellowLed.toggle(); +} + +bool HumanInterface::getBallState() { + return ballLastState; +} + +void HumanInterface::extChangedCallback(void) { + //pc->printf("Callback!"); + + bool goalState = goalButton.read(); + bool startState = startButton.read(); + bool ballState = ballSense.read(); + + if (goalLastState != goalState) { + //pc->printf("goal button change!"); + if (goalState) { + goalRiseCallback.call(); + } + } + if (startLastState != startState) { + //pc->printf("start button change!"); + if (startState) { + startRiseCallback.call(); + } + } + if (ballLastState != ballState) { + //pc->printf("ball change!"); + //Todo: if new state is "true" -> button was released + ballChangeCallback.call(); + } + + goalLastState = goalState; + startLastState = startState; + ballLastState = ballState; + + changeCallback.call(); +} + +void HumanInterface::change(void (*function)(void)) { + changeCallback.attach(function); +} + +void HumanInterface::goalRise(void (*function)(void)) { + goalRiseCallback.attach(function); +} + +void HumanInterface::startRise(void (*function)(void)) { + startRiseCallback.attach(function); +} + +void HumanInterface::ballChange(void (*function)(void)) { + ballChangeCallback.attach(function); +} \ No newline at end of file