mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
* various changes for CLI support via companion radio
This commit is contained in:
parent
189ed79d46
commit
1209d54d2e
6 changed files with 79 additions and 11 deletions
|
|
@ -438,12 +438,12 @@ protected:
|
|||
return false;
|
||||
}
|
||||
|
||||
void onMessageRecv(const ContactInfo& from, uint8_t path_len, uint32_t sender_timestamp, const char *text) override {
|
||||
void queueMessage(const ContactInfo& from, uint8_t txt_type, uint8_t path_len, uint32_t sender_timestamp, const char *text) {
|
||||
int i = 0;
|
||||
out_frame[i++] = RESP_CODE_CONTACT_MSG_RECV;
|
||||
memcpy(&out_frame[i], from.id.pub_key, 6); i += 6; // just 6-byte prefix
|
||||
out_frame[i++] = path_len;
|
||||
out_frame[i++] = TXT_TYPE_PLAIN;
|
||||
out_frame[i++] = txt_type;
|
||||
memcpy(&out_frame[i], &sender_timestamp, 4); i += 4;
|
||||
int tlen = strlen(text); // TODO: UTF-8 ??
|
||||
if (i + tlen > MAX_FRAME_SIZE) {
|
||||
|
|
@ -461,6 +461,14 @@ protected:
|
|||
}
|
||||
}
|
||||
|
||||
void onMessageRecv(const ContactInfo& from, uint8_t path_len, uint32_t sender_timestamp, const char *text) override {
|
||||
queueMessage(from, TXT_TYPE_PLAIN, path_len, sender_timestamp, text);
|
||||
}
|
||||
|
||||
void onCommandDataRecv(const ContactInfo& from, uint8_t path_len, uint32_t sender_timestamp, const char *text) override {
|
||||
queueMessage(from, TXT_TYPE_CLI_DATA, path_len, sender_timestamp, text);
|
||||
}
|
||||
|
||||
void onChannelMessageRecv(const mesh::GroupChannel& channel, int in_path_len, uint32_t timestamp, const char *text) override {
|
||||
int i = 0;
|
||||
out_frame[i++] = RESP_CODE_CHANNEL_MSG_RECV;
|
||||
|
|
@ -677,12 +685,18 @@ public:
|
|||
memcpy(&msg_timestamp, &cmd_frame[i], 4); i += 4;
|
||||
uint8_t* pub_key_prefix = &cmd_frame[i]; i += 6;
|
||||
ContactInfo* recipient = lookupContactByPubKey(pub_key_prefix, 6);
|
||||
if (recipient && attempt < 4 && txt_type == TXT_TYPE_PLAIN) {
|
||||
if (recipient && attempt < 4 && (txt_type == TXT_TYPE_PLAIN || txt_type == TXT_TYPE_CLI_DATA)) {
|
||||
char *text = (char *) &cmd_frame[i];
|
||||
int tlen = len - i;
|
||||
uint32_t est_timeout;
|
||||
text[tlen] = 0; // ensure null
|
||||
int result = sendMessage(*recipient, msg_timestamp, attempt, text, expected_ack_crc, est_timeout);
|
||||
int result;
|
||||
if (txt_type == TXT_TYPE_CLI_DATA) {
|
||||
result = sendCommandData(*recipient, msg_timestamp, attempt, text, est_timeout);
|
||||
expected_ack_crc = 0; // no Ack expected
|
||||
} else {
|
||||
result = sendMessage(*recipient, msg_timestamp, attempt, text, expected_ack_crc, est_timeout);
|
||||
}
|
||||
// TODO: add expected ACK to table
|
||||
if (result == MSG_SEND_FAILED) {
|
||||
writeErrFrame();
|
||||
|
|
|
|||
|
|
@ -469,7 +469,7 @@ protected:
|
|||
timestamp++;
|
||||
}
|
||||
memcpy(temp, ×tamp, 4); // mostly an extra blob to help make packet_hash unique
|
||||
temp[4] = (TXT_TYPE_PLAIN << 2); // TODO: change this to TXT_TYPE_CLI_DATA soon
|
||||
temp[4] = (TXT_TYPE_CLI_DATA << 2); // NOTE: legacy was: TXT_TYPE_PLAIN
|
||||
|
||||
// calc expected ACK reply
|
||||
//mesh::Utils::sha256((uint8_t *)&expected_ack_crc, 4, temp, 5 + text_len, self_id.pub_key, PUB_KEY_SIZE);
|
||||
|
|
@ -581,9 +581,15 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void handleCommand(uint32_t sender_timestamp, const char* command, char reply[]) {
|
||||
void handleCommand(uint32_t sender_timestamp, const char* command, char* reply) {
|
||||
while (*command == ' ') command++; // skip leading spaces
|
||||
|
||||
if (strlen(command) > 4 && command[2] == '|') { // optional prefix (for companion radio CLI)
|
||||
memcpy(reply, command, 3); // reflect the prefix back
|
||||
reply += 3;
|
||||
command += 3;
|
||||
}
|
||||
|
||||
if (memcmp(command, "reboot", 6) == 0) {
|
||||
board.reboot(); // doesn't return
|
||||
} else if (memcmp(command, "advert", 6) == 0) {
|
||||
|
|
|
|||
|
|
@ -423,6 +423,7 @@ protected:
|
|||
if (flags == TXT_TYPE_CLI_DATA) {
|
||||
if (client->is_admin) {
|
||||
handleAdminCommand(sender_timestamp, (const char *) &data[5], (char *) &temp[5]);
|
||||
temp[4] = (TXT_TYPE_CLI_DATA << 2); // attempt and flags, (NOTE: legacy was: TXT_TYPE_PLAIN)
|
||||
send_ack = true;
|
||||
} else {
|
||||
temp[5] = 0; // no reply
|
||||
|
|
@ -452,7 +453,6 @@ protected:
|
|||
now++;
|
||||
}
|
||||
memcpy(temp, &now, 4); // mostly an extra blob to help make packet_hash unique
|
||||
temp[4] = (TXT_TYPE_PLAIN << 2); // attempt and flags
|
||||
|
||||
// calc expected ACK reply
|
||||
//mesh::Utils::sha256((uint8_t *)&expected_ack_crc, 4, temp, 5 + text_len, self_id.pub_key, PUB_KEY_SIZE);
|
||||
|
|
@ -604,9 +604,15 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void handleAdminCommand(uint32_t sender_timestamp, const char* command, char reply[]) {
|
||||
void handleAdminCommand(uint32_t sender_timestamp, const char* command, char* reply) {
|
||||
while (*command == ' ') command++; // skip leading spaces
|
||||
|
||||
if (strlen(command) > 4 && command[2] == '|') { // optional prefix (for companion radio CLI)
|
||||
memcpy(reply, command, 3); // reflect the prefix back
|
||||
reply += 3;
|
||||
command += 3;
|
||||
}
|
||||
|
||||
if (memcmp(command, "reboot", 6) == 0) {
|
||||
board.reboot(); // doesn't return
|
||||
} else if (memcmp(command, "advert", 6) == 0) {
|
||||
|
|
|
|||
|
|
@ -259,6 +259,9 @@ protected:
|
|||
}
|
||||
}
|
||||
|
||||
void onCommandDataRecv(const ContactInfo& from, uint8_t path_len, uint32_t sender_timestamp, const char *text) override {
|
||||
}
|
||||
|
||||
void onChannelMessageRecv(const mesh::GroupChannel& channel, int in_path_len, uint32_t timestamp, const char *text) override {
|
||||
if (in_path_len < 0) {
|
||||
Serial.printf("PUBLIC CHANNEL MSG -> (Direct!)\n");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue