示例#1
0
        public void Connected(string deviceId, PositionControllerResponse status)
        {
            Id = deviceId;

            if (deviceId != null && this.positionController.IsOkStatus(status.Status))
            {
                maxPosition              = 0;
                IsConnected              = true;
                PacketsTotalNumber       = 0;
                PacketsFailuresNumber    = 0;
                PacketsCrcFailuresNumber = 0;
                ConnectDisconnectTitle   = TITLE_DISCONNECT;
            }
            else
            {
                maxPosition            = 0;
                IsConnected            = false;
                ConnectDisconnectTitle = TITLE_CONNECT;
            }

            SetStatus("Connection attempt", PositionControllerCommand.NONE, status);

            DisconnectCommand.UpdateCanExecute();
            EmergencyStopCommand.UpdateCanExecute();
            ResetPositionControllerCommand.UpdateCanExecute();
            CalibratePositionControllerCommand.UpdateCanExecute();
        }
        private void UpdateUi(IPositionControllerDeviceModel parameter, PositionControllerResponse result)
        {
            CoreDispatcher dispatcher = parameter.Dispatcher;

            if (dispatcher == null)
            {
                return;
            }

            var ignore = dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                parameter.SetStatus(PositionControllerCommand.CALIBRATE, result);
            });
        }
        /// <param name="parameter">method on model can only be called from UI thread</param>
        private async Task <PositionControllerResponse> ExecuteAsync(IPositionControllerDeviceModel parameter)
        {
            PositionControllerResponse result = await this.positionController.Calibrate()
                                                .ConfigureAwait(false);

            if (!positionController.IsOkStatus(result.Status))
            {
                return(result);
            }

            DateTime start = DateTime.UtcNow;

            while (DateTime.UtcNow - start < MAX_CALIBRATION_TIME)
            {
                result = await this.positionController.GetPosition()
                         .ConfigureAwait(false);

                if (!positionController.IsOkStatus(result.Status) ||
                    (result.Status & PositionControllerStatus.PC_OK_MASK) == PositionControllerStatus.PC_OK_EMERGENCY_STOP)
                {
                    return(result);
                }

                if ((result.Status & PositionControllerStatus.PC_OK_MASK) == PositionControllerStatus.PC_OK_IDLE)
                {
                    // idle means position controller finished calibration
                    return(result);
                }
                else
                {
                    UpdateUi(parameter, result);
                }

                await Task.Delay(1000)
                .ConfigureAwait(false);
            }

            return(new PositionControllerResponse(PositionControllerStatus.CS_ERR_DEVICE_NOT_CONNTECTED));
        }
示例#4
0
        private void SetStatus(string message, PositionControllerCommand fromCommand, PositionControllerResponse status)
        {
            if (status != null &&
                status.Status == PositionControllerStatus.PC_OK_IDLE && /* no errors should be present for calibration to be considered successful */
                fromCommand == PositionControllerCommand.CALIBRATE)
            {
                this.maxPosition = status.Position;
            }

            if (status == null)
            {
                Position          = double.NaN;
                StatusDisplayName = STATUS_DISPLAY_NAME_NOT_AVAILABLE;
            }
            else
            {
                Position           = ((double)status.Position) * PositionController.DISTANCE_PER_TICK_MM;
                StatusDisplayName  = StatusToDisplayName(status.Status);
                IsEmergencyStopped = (status.Status & PositionControllerStatus.PC_OK_EMERGENCY_STOP) == PositionControllerStatus.PC_OK_EMERGENCY_STOP;

                ++PacketsTotalNumber;

                if ((status.Status & ~PositionControllerStatus.PC_OK_MASK) != 0)
                {
                    ++PacketsFailuresNumber;
                }
                if ((status.Status & PositionControllerStatus.PC_ERR_CRC) != 0 ||
                    (status.Status & PositionControllerStatus.CS_ERR_CRC) != 0)
                {
                    ++PacketsCrcFailuresNumber;
                }

                if (!this.positionController.IsOkStatus(status.Status))
                {
                    this.mainModel.LogEntries.Add(new PositionControllerErrorStatusLogEntry(message, fromCommand, status.Status));
                }
            }
        }
示例#5
0
 public void SetStatus(PositionControllerCommand fromCommand, PositionControllerResponse status)
 {
     SetStatus(null, fromCommand, status);
 }