#include #include #include "automat.h" typedef enum {A=0,B,C,D,E,F,H,I, NR_OF_STATES} state_t; static state_t s_curstate = A; static int s_guthaben = 0; static bool s_kaffee_los = false; static bool s_muenz_rueck = false; static bool s_display = false; static const char* s_display_string = "Warten"; void automat_reset(void) { s_curstate = A; s_guthaben = 0; s_kaffee_los = false; s_muenz_rueck = false; s_display = false; s_display_string = "Warten"; } void automat_transition(BOOL becher, BOOL muenze, BOOL muenz_wert) { s_kaffee_los = false; s_muenz_rueck = false; s_display = false; switch (s_curstate) { case A: case B: case C: case D: // Münzeinwurf if (muenze) { int wert = muenz_wert ? 2 : 1; if (s_guthaben + wert > 4) { s_muenz_rueck = true; s_display_string = "Zu viel! Münze zurück"; } else { s_guthaben += wert; } } // *** Hier ist die Änderung *** if (s_guthaben < 4) { if (s_guthaben == 0) s_curstate = A, s_display_string = "Warten"; else if (s_guthaben == 1) s_curstate = B, s_display_string = "1 Euro"; else if (s_guthaben == 2) s_curstate = C, s_display_string = "2 Euro"; else if (s_guthaben == 3) s_curstate = D, s_display_string = "3 Euro"; } else if (s_guthaben == 4) { if (becher) { s_curstate = F; s_kaffee_los = true; s_display = true; s_display_string = "Kaffee wird ausgegeben"; s_guthaben = 0; // Guthaben wird nach Ausgabe zurückgesetzt! } else { s_curstate = E; s_display = true; s_display_string = "Bitte Becher unterstellen!"; } } break; case E: // 4 Euro, warte auf Becher s_display = true; s_display_string = "Bitte Becher unterstellen!"; if (becher) { s_curstate = F; s_kaffee_los = true; s_display_string = "Kaffee wird ausgegeben"; s_guthaben = 0; // Guthaben wird nach Ausgabe zurückgesetzt! } break; case F: // Kaffee läuft, warte auf Becherentnahme s_display = true; s_display_string = "Becher entnehmen"; if (!becher) { s_curstate = A; s_display = false; s_display_string = "Warten"; } break; default: s_curstate = A; s_guthaben = 0; s_display = false; s_display_string = "Warten"; break; } } fsm_action_t automat_output(void) { return (fsm_action_t){ .display = s_display, .muenz_rueck = s_muenz_rueck, .kaffee_los = s_kaffee_los, .guthaben = s_guthaben, .display_string = s_display_string }; } //gcc automat.c view.c main.c io.c checker.c -o console_automat