|What: | '''oomoore''' package|
|Where: | http://repos.modelrealization.com/cgi-bin/fossil/mrtools/doc/tip/oomoore/wiki/intro.wiki <
> http://chiselapp.com/user/mangoa01/repository/mrtools/doc/tip/oomoore/wiki/intro.wiki|
|Description: | The '''oomoore''' package defines a [TclOO] meta-class which can be used to create a state model class with specified state model behavior.|
This package is a rework of the http://repos.modelrealization.com/cgi-bin/fossil/mrtools/doc/tip/moore/wiki/intro.wiki%|%moore%|% package to use new Tcl 8.6
object oriented capabilites.
----
Here's an example of a simple two state pump from a question that came up on C.L.T.
======
package require Tcl 8.6
# See http://repos.modelrealization.com/cgi-bin/fossil/mrtools
# to obtain the "oomoore" package.
package require oomoore
# This class embodies all the state behavior.
oomoore model create ::pump_operation {
initialState PumpOff
state PumpOff {} {
chan puts "[self] is now off"
}
transition PumpOff - BelowLower -> PumpOn
transition PumpOff - WithinLimits -> IG
transition PumpOff - AboveUpper -> IG
state PumpOn {} {
chan puts "[self] is now on"
}
transition PumpOn - BelowLower -> IG
transition PumpOn - WithinLimits -> IG
transition PumpOn - AboveUpper -> PumpOff
}
# This class adds some variables and compares the new value of limits
# in order to signal the right event.
oo::class create ::reactorPump {
superclass ::pump_operation
constructor {{lower 10} {upper 100}} {
next
my variable lLimit
set lLimit $lower
my variable uLimit
set uLimit $upper
}
method evalConcentration {conc} {
my variable uLimit
my variable lLimit
if {$conc < $lLimit} {
my signal BelowLower
} elseif {$conc > $uLimit} {
my signal AboveUpper
} else {
my signal WithinLimits
}
}
}
# Create an object
reactorPump create pump1
# We want to see the trace
pump1 loglevel info
puts "Initial state: [pump1 currentstate]"
# This sequence just increments a variable to show
# how an asychronous measurement would be reported into
# the "::pump1" object. Here, every second a new concentration is
# fed in.
set conc 0
proc raiseConcentration {who value} {
global conc
$who evalConcentration $conc
incr conc $value
if {$conc > 100} {
set value -20
} elseif {$conc <= 0} {
set ::done 1
}
after 1000 [list raiseConcentration $who $value]
}
# Kick things off
raiseConcentration ::pump1 20
set ::done 0
vwait ::done
======
<> Package | Design