Compare commits
14 Commits
v1.12.0_0.
...
v1.12.0_0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f34a1f8e29 | ||
|
|
9c629e53b5 | ||
|
|
f90bd7777f | ||
|
|
d538c33f6e | ||
|
|
31fbb679d5 | ||
|
|
4a9137bf00 | ||
|
|
58decb74b8 | ||
|
|
f9f177522b | ||
|
|
6d3345c50f | ||
|
|
bd4c4cf69d | ||
|
|
46e4cc06e3 | ||
|
|
e6cab77670 | ||
|
|
4575800e40 | ||
|
|
eb4fa032ff |
@@ -793,7 +793,7 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe
|
|||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0;
|
||||||
strcpy(_prefs.node_name, "NONAME");
|
strcpy(_prefs.node_name, "NONAME");
|
||||||
_prefs.freq = LORA_FREQ;
|
_prefs.freq = LORA_FREQ;
|
||||||
_prefs.sf = LORA_SF;
|
_prefs.sf = LORA_SF;
|
||||||
|
|||||||
@@ -390,6 +390,14 @@ bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
|
|||||||
MESH_DEBUG_PRINTLN("allowPacketForward: unknown transport code, or wildcard not allowed for FLOOD packet");
|
MESH_DEBUG_PRINTLN("allowPacketForward: unknown transport code, or wildcard not allowed for FLOOD packet");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1)
|
||||||
|
// https://github.com/meshcore-dev/MeshCore/issues/1223
|
||||||
|
double_t roll_dice = (double)rand() / RAND_MAX;
|
||||||
|
double_t forw_prob = pow(_prefs.flood_advert_base, packet->path_len - 1);
|
||||||
|
if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// all other packets
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -768,7 +776,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0;
|
||||||
_prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0;
|
_prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0;
|
||||||
_prefs.tx_delay_factor = 0.5f; // was 0.25f
|
_prefs.tx_delay_factor = 0.5f; // was 0.25f
|
||||||
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
||||||
@@ -783,6 +791,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
_prefs.flood_advert_interval = 12; // 12 hours
|
_prefs.flood_advert_interval = 12; // 12 hours
|
||||||
|
_prefs.flood_advert_base = 0.308f;
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
_prefs.interference_threshold = 0; // disabled
|
_prefs.interference_threshold = 0; // disabled
|
||||||
|
|
||||||
|
|||||||
@@ -275,6 +275,15 @@ uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) {
|
|||||||
bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
|
bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
|
||||||
if (_prefs.disable_fwd) return false;
|
if (_prefs.disable_fwd) return false;
|
||||||
if (packet->isRouteFlood() && packet->path_len >= _prefs.flood_max) return false;
|
if (packet->isRouteFlood() && packet->path_len >= _prefs.flood_max) return false;
|
||||||
|
|
||||||
|
// Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1)
|
||||||
|
// https://github.com/meshcore-dev/MeshCore/issues/1223
|
||||||
|
double_t roll_dice = (double)rand() / RAND_MAX;
|
||||||
|
double_t forw_prob = pow(_prefs.flood_advert_base, packet->path_len - 1);
|
||||||
|
if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// all other packets
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,7 +606,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0;
|
||||||
_prefs.rx_delay_base = 0.0f; // off by default, was 10.0
|
_prefs.rx_delay_base = 0.0f; // off by default, was 10.0
|
||||||
_prefs.tx_delay_factor = 0.5f; // was 0.25f;
|
_prefs.tx_delay_factor = 0.5f; // was 0.25f;
|
||||||
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
||||||
@@ -613,6 +622,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.disable_fwd = 1;
|
_prefs.disable_fwd = 1;
|
||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
_prefs.flood_advert_interval = 12; // 12 hours
|
_prefs.flood_advert_interval = 12; // 12 hours
|
||||||
|
_prefs.flood_advert_base = 0.308f;
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
_prefs.interference_threshold = 0; // disabled
|
_prefs.interference_threshold = 0; // disabled
|
||||||
#ifdef ROOM_PASSWORD
|
#ifdef ROOM_PASSWORD
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ public:
|
|||||||
{
|
{
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 2.0; // one third
|
_prefs.airtime_factor = 1.0;
|
||||||
strcpy(_prefs.node_name, "NONAME");
|
strcpy(_prefs.node_name, "NONAME");
|
||||||
_prefs.freq = LORA_FREQ;
|
_prefs.freq = LORA_FREQ;
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
|
|||||||
@@ -705,7 +705,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise
|
|||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0;
|
||||||
_prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0;
|
_prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0;
|
||||||
_prefs.tx_delay_factor = 0.5f; // was 0.25f
|
_prefs.tx_delay_factor = 0.5f; // was 0.25f
|
||||||
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
_prefs.direct_tx_delay_factor = 0.2f; // was zero
|
||||||
|
|||||||
8
fetch_prs.sh
Executable file
8
fetch_prs.sh
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
git branch -D pr-1297
|
||||||
|
git branch -D pr-1338
|
||||||
|
|
||||||
|
# fetch PRs
|
||||||
|
git fetch upstream pull/1338/head:pr-1338
|
||||||
|
git fetch upstream pull/1297/head:pr-1297
|
||||||
8
merge_prs.sh
Executable file
8
merge_prs.sh
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
git merge pr-1338 --no-edit -m "Integration of upstrem PR #1338"
|
||||||
|
git merge pr-1297 --no-edit -m "Integration of upstrem PR #1297"
|
||||||
|
|
||||||
|
git merge pio-ini-adjustments -m "platformio.ini: Adjust defaults for LoRa frequncies and advert interval limits"
|
||||||
|
|
||||||
|
|
||||||
@@ -20,12 +20,34 @@ void Dispatcher::begin() {
|
|||||||
_err_flags = 0;
|
_err_flags = 0;
|
||||||
radio_nonrx_start = _ms->getMillis();
|
radio_nonrx_start = _ms->getMillis();
|
||||||
|
|
||||||
|
duty_cycle_window_ms = getDutyCycleWindowMs();
|
||||||
|
float duty_cycle = 1.0f / (1.0f + getAirtimeBudgetFactor());
|
||||||
|
tx_budget_ms = (unsigned long)(duty_cycle_window_ms * duty_cycle);
|
||||||
|
last_budget_update = _ms->getMillis();
|
||||||
|
|
||||||
_radio->begin();
|
_radio->begin();
|
||||||
prev_isrecv_mode = _radio->isInRecvMode();
|
prev_isrecv_mode = _radio->isInRecvMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
float Dispatcher::getAirtimeBudgetFactor() const {
|
float Dispatcher::getAirtimeBudgetFactor() const {
|
||||||
return 2.0; // default, 33.3% (1/3rd)
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dispatcher::updateTxBudget() {
|
||||||
|
unsigned long now = _ms->getMillis();
|
||||||
|
unsigned long elapsed = now - last_budget_update;
|
||||||
|
|
||||||
|
float duty_cycle = 1.0f / (1.0f + getAirtimeBudgetFactor());
|
||||||
|
unsigned long max_budget = (unsigned long)(getDutyCycleWindowMs() * duty_cycle);
|
||||||
|
|
||||||
|
unsigned long refill = (unsigned long)(elapsed * duty_cycle);
|
||||||
|
tx_budget_ms += refill;
|
||||||
|
|
||||||
|
if (tx_budget_ms > max_budget) {
|
||||||
|
tx_budget_ms = max_budget;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_budget_update = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Dispatcher::calcRxDelay(float score, uint32_t air_time) const {
|
int Dispatcher::calcRxDelay(float score, uint32_t air_time) const {
|
||||||
@@ -61,11 +83,24 @@ void Dispatcher::loop() {
|
|||||||
if (outbound) { // waiting for outbound send to be completed
|
if (outbound) { // waiting for outbound send to be completed
|
||||||
if (_radio->isSendComplete()) {
|
if (_radio->isSendComplete()) {
|
||||||
long t = _ms->getMillis() - outbound_start;
|
long t = _ms->getMillis() - outbound_start;
|
||||||
total_air_time += t; // keep track of how much air time we are using
|
total_air_time += t;
|
||||||
//Serial.print(" airtime="); Serial.println(t);
|
//Serial.print(" airtime="); Serial.println(t);
|
||||||
|
|
||||||
// will need radio silence up to next_tx_time
|
updateTxBudget();
|
||||||
next_tx_time = futureMillis(t * getAirtimeBudgetFactor());
|
|
||||||
|
if (t > tx_budget_ms) {
|
||||||
|
tx_budget_ms = 0;
|
||||||
|
} else {
|
||||||
|
tx_budget_ms -= t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tx_budget_ms < 100) {
|
||||||
|
float duty_cycle = 1.0f / (1.0f + getAirtimeBudgetFactor());
|
||||||
|
unsigned long needed = 100 - tx_budget_ms;
|
||||||
|
next_tx_time = futureMillis((unsigned long)(needed / duty_cycle));
|
||||||
|
} else {
|
||||||
|
next_tx_time = _ms->getMillis();
|
||||||
|
}
|
||||||
|
|
||||||
_radio->onSendFinished();
|
_radio->onSendFinished();
|
||||||
logTx(outbound, 2 + outbound->path_len + outbound->payload_len);
|
logTx(outbound, 2 + outbound->path_len + outbound->payload_len);
|
||||||
@@ -224,9 +259,20 @@ void Dispatcher::processRecvPacket(Packet* pkt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Dispatcher::checkSend() {
|
void Dispatcher::checkSend() {
|
||||||
if (_mgr->getOutboundCount(_ms->getMillis()) == 0) return; // nothing waiting to send
|
if (_mgr->getOutboundCount(_ms->getMillis()) == 0) return;
|
||||||
if (!millisHasNowPassed(next_tx_time)) return; // still in 'radio silence' phase (from airtime budget setting)
|
|
||||||
if (_radio->isReceiving()) { // LBT - check if radio is currently mid-receive, or if channel activity
|
updateTxBudget();
|
||||||
|
|
||||||
|
uint32_t est_airtime = _radio->getEstAirtimeFor(MAX_TRANS_UNIT);
|
||||||
|
if (tx_budget_ms < est_airtime / 2) {
|
||||||
|
float duty_cycle = 1.0f / (1.0f + getAirtimeBudgetFactor());
|
||||||
|
unsigned long needed = est_airtime / 2 - tx_budget_ms;
|
||||||
|
next_tx_time = futureMillis((unsigned long)(needed / duty_cycle));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!millisHasNowPassed(next_tx_time)) return;
|
||||||
|
if (_radio->isReceiving()) {
|
||||||
if (cad_busy_start == 0) {
|
if (cad_busy_start == 0) {
|
||||||
cad_busy_start = _ms->getMillis(); // record when CAD busy state started
|
cad_busy_start = _ms->getMillis(); // record when CAD busy state started
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,8 +122,12 @@ class Dispatcher {
|
|||||||
bool prev_isrecv_mode;
|
bool prev_isrecv_mode;
|
||||||
uint32_t n_sent_flood, n_sent_direct;
|
uint32_t n_sent_flood, n_sent_direct;
|
||||||
uint32_t n_recv_flood, n_recv_direct;
|
uint32_t n_recv_flood, n_recv_direct;
|
||||||
|
unsigned long tx_budget_ms;
|
||||||
|
unsigned long last_budget_update;
|
||||||
|
unsigned long duty_cycle_window_ms;
|
||||||
|
|
||||||
void processRecvPacket(Packet* pkt);
|
void processRecvPacket(Packet* pkt);
|
||||||
|
void updateTxBudget();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PacketManager* _mgr;
|
PacketManager* _mgr;
|
||||||
@@ -142,6 +146,9 @@ protected:
|
|||||||
_err_flags = 0;
|
_err_flags = 0;
|
||||||
radio_nonrx_start = 0;
|
radio_nonrx_start = 0;
|
||||||
prev_isrecv_mode = true;
|
prev_isrecv_mode = true;
|
||||||
|
tx_budget_ms = 0;
|
||||||
|
last_budget_update = 0;
|
||||||
|
duty_cycle_window_ms = 3600000;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual DispatcherAction onRecvPacket(Packet* pkt) = 0;
|
virtual DispatcherAction onRecvPacket(Packet* pkt) = 0;
|
||||||
@@ -159,6 +166,7 @@ protected:
|
|||||||
virtual uint32_t getCADFailMaxDuration() const;
|
virtual uint32_t getCADFailMaxDuration() const;
|
||||||
virtual int getInterferenceThreshold() const { return 0; } // disabled by default
|
virtual int getInterferenceThreshold() const { return 0; } // disabled by default
|
||||||
virtual int getAGCResetInterval() const { return 0; } // disabled by default
|
virtual int getAGCResetInterval() const { return 0; } // disabled by default
|
||||||
|
virtual unsigned long getDutyCycleWindowMs() const { return 3600000; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void begin();
|
void begin();
|
||||||
@@ -168,8 +176,9 @@ public:
|
|||||||
void releasePacket(Packet* packet);
|
void releasePacket(Packet* packet);
|
||||||
void sendPacket(Packet* packet, uint8_t priority, uint32_t delay_millis=0);
|
void sendPacket(Packet* packet, uint8_t priority, uint32_t delay_millis=0);
|
||||||
|
|
||||||
unsigned long getTotalAirTime() const { return total_air_time; } // in milliseconds
|
unsigned long getTotalAirTime() const { return total_air_time; }
|
||||||
unsigned long getReceiveAirTime() const {return rx_air_time; }
|
unsigned long getReceiveAirTime() const {return rx_air_time; }
|
||||||
|
unsigned long getRemainingTxBudget() const { return tx_budget_ms; }
|
||||||
uint32_t getNumSentFlood() const { return n_sent_flood; }
|
uint32_t getNumSentFlood() const { return n_sent_flood; }
|
||||||
uint32_t getNumSentDirect() const { return n_sent_direct; }
|
uint32_t getNumSentDirect() const { return n_sent_direct; }
|
||||||
uint32_t getNumRecvFlood() const { return n_recv_flood; }
|
uint32_t getNumRecvFlood() const { return n_recv_flood; }
|
||||||
|
|||||||
@@ -81,7 +81,9 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||||
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||||
// 290
|
file.read((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base)); // 290
|
||||||
|
|
||||||
|
// 294
|
||||||
|
|
||||||
// sanitise bad pref values
|
// sanitise bad pref values
|
||||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||||
@@ -108,6 +110,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
_prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
|
_prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
|
||||||
_prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2);
|
_prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2);
|
||||||
|
|
||||||
|
_prefs->flood_advert_base = constrain(_prefs->flood_advert_base, 0, 1);
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,7 +169,9 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
|||||||
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||||
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||||
// 290
|
file.write((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base)); // 290
|
||||||
|
|
||||||
|
// 294
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -369,6 +375,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
} else {
|
} else {
|
||||||
sprintf(reply, "> %.3f", adc_mult);
|
sprintf(reply, "> %.3f", adc_mult);
|
||||||
}
|
}
|
||||||
|
} else if (memcmp(config, "flood.advert.base", 17) == 0) {
|
||||||
|
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->flood_advert_base));
|
||||||
// Power management commands
|
// Power management commands
|
||||||
} else if (memcmp(config, "pwrmgt.support", 14) == 0) {
|
} else if (memcmp(config, "pwrmgt.support", 14) == 0) {
|
||||||
#ifdef NRF52_POWER_MANAGEMENT
|
#ifdef NRF52_POWER_MANAGEMENT
|
||||||
@@ -616,6 +624,15 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
_prefs->adc_multiplier = 0.0f;
|
_prefs->adc_multiplier = 0.0f;
|
||||||
strcpy(reply, "Error: unsupported by this board");
|
strcpy(reply, "Error: unsupported by this board");
|
||||||
};
|
};
|
||||||
|
} else if (memcmp(config, "flood.advert.base ", 18) == 0) {
|
||||||
|
float f = atof(&config[18]);
|
||||||
|
if((f > 0) || (f<1)) {
|
||||||
|
_prefs->flood_advert_base = f;
|
||||||
|
savePrefs();
|
||||||
|
strcpy(reply, "OK");
|
||||||
|
} else {
|
||||||
|
strcpy(reply, "Error: base must be between 0 and 1");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "unknown config: %s", config);
|
sprintf(reply, "unknown config: %s", config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ struct NodePrefs { // persisted to file
|
|||||||
uint8_t flood_max;
|
uint8_t flood_max;
|
||||||
uint8_t interference_threshold;
|
uint8_t interference_threshold;
|
||||||
uint8_t agc_reset_interval; // secs / 4
|
uint8_t agc_reset_interval; // secs / 4
|
||||||
|
float flood_advert_base;
|
||||||
// Bridge settings
|
// Bridge settings
|
||||||
uint8_t bridge_enabled; // boolean
|
uint8_t bridge_enabled; // boolean
|
||||||
uint16_t bridge_delay; // milliseconds (default 500 ms)
|
uint16_t bridge_delay; // milliseconds (default 500 ms)
|
||||||
|
|||||||
@@ -76,6 +76,14 @@ class CustomSX1262 : public SX1262 {
|
|||||||
setRfSwitchPins(SX126X_RXEN, SX126X_TXEN);
|
setRfSwitchPins(SX126X_RXEN, SX126X_TXEN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// for improved RX with Heltec v4
|
||||||
|
#ifdef SX126X_REGISTER_PATCH
|
||||||
|
uint8_t r_data = 0;
|
||||||
|
readRegister(0x8B5, &r_data, 1);
|
||||||
|
r_data |= 0x01;
|
||||||
|
writeRegister(0x8B5, &r_data, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
return true; // success
|
return true; // success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
64
tools/maint/patch_and_build_hansemesh_fw.sh
Executable file
64
tools/maint/patch_and_build_hansemesh_fw.sh
Executable file
@@ -0,0 +1,64 @@
|
|||||||
|
#!/bin/bash # Note: switched to bash for process substitution support
|
||||||
|
|
||||||
|
export PATH="$HOME/.platformio/penv/bin:$PATH"
|
||||||
|
|
||||||
|
LOGFILE="$PWD/meshcore-evo-fw.log"
|
||||||
|
FIRMWARE_VERSION="v1.11.0-evo_0.1.3"
|
||||||
|
FIRMWARE_BUILD_DATE=$(date '+%d-%b-%Y')
|
||||||
|
|
||||||
|
collect_bin_files(){
|
||||||
|
DEST_DIR="./firmwares"
|
||||||
|
mkdir -p "$DEST_DIR"
|
||||||
|
BUILD_DIR=".pio/build"
|
||||||
|
|
||||||
|
if [ ! -d "$BUILD_DIR" ]; then
|
||||||
|
echo "Error: $BUILD_DIR not found. Did you run the build process?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Copying firmware files to $DEST_DIR..."
|
||||||
|
|
||||||
|
for target_path in "$BUILD_DIR"/*/; do
|
||||||
|
echo $target_path
|
||||||
|
target_name=$(basename "$target_path")
|
||||||
|
# if ls "$target_path"*.bin >/dev/null 2>&1; then
|
||||||
|
for bin_file in "$target_path"*firmware*.{uf2,bin,zip}; do
|
||||||
|
filename=$(basename "$bin_file")
|
||||||
|
new_filename="${target_name}_${FIRMWARE_VERSION}_${FIRMWARE_BUILD_DATE}_${filename}"
|
||||||
|
cp "$bin_file" "$DEST_DIR/$new_filename"
|
||||||
|
echo "Done: $new_filename"
|
||||||
|
done
|
||||||
|
# fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Everything after this line goes to BOTH console and logfile
|
||||||
|
exec > >(tee -a "$LOGFILE") 2>&1
|
||||||
|
|
||||||
|
echo "-------------------- Build start ----------------"
|
||||||
|
date
|
||||||
|
echo "-------------------------------------------------"
|
||||||
|
|
||||||
|
# apply patches
|
||||||
|
# ./tools/maint/apply_patches.sh 1199 1338 1297
|
||||||
|
|
||||||
|
# build all repeater firmwares, the will be in .out
|
||||||
|
FIRMWARE_VERSION="v1.11_evo" ./build.sh build-repeater-firmwares
|
||||||
|
|
||||||
|
# build single firmwares
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware ProMicro_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware RAK_4631_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware heltec_v4_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware Heltec_v3_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware Xiao_nrf52_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware LilyGo_T3S3_sx1262_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware Heltec_t114_without_display_repeater
|
||||||
|
#FIRMWARE_VERSION=$FIRMWARE_VERSION FIRMWARE_BUILD_DATE=$FIRMWARE_BUILD_DATE ./build.sh build-firmware Heltec_t114_repeater
|
||||||
|
#collect_bin_files
|
||||||
|
|
||||||
|
|
||||||
|
echo "-------------------- Build end ------------------"
|
||||||
|
date
|
||||||
|
echo "-------------------------------------------------"
|
||||||
|
|
||||||
|
#grep -E " SUCCESS | FAILED " hansemesh_fw.log
|
||||||
@@ -17,18 +17,19 @@ build_flags =
|
|||||||
-D P_LORA_SCLK=9
|
-D P_LORA_SCLK=9
|
||||||
-D P_LORA_MISO=11
|
-D P_LORA_MISO=11
|
||||||
-D P_LORA_MOSI=10
|
-D P_LORA_MOSI=10
|
||||||
-D P_LORA_PA_POWER=7 ;power en
|
-D P_LORA_PA_POWER=7 ; VFEM_Ctrl - Power on GC1109
|
||||||
-D P_LORA_PA_EN=2
|
-D P_LORA_PA_EN=2 ; PA CSD - Enable GC1109
|
||||||
-D P_LORA_PA_TX_EN=46 ;enable tx
|
-D P_LORA_PA_TX_EN=46 ; PA CPS - GC1109 TX PA full(High) / bypass(Low)
|
||||||
-D PIN_USER_BTN=0
|
-D PIN_USER_BTN=0
|
||||||
-D PIN_VEXT_EN=36
|
-D PIN_VEXT_EN=36
|
||||||
-D PIN_VEXT_EN_ACTIVE=LOW
|
-D PIN_VEXT_EN_ACTIVE=LOW
|
||||||
-D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm.
|
-D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm.
|
||||||
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output
|
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output
|
||||||
-D SX126X_DIO2_AS_RF_SWITCH=true
|
-D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX
|
||||||
|
-D SX126X_DIO2_AS_RF_SWITCH=true ; GC1109 CTX is controlled by SX1262 DIO2
|
||||||
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
|
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
|
||||||
-D SX126X_CURRENT_LIMIT=140
|
-D SX126X_CURRENT_LIMIT=140
|
||||||
-D SX126X_RX_BOOSTED_GAIN=1
|
-D SX126X_RX_BOOSTED_GAIN=1 ; In some cases, commenting this out will improve RX
|
||||||
-D PIN_GPS_RX=38
|
-D PIN_GPS_RX=38
|
||||||
-D PIN_GPS_TX=39
|
-D PIN_GPS_TX=39
|
||||||
-D PIN_GPS_RESET=42
|
-D PIN_GPS_RESET=42
|
||||||
|
|||||||
Reference in New Issue
Block a user