// call here every for every incoming message that might be relevant to us public override void MessageForMycall(RecentMessage recentMessage, bool directlyToMe, string callQsled, short band, bool autoStart, IsConversationMessage onUsed) { XDpack77.Pack77Message.ReceivedMessage rm = recentMessage.Message; var inProgList = qsosPanel.QsosInProgressDictionary; QsoInProgress inProgress = null; bool used = false; if (inProgList.TryGetValue(QsoInProgress.GetKey(rm, band), out inProgress)) { used = inProgress.AddMessageOnMatch(rm, directlyToMe, callQsled); } if (used) { // we have an ongoing QSO for this message QsoSequencer sequencer = inProgress.Sequencer as QsoSequencer; onUsed(directlyToMe ? Conversation.Origin.TO_ME : Conversation.Origin.TO_OTHER); // What's in the message? an exchange and/or an acknowledgement? bool hasExchange = ExchangeFromMessage(rm.Pack77Message) != null; XDpack77.Pack77Message.Roger roger = rm.Pack77Message as XDpack77.Pack77Message.Roger; bool ack = false; if (roger != null) { ack = roger.Roger; // if the message has a roger bit, use it } if (!hasExchange && !ack) // but if no exchange, allow QSL to also set ack { // if the message can QSO prior, see if can apply to us if ((String.Equals("ALL", callQsled) && inProgress.CanAcceptAckNotToMe) || String.Equals(myCall, callQsled) || String.Equals(myBaseCall, callQsled)) { ack = true; } } if (hasExchange) { sequencer.OnReceivedExchange(ack); } else if (ack) { sequencer.OnReceivedAck(); } } else if (autoStart && directlyToMe) { onUsed(Conversation.Origin.TO_ME); // wasn't one we already had. but we autostart with any call InitiateQso(recentMessage, band, false); } else if (null != inProgress) { if ((null != inProgress.Sequencer) && !inProgress.Sequencer.IsFinished) { onUsed(Conversation.Origin.TO_OTHER); // make it show up in the conversation history } } }
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 }
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 } }