/*
* File: DebouncingCodeMain.c
* Author: Ryan Vegetable/ Jerry Xu
*
* Created on July 23, 2018, 2:55 PM
*/
#include <stdio.h>
#include <stdlib.h>
#include "roach.h"
#include "timers.h"
#include "BOARD.h"
#include "serial.h"
/*#define NO_CHANGE 0
#define BUMPER_PUSHED_DOWN 1
#define BUMPER_RELEASED 2*/
#define BUTTON_UNPRESSED 0
#define BUTTON_PRESSED 1
#define TIMER_FL 0
#define TIMER_FR 1
#define TIMER_RL 2
#define TIMER_RR 3
#define DEBOUNCE_TIME 10
enum debounce {
NO_CHANGE, BUMPER_PUSHED_DOWN, BUMPER_RELEASED
};
enum debounce DebounceFL(void) {
static char prevFLbutton = BUTTON_UNPRESSED;
static char buttonStatus = 0x00;
if (TIMERS_IsTimerExpired(TIMER_FL)) {
TIMERS_InitTimer(TIMER_FL, DEBOUNCE_TIME);
buttonStatus <<= 1;
buttonStatus |= Roach_ReadFrontLeftBumper();
buttonStatus &= 0b00000111;
if ((prevFLbutton == 0) && (buttonStatus == 0b0000111)) {
prevFLbutton = BUTTON_PRESSED;
return BUMPER_PUSHED_DOWN;
}
if ((prevFLbutton == 1) && (buttonStatus == 0)) {
prevFLbutton = BUTTON_UNPRESSED;
return BUMPER_RELEASED;
}
}
return NO_CHANGE;
}
enum debounce DebounceFR(void) {
static char prevFRbutton = BUTTON_UNPRESSED;
static char buttonStatus = 0x00;
if (TIMERS_IsTimerExpired(TIMER_FR)) {
TIMERS_InitTimer(TIMER_FR, DEBOUNCE_TIME);
buttonStatus <<= 1;
buttonStatus |= Roach_ReadFrontRightBumper();
buttonStatus &= 0b00000111;
if ((prevFRbutton == 0) && (buttonStatus == 0b0000111)) {
prevFRbutton = BUTTON_PRESSED;
return BUMPER_PUSHED_DOWN;
}
if ((prevFRbutton == 1) && (buttonStatus == 0)) {
prevFRbutton = BUTTON_UNPRESSED;
return BUMPER_RELEASED;
}
}
return NO_CHANGE;
}
enum debounce DebounceRL(void) {
static char prevRLbutton = BUTTON_UNPRESSED;
static char buttonStatus = 0x00;
if (TIMERS_IsTimerExpired(TIMER_RL)) {
TIMERS_InitTimer(TIMER_RL, DEBOUNCE_TIME);
buttonStatus <<= 1;
buttonStatus |= Roach_ReadRearLeftBumper();
buttonStatus &= 0b00000111;
if ((prevRLbutton == 0) && (buttonStatus == 0b0000111)) {
prevRLbutton = BUTTON_PRESSED;
return BUMPER_PUSHED_DOWN;
}
if ((prevRLbutton == 1) && (buttonStatus == 0)) {
prevRLbutton = BUTTON_UNPRESSED;
return BUMPER_RELEASED;
}
}
return NO_CHANGE;
}
enum debounce DebounceRR(void) {
static char prevRRbutton = BUTTON_UNPRESSED;
static char buttonStatus = 0x00;
if (TIMERS_IsTimerExpired(TIMER_RR)) {
TIMERS_InitTimer(TIMER_RR, DEBOUNCE_TIME);
buttonStatus <<= 1;
buttonStatus |= Roach_ReadRearRightBumper();
buttonStatus &= 0b00000111;
if ((prevRRbutton == 0) && (buttonStatus == 0b0000111)) {
prevRRbutton = BUTTON_PRESSED;
return BUMPER_PUSHED_DOWN;
}
if ((prevRRbutton == 1) && (buttonStatus == 0)) {
prevRRbutton = BUTTON_UNPRESSED;
return BUMPER_RELEASED;
}
}
return NO_CHANGE;
}
int main(int argc, char** argv) {
SERIAL_Init();
BOARD_Init();
Roach_Init();
TIMERS_Init();
TIMERS_InitTimer(TIMER_FL, DEBOUNCE_TIME);
TIMERS_InitTimer(TIMER_FR, DEBOUNCE_TIME);
TIMERS_InitTimer(TIMER_RL, DEBOUNCE_TIME);
TIMERS_InitTimer(TIMER_RR, DEBOUNCE_TIME);
while (1) {
int FLbump = DebounceFL();
if (FLbump == BUMPER_PUSHED_DOWN) {
Roach_LeftMtrSpeed(-100);
Roach_RightMtrSpeed(-100);
}
int FRbump = DebounceFR();
if (FRbump == BUMPER_PUSHED_DOWN) {
Roach_LeftMtrSpeed(-100);
Roach_RightMtrSpeed(-100);
}
int RLbump = DebounceRL();
if (RLbump == BUMPER_PUSHED_DOWN) {
Roach_LeftMtrSpeed(100);
Roach_RightMtrSpeed(100);
}
if (RRbump == BUMPER_PUSHED_DOWN) {
Roach_LeftMtrSpeed(100);
Roach_RightMtrSpeed(100);
}
}
return (EXIT_SUCCESS);
}