R
eine API ist doch eigentlich schon eine Klassen Definition, wo ist das Problem und um unser Kaffemaschinen OS überall laufen zu lassen nutzen wir einfach eine entsprechend hohe Abstratkion von der Hardware.
(in dem Beispiel geh ich mal davon aus, dass es nicht für alle Systeme eine vernünfitge std lib gibt und man kein cout zur Ausgabe auf dem Display benutzen kann)
class hardware
{
public:
enum modus_t
{
SLEEP /*Stromspar Modus*/, ACTIVE, /*aktiviert (Kunden eingabe)*/
COMMECIAL, /*(falls vorhanden) der Modus um die Leute anzulocken, zB.
durch Spielereien mit den Lampen*/
DEACTIVATED
};
enum event_t
{
FAILURE,
KEYPRESSED,
MONEY,
TIMER
};
hardware();
~hardware();
enum event_t wait(void); //wait for event
int failure(void) const; //failure id
void failure(int id); //failure
//Mode
void modus(enum modus_t modus);
enum modus_t modus(void) const;
//I/O
void changeled(int no);
bool led(int no) const;
void display(const char *out) const;
void display(double n) const;
bool inserted(double &money) const;
int keypressed(void) const;
//how many...
int cups(void) const;
int coffee_amount(int type) const;
double money(void) const;
//output...
void cup(void);
void coffee(int type);
void money(double money);
//timer
void settimer(int seconds);
};
int types=3;
const double prices[]=
{2,3,1.5}
enum timer_t
{
SHOWCOMMERCIAL,
OUTPUTMONEY
};
void sell(hardware &machine, double &money, int &key, enum timer_t &timer)
{
if(!key)
{
machine.display("what coffee?\n");
if(money)
{
timer=OUTPUTMONEY; //gib das Geld aus in
machine.timer(60); //60 sekunden (wenn es keien Eingabe mehr gibt)
}
}
if(money)
{
if(money<price[key])
{
machine.display("needs ");
machine.display(price[key]-money);
machine.display("€\n");
}
machine.cup();
machine.coffee(key);
if(!machine.cup()||!machine.coffee_amount(key))
machine.failure(0);
if(money>price[key])
{
machine.display("output ");
machine.display(money-price[key]);
machine.display("€\n");
}
money=0;
key=0;
}
else
{
key=0;
timer=SHOWCOMMERCIAL; //schlafe in
machine.timer(120); //2 Minuten, wenn keine Eingabe mehr erfolgt
}
}
int main(void)
{
hardware machine;
machine.modus(hardware::SLEEP);
machine.timer(600);
enum timer_t timer=SHOWCOMMERCIAL;
double money=0;
int key=0;
for(;;)
{
switch(machine.wait())
{
case hardware::MONEY:
{
if(machine.modus()!=hardware::ACTIVE)
machine.modus(hardware::ACTIVE);
machine.timer(0);
money=machine.money();
machine.display("money: ");
machine.display(money);
machine.display("€\n);
sell(machine,money,key,timer);
break;
}
case hardware::KEYPRESSED:
{
if(machine.modus()!=hardware::ACTIVE)
machine.modus(hardware::ACTIVE);
machine.timer(0); //deaktiviere den Timer
key=machine.keypressed();
machine.display("coffee: ");
machine.display(key);
machine.display("\n");
if(key>types)
{
machine.display("invalid input\n");
if(money)
{
timer=OUTPUTMONEY; //gebe das Geld aus nach
machine.timer(60); //1 Minute
}
else
machine.modus(hardware::SLEEP);
break;
}
sell(machine,money,key,timer);
break;
}
case hardware::TIMER:
{
switch(timer)
{
case SHOWCOMMERCIAL:
if(machine.modus()==hardware::COMMERCIAL)
{
machine.modus(hardware::SLEEP);
machine.timer(600);
break;
}
else
{
machine.modus(hardware::COMMERCIAL);
machine.timer(30);
break;
}
case OUTPUTMONEY:
machine.money(money);
money=0;
machine.modus(hardware::SLEEP);
machine.timer(600);
break;
}
}
case hardware::FAILURE:
//hihi, die Maschine verschluckt das Geld, falls zwischen Eingabe des Geldes und Ausgabe des Kaffees ein Fehler auftritt :)
machine.modus(hardware::SLEEP);
machine.display("out of order\n");
machine.wait(); //for help
break;
}
}
}
nun muss nur noch die hardware Klasse unseren Vorgaben nach geschrieben werden, aber ich glaube nicht, dass sich so eine Arbeitsweise bei den meisten Embedded Geräten lohnt
[ Dieser Beitrag wurde am 03.03.2003 um 16:46 Uhr von kingruedi editiert. ]