示例#1
0
文件: fsm.go 项目: stianlaa/SLH2016
func FsmOnOrderReceived(btnFloor int, btnType ButtonType) { //should be made to orderReceived
	switch E.Behaviour {
	case DOOROPEN:
		if E.Floor == btnFloor {
			TimerStart()
		} else {
			E.MasterOrders[btnFloor][btnType] = true
		}
	case IDLE:
		E.MasterOrders[btnFloor][btnType] = true
		E.Dir = ChooseDirection(E)

		if E.Dir == STOP {
			driver.ElevSetDoorLight(true)
			E = ClearOrdersAtFloor(E)
			TimerStart()
			E.Behaviour = DOOROPEN
		} else {
			driver.ElevSetMotorDirection(int(E.Dir))
			E.Behaviour = MOVING
		}
	case MOVING:
		E.MasterOrders[btnFloor][btnType] = true
	}
	SetAllLights(E)
}
示例#2
0
func fsm_onNewActiveRequest(btn_floor int, btn_type Button) {
	switch elevator.Behaviour {
	case EB_DoorOpen:
		if elevator.Floor == btn_floor {
			timer_start(3000 * time.Millisecond)
		} else {
			elevator.Requests[btn_floor][btn_type] = true
		}
		break
	case EB_Moving:
		elevator.Requests[btn_floor][btn_type] = true
		break
	case EB_Idle:
		elevator.Requests[btn_floor][btn_type] = true
		elevator.Dir = requests_chooseDirection(elevator)
		if elevator.Dir == D_Idle {
			Driver.ElevSetDoorLight(true)
			elevator = requests_clearAtCurrentFloor(elevator)
			timer_start(3000 * time.Millisecond)
			elevator.Behaviour = EB_DoorOpen
		} else {
			Driver.ElevSetMotorDirection(int(elevator.Dir))
			elevator.Behaviour = EB_Moving
			lastFloorTime = time.Now().Unix()
		}
		break
	}
	setAllLights()
}
示例#3
0
文件: fsm.go 项目: stianlaa/SLH2016
func FsmOnDoorTimeout() {
	if E.Behaviour == DOOROPEN {
		E.Dir = ChooseDirection(E)
		driver.ElevSetDoorLight(false)
		driver.ElevSetMotorDirection(int(E.Dir))
		if E.Dir == STOP {
			E.Behaviour = IDLE
		} else {
			E.Behaviour = MOVING
		}
	}
}
示例#4
0
文件: fsm.go 项目: stianlaa/SLH2016
func FsmOnFloorArrival(newFloor int) {
	E.Floor = newFloor

	driver.ElevSetFloorIndicator(newFloor)

	if ShouldStop(E) && E.Behaviour == MOVING {
		driver.ElevSetMotorDirection(int(STOP))
		driver.ElevSetDoorLight(true)
		E = ClearOrdersInDirection(E)
		TimerStart()
		SetAllLights(E)
		E.Behaviour = DOOROPEN
	}
}
示例#5
0
func fsm_onDoorTimeout() {
	switch elevator.Behaviour {
	case EB_DoorOpen:
		elevator.Dir = requests_chooseDirection(elevator)
		Driver.ElevSetMotorDirection(int(elevator.Dir))
		Driver.ElevSetDoorLight(false)
		if elevator.Dir == D_Idle {
			elevator.Behaviour = EB_Idle
		} else {
			elevator.Behaviour = EB_Moving
			lastFloorTime = time.Now().Unix()
		}
		break
	default:
		break
	}
}
示例#6
0
func fsm_onFloorArrival(newFloor int) {
	lastFloorTime = time.Now().Unix()
	elevator.Floor = newFloor
	Driver.ElevSetFloorIndicator(newFloor)
	switch elevator.Behaviour {
	case EB_Moving:
		if requests_shouldStop(elevator) {
			Driver.ElevSetMotorDirection(int(D_Idle))
			Driver.ElevSetDoorLight(true)
			elevator = requests_clearAtCurrentFloor(elevator)
			timer_start(3000 * time.Millisecond)
			setAllLights()
			elevator.Behaviour = EB_DoorOpen
		}
		break
	default:
		break
	}
}