Beispiel #1
0
        public async Task CollectData(uint dataCollectionPositionDelta, int numberOfSamples, string resultfolderPath, CancellationToken token)
        {
            PositionControllerResponse response = await this.positionController.GetPosition().ConfigureAwait(false);

            // we assume line sensor is positioned in the middle of the position controller and image is awlays in the same place

            uint startPosition   = response.Position;
            uint currentPosition = startPosition;

            if (Directory.Exists(resultfolderPath))
            {
                Directory.Delete(resultfolderPath);
            }

            Directory.CreateDirectory(resultfolderPath);

            while (!token.IsCancellationRequested)
            {
                double currentRealPosition = currentPosition;
                currentRealPosition -= startPosition;
                currentRealPosition *= PositionController.DISTANCE_PER_TICK_MM;

                if (currentRealPosition > SENSOR_LENGTH)
                {
                    break;
                }

                LineSensorReading lineSensorReading = await getLineSensorData(currentRealPosition, numberOfSamples, token).ConfigureAwait(false);
                await saveLineSensorDataToFile(lineSensorReading, resultfolderPath).ConfigureAwait(false);

                currentPosition = await moveToNextPosition(dataCollectionPositionDelta).ConfigureAwait(false);
            }
        }
        public async Task <PositionControllerResponse> StrongEmergencyStop(uint maxAttempts = 10)
        {
            this.semaphore.WaitOne();

            try
            {
                if (this.serialDevice == null)
                {
                    return(new PositionControllerResponse(PositionControllerStatus.CS_ERR_DEVICE_NOT_CONNTECTED));
                }

                for (uint i = 0; i < maxAttempts; ++i)
                {
                    try
                    {
                        PositionControllerResponse result = await ExecutePrebuiltCommand(commandsBuffers[PositionControllerCommand.EMERGENCY_STOP], false).ConfigureAwait(false);

                        if ((result.Status & PositionControllerStatus.PC_OK_MASK) == PositionControllerStatus.PC_OK_EMERGENCY_STOP)
                        {
                            return(result);
                        }

                        await ExecutePrebuiltCommand(commandsBuffers[PositionControllerCommand.RESET], false).ConfigureAwait(false);

                        await Task.Delay(50)
                        .ConfigureAwait(false);

                        result = await ExecutePrebuiltCommand(commandsBuffers[PositionControllerCommand.GET_STATUS], false).ConfigureAwait(false);

                        if ((result.Status & PositionControllerStatus.PC_OK_MASK) == PositionControllerStatus.PC_OK_RESET)
                        {
                            return(result);
                        }
                    }
                    catch (Exception e)
                    {
                        this.logger.Error(e, $"unexpected exception while trying to emergency stop '{nameof(this.deviceId)}' position controller");
                    }
                }

                return(new PositionControllerResponse(PositionControllerStatus.CS_ERR_GAVE_UP_EXECUTING_COMMAND));
            }
            finally
            {
                this.semaphore.Release();
            }
        }
Beispiel #3
0
        private async Task <uint> moveToNextPosition(uint dataCollectionPositionDelta)
        {
            PositionControllerResponse response = await this.positionController.MoveIfIdle(PositionControllerDirection.FORWARD, dataCollectionPositionDelta).ConfigureAwait(false);

            if ((response.Status & PositionControllerStatus.PC_OK_EMERGENCY_STOP) == PositionControllerStatus.PC_OK_EMERGENCY_STOP)
            {
                throw new InvalidOperationException("position controller is in emergency stop");
            }
            else
            {
                do
                {
                    response = await this.positionController.GetPosition().ConfigureAwait(false);

                    if ((response.Status & PositionControllerStatus.PC_OK_EMERGENCY_STOP) == PositionControllerStatus.PC_OK_EMERGENCY_STOP)
                    {
                        throw new InvalidOperationException("position controller is in emergency stop");
                    }
                } while (!positionController.IsOkStatus(response.Status) || (response.Status & PositionControllerStatus.PC_OK_BUSY) != 0);

                return(response.Position);
            }
        }