mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-08-07 04:36:11 +00:00
perf(bot): lower body once and strstr instead of O(n*m) per-offset tolower
For a 140-byte channel msg with a 64-byte trigger, the old loop did ~8960 tolower() calls per inbound message; now it's 140 tolower calls plus one strstr. perf(buzzer): skip nRF52 STOPPED wait when PWM was not running TASKS_STOP on a disabled PWM never fires EVENTS_STOPPED, so the wait always timed out at 2 ms. Gating on _pwm_on removes the wait on the first note of a melody and after pauses, where there's nothing to wait for. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
e2d59b9a3d
commit
bf724ce692
@@ -8,15 +8,13 @@ void MyMesh::tryBotReplyDM(const ContactInfo& from, const char* text) {
|
|||||||
millis() - _bot_last_dm_reply_ms > 10000UL))
|
millis() - _bot_last_dm_reply_ms > 10000UL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const char* tr = _prefs.bot_trigger; // already lowercase (normalised at save/load time)
|
// Lower-case the body once, then a single strstr — avoids O(n*m) tolower per offset.
|
||||||
int tlen = strlen(tr);
|
char low[200];
|
||||||
bool matched = false;
|
size_t n = strlen(text);
|
||||||
for (const char* t = text; *t && !matched; t++) {
|
if (n >= sizeof(low)) n = sizeof(low) - 1;
|
||||||
int i = 0;
|
for (size_t i = 0; i < n; i++) low[i] = (char)tolower((uint8_t)text[i]);
|
||||||
while (i < tlen && tolower((uint8_t)t[i]) == (uint8_t)tr[i]) i++;
|
low[n] = '\0';
|
||||||
if (i == tlen) matched = true;
|
if (!strstr(low, _prefs.bot_trigger)) return;
|
||||||
}
|
|
||||||
if (!matched) return;
|
|
||||||
|
|
||||||
uint32_t ts = getRTCClock()->getCurrentTime();
|
uint32_t ts = getRTCClock()->getCurrentTime();
|
||||||
char expanded[200];
|
char expanded[200];
|
||||||
@@ -45,15 +43,12 @@ void MyMesh::tryBotReplyChannel(uint8_t channel_idx, const char* text) {
|
|||||||
const char* sep = strstr(text, ": ");
|
const char* sep = strstr(text, ": ");
|
||||||
if (sep) msg = sep + 2;
|
if (sep) msg = sep + 2;
|
||||||
|
|
||||||
const char* tr = _prefs.bot_trigger; // already lowercase (normalised at save/load time)
|
char low[200];
|
||||||
int tlen = strlen(tr);
|
size_t n = strlen(msg);
|
||||||
bool matched = false;
|
if (n >= sizeof(low)) n = sizeof(low) - 1;
|
||||||
for (const char* t = msg; *t && !matched; t++) {
|
for (size_t i = 0; i < n; i++) low[i] = (char)tolower((uint8_t)msg[i]);
|
||||||
int i = 0;
|
low[n] = '\0';
|
||||||
while (i < tlen && tolower((uint8_t)t[i]) == (uint8_t)tr[i]) i++;
|
if (!strstr(low, _prefs.bot_trigger)) return;
|
||||||
if (i == tlen) matched = true;
|
|
||||||
}
|
|
||||||
if (!matched) return;
|
|
||||||
|
|
||||||
ChannelDetails ch;
|
ChannelDetails ch;
|
||||||
if (!getChannel(channel_idx, ch)) return;
|
if (!getChannel(channel_idx, ch)) return;
|
||||||
|
|||||||
@@ -104,11 +104,14 @@ void genericBuzzer::_nrfStartPwm(uint16_t freq) {
|
|||||||
_duty_buf = 0x8000U | cmp;
|
_duty_buf = 0x8000U | cmp;
|
||||||
__DMB();
|
__DMB();
|
||||||
|
|
||||||
|
// Only wait for STOPPED if PWM was actually running — TASKS_STOP on a disabled
|
||||||
|
// PWM never fires EVENTS_STOPPED, so the wait would always time out at 2 ms.
|
||||||
|
if (_pwm_on) {
|
||||||
NRF_PWM2->TASKS_STOP = 1;
|
NRF_PWM2->TASKS_STOP = 1;
|
||||||
// Wait for STOPPED (short busy-wait, typically < 1 PWM period)
|
|
||||||
uint32_t t = millis();
|
uint32_t t = millis();
|
||||||
while (!(NRF_PWM2->EVENTS_STOPPED) && (millis() - t) < 2) {}
|
while (!(NRF_PWM2->EVENTS_STOPPED) && (millis() - t) < 2) {}
|
||||||
NRF_PWM2->EVENTS_STOPPED = 0;
|
NRF_PWM2->EVENTS_STOPPED = 0;
|
||||||
|
}
|
||||||
|
|
||||||
NRF_PWM2->PSEL.OUT[0] = nrf_pin;
|
NRF_PWM2->PSEL.OUT[0] = nrf_pin;
|
||||||
NRF_PWM2->PSEL.OUT[1] = 0xFFFFFFFFUL;
|
NRF_PWM2->PSEL.OUT[1] = 0xFFFFFFFFUL;
|
||||||
|
|||||||
Reference in New Issue
Block a user