11
11/5 - 2007 1 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

Embed Size (px)

Citation preview

Page 1: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

11/5 - 2007 1

VIP Elevator – first model

A VDM++ Project

Made By: Sune Wolff

Page 2: 11/5 - 20071 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.

Page 3: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 4: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 5: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

11/5 - 2007 5

Environment

class Environment

instance variablesprivate elevator : Elevator;

operationspublic Environment: (nat) ==> Environment

Environment(max) ==(elevator := new Elevator(max););

end Environment

Page 6: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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>;

Page 7: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 8: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 9: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 10: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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

Page 11: 11/5 - 20071 VIP Elevator – first model A VDM++ Project Made By: Sune Wolff

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