diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index ac8f9cdf..e65369e1 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -96,6 +96,9 @@ static uint32_t _atoi(const char* sp) { /*------------ Frame Protocol --------------*/ +#define FIRMWARE_VER_CODE 1 +#define FIRMWARE_BUILD_DATE "19 Feb 2025" + #define CMD_APP_START 1 #define CMD_SEND_TXT_MSG 2 #define CMD_SEND_CHANNEL_TXT_MSG 3 @@ -117,6 +120,7 @@ static uint32_t _atoi(const char* sp) { #define CMD_REBOOT 19 #define CMD_GET_BATTERY_VOLTAGE 20 #define CMD_SET_TUNING_PARAMS 21 +#define CMD_DEVICE_QEURY 22 #define RESP_CODE_OK 0 #define RESP_CODE_ERR 1 @@ -131,6 +135,7 @@ static uint32_t _atoi(const char* sp) { #define RESP_CODE_NO_MORE_MESSAGES 10 // a reply to CMD_SYNC_NEXT_MESSAGE #define RESP_CODE_EXPORT_CONTACT 11 #define RESP_CODE_BATTERY_VOLTAGE 12 // a reply to a CMD_GET_BATTERY_VOLTAGE +#define RESP_CODE_DEVICE_INFO 13 // a reply to CMD_DEVICE_QEURY // these are _pushed_ to client app at any time #define PUSH_CODE_ADVERT 0x80 @@ -167,6 +172,7 @@ class MyMesh : public BaseChatMesh { uint32_t _iter_filter_since; uint32_t _most_recent_lastmod; bool _iter_started; + uint8_t app_target_ver; uint8_t cmd_frame[MAX_FRAME_SIZE+1]; uint8_t out_frame[MAX_FRAME_SIZE+1]; @@ -470,6 +476,7 @@ public: { _iter_started = false; offline_queue_len = 0; + app_target_ver = 0; // defaults memset(&_prefs, 0, sizeof(_prefs)); @@ -541,12 +548,25 @@ public: } void handleCmdFrame(size_t len) { - if (cmd_frame[0] == CMD_APP_START && len >= 8) { // sent when app establishes connection, respond with node ID - uint8_t app_ver = cmd_frame[1]; - // cmd_frame[2..7] reserved future + if (cmd_frame[0] == CMD_DEVICE_QEURY && len >= 2) { // sent when app establishes connection + app_target_ver = cmd_frame[1]; // which version of protocol does app understand + + int i = 0; + out_frame[i++] = RESP_CODE_DEVICE_INFO; + out_frame[i++] = FIRMWARE_VER_CODE; + memset(&out_frame[i], 0, 6); i += 6; // reserved + memset(&out_frame[i], 0, 12); + strcpy((char *) &out_frame[i], FIRMWARE_BUILD_DATE); + i += 12; + const char* name = board.getManufacturerName(); + int tlen = strlen(name); + memcpy(&out_frame[i], name, tlen); i += tlen; + _serial->writeFrame(out_frame, i); + } else if (cmd_frame[0] == CMD_APP_START && len >= 8) { // sent when app establishes connection, respond with node ID + // cmd_frame[1..7] reserved future char* app_name = (char *) &cmd_frame[8]; cmd_frame[len] = 0; // make app_name null terminated - MESH_DEBUG_PRINTLN("App %s connected, ver: %d", app_name, (uint32_t)app_ver); + MESH_DEBUG_PRINTLN("App %s connected", app_name); _iter_started = false; // stop any left-over ContactsIterator int i = 0; @@ -809,12 +829,14 @@ public: } } else if (cmd_frame[0] == CMD_SET_TUNING_PARAMS) { int i = 1; - uint32_t rx; + uint32_t rx, af; memcpy(&rx, &cmd_frame[i], 4); i += 4; + memcpy(&af, &cmd_frame[i], 4); i += 4; _prefs.rx_delay_base = ((float)rx) / 1000.0f; + _prefs.airtime_factor = ((float)af) / 1000.0f; savePrefs(); writeOKFrame(); - } else if (cmd_frame[0] == CMD_REBOOT) { + } else if (cmd_frame[0] == CMD_REBOOT && memcmp(&cmd_frame[1], "reboot", 6) == 0) { board.reboot(); } else if (cmd_frame[0] == CMD_GET_BATTERY_VOLTAGE) { uint8_t reply[3];