mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 23:05:36 +08:00
Ref T703, sending and receiving of relayed text messages
* turn relayed messages into normal messages * avoid signals for relayed messaged * relay received messages to partner (co-pilot)
This commit is contained in:
committed by
Mat Sutcliffe
parent
0a372edef6
commit
a583def040
@@ -75,7 +75,6 @@ namespace BlackCore
|
||||
this);
|
||||
connect(m_network, &INetwork::connectionStatusChanged, this, &CContextNetwork::onFsdConnectionStatusChanged);
|
||||
connect(m_network, &INetwork::kicked, this, &CContextNetwork::kicked);
|
||||
connect(m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::textMessagesReceived);
|
||||
connect(m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::onTextMessagesReceived, Qt::QueuedConnection);
|
||||
connect(m_network, &INetwork::textMessageSent, this, &CContextNetwork::textMessageSent);
|
||||
|
||||
@@ -631,6 +630,17 @@ namespace BlackCore
|
||||
emit this->connectionStatusChanged(from, to);
|
||||
}
|
||||
|
||||
void CContextNetwork::createRelayMessageToPartnerCallsign(const CTextMessage &textMessage, const CCallsign &partnerCallsign, CTextMessageList &relayedMessages)
|
||||
{
|
||||
if (textMessage.isEmpty()) { return; }
|
||||
if (partnerCallsign.isEmpty()) { return; }
|
||||
if (textMessage.getSenderCallsign() == partnerCallsign) { return; } // no round trips
|
||||
|
||||
CTextMessage modified(textMessage);
|
||||
modified.makeRelayedMessage(partnerCallsign);
|
||||
relayedMessages.push_back(modified);
|
||||
}
|
||||
|
||||
void CContextNetwork::xCtxSimulatorRenderRestrictionsChanged(bool restricted, bool enabled, int maxAircraft, const CLength &maxRenderedDistance)
|
||||
{
|
||||
// mainly passing changed restrictions from simulator to network
|
||||
@@ -667,13 +677,39 @@ namespace BlackCore
|
||||
|
||||
void CContextNetwork::onTextMessagesReceived(const CTextMessageList &messages)
|
||||
{
|
||||
if (messages.containsPrivateMessages())
|
||||
const CTextMessageList textMessages = messages.withRelayedToPrivateMessages();
|
||||
emit this->textMessagesReceived(textMessages);
|
||||
|
||||
if (textMessages.containsPrivateMessages())
|
||||
{
|
||||
CTextMessageList supMessages(messages.getSupervisorMessages());
|
||||
const CTextMessageList supMessages(messages.getSupervisorMessages());
|
||||
for (const CTextMessage &m : supMessages)
|
||||
{
|
||||
emit this->supervisorTextMessageReceived(m);
|
||||
}
|
||||
|
||||
// part to send to partner "forward"
|
||||
if (m_network && !m_network->getPresetPartnerCallsign().isEmpty())
|
||||
{
|
||||
const CCallsign partnerCallsign = m_network->getPresetPartnerCallsign();
|
||||
|
||||
// IMPORTANT: use messages AND NOT textMessages here, exclude messages from partner to avoid infinite roundtrips
|
||||
CTextMessageList relayedMessages;
|
||||
const CTextMessageList privateMessages = messages.getPrivateMessages().withRemovedPrivateMessagesFromCallsign(partnerCallsign);
|
||||
for (const CTextMessage &m : privateMessages)
|
||||
{
|
||||
this->createRelayMessageToPartnerCallsign(m, partnerCallsign, relayedMessages);
|
||||
}
|
||||
|
||||
if (!relayedMessages.isEmpty())
|
||||
{
|
||||
QPointer<CContextNetwork> myself(this);
|
||||
QTimer::singleShot(10, this, [ = ]
|
||||
{
|
||||
if (myself) { myself->sendTextMessages(relayedMessages); }
|
||||
});
|
||||
}
|
||||
} // relay to partner
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -319,6 +319,9 @@ namespace BlackCore
|
||||
//! Connection status changed
|
||||
void onFsdConnectionStatusChanged(BlackCore::INetwork::ConnectionStatus from, BlackCore::INetwork::ConnectionStatus to);
|
||||
|
||||
//! Relay to partner callsign
|
||||
void createRelayMessageToPartnerCallsign(const BlackMisc::Network::CTextMessage &textMessage, const BlackMisc::Aviation::CCallsign &partnerCallsign, BlackMisc::Network::CTextMessageList &relayedMessages);
|
||||
|
||||
//! Render restrictions have been changed, used with analyzer
|
||||
//! \sa CAirspaceAnalyzer
|
||||
//! \ingroup crosscontextfunction
|
||||
|
||||
@@ -600,11 +600,16 @@ namespace BlackCore
|
||||
if (messages.isEmpty()) { return; }
|
||||
CTextMessageList privateMessages = messages.getPrivateMessages();
|
||||
privateMessages.markAsSent();
|
||||
for (const auto &message : as_const(privateMessages))
|
||||
for (const CTextMessage &message : as_const(privateMessages))
|
||||
{
|
||||
if (message.getRecipientCallsign().isEmpty()) { continue; }
|
||||
Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage()));
|
||||
emit this->textMessageSent(message);
|
||||
|
||||
if (!message.isRelayedMessage())
|
||||
{
|
||||
// this is the normal scenario, but relayed messages will NOT emit
|
||||
emit this->textMessageSent(message);
|
||||
}
|
||||
|
||||
// statistics
|
||||
this->increaseStatisticsValue(QStringLiteral("Vat_SendTextMessage"));
|
||||
@@ -613,7 +618,7 @@ namespace BlackCore
|
||||
CTextMessageList radioMessages = messages.getRadioMessages();
|
||||
radioMessages.markAsSent();
|
||||
QVector<int> freqsVec;
|
||||
for (const auto &message : radioMessages)
|
||||
for (const CTextMessage &message : radioMessages)
|
||||
{
|
||||
// I could send the same message to n frequencies in one step
|
||||
// if this is really required, I need to group by message
|
||||
|
||||
Reference in New Issue
Block a user