Пример #1
0
        public bool OnReceivedAck()
        {
            bool retval = true;

            HaveAck = true;
            if (HaveTheirExchange)
            {
                if (!haveLoggedExchange)
                {   // we only ack the ack once
                    if (!HaveSentAck)
                    {
                        qsoSequencerCallbacks.SendAck(true,
                                                      () =>
                        {
                            HaveSentAck = true;
                            LogQso();
                        });
                    }
                    else
                    {
                        AckMoreAcks = MAXIMUM_ACK_OF_ACK;
                        qsoSequencerCallbacks.SendOnLoggedAck(null);
                        LogQso();
                    }
                }
                else if (AckMoreAcks > 0)
                {
                    AckMoreAcks -= 1;
                    qsoSequencerCallbacks.SendAck(true, null);
                }
                else
                {
                    retval = false;
                }
            }
            else // this is the wierd transition.
            {
                qsoSequencerCallbacks.SendExchange(false, null);
                State = 1;
            }
            return(retval);
        }
Пример #2
0
        public void OnReceived(bool directlyToMe, XDpack77.Pack77Message.Message msg)
        {
            deferredToEndOfReceive = null;
            XDpack77.Pack77Message.Exchange exc = msg as XDpack77.Pack77Message.Exchange;
            if (!amLeaderSet)
            {
                amLeader = directlyToMe;
            }
            amLeaderSet = true;
            XDpack77.Pack77Message.Roger roger = msg as XDpack77.Pack77Message.Roger;
            bool ack = (null != roger) && (roger.Roger);

            if (null != exc && (!haveGrid || directlyToMe))
            {
                string gs   = exc.GridSquare;
                int    rp   = exc.SignaldB;
                var    qslm = msg as XDpack77.Pack77Message.StandardMessage;
                if (!String.IsNullOrEmpty(gs))
                {   // received a grid
                    haveGrid = true;
                    ExchangeSent es;
                    if (ack)
                    {
                        haveAckOfGrid = true;
                    }
                    if (amLeader || ack)
                    {
                        es = () => cb.SendExchange(ExchangeTypes.DB_REPORT, haveReport, () => { haveSentReport = true; });
                    }
                    else
                    {
                        es = () => cb.SendExchange(ExchangeTypes.GRID_SQUARE, directlyToMe && haveGrid, () => { haveSentGrid = true; });
                    }
                    lastSent = es;
                    es();
                    return;
                }
                else if (rp > XDpack77.Pack77Message.Message.NO_DB)
                {   // received a dB report
                    haveReport = true;
                    lastSent   = null;
                    if (ack && haveSentReport)
                    {
                        haveAckOfReport = true;
                    }
                    if (haveAckOfReport)
                    {
                        ExchangeSent es = () => cb.SendAck(() =>
                        {
                            if (!haveLoggedReport)
                            {
                                haveLoggedReport = true;
                                if (haveGrid)
                                {
                                    haveLoggedGrid = true;
                                }
                                cb.LogQso();
                            }
                        });
                        lastSent = es;
                        es();
                    }
                    else
                    {
                        ExchangeSent es = () => cb.SendExchange(ExchangeTypes.DB_REPORT, true, () => { haveSentReport = true; });
                        lastSent = es;
                        es();
                    }
                    return;
                }
                else if (null == msg as XDpack77.Pack77Message.StandardMessage)
                {   // message has an exchange, but for some contest we don't know about
                    if (!haveReceivedWrongExchange)
                    {
                        haveReceivedWrongExchange = true;
                        cb.LogQso();
                    }
                    cb.SendAck(null); // send a 73, log it, and get going
                    lastSent = null;
                    return;
                }
            }
            if (!haveReceivedWrongExchange && !haveGrid && !haveReport)
            {
                ExchangeSent es = null;
                if (haveSentGrid)
                {
                    es = () => cb.SendExchange(ExchangeTypes.DB_REPORT, false, () => { haveSentReport = true; });
                }
                else
                {
                    es = () => cb.SendExchange(ExchangeTypes.GRID_SQUARE, false, () => { haveSentGrid = true; });
                }
                lastSent = es;
                es();
                return;
            }
            XDpack77.Pack77Message.QSL qsl = msg as XDpack77.Pack77Message.QSL;
            if ((qsl != null) && String.Equals(qsl.CallQSLed, "ALL") || directlyToMe)
            {
                // what we need to do
                Action toDoOnAck = () =>
                {
                    if (!haveLoggedGrid && (haveReport || (directlyToMe && haveGrid)))
                    {
                        haveLoggedGrid = true;
                        if (haveReport)
                        {
                            haveLoggedReport = true;
                        }
                        lastSent = null;
                        cb.LogQso();
                        ackOfAckGrid = qsl.QslText; // see if they repeat exact message
                        AckMoreAcks  = MAXIMUM_ACK_OF_ACK;
                        cb.SendOnLoggedAck(() =>
                                           { onLoggedAckEnabled = true; });
                        return;
                    }
                    if (AckMoreAcks > 0 && directlyToMe && String.Equals(qsl.QslText, ackOfAckGrid))
                    {   // only repeat this if they send exact same message
                        lastSent     = null;
                        AckMoreAcks -= 1;
                        if (onLoggedAckEnabled)
                        {
                            cb.SendOnLoggedAck(null);
                        }
                        else
                        {
                            cb.SendAck(null);
                        }
                        return;
                    }
                };
                // do it now? or see if multi-streaming partner sends a message directlyToMe
                if (directlyToMe)
                {
                    toDoOnAck();
                }
                else
                {
                    deferredToEndOfReceive = toDoOnAck;
                }
                return;
            }
            OnReceivedNothing(); // didn't get what I wanted
        }
Пример #3
0
 public void OnReceivedAck(bool directlyToMe)
 {
     deferredToEndOfReceive = null;
     System.Action toDo = () =>
     {
         HaveAck = true;
         if (HaveTheirExchange)
         {
             if (!haveLoggedExchange)
             {   // we only ack the ack once
                 if (!HaveSentAck)
                 {
                     qsoSequencerCallbacks.SendAck(true,
                                                   () =>
                     {
                         HaveSentAck = true;
                         LogQso();
                     });
                 }
                 else
                 {
                     AckMoreAcks = MAXIMUM_ACK_OF_ACK;
                     qsoSequencerCallbacks.SendOnLoggedAck(null);
                     LogQso();
                 }
             }
             else if (AckMoreAcks > 0)
             {
                 qsoSequencerCallbacks.SendAck(true,
                                               () => { AckMoreAcks -= 1; });
             }
         }
         else if (WrongExchangeCount > 0)
         {
             // give up.
             if (!haveLogged)
             {
                 AckMoreAcks = MAXIMUM_ACK_OF_ACK;
             }
             if (AckMoreAcks > 0)
             {
                 qsoSequencerCallbacks.SendAck(true,
                                               () =>
                 {
                     AckMoreAcks -= 1;
                     if (!haveLogged)
                     {
                         LogQso();
                     }
                 });
             }
         }
         else // ask them to try again
         {
             qsoSequencerCallbacks.SendExchange(false, () => { HaveSentExchange = true; });
             State = 1;
         }
     };
     // defer the action to end of receive cycle if not directly to me
     if (directlyToMe)
     {
         toDo();
     }
     else
     {
         deferredToEndOfReceive = toDo;
     }
 }