/// <summary> /// Dispose of this object /// </summary> protected override void DisposeOverride() { stopWorker(); _ts.Dispose(); _ts = null; }
void imageThreadWorker(EZTaskScheduler sender, int taskId, object o) { if (sender.IsCancelRequested(taskId)) { return; } List <byte> dataBuffer = new List <byte>(); byte[] bufferTmp = new byte[_BUFFER_SIZE]; using (var serialPort = new SerialPort(_PORT)) try { IsRunning = true; serialPort.BaudRate = _BAUD; serialPort.ReadBufferSize = _BUFFER_SIZE; serialPort.ReadTimeout = 5000; serialPort.DtrEnable = true; serialPort.RtsEnable = true; serialPort.Open(); serialPort.Write("b"); if (sender.IsCancelRequested(taskId)) { return; } OnStart?.Invoke(); int zeroCount = 0; while (!sender.IsCancelRequested(taskId) && serialPort.IsOpen) { if (serialPort.BytesToRead == 0) { if (zeroCount > 100) { throw new Exception("No data received by lidar. Giving up"); } System.Threading.Thread.Sleep(100); zeroCount++; continue; } zeroCount = 0; int read = serialPort.Read(bufferTmp, 0, _BUFFER_SIZE); dataBuffer.AddRange(bufferTmp.Take(read)); if (dataBuffer.Count > LidarSensorParser.PACKET_SIZE * 20) { throw new Exception(string.Format("Lidar data is piling up and not being processed. We stopped the collection at {0:###,###} Bytes. Post on the forum so we can better understand what is happening and fix it.", dataBuffer.Count)); } int foundStart = -1; if (dataBuffer.Count < LidarSensorParser.PACKET_SIZE) { continue; } for (int i = 0; i < dataBuffer.Count - LidarSensorParser.PACKET_SIZE; i++) { if (dataBuffer[i] == 0xfa && dataBuffer[i + 1] == 0xa0) { foundStart = i; break; } } if (foundStart == -1) { continue; } if (foundStart > 0) { dataBuffer.RemoveRange(0, foundStart); } if (dataBuffer.Count < LidarSensorParser.PACKET_SIZE) { continue; } OnLidarDataReady?.Invoke(this, dataBuffer.GetRange(0, LidarSensorParser.PACKET_SIZE).ToArray()); dataBuffer.RemoveRange(0, LidarSensorParser.PACKET_SIZE); } } catch (Exception ex) { throw new Exception(string.Format("Lidar service parse error: {0}", ex)); }finally { if (serialPort != null && serialPort.IsOpen) { serialPort.Write("e"); } IsRunning = false; OnStop?.Invoke(); } }
private void _ts_OnEventError(EZTaskScheduler sender, int taskId, object o, Exception ex) { OnLog?.Invoke(this, ex.ToString()); }
public LidarServiceUART() { _ts = new EZTaskScheduler("Lidar UART", true); _ts.OnEventToRun += imageThreadWorker; _ts.OnEventError += _ts_OnEventError; }