-
-
Save jblang94/ba28320e4075c1faee5941865c2d51e0 to your computer and use it in GitHub Desktop.
Finalizing details for issue 140
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class FinalStatesExample { | |
sm { | |
s1 { | |
orthogonalRegion1 { | |
goToS2->s2; | |
o1Start { | |
goBigFinal-> Final; | |
completeO1-> o1Final; | |
} | |
final o1Final{} | |
} | |
|| | |
orthogonalRegion2 { | |
o2Start { | |
completeO2-> o2Final; | |
} | |
final o2Final{} | |
} | |
} | |
s2 { | |
s2Start { | |
completeS2-> s2Final; | |
} | |
final s2Final{} | |
} | |
} | |
} | |
#### Java enums ###### | |
public enum Sm { s1, s2, Final } | |
public enum SmS1OrthogonalRegion1 { Null, orthogonalRegion1 } | |
public enum SmS1OrthogonalRegion1OrthogonalRegion1 { Null, o1Start, o1Final } | |
public enum SmS1OrthogonalRegion2 { Null, orthogonalRegion2 } | |
public enum SmS1OrthogonalRegion2OrthogonalRegion2 { Null, o2Start, o2Final } | |
public enum SmS2 { Null, s2Start, s2Final } | |
*** Assume that "sm" is in state "s1" *** | |
#### | |
SCENARIO 1 | |
Event "goBigFinal" occurs | |
#### | |
- exit everything | |
- set sm (the top-most state machine) to "Final" | |
- delete the entire state machine | |
public boolean goBigFinal() | |
{ | |
boolean wasEventProcessed = false; | |
SmS1OrthogonalRegion1OrthogonalRegion1 aSmS1OrthogonalRegion1OrthogonalRegion1 = smS1OrthogonalRegion1OrthogonalRegion1; | |
switch (aSmS1OrthogonalRegion1OrthogonalRegion1) | |
{ | |
case o1Start: | |
// Exit everything | |
exitSm(); | |
// Set sm to "Big Final" (aka. the be-all end-all final state) | |
setSm(Sm.Final); | |
wasEventProcessed = true; | |
break; | |
default: | |
// Other states do respond to this event | |
} | |
return wasEventProcessed; | |
} | |
private void setSm(Sm aSm) | |
{ | |
sm = aSm; | |
// entry actions and do activities | |
switch(sm) | |
{ | |
case s1: | |
if (smS1OrthogonalRegion1 == SmS1OrthogonalRegion1.Null) { setSmS1OrthogonalRegion1(SmS1OrthogonalRegion1.orthogonalRegion1); } | |
if (smS1OrthogonalRegion2 == SmS1OrthogonalRegion2.Null) { setSmS1OrthogonalRegion2(SmS1OrthogonalRegion2.orthogonalRegion2); } | |
break; | |
case s2: | |
if (smS2 == SmS2.Null) { setSmS2(SmS2.s2Start); } | |
break; | |
case Final: | |
// The "BigFinal" -> be-all end-all | |
// Delete the entire state machine | |
delete(); | |
break; | |
} | |
} | |
#### | |
SCENARIO 2 | |
Event "completeO1" occurs | |
#### | |
- exit o1Start | |
- change orthogonalRegion1 to o1Final | |
- check if orthogonalRegion2 is in o2Final, if it is, then we can delete the entire state machine | |
public boolean completeO1() | |
{ | |
boolean wasEventProcessed = false; | |
SmS1OrthogonalRegion1OrthogonalRegion1 aSmS1OrthogonalRegion1OrthogonalRegion1 = smS1OrthogonalRegion1OrthogonalRegion1; | |
switch (aSmS1OrthogonalRegion1OrthogonalRegion1) | |
{ | |
case o1Start: | |
exitSmS1OrthogonalRegion1OrthogonalRegion1(); | |
setSmS1OrthogonalRegion1OrthogonalRegion1(SmS1OrthogonalRegion1OrthogonalRegion1.o1Final); | |
wasEventProcessed = true; | |
break; | |
default: | |
// Other states do respond to this event | |
} | |
return wasEventProcessed; | |
} | |
private void setSmS1OrthogonalRegion1OrthogonalRegion1(SmS1OrthogonalRegion1OrthogonalRegion1 aSmS1OrthogonalRegion1OrthogonalRegion1) | |
{ | |
smS1OrthogonalRegion1OrthogonalRegion1 = aSmS1OrthogonalRegion1OrthogonalRegion1; | |
if (smS1OrthogonalRegion1 != SmS1OrthogonalRegion1.orthogonalRegion1 && aSmS1OrthogonalRegion1OrthogonalRegion1 != SmS1OrthogonalRegion1OrthogonalRegion1.Null) { setSmS1OrthogonalRegion1(SmS1OrthogonalRegion1.orthogonalRegion1); } | |
// entry actions and do activities | |
switch(smS1OrthogonalRegion1OrthogonalRegion1) | |
{ | |
case o1Final: | |
// Check if orthogonalRegion2 is in its final state o2Final | |
// If it is, we can delete the entire state machine | |
if (smS1OrthogonalRegion2OrthogonalRegion2 == SmS1OrthogonalRegion2OrthogonalRegion2.o2Final) { | |
delete(); | |
} | |
break; | |
} | |
} | |
#### | |
SCENARIO 3 | |
Event "completeO2" occurs | |
#### | |
- similar to SCENARIO 2 | |
- when orthogonalRegion2 is set to o2Final, we check if orthogonalRegion1 is in o1Final | |
#### | |
SCENARIO 4 | |
Event "goToS2" occurs and then "completeS2" | |
#### | |
- exit state "s1" | |
- we enter "s2" and it's set to its inital state s2Start | |
- when completeS2 occurs, we exit s2Start, and set s2 to s2Final | |
- since s2 is not a concurrent state machine (has no orthogonal regions), we can delete the entire state machine | |
public boolean completeS2() | |
{ | |
boolean wasEventProcessed = false; | |
SmS2 aSmS2 = smS2; | |
switch (aSmS2) | |
{ | |
case s2Start: | |
exitSmS2(); | |
setSmS2(SmS2.s2Final); | |
wasEventProcessed = true; | |
break; | |
default: | |
// Other states do respond to this event | |
} | |
return wasEventProcessed; | |
} | |
private void setSmS2(SmS2 aSmS2) | |
{ | |
smS2 = aSmS2; | |
if (sm != Sm.s2 && aSmS2 != SmS2.Null) { setSm(Sm.s2); } | |
// entry actions and do activities | |
switch(smS2) | |
{ | |
case s2Final: | |
// We are *not* in state s1 | |
// s2 is not a concurrent state (has no orthogonal regions) | |
// Therefore, we can now delete the entire state machine | |
delete(); | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment