feat: enhance command handling to support multiple commands in a single input

This commit is contained in:
overkillfpv 2026-04-20 21:14:26 +10:00
parent 49b37d5622
commit 20051b983e
2 changed files with 67 additions and 2 deletions

View file

@ -719,7 +719,40 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
if (is_retry) {
*reply = 0;
} else {
handleCommand(sender_timestamp, command, reply);
reply[0] = 0;
int reply_remaining = 160;
char *reply_ptr = reply;
static char cmd_buf[160];
strncpy(cmd_buf, command, sizeof(cmd_buf) - 1);
cmd_buf[sizeof(cmd_buf) - 1] = 0;
char *cmd_tok = cmd_buf;
char *sep;
bool first = true;
while (cmd_tok && reply_remaining > 1) {
sep = strchr(cmd_tok, ';');
if (sep) *sep = 0;
// trim leading spaces
while (*cmd_tok == ' ') cmd_tok++;
if (*cmd_tok) {
static char single_reply[160];
single_reply[0] = 0;
handleCommand(sender_timestamp, cmd_tok, single_reply);
int slen = strlen(single_reply);
if (slen > 0) {
if (!first && reply_remaining > 1) {
*reply_ptr++ = ';';
reply_remaining--;
}
int copy_len = (slen < reply_remaining) ? slen : reply_remaining;
memcpy(reply_ptr, single_reply, copy_len);
reply_ptr += copy_len;
reply_remaining -= copy_len;
first = false;
}
}
cmd_tok = sep ? sep + 1 : NULL;
}
*reply_ptr = 0;
}
int text_len = strlen(reply);
if (text_len > 0) {

View file

@ -124,7 +124,39 @@ void loop() {
Serial.print('\n');
command[len - 1] = 0; // replace newline with C string null terminator
char reply[160];
the_mesh.handleCommand(0, command, reply); // NOTE: there is no sender_timestamp via serial!
reply[0] = 0;
int reply_remaining = sizeof(reply) - 1;
char *reply_ptr = reply;
static char cmd_buf[sizeof(command)];
strncpy(cmd_buf, command, sizeof(cmd_buf) - 1);
cmd_buf[sizeof(cmd_buf) - 1] = 0;
char *cmd_tok = cmd_buf;
char *sep;
bool first = true;
while (cmd_tok && reply_remaining > 1) {
sep = strchr(cmd_tok, ';');
if (sep) *sep = 0;
while (*cmd_tok == ' ') cmd_tok++;
if (*cmd_tok) {
static char single_reply[160];
single_reply[0] = 0;
the_mesh.handleCommand(0, cmd_tok, single_reply); // NOTE: there is no sender_timestamp via serial!
int slen = strlen(single_reply);
if (slen > 0) {
if (!first && reply_remaining > 1) {
*reply_ptr++ = ';';
reply_remaining--;
}
int copy_len = (slen < reply_remaining) ? slen : reply_remaining;
memcpy(reply_ptr, single_reply, copy_len);
reply_ptr += copy_len;
reply_remaining -= copy_len;
first = false;
}
}
cmd_tok = sep ? sep + 1 : NULL;
}
*reply_ptr = 0;
if (reply[0]) {
Serial.print(" -> "); Serial.println(reply);
}