Skip to content

Instantly share code, notes, and snippets.

@jblang94
Last active March 25, 2017 06:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jblang94/ba28320e4075c1faee5941865c2d51e0 to your computer and use it in GitHub Desktop.
Save jblang94/ba28320e4075c1faee5941865c2d51e0 to your computer and use it in GitHub Desktop.
Finalizing details for issue 140
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