mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-25 17:42:48 +00:00
New new BLE logging characteristic with LogRecord protos (#4220)
* New UUID * New log radio characteristic with LogRecord protobuf * LogRecord * Merge derp * How did you get there * Trunk * Fix length * Remove assert
This commit is contained in:
parent
10b157a38d
commit
9c46bdad1a
@ -11,5 +11,7 @@ const uint8_t FROMRADIO_UUID_16[16u] = {0x02, 0x00, 0x12, 0xac, 0x42, 0x02, 0x78
|
|||||||
0xed, 0x11, 0x93, 0x49, 0x9e, 0xe6, 0x55, 0x2c};
|
0xed, 0x11, 0x93, 0x49, 0x9e, 0xe6, 0x55, 0x2c};
|
||||||
const uint8_t FROMNUM_UUID_16[16u] = {0x53, 0x44, 0xe3, 0x47, 0x75, 0xaa, 0x70, 0xa6,
|
const uint8_t FROMNUM_UUID_16[16u] = {0x53, 0x44, 0xe3, 0x47, 0x75, 0xaa, 0x70, 0xa6,
|
||||||
0x66, 0x4f, 0x00, 0xa8, 0x8c, 0xa1, 0x9d, 0xed};
|
0x66, 0x4f, 0x00, 0xa8, 0x8c, 0xa1, 0x9d, 0xed};
|
||||||
const uint8_t LOGRADIO_UUID_16[16u] = {0xe2, 0xf2, 0x1e, 0xbe, 0xc5, 0x15, 0xcf, 0xaa,
|
const uint8_t LEGACY_LOGRADIO_UUID_16[16u] = {0xe2, 0xf2, 0x1e, 0xbe, 0xc5, 0x15, 0xcf, 0xaa,
|
||||||
0x6b, 0x43, 0xfa, 0x78, 0x38, 0xd2, 0x6f, 0x6c};
|
0x6b, 0x43, 0xfa, 0x78, 0x38, 0xd2, 0x6f, 0x6c};
|
||||||
|
const uint8_t LOGRADIO_UUID_16[16u] = {0x47, 0x95, 0xDF, 0x8C, 0xDE, 0xE9, 0x44, 0x99,
|
||||||
|
0x23, 0x44, 0xE6, 0x06, 0x49, 0x6E, 0x3D, 0x5A};
|
@ -11,7 +11,8 @@
|
|||||||
#define TORADIO_UUID "f75c76d2-129e-4dad-a1dd-7866124401e7"
|
#define TORADIO_UUID "f75c76d2-129e-4dad-a1dd-7866124401e7"
|
||||||
#define FROMRADIO_UUID "2c55e69e-4993-11ed-b878-0242ac120002"
|
#define FROMRADIO_UUID "2c55e69e-4993-11ed-b878-0242ac120002"
|
||||||
#define FROMNUM_UUID "ed9da18c-a800-4f66-a670-aa7547e34453"
|
#define FROMNUM_UUID "ed9da18c-a800-4f66-a670-aa7547e34453"
|
||||||
#define LOGRADIO_UUID "6c6fd238-78fa-436b-aacf-15c5be1ef2e2"
|
#define LEGACY_LOGRADIO_UUID "6c6fd238-78fa-436b-aacf-15c5be1ef2e2"
|
||||||
|
#define LOGRADIO_UUID "5a3d6e49-06e6-4423-9944-e9de8cdf9547"
|
||||||
|
|
||||||
// NRF52 wants these constants as byte arrays
|
// NRF52 wants these constants as byte arrays
|
||||||
// Generated here https://yupana-engineering.com/online-uuid-to-c-array-converter - but in REVERSE BYTE ORDER
|
// Generated here https://yupana-engineering.com/online-uuid-to-c-array-converter - but in REVERSE BYTE ORDER
|
||||||
@ -28,5 +29,4 @@ class BluetoothApi
|
|||||||
virtual void clearBonds();
|
virtual void clearBonds();
|
||||||
virtual bool isConnected();
|
virtual bool isConnected();
|
||||||
virtual int getRssi() = 0;
|
virtual int getRssi() = 0;
|
||||||
virtual void sendLog(const char *logMessage);
|
|
||||||
};
|
};
|
@ -4,6 +4,7 @@
|
|||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "mesh/generated/meshtastic/mesh.pb.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -192,22 +193,48 @@ void RedirectablePrint::log_to_ble(const char *logLevel, const char *format, va_
|
|||||||
vsnprintf(message, len + 1, format, arg);
|
vsnprintf(message, len + 1, format, arg);
|
||||||
}
|
}
|
||||||
auto thread = concurrency::OSThread::currentThread;
|
auto thread = concurrency::OSThread::currentThread;
|
||||||
|
meshtastic_LogRecord logRecord = meshtastic_LogRecord_init_zero;
|
||||||
|
logRecord.level = getLogLevel(logLevel);
|
||||||
|
strcpy(logRecord.message, message);
|
||||||
|
if (thread)
|
||||||
|
strcpy(logRecord.source, thread->ThreadName.c_str());
|
||||||
|
logRecord.time = getValidTime(RTCQuality::RTCQualityDevice, true);
|
||||||
|
|
||||||
|
uint8_t *buffer = new uint8_t[meshtastic_LogRecord_size];
|
||||||
|
size_t size = pb_encode_to_bytes(buffer, meshtastic_LogRecord_size, meshtastic_LogRecord_fields, &logRecord);
|
||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
if (thread)
|
nimbleBluetooth->sendLog(buffer, size);
|
||||||
nimbleBluetooth->sendLog(mt_sprintf("%s | [%s] %s", logLevel, thread->ThreadName.c_str(), message).c_str());
|
|
||||||
else
|
|
||||||
nimbleBluetooth->sendLog(mt_sprintf("%s | %s", logLevel, message).c_str());
|
|
||||||
#elif defined(ARCH_NRF52)
|
#elif defined(ARCH_NRF52)
|
||||||
if (thread)
|
nrf52Bluetooth->sendLog(reinterpret_cast<const char *>(buffer));
|
||||||
nrf52Bluetooth->sendLog(mt_sprintf("%s | [%s] %s", logLevel, thread->ThreadName.c_str(), message).c_str());
|
|
||||||
else
|
|
||||||
nrf52Bluetooth->sendLog(mt_sprintf("%s | %s", logLevel, message).c_str());
|
|
||||||
#endif
|
#endif
|
||||||
delete[] message;
|
delete[] message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meshtastic_LogRecord_Level RedirectablePrint::getLogLevel(const char *logLevel)
|
||||||
|
{
|
||||||
|
meshtastic_LogRecord_Level ll = meshtastic_LogRecord_Level_UNSET; // default to unset
|
||||||
|
switch (logLevel[0]) {
|
||||||
|
case 'D':
|
||||||
|
ll = meshtastic_LogRecord_Level_DEBUG;
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
ll = meshtastic_LogRecord_Level_INFO;
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
ll = meshtastic_LogRecord_Level_WARNING;
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
ll = meshtastic_LogRecord_Level_ERROR;
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
ll = meshtastic_LogRecord_Level_CRITICAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ll;
|
||||||
|
}
|
||||||
|
|
||||||
void RedirectablePrint::log(const char *logLevel, const char *format, ...)
|
void RedirectablePrint::log(const char *logLevel, const char *format, ...)
|
||||||
{
|
{
|
||||||
#ifdef ARCH_PORTDUINO
|
#ifdef ARCH_PORTDUINO
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../freertosinc.h"
|
#include "../freertosinc.h"
|
||||||
|
#include "mesh/generated/meshtastic/mesh.pb.h"
|
||||||
#include <Print.h>
|
#include <Print.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -57,4 +58,5 @@ class RedirectablePrint : public Print
|
|||||||
private:
|
private:
|
||||||
void log_to_syslog(const char *logLevel, const char *format, va_list arg);
|
void log_to_syslog(const char *logLevel, const char *format, va_list arg);
|
||||||
void log_to_ble(const char *logLevel, const char *format, va_list arg);
|
void log_to_ble(const char *logLevel, const char *format, va_list arg);
|
||||||
|
meshtastic_LogRecord_Level getLogLevel(const char *logLevel);
|
||||||
};
|
};
|
@ -244,8 +244,10 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
|
|||||||
|
|
||||||
// If the packet hasn't yet been encrypted, do so now (it might already be encrypted if we are just forwarding it)
|
// If the packet hasn't yet been encrypted, do so now (it might already be encrypted if we are just forwarding it)
|
||||||
|
|
||||||
assert(p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag ||
|
if (!(p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag ||
|
||||||
p->which_payload_variant == meshtastic_MeshPacket_decoded_tag); // I _think_ all packets should have a payload by now
|
p->which_payload_variant == meshtastic_MeshPacket_decoded_tag)) {
|
||||||
|
return meshtastic_Routing_Error_BAD_REQUEST;
|
||||||
|
}
|
||||||
|
|
||||||
// If the packet is not yet encrypted, do so now
|
// If the packet is not yet encrypted, do so now
|
||||||
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
|
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
|
||||||
|
@ -219,7 +219,6 @@ void NimbleBluetooth::setupService()
|
|||||||
logRadioCharacteristic = bleService->createCharacteristic(
|
logRadioCharacteristic = bleService->createCharacteristic(
|
||||||
LOGRADIO_UUID,
|
LOGRADIO_UUID,
|
||||||
NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC, 512U);
|
NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC, 512U);
|
||||||
logRadioCharacteristic->setValue("Init");
|
|
||||||
}
|
}
|
||||||
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
bluetoothPhoneAPI = new BluetoothPhoneAPI();
|
||||||
|
|
||||||
@ -268,12 +267,12 @@ void NimbleBluetooth::clearBonds()
|
|||||||
NimBLEDevice::deleteAllBonds();
|
NimBLEDevice::deleteAllBonds();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NimbleBluetooth::sendLog(const char *logMessage)
|
void NimbleBluetooth::sendLog(const uint8_t *logMessage, size_t length)
|
||||||
{
|
{
|
||||||
if (!bleServer || !isConnected() || strlen(logMessage) > 512) {
|
if (!bleServer || !isConnected() || length > 512) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logRadioCharacteristic->notify(reinterpret_cast<const uint8_t *>(logMessage), strlen(logMessage), true);
|
logRadioCharacteristic->notify(logMessage, length, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearNVS()
|
void clearNVS()
|
||||||
|
@ -11,7 +11,7 @@ class NimbleBluetooth : BluetoothApi
|
|||||||
bool isActive();
|
bool isActive();
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
int getRssi();
|
int getRssi();
|
||||||
void sendLog(const char *logMessage);
|
void sendLog(const uint8_t *logMessage, size_t length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupService();
|
void setupService();
|
||||||
|
Loading…
Reference in New Issue
Block a user