Upload
lynne-lambert
View
218
Download
0
Embed Size (px)
Citation preview
11/5 - 2007 1
VIP Elevator – first model
A VDM++ Project
Made By: Sune Wolff
11/5 - 2007 2
System Summary
VIP and neighbours share elevator. Elevator moves between 5 floors. Call buttons used to call elevator. VIP has door sensor installed Turnstiles can be used to restrict
access to the neighbours. VIP do not like to share the
elevator. VIP do not like to wait to long.
11/5 - 2007 3
Class DiagramWorld
<<operation>> Run()<<operation>> World()
Queue
<<instance variable>> VipQueue : Elevator`Floor<<instance variable>> VipInQueue : bool = false<<instance variable>> maxInQueue : nat<<instance variable>> elevatorQueue : seq of Elevator`Floor = []
<<operation>> GetNextFromQueue()<<operation>> PutInQueue()<<operation>> Queue()<<operation>> QueueEmpty()<<operation>> QueueFul l ()
Turnsti le
<<instance variable>> locked : bool
<<operation>> LockTurnstile()<<operation>> UnlockTurnsti le()<<operation>> IsTurnsti leLocked()<<operation>> Turnstile()
Environment
<<operation>> Environment()
-environment
Elevator
<<instance variable>> currentFloor : Floor = <zero><<instance variable>> maxUsersInside : nat<<instance variable>> numVipInside : nat = 0<<instance variable>> numNeighboursInside : nat = 0
<<operation>> Elevator()<<operation>> MoveElevator()<<operation>> VipExit()<<operation>> VipEnter()<<operation>> NeighbourExit()<<operation>> NeighbourEnter()<<operation>> PushOuterButton()<<operation>> ActivateSensor()<<operation>> PushInnerButton()
-innerQueue -outerQueue
-tsControl ler -elevator
11/5 - 2007 4
World
class World
instance variablesprivate environment : Environment;
operationspublic World: () ==> World
World() ==(environment := new Environment(5););
public Run: () ==> ()Run() ==
is not yet specified;end World
11/5 - 2007 5
Environment
class Environment
instance variablesprivate elevator : Elevator;
operationspublic Environment: (nat) ==> Environment
Environment(max) ==(elevator := new Elevator(max););
end Environment
11/5 - 2007 6
Elevator
instance variablesprivate currentFloor : Floor := <zero>;private numNeighboursInside : nat := 0;private numVipInside : nat := 0;private maxUsersInside : nat;private innerQueue : Queue := new Queue(3);private outerQueue : Queue := new Queue(3);private tsController : Turnstile := new Turnstile(false);
typespublic Floor = <zero> | <one> | <two> | <three> | <four>;public VipFloor = <zero> | <four>;public User = <vip> | <neighbour>;
11/5 - 2007 7
Queue
instance variablesprivate elevatorQueue : seq of Elevator`Floor := [];private maxInQueue: nat;private VipQueue : Elevator`Floor;public VipInQueue : bool := false;
public PutInQueue: Elevator`Floor * Elevator`User ==> ()PutInQueue(f, u) ==
(if (u = <vip>)then (VipInQueue := true;
VipQueue := f)else (elevatorQueue := elevatorQueue ^ [f]);)
pre (len elevatorQueue < maxInQueue)post (len elevatorQueue = len elevatorQueue~ + 1);
Notice the use of sequence
concatenation
11/5 - 2007 8
Queue
public GetNextFromQueue: () ==> Elevator`FloorGetNextFromQueue() ==
(dcl tempQueue : Elevator`Floor;if (len elevatorQueue = 0 and VipInQueue =
true)then return VipQueue;
if (VipInQueue = false)then (tempQueue := elevatorQueue(1);
elevatorQueue := tl elevatorQueue);return tempQueue;)
pre (len elevatorQueue > 0) or (VipInQueue = true)post (len elevatorQueue = len elevatorQueue~ - 1);
Notice use of sequence tail
operator
11/5 - 2007 9
Turnstile
class Turnstile
instance variablesprivate locked : bool;
operationspublic Turnstile: bool ==> Turnstile
Turnstile(l) == (locked := l);
public IsTurnstileLocked: () ==> boolIsTurnstileLocked() == (return locked);
public LockTurnstile: () ==> ()LockTurnstile () == (locked := true)pre locked = falsepost locked = true;
public UnlockTurnstile: () ==> ()UnlockTurnstile () == (locked := false)pre locked = truepost locked = false;
end Turnstile
11/5 - 2007 10
Class DiagramWorld
<<operation>> Run()<<operation>> World()
Queue
<<instance variable>> VipQueue : Elevator`Floor<<instance variable>> VipInQueue : bool = false<<instance variable>> maxInQueue : nat<<instance variable>> elevatorQueue : seq of Elevator`Floor = []
<<operation>> GetNextFromQueue()<<operation>> PutInQueue()<<operation>> Queue()<<operation>> QueueEmpty()<<operation>> QueueFul l ()
Turnsti le
<<instance variable>> locked : bool
<<operation>> LockTurnstile()<<operation>> UnlockTurnsti le()<<operation>> IsTurnsti leLocked()<<operation>> Turnstile()
Environment
<<operation>> Environment()
-environment
Elevator
<<instance variable>> currentFloor : Floor = <zero><<instance variable>> maxUsersInside : nat<<instance variable>> numVipInside : nat = 0<<instance variable>> numNeighboursInside : nat = 0
<<operation>> Elevator()<<operation>> MoveElevator()<<operation>> VipExit()<<operation>> VipEnter()<<operation>> NeighbourExit()<<operation>> NeighbourEnter()<<operation>> PushOuterButton()<<operation>> ActivateSensor()<<operation>> PushInnerButton()
-innerQueue -outerQueue
-tsControl ler -elevator
11/5 - 2007 11
Future Improvements
Introduce classes for buttons and sensors Make use of mapping
Make elevator more intelligent Keep track of direction Choose next floor based on direction and distance
Introduce automatic test Read test sequence from file
Make sure the VIP receives special treatment No neighbours in elevator when VIP wants to use it Execute VIP order as soon as possible