#include #include #include "automat.h" typedef enum {A=0, B, C, D, E, F, 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; int wert = muenz_wert ? 2 : 1; switch (s_curstate) { case A: case B: case C: case D: case E: // Münzeinwurf if (muenze) { if (s_guthaben + wert > 4) { s_muenz_rueck = true; s_display = true; s_display_string = "Zu viel! Münze zurück"; break; } else { s_guthaben += wert; } } // Guthaben prüfen 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"; } // Kein Display aktivieren! } 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; } else { s_curstate = E; s_display = true; s_display_string = "Bitte Becher unterstellen!"; } } break; case F: 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