Skip to content

Commit

Permalink
Updating state machine to a more practical syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
jim committed Sep 5, 2008
1 parent ea71a5e commit 03105ad
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 42 deletions.
47 changes: 13 additions & 34 deletions lowpro/state/radio.js
Expand Up @@ -2,41 +2,30 @@ var Radio = {};

Radio.definition = {
start: {
init: {
state: 'Stopped'
}
init: 'Stopped'
},

Stopped: {
enter: {
action: 'resetCounter'
enter: function() {
this.counter = 0;
this.updateCounter();
},
play: {
state: 'Playing'
}
play: 'Playing'
},

Paused: {
play: {
state: 'Playing'
},
stop: {
state: 'Stopped'
}
play: 'Playing',
stop: 'Stopped'
},

Playing: {
enter: {
action: 'startPlaying'
},
pause: {
state: 'Paused'
enter: function() {
this.interval = setInterval(function() { this.incrementCounter(); }.bind(this), 200);
},
stop: {
state: 'Stopped'
},
exit: {
action: 'stopPlaying'
pause: 'Paused',
stop: 'Stopped',
exit: function() {
clearInterval(this.interval);
}
}
};
Expand All @@ -52,16 +41,6 @@ Radio.events = {
Radio.machine = Behavior.create(State.behavior, {
definition: Radio.definition,
events: Radio.events,
resetCounter: function() {
this.counter = 0;
this.updateCounter();
},
startPlaying: function() {
this.interval = setInterval(function() { this.incrementCounter(); }.bind(this), 200);
},
stopPlaying: function() {
clearInterval(this.interval);
},
incrementCounter: function() {
this.counter += 1;
this.updateCounter();
Expand Down
23 changes: 15 additions & 8 deletions lowpro/state/state.js
Expand Up @@ -12,7 +12,7 @@ State.behavior = Behavior.create({
if (this.events[name].hasOwnProperty(selector)) {
if (event.element().match(selector)) {
event.stop();
this.handleEvent(this.events[name][selector]);
this.handleEvent(this.events[name][selector], event);
}
}
}
Expand All @@ -24,19 +24,26 @@ State.behavior = Behavior.create({
this.handleEvent('init');
},
handleEvent: function(eventName) {
var event = this.definition[this.state][eventName];
if (typeof(event) == 'object') {
if (typeof(event.action) === 'string') {
this[event.action]();
}
if(typeof(event.state) == 'string') this.changeState(event.state);
var args, event, newState;
args = Array.prototype.slice.call(arguments, 1);
if (this.definition[this.state] && this.definition[this.state][eventName]) {
event = this.definition[this.state][eventName];
if (typeof(event) !== 'undefined') {
if (typeof(event) === 'string') {
this.changeState(event);
} else if (typeof(event) == 'function') {
newState = event.apply(this, args);
if(typeof(newState) == 'string') this.changeState(newState);
}
}
}

},

changeState: function(newStateName) {
if (typeof(this.definition[this.state]) == 'undefined') throw "UndefinedState";
this.handleEvent('exit');
// console.log("setting state to " + newStateName);
console.log("setting state to " + newStateName);
this.state = newStateName;
this.handleEvent('enter');
}
Expand Down

0 comments on commit 03105ad

Please sign in to comment.