Merge pull request #4 from meshtastic/master

Updating form head
1.2-legacy
Jm Casler 2020-09-16 22:51:19 -07:00 zatwierdzone przez GitHub
commit c83ff03d66
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
11 zmienionych plików z 65 dodań i 22 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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);
} }
} }

Wyświetl plik

@ -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:

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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");

Wyświetl plik

@ -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...
* *

Wyświetl plik

@ -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);