private void CheckMovementRequestedAndAllowed()
 {
     if (doorState == DoorStateType.Closed && IsToggleRequest)
     {
         doorState         = DoorStateType.Opening;
         displacedPosition = transform.position;
     }
     else if (doorState == DoorStateType.Open && IsToggleRequest)
     {
         doorState         = DoorStateType.Closing;
         displacedPosition = transform.position;
     }
 }
 private void CheckMovementCompleted()
 {
     if (doorState == DoorStateType.Opening && currentDisplacement >= maxDisplacement)
     {
         IsToggleRequest     = false;
         doorState           = DoorStateType.Open;
         currentDisplacement = 0;
     }
     else if (doorState == DoorStateType.Closing && currentDisplacement >= maxDisplacement)
     {
         IsToggleRequest     = false;
         doorState           = DoorStateType.Closed;
         currentDisplacement = 0;
     }
 }
Esempio n. 3
0
        public void ToggleDoor()
        {
            // if we're already in process
            if (_operatingDoor)
            {
                return;
            }

            // update from physical so we don't break things
            _doorState = PhysicalState;

            Debug.Print("DoorController.ToggleDoor, current state: " + _doorState.ToString());

            if (_doorState == DoorStateType.Closed || _doorState == DoorStateType.Unknown)
            {
                OperateDoor(true);
            }
            else
            {
                OperateDoor(false);
            }
        }
Esempio n. 4
0
        public DoorController(IContinuousRotationServo doorServo, PushButton openEndStopSwitch, PushButton closeEndStopSwitch)
        {
            // instantiate all of our peripherals
            _doorServo          = doorServo;
            _openEndStopSwitch  = openEndStopSwitch;
            _closeEndStopSwitch = closeEndStopSwitch;

            // set our end stop trigger events
            _openEndStopSwitch.PressStarted += (s, e) => {
                _openEndStopTriggered = true; _doorState = DoorStateType.Open;
                Debug.Print("open end stop triggered");
            };
            _openEndStopSwitch.PressEnded    += (s, e) => { _openEndStopTriggered = false; };
            _closeEndStopSwitch.PressStarted += (s, e) => {
                _closeEndStopTriggered = true; _doorState = DoorStateType.Closed;
                Debug.Print("close end stop triggered");
            };
            _closeEndStopSwitch.PressEnded += (s, e) => { _closeEndStopTriggered = false; };

            // load our initial state from the physical state
            this._doorState = PhysicalState;
        }
Esempio n. 5
0
 internal void CopyFrom(AtsSimulationStates source)
 {
     _vehicleState = source._vehicleState;
     _doorState    = source._doorState;
 }
Esempio n. 6
0
 internal void SetDoorState(DoorStateType doorState)
 {
     _doorState = doorState;
 }
Esempio n. 7
0
        public void OperateDoor(bool open)
        {
            // if we're already in process
            // TODO: maybe we make this cancellable
            if (_operatingDoor)
            {
                return;
            }
            _operatingDoor = true;

            // spin up a new thread so we don't block anything.
            // this is especially important with the end stops.
            // without a new thread, we don't get those events. :D
            Thread th = new Thread(() =>
            {
                Debug.Print("OperateDoor: " + (open ? "open" : "close"));

                // open the door
                if (open)
                {
                    // rotate the winch servo until the end stop is triggered
                    while (!_openEndStopTriggered)
                    {
                        // rotate the winch servo in the open direction
                        _doorServo.Rotate(_openDirection, 0.9f);
                    }
                    // stop the winch
                    _doorServo.Stop();
                    Debug.Print("Open end stop hit.");

                    // update our door state
                    _doorState = DoorStateType.Open;

                    // raise our event
                    this.DoorOpened(this, new EventArgs());
                }
                else
                { // close the door
                  // rotate the winch servo until the end stop is triggered
                    while (!_closeEndStopTriggered)
                    {
                        // close
                        _doorServo.Rotate(_closeDirection, 0.75f);
                    }
                    // stop the winch
                    _doorServo.Stop();
                    Debug.Print("Open end stop hit.");

                    // update our door state
                    _doorState = DoorStateType.Closed;

                    // raise our event
                    this.DoorClosed(this, new EventArgs());
                }

                //
                _operatingDoor = false;
            });

            th.Start();
        }