mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-26 09:59:01 +00:00
fix #269 see below
/** * 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();
This commit is contained in:
parent
178958c165
commit
55dafcbecb
@ -25,13 +25,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "GPS.h"
|
#include "GPS.h"
|
||||||
#include "MeshService.h"
|
#include "MeshService.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
|
#include "Screen.h"
|
||||||
|
#include "configs.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "graphics/images.h"
|
#include "graphics/images.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "mesh-pb-constants.h"
|
#include "mesh-pb-constants.h"
|
||||||
#include "Screen.h"
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "configs.h"
|
|
||||||
|
|
||||||
using namespace meshtastic; /** @todo remove */
|
using namespace meshtastic; /** @todo remove */
|
||||||
|
|
||||||
@ -44,10 +44,10 @@ static uint32_t targetFramerate = IDLE_FRAMERATE;
|
|||||||
static char btPIN[16] = "888888";
|
static char btPIN[16] = "888888";
|
||||||
|
|
||||||
// This image definition is here instead of images.h because it's modified dynamically by the drawBattery function
|
// 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
|
// 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
|
// Stores the last 4 of our hardware ID, to make finding the device for pairing easier
|
||||||
static char ourId[5];
|
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
|
// Draw GPS status summary
|
||||||
static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus *gps)
|
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");
|
display->drawString(x, y - 2, "No GPS");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
display->drawFastImage(x, y, 6, 8, gps->getHasLock() ? imgPositionSolid : imgPositionEmpty);
|
display->drawFastImage(x, y, 6, 8, gps->getHasLock() ? imgPositionSolid : imgPositionEmpty);
|
||||||
if (!gps->getHasLock())
|
if (!gps->getHasLock()) {
|
||||||
{
|
|
||||||
display->drawString(x + 8, y - 2, "No sats");
|
display->drawString(x + 8, y - 2, "No sats");
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
char satsString[3];
|
char satsString[3];
|
||||||
uint8_t bar[2] = { 0 };
|
uint8_t bar[2] = {0};
|
||||||
|
|
||||||
//Draw DOP signal bars
|
// Draw DOP signal bars
|
||||||
for(int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++) {
|
||||||
{
|
|
||||||
if (gps->getDOP() <= dopThresholds[i])
|
if (gps->getDOP() <= dopThresholds[i])
|
||||||
bar[0] = ~((1 << (5 - i)) - 1);
|
bar[0] = ~((1 << (5 - i)) - 1);
|
||||||
else
|
else
|
||||||
bar[0] = 0b10000000;
|
bar[0] = 0b10000000;
|
||||||
//bar[1] = bar[0];
|
// bar[1] = bar[0];
|
||||||
display->drawFastImage(x + 9 + (i * 2), y, 2, 8, bar);
|
display->drawFastImage(x + 9 + (i * 2), y, 2, 8, bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw satellite image
|
// Draw satellite image
|
||||||
display->drawFastImage(x + 24, y, 8, 8, imgSatellite);
|
display->drawFastImage(x + 24, y, 8, 8, imgSatellite);
|
||||||
|
|
||||||
//Draw the number of satellites
|
// Draw the number of satellites
|
||||||
sprintf(satsString, "%d", gps->getNumSatellites());
|
sprintf(satsString, "%d", gps->getNumSatellites());
|
||||||
display->drawString(x + 34, y - 2, satsString);
|
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;
|
float arrowOffsetX = 0.2f, arrowOffsetY = 0.2f;
|
||||||
Point leftArrow(tip.x - arrowOffsetX, tip.y - arrowOffsetY), rightArrow(tip.x + arrowOffsetX, tip.y - arrowOffsetY);
|
Point leftArrow(tip.x - arrowOffsetX, tip.y - arrowOffsetY), rightArrow(tip.x + arrowOffsetX, tip.y - arrowOffsetY);
|
||||||
|
|
||||||
|
|
||||||
Point *arrowPoints[] = {&tip, &tail, &leftArrow, &rightArrow};
|
Point *arrowPoints[] = {&tip, &tail, &leftArrow, &rightArrow};
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
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
|
// Draw the compass heading
|
||||||
static void drawCompassHeading(OLEDDisplay *display, int16_t compassX, int16_t compassY, float myHeading)
|
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 N1(-0.04f, -0.65f), N2(0.04f, -0.65f);
|
||||||
Point N3(-0.04f, -0.55f), N4( 0.04f, -0.55f);
|
Point N3(-0.04f, -0.55f), N4(0.04f, -0.55f);
|
||||||
Point *rosePoints[] = {&N1, &N2, &N3, &N4};
|
Point *rosePoints[] = {&N1, &N2, &N3, &N4};
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
@ -440,8 +434,7 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
|
|||||||
displayedNodeNum = n->num;
|
displayedNodeNum = n->num;
|
||||||
|
|
||||||
// We just changed to a new node screen, ask that node for updated state if it's older than 2 minutes
|
// 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);
|
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;
|
int16_t compassX = x + SCREEN_WIDTH - COMPASS_DIAM / 2 - 5, compassY = y + SCREEN_HEIGHT / 2;
|
||||||
bool hasNodeHeading = false;
|
bool hasNodeHeading = false;
|
||||||
|
|
||||||
if(ourNode && hasPosition(ourNode))
|
if (ourNode && hasPosition(ourNode)) {
|
||||||
{
|
|
||||||
Position &op = ourNode->position;
|
Position &op = ourNode->position;
|
||||||
float myHeading = estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
|
float myHeading = estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
|
||||||
drawCompassHeading(display, compassX, compassY, myHeading);
|
drawCompassHeading(display, compassX, compassY, myHeading);
|
||||||
|
|
||||||
if(hasPosition(node))
|
if (hasPosition(node)) {
|
||||||
{
|
|
||||||
// display direction toward node
|
// display direction toward node
|
||||||
hasNodeHeading = true;
|
hasNodeHeading = true;
|
||||||
Position &p = node->position;
|
Position &p = node->position;
|
||||||
@ -501,14 +492,13 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
|
|||||||
drawNodeHeading(display, compassX, compassY, headingRadian);
|
drawNodeHeading(display, compassX, compassY, headingRadian);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!hasNodeHeading)
|
if (!hasNodeHeading)
|
||||||
// direction to node is unknown so display question mark
|
// direction to node is unknown so display question mark
|
||||||
// Debug info for gps lock errors
|
// Debug info for gps lock errors
|
||||||
// DEBUG_MSG("ourNode %d, ourPos %d, theirPos %d\n", !!ourNode, ourNode && hasPosition(ourNode), hasPosition(node));
|
// 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->drawString(compassX - FONT_HEIGHT / 4, compassY - FONT_HEIGHT / 2, "?");
|
||||||
display->drawCircle(compassX, compassY, COMPASS_DIAM / 2);
|
display->drawCircle(compassX, compassY, COMPASS_DIAM / 2);
|
||||||
|
|
||||||
|
|
||||||
// Must be after distStr is populated
|
// Must be after distStr is populated
|
||||||
drawColumns(display, x, y, fields);
|
drawColumns(display, x, y, fields);
|
||||||
}
|
}
|
||||||
@ -779,7 +769,7 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
char channelStr[20];
|
char channelStr[20];
|
||||||
{
|
{
|
||||||
concurrency::LockGuard guard(&lock);
|
concurrency::LockGuard guard(&lock);
|
||||||
snprintf(channelStr, sizeof(channelStr), "#%s", channelName.c_str());
|
snprintf(channelStr, sizeof(channelStr), "%s", channelName.c_str());
|
||||||
|
|
||||||
// Display power status
|
// Display power status
|
||||||
if (powerStatus->getHasBattery())
|
if (powerStatus->getHasBattery())
|
||||||
@ -826,9 +816,8 @@ void Screen::adjustBrightness()
|
|||||||
|
|
||||||
int Screen::handleStatusUpdate(const meshtastic::Status *arg)
|
int Screen::handleStatusUpdate(const meshtastic::Status *arg)
|
||||||
{
|
{
|
||||||
//DEBUG_MSG("Screen got status update %d\n", arg->getStatusType());
|
// DEBUG_MSG("Screen got status update %d\n", arg->getStatusType());
|
||||||
switch(arg->getStatusType())
|
switch (arg->getStatusType()) {
|
||||||
{
|
|
||||||
case STATUS_TYPE_NODE:
|
case STATUS_TYPE_NODE:
|
||||||
if (nodeDB.updateTextMessage || nodeStatus->getLastNumTotal() != nodeStatus->getNumTotal())
|
if (nodeDB.updateTextMessage || nodeStatus->getLastNumTotal() != nodeStatus->getNumTotal())
|
||||||
setFrames();
|
setFrames();
|
||||||
|
@ -364,7 +364,7 @@ void loop()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Update the screen last, after we've figured out what to show.
|
// 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);
|
// 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)
|
// No GPS lock yet, let the OS put the main CPU in low power mode for 100ms (or until another interrupt comes in)
|
||||||
|
@ -66,6 +66,33 @@ static uint8_t ourMacAddr[6];
|
|||||||
*/
|
*/
|
||||||
NodeNum displayedNodeNum;
|
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) {}
|
NodeDB::NodeDB() : nodes(devicestate.node_db), numNodes(&devicestate.node_db_count) {}
|
||||||
|
|
||||||
void NodeDB::resetRadioConfig()
|
void NodeDB::resetRadioConfig()
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Observer.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "Observer.h"
|
|
||||||
|
|
||||||
#include "MeshTypes.h"
|
#include "MeshTypes.h"
|
||||||
#include "mesh-pb-constants.h"
|
|
||||||
#include "NodeStatus.h"
|
#include "NodeStatus.h"
|
||||||
|
#include "mesh-pb-constants.h"
|
||||||
|
|
||||||
extern DeviceState devicestate;
|
extern DeviceState devicestate;
|
||||||
extern MyNodeInfo &myNodeInfo;
|
extern MyNodeInfo &myNodeInfo;
|
||||||
@ -95,7 +95,8 @@ class NodeDB
|
|||||||
NodeInfo *getOrCreateNode(NodeNum n);
|
NodeInfo *getOrCreateNode(NodeNum n);
|
||||||
|
|
||||||
/// Notify observers of changes to the DB
|
/// Notify observers of changes to the DB
|
||||||
void notifyObservers(bool forceUpdate = false) {
|
void notifyObservers(bool forceUpdate = false)
|
||||||
|
{
|
||||||
// Notify observers of the current node state
|
// Notify observers of the current node state
|
||||||
const meshtastic::NodeStatus status = meshtastic::NodeStatus(getNumOnlineNodes(), getNumNodes(), forceUpdate);
|
const meshtastic::NodeStatus status = meshtastic::NodeStatus(getNumOnlineNodes(), getNumNodes(), forceUpdate);
|
||||||
newStatus.notifyObservers(&status);
|
newStatus.notifyObservers(&status);
|
||||||
@ -115,3 +116,20 @@ class NodeDB
|
|||||||
extern NodeNum displayedNodeNum;
|
extern NodeNum displayedNodeNum;
|
||||||
|
|
||||||
extern NodeDB nodeDB;
|
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();
|
@ -115,6 +115,8 @@ unsigned long hash(char *str)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define POWER_DEFAULT 17
|
#define POWER_DEFAULT 17
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user