// safeKill turns the motor off if the program is killed with CTRL+C. func safeKill() { var c = make(chan os.Signal) signal.Notify(c, os.Interrupt) <-c driver.Elev_set_motor_direction(def.DIR_STOP) log.Fatal(def.ColR, "User terminated program.", def.ColN) }
//Elevator movement functions func setDirection(direction driver.Elev_motor_direction_t) { driver.Elev_set_motor_direction(direction) if direction != driver.DIRN_STOP { isMoving = true } else { isMoving = false } }
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) } } } } } }