public string Receive(bool ignoreErrors) { if (!IsOpened && !IsOpening) { return("NOT CONNECTED"); } /* reset failure flag if requested */ if (ignoreErrors) { TransferFailure = false; } if (TransferFailure) { return(TransferString); } try { lock (TransferLock) { TransferDirection = eTransferDirection.Receive; Monitor.Pulse(TransferLock); while (TransferDirection == eTransferDirection.Receive) { Monitor.Wait(TransferLock, 5); } if (TransferFailure && !ignoreErrors) { RX_FFT.Components.GDI.Log.AddMessage("SerialPortTuner TransferFailure -> DeviceLost"); if (DeviceDisappeared != null) { DeviceDisappeared(this, null); } } } } catch (Exception e) { } /* reset failure flag if requested */ if (ignoreErrors) { TransferFailure = false; } return(TransferString); }
public void Send(string cmd) { if (!IsOpened && !IsOpening) { return; } if (TransferFailure) { return; } try { lock (TransferLock) { TransferDirection = eTransferDirection.Send; TransferString = cmd; Monitor.Pulse(TransferLock); while (TransferDirection == eTransferDirection.Send) { Monitor.Wait(TransferLock, 5); } } if (TransferFailure && DeviceDisappeared != null) { DeviceDisappeared(this, null); } } catch (Exception e) { } return; }
private void TransferThreadMain() { string lastSendString = ""; try { lock (TransferLock) { while (true) { Monitor.Wait(TransferLock); bool retry = true; for (int tries = 5; retry && (tries > 0); tries--) { /* default: do not retry transmission */ retry = false; try { switch (TransferDirection) { case eTransferDirection.Receive: TransferString = ReceiveInternal(); TransmitDelay.Stop(); TransmitDuration = TransmitDelay.Duration; lastSendString = ""; break; case eTransferDirection.Send: TransmitDelay.Start(); SendInternal(TransferString); lastSendString = TransferString; break; case eTransferDirection.None: break; } } catch (TimeoutException e) { RX_FFT.Components.GDI.Log.AddMessage("[SerialPortTuner] Failure: TIMEOUT"); if (tries == 0 || lastSendString == "") { TransferString = "TIMEOUT"; TransferFailure = true; } else { retry = true; SendInternal(lastSendString); } } catch (Exception e) { RX_FFT.Components.GDI.Log.AddMessage("[SerialPortTuner] Failure: TRANSFER FAILURE (" + e.ToString() + ")"); if (tries == 0 || lastSendString == "") { TransferString = "TRANSFER FAILURE"; TransferFailure = true; } else { retry = true; SendInternal(lastSendString); } } } TransferDirection = eTransferDirection.None; Monitor.Pulse(TransferLock); } } } catch (ThreadAbortException) { } catch (Exception e) { Log.AddMessage("Exception: " + e.ToString()); } }