diff --git a/proto b/proto index 5cb09ec96..2aa143921 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 5cb09ec96321ce0cfae18141e5da3b75e001c9fe +Subproject commit 2aa14392145c38476bf61fea2c43629e1973af6d diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 24cb8d732..1b004f463 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -319,7 +319,7 @@ void RadioInterface::applyModemConfig() // If user has manually specified a channel num, then use that, otherwise generate one by hashing the name const char *channelName = channels.getName(channels.getPrimaryIndex()); int channel_num = channelSettings.channel_num ? channelSettings.channel_num - 1 : hash(channelName) % myRegion->numChannels; - freq = myRegion->freq + myRegion->spacing * channel_num; + freq = myRegion->freq + radioConfig.preferences.frequency_offset + myRegion->spacing * channel_num; DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, power=%d\n", channelName, channelSettings.modem_config, channel_num, power); DEBUG_MSG("Radio myRegion->freq: %f\n", myRegion->freq); diff --git a/src/mesh/generated/admin.pb.h b/src/mesh/generated/admin.pb.h index 73dbc00af..1096a9add 100644 --- a/src/mesh/generated/admin.pb.h +++ b/src/mesh/generated/admin.pb.h @@ -79,7 +79,7 @@ extern const pb_msgdesc_t AdminMessage_msg; #define AdminMessage_fields &AdminMessage_msg /* Maximum encoded size of messages (where known) */ -#define AdminMessage_size 354 +#define AdminMessage_size 360 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/radioconfig.pb.h b/src/mesh/generated/radioconfig.pb.h index 3dfbbdda0..51d4d71e6 100644 --- a/src/mesh/generated/radioconfig.pb.h +++ b/src/mesh/generated/radioconfig.pb.h @@ -86,6 +86,7 @@ typedef struct _RadioConfig_UserPreferences { bool is_low_power; bool fixed_position; bool serial_disabled; + float frequency_offset; bool factory_reset; bool debug_log_enabled; pb_size_t ignore_incoming_count; @@ -151,9 +152,9 @@ extern "C" { /* Initializer values for message structs */ #define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default} -#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0} +#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0} #define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero} -#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0} +#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0} /* Field tags (for use in manual encoding/decoding) */ #define RadioConfig_UserPreferences_position_broadcast_secs_tag 1 @@ -179,6 +180,7 @@ extern "C" { #define RadioConfig_UserPreferences_is_low_power_tag 38 #define RadioConfig_UserPreferences_fixed_position_tag 39 #define RadioConfig_UserPreferences_serial_disabled_tag 40 +#define RadioConfig_UserPreferences_frequency_offset_tag 41 #define RadioConfig_UserPreferences_factory_reset_tag 100 #define RadioConfig_UserPreferences_debug_log_enabled_tag 101 #define RadioConfig_UserPreferences_ignore_incoming_tag 103 @@ -240,6 +242,7 @@ X(a, STATIC, SINGULAR, BOOL, is_router, 37) \ X(a, STATIC, SINGULAR, BOOL, is_low_power, 38) \ X(a, STATIC, SINGULAR, BOOL, fixed_position, 39) \ X(a, STATIC, SINGULAR, BOOL, serial_disabled, 40) \ +X(a, STATIC, SINGULAR, FLOAT, frequency_offset, 41) \ X(a, STATIC, SINGULAR, BOOL, factory_reset, 100) \ X(a, STATIC, SINGULAR, BOOL, debug_log_enabled, 101) \ X(a, STATIC, REPEATED, UINT32, ignore_incoming, 103) \ @@ -279,8 +282,8 @@ extern const pb_msgdesc_t RadioConfig_UserPreferences_msg; #define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg /* Maximum encoded size of messages (where known) */ -#define RadioConfig_size 351 -#define RadioConfig_UserPreferences_size 348 +#define RadioConfig_size 357 +#define RadioConfig_UserPreferences_size 354 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/portduino/PortduinoGlue.cpp b/src/portduino/PortduinoGlue.cpp index 5e3746335..876168891 100644 --- a/src/portduino/PortduinoGlue.cpp +++ b/src/portduino/PortduinoGlue.cpp @@ -1,76 +1,61 @@ #include "CryptoEngine.h" -#include "target_specific.h" #include "PortduinoGPIO.h" #include "mesh/RF95Interface.h" #include "sleep.h" +#include "target_specific.h" #include #include -// FIXME - move getMacAddr/setBluetoothEnable into a HALPlatform class - -uint32_t hwId; // fixme move into portduino - -void getMacAddr(uint8_t *dmac) -{ - if (!hwId) { - notImplemented("getMacAddr"); - hwId = random(); - } - - dmac[0] = 0x80; - dmac[1] = 0; - dmac[2] = 0; - dmac[3] = hwId >> 16; - dmac[4] = hwId >> 8; - dmac[5] = hwId & 0xff; -} +// FIXME - move setBluetoothEnable into a HALPlatform class void setBluetoothEnable(bool on) { // not needed } -void cpuDeepSleep(uint64_t msecs) { +void cpuDeepSleep(uint64_t msecs) +{ notImplemented("cpuDeepSleep"); } void updateBatteryLevel(uint8_t level) NOT_IMPLEMENTED("updateBatteryLevel"); /** Dear pinetab hardware geeks! - * + * * The current pinetab lora module has a slight bug. The ch341 part only provides ISR assertions on edges. * This makes sense because USB interrupts happen through fast/repeated special irq urbs that are constantly * chattering on the USB bus. - * + * * But this isn't sufficient for level triggered ISR sources like the sx127x radios. The common way that seems to * be addressed by cs341 users is to **always** connect the INT# (pin 26 on the ch341f) signal to one of the GPIO signals * on the part. I'd recommend connecting that LORA_DIO0/INT# line to pin 19 (data 4) on the pinetab board. This would * provide an efficent mechanism so that the (kernel) code in the cs341 driver that I've slightly hacked up to see the * current state of LORA_DIO0. Without that access, I can't know if the interrupt is still pending - which would create - * race conditions in packet handling. - * + * race conditions in packet handling. + * * My workaround is to poll the status register internally to the sx127x. Which is expensive because it involves a number of * i2c transactions and many trips back and forth between kernel and my userspace app. I think shipping the current version * of the pinetab lora device would be fine because I can poll slowly (because lora is slow). But if you ever have cause to * rev this board. I highly encourage this small change. - * + * * Btw - your little "USB lora dongle" is really neat. I encourage you to sell it, because even non pinetab customers could * use it to easily add lora to rasberry pi, desktop pcs etc... - * + * * Porduino helper class to do this i2c based polling: */ -class R595PolledIrqPin : public GPIOPin { -public: +class R595PolledIrqPin : public GPIOPin +{ + public: R595PolledIrqPin() : GPIOPin(LORA_DIO0, "LORA_DIO0") {} /// Read the low level hardware for this pin virtual PinStatus readPinHardware() { - if(isrPinStatus < 0) + if (isrPinStatus < 0) return LOW; // No interrupt handler attached, don't bother polling i2c right now else { - extern RadioInterface *rIf; // FIXME, temporary hack until we know if we need to keep this + extern RadioInterface *rIf; // FIXME, temporary hack until we know if we need to keep this assert(rIf); RF95Interface *rIf95 = static_cast(rIf); @@ -81,17 +66,17 @@ public: } }; - -/** apps run under portduino can optionally define a portduinoSetup() to +/** apps run under portduino can optionally define a portduinoSetup() to * use portduino specific init code (such as gpioBind) to setup portduino on their host machine, * before running 'arduino' code. */ -void portduinoSetup() { - printf("Setting up Meshtastic on Porduino...\n"); +void portduinoSetup() +{ + printf("Setting up Meshtastic on Porduino...\n"); - // FIXME: disable while not testing with real hardware - // gpioBind(new R595PolledIrqPin()); + // FIXME: disable while not testing with real hardware + // gpioBind(new R595PolledIrqPin()); - // gpioBind((new SimGPIOPin(LORA_RESET, "LORA_RESET"))); - // gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent()); + // gpioBind((new SimGPIOPin(LORA_RESET, "LORA_RESET"))); + // gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent()); }