private void OnFrameTimeOutEvent(FrameTimeOutEventArgs args) { if (FrameTimeOutEvent != null) { _logger.Warn("--- Timeout occured." + Environment.NewLine + string.Format("Frame sent info : frame of type {0} with ID : {1}, timeout set to {2}, expected receiver address : {3}", args.FrameSent.FrameOrder, args.FrameSent.FrameId, args.FrameSent.TotalTimeOut, args.FrameSent.ReceiverAddress) + Environment.NewLine + string.Format("=> flight time : {0} ", args.FrameSent.FlightTime));; FrameTimeOutEvent(this, args); } }
private void Transceiver_FrameTimeOutEvent(object sender, FrameTimeOutEventArgs e) { if (e.FrameSent is PingFrame pingFrame) { if (pingFrame.ReceiverAddress == _address) { _messageLostCounterTemp += 1; MessageLostCounter = _messageLostCounterTemp.ToString(); } } if (e.FrameSent is CondFrame condFrame) { if (condFrame.ReceiverAddress == _address) { _receptorAddressTested.Conductivite = "Timeout! Transceiver plugged?"; } } }
/// <summary> /// Need to be called that way in the code : var result = await _core.SubmitLoRaFrameAsync(); /// await will created a new thread so it is not block in the UI /// </summary> /// <param name="frame">Frame to send</param> /// <param name="timeout">Total Timeout in ms = time waited to send AND received a frame</param> /// <returns></returns> private Task <FrameBase> SubmitLoRaFrameAsync(FrameBase frame, int timeout) { var tcs = new TaskCompletionSource <FrameBase>(); _pendingLoRaFrames.TryAdd(frame.FrameId, tcs); _sentLoRaFrames.TryAdd(frame.FrameId, frame); //Launch async task Task.Run(async() => { //Send frame via Serial await _serialPortManager.WriteThreadSafeAsync(frame.GetFrameToByteArray()); _logger.Info("**************************************************************************"); _logger.Info("*** Sending frame : " + frame.GetFrameToString() + Environment.NewLine); _logger.Info("*** Frame order : " + frame.FrameOrder); _logger.Info("*** Receiver address : " + frame.ReceiverAddress); _logger.Info("*** Sent counter : " + frame.SentCounter + Environment.NewLine); //Begin to wait for ack! await Task.Delay(timeout); //Here if remove does not succeed it means ack ok or ko has been received //thus _pendingLoRaFrames does not contain tcs anymore //otherwise it is a timeout if (_pendingLoRaFrames.TryRemove(frame.FrameId, out tcs)) { //Remove task from concurrent dictionary _sentLoRaFrames.TryRemove(frame.FrameId, out var sentFrame); //TimeOut event here sentFrame.ArrivedTime = DateTime.Now.TimeOfDay.TotalMilliseconds; FrameTimeOutEventArgs args = new FrameTimeOutEventArgs(sentFrame); OnFrameTimeOutEvent(args); tcs.TrySetException(new AckNotReceivedTimeoutException("Timeout : Ack Not received")); } }).ConfigureAwait(false); return(tcs.Task); }