VIP Elevator

VIP Elevator – first model
A VDM++ Project
Made By: Sune Wolff
11/5 - 2007
1
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
2
Class Diagram
11/5 - 2007
3
World
class World
instance variables
private environment
: Environment;
operations
public World: () ==> World
World() ==
(environment := new Environment(5);
);
public Run: () ==> ()
Run() ==
is not yet specified;
end World
11/5 - 2007
4
Environment
class Environment
instance variables
private elevator
: Elevator;
operations
public Environment: (nat) ==> Environment
Environment(max) ==
(elevator := new Elevator(max);
);
end Environment
11/5 - 2007
5
Elevator
instance variables
private currentFloor
private numNeighboursInside
private numVipInside
private maxUsersInside
private innerQueue
private outerQueue
private tsController
: Floor := <zero>;
: nat := 0;
: nat := 0;
: nat;
: Queue := new Queue(3);
: Queue := new Queue(3);
: Turnstile := new Turnstile(false);
types
public Floor = <zero> | <one> | <two> | <three> | <four>;
public VipFloor = <zero> | <four>;
public User = <vip> | <neighbour>;
11/5 - 2007
6
Queue
instance variables
private elevatorQueue
private maxInQueue
private VipQueue
public VipInQueue
: seq of Elevator`Floor := [];
: nat;
: Elevator`Floor;
: 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);
11/5 - 2007
Notice the use
of sequence
concatenation
7
Queue
public GetNextFromQueue: () ==> Elevator`Floor
GetNextFromQueue() ==
(dcl tempQueue : Elevator`Floor;
if (len elevatorQueue = 0 and VipInQueue = true)
then return VipQueue;
Notice use of
sequence tail
operator
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);
11/5 - 2007
8
Turnstile
class Turnstile
instance variables
private locked
: bool;
operations
public Turnstile: bool ==> Turnstile
Turnstile(l) == (locked := l);
public IsTurnstileLocked: () ==> bool
IsTurnstileLocked() == (return locked);
public LockTurnstile: () ==> ()
LockTurnstile () == (locked := true)
pre locked = false
post locked = true;
public UnlockTurnstile: () ==> ()
UnlockTurnstile () == (locked := false)
pre locked = true
post locked = false;
end Turnstile
11/5 - 2007
9
Class Diagram
11/5 - 2007
10
Future Improvements

Introduce classes for buttons and sensors


Make elevator more intelligent



Keep track of direction
Choose next floor based on direction and distance
Introduce automatic test


Make use of mapping
Read test sequence from file
Make sure the VIP receives special treatment


11/5 - 2007
No neighbours in elevator when VIP wants to use it
Execute VIP order as soon as possible
11