//Initialization function func elevatorModuleInit() { elevatorMatrix = make(map[string]control.ElevatorNode) matrixBeingHandled = make(map[string]control.ElevatorNode) for i := 0; i < driver.N_BUTTONS; i++ { for j := 0; j < driver.N_FLOORS; j++ { lightArray[i][j] = 0 } } for i := 0; i < 2; i++ { for j := 0; j < driver.N_FLOORS; j++ { orderArray[i][j] = false } } driver.Elev_init() floor := getCurrentFloor() for floor == -1 { setDirection(driver.DIRN_DOWN) floor = getCurrentFloor() } setDirection(driver.DIRN_STOP) currentFloor = floor driver.Elev_set_floor_indicator(currentFloor) currentDirection = Still }
//Light functions func setLights(lightArray [driver.N_BUTTONS][driver.N_FLOORS]int) { driver.Elev_set_floor_indicator(currentFloor) for i := 0; i < driver.N_BUTTONS; i++ { for j := 0; j < driver.N_FLOORS; j++ { driver.Elev_set_button_lamp(driver.Elev_button_type_t(i), j, lightArray[i][j]) } } }
func readChannels(ch fsm.Channels) { buttonChan := getButtons() for { select { case dir := <-ch.MotorDir: driver.Elev_set_motor_direction(dir) case doorLight := <-ch.DoorLight: driver.Elev_set_door_open_lamp(doorLight) case floor := <-ch.NewFloor: driver.Elev_set_floor_indicator(floor) case buttonPressed := <-buttonChan: switch buttonPressed.Button { case def.BUTTON_COMMAND: queue.SetLocalOrder(buttonPressed) case def.BUTTON_DOWN, def.BUTTON_UP: cost.ChooseElevator(onlineLifts, buttonPressed, true) } //Incoming messages case tcpMessage := <-incomingTcpMsg: switch tcpMessage.Type { case def.ORDER: queue.SetLocalOrder(tcpMessage.Order) case def.UPDATEREMOTELIGHT: def.SyncLight <- tcpMessage.Order ch.OrderTimerReset <- true } case message := <-incomingMsg: handleMsg(ch, message) //Outgoing messages case button := <-def.SyncRemoteLights: for i := range onlineLifts { if i == def.LocalElevator.Addr { def.SyncLight <- button } else { go network.TcpConnect(i, def.TcpPort, def.TcpMessage{Type: def.UPDATEREMOTELIGHT, Order: button}) } } //Handles if motor stops working case <-ch.OrderTimerTimeout: for f := 0; f < def.N_FLOORS; f++ { for b := 0; b < def.BUTTON_COMMAND; b++ { if def.LocalElevator.Orders[f][b] { cost.ChooseElevator(onlineLifts, def.ButtonPress{b, f, true, def.LocalElevator.Addr}, false) } } } } } }