From bf491efddf8882fddd7a2bba85129a811b1f0799 Mon Sep 17 00:00:00 2001 From: geeksville Date: Tue, 18 Feb 2020 16:18:01 -0800 Subject: [PATCH] begin support for countries besides the US --- TODO.md | 3 +++ bin/build-all.sh | 8 +++--- lib/BluetoothOTA/src/BluetoothUtil.cpp | 11 +++++--- lib/BluetoothOTA/src/BluetoothUtil.h | 2 +- src/MeshRadio.cpp | 6 +++-- src/MeshRadio.h | 35 ++++++++++++++++++++++++-- src/configuration.h | 12 ++++++--- src/main.ino | 2 +- src/mesh.pb.h | 24 ++++++++++-------- 9 files changed, 75 insertions(+), 28 deletions(-) diff --git a/TODO.md b/TODO.md index 1c1319e14..ae85196dc 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,8 @@ Items to complete before the first alpha release. * post sample video to signal forum +* support non US frequencies +* make an install script to let novices install software on their boards * retest BLE software update for both board types * default to enter deep sleep if no LORA received for two hours (indicates user has probably left the meshS) * first alpha release, article writeup for hackaday @@ -35,6 +37,7 @@ Items to complete before the first beta release. # Low power consumption tasks General ideas to hit the power draws our spreadsheet predicts. Do the easy ones before beta, the last 15% can be done after 1.0. +* lower BT announce interval to save battery * change to use RXcontinuous mode and config to drop packets with bad CRC (see section 6.4 of datasheet) * we currently poll the lora radio from loop(), which is really bad because it means we run loop every 10ms. Instead have the rf95 driver enqueue received messages from the ISR. * platformio sdkconfig CONFIG_PM and turn on modem sleep mode diff --git a/bin/build-all.sh b/bin/build-all.sh index 38ece5846..c439f41fb 100755 --- a/bin/build-all.sh +++ b/bin/build-all.sh @@ -1,13 +1,15 @@ set -e -VERSION=0.0.2 +VERSION=0.0.3 + +COUNTRY=US rm .pio/build/esp32/firmware.bin export PLATFORMIO_BUILD_FLAGS="-DT_BEAM_V10 -DAPP_VERSION=$VERSION" pio run # -v -cp .pio/build/esp32/firmware.bin release/firmware-TBEAM-US.bin +cp .pio/build/esp32/firmware.bin release/firmware-TBEAM-$COUNTRY.bin rm .pio/build/esp32/firmware.bin export PLATFORMIO_BUILD_FLAGS="-DHELTEC_LORA32 -DAPP_VERSION=$VERSION" pio run # -v -cp .pio/build/esp32/firmware.bin release/firmware-HELTEC-US.bin \ No newline at end of file +cp .pio/build/esp32/firmware.bin release/firmware-HELTEC-$COUNTRY.bin \ No newline at end of file diff --git a/lib/BluetoothOTA/src/BluetoothUtil.cpp b/lib/BluetoothOTA/src/BluetoothUtil.cpp index 06d4f0dde..8a756a6ca 100644 --- a/lib/BluetoothOTA/src/BluetoothUtil.cpp +++ b/lib/BluetoothOTA/src/BluetoothUtil.cpp @@ -15,7 +15,7 @@ static BLECharacteristic HardwareVersionCharacteristic(BLEUUID((uint16_t)ESP_GAT /** * Create standard device info service **/ -BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendor, std::string swVersion, std::string hwVersion) +BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendor, std::string swVersion, std::string hwVersion = "") { BLEService *deviceInfoService = server->createService(BLEUUID((uint16_t)ESP_GATT_UUID_DEVICE_INFO_SVC)); @@ -32,8 +32,11 @@ BLEService *createDeviceInfomationService(BLEServer *server, std::string hwVendo deviceInfoService->addCharacteristic(&SWVersionCharacteristic); ManufacturerCharacteristic.setValue(hwVendor); deviceInfoService->addCharacteristic(&ManufacturerCharacteristic); - HardwareVersionCharacteristic.setValue(hwVersion); - deviceInfoService->addCharacteristic(&HardwareVersionCharacteristic); + if (!hwVersion.empty()) + { + HardwareVersionCharacteristic.setValue(hwVersion); + deviceInfoService->addCharacteristic(&HardwareVersionCharacteristic); + } //SerialNumberCharacteristic.setValue("FIXME"); //deviceInfoService->addCharacteristic(&SerialNumberCharacteristic); @@ -199,7 +202,7 @@ BLEServer *initBLE(std::string deviceName, std::string hwVendor, std::string swV // BLEService *pBattery = createBatteryService(pServer); BLEService *pUpdate = createUpdateService(pServer); // We need to advertise this so our android ble scan operation can see it - + // It seems only one service can be advertised - so for now don't advertise our updater // pServer->getAdvertising()->addServiceUUID(pUpdate->getUUID()); diff --git a/lib/BluetoothOTA/src/BluetoothUtil.h b/lib/BluetoothOTA/src/BluetoothUtil.h index dda09c893..1f1cd9cb8 100644 --- a/lib/BluetoothOTA/src/BluetoothUtil.h +++ b/lib/BluetoothOTA/src/BluetoothUtil.h @@ -18,4 +18,4 @@ void dumpCharacteristic(BLECharacteristic *c); uint32_t getValue32(BLECharacteristic *c, uint32_t defaultValue); void loopBLE(); -BLEServer *initBLE(std::string devName, std::string hwVendor, std::string swVersion, std::string hwVersion); \ No newline at end of file +BLEServer *initBLE(std::string devName, std::string hwVendor, std::string swVersion, std::string hwVersion = ""); \ No newline at end of file diff --git a/src/MeshRadio.cpp b/src/MeshRadio.cpp index af7955dec..fdde97301 100644 --- a/src/MeshRadio.cpp +++ b/src/MeshRadio.cpp @@ -33,9 +33,11 @@ MeshRadio::MeshRadio(MemoryPool &_pool, PointerQueue &_r rxDest(_rxDest), txQueue(MAX_TX_QUEUE) { + myNodeInfo.num_channels = NUM_CHANNELS; + //radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr45Sf128; // medium range and fast - channelSettings.modem_config = ChannelSettings_ModemConfig_Bw500Cr45Sf128; // short range and fast, but wide bandwidth so incompatible radios can talk together - //radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr48Sf4096; // slow and long range + //channelSettings.modem_config = ChannelSettings_ModemConfig_Bw500Cr45Sf128; // short range and fast, but wide bandwidth so incompatible radios can talk together + channelSettings.modem_config = ChannelSettings_ModemConfig_Bw125Cr48Sf4096; // slow and long range channelSettings.tx_power = 23; channelSettings.channel_num = DEFAULT_CHANNEL_NUM; diff --git a/src/MeshRadio.h b/src/MeshRadio.h index c79cfadec..fbb29d6e6 100644 --- a/src/MeshRadio.h +++ b/src/MeshRadio.h @@ -11,12 +11,43 @@ // US channel settings #define CH0_US 903.08f // MHz #define CH_SPACING_US 2.16f // MHz +#define NUM_CHANNELS_US 13 + +// EU channel settings +#define CH0_EU 865.2f // MHz +#define CH_SPACING_EU 0.3f // MHz +#define NUM_CHANNELS_EU 10 + +// CN channel settings +#define CH0_CN 470f // MHz +#define CH_SPACING_CN 2.0f // MHz FIXME, this is just a guess for 470-510 +#define NUM_CHANNELS_CN 20 + +// CN channel settings +#define CH0_JP 920f // MHz +#define CH_SPACING_JP 0.5f // MHz FIXME, this is just a guess for 920-925 +#define NUM_CHANNELS_JP 10 // FIXME add defs for other regions and use them here +#ifdef HW_VERSION_US #define CH0 CH0_US #define CH_SPACING CH_SPACING_US -#define NUM_CHANNELS Constants_NumChannels - +#define NUM_CHANNELS NUM_CHANNELS_US +#elif defined(HW_VERSION_EU) +#define CH0 CH0_EU +#define CH_SPACING CH_SPACING_EU +#define NUM_CHANNELS NUM_CHANNELS_EU +#elif defined(HW_VERSION_CN) +#define CH0 CH0_CN +#define CH_SPACING CH_SPACING_CN +#define NUM_CHANNELS NUM_CHANNELS_CN +#elif defined(HW_VERSION_JP) +#define CH0 CH0_JP +#define CH_SPACING CH_SPACING_JP +#define NUM_CHANNELS NUM_CHANNELS_JP +#else +#error "HW_VERSION not set" +#endif #define MAX_TX_QUEUE 8 // max number of packets which can be waiting for transmission diff --git a/src/configuration.h b/src/configuration.h index 783b9044f..7ef8c9474 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -30,10 +30,12 @@ along with this program. If not, see . // ----------------------------------------------------------------------------- #define APP_NAME "Meshtastic" + +// If app version is not specified we assume we are not being invoked by the build script #ifndef APP_VERSION -#define APP_VERSION "0.0.0" +#define APP_VERSION "0.0.0" // this def normally comes from build-all.sh #endif -#define HW_VERSION "US" // We encode the hardware freq range in the hw version string, so sw update can eventually install the correct build + // ----------------------------------------------------------------------------- // Configuration @@ -41,8 +43,10 @@ along with this program. If not, see . // Select which board is being used. If the outside build environment has sent a choice, just use that #if !defined(T_BEAM_V10) && !defined(HELTEC_LORA32) -//#define T_BEAM_V10 // AKA Rev1 (second board released) -#define HELTEC_LORA32 +#define T_BEAM_V10 // AKA Rev1 (second board released) +//#define HELTEC_LORA32 + +#define HW_VERSION_US // We encode the hardware freq range in the hw version string, so sw update can eventually install the correct build #endif // If we are using the JTAG port for debugging, some pins must be left free for that (and things like GPS have to be disabled) diff --git a/src/main.ino b/src/main.ino index caf3f53e7..11764bccb 100644 --- a/src/main.ino +++ b/src/main.ino @@ -402,7 +402,7 @@ void setup() if (useBluetooth) { DEBUG_MSG("Starting bluetooth\n"); - BLEServer *serve = initBLE(getDeviceName(), HW_VENDOR, APP_VERSION, HW_VERSION); // FIXME, use a real name based on the macaddr + BLEServer *serve = initBLE(getDeviceName(), HW_VENDOR, APP_VERSION); // FIXME, use a real name based on the macaddr createMeshBluetoothService(serve); // Start advertising - this must be done _after_ creating all services diff --git a/src/mesh.pb.h b/src/mesh.pb.h index f349dbe11..2d22519a6 100644 --- a/src/mesh.pb.h +++ b/src/mesh.pb.h @@ -15,8 +15,7 @@ extern "C" { /* Enum definitions */ typedef enum _Constants { - Constants_Unused = 0, - Constants_NumChannels = 13 + Constants_Unused = 0 } Constants; typedef enum _Data_Type { @@ -34,8 +33,8 @@ typedef enum _ChannelSettings_ModemConfig { typedef enum _DeviceState_Version { DeviceState_Version_Unset = 0, - DeviceState_Version_Minimum = 12, - DeviceState_Version_Current = 12 + DeviceState_Version_Minimum = 13, + DeviceState_Version_Current = 13 } DeviceState_Version; /* Struct definitions */ @@ -56,6 +55,7 @@ typedef struct _Data { typedef struct _MyNodeInfo { int32_t my_node_num; bool has_gps; + int32_t num_channels; } MyNodeInfo; typedef struct _Position { @@ -149,8 +149,8 @@ typedef struct _ToRadio { /* Helper constants for enums */ #define _Constants_MIN Constants_Unused -#define _Constants_MAX Constants_NumChannels -#define _Constants_ARRAYSIZE ((Constants)(Constants_NumChannels+1)) +#define _Constants_MAX Constants_Unused +#define _Constants_ARRAYSIZE ((Constants)(Constants_Unused+1)) #define _Data_Type_MIN Data_Type_SIGNAL_OPAQUE #define _Data_Type_MAX Data_Type_CLEAR_READACK @@ -175,7 +175,7 @@ typedef struct _ToRadio { #define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default, false, ChannelSettings_init_default} #define RadioConfig_UserPreferences_init_default {0, 0, 0, 0} #define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0, 0} -#define MyNodeInfo_init_default {0, 0} +#define MyNodeInfo_init_default {0, 0, 0} #define DeviceState_init_default {false, RadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default}, _DeviceState_Version_MIN, false, MeshPacket_init_default} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}} #define ToRadio_init_default {0, {MeshPacket_init_default}} @@ -188,7 +188,7 @@ typedef struct _ToRadio { #define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero, false, ChannelSettings_init_zero} #define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0} #define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0, 0} -#define MyNodeInfo_init_zero {0, 0} +#define MyNodeInfo_init_zero {0, 0, 0} #define DeviceState_init_zero {false, RadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero}, _DeviceState_Version_MIN, false, MeshPacket_init_zero} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} #define ToRadio_init_zero {0, {MeshPacket_init_zero}} @@ -203,6 +203,7 @@ typedef struct _ToRadio { #define Data_payload_tag 2 #define MyNodeInfo_my_node_num_tag 1 #define MyNodeInfo_has_gps_tag 2 +#define MyNodeInfo_num_channels_tag 3 #define Position_latitude_tag 1 #define Position_longitude_tag 2 #define Position_altitude_tag 3 @@ -324,7 +325,8 @@ X(a, STATIC, SINGULAR, INT32, frequency_error, 6) #define MyNodeInfo_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, INT32, my_node_num, 1) \ -X(a, STATIC, SINGULAR, BOOL, has_gps, 2) +X(a, STATIC, SINGULAR, BOOL, has_gps, 2) \ +X(a, STATIC, SINGULAR, INT32, num_channels, 3) #define MyNodeInfo_CALLBACK NULL #define MyNodeInfo_DEFAULT NULL @@ -397,8 +399,8 @@ extern const pb_msgdesc_t ToRadio_msg; #define RadioConfig_size 72 #define RadioConfig_UserPreferences_size 18 #define NodeInfo_size 157 -#define MyNodeInfo_size 13 -#define DeviceState_size 14954 +#define MyNodeInfo_size 24 +#define DeviceState_size 14965 #define FromRadio_size 299 #define ToRadio_size 293