mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-09 06:32:06 +00:00
Remove MeshRadio wrapper class - we don't need it anymore.
This commit is contained in:
parent
b73dd5b23b
commit
e6875d559c
@ -104,8 +104,6 @@ const char *getDeviceName()
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MeshRadio *radio = NULL;
|
|
||||||
|
|
||||||
static uint32_t ledBlinker()
|
static uint32_t ledBlinker()
|
||||||
{
|
{
|
||||||
static bool ledOn;
|
static bool ledOn;
|
||||||
@ -231,10 +229,10 @@ void setup()
|
|||||||
#else
|
#else
|
||||||
new SimRadio();
|
new SimRadio();
|
||||||
#endif
|
#endif
|
||||||
radio = new MeshRadio(rIf);
|
|
||||||
router.addInterface(&radio->radioIf);
|
|
||||||
|
|
||||||
if (radio && !radio->init())
|
router.addInterface(rIf);
|
||||||
|
|
||||||
|
if (!rIf->init())
|
||||||
recordCriticalError(ErrNoRadio);
|
recordCriticalError(ErrNoRadio);
|
||||||
|
|
||||||
// This must be _after_ service.init because we need our preferences loaded from flash to have proper timeout values
|
// This must be _after_ service.init because we need our preferences loaded from flash to have proper timeout values
|
||||||
|
@ -1,113 +0,0 @@
|
|||||||
#include "error.h"
|
|
||||||
#include <SPI.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "MeshRadio.h"
|
|
||||||
#include "MeshService.h"
|
|
||||||
#include "NodeDB.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "sleep.h"
|
|
||||||
#include <pb_decode.h>
|
|
||||||
#include <pb_encode.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ## LoRaWAN for North America
|
|
||||||
|
|
||||||
LoRaWAN defines 64, 125 kHz channels from 902.3 to 914.9 MHz increments.
|
|
||||||
|
|
||||||
The maximum output power for North America is +30 dBM.
|
|
||||||
|
|
||||||
The band is from 902 to 928 MHz. It mentions channel number and its respective channel frequency. All the 13 channels are
|
|
||||||
separated by 2.16 MHz with respect to the adjacent channels. Channel zero starts at 903.08 MHz center frequency.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// Sometimes while debugging it is useful to set this false, to disable rf95 accesses
|
|
||||||
bool useHardware = true;
|
|
||||||
|
|
||||||
MeshRadio::MeshRadio(RadioInterface *rIf) : radioIf(*rIf) // , manager(radioIf)
|
|
||||||
{
|
|
||||||
myNodeInfo.num_channels = NUM_CHANNELS;
|
|
||||||
|
|
||||||
// Can't print strings this early - serial not setup yet
|
|
||||||
// DEBUG_MSG("Set meshradio defaults name=%s\n", channelSettings.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshRadio::init()
|
|
||||||
{
|
|
||||||
if (!useHardware)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
DEBUG_MSG("Starting meshradio init...\n");
|
|
||||||
|
|
||||||
configChangedObserver.observe(&service.configChanged);
|
|
||||||
preflightSleepObserver.observe(&preflightSleep);
|
|
||||||
notifyDeepSleepObserver.observe(¬ifyDeepSleep);
|
|
||||||
|
|
||||||
#ifdef RESET_GPIO
|
|
||||||
pinMode(RESET_GPIO, OUTPUT); // Deassert reset
|
|
||||||
digitalWrite(RESET_GPIO, HIGH);
|
|
||||||
|
|
||||||
// pulse reset
|
|
||||||
digitalWrite(RESET_GPIO, LOW);
|
|
||||||
delay(10);
|
|
||||||
digitalWrite(RESET_GPIO, HIGH);
|
|
||||||
delay(10);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// we now expect interfaces to operate in promiscous mode
|
|
||||||
// radioIf.setThisAddress(nodeDB.getNodeNum()); // Note: we must do this here, because the nodenum isn't inited at constructor
|
|
||||||
// time.
|
|
||||||
|
|
||||||
applySettings();
|
|
||||||
|
|
||||||
if (!radioIf.init()) {
|
|
||||||
DEBUG_MSG("LoRa radio init failed\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No need to call this now, init is supposed to do same. reloadConfig();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** hash a string into an integer
|
|
||||||
*
|
|
||||||
* djb2 by Dan Bernstein.
|
|
||||||
* http://www.cse.yorku.ca/~oz/hash.html
|
|
||||||
*/
|
|
||||||
unsigned long hash(char *str)
|
|
||||||
{
|
|
||||||
unsigned long hash = 5381;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
while ((c = *str++) != 0)
|
|
||||||
hash = ((hash << 5) + hash) + (unsigned char)c; /* hash * 33 + c */
|
|
||||||
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pull our channel settings etc... from protobufs to the dumb interface settings
|
|
||||||
*/
|
|
||||||
void MeshRadio::applySettings()
|
|
||||||
{
|
|
||||||
// Set up default configuration
|
|
||||||
// No Sync Words in LORA mode.
|
|
||||||
radioIf.modemConfig = (ModemConfigChoice)channelSettings.modem_config;
|
|
||||||
|
|
||||||
// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
|
|
||||||
int channel_num = hash(channelSettings.name) % NUM_CHANNELS;
|
|
||||||
radioIf.freq = CH0 + CH_SPACING * channel_num;
|
|
||||||
radioIf.power = channelSettings.tx_power;
|
|
||||||
|
|
||||||
DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, txpower=%d\n", channelSettings.name, channelSettings.modem_config,
|
|
||||||
channel_num, channelSettings.tx_power);
|
|
||||||
}
|
|
||||||
|
|
||||||
int MeshRadio::reloadConfig(void *unused)
|
|
||||||
{
|
|
||||||
applySettings();
|
|
||||||
radioIf.reconfigure();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -2,9 +2,7 @@
|
|||||||
|
|
||||||
#include "MemoryPool.h"
|
#include "MemoryPool.h"
|
||||||
#include "MeshTypes.h"
|
#include "MeshTypes.h"
|
||||||
#include "Observer.h"
|
|
||||||
#include "PointerQueue.h"
|
#include "PointerQueue.h"
|
||||||
#include "RadioInterface.h"
|
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "mesh.pb.h"
|
#include "mesh.pb.h"
|
||||||
|
|
||||||
@ -61,48 +59,3 @@
|
|||||||
#define NUM_CHANNELS NUM_CHANNELS_US
|
#define NUM_CHANNELS NUM_CHANNELS_US
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* A raw low level interface to our mesh. Only understands nodenums and bytes (not protobufs or node ids)
|
|
||||||
* FIXME - REMOVE THIS CLASS
|
|
||||||
*/
|
|
||||||
class MeshRadio
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// Kinda ugly way of selecting different radio implementations, but soon this MeshRadio class will be going away
|
|
||||||
// entirely. At that point we can make things pretty.
|
|
||||||
RadioInterface &radioIf;
|
|
||||||
|
|
||||||
/** pool is the pool we will alloc our rx packets from
|
|
||||||
* rxDest is where we will send any rx packets, it becomes receivers responsibility to return packet to the pool
|
|
||||||
*/
|
|
||||||
MeshRadio(RadioInterface *rIf);
|
|
||||||
|
|
||||||
bool init();
|
|
||||||
|
|
||||||
private:
|
|
||||||
CallbackObserver<MeshRadio, void *> configChangedObserver =
|
|
||||||
CallbackObserver<MeshRadio, void *>(this, &MeshRadio::reloadConfig);
|
|
||||||
|
|
||||||
CallbackObserver<MeshRadio, void *> preflightSleepObserver =
|
|
||||||
CallbackObserver<MeshRadio, void *>(this, &MeshRadio::preflightSleepCb);
|
|
||||||
|
|
||||||
CallbackObserver<MeshRadio, void *> notifyDeepSleepObserver =
|
|
||||||
CallbackObserver<MeshRadio, void *>(this, &MeshRadio::notifyDeepSleepDb);
|
|
||||||
|
|
||||||
/// The radioConfig object just changed, call this to force the hw to change to the new settings
|
|
||||||
int reloadConfig(void *unused = NULL);
|
|
||||||
|
|
||||||
/// Return 0 if sleep is okay
|
|
||||||
int preflightSleepCb(void *unused = NULL) { return radioIf.canSleep() ? 0 : 1; }
|
|
||||||
|
|
||||||
int notifyDeepSleepDb(void *unused = NULL)
|
|
||||||
{
|
|
||||||
radioIf.sleep();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pull our channel settings etc... from protobufs to the dumb interface settings
|
|
||||||
*/
|
|
||||||
void applySettings();
|
|
||||||
};
|
|
||||||
|
@ -1,28 +1,91 @@
|
|||||||
|
|
||||||
#include "RadioInterface.h"
|
#include "RadioInterface.h"
|
||||||
|
#include "MeshRadio.h"
|
||||||
|
#include "MeshService.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include "sleep.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <pb_decode.h>
|
#include <pb_decode.h>
|
||||||
#include <pb_encode.h>
|
#include <pb_encode.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ## LoRaWAN for North America
|
||||||
|
|
||||||
|
LoRaWAN defines 64, 125 kHz channels from 902.3 to 914.9 MHz increments.
|
||||||
|
|
||||||
|
The maximum output power for North America is +30 dBM.
|
||||||
|
|
||||||
|
The band is from 902 to 928 MHz. It mentions channel number and its respective channel frequency. All the 13 channels are
|
||||||
|
separated by 2.16 MHz with respect to the adjacent channels. Channel zero starts at 903.08 MHz center frequency.
|
||||||
|
*/
|
||||||
|
|
||||||
// 1kb was too small
|
// 1kb was too small
|
||||||
#define RADIO_STACK_SIZE 4096
|
#define RADIO_STACK_SIZE 4096
|
||||||
|
|
||||||
RadioInterface::RadioInterface() : txQueue(MAX_TX_QUEUE)
|
RadioInterface::RadioInterface() : txQueue(MAX_TX_QUEUE)
|
||||||
{
|
{
|
||||||
assert(sizeof(PacketHeader) == 4); // make sure the compiler did what we expected
|
assert(sizeof(PacketHeader) == 4); // make sure the compiler did what we expected
|
||||||
|
|
||||||
|
myNodeInfo.num_channels = NUM_CHANNELS;
|
||||||
|
|
||||||
|
// Can't print strings this early - serial not setup yet
|
||||||
|
// DEBUG_MSG("Set meshradio defaults name=%s\n", channelSettings.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RadioInterface::init()
|
bool RadioInterface::init()
|
||||||
{
|
{
|
||||||
// we want this thread to run at very high priority, because it is effectively running as a user space ISR
|
DEBUG_MSG("Starting meshradio init...\n");
|
||||||
|
|
||||||
|
configChangedObserver.observe(&service.configChanged);
|
||||||
|
preflightSleepObserver.observe(&preflightSleep);
|
||||||
|
notifyDeepSleepObserver.observe(¬ifyDeepSleep);
|
||||||
|
|
||||||
|
// we now expect interfaces to operate in promiscous mode
|
||||||
|
// radioIf.setThisAddress(nodeDB.getNodeNum()); // Note: we must do this here, because the nodenum isn't inited at constructor
|
||||||
|
// time.
|
||||||
|
|
||||||
|
// we want this thread to run at very high priority, because it is effectively running as a user space ISR
|
||||||
start("radio", RADIO_STACK_SIZE, configMAX_PRIORITIES - 1); // Start our worker thread
|
start("radio", RADIO_STACK_SIZE, configMAX_PRIORITIES - 1); // Start our worker thread
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** hash a string into an integer
|
||||||
|
*
|
||||||
|
* djb2 by Dan Bernstein.
|
||||||
|
* http://www.cse.yorku.ca/~oz/hash.html
|
||||||
|
*/
|
||||||
|
unsigned long hash(char *str)
|
||||||
|
{
|
||||||
|
unsigned long hash = 5381;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while ((c = *str++) != 0)
|
||||||
|
hash = ((hash << 5) + hash) + (unsigned char)c; /* hash * 33 + c */
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pull our channel settings etc... from protobufs to the dumb interface settings
|
||||||
|
*/
|
||||||
|
void RadioInterface::applyModemConfig()
|
||||||
|
{
|
||||||
|
// Set up default configuration
|
||||||
|
// No Sync Words in LORA mode.
|
||||||
|
modemConfig = (ModemConfigChoice)channelSettings.modem_config;
|
||||||
|
|
||||||
|
// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
|
||||||
|
int channel_num = hash(channelSettings.name) % NUM_CHANNELS;
|
||||||
|
freq = CH0 + CH_SPACING * channel_num;
|
||||||
|
power = channelSettings.tx_power;
|
||||||
|
|
||||||
|
DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, power=%d\n", channelSettings.name, channelSettings.modem_config, channel_num,
|
||||||
|
channelSettings.tx_power);
|
||||||
|
}
|
||||||
|
|
||||||
ErrorCode SimRadio::send(MeshPacket *p)
|
ErrorCode SimRadio::send(MeshPacket *p)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("SimRadio.send\n");
|
DEBUG_MSG("SimRadio.send\n");
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "MemoryPool.h"
|
#include "MemoryPool.h"
|
||||||
#include "MeshTypes.h"
|
#include "MeshTypes.h"
|
||||||
|
#include "Observer.h"
|
||||||
#include "PointerQueue.h"
|
#include "PointerQueue.h"
|
||||||
#include "WorkerThread.h"
|
#include "WorkerThread.h"
|
||||||
#include "mesh.pb.h"
|
#include "mesh.pb.h"
|
||||||
@ -35,6 +36,15 @@ class RadioInterface : protected NotifiedWorkerThread
|
|||||||
friend class MeshRadio; // for debugging we let that class touch pool
|
friend class MeshRadio; // for debugging we let that class touch pool
|
||||||
PointerQueue<MeshPacket> *rxDest = NULL;
|
PointerQueue<MeshPacket> *rxDest = NULL;
|
||||||
|
|
||||||
|
CallbackObserver<RadioInterface, void *> configChangedObserver =
|
||||||
|
CallbackObserver<RadioInterface, void *>(this, &RadioInterface::reloadConfig);
|
||||||
|
|
||||||
|
CallbackObserver<RadioInterface, void *> preflightSleepObserver =
|
||||||
|
CallbackObserver<RadioInterface, void *>(this, &RadioInterface::preflightSleepCb);
|
||||||
|
|
||||||
|
CallbackObserver<RadioInterface, void *> notifyDeepSleepObserver =
|
||||||
|
CallbackObserver<RadioInterface, void *>(this, &RadioInterface::notifyDeepSleepDb);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MeshPacket *sendingPacket = NULL; // The packet we are currently sending
|
MeshPacket *sendingPacket = NULL; // The packet we are currently sending
|
||||||
PointerQueue<MeshPacket> txQueue;
|
PointerQueue<MeshPacket> txQueue;
|
||||||
@ -104,6 +114,29 @@ class RadioInterface : protected NotifiedWorkerThread
|
|||||||
size_t beginSending(MeshPacket *p);
|
size_t beginSending(MeshPacket *p);
|
||||||
|
|
||||||
virtual void loop() {} // Idle processing
|
virtual void loop() {} // Idle processing
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert our modemConfig enum into wf, sf, etc...
|
||||||
|
*
|
||||||
|
* These paramaters will be pull from the channelSettings global
|
||||||
|
*/
|
||||||
|
virtual void applyModemConfig();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// Return 0 if sleep is okay
|
||||||
|
int preflightSleepCb(void *unused = NULL) { return canSleep() ? 0 : 1; }
|
||||||
|
|
||||||
|
int notifyDeepSleepDb(void *unused = NULL)
|
||||||
|
{
|
||||||
|
sleep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int reloadConfig(void *unused)
|
||||||
|
{
|
||||||
|
reconfigure();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SimRadio : public RadioInterface
|
class SimRadio : public RadioInterface
|
||||||
|
@ -58,6 +58,8 @@ RadioLibInterface *RadioLibInterface::instance;
|
|||||||
*/
|
*/
|
||||||
void RadioLibInterface::applyModemConfig()
|
void RadioLibInterface::applyModemConfig()
|
||||||
{
|
{
|
||||||
|
RadioInterface::applyModemConfig();
|
||||||
|
|
||||||
switch (modemConfig) {
|
switch (modemConfig) {
|
||||||
case Bw125Cr45Sf128: ///< Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Default medium range
|
case Bw125Cr45Sf128: ///< Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Default medium range
|
||||||
bw = 125;
|
bw = 125;
|
||||||
|
@ -99,8 +99,10 @@ class RadioLibInterface : public RadioInterface
|
|||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Convert our modemConfig enum into wf, sf, etc...
|
* Convert our modemConfig enum into wf, sf, etc...
|
||||||
|
*
|
||||||
|
* These paramaters will be pull from the channelSettings global
|
||||||
*/
|
*/
|
||||||
void applyModemConfig();
|
virtual void applyModemConfig();
|
||||||
|
|
||||||
/** Could we send right now (i.e. either not actively receiving or transmitting)? */
|
/** Could we send right now (i.e. either not actively receiving or transmitting)? */
|
||||||
virtual bool canSendImmediately();
|
virtual bool canSendImmediately();
|
||||||
|
Loading…
Reference in New Issue
Block a user