diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index 25576fb6a..ca0995c65 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -25,13 +25,13 @@ along with this program. If not, see .
#include "GPS.h"
#include "MeshService.h"
#include "NodeDB.h"
+#include "Screen.h"
+#include "configs.h"
#include "configuration.h"
#include "graphics/images.h"
#include "main.h"
#include "mesh-pb-constants.h"
-#include "Screen.h"
#include "utils.h"
-#include "configs.h"
using namespace meshtastic; /** @todo remove */
@@ -44,10 +44,10 @@ static uint32_t targetFramerate = IDLE_FRAMERATE;
static char btPIN[16] = "888888";
// This image definition is here instead of images.h because it's modified dynamically by the drawBattery function
-uint8_t imgBattery[16] = { 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xE7, 0x3C };
+uint8_t imgBattery[16] = {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xE7, 0x3C};
// Threshold values for the GPS lock accuracy bar display
-uint32_t dopThresholds[5] = { 2000, 1000, 500, 200, 100 };
+uint32_t dopThresholds[5] = {2000, 1000, 500, 200, 100};
// Stores the last 4 of our hardware ID, to make finding the device for pairing easier
static char ourId[5];
@@ -208,37 +208,32 @@ static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, NodeStatus *no
// Draw GPS status summary
static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus *gps)
{
- if (!gps->getIsConnected())
- {
+ if (!gps->getIsConnected()) {
display->drawString(x, y - 2, "No GPS");
return;
}
display->drawFastImage(x, y, 6, 8, gps->getHasLock() ? imgPositionSolid : imgPositionEmpty);
- if (!gps->getHasLock())
- {
+ if (!gps->getHasLock()) {
display->drawString(x + 8, y - 2, "No sats");
return;
- }
- else
- {
+ } else {
char satsString[3];
- uint8_t bar[2] = { 0 };
+ uint8_t bar[2] = {0};
- //Draw DOP signal bars
- for(int i = 0; i < 5; i++)
- {
+ // Draw DOP signal bars
+ for (int i = 0; i < 5; i++) {
if (gps->getDOP() <= dopThresholds[i])
bar[0] = ~((1 << (5 - i)) - 1);
else
bar[0] = 0b10000000;
- //bar[1] = bar[0];
+ // bar[1] = bar[0];
display->drawFastImage(x + 9 + (i * 2), y, 2, 8, bar);
}
- //Draw satellite image
+ // Draw satellite image
display->drawFastImage(x + 24, y, 8, 8, imgSatellite);
- //Draw the number of satellites
+ // Draw the number of satellites
sprintf(satsString, "%d", gps->getNumSatellites());
display->drawString(x + 34, y - 2, satsString);
}
@@ -390,7 +385,6 @@ static void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t comp
float arrowOffsetX = 0.2f, arrowOffsetY = 0.2f;
Point leftArrow(tip.x - arrowOffsetX, tip.y - arrowOffsetY), rightArrow(tip.x + arrowOffsetX, tip.y - arrowOffsetY);
-
Point *arrowPoints[] = {&tip, &tail, &leftArrow, &rightArrow};
for (int i = 0; i < 4; i++) {
@@ -406,8 +400,8 @@ static void drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t comp
// Draw the compass heading
static void drawCompassHeading(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading)
{
- Point N1(-0.04f, -0.65f), N2( 0.04f, -0.65f);
- Point N3(-0.04f, -0.55f), N4( 0.04f, -0.55f);
+ Point N1(-0.04f, -0.65f), N2(0.04f, -0.65f);
+ Point N3(-0.04f, -0.55f), N4(0.04f, -0.55f);
Point *rosePoints[] = {&N1, &N2, &N3, &N4};
for (int i = 0; i < 4; i++) {
@@ -440,8 +434,7 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
displayedNodeNum = n->num;
// We just changed to a new node screen, ask that node for updated state if it's older than 2 minutes
- if(sinceLastSeen(n) > 120)
- {
+ if (sinceLastSeen(n) > 120) {
service.sendNetworkPing(displayedNodeNum, true);
}
}
@@ -477,14 +470,12 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
int16_t compassX = x + SCREEN_WIDTH - COMPASS_DIAM / 2 - 5, compassY = y + SCREEN_HEIGHT / 2;
bool hasNodeHeading = false;
- if(ourNode && hasPosition(ourNode))
- {
+ if (ourNode && hasPosition(ourNode)) {
Position &op = ourNode->position;
float myHeading = estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
drawCompassHeading(display, compassX, compassY, myHeading);
- if(hasPosition(node))
- {
+ if (hasPosition(node)) {
// display direction toward node
hasNodeHeading = true;
Position &p = node->position;
@@ -499,16 +490,15 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
float bearingToOther = bearing(DegD(p.latitude_i), DegD(p.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i));
headingRadian = bearingToOther - myHeading;
drawNodeHeading(display, compassX, compassY, headingRadian);
- }
+ }
}
- if(!hasNodeHeading)
+ if (!hasNodeHeading)
// direction to node is unknown so display question mark
// Debug info for gps lock errors
// DEBUG_MSG("ourNode %d, ourPos %d, theirPos %d\n", !!ourNode, ourNode && hasPosition(ourNode), hasPosition(node));
display->drawString(compassX - FONT_HEIGHT / 4, compassY - FONT_HEIGHT / 2, "?");
display->drawCircle(compassX, compassY, COMPASS_DIAM / 2);
-
// Must be after distStr is populated
drawColumns(display, x, y, fields);
}
@@ -779,7 +769,7 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
char channelStr[20];
{
concurrency::LockGuard guard(&lock);
- snprintf(channelStr, sizeof(channelStr), "#%s", channelName.c_str());
+ snprintf(channelStr, sizeof(channelStr), "%s", channelName.c_str());
// Display power status
if (powerStatus->getHasBattery())
@@ -824,18 +814,17 @@ void Screen::adjustBrightness()
dispdev.setBrightness(brightness);
}
-int Screen::handleStatusUpdate(const meshtastic::Status *arg)
+int Screen::handleStatusUpdate(const meshtastic::Status *arg)
{
- //DEBUG_MSG("Screen got status update %d\n", arg->getStatusType());
- switch(arg->getStatusType())
- {
- case STATUS_TYPE_NODE:
- if (nodeDB.updateTextMessage || nodeStatus->getLastNumTotal() != nodeStatus->getNumTotal())
- setFrames();
- prevFrame = -1;
- nodeDB.updateGUI = false;
- nodeDB.updateTextMessage = false;
- break;
+ // DEBUG_MSG("Screen got status update %d\n", arg->getStatusType());
+ switch (arg->getStatusType()) {
+ case STATUS_TYPE_NODE:
+ if (nodeDB.updateTextMessage || nodeStatus->getLastNumTotal() != nodeStatus->getNumTotal())
+ setFrames();
+ prevFrame = -1;
+ nodeDB.updateGUI = false;
+ nodeDB.updateTextMessage = false;
+ break;
}
setPeriod(1); // Update the screen right away
return 0;
diff --git a/src/main.cpp b/src/main.cpp
index 3d5dd6975..b8ee00219 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -364,7 +364,7 @@ void loop()
#endif
// Update the screen last, after we've figured out what to show.
- screen.debug_info()->setChannelNameStatus(channelSettings.name);
+ screen.debug_info()->setChannelNameStatus(getChannelName());
// screen.debug()->setPowerStatus(powerStatus);
// No GPS lock yet, let the OS put the main CPU in low power mode for 100ms (or until another interrupt comes in)
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 206d00239..1b7a1cd84 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -66,6 +66,33 @@ static uint8_t ourMacAddr[6];
*/
NodeNum displayedNodeNum;
+/**
+ * Generate a short suffix used to disambiguate channels that might have the same "name" entered by the human but different PSKs.
+ * The ideas is that the PSK changing should be visible to the user so that they see they probably messed up and that's why they
+their nodes
+ * aren't talking to each other.
+ *
+ * This string is of the form "#name-XY".
+ *
+ * Where X is a letter from A to Z (base26), and formed by xoring all the bytes of the PSK together.
+ * Y is not yet used but should eventually indicate 'speed/range' of the link
+ *
+ * This function will also need to be implemented in GUI apps that talk to the radio.
+ *
+ * https://github.com/meshtastic/Meshtastic-device/issues/269
+ */
+const char *getChannelName()
+{
+ static char buf[32];
+
+ uint8_t code = 0;
+ for (int i = 0; i < sizeof(channelSettings.psk.size); i++)
+ code ^= channelSettings.psk.bytes[i];
+
+ snprintf(buf, sizeof(buf), "#%s-%c", channelSettings.name, 'A' + (code % 26));
+ return buf;
+}
+
NodeDB::NodeDB() : nodes(devicestate.node_db), numNodes(&devicestate.node_db_count) {}
void NodeDB::resetRadioConfig()
diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h
index f8bbb4d69..bd22f730f 100644
--- a/src/mesh/NodeDB.h
+++ b/src/mesh/NodeDB.h
@@ -1,12 +1,12 @@
#pragma once
+#include "Observer.h"
#include
#include
-#include "Observer.h"
#include "MeshTypes.h"
-#include "mesh-pb-constants.h"
#include "NodeStatus.h"
+#include "mesh-pb-constants.h"
extern DeviceState devicestate;
extern MyNodeInfo &myNodeInfo;
@@ -95,7 +95,8 @@ class NodeDB
NodeInfo *getOrCreateNode(NodeNum n);
/// Notify observers of changes to the DB
- void notifyObservers(bool forceUpdate = false) {
+ void notifyObservers(bool forceUpdate = false)
+ {
// Notify observers of the current node state
const meshtastic::NodeStatus status = meshtastic::NodeStatus(getNumOnlineNodes(), getNumNodes(), forceUpdate);
newStatus.notifyObservers(&status);
@@ -115,3 +116,20 @@ class NodeDB
extern NodeNum displayedNodeNum;
extern NodeDB nodeDB;
+
+/**
+ * Generate a short suffix used to disambiguate channels that might have the same "name" entered by the human but different PSKs.
+ * The ideas is that the PSK changing should be visible to the user so that they see they probably messed up and that's why they
+their nodes
+ * aren't talking to each other.
+ *
+ * This string is of the form "#name-XY".
+ *
+ * Where X is a letter from A to Z (base26), and formed by xoring all the bytes of the PSK together.
+ * Y is not yet used but should eventually indicate 'speed/range' of the link
+ *
+ * This function will also need to be implemented in GUI apps that talk to the radio.
+ *
+ * https://github.com/meshtastic/Meshtastic-device/issues/269
+ */
+const char *getChannelName();
\ No newline at end of file
diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp
index 69e335ed4..26be9de3f 100644
--- a/src/mesh/RadioInterface.cpp
+++ b/src/mesh/RadioInterface.cpp
@@ -115,6 +115,8 @@ unsigned long hash(char *str)
return hash;
}
+
+
#define POWER_DEFAULT 17
/**