I don't like this formatting but I need trunk to STFU
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
#include "../configuration.h"
|
#include "../configuration.h"
|
||||||
#include "../main.h"
|
#include "../main.h"
|
||||||
#include <Wire.h>
|
|
||||||
#include "mesh/generated/meshtastic/telemetry.pb.h"
|
#include "mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
// AXP192 and AXP2101 have the same device address, we just need to identify it in Power.cpp
|
// AXP192 and AXP2101 have the same device address, we just need to identify it in Power.cpp
|
||||||
#ifndef XPOWERS_AXP192_AXP2101_ADDRESS
|
#ifndef XPOWERS_AXP192_AXP2101_ADDRESS
|
||||||
@@ -44,7 +44,8 @@ void printATECCInfo()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) {
|
uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length)
|
||||||
|
{
|
||||||
uint16_t value = 0x00;
|
uint16_t value = 0x00;
|
||||||
Wire.beginTransmission(address);
|
Wire.beginTransmission(address);
|
||||||
Wire.write(reg);
|
Wire.write(reg);
|
||||||
|
|||||||
+2
-1
@@ -8,4 +8,5 @@
|
|||||||
#define RECORD_CRITICALERROR(code) recordCriticalError(code, __LINE__, __FILE__)
|
#define RECORD_CRITICALERROR(code) recordCriticalError(code, __LINE__, __FILE__)
|
||||||
|
|
||||||
/// Record an error that should be reported via analytics
|
/// Record an error that should be reported via analytics
|
||||||
void recordCriticalError(CriticalErrorCode code = CriticalErrorCode_UNSPECIFIED, uint32_t address = 0, const char *filename = NULL);
|
void recordCriticalError(CriticalErrorCode code = CriticalErrorCode_UNSPECIFIED, uint32_t address = 0,
|
||||||
|
const char *filename = NULL);
|
||||||
+36
-28
@@ -34,8 +34,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "mesh-pb-constants.h"
|
#include "mesh-pb-constants.h"
|
||||||
#include "mesh/Channels.h"
|
#include "mesh/Channels.h"
|
||||||
#include "mesh/generated/meshtastic/deviceonly.pb.h"
|
#include "mesh/generated/meshtastic/deviceonly.pb.h"
|
||||||
#include "modules/TextMessageModule.h"
|
|
||||||
#include "modules/ExternalNotificationModule.h"
|
#include "modules/ExternalNotificationModule.h"
|
||||||
|
#include "modules/TextMessageModule.h"
|
||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
#include "target_specific.h"
|
#include "target_specific.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@@ -118,7 +118,6 @@ static uint16_t displayWidth, displayHeight;
|
|||||||
|
|
||||||
#define getStringCenteredX(s) ((SCREEN_WIDTH - display->getStringWidth(s)) / 2)
|
#define getStringCenteredX(s) ((SCREEN_WIDTH - display->getStringWidth(s)) / 2)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the icon with extra info printed around the corners
|
* Draw the icon with extra info printed around the corners
|
||||||
*/
|
*/
|
||||||
@@ -332,7 +331,8 @@ static void drawFrameFirmware(OLEDDisplay *display, OLEDDisplayUiState *state, i
|
|||||||
|
|
||||||
display->setFont(FONT_SMALL);
|
display->setFont(FONT_SMALL);
|
||||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||||
display->drawStringMaxWidth(0 + x, 2 + y + FONT_HEIGHT_SMALL *2, x + display->getWidth(), "Please be patient and do not power off.");
|
display->drawStringMaxWidth(0 + x, 2 + y + FONT_HEIGHT_SMALL * 2, x + display->getWidth(),
|
||||||
|
"Please be patient and do not power off.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draw the last text message we received
|
/// Draw the last text message we received
|
||||||
@@ -354,8 +354,7 @@ static void drawCriticalFaultFrame(OLEDDisplay *display, OLEDDisplayUiState *sta
|
|||||||
// Ignore messages orginating from phone (from the current node 0x0) unless range test or store and forward module are enabled
|
// Ignore messages orginating from phone (from the current node 0x0) unless range test or store and forward module are enabled
|
||||||
static bool shouldDrawMessage(const MeshPacket *packet)
|
static bool shouldDrawMessage(const MeshPacket *packet)
|
||||||
{
|
{
|
||||||
return packet->from != 0 && !moduleConfig.range_test.enabled &&
|
return packet->from != 0 && !moduleConfig.range_test.enabled && !moduleConfig.store_forward.enabled;
|
||||||
!moduleConfig.store_forward.enabled;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draw the last text message we received
|
/// Draw the last text message we received
|
||||||
@@ -582,22 +581,23 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
|
|||||||
if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) {
|
if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) {
|
||||||
char coordinateLine[22];
|
char coordinateLine[22];
|
||||||
if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees
|
if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees
|
||||||
snprintf(coordinateLine, sizeof(coordinateLine), "%f %f", geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7);
|
snprintf(coordinateLine, sizeof(coordinateLine), "%f %f", geoCoord.getLatitude() * 1e-7,
|
||||||
|
geoCoord.getLongitude() * 1e-7);
|
||||||
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator
|
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator
|
||||||
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(),
|
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(),
|
||||||
geoCoord.getUTMEasting(), geoCoord.getUTMNorthing());
|
geoCoord.getUTMEasting(), geoCoord.getUTMNorthing());
|
||||||
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System
|
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System
|
||||||
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(), geoCoord.getMGRSBand(),
|
snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(),
|
||||||
geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(), geoCoord.getMGRSEasting(),
|
geoCoord.getMGRSBand(), geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(),
|
||||||
geoCoord.getMGRSNorthing());
|
geoCoord.getMGRSEasting(), geoCoord.getMGRSNorthing());
|
||||||
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code
|
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code
|
||||||
geoCoord.getOLCCode(coordinateLine);
|
geoCoord.getOLCCode(coordinateLine);
|
||||||
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference
|
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference
|
||||||
if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region
|
if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region
|
||||||
snprintf(coordinateLine, sizeof(coordinateLine), "%s", "Out of Boundary");
|
snprintf(coordinateLine, sizeof(coordinateLine), "%s", "Out of Boundary");
|
||||||
else
|
else
|
||||||
snprintf(coordinateLine, sizeof(coordinateLine), "%1c%1c %05u %05u", geoCoord.getOSGRE100k(), geoCoord.getOSGRN100k(),
|
snprintf(coordinateLine, sizeof(coordinateLine), "%1c%1c %05u %05u", geoCoord.getOSGRE100k(),
|
||||||
geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing());
|
geoCoord.getOSGRN100k(), geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing());
|
||||||
}
|
}
|
||||||
|
|
||||||
// If fixed position, display text "Fixed GPS" alternating with the coordinates.
|
// If fixed position, display text "Fixed GPS" alternating with the coordinates.
|
||||||
@@ -614,10 +614,10 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
|
|||||||
} else {
|
} else {
|
||||||
char latLine[22];
|
char latLine[22];
|
||||||
char lonLine[22];
|
char lonLine[22];
|
||||||
snprintf(latLine, sizeof(latLine), "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(), geoCoord.getDMSLatSec(),
|
snprintf(latLine, sizeof(latLine), "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(),
|
||||||
geoCoord.getDMSLatCP());
|
geoCoord.getDMSLatSec(), geoCoord.getDMSLatCP());
|
||||||
snprintf(lonLine, sizeof(lonLine), "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(), geoCoord.getDMSLonSec(),
|
snprintf(lonLine, sizeof(lonLine), "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(),
|
||||||
geoCoord.getDMSLonCP());
|
geoCoord.getDMSLonSec(), geoCoord.getDMSLonCP());
|
||||||
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine);
|
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine);
|
||||||
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine);
|
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine);
|
||||||
}
|
}
|
||||||
@@ -1000,8 +1000,8 @@ void Screen::setup()
|
|||||||
#ifdef SCREEN_MIRROR
|
#ifdef SCREEN_MIRROR
|
||||||
dispdev.mirrorScreen();
|
dispdev.mirrorScreen();
|
||||||
#else
|
#else
|
||||||
// Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically flip it.
|
// Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically
|
||||||
// If you have a headache now, you're welcome.
|
// flip it. If you have a headache now, you're welcome.
|
||||||
if (!config.display.flip_screen) {
|
if (!config.display.flip_screen) {
|
||||||
dispdev.flipScreenVertically();
|
dispdev.flipScreenVertically();
|
||||||
}
|
}
|
||||||
@@ -1452,26 +1452,35 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
|
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
|
||||||
if (moduleConfig.store_forward.enabled) {
|
if (moduleConfig.store_forward.enabled) {
|
||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
if (millis() - storeForwardModule->lastHeartbeat > (storeForwardModule->heartbeatInterval * 1200)) { //no heartbeat, overlap a bit
|
if (millis() - storeForwardModule->lastHeartbeat >
|
||||||
|
(storeForwardModule->heartbeatInterval * 1200)) { // no heartbeat, overlap a bit
|
||||||
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL1);
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL2);
|
imgQuestionL1);
|
||||||
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
|
imgQuestionL2);
|
||||||
#else
|
#else
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgQuestion);
|
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8,
|
||||||
|
imgQuestion);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8, imgSFL1);
|
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 16, 8, imgSFL2);
|
imgSFL1);
|
||||||
|
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 16, 8,
|
||||||
|
imgSFL2);
|
||||||
#else
|
#else
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 13 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 11, 8, imgSF);
|
display->drawFastImage(x + SCREEN_WIDTH - 13 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 11, 8,
|
||||||
|
imgSF);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL1);
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL2);
|
imgInfoL1);
|
||||||
|
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 11 + FONT_HEIGHT_SMALL, 12, 8,
|
||||||
|
imgInfoL2);
|
||||||
#else
|
#else
|
||||||
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgInfo);
|
display->drawFastImage(x + SCREEN_WIDTH - 10 - display->getStringWidth(ourId), y + 2 + FONT_HEIGHT_SMALL, 8, 8, imgInfo);
|
||||||
#endif
|
#endif
|
||||||
@@ -1742,8 +1751,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
|
|||||||
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil);
|
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil);
|
||||||
if (config.position.gps_enabled) {
|
if (config.position.gps_enabled) {
|
||||||
// Line 3
|
// Line 3
|
||||||
if (config.display.gps_format !=
|
if (config.display.gps_format != Config_DisplayConfig_GpsCoordinateFormat_DMS) // if DMS then don't draw altitude
|
||||||
Config_DisplayConfig_GpsCoordinateFormat_DMS) // if DMS then don't draw altitude
|
|
||||||
drawGPSAltitude(display, x, y + FONT_HEIGHT_SMALL * 2, gpsStatus);
|
drawGPSAltitude(display, x, y + FONT_HEIGHT_SMALL * 2, gpsStatus);
|
||||||
|
|
||||||
// Line 4
|
// Line 4
|
||||||
|
|||||||
+1
-1
@@ -1,11 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include "GPSStatus.h"
|
#include "GPSStatus.h"
|
||||||
#include "NodeStatus.h"
|
#include "NodeStatus.h"
|
||||||
#include "PowerStatus.h"
|
#include "PowerStatus.h"
|
||||||
#include "graphics/Screen.h"
|
#include "graphics/Screen.h"
|
||||||
#include "mesh/generated/meshtastic/telemetry.pb.h"
|
#include "mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include <map>
|
||||||
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
||||||
#include <SparkFun_ATECCX08a_Arduino_Library.h>
|
#include <SparkFun_ATECCX08a_Arduino_Library.h>
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-1
@@ -16,7 +16,8 @@
|
|||||||
* Eventually there should be once instance of this class for each live connection (because it has a bit of state
|
* Eventually there should be once instance of this class for each live connection (because it has a bit of state
|
||||||
* for that connection)
|
* for that connection)
|
||||||
*/
|
*/
|
||||||
class PhoneAPI : public Observer<uint32_t> // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member
|
class PhoneAPI
|
||||||
|
: public Observer<uint32_t> // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member
|
||||||
{
|
{
|
||||||
enum State {
|
enum State {
|
||||||
STATE_SEND_NOTHING, // Initial state, don't send anything until the client starts asking for config
|
STATE_SEND_NOTHING, // Initial state, don't send anything until the client starts asking for config
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "mesh/generated/meshtastic/mesh.pb.h"
|
|
||||||
#include "mesh/generated/meshtastic/localonly.pb.h"
|
|
||||||
#include "mesh/generated/meshtastic/deviceonly.pb.h"
|
|
||||||
#include "mesh/generated/meshtastic/admin.pb.h"
|
#include "mesh/generated/meshtastic/admin.pb.h"
|
||||||
|
#include "mesh/generated/meshtastic/deviceonly.pb.h"
|
||||||
|
#include "mesh/generated/meshtastic/localonly.pb.h"
|
||||||
|
#include "mesh/generated/meshtastic/mesh.pb.h"
|
||||||
|
|
||||||
// this file defines constants which come from mesh.options
|
// this file defines constants which come from mesh.options
|
||||||
|
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
#define member_size(type, member) sizeof(((type *)0)->member)
|
#define member_size(type, member) sizeof(((type *)0)->member)
|
||||||
|
|
||||||
/// max number of packets which can be waiting for delivery to android - note, this value comes from mesh.options protobuf
|
/// max number of packets which can be waiting for delivery to android - note, this value comes from mesh.options protobuf
|
||||||
// FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in RAM
|
// FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in
|
||||||
// #define MAX_RX_TOPHONE (member_size(DeviceState, receive_queue) / member_size(DeviceState, receive_queue[0]))
|
// RAM #define MAX_RX_TOPHONE (member_size(DeviceState, receive_queue) / member_size(DeviceState, receive_queue[0]))
|
||||||
#define MAX_RX_TOPHONE 32
|
#define MAX_RX_TOPHONE 32
|
||||||
|
|
||||||
/// max number of nodes allowed in the mesh
|
/// max number of nodes allowed in the mesh
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
#if HAS_SCREEN
|
#if HAS_SCREEN
|
||||||
#include "CannedMessageModule.h"
|
#include "CannedMessageModule.h"
|
||||||
#include "FSCommon.h"
|
#include "FSCommon.h"
|
||||||
#include "NodeDB.h"
|
|
||||||
#include "MeshService.h"
|
#include "MeshService.h"
|
||||||
|
#include "NodeDB.h"
|
||||||
#include "PowerFSM.h" // neede for button bypass
|
#include "PowerFSM.h" // neede for button bypass
|
||||||
#include "mesh/generated/meshtastic/cannedmessages.pb.h"
|
#include "mesh/generated/meshtastic/cannedmessages.pb.h"
|
||||||
|
|
||||||
@@ -163,7 +163,8 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event)
|
|||||||
if (event->inputEvent == static_cast<char>(ANYKEY)) {
|
if (event->inputEvent == static_cast<char>(ANYKEY)) {
|
||||||
LOG_DEBUG("Canned message event any key pressed\n");
|
LOG_DEBUG("Canned message event any key pressed\n");
|
||||||
// when inactive, this will switch to the freetext mode
|
// when inactive, this will switch to the freetext mode
|
||||||
if ((this->runState == CANNED_MESSAGE_RUN_STATE_INACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_DISABLED)) {
|
if ((this->runState == CANNED_MESSAGE_RUN_STATE_INACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) ||
|
||||||
|
(this->runState == CANNED_MESSAGE_RUN_STATE_DISABLED)) {
|
||||||
this->runState = CANNED_MESSAGE_RUN_STATE_FREETEXT;
|
this->runState = CANNED_MESSAGE_RUN_STATE_FREETEXT;
|
||||||
}
|
}
|
||||||
// pass the pressed key
|
// pass the pressed key
|
||||||
@@ -224,7 +225,8 @@ int32_t CannedMessageModule::runOnce()
|
|||||||
this->cursor = 0;
|
this->cursor = 0;
|
||||||
this->destSelect = false;
|
this->destSelect = false;
|
||||||
this->notifyObservers(&e);
|
this->notifyObservers(&e);
|
||||||
} else if (((this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT)) && ((millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)) {
|
} else if (((this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE) || (this->runState == CANNED_MESSAGE_RUN_STATE_FREETEXT)) &&
|
||||||
|
((millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)) {
|
||||||
// Reset module
|
// Reset module
|
||||||
LOG_DEBUG("Reset due to lack of activity.\n");
|
LOG_DEBUG("Reset due to lack of activity.\n");
|
||||||
e.frameChanged = true;
|
e.frameChanged = true;
|
||||||
@@ -337,7 +339,8 @@ int32_t CannedMessageModule::runOnce()
|
|||||||
if (this->cursor == this->freetext.length()) {
|
if (this->cursor == this->freetext.length()) {
|
||||||
this->freetext = this->freetext.substring(0, this->freetext.length() - 1);
|
this->freetext = this->freetext.substring(0, this->freetext.length() - 1);
|
||||||
} else {
|
} else {
|
||||||
this->freetext = this->freetext.substring(0, this->cursor - 1) + this->freetext.substring(this->cursor, this->freetext.length());
|
this->freetext = this->freetext.substring(0, this->cursor - 1) +
|
||||||
|
this->freetext.substring(this->cursor, this->freetext.length());
|
||||||
}
|
}
|
||||||
this->cursor--;
|
this->cursor--;
|
||||||
}
|
}
|
||||||
@@ -353,9 +356,8 @@ int32_t CannedMessageModule::runOnce()
|
|||||||
if (this->cursor == this->freetext.length()) {
|
if (this->cursor == this->freetext.length()) {
|
||||||
this->freetext += this->payload;
|
this->freetext += this->payload;
|
||||||
} else {
|
} else {
|
||||||
this->freetext = this->freetext.substring(0, this->cursor)
|
this->freetext =
|
||||||
+ this->payload
|
this->freetext.substring(0, this->cursor) + this->payload + this->freetext.substring(this->cursor);
|
||||||
+ this->freetext.substring(this->cursor);
|
|
||||||
}
|
}
|
||||||
this->cursor += 1;
|
this->cursor += 1;
|
||||||
if (this->freetext.length() > Constants_DATA_PAYLOAD_LEN) {
|
if (this->freetext.length() > Constants_DATA_PAYLOAD_LEN) {
|
||||||
@@ -391,7 +393,8 @@ const char *CannedMessageModule::getNextMessage()
|
|||||||
{
|
{
|
||||||
return this->messages[this->getNextIndex()];
|
return this->messages[this->getNextIndex()];
|
||||||
}
|
}
|
||||||
const char* CannedMessageModule::getNodeName(NodeNum node) {
|
const char *CannedMessageModule::getNodeName(NodeNum node)
|
||||||
|
{
|
||||||
if (node == NODENUM_BROADCAST) {
|
if (node == NODENUM_BROADCAST) {
|
||||||
return "Broadcast";
|
return "Broadcast";
|
||||||
} else {
|
} else {
|
||||||
@@ -460,7 +463,9 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
|
|||||||
display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer);
|
display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer);
|
||||||
}
|
}
|
||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
display->drawStringMaxWidth(0 + x, 0 + y + FONT_HEIGHT_SMALL, x + display->getWidth(), cannedMessageModule->drawWithCursor(cannedMessageModule->freetext, cannedMessageModule->cursor));
|
display->drawStringMaxWidth(
|
||||||
|
0 + x, 0 + y + FONT_HEIGHT_SMALL, x + display->getWidth(),
|
||||||
|
cannedMessageModule->drawWithCursor(cannedMessageModule->freetext, cannedMessageModule->cursor));
|
||||||
} else {
|
} else {
|
||||||
if (this->messagesCount > 0) {
|
if (this->messagesCount > 0) {
|
||||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||||
@@ -498,8 +503,8 @@ bool CannedMessageModule::saveProtoForModule()
|
|||||||
FS.mkdir("/prefs");
|
FS.mkdir("/prefs");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
okay &= nodeDB.saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size,
|
okay &= nodeDB.saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, &CannedMessageModuleConfig_msg,
|
||||||
&CannedMessageModuleConfig_msg, &cannedMessageModuleConfig);
|
&cannedMessageModuleConfig);
|
||||||
|
|
||||||
return okay;
|
return okay;
|
||||||
}
|
}
|
||||||
@@ -551,11 +556,11 @@ void CannedMessageModule::handleGetCannedMessageModuleMessages(const MeshPacket
|
|||||||
LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n");
|
LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n");
|
||||||
if (req.decoded.want_response) {
|
if (req.decoded.want_response) {
|
||||||
response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag;
|
response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag;
|
||||||
strncpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages, sizeof(response->get_canned_message_module_messages_response));
|
strncpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages,
|
||||||
|
sizeof(response->get_canned_message_module_messages_response));
|
||||||
} // Don't send anything if not instructed to. Better than asserting.
|
} // Don't send anything if not instructed to. Better than asserting.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_msg)
|
void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_msg)
|
||||||
{
|
{
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
@@ -573,9 +578,7 @@ void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_
|
|||||||
|
|
||||||
String CannedMessageModule::drawWithCursor(String text, int cursor)
|
String CannedMessageModule::drawWithCursor(String text, int cursor)
|
||||||
{
|
{
|
||||||
String result = text.substring(0, cursor)
|
String result = text.substring(0, cursor) + "_" + text.substring(cursor);
|
||||||
+ "_"
|
|
||||||
+ text.substring(cursor);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,19 +58,19 @@ int32_t ExternalNotificationModule::runOnce()
|
|||||||
|
|
||||||
// If the output is turned on, turn it back off after the given period of time.
|
// If the output is turned on, turn it back off after the given period of time.
|
||||||
if (isNagging) {
|
if (isNagging) {
|
||||||
if (externalTurnedOn[0] + (moduleConfig.external_notification.output_ms
|
if (externalTurnedOn[0] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
|
||||||
? moduleConfig.external_notification.output_ms
|
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
|
||||||
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) {
|
millis()) {
|
||||||
getExternal(0) ? setExternalOff(0) : setExternalOn(0);
|
getExternal(0) ? setExternalOff(0) : setExternalOn(0);
|
||||||
}
|
}
|
||||||
if (externalTurnedOn[1] + (moduleConfig.external_notification.output_ms
|
if (externalTurnedOn[1] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
|
||||||
? moduleConfig.external_notification.output_ms
|
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
|
||||||
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) {
|
millis()) {
|
||||||
getExternal(1) ? setExternalOff(1) : setExternalOn(1);
|
getExternal(1) ? setExternalOff(1) : setExternalOn(1);
|
||||||
}
|
}
|
||||||
if (externalTurnedOn[2] + (moduleConfig.external_notification.output_ms
|
if (externalTurnedOn[2] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
|
||||||
? moduleConfig.external_notification.output_ms
|
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
|
||||||
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) < millis()) {
|
millis()) {
|
||||||
getExternal(2) ? setExternalOff(2) : setExternalOn(2);
|
getExternal(2) ? setExternalOff(2) : setExternalOn(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,8 @@ bool ExternalNotificationModule::getExternal(uint8_t index)
|
|||||||
return externalCurrentState[index];
|
return externalCurrentState[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExternalNotificationModule::stopNow() {
|
void ExternalNotificationModule::stopNow()
|
||||||
|
{
|
||||||
rtttl::stop();
|
rtttl::stop();
|
||||||
nagCycleCutoff = 1; // small value
|
nagCycleCutoff = 1; // small value
|
||||||
isNagging = false;
|
isNagging = false;
|
||||||
@@ -165,13 +166,14 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
if (moduleConfig.external_notification.enabled) {
|
if (moduleConfig.external_notification.enabled) {
|
||||||
if (!nodeDB.loadProto(rtttlConfigFile, RTTTLConfig_size, sizeof(RTTTLConfig), &RTTTLConfig_msg, &rtttlConfig)) {
|
if (!nodeDB.loadProto(rtttlConfigFile, RTTTLConfig_size, sizeof(RTTTLConfig), &RTTTLConfig_msg, &rtttlConfig)) {
|
||||||
memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone));
|
memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone));
|
||||||
strncpy(rtttlConfig.ringtone, "a:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#", sizeof(rtttlConfig.ringtone));
|
strncpy(rtttlConfig.ringtone,
|
||||||
|
"a:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#",
|
||||||
|
sizeof(rtttlConfig.ringtone));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("Initializing External Notification Module\n");
|
LOG_INFO("Initializing External Notification Module\n");
|
||||||
|
|
||||||
output = moduleConfig.external_notification.output
|
output = moduleConfig.external_notification.output ? moduleConfig.external_notification.output
|
||||||
? moduleConfig.external_notification.output
|
|
||||||
: EXT_NOTIFICATION_MODULE_OUTPUT;
|
: EXT_NOTIFICATION_MODULE_OUTPUT;
|
||||||
|
|
||||||
// Set the direction of a pin
|
// Set the direction of a pin
|
||||||
@@ -192,9 +194,7 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
setExternalOff(2);
|
setExternalOff(2);
|
||||||
externalTurnedOn[2] = 0;
|
externalTurnedOn[2] = 0;
|
||||||
} else {
|
} else {
|
||||||
config.device.buzzer_gpio = config.device.buzzer_gpio
|
config.device.buzzer_gpio = config.device.buzzer_gpio ? config.device.buzzer_gpio : PIN_BUZZER;
|
||||||
? config.device.buzzer_gpio
|
|
||||||
: PIN_BUZZER;
|
|
||||||
// in PWM Mode we force the buzzer pin if it is set
|
// in PWM Mode we force the buzzer pin if it is set
|
||||||
LOG_INFO("Using Pin %i in PWM mode\n", config.device.buzzer_gpio);
|
LOG_INFO("Using Pin %i in PWM mode\n", config.device.buzzer_gpio);
|
||||||
}
|
}
|
||||||
@@ -274,7 +274,6 @@ ProcessMessage ExternalNotificationModule::handleReceived(const MeshPacket &mp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (moduleConfig.external_notification.alert_message_vibra) {
|
if (moduleConfig.external_notification.alert_message_vibra) {
|
||||||
LOG_INFO("externalNotificationModule - Notification Module (Vibra)\n");
|
LOG_INFO("externalNotificationModule - Notification Module (Vibra)\n");
|
||||||
isNagging = true;
|
isNagging = true;
|
||||||
@@ -320,7 +319,8 @@ ProcessMessage ExternalNotificationModule::handleReceived(const MeshPacket &mp)
|
|||||||
* @return AdminMessageHandleResult HANDLED if message was handled
|
* @return AdminMessageHandleResult HANDLED if message was handled
|
||||||
* HANDLED_WITH_RESULT if a result is also prepared.
|
* HANDLED_WITH_RESULT if a result is also prepared.
|
||||||
*/
|
*/
|
||||||
AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageForModule(const MeshPacket &mp, AdminMessage *request, AdminMessage *response)
|
AdminMessageHandleResult ExternalNotificationModule::handleAdminMessageForModule(const MeshPacket &mp, AdminMessage *request,
|
||||||
|
AdminMessage *response)
|
||||||
{
|
{
|
||||||
AdminMessageHandleResult result;
|
AdminMessageHandleResult result;
|
||||||
|
|
||||||
@@ -353,7 +353,6 @@ void ExternalNotificationModule::handleGetRingtone(const MeshPacket &req, AdminM
|
|||||||
} // Don't send anything if not instructed to. Better than asserting.
|
} // Don't send anything if not instructed to. Better than asserting.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ExternalNotificationModule::handleSetRingtone(const char *from_msg)
|
void ExternalNotificationModule::handleSetRingtone(const char *from_msg)
|
||||||
{
|
{
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "ProtobufModule.h"
|
#include "ProtobufModule.h"
|
||||||
#include "mesh/generated/meshtastic/remote_hardware.pb.h"
|
|
||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
|
#include "mesh/generated/meshtastic/remote_hardware.pb.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A module that provides easy low-level remote access to device hardware.
|
* A module that provides easy low-level remote access to device hardware.
|
||||||
@@ -16,6 +16,7 @@ class RemoteHardwareModule : public ProtobufModule<HardwareMessage>, private con
|
|||||||
|
|
||||||
/// The timestamp of our last watch event (we throttle watches to 1 change every 30 seconds)
|
/// The timestamp of our last watch event (we throttle watches to 1 change every 30 seconds)
|
||||||
uint32_t lastWatchMsec = 0;
|
uint32_t lastWatchMsec = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor
|
/** Constructor
|
||||||
* name is for debugging output
|
* name is for debugging output
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include <OLEDDisplay.h>
|
#include <OLEDDisplay.h>
|
||||||
#include <OLEDDisplayUi.h>
|
#include <OLEDDisplayUi.h>
|
||||||
#include "MeshService.h"
|
|
||||||
|
|
||||||
int32_t DeviceTelemetryModule::runOnce()
|
int32_t DeviceTelemetryModule::runOnce()
|
||||||
{
|
{
|
||||||
@@ -32,12 +31,9 @@ bool DeviceTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemet
|
|||||||
if (t->which_variant == Telemetry_device_metrics_tag) {
|
if (t->which_variant == Telemetry_device_metrics_tag) {
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n",
|
LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n", sender,
|
||||||
sender,
|
t->variant.device_metrics.air_util_tx, t->variant.device_metrics.channel_utilization,
|
||||||
t->variant.device_metrics.air_util_tx,
|
t->variant.device_metrics.battery_level, t->variant.device_metrics.voltage);
|
||||||
t->variant.device_metrics.channel_utilization,
|
|
||||||
t->variant.device_metrics.battery_level,
|
|
||||||
t->variant.device_metrics.voltage);
|
|
||||||
|
|
||||||
lastMeasurementPacket = packetPool.allocCopy(mp);
|
lastMeasurementPacket = packetPool.allocCopy(mp);
|
||||||
|
|
||||||
@@ -59,10 +55,8 @@ bool DeviceTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
|
|||||||
t.variant.device_metrics.voltage = powerStatus->getBatteryVoltageMv() / 1000.0;
|
t.variant.device_metrics.voltage = powerStatus->getBatteryVoltageMv() / 1000.0;
|
||||||
|
|
||||||
LOG_INFO("(Sending): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n",
|
LOG_INFO("(Sending): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f\n",
|
||||||
t.variant.device_metrics.air_util_tx,
|
t.variant.device_metrics.air_util_tx, t.variant.device_metrics.channel_utilization,
|
||||||
t.variant.device_metrics.channel_utilization,
|
t.variant.device_metrics.battery_level, t.variant.device_metrics.voltage);
|
||||||
t.variant.device_metrics.battery_level,
|
|
||||||
t.variant.device_metrics.voltage);
|
|
||||||
|
|
||||||
MeshPacket *p = allocDataProtobuf(t);
|
MeshPacket *p = allocDataProtobuf(t);
|
||||||
p->to = dest;
|
p->to = dest;
|
||||||
|
|||||||
@@ -9,18 +9,17 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include <OLEDDisplay.h>
|
#include <OLEDDisplay.h>
|
||||||
#include <OLEDDisplayUi.h>
|
#include <OLEDDisplayUi.h>
|
||||||
#include "MeshService.h"
|
|
||||||
|
|
||||||
// Sensors
|
// Sensors
|
||||||
#include "Sensor/BMP280Sensor.h"
|
|
||||||
#include "Sensor/BME280Sensor.h"
|
#include "Sensor/BME280Sensor.h"
|
||||||
#include "Sensor/BME680Sensor.h"
|
#include "Sensor/BME680Sensor.h"
|
||||||
#include "Sensor/MCP9808Sensor.h"
|
#include "Sensor/BMP280Sensor.h"
|
||||||
#include "Sensor/INA260Sensor.h"
|
|
||||||
#include "Sensor/INA219Sensor.h"
|
#include "Sensor/INA219Sensor.h"
|
||||||
#include "Sensor/SHTC3Sensor.h"
|
#include "Sensor/INA260Sensor.h"
|
||||||
#include "Sensor/LPS22HBSensor.h"
|
#include "Sensor/LPS22HBSensor.h"
|
||||||
|
#include "Sensor/MCP9808Sensor.h"
|
||||||
#include "Sensor/SHT31Sensor.h"
|
#include "Sensor/SHT31Sensor.h"
|
||||||
|
#include "Sensor/SHTC3Sensor.h"
|
||||||
|
|
||||||
BMP280Sensor bmp280Sensor;
|
BMP280Sensor bmp280Sensor;
|
||||||
BME280Sensor bme280Sensor;
|
BME280Sensor bme280Sensor;
|
||||||
@@ -64,8 +63,7 @@ int32_t EnvironmentTelemetryModule::runOnce()
|
|||||||
// moduleConfig.telemetry.environment_screen_enabled = 1;
|
// moduleConfig.telemetry.environment_screen_enabled = 1;
|
||||||
// moduleConfig.telemetry.environment_update_interval = 45;
|
// moduleConfig.telemetry.environment_update_interval = 45;
|
||||||
|
|
||||||
if (!(moduleConfig.telemetry.environment_measurement_enabled ||
|
if (!(moduleConfig.telemetry.environment_measurement_enabled || moduleConfig.telemetry.environment_screen_enabled)) {
|
||||||
moduleConfig.telemetry.environment_screen_enabled)) {
|
|
||||||
// If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it
|
// If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it
|
||||||
return disable();
|
return disable();
|
||||||
}
|
}
|
||||||
@@ -173,13 +171,15 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
|
|||||||
}
|
}
|
||||||
display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
|
display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
|
||||||
display->drawString(x, y += fontHeight(FONT_SMALL) - 2,
|
display->drawString(x, y += fontHeight(FONT_SMALL) - 2,
|
||||||
"Temp/Hum: " + last_temp + " / " + String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%");
|
"Temp/Hum: " + last_temp + " / " +
|
||||||
|
String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%");
|
||||||
if (lastMeasurement.variant.environment_metrics.barometric_pressure != 0)
|
if (lastMeasurement.variant.environment_metrics.barometric_pressure != 0)
|
||||||
display->drawString(x, y += fontHeight(FONT_SMALL),
|
display->drawString(x, y += fontHeight(FONT_SMALL),
|
||||||
"Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA");
|
"Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA");
|
||||||
if (lastMeasurement.variant.environment_metrics.voltage != 0)
|
if (lastMeasurement.variant.environment_metrics.voltage != 0)
|
||||||
display->drawString(x, y += fontHeight(FONT_SMALL),
|
display->drawString(x, y += fontHeight(FONT_SMALL),
|
||||||
"Volt/Cur: " + String(lastMeasurement.variant.environment_metrics.voltage, 0) + "V / " + String(lastMeasurement.variant.environment_metrics.current, 0) + "mA");
|
"Volt/Cur: " + String(lastMeasurement.variant.environment_metrics.voltage, 0) + "V / " +
|
||||||
|
String(lastMeasurement.variant.environment_metrics.current, 0) + "mA");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemetry *t)
|
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemetry *t)
|
||||||
@@ -187,14 +187,11 @@ bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Te
|
|||||||
if (t->which_variant == Telemetry_environment_metrics_tag) {
|
if (t->which_variant == Telemetry_environment_metrics_tag) {
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n",
|
LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, "
|
||||||
sender,
|
"temperature=%f, voltage=%f\n",
|
||||||
t->variant.environment_metrics.barometric_pressure,
|
sender, t->variant.environment_metrics.barometric_pressure, t->variant.environment_metrics.current,
|
||||||
t->variant.environment_metrics.current,
|
t->variant.environment_metrics.gas_resistance, t->variant.environment_metrics.relative_humidity,
|
||||||
t->variant.environment_metrics.gas_resistance,
|
t->variant.environment_metrics.temperature, t->variant.environment_metrics.voltage);
|
||||||
t->variant.environment_metrics.relative_humidity,
|
|
||||||
t->variant.environment_metrics.temperature,
|
|
||||||
t->variant.environment_metrics.voltage);
|
|
||||||
|
|
||||||
lastMeasurementPacket = packetPool.allocCopy(mp);
|
lastMeasurementPacket = packetPool.allocCopy(mp);
|
||||||
}
|
}
|
||||||
@@ -234,13 +231,11 @@ bool EnvironmentTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
|
|||||||
if (ina260Sensor.hasSensor())
|
if (ina260Sensor.hasSensor())
|
||||||
ina260Sensor.getMetrics(&m);
|
ina260Sensor.getMetrics(&m);
|
||||||
|
|
||||||
LOG_INFO("(Sending): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n",
|
LOG_INFO(
|
||||||
m.variant.environment_metrics.barometric_pressure,
|
"(Sending): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, temperature=%f, voltage=%f\n",
|
||||||
m.variant.environment_metrics.current,
|
m.variant.environment_metrics.barometric_pressure, m.variant.environment_metrics.current,
|
||||||
m.variant.environment_metrics.gas_resistance,
|
m.variant.environment_metrics.gas_resistance, m.variant.environment_metrics.relative_humidity,
|
||||||
m.variant.environment_metrics.relative_humidity,
|
m.variant.environment_metrics.temperature, m.variant.environment_metrics.voltage);
|
||||||
m.variant.environment_metrics.temperature,
|
|
||||||
m.variant.environment_metrics.voltage);
|
|
||||||
|
|
||||||
sensor_read_error_count = 0;
|
sensor_read_error_count = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "BME280Sensor.h"
|
#include "BME280Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_BME280.h>
|
#include <Adafruit_BME280.h>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
BME280Sensor::BME280Sensor() :
|
BME280Sensor::BME280Sensor() : TelemetrySensor(TelemetrySensorType_BME280, "BME280") {}
|
||||||
TelemetrySensor(TelemetrySensorType_BME280, "BME280")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t BME280Sensor::runOnce() {
|
int32_t BME280Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -21,15 +19,15 @@ int32_t BME280Sensor::runOnce() {
|
|||||||
Adafruit_BME280::SAMPLING_X1, // Temp. oversampling
|
Adafruit_BME280::SAMPLING_X1, // Temp. oversampling
|
||||||
Adafruit_BME280::SAMPLING_X1, // Pressure oversampling
|
Adafruit_BME280::SAMPLING_X1, // Pressure oversampling
|
||||||
Adafruit_BME280::SAMPLING_X1, // Humidity oversampling
|
Adafruit_BME280::SAMPLING_X1, // Humidity oversampling
|
||||||
Adafruit_BME280::FILTER_OFF,
|
Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000);
|
||||||
Adafruit_BME280::STANDBY_MS_1000);
|
|
||||||
|
|
||||||
return initI2CSensor();
|
return initI2CSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BME280Sensor::setup() {}
|
void BME280Sensor::setup() {}
|
||||||
|
|
||||||
bool BME280Sensor::getMetrics(Telemetry *measurement) {
|
bool BME280Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
LOG_DEBUG("BME280Sensor::getMetrics\n");
|
LOG_DEBUG("BME280Sensor::getMetrics\n");
|
||||||
bme280.takeForcedMeasurement();
|
bme280.takeForcedMeasurement();
|
||||||
measurement->variant.environment_metrics.temperature = bme280.readTemperature();
|
measurement->variant.environment_metrics.temperature = bme280.readTemperature();
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_BME280.h>
|
#include <Adafruit_BME280.h>
|
||||||
|
|
||||||
class BME280Sensor : virtual public TelemetrySensor {
|
class BME280Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BME280 bme280;
|
Adafruit_BME280 bme280;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "BME680Sensor.h"
|
#include "BME680Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_BME680.h>
|
#include <Adafruit_BME680.h>
|
||||||
|
|
||||||
BME680Sensor::BME680Sensor() :
|
BME680Sensor::BME680Sensor() : TelemetrySensor(TelemetrySensorType_BME680, "BME680") {}
|
||||||
TelemetrySensor(TelemetrySensorType_BME680, "BME680")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t BME680Sensor::runOnce() {
|
int32_t BME680Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -21,7 +19,8 @@ int32_t BME680Sensor::runOnce() {
|
|||||||
|
|
||||||
void BME680Sensor::setup() {}
|
void BME680Sensor::setup() {}
|
||||||
|
|
||||||
bool BME680Sensor::getMetrics(Telemetry *measurement) {
|
bool BME680Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
bme680.performReading();
|
bme680.performReading();
|
||||||
measurement->variant.environment_metrics.temperature = bme680.temperature;
|
measurement->variant.environment_metrics.temperature = bme680.temperature;
|
||||||
measurement->variant.environment_metrics.relative_humidity = bme680.humidity;
|
measurement->variant.environment_metrics.relative_humidity = bme680.humidity;
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_BME680.h>
|
#include <Adafruit_BME680.h>
|
||||||
|
|
||||||
class BME680Sensor : virtual public TelemetrySensor {
|
class BME680Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BME680 bme680;
|
Adafruit_BME680 bme680;
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "BMP280Sensor.h"
|
#include "BMP280Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_BMP280.h>
|
#include <Adafruit_BMP280.h>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
BMP280Sensor::BMP280Sensor() :
|
BMP280Sensor::BMP280Sensor() : TelemetrySensor(TelemetrySensorType_BMP280, "BMP280") {}
|
||||||
TelemetrySensor(TelemetrySensorType_BMP280, "BMP280")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t BMP280Sensor::runOnce() {
|
int32_t BMP280Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -20,15 +18,15 @@ int32_t BMP280Sensor::runOnce() {
|
|||||||
bmp280.setSampling(Adafruit_BMP280::MODE_FORCED,
|
bmp280.setSampling(Adafruit_BMP280::MODE_FORCED,
|
||||||
Adafruit_BMP280::SAMPLING_X1, // Temp. oversampling
|
Adafruit_BMP280::SAMPLING_X1, // Temp. oversampling
|
||||||
Adafruit_BMP280::SAMPLING_X1, // Pressure oversampling
|
Adafruit_BMP280::SAMPLING_X1, // Pressure oversampling
|
||||||
Adafruit_BMP280::FILTER_OFF,
|
Adafruit_BMP280::FILTER_OFF, Adafruit_BMP280::STANDBY_MS_1000);
|
||||||
Adafruit_BMP280::STANDBY_MS_1000);
|
|
||||||
|
|
||||||
return initI2CSensor();
|
return initI2CSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BMP280Sensor::setup() {}
|
void BMP280Sensor::setup() {}
|
||||||
|
|
||||||
bool BMP280Sensor::getMetrics(Telemetry *measurement) {
|
bool BMP280Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
LOG_DEBUG("BMP280Sensor::getMetrics\n");
|
LOG_DEBUG("BMP280Sensor::getMetrics\n");
|
||||||
bmp280.takeForcedMeasurement();
|
bmp280.takeForcedMeasurement();
|
||||||
measurement->variant.environment_metrics.temperature = bmp280.readTemperature();
|
measurement->variant.environment_metrics.temperature = bmp280.readTemperature();
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_BMP280.h>
|
#include <Adafruit_BMP280.h>
|
||||||
|
|
||||||
class BMP280Sensor : virtual public TelemetrySensor {
|
class BMP280Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BMP280 bmp280;
|
Adafruit_BMP280 bmp280;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "INA219Sensor.h"
|
#include "INA219Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_INA219.h>
|
#include <Adafruit_INA219.h>
|
||||||
|
|
||||||
INA219Sensor::INA219Sensor() :
|
INA219Sensor::INA219Sensor() : TelemetrySensor(TelemetrySensorType_INA219, "INA219") {}
|
||||||
TelemetrySensor(TelemetrySensorType_INA219, "INA219")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t INA219Sensor::runOnce() {
|
int32_t INA219Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -19,11 +17,10 @@ int32_t INA219Sensor::runOnce() {
|
|||||||
return initI2CSensor();
|
return initI2CSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void INA219Sensor::setup()
|
void INA219Sensor::setup() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool INA219Sensor::getMetrics(Telemetry *measurement) {
|
bool INA219Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V();
|
measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V();
|
||||||
measurement->variant.environment_metrics.current = ina219.getCurrent_mA();
|
measurement->variant.environment_metrics.current = ina219.getCurrent_mA();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_INA219.h>
|
#include <Adafruit_INA219.h>
|
||||||
|
|
||||||
|
class INA219Sensor : virtual public TelemetrySensor
|
||||||
class INA219Sensor : virtual public TelemetrySensor {
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_INA219 ina219;
|
Adafruit_INA219 ina219;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "INA260Sensor.h"
|
#include "INA260Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_INA260.h>
|
#include <Adafruit_INA260.h>
|
||||||
|
|
||||||
INA260Sensor::INA260Sensor() :
|
INA260Sensor::INA260Sensor() : TelemetrySensor(TelemetrySensorType_INA260, "INA260") {}
|
||||||
TelemetrySensor(TelemetrySensorType_INA260, "INA260")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t INA260Sensor::runOnce() {
|
int32_t INA260Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -18,11 +16,10 @@ int32_t INA260Sensor::runOnce() {
|
|||||||
return initI2CSensor();
|
return initI2CSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void INA260Sensor::setup()
|
void INA260Sensor::setup() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool INA260Sensor::getMetrics(Telemetry *measurement) {
|
bool INA260Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
// mV conversion to V
|
// mV conversion to V
|
||||||
measurement->variant.environment_metrics.voltage = ina260.readBusVoltage() / 1000;
|
measurement->variant.environment_metrics.voltage = ina260.readBusVoltage() / 1000;
|
||||||
measurement->variant.environment_metrics.current = ina260.readCurrent();
|
measurement->variant.environment_metrics.current = ina260.readCurrent();
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_INA260.h>
|
#include <Adafruit_INA260.h>
|
||||||
|
|
||||||
|
class INA260Sensor : virtual public TelemetrySensor
|
||||||
class INA260Sensor : virtual public TelemetrySensor {
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_INA260 ina260 = Adafruit_INA260();
|
Adafruit_INA260 ina260 = Adafruit_INA260();
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "LPS22HBSensor.h"
|
#include "LPS22HBSensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_LPS2X.h>
|
#include <Adafruit_LPS2X.h>
|
||||||
#include <Adafruit_Sensor.h>
|
#include <Adafruit_Sensor.h>
|
||||||
|
|
||||||
LPS22HBSensor::LPS22HBSensor() :
|
LPS22HBSensor::LPS22HBSensor() : TelemetrySensor(TelemetrySensorType_LPS22, "LPS22HB") {}
|
||||||
TelemetrySensor(TelemetrySensorType_LPS22, "LPS22HB")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t LPS22HBSensor::runOnce() {
|
int32_t LPS22HBSensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -24,7 +22,8 @@ void LPS22HBSensor::setup()
|
|||||||
lps22hb.setDataRate(LPS22_RATE_10_HZ);
|
lps22hb.setDataRate(LPS22_RATE_10_HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LPS22HBSensor::getMetrics(Telemetry *measurement) {
|
bool LPS22HBSensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
sensors_event_t temp;
|
sensors_event_t temp;
|
||||||
sensors_event_t pressure;
|
sensors_event_t pressure;
|
||||||
lps22hb.getEvent(&pressure, &temp);
|
lps22hb.getEvent(&pressure, &temp);
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
#include <Adafruit_LPS2X.h>
|
#include <Adafruit_LPS2X.h>
|
||||||
#include <Adafruit_Sensor.h>
|
#include <Adafruit_Sensor.h>
|
||||||
|
|
||||||
class LPS22HBSensor : virtual public TelemetrySensor {
|
class LPS22HBSensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_LPS22 lps22hb;
|
Adafruit_LPS22 lps22hb;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "MCP9808Sensor.h"
|
#include "MCP9808Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_MCP9808.h>
|
#include <Adafruit_MCP9808.h>
|
||||||
|
|
||||||
MCP9808Sensor::MCP9808Sensor() :
|
MCP9808Sensor::MCP9808Sensor() : TelemetrySensor(TelemetrySensorType_MCP9808, "MCP9808") {}
|
||||||
TelemetrySensor(TelemetrySensorType_MCP9808, "MCP9808")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t MCP9808Sensor::runOnce() {
|
int32_t MCP9808Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -18,11 +16,13 @@ int32_t MCP9808Sensor::runOnce() {
|
|||||||
return initI2CSensor();
|
return initI2CSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCP9808Sensor::setup() {
|
void MCP9808Sensor::setup()
|
||||||
|
{
|
||||||
mcp9808.setResolution(2);
|
mcp9808.setResolution(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MCP9808Sensor::getMetrics(Telemetry *measurement) {
|
bool MCP9808Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
LOG_DEBUG("MCP9808Sensor::getMetrics\n");
|
LOG_DEBUG("MCP9808Sensor::getMetrics\n");
|
||||||
measurement->variant.environment_metrics.temperature = mcp9808.readTempC();
|
measurement->variant.environment_metrics.temperature = mcp9808.readTempC();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_MCP9808.h>
|
#include <Adafruit_MCP9808.h>
|
||||||
|
|
||||||
class MCP9808Sensor : virtual public TelemetrySensor {
|
class MCP9808Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_MCP9808 mcp9808;
|
Adafruit_MCP9808 mcp9808;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "SHT31Sensor.h"
|
#include "SHT31Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_SHT31.h>
|
#include <Adafruit_SHT31.h>
|
||||||
|
|
||||||
SHT31Sensor::SHT31Sensor() :
|
SHT31Sensor::SHT31Sensor() : TelemetrySensor(TelemetrySensorType_SHT31, "SHT31") {}
|
||||||
TelemetrySensor(TelemetrySensorType_SHT31, "SHT31")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t SHT31Sensor::runOnce() {
|
int32_t SHT31Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -23,7 +21,8 @@ void SHT31Sensor::setup()
|
|||||||
// Set up oversampling and filter initialization
|
// Set up oversampling and filter initialization
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHT31Sensor::getMetrics(Telemetry *measurement) {
|
bool SHT31Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
measurement->variant.environment_metrics.temperature = sht31.readTemperature();
|
measurement->variant.environment_metrics.temperature = sht31.readTemperature();
|
||||||
measurement->variant.environment_metrics.relative_humidity = sht31.readHumidity();
|
measurement->variant.environment_metrics.relative_humidity = sht31.readHumidity();
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_SHT31.h>
|
#include <Adafruit_SHT31.h>
|
||||||
|
|
||||||
class SHT31Sensor : virtual public TelemetrySensor {
|
class SHT31Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_SHT31 sht31 = Adafruit_SHT31();
|
Adafruit_SHT31 sht31 = Adafruit_SHT31();
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include "SHTC3Sensor.h"
|
#include "SHTC3Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include <Adafruit_SHTC3.h>
|
#include <Adafruit_SHTC3.h>
|
||||||
|
|
||||||
SHTC3Sensor::SHTC3Sensor() :
|
SHTC3Sensor::SHTC3Sensor() : TelemetrySensor(TelemetrySensorType_SHTC3, "SHTC3") {}
|
||||||
TelemetrySensor(TelemetrySensorType_SHTC3, "SHTC3")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t SHTC3Sensor::runOnce() {
|
int32_t SHTC3Sensor::runOnce()
|
||||||
|
{
|
||||||
LOG_INFO("Init sensor: %s\n", sensorName);
|
LOG_INFO("Init sensor: %s\n", sensorName);
|
||||||
if (!hasSensor()) {
|
if (!hasSensor()) {
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
@@ -23,7 +21,8 @@ void SHTC3Sensor::setup()
|
|||||||
// Set up oversampling and filter initialization
|
// Set up oversampling and filter initialization
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHTC3Sensor::getMetrics(Telemetry *measurement) {
|
bool SHTC3Sensor::getMetrics(Telemetry *measurement)
|
||||||
|
{
|
||||||
sensors_event_t humidity, temp;
|
sensors_event_t humidity, temp;
|
||||||
shtc3.getEvent(&humidity, &temp);
|
shtc3.getEvent(&humidity, &temp);
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
#include "TelemetrySensor.h"
|
#include "TelemetrySensor.h"
|
||||||
#include <Adafruit_SHTC3.h>
|
#include <Adafruit_SHTC3.h>
|
||||||
|
|
||||||
class SHTC3Sensor : virtual public TelemetrySensor {
|
class SHTC3Sensor : virtual public TelemetrySensor
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_SHTC3 shtc3 = Adafruit_SHTC3();
|
Adafruit_SHTC3 shtc3 = Adafruit_SHTC3();
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ class TelemetrySensor
|
|||||||
TelemetrySensorType sensorType;
|
TelemetrySensorType sensorType;
|
||||||
unsigned status;
|
unsigned status;
|
||||||
|
|
||||||
int32_t initI2CSensor() {
|
int32_t initI2CSensor()
|
||||||
|
{
|
||||||
if (!status) {
|
if (!status) {
|
||||||
LOG_WARN("Could not connect to detected %s sensor.\n Removing from nodeTelemetrySensorsMap.\n", sensorName);
|
LOG_WARN("Could not connect to detected %s sensor.\n Removing from nodeTelemetrySensorsMap.\n", sensorName);
|
||||||
nodeTelemetrySensorsMap[sensorType] = 0;
|
nodeTelemetrySensorsMap[sensorType] = 0;
|
||||||
@@ -32,9 +33,7 @@ class TelemetrySensor
|
|||||||
virtual void setup();
|
virtual void setup();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool hasSensor() {
|
bool hasSensor() { return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0; }
|
||||||
return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int32_t runOnce() = 0;
|
virtual int32_t runOnce() = 0;
|
||||||
virtual bool getMetrics(Telemetry *measurement) = 0;
|
virtual bool getMetrics(Telemetry *measurement) = 0;
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ void StoreForwardModule::populatePSRAM()
|
|||||||
https://learn.upesy.com/en/programmation/psram.html#psram-tab
|
https://learn.upesy.com/en/programmation/psram.html#psram-tab
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(), ESP.getPsramSize());
|
LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(),
|
||||||
|
ESP.getFreePsram(), ESP.getPsramSize());
|
||||||
|
|
||||||
this->packetHistoryTXQueue =
|
this->packetHistoryTXQueue =
|
||||||
static_cast<PacketHistoryStruct *>(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct)));
|
static_cast<PacketHistoryStruct *>(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct)));
|
||||||
@@ -76,7 +77,8 @@ void StoreForwardModule::populatePSRAM()
|
|||||||
|
|
||||||
this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct)));
|
this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct)));
|
||||||
|
|
||||||
LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(), ESP.getPsramSize());
|
LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(),
|
||||||
|
ESP.getPsramSize());
|
||||||
LOG_DEBUG("*** numberOfPackets for packetHistory - %u\n", numberOfPackets);
|
LOG_DEBUG("*** numberOfPackets for packetHistory - %u\n", numberOfPackets);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,7 +361,8 @@ bool StoreForwardModule::handleReceivedProtobuf(const MeshPacket &mp, StoreAndFo
|
|||||||
if (is_client) {
|
if (is_client) {
|
||||||
LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_BUSY\n");
|
LOG_DEBUG("*** StoreAndForward_RequestResponse_ROUTER_BUSY\n");
|
||||||
// retry in messages_saved * packetTimeMax ms
|
// retry in messages_saved * packetTimeMax ms
|
||||||
retry_delay = millis() + packetHistoryCurrent * packetTimeMax * (StoreAndForward_RequestResponse_ROUTER_ERROR ? 2 : 1);
|
retry_delay =
|
||||||
|
millis() + packetHistoryCurrent * packetTimeMax * (StoreAndForward_RequestResponse_ROUTER_ERROR ? 2 : 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -406,7 +409,8 @@ bool StoreForwardModule::handleReceivedProtobuf(const MeshPacket &mp, StoreAndFo
|
|||||||
// These fields only have informational purpose on a client. Fill them to consume later.
|
// These fields only have informational purpose on a client. Fill them to consume later.
|
||||||
if (p->which_variant == StoreAndForward_history_tag) {
|
if (p->which_variant == StoreAndForward_history_tag) {
|
||||||
this->historyReturnWindow = p->variant.history.window / 60000;
|
this->historyReturnWindow = p->variant.history.window / 60000;
|
||||||
LOG_INFO("*** Router Response HISTORY - Sending %d messages from last %d minutes\n", p->variant.history.history_messages, this->historyReturnWindow);
|
LOG_INFO("*** Router Response HISTORY - Sending %d messages from last %d minutes\n",
|
||||||
|
p->variant.history.history_messages, this->historyReturnWindow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -437,7 +441,8 @@ StoreForwardModule::StoreForwardModule()
|
|||||||
if (moduleConfig.store_forward.enabled) {
|
if (moduleConfig.store_forward.enabled) {
|
||||||
|
|
||||||
// Router
|
// Router
|
||||||
if ((config.device.role == Config_DeviceConfig_Role_ROUTER) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
|
if ((config.device.role == Config_DeviceConfig_Role_ROUTER) ||
|
||||||
|
(config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
|
||||||
LOG_INFO("*** Initializing Store & Forward Module in Router mode\n");
|
LOG_INFO("*** Initializing Store & Forward Module in Router mode\n");
|
||||||
if (ESP.getPsramSize() > 0) {
|
if (ESP.getPsramSize() > 0) {
|
||||||
if (ESP.getFreePsram() >= 1024 * 1024) {
|
if (ESP.getFreePsram() >= 1024 * 1024) {
|
||||||
@@ -474,7 +479,8 @@ StoreForwardModule::StoreForwardModule()
|
|||||||
|
|
||||||
// Client
|
// Client
|
||||||
}
|
}
|
||||||
if ((config.device.role == Config_DeviceConfig_Role_CLIENT) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
|
if ((config.device.role == Config_DeviceConfig_Role_CLIENT) ||
|
||||||
|
(config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
|
||||||
is_client = true;
|
is_client = true;
|
||||||
LOG_INFO("*** Initializing Store & Forward Module in Client mode\n");
|
LOG_INFO("*** Initializing Store & Forward Module in Client mode\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ class StoreForwardModule : private concurrency::OSThread, public ProtobufModule<
|
|||||||
*/
|
*/
|
||||||
virtual ProcessMessage handleReceived(const MeshPacket &mp) override;
|
virtual ProcessMessage handleReceived(const MeshPacket &mp) override;
|
||||||
virtual bool handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p);
|
virtual bool handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern StoreForwardModule *storeForwardModule;
|
extern StoreForwardModule *storeForwardModule;
|
||||||
+36
-16
@@ -12,8 +12,8 @@
|
|||||||
#if HAS_WIFI
|
#if HAS_WIFI
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#endif
|
#endif
|
||||||
#include <assert.h>
|
|
||||||
#include "mqtt/JSON.h"
|
#include "mqtt/JSON.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
MQTT *mqtt;
|
MQTT *mqtt;
|
||||||
|
|
||||||
@@ -55,11 +55,15 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
|
|||||||
}
|
}
|
||||||
LOG_DEBUG("Looking for Channel name: %s\n", ptr);
|
LOG_DEBUG("Looking for Channel name: %s\n", ptr);
|
||||||
Channel sendChannel = channels.getByName(ptr);
|
Channel sendChannel = channels.getByName(ptr);
|
||||||
LOG_DEBUG("Found Channel name: %s (Index %d)\n", channels.getGlobalId(sendChannel.settings.channel_num), sendChannel.settings.channel_num);
|
LOG_DEBUG("Found Channel name: %s (Index %d)\n", channels.getGlobalId(sendChannel.settings.channel_num),
|
||||||
|
sendChannel.settings.channel_num);
|
||||||
|
|
||||||
if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) && (json.find("type") != json.end()) && json["type"]->IsString() && (json["type"]->AsString().compare("sendtext") == 0)) {
|
if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) &&
|
||||||
|
(json.find("type") != json.end()) && json["type"]->IsString() &&
|
||||||
|
(json["type"]->AsString().compare("sendtext") == 0)) {
|
||||||
// this is a valid envelope
|
// this is a valid envelope
|
||||||
if (json["payload"]->IsString() && json["type"]->IsString() && (json["sender"]->AsString().compare(owner.id) != 0)) {
|
if (json["payload"]->IsString() && json["type"]->IsString() &&
|
||||||
|
(json["sender"]->AsString().compare(owner.id) != 0)) {
|
||||||
std::string jsonPayloadStr = json["payload"]->AsString();
|
std::string jsonPayloadStr = json["payload"]->AsString();
|
||||||
LOG_INFO("JSON payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length());
|
LOG_INFO("JSON payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length());
|
||||||
|
|
||||||
@@ -77,14 +81,18 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
|
|||||||
LOG_WARN("Received MQTT json payload too long, dropping\n");
|
LOG_WARN("Received MQTT json payload too long, dropping\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n", sendChannel.settings.name);
|
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n",
|
||||||
|
sendChannel.settings.name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
|
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
|
||||||
}
|
}
|
||||||
} else if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) && (json.find("type") != json.end()) && json["type"]->IsString() && (json["type"]->AsString().compare("sendposition") == 0)) {
|
} else if ((json.find("sender") != json.end()) && (json.find("payload") != json.end()) &&
|
||||||
|
(json.find("type") != json.end()) && json["type"]->IsString() &&
|
||||||
|
(json["type"]->AsString().compare("sendposition") == 0)) {
|
||||||
// invent the "sendposition" type for a valid envelope
|
// invent the "sendposition" type for a valid envelope
|
||||||
if (json["payload"]->IsObject() && json["type"]->IsString() && (json["sender"]->AsString().compare(owner.id) != 0)) {
|
if (json["payload"]->IsObject() && json["type"]->IsString() &&
|
||||||
|
(json["sender"]->AsString().compare(owner.id) != 0)) {
|
||||||
JSONObject posit;
|
JSONObject posit;
|
||||||
posit = json["payload"]->AsObject(); // get nested JSON Position
|
posit = json["payload"]->AsObject(); // get nested JSON Position
|
||||||
Position pos = Position_init_default;
|
Position pos = Position_init_default;
|
||||||
@@ -98,10 +106,12 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
|
|||||||
p->decoded.portnum = PortNum_POSITION_APP;
|
p->decoded.portnum = PortNum_POSITION_APP;
|
||||||
p->channel = sendChannel.settings.channel_num;
|
p->channel = sendChannel.settings.channel_num;
|
||||||
if (sendChannel.settings.downlink_enabled) {
|
if (sendChannel.settings.downlink_enabled) {
|
||||||
p->decoded.payload.size = pb_encode_to_bytes(p->decoded.payload.bytes, sizeof(p->decoded.payload.bytes), &Position_msg, &pos); //make the Data protobuf from position
|
p->decoded.payload.size = pb_encode_to_bytes(p->decoded.payload.bytes, sizeof(p->decoded.payload.bytes),
|
||||||
|
&Position_msg, &pos); // make the Data protobuf from position
|
||||||
service.sendToMesh(p, RX_SRC_LOCAL);
|
service.sendToMesh(p, RX_SRC_LOCAL);
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n", sendChannel.settings.name);
|
LOG_WARN("Received MQTT json payload on channel %s, but downlink is disabled, dropping\n",
|
||||||
|
sendChannel.settings.name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
|
LOG_DEBUG("JSON Ignoring downlink message we originally sent.\n");
|
||||||
@@ -192,7 +202,8 @@ void MQTT::reconnect()
|
|||||||
pubSub.setServer(serverAddr, serverPort);
|
pubSub.setServer(serverAddr, serverPort);
|
||||||
pubSub.setBufferSize(512);
|
pubSub.setBufferSize(512);
|
||||||
|
|
||||||
LOG_INFO("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername, mqttPassword);
|
LOG_INFO("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername,
|
||||||
|
mqttPassword);
|
||||||
auto myStatus = (statusTopic + owner.id);
|
auto myStatus = (statusTopic + owner.id);
|
||||||
bool connected = pubSub.connect(owner.id, mqttUsername, mqttPassword, myStatus.c_str(), 1, true, "offline");
|
bool connected = pubSub.connect(owner.id, mqttUsername, mqttPassword, myStatus.c_str(), 1, true, "offline");
|
||||||
if (connected) {
|
if (connected) {
|
||||||
@@ -277,7 +288,8 @@ int32_t MQTT::runOnce()
|
|||||||
if (wantConnection) {
|
if (wantConnection) {
|
||||||
reconnect();
|
reconnect();
|
||||||
|
|
||||||
// If we succeeded, empty the queue one by one and start reading rapidly, else try again in 30 seconds (TCP connections are EXPENSIVE so try rarely)
|
// If we succeeded, empty the queue one by one and start reading rapidly, else try again in 30 seconds (TCP
|
||||||
|
// connections are EXPENSIVE so try rarely)
|
||||||
if (pubSub.connected()) {
|
if (pubSub.connected()) {
|
||||||
if (!mqttQueue.isEmpty()) {
|
if (!mqttQueue.isEmpty()) {
|
||||||
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
|
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
|
||||||
@@ -295,7 +307,8 @@ int32_t MQTT::runOnce()
|
|||||||
auto jsonString = this->downstreamPacketToJson(env->packet);
|
auto jsonString = this->downstreamPacketToJson(env->packet);
|
||||||
if (jsonString.length() != 0) {
|
if (jsonString.length() != 0) {
|
||||||
String topicJson = jsonTopic + env->channel_id + "/" + owner.id;
|
String topicJson = jsonTopic + env->channel_id + "/" + owner.id;
|
||||||
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str());
|
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
|
||||||
|
jsonString.c_str());
|
||||||
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
|
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,7 +361,8 @@ void MQTT::onSend(const MeshPacket &mp, ChannelIndex chIndex)
|
|||||||
auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp);
|
auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp);
|
||||||
if (jsonString.length() != 0) {
|
if (jsonString.length() != 0) {
|
||||||
String topicJson = jsonTopic + channelId + "/" + owner.id;
|
String topicJson = jsonTopic + channelId + "/" + owner.id;
|
||||||
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str());
|
LOG_INFO("JSON publish message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(),
|
||||||
|
jsonString.c_str());
|
||||||
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
|
pubSub.publish(topicJson.c_str(), jsonString.c_str(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -453,11 +467,17 @@ std::string MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
memset(&scratch, 0, sizeof(scratch));
|
memset(&scratch, 0, sizeof(scratch));
|
||||||
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) {
|
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) {
|
||||||
decoded = &scratch;
|
decoded = &scratch;
|
||||||
if((int)decoded->time){msgPayload["time"] = new JSONValue((int)decoded->time);}
|
if ((int)decoded->time) {
|
||||||
if ((int)decoded->timestamp){msgPayload["timestamp"] = new JSONValue((int)decoded->timestamp);}
|
msgPayload["time"] = new JSONValue((int)decoded->time);
|
||||||
|
}
|
||||||
|
if ((int)decoded->timestamp) {
|
||||||
|
msgPayload["timestamp"] = new JSONValue((int)decoded->timestamp);
|
||||||
|
}
|
||||||
msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i);
|
msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i);
|
||||||
msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i);
|
msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i);
|
||||||
if((int)decoded->altitude){msgPayload["altitude"] = new JSONValue((int)decoded->altitude);}
|
if ((int)decoded->altitude) {
|
||||||
|
msgPayload["altitude"] = new JSONValue((int)decoded->altitude);
|
||||||
|
}
|
||||||
jsonObj["payload"] = new JSONValue(msgPayload);
|
jsonObj["payload"] = new JSONValue(msgPayload);
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR("Error decoding protobuf for position message!\n");
|
LOG_ERROR("Error decoding protobuf for position message!\n");
|
||||||
|
|||||||
+4
-2
@@ -64,7 +64,8 @@ int XModemAdapter::check(const pb_byte_t *buf, int sz, unsigned short tcrc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void XModemAdapter::sendControl(XModem_Control c) {
|
void XModemAdapter::sendControl(XModem_Control c)
|
||||||
|
{
|
||||||
memset(xmodemStore, 0, XModem_size);
|
memset(xmodemStore, 0, XModem_size);
|
||||||
xmodemStore->control = c;
|
xmodemStore->control = c;
|
||||||
LOG_DEBUG("XModem: Notify Sending control %d.\n", c);
|
LOG_DEBUG("XModem: Notify Sending control %d.\n", c);
|
||||||
@@ -125,7 +126,8 @@ void XModemAdapter::handlePacket(XModem xmodemPacket)
|
|||||||
} else {
|
} else {
|
||||||
if (isReceiving) {
|
if (isReceiving) {
|
||||||
// normal file data packet
|
// normal file data packet
|
||||||
if ((xmodemPacket.seq == packetno) && check(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size, xmodemPacket.crc16)) {
|
if ((xmodemPacket.seq == packetno) &&
|
||||||
|
check(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size, xmodemPacket.crc16)) {
|
||||||
// valid packet
|
// valid packet
|
||||||
file.write(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
|
file.write(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
|
||||||
sendControl(XModem_Control_ACK);
|
sendControl(XModem_Control_ACK);
|
||||||
|
|||||||
+1
-1
@@ -32,9 +32,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "FSCommon.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "mesh/generated/meshtastic/xmodem.pb.h"
|
#include "mesh/generated/meshtastic/xmodem.pb.h"
|
||||||
#include "FSCommon.h"
|
|
||||||
|
|
||||||
#define MAXRETRANS 25
|
#define MAXRETRANS 25
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user