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(); } }
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); } }