sforkowany z mirror/meshtastic-firmware
commit
c83ff03d66
|
@ -196,7 +196,7 @@ Nice ideas worth considering someday...
|
||||||
- DONE neg 7 error code from receive
|
- DONE neg 7 error code from receive
|
||||||
- DONE remove unused sx1262 lib from github
|
- DONE remove unused sx1262 lib from github
|
||||||
- at boot we are starting our message IDs at 1, rather we should start them at a random number. also, seed random based on timer. this could be the cause of our first message not seen bug.
|
- at boot we are starting our message IDs at 1, rather we should start them at a random number. also, seed random based on timer. this could be the cause of our first message not seen bug.
|
||||||
- add a NEMA based GPS driver to test GPS
|
- add a NMEA based GPS driver to test GPS
|
||||||
- DONE use "variants" to get all gpio bindings
|
- DONE use "variants" to get all gpio bindings
|
||||||
- DONE plug in correct variants for the real board
|
- DONE plug in correct variants for the real board
|
||||||
- turn on DFU assistance in the appload using the nordic DFU helper lib call
|
- turn on DFU assistance in the appload using the nordic DFU helper lib call
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "NEMAGPS.h"
|
#include "NMEAGPS.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "timing.h"
|
#include "timing.h"
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ static int32_t toDegInt(RawDegrees d)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NEMAGPS::loop()
|
void NMEAGPS::loop()
|
||||||
{
|
{
|
||||||
while (_serial_gps->available() > 0) {
|
while (_serial_gps->available() > 0) {
|
||||||
int c = _serial_gps->read();
|
int c = _serial_gps->read();
|
||||||
|
@ -44,6 +44,9 @@ void NEMAGPS::loop()
|
||||||
isConnected = true; // we seem to have a real GPS (but not necessarily a lock)
|
isConnected = true; // we seem to have a real GPS (but not necessarily a lock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t fixtype = reader.fixQuality();
|
||||||
|
hasValidLocation = ((fixtype >= 1) && (fixtype <= 5));
|
||||||
|
|
||||||
if (reader.location.isUpdated()) {
|
if (reader.location.isUpdated()) {
|
||||||
if (reader.altitude.isValid())
|
if (reader.altitude.isValid())
|
||||||
altitude = reader.altitude.meters();
|
altitude = reader.altitude.meters();
|
||||||
|
@ -58,18 +61,21 @@ void NEMAGPS::loop()
|
||||||
dop = reader.hdop.value();
|
dop = reader.hdop.value();
|
||||||
}
|
}
|
||||||
if (reader.course.isValid()) {
|
if (reader.course.isValid()) {
|
||||||
heading = reader.course.value() * 1e3; //Scale the heading (in degrees * 10^-2) to match the expected degrees * 10^-5
|
heading =
|
||||||
|
reader.course.value() * 1e3; // Scale the heading (in degrees * 10^-2) to match the expected degrees * 10^-5
|
||||||
}
|
}
|
||||||
if (reader.satellites.isValid()) {
|
if (reader.satellites.isValid()) {
|
||||||
numSatellites = reader.satellites.value();
|
numSatellites = reader.satellites.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
// expect gps pos lat=37.520825, lon=-122.309162, alt=158
|
// expect gps pos lat=37.520825, lon=-122.309162, alt=158
|
||||||
DEBUG_MSG("new NEMA GPS pos lat=%f, lon=%f, alt=%d, hdop=%f, heading=%f\n", latitude * 1e-7, longitude * 1e-7, altitude, dop * 1e-2, heading * 1e-5);
|
DEBUG_MSG("new NMEA GPS pos lat=%f, lon=%f, alt=%d, hdop=%f, heading=%f\n", latitude * 1e-7, longitude * 1e-7,
|
||||||
|
altitude, dop * 1e-2, heading * 1e-5);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify any status instances that are observing us
|
// Notify any status instances that are observing us
|
||||||
const meshtastic::GPSStatus status = meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites);
|
const meshtastic::GPSStatus status =
|
||||||
|
meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites);
|
||||||
newStatus.notifyObservers(&status);
|
newStatus.notifyObservers(&status);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,19 +1,19 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "../concurrency/PeriodicTask.h"
|
||||||
#include "GPS.h"
|
#include "GPS.h"
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "../concurrency/PeriodicTask.h"
|
|
||||||
#include "TinyGPS++.h"
|
#include "TinyGPS++.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A gps class thatreads from a NEMA GPS stream (and FIXME - eventually keeps the gps powered down except when reading)
|
* A gps class thatreads from a NMEA GPS stream (and FIXME - eventually keeps the gps powered down except when reading)
|
||||||
*
|
*
|
||||||
* When new data is available it will notify observers.
|
* When new data is available it will notify observers.
|
||||||
*/
|
*/
|
||||||
class NEMAGPS : public GPS
|
class NMEAGPS : public GPS
|
||||||
{
|
{
|
||||||
TinyGPSPlus reader;
|
TinyGPSPlus reader;
|
||||||
|
|
||||||
uint32_t lastUpdateMsec = 0;
|
uint32_t lastUpdateMsec = 0;
|
||||||
|
|
||||||
public:
|
public:
|
|
@ -103,7 +103,7 @@ bool UBloxGPS::factoryReset()
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
|
||||||
// It is useful to force back into factory defaults (9600baud, NEMA to test the behavior of boards that don't have
|
// It is useful to force back into factory defaults (9600baud, NMEA to test the behavior of boards that don't have
|
||||||
// GPS_TX connected)
|
// GPS_TX connected)
|
||||||
ublox.factoryReset();
|
ublox.factoryReset();
|
||||||
delay(5000);
|
delay(5000);
|
||||||
|
|
14
src/main.cpp
14
src/main.cpp
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include "MeshRadio.h"
|
#include "MeshRadio.h"
|
||||||
#include "MeshService.h"
|
#include "MeshService.h"
|
||||||
#include "NEMAGPS.h"
|
#include "NMEAGPS.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
#include "PowerFSM.h"
|
#include "PowerFSM.h"
|
||||||
#include "UBloxGPS.h"
|
#include "UBloxGPS.h"
|
||||||
|
@ -258,16 +258,16 @@ void setup()
|
||||||
|
|
||||||
if (GPS::_serial_gps) {
|
if (GPS::_serial_gps) {
|
||||||
// Some boards might have only the TX line from the GPS connected, in that case, we can't configure it at all. Just
|
// Some boards might have only the TX line from the GPS connected, in that case, we can't configure it at all. Just
|
||||||
// assume NEMA at 9600 baud.
|
// assume NMEA at 9600 baud.
|
||||||
DEBUG_MSG("Hoping that NEMA might work\n");
|
DEBUG_MSG("Hoping that NMEA might work\n");
|
||||||
|
|
||||||
// dumb NEMA access only work for serial GPSes)
|
// dumb NMEA access only work for serial GPSes)
|
||||||
gps = new NEMAGPS();
|
gps = new NMEAGPS();
|
||||||
gps->setup();
|
gps->setup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
gps = new NEMAGPS();
|
gps = new NMEAGPS();
|
||||||
gps->setup();
|
gps->setup();
|
||||||
#endif
|
#endif
|
||||||
gpsStatus->observe(&gps->newStatus);
|
gpsStatus->observe(&gps->newStatus);
|
||||||
|
@ -412,7 +412,7 @@ void loop()
|
||||||
|
|
||||||
// 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(getChannelName());
|
screen.debug_info()->setChannelNameStatus(getChannelName());
|
||||||
|
|
||||||
// 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)
|
||||||
// i.e. don't just keep spinning in loop as fast as we can.
|
// i.e. don't just keep spinning in loop as fast as we can.
|
||||||
// DEBUG_MSG("msecs %d\n", msecstosleep);
|
// DEBUG_MSG("msecs %d\n", msecstosleep);
|
||||||
|
|
|
@ -206,6 +206,13 @@ void MeshService::reloadConfig()
|
||||||
nodeDB.saveToDisk();
|
nodeDB.saveToDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The owner User record just got updated, update our node DB and broadcast the info into the mesh
|
||||||
|
void MeshService::reloadOwner()
|
||||||
|
{
|
||||||
|
sendOurOwner();
|
||||||
|
nodeDB.saveToDisk();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a ToRadio buffer parse it and properly handle it (setup radio, owner or send packet into the mesh)
|
* Given a ToRadio buffer parse it and properly handle it (setup radio, owner or send packet into the mesh)
|
||||||
* Called by PhoneAPI.handleToRadio. Note: p is a scratch buffer, this function is allowed to write to it but it can not keep a
|
* Called by PhoneAPI.handleToRadio. Note: p is a scratch buffer, this function is allowed to write to it but it can not keep a
|
||||||
|
@ -292,8 +299,8 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *unused)
|
||||||
p->decoded.which_payload = SubPacket_position_tag;
|
p->decoded.which_payload = SubPacket_position_tag;
|
||||||
|
|
||||||
Position &pos = p->decoded.position;
|
Position &pos = p->decoded.position;
|
||||||
// !zero or !zero lat/long means valid
|
|
||||||
if (gps->latitude != 0 || gps->longitude != 0) {
|
if (gps->hasLock()) {
|
||||||
if (gps->altitude != 0)
|
if (gps->altitude != 0)
|
||||||
pos.altitude = gps->altitude;
|
pos.altitude = gps->altitude;
|
||||||
pos.latitude_i = gps->latitude;
|
pos.latitude_i = gps->latitude;
|
||||||
|
|
|
@ -67,7 +67,7 @@ class MeshService
|
||||||
void reloadConfig();
|
void reloadConfig();
|
||||||
|
|
||||||
/// The owner User record just got updated, update our node DB and broadcast the info into the mesh
|
/// The owner User record just got updated, update our node DB and broadcast the info into the mesh
|
||||||
void reloadOwner() { sendOurOwner(); }
|
void reloadOwner();
|
||||||
|
|
||||||
/// Called when the user wakes up our GUI, normally sends our latest location to the mesh (if we have it), otherwise at least
|
/// Called when the user wakes up our GUI, normally sends our latest location to the mesh (if we have it), otherwise at least
|
||||||
/// sends our owner
|
/// sends our owner
|
||||||
|
|
|
@ -41,6 +41,8 @@ bool RF95Interface::init()
|
||||||
if (power > MAX_POWER) // This chip has lower power limits than some
|
if (power > MAX_POWER) // This chip has lower power limits than some
|
||||||
power = MAX_POWER;
|
power = MAX_POWER;
|
||||||
|
|
||||||
|
limitPower();
|
||||||
|
|
||||||
iface = lora = new RadioLibRF95(&module);
|
iface = lora = new RadioLibRF95(&module);
|
||||||
|
|
||||||
#ifdef RF95_TCXO
|
#ifdef RF95_TCXO
|
||||||
|
|
|
@ -107,7 +107,7 @@ bool RadioInterface::init()
|
||||||
* djb2 by Dan Bernstein.
|
* djb2 by Dan Bernstein.
|
||||||
* http://www.cse.yorku.ca/~oz/hash.html
|
* http://www.cse.yorku.ca/~oz/hash.html
|
||||||
*/
|
*/
|
||||||
unsigned long hash(char *str)
|
unsigned long hash(const char *str)
|
||||||
{
|
{
|
||||||
unsigned long hash = 5381;
|
unsigned long hash = 5381;
|
||||||
int c;
|
int c;
|
||||||
|
@ -136,6 +136,25 @@ void RadioInterface::applyModemConfig()
|
||||||
power);
|
power);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some regulatory regions limit xmit power.
|
||||||
|
* This function should be called by subclasses after setting their desired power. It might lower it
|
||||||
|
*/
|
||||||
|
void RadioInterface::limitPower()
|
||||||
|
{
|
||||||
|
uint8_t maxPower = 255; // No limit
|
||||||
|
|
||||||
|
#ifdef HW_VERSION_JP
|
||||||
|
maxPower = 13; // See https://github.com/meshtastic/Meshtastic-device/issues/346
|
||||||
|
#endif
|
||||||
|
if (power > maxPower) {
|
||||||
|
DEBUG_MSG("Lowering transmit power because of regulatory limits\n");
|
||||||
|
power = maxPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_MSG("Set radio: final power level=%d\n", power);
|
||||||
|
}
|
||||||
|
|
||||||
ErrorCode SimRadio::send(MeshPacket *p)
|
ErrorCode SimRadio::send(MeshPacket *p)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("SimRadio.send\n");
|
DEBUG_MSG("SimRadio.send\n");
|
||||||
|
|
|
@ -119,6 +119,12 @@ class RadioInterface : protected concurrency::NotifiedWorkerThread
|
||||||
|
|
||||||
virtual void loop() {} // Idle processing
|
virtual void loop() {} // Idle processing
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some regulatory regions limit xmit power.
|
||||||
|
* This function should be called by subclasses after setting their desired power. It might lower it
|
||||||
|
*/
|
||||||
|
void limitPower();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert our modemConfig enum into wf, sf, etc...
|
* Convert our modemConfig enum into wf, sf, etc...
|
||||||
*
|
*
|
||||||
|
|
|
@ -43,6 +43,9 @@ bool SX1262Interface::init()
|
||||||
|
|
||||||
if (power > 22) // This chip has lower power limits than some
|
if (power > 22) // This chip has lower power limits than some
|
||||||
power = 22;
|
power = 22;
|
||||||
|
|
||||||
|
limitPower();
|
||||||
|
|
||||||
int res = lora.begin(freq, bw, sf, cr, syncWord, power, currentLimit, preambleLength, tcxoVoltage, useRegulatorLDO);
|
int res = lora.begin(freq, bw, sf, cr, syncWord, power, currentLimit, preambleLength, tcxoVoltage, useRegulatorLDO);
|
||||||
DEBUG_MSG("SX1262 init result %d\n", res);
|
DEBUG_MSG("SX1262 init result %d\n", res);
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue