Exemple #1
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
        }
Exemple #2
0
 public void OnReceived(bool directlyToMe, XDpack77.Pack77Message.Message msg)
 {
     XDpack77.Pack77Message.Exchange exc = msg as XDpack77.Pack77Message.Exchange;
     if (!amLeaderSet)
     {
         amLeader = directlyToMe;
     }
     amLeaderSet = true;
     if (null != exc)
     {
         string gs = exc.GridSquare;
         int    rp = exc.SignaldB;
         if (!String.IsNullOrEmpty(gs))
         {   // received a grid
             haveGrid = true;
             ExchangeSent es;
             if (amLeader)
             {
                 es = () => cb.SendExchange(ExchangeTypes.DB_REPORT, false, () => { haveSentReport = true; });
             }
             else
             {
                 es = () => cb.SendExchange(ExchangeTypes.GRID_SQUARE, false, null);
             }
             lastSent = es;
             es();
             return;
         }
         else if (rp > XDpack77.Pack77Message.Message.NO_DB)
         {   // received a dB report
             XDpack77.Pack77Message.Roger roger = msg as XDpack77.Pack77Message.Roger;
             bool ack = (null != roger) && (roger.Roger);
             haveReport = true;
             lastSent   = null;
             if (amLeader && ack && haveSentReport)
             {
                 cb.SendAck(null);
                 if (!haveLoggedReport)
                 {
                     haveLoggedReport = true;
                     if (haveGrid)
                     {
                         haveLoggedGrid = true;
                     }
                     cb.LogQso();
                 }
             }
             else
             {
                 ExchangeSent es = () => cb.SendExchange(ExchangeTypes.DB_REPORT, true, () => { haveSentReport = true; });
                 lastSent = es;
                 es();
             }
             return;
         }
     }
     XDpack77.Pack77Message.QSL qsl = msg as XDpack77.Pack77Message.QSL;
     if ((qsl != null) && String.Equals(qsl.CallQSLed, "ALL") || directlyToMe)
     {
         if (!haveGrid && !haveReport)
         {
             ExchangeSent es = () => cb.SendExchange(amLeader ? ExchangeTypes.DB_REPORT : ExchangeTypes.GRID_SQUARE, false, null);
             lastSent = es;
             es();
             return;
         }
         if (!haveLoggedGrid && (haveReport || (directlyToMe && haveGrid)))
         {
             haveLoggedGrid = true;
             if (haveReport)
             {
                 haveLoggedReport = true;
             }
             lastSent = null;
             if (!amLeader)
             {
                 cb.SendAck(null);
             }
             cb.LogQso();
             return;
         }
         OnReceivedNothing(); // didn't get what I wanted
     }
 }