02.11.2014 Views

Design Pattern Transition To History – State ... - Quantum Leaps

Design Pattern Transition To History – State ... - Quantum Leaps

Design Pattern Transition To History – State ... - Quantum Leaps

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!