//This function returns the next state for the elevator func Nextstate(myip string, elevators []extra.Elevator, mystate string) (string, []Network.Request) { if Elevator.GetElevObstructionSignal() { Elevator.SetElevStopLamp(1) return "ERROR", nil } else if mystate == "ERROR" { Elevator.SetElevStopLamp(0) return "INIT", nil } stop := Stop(myip, mystate) if len(stop) != 0 { return "DOOR_OPEN", stop } next := Nextrequest(myip, elevators) if Elevator.AtFloor() && next.Floor == Elevator.CurrentFloor() { return "DOOR_OPEN", append(stop, next) } if next.Floor > Elevator.CurrentFloor() { return "UP", nil } else if next.Floor < Elevator.CurrentFloor() && next.Floor != 0 { return "DOWN", nil } else if Elevator.AtFloor() { return "IDLE", nil } else { return mystate, nil } }
//This function return orders the elevator should stop for func Stop(myip string, mystate string) []Network.Request { var takerequest []Network.Request requestlist := Network.GetRequestList() for _, request := range requestlist { if (request.Direction == Elevator.BUTTON_COMMAND && request.Source == myip) || (request.Direction == Elevator.BUTTON_CALL_UP && mystate == "UP") || (request.Direction == Elevator.BUTTON_CALL_DOWN && mystate == "DOWN") { if request.Floor == Elevator.CurrentFloor() && Elevator.AtFloor() { takerequest = append(takerequest, request) } } } return takerequest }