abstract final Feature
abstract final FeatureModel
WinFeatures : FeatureModel
manualUpDown : Feature
express : Feature ?
pinchProtection : Feature ?
abstract final Component
abstract Port
abstract final Command
abstract State
abstract final StateMachine
motorUp : Command
motorStop : Command
motorDown : Command
abstract WinMotor : Component
cmd : Port -> Command
abstract final UserRequest
up : UserRequest
expressUp : UserRequest ?
stop : UserRequest
down : UserRequest
[ express <=> expressUp ]
[ pinchProtection <=> pinchDetector ]
abstract WinController : Component
motor : WinMotor
pinchDetector : Component ?
req : Port -> UserRequest ?
endOfTravel : Port ?
objectDetected : Port ?
[ lone req, endOfTravel, objectDetected ]
[ always req = stop between req = down and req = up ]
[ always req = stop between req = up and req = down ]
[ always req = up between req = stop and req = expressUp ]
[ always req = expressUp => next no req ]
final xor WinStates : StateMachine
xor movingUp : State
[ req = down --> movingDown ]
[ req = up --> movingUp ]
initial basic : State
[ req = stop --> stopped ]
movingUpX : State
[ this -[objectDetected]--> stopped ]
initial xor stopped : State
closed : State
[ req = down --> movingDown ]
[ req = up || req = stop --> closed ]
partlyOpen : State
[ req = up --> movingUp ]
[ req = down --> movingDown ]
[ req = stop --> partlyOpen ]
open : State
[ req = up --> movingUp ]
[ req = down || req = stop --> open ]
movingDown : State
[ req = up --> movingUp ]
[ endOfTravel --> open ]
[ req = stop --> stopped ]
[ req = down --> movingDown ]
[ no pinchProtection => no objectDetected ]
WinCtrWithContChime : WinController ?
chime : Port ?
[ movingUpX <=> chime ]
WinCtrWithChime : WinController ?
chime : Port ?
[ no movingUpX => no chime ]
[ chime --> no chime ]
[ no chime && movingUpX --> movingUpX => chime ]
abstract ChimingStrategy
active : State ?
audible : State ?
NoChiming : ChimingStrategy
[ not audible ]
Continuous : ChimingStrategy
[ active => audible ]
Intermittent : ChimingStrategy
[ audible --> not audible ]
[ not audible --> active => audible ]
WinControllerStrategies : WinController ?
chime : Port ?
strategy -> ChimingStrategy
[ strategy.active <=> movingUpX ]
[ strategy.active.audible <=> chime ]
[ WinControllerStrategies.strategy = Intermittent ]
wc1 : WinController
assert [ initially wc1.WinStates.stopped.closed && wc1.req = down --> wc1.WinStates.movingDown -->> wc1.req = expressUp --> wc1.WinStates.movingUp.movingUpX --> wc1.objectDetected --> wc1.WinStates.stopped ]
wc2 : WinController
assert [ sometime wc2.WinStates.stopped.closed -->> wc2.WinStates.stopped.partlyOpen -->> wc2.WinStates.stopped.open ]
wc3 : WinController
assert [ never wc3.req = down --> wc3.WinStates.stopped.closed ]
wc4 : WinController
assert [ never wc4.WinStates.stopped.closed && wc4.motor.cmd = motorUp ]
wc5 : WinController
assert [ never wc5.objectDetected --> wc5.WinStates.movingUp ]