Skip to content
This repository was archived by the owner on Jun 8, 2020. It is now read-only.

Commit

Permalink
Reset HallOrders on floorReached and ButtonCommand
Browse files Browse the repository at this point in the history
  • Loading branch information
andersliland committed Mar 14, 2017
1 parent 16e568f commit 88756b7
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 52 deletions.
2 changes: 1 addition & 1 deletion backupElevator
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[true,false,false,false]
[false,false,false,false]
18 changes: 18 additions & 0 deletions control/elevatorControl.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ func MessageLoop(
HallOrderMatrix [NumFloors][2]HallOrder,
localIP string) {

var orderTimeout = OrderTimeout * time.Second

floorReached := make(chan int)
go eventManager(newOrder, broadcastOrderChannel, broadcastBackupChannel, floorReached, lightChannel, motorChannel, localIP)
time.Sleep(1 * time.Second)
Expand Down Expand Up @@ -56,6 +58,9 @@ func MessageLoop(
if err := SaveBackup("backupElevator", ElevatorStatus[localIP].CabOrders); err != nil {
log.Println("[elevatorControl]\t Save Backup failed: ", err)
}
resetTimerForAllAssignedOrders(orderTimeout, localIP) // reset timer on Cabbutton spamming
fmt.Printf(ColorGreen)
log.Println("[elevatorControl]\t CabOrder "+ButtonType[button.Kind]+"\ton floor "+strconv.Itoa(button.Floor+1), ColorNeutral)
newOrder <- true

case ButtonStop:
Expand All @@ -72,6 +77,7 @@ func MessageLoop(
floorReached <- floor
fmt.Print(ColorYellow)
log.Println("[elevatorControl]\t Elevator "+localIP+" reached floor "+strconv.Itoa(floor+1), ColorNeutral)
resetTimerForAllAssignedOrders(orderTimeout, localIP)
}
}
}
Expand Down Expand Up @@ -106,6 +112,18 @@ func setPanelLights(lightChannel chan ElevatorLight, localIP string) {
}
}

func resetTimerForAllAssignedOrders(orderTimeout time.Duration, ip string) {
// reset timer for all order AssignetTo == localIP
for f := 0; f < NumFloors; f++ {
for k := ButtonCallUp; k <= ButtonCallDown; k++ {
if HallOrderMatrix[f][k].AssignedTo == ip {
HallOrderMatrix[f][k].Timer.Reset(orderTimeout)
log.Println("[systemControl]\t Reset timer on order " + ButtonType[k] + " at floor " + strconv.Itoa(f+1))
}
}
}
}

