Info2P5/Modul4/automat.c
2025-06-11 09:42:59 +02:00

104 lines
3.2 KiB
C

#include <stdio.h>
#include <stdbool.h>
#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