Пример #1
0
 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);
     }
 }
Пример #2
0
        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?";
                }
            }
        }
Пример #3
0
        /// <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);
        }