func printElevatorControl(s string) {
if debugElevatorControl {
log.Println("[elevatorControl]\t", s)
Expand Down
76 changes: 30 additions & 46 deletions control/systemControl.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ func SystemControl(
executeOrderChannel chan<- OrderMessage,
localIP string) {

r := rand.New(rand.NewSource(time.Now().UnixNano()))

const watchdogKickTime = 100 * time.Millisecond
const watchdogLimit = 3*watchdogKickTime + 10*time.Millisecond
const ackTimeLimit = 500 * time.Millisecond

r := rand.New(rand.NewSource(time.Now().UnixNano()))
var orderTimeout = OrderTimeout*time.Second + time.Duration(r.Intn(2000))*time.Millisecond // random timeout to prevent all elevator from timing out at the same time

// Timers
Expand Down Expand Up @@ -75,41 +75,37 @@ func SystemControl(
ElevatorStatus[backup.ResponderIP] = ResolveElevator(backup.State)
}
updateOnlineElevators(ElevatorStatus, OnlineElevators, localIP, watchdogLimit)

case EventElevatorBackup:

case EventRequestBackup:
if backup.AskerIP != localIP { // TODO change to !=
//printSystemControl("Received an EventRequestBackup from " + backup.AskerIP)
if _, ok := ElevatorStatus[backup.AskerIP]; ok {
broadcastBackupChannel <- BackupMessage{
AskerIP: backup.AskerIP,
ResponderIP: localIP,
Event: EventBackupReturned,
State: *ElevatorStatus[backup.AskerIP],
HallOrderMatrix: HallOrderMatrix,
/*
case EventElevatorBackup:
case EventRequestBackup:
if backup.AskerIP != localIP {
if _, ok := ElevatorStatus[backup.AskerIP]; ok {
broadcastBackupChannel <- BackupMessage{
AskerIP: backup.AskerIP,
ResponderIP: localIP,
Event: EventBackupReturned,
State: *ElevatorStatus[backup.AskerIP],
HallOrderMatrix: HallOrderMatrix,
}
//printSystemControl("Broadcasting elevator state from elevator " + localIP)
} else {
log.Println("[systemControl]\t No stored state for elevator " + backup.AskerIP)
}
}
//printSystemControl("Broadcasting elevator state from elevator " + localIP)
} else {
log.Println("[systemControl]\t No stored state for elevator " + backup.AskerIP)
}
}

// Restore state of elevator
case EventBackupReturned:
printSystemControl("Received EventBackupReturned from " + backup.ResponderIP)
if backup.AskerIP == localIP {
//ElevatorStatus[localIP] ResolveElevator()
log.Printf("[systemControl]\t Received EventBackupReturned requested by me")
} else {
log.Printf("[systemControl]\t Received EventBackupReturned NOT requested by me")
}
case EventBackupReturned:
printSystemControl("Received EventBackupReturned from " + backup.ResponderIP)
if backup.AskerIP == localIP {
//ElevatorStatus[localIP] ResolveElevator()
log.Printf("[systemControl]\t Received EventBackupReturned requested by me")
} else {
log.Printf("[systemControl]\t Received EventBackupReturned NOT requested by me")
}
*/
default:
log.Println("[systemControl]\tReceived invalid BackupMessage from", backup.ResponderIP)
//log.Println("[systemControl]\tReceived invalid BackupMessage from", backup.ResponderIP)
}

// Order
case order := <-receiveOrderChannel:
//printSystemControl("Received an " + EventType[order.Event] + " from " + order.SenderIP + " with OriginIP " + order.OriginIP)
switch order.Event {
Expand Down Expand Up @@ -266,14 +262,14 @@ func SystemControl(
}

case EventAckOrderCompleted: // delete order from matrix and timer functions
//printSystemControl("case: EventAckOrderCompleted")
printSystemControl("case: EventAckOrderCompleted")
HallOrderMatrix[order.Floor][order.ButtonType].ConfirmedBy[order.SenderIP] = true
if allElevatorsHaveAcked(OnlineElevators, HallOrderMatrix, order) {
fmt.Printf(ColorBlue)
log.Println("[systemControl]\t Order "+ButtonType[order.ButtonType]+"\ton floor "+strconv.Itoa(order.Floor+1)+" is completed and ack'ed by all", ColorNeutral)
HallOrderMatrix[order.Floor][order.ButtonType].StopTimer() // stop ackTimeout timer
HallOrderMatrix[order.Floor][order.ButtonType].ClearConfirmedBy() // ConfirmedBy map an inner map (declared inside struct, and not initialized)
resetTimerForAllAssignedOrders(order.Floor, orderTimeout, order.AssignedTo)
//resetTimerForAllAssignedOrders(order.Floor, orderTimeout, order.AssignedTo)
}

case EventReassignOrder:
Expand Down Expand Up @@ -389,18 +385,6 @@ func allElevatorsHaveAcked(OnlineElevators map[string]bool, HallOrderMatrix [Num
return true
}

func resetTimerForAllAssignedOrders(floor int, orderTimeout time.Duration, ip string) {
// reset timer for all order AssignetTo == localIP
for f := 0; f < NumFloors; f++ {
for k := ButtonCallUp; k <= ButtonCallDown; k++ {
if HallOrderMatrix[f][k].AssignedTo == ip {
HallOrderMatrix[f][k].Timer.Reset(orderTimeout)
log.Println("[systemControl]\t Reset timer on order " + ButtonType[k] + " at floor " + strconv.Itoa(f+1))
}
}
}
}

func restartElevator() {
fmt.Print(ColorRed)
log.Println("\t\t -----RESTARTING ELEVATOR-----", ColorNeutral)
Expand Down
5 changes: 1 addition & 4 deletions orders/cost.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ import (

const debugCost = false

const timeBetweenFloor = 2 //seconds //TODO: time and test1
const timeAtFloor = 3 //seconds //TODO: update at the end

type orderCost struct {
Cost int
IP string
Expand All @@ -35,7 +32,7 @@ func AssignOrderToElevator(Floor int, Kind int,

for ip, _ := range OnlineElevators { // key, value
floorCount, stopCount := calculateOrderCost(ip, Floor, Kind, ElevatorStatus[ip])
cost_num := floorCount*timeBetweenFloor + stopCount*timeAtFloor
cost_num := floorCount*TimeBetweenFloors + stopCount*DoorOpenTime
cost = append(cost, orderCost{cost_num, ip})
printCost("Cost of order is " + strconv.Itoa(cost_num) + " for IP: " + ip)
printCost("floorCount: " + strconv.Itoa(floorCount) + " stopCount: " + strconv.Itoa(stopCount))
Expand Down
5 changes: 4 additions & 1 deletion utilities/typedef.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ const debug = false
const NumElevators = 3
const NumButtons = 3
const NumFloors = 4
const OrderTimeout = 10 //seconds

const TimeBetweenFloors = 3
const DoorOpenTime = 3
const OrderTimeout = DoorOpenTime + TimeBetweenFloors

var HallOrderMatrix [NumFloors][2]HallOrder
var ElevatorStatus = make(map[string]*Elevator) // containing last known state
Expand Down

0 comments on commit 88756b7

Please sign in to comment.