Пример #1
0
//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
}
Пример #2
0
//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])
		}
	}
}
Пример #3
0
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)
					}
				}
			}
		}
	}
}