ha
Dependencies: mbed
main.cpp
- Committer:
- vici
- Date:
- 2016-04-21
- Revision:
- 0:51814a1e44cd
File content as of revision 0:51814a1e44cd:
/* Modulname: SCHÖNI VICI CALC 4STATES Version: 1.0 */ /* Funktion: State-Machine-Programm */ /* Erstellt von: SC am: 2013-02-11 */ #include "mbed.h" #include "C12832_lcd.h" bool newEvent =false; uint8_t event=0, state=0; InterruptIn iiJsUp(p15); //alle Funktionen von Joystick initialisieren DigitalIn diJsUp(p15); InterruptIn iiJsDown(p12); DigitalIn diJsDown(p12); InterruptIn iiJsCenter(p14); DigitalIn diJsCenter(p14); InterruptIn iiJsLeft(p13); DigitalIn diJsLeft(p13); InterruptIn iiJsRight(p16); DigitalIn diJsRight(p16); char calcOp = '+'; // calcOp festgelegt als "+" oder "-" bool updateLcd = true; // aktualisierung von LCD int value1, value2, result; // variablen fürs Rechnen festlegen, initialisierung C12832_LCD lcd; BusOut myLeds(LED1, LED2, LED3, LED4); //Ledbar // prototypes //festgelegte Funktionen werden hier abgearbeitet void noFunction(); //keine Funktion void selectAddition(); //Auswahl + void selectSubtraction(); //Auswahl - void CountTerm_1_Up(); //Erste Zahl wird raufgezählt void CountTerm_2_Up(); //Zweite Zahl wird raufgezählt void CountTerm_1_Down(); //Erste Zahl wird runtergezählt void CountTerm_2_Down(); //Zweite Zahl wird runtergezählt void reset(); //rückgesetzt void calculateResult(); //Ergebnis von Zahl1 und Zahl2 /****************************************************/ /* Tabelle fuer die naechsten Zustaende bei Eingabe */ /****************************************************/ uint8_t nextstate_tab[5][4]= // current event/ present state 0 1 2 3 //---------------------- /* Event 0 (Joystick UP) */{{ 1, 1, 1, 3 }, // next /* Event 1 (Joystick DOWN) */ { 1, 1, 1 ,3 }, /* Event 2 (Joystick LEFT) */ { 0, 2, 2 ,0 }, /* Event 3 (Joystick RIGHT) */ { 0, 2, 2 ,0 }, /* Event 4 (Joystick CENTER)*/ { 0, 3, 3 ,3}}; // state // state=nextstate_tab[event][state]; // gehe auf naechsten Zustand /*************************************************************/ /* Tabelle fuer Aktionsroutinen fuer die Zustaende bei Input */ /*************************************************************/ // p r e s e n t s t a t e void (*action[5][4])()= // 0 1 2 3 /* event 0 */ {{ noFunction,selectAddition,selectAddition, noFunction}, /* event 1 */ { noFunction,selectSubtraction,selectSubtraction,noFunction}, /* event 2 */ { CountTerm_1_Up,noFunction,CountTerm_2_Up,reset}, /* event 3 */ { CountTerm_1_Down,noFunction,CountTerm_2_Down,reset}, /* event 4 */ { noFunction,calculateResult,calculateResult,noFunction}}; // action routines //Funktionen erstellen,was darin passiert void noFunction() { } void selectAddition() { calcOp = '+'; lcd.locate(0, 20); lcd.printf("%d %c ", value1, calcOp); } void selectSubtraction() { calcOp = '-'; lcd.locate(0, 20); lcd.printf("%d %c ", value1, calcOp); } void CountTerm_1_Up() { value1++; lcd.locate(0, 20); lcd.printf("%d ", value1); } void CountTerm_1_Down() { value1--; lcd.locate(0, 20); lcd.printf("%d ", value1); } void CountTerm_2_Up() { value2++; lcd.locate(0, 20); lcd.printf("%d %c %d ", value1, calcOp, value2); } void CountTerm_2_Down() { value2--; lcd.locate(0, 20); lcd.printf("%d %c %d ", value1, calcOp, value2); } void reset() { value1 = value2 = 0; lcd.locate(0, 20); lcd.printf("%d ", value1); } void calculateResult() { if (calcOp == '+') result = value1 + value2; else result = value1 - value2; lcd.locate(0, 20); lcd.printf("%d %c %d = %d ", value1, calcOp, value2, result); } // common functions uint8_t debounce(DigitalIn myIn) { #define LEVEL_CHECKS 16 #define MAX_LOOPS 80 // stoppt das Überprüfen des Prellen nach max. MAX_LOOPS Durchläufen unsigned char port_buffer; unsigned char debounceCounter = 0; uint8_t loopCounter = 0; do { port_buffer = myIn; wait_us(100); loopCounter++; if(myIn == port_buffer) debounceCounter++; // mindestens 'LEVEL_CHECKS' Abtastungen in Folge: gleicher Pegel else debounceCounter = 0; } while ((debounceCounter <= LEVEL_CHECKS) && (loopCounter <= MAX_LOOPS)); return loopCounter; } // ISR void opPlus() { // op +: JsUp=event0 debounce(diJsUp); event=0; newEvent = true; } void opMinus() { // op -: JsDown=event1 debounce(diJsDown); event=1; newEvent = true; } void cntUp() { // value +1: JsLeft=event2 debounce(diJsLeft); event=2; newEvent = true; } void cntDown() { // value -1: JsRight=event3 debounce(diJsRight); event=3; newEvent = true; } void doCalc() { // calculate: JsCenter=event4 debounce(diJsCenter); event=4; newEvent = true; } void init() { //hier wird alles initialisiert myLeds = 0; newEvent = false; state=0; event=0; lcd.cls(); lcd.locate(0,0); iiJsUp.rise(&opPlus); iiJsDown.rise(&opMinus); iiJsLeft.rise(&cntUp); iiJsRight.rise(&cntDown); iiJsCenter.rise(&doCalc); } int main() //Hauptprogramm { init(); lcd.printf("BULME Calculator BV"); lcd.locate(0,10); lcd.printf("Berechung eingeben"); while(1) { if (newEvent) { newEvent=false; (*action[event][state])(); // line 1 for executing sm: run action routine state = nextstate_tab[event][state]; // line 2 for executing sm: run state transition } } return 1; }