Design Pattern Transition To History – State ... - Quantum Leaps
Design Pattern Transition To History – State ... - Quantum Leaps
Design Pattern Transition To History – State ... - Quantum Leaps
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Design</strong> <strong>Pattern</strong><br />
<strong>Transition</strong> to <strong>History</strong><br />
state-machine.com/resources/appnotes.php<br />
(1) #include "qep_port.h"<br />
/*..........................................................................*/<br />
enum <strong>To</strong>asterOvenSignals {<br />
OPEN_SIG = Q_USER_SIG,<br />
CLOSE_SIG,<br />
TOAST_SIG,<br />
BAKE_SIG,<br />
OFF_SIG,<br />
TERMINATE_SIG /* terminate the application */<br />
};<br />
/*..........................................................................*/<br />
typedef struct <strong>To</strong>asterOvenTag {<br />
QHsm super; /* derive from QHsm */<br />
(2) Q<strong>State</strong>Handler doorClosed_history; /* history of the doorClosed state */<br />
} <strong>To</strong>asterOven;<br />
void <strong>To</strong>asterOven_ctor(<strong>To</strong>asterOven *me); /* default ctor */<br />
Q<strong>State</strong> <strong>To</strong>asterOven_initial (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_doorOpen (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_off (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_heating (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_toasting (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_baking (<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_doorClosed(<strong>To</strong>asterOven *me, QEvent const *e);<br />
Q<strong>State</strong> <strong>To</strong>asterOven_final (<strong>To</strong>asterOven *me, QEvent const *e);<br />
/*..........................................................................*/<br />
void <strong>To</strong>asterOven_ctor(<strong>To</strong>asterOven *me) { /* default ctor */<br />
QHsm_ctor(&me->super, (Q<strong>State</strong>Handler)&<strong>To</strong>asterOven_initial);<br />
}<br />
/* HSM definitio -----------------------------------------------------------*/<br />
Q<strong>State</strong> <strong>To</strong>asterOven_initial(<strong>To</strong>asterOven *me, QEvent const *e) {<br />
(void)e; /* avoid compiler warning about unused parameter */<br />
(3) me->doorClosed_history = (Q<strong>State</strong>Handler)&<strong>To</strong>asterOven_off;<br />
return Q_TRAN(&<strong>To</strong>asterOven_doorClosed);<br />
}<br />
/*..........................................................................*/<br />
Q<strong>State</strong> <strong>To</strong>asterOven_final(<strong>To</strong>asterOven *me, QEvent const *e) {<br />
(void)me; /* avoid compiler warning about unused parameter */<br />
switch (e->sig) {<br />
case Q_ENTRY_SIG: {<br />
printf("-> final\nBye!Bye!\n");<br />
_exit(0);<br />
return Q_HANDLED();<br />
}<br />
}<br />
return Q_SUPER(&QHsm_top);<br />
}<br />
/*..........................................................................*/<br />
Q<strong>State</strong> <strong>To</strong>asterOven_doorClosed(<strong>To</strong>asterOven *me, QEvent const *e) {<br />
switch (e->sig) {<br />
case Q_ENTRY_SIG: {<br />
printf("door-Closed;");<br />
return Q_HANDLED();<br />
Copyright © <strong>Quantum</strong> <strong>Leaps</strong>, LLC. All Rights Reserved.<br />
3 of 6