mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-24 17:32:18 +00:00
Teardown bluetooth phoneAPI better and fix client notification issue (#4834)
* Teardown bluetooth phoneAPI better and fix client notification issue * Fix client notification draining
This commit is contained in:
parent
9a7a4d3814
commit
9cbabb0468
@ -92,6 +92,9 @@ class MeshService
|
|||||||
/// Return the next MqttClientProxyMessage packet destined to the phone.
|
/// Return the next MqttClientProxyMessage packet destined to the phone.
|
||||||
meshtastic_MqttClientProxyMessage *getMqttClientProxyMessageForPhone() { return toPhoneMqttProxyQueue.dequeuePtr(0); }
|
meshtastic_MqttClientProxyMessage *getMqttClientProxyMessageForPhone() { return toPhoneMqttProxyQueue.dequeuePtr(0); }
|
||||||
|
|
||||||
|
/// Return the next ClientNotification packet destined to the phone.
|
||||||
|
meshtastic_ClientNotification *getClientNotificationForPhone() { return toPhoneClientNotificationQueue.dequeuePtr(0); }
|
||||||
|
|
||||||
// search the queue for a request id and return the matching nodenum
|
// search the queue for a request id and return the matching nodenum
|
||||||
NodeNum getNodenumFromRequestId(uint32_t request_id);
|
NodeNum getNodenumFromRequestId(uint32_t request_id);
|
||||||
|
|
||||||
|
@ -62,9 +62,11 @@ void PhoneAPI::handleStartConfig()
|
|||||||
|
|
||||||
void PhoneAPI::close()
|
void PhoneAPI::close()
|
||||||
{
|
{
|
||||||
|
LOG_INFO("PhoneAPI::close()\n");
|
||||||
|
|
||||||
if (state != STATE_SEND_NOTHING) {
|
if (state != STATE_SEND_NOTHING) {
|
||||||
state = STATE_SEND_NOTHING;
|
state = STATE_SEND_NOTHING;
|
||||||
|
resetReadIndex();
|
||||||
unobserve(&service->fromNumChanged);
|
unobserve(&service->fromNumChanged);
|
||||||
#ifdef FSCom
|
#ifdef FSCom
|
||||||
unobserve(&xModem.packetReady);
|
unobserve(&xModem.packetReady);
|
||||||
@ -72,8 +74,17 @@ void PhoneAPI::close()
|
|||||||
releasePhonePacket(); // Don't leak phone packets on shutdown
|
releasePhonePacket(); // Don't leak phone packets on shutdown
|
||||||
releaseQueueStatusPhonePacket();
|
releaseQueueStatusPhonePacket();
|
||||||
releaseMqttClientProxyPhonePacket();
|
releaseMqttClientProxyPhonePacket();
|
||||||
|
releaseClientNotification();
|
||||||
onConnectionChanged(false);
|
onConnectionChanged(false);
|
||||||
|
fromRadioScratch = {};
|
||||||
|
toRadioScratch = {};
|
||||||
|
nodeInfoForPhone = {};
|
||||||
|
packetForPhone = NULL;
|
||||||
|
filesManifest.clear();
|
||||||
|
fromRadioNum = 0;
|
||||||
|
config_nonce = 0;
|
||||||
|
config_state = 0;
|
||||||
|
pauseBluetoothLogging = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,6 +416,10 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
|
|||||||
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_xmodemPacket_tag;
|
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_xmodemPacket_tag;
|
||||||
fromRadioScratch.xmodemPacket = xmodemPacketForPhone;
|
fromRadioScratch.xmodemPacket = xmodemPacketForPhone;
|
||||||
xmodemPacketForPhone = meshtastic_XModem_init_zero;
|
xmodemPacketForPhone = meshtastic_XModem_init_zero;
|
||||||
|
} else if (clientNotification) {
|
||||||
|
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_clientNotification_tag;
|
||||||
|
fromRadioScratch.clientNotification = *clientNotification;
|
||||||
|
releaseClientNotification();
|
||||||
} else if (packetForPhone) {
|
} else if (packetForPhone) {
|
||||||
printPacket("phone downloaded packet", packetForPhone);
|
printPacket("phone downloaded packet", packetForPhone);
|
||||||
|
|
||||||
@ -444,13 +459,6 @@ void PhoneAPI::sendConfigComplete()
|
|||||||
pauseBluetoothLogging = false;
|
pauseBluetoothLogging = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhoneAPI::handleDisconnect()
|
|
||||||
{
|
|
||||||
filesManifest.clear();
|
|
||||||
pauseBluetoothLogging = false;
|
|
||||||
LOG_INFO("PhoneAPI disconnect\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void PhoneAPI::releasePhonePacket()
|
void PhoneAPI::releasePhonePacket()
|
||||||
{
|
{
|
||||||
if (packetForPhone) {
|
if (packetForPhone) {
|
||||||
@ -475,6 +483,14 @@ void PhoneAPI::releaseMqttClientProxyPhonePacket()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhoneAPI::releaseClientNotification()
|
||||||
|
{
|
||||||
|
if (clientNotification) {
|
||||||
|
service->releaseClientNotificationToPool(clientNotification);
|
||||||
|
clientNotification = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if we have data available to send to the phone
|
* Return true if we have data available to send to the phone
|
||||||
*/
|
*/
|
||||||
@ -509,7 +525,9 @@ bool PhoneAPI::available()
|
|||||||
queueStatusPacketForPhone = service->getQueueStatusForPhone();
|
queueStatusPacketForPhone = service->getQueueStatusForPhone();
|
||||||
if (!mqttClientProxyMessageForPhone)
|
if (!mqttClientProxyMessageForPhone)
|
||||||
mqttClientProxyMessageForPhone = service->getMqttClientProxyMessageForPhone();
|
mqttClientProxyMessageForPhone = service->getMqttClientProxyMessageForPhone();
|
||||||
bool hasPacket = !!queueStatusPacketForPhone || !!mqttClientProxyMessageForPhone;
|
if (!clientNotification)
|
||||||
|
clientNotification = service->getClientNotificationForPhone();
|
||||||
|
bool hasPacket = !!queueStatusPacketForPhone || !!mqttClientProxyMessageForPhone || !!clientNotification;
|
||||||
if (hasPacket)
|
if (hasPacket)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -552,7 +570,6 @@ void PhoneAPI::sendNotification(meshtastic_LogRecord_Level level, uint32_t reply
|
|||||||
cn->time = getValidTime(RTCQualityFromNet);
|
cn->time = getValidTime(RTCQualityFromNet);
|
||||||
strncpy(cn->message, message, sizeof(cn->message));
|
strncpy(cn->message, message, sizeof(cn->message));
|
||||||
service->sendClientNotification(cn);
|
service->sendClientNotification(cn);
|
||||||
delete cn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,11 +147,6 @@ class PhoneAPI
|
|||||||
*/
|
*/
|
||||||
virtual void onNowHasData(uint32_t fromRadioNum) {}
|
virtual void onNowHasData(uint32_t fromRadioNum) {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Subclasses can use this to find out when a client drops the link
|
|
||||||
*/
|
|
||||||
virtual void handleDisconnect();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void releasePhonePacket();
|
void releasePhonePacket();
|
||||||
|
|
||||||
@ -159,6 +154,8 @@ class PhoneAPI
|
|||||||
|
|
||||||
void releaseMqttClientProxyPhonePacket();
|
void releaseMqttClientProxyPhonePacket();
|
||||||
|
|
||||||
|
void releaseClientNotification();
|
||||||
|
|
||||||
/// begin a new connection
|
/// begin a new connection
|
||||||
void handleStartConfig();
|
void handleStartConfig();
|
||||||
|
|
||||||
|
@ -124,7 +124,14 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void onDisconnect(NimBLEServer *pServer, ble_gap_conn_desc *desc) { LOG_INFO("BLE disconnect\n"); }
|
virtual void onDisconnect(NimBLEServer *pServer, ble_gap_conn_desc *desc)
|
||||||
|
{
|
||||||
|
LOG_INFO("BLE disconnect\n");
|
||||||
|
|
||||||
|
if (bluetoothPhoneAPI) {
|
||||||
|
bluetoothPhoneAPI->close();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static NimbleBluetoothToRadioCallback *toRadioCallbacks;
|
static NimbleBluetoothToRadioCallback *toRadioCallbacks;
|
||||||
|
@ -55,7 +55,6 @@ static BluetoothPhoneAPI *bluetoothPhoneAPI;
|
|||||||
|
|
||||||
void onConnect(uint16_t conn_handle)
|
void onConnect(uint16_t conn_handle)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get the reference to current connection
|
// Get the reference to current connection
|
||||||
BLEConnection *connection = Bluefruit.Connection(conn_handle);
|
BLEConnection *connection = Bluefruit.Connection(conn_handle);
|
||||||
connectionHandle = conn_handle;
|
connectionHandle = conn_handle;
|
||||||
@ -70,8 +69,10 @@ void onConnect(uint16_t conn_handle)
|
|||||||
*/
|
*/
|
||||||
void onDisconnect(uint16_t conn_handle, uint8_t reason)
|
void onDisconnect(uint16_t conn_handle, uint8_t reason)
|
||||||
{
|
{
|
||||||
// FIXME - we currently assume only one active connection
|
|
||||||
LOG_INFO("BLE Disconnected, reason = 0x%x\n", reason);
|
LOG_INFO("BLE Disconnected, reason = 0x%x\n", reason);
|
||||||
|
if (bluetoothPhoneAPI) {
|
||||||
|
bluetoothPhoneAPI->close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user