Example: Model Train Controller.: © 2005 ECNU SEI Principles of Embedded Computing System Design 1
Example: Model Train Controller.: © 2005 ECNU SEI Principles of Embedded Computing System Design 1
rcvr motor
power
supply
console
set-speed speed
(positive/negative)
set-inertia inertia-value (non-
negative)
estop none
:console :train_rcvr
set-inertia
set-speed
set-speed
estop
set-speed
command
1..n: command
:console :receiver
Console:
read state of front panel;
format messages;
transmit messages.
Train:
receive message;
interpret message;
control the train.
console
1 1
1 1 1
1
panel formatter transmitter
1 1
1 1
Knobs* sender*
1 1..t
1 1
train
1 1 motor
receiver interface
1 1
1 controller 1
1 1
detector* pulser*
v duty
cycle +
V
t -
knobs* pulser*
train-knob: integer pulse-width: unsigned-
speed-knob: integer integer
inertia-knob: unsigned- direction: boolean
integer
emergency-stop: boolean
sender* detector*
set-knobs()
send-bit() read-bit() : integer
panel motor-interface
speed: integer
train-number() : integer
speed() : integer
inertia() : integer
estop() : boolean
new-settings()
transmitter receiver
current: command
send-speed(adrs: integer, new: boolean
speed: integer)
send-inertia(adrs: integer, read-cmd()
val: integer) new-cmd() : boolean
set-estop(adrs: integer) rcv-type(msg-type:
command)
rcv-speed(val: integer)
rcv-inertia(val:integer)
formatter
current-train: integer
current-speed[ntrains]: integer
current-inertia[ntrains]:
unsigned-integer
current-estop[ntrains]: boolean
send-command()
panel-active() : boolean
operate()
settings send-command
read
panel
panelsettings send-speed,
change in send-inertia.
train number read panel send-estop
panel settings
set-knobs new-settings
update-panel()
new train number
panel-active()
idle
other send-command()
T current-train = train-knob
panel*:read-train() update-screen
changed = true
F
T
panel*:read-speed() current-speed = throttle
changed = true
F
... ...
© 2005 ECNU SEI Principles of Embedded Computing System Design 30
Controller class
controller
current-train: integer
current-speed[ntrains]: integer
current-direction[ntrains]: boolean
current-inertia[ntrains]:
unsigned-integer
operate()
issue-command()
set-pulse
set-pulse
issue-command()