diff --git a/protobufs b/protobufs index 256f11954..d3dfaa63a 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 256f11954b7c8fcb9dc4481771c24559925bf32a +Subproject commit d3dfaa63a5108c1da7571cd780efaf561b99cc74 diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index a725e6283..2f060889a 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -79,17 +79,17 @@ bool PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength) memset(&toRadioScratch, 0, sizeof(toRadioScratch)); if (pb_decode_from_bytes(buf, bufLength, ToRadio_fields, &toRadioScratch)) { switch (toRadioScratch.which_payload_variant) { - case ToRadio_packet_tag: - return handleToRadioPacket(toRadioScratch.packet); - case ToRadio_want_config_id_tag: - config_nonce = toRadioScratch.want_config_id; - DEBUG_MSG("Client wants config, nonce=%u\n", config_nonce); - handleStartConfig(); - break; - case ToRadio_disconnect_tag: - DEBUG_MSG("Disconnecting from phone\n"); - close(); - break; + case ToRadio_packet_tag: + return handleToRadioPacket(toRadioScratch.packet); + case ToRadio_want_config_id_tag: + config_nonce = toRadioScratch.want_config_id; + DEBUG_MSG("Client wants config, nonce=%u\n", config_nonce); + handleStartConfig(); + break; + case ToRadio_disconnect_tag: + DEBUG_MSG("Disconnecting from phone\n"); + close(); + break; default: // Ignore nop messages // DEBUG_MSG("Error: unexpected ToRadio variant\n"); @@ -109,8 +109,10 @@ bool PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength) * * Our sending states progress in the following sequence (the client app ASSUMES THIS SEQUENCE, DO NOT CHANGE IT): * STATE_SEND_MY_INFO, // send our my info record + * STATE_SEND_CHANNELS * STATE_SEND_NODEINFO, // states progress in this order as the device sends to the client STATE_SEND_CONFIG, + STATE_SEND_MODULE_CONFIG, STATE_SEND_COMPLETE_ID, STATE_SEND_PACKETS // send packets or debug strings */ @@ -128,7 +130,7 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) case STATE_SEND_NOTHING: DEBUG_MSG("getFromRadio=STATE_SEND_NOTHING\n"); break; - + case STATE_SEND_MY_INFO: DEBUG_MSG("getFromRadio=STATE_SEND_MY_INFO\n"); // If the user has specified they don't want our node to share its location, make sure to tell the phone @@ -154,51 +156,63 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) // Stay in current state until done sending nodeinfos } else { DEBUG_MSG("Done sending nodeinfos\n"); - state = STATE_SEND_CONFIG; + state = STATE_SEND_CHANNELS; // Go ahead and send that ID right now return getFromRadio(buf); } break; } + case STATE_SEND_CHANNELS: + DEBUG_MSG("getFromRadio=STATE_SEND_CHANNELS\n"); + fromRadioScratch.which_payload_variant = FromRadio_channel_tag; + fromRadioScratch.channel = channels.getByIndex(config_state); + config_state++; + // Advance when we have sent all of our Channels + if (config_state >= MAX_NUM_CHANNELS) { + state = STATE_SEND_CONFIG; + config_state = Config_device_tag; + } + break; + case STATE_SEND_CONFIG: DEBUG_MSG("getFromRadio=STATE_SEND_CONFIG\n"); fromRadioScratch.which_payload_variant = FromRadio_config_tag; switch (config_state) { - case Config_device_tag: - fromRadioScratch.config.which_payload_variant = Config_device_tag; - fromRadioScratch.config.payload_variant.device = config.device; - break; - case Config_position_tag: - fromRadioScratch.config.which_payload_variant = Config_position_tag; - fromRadioScratch.config.payload_variant.position = config.position; - break; - case Config_power_tag: - fromRadioScratch.config.which_payload_variant = Config_power_tag; - fromRadioScratch.config.payload_variant.power = config.power; - fromRadioScratch.config.payload_variant.power.ls_secs = default_ls_secs; - break; - case Config_network_tag: - fromRadioScratch.config.which_payload_variant = Config_network_tag; - fromRadioScratch.config.payload_variant.network = config.network; - break; - case Config_display_tag: - fromRadioScratch.config.which_payload_variant = Config_display_tag; - fromRadioScratch.config.payload_variant.display = config.display; - break; - case Config_lora_tag: - fromRadioScratch.config.which_payload_variant = Config_lora_tag; - fromRadioScratch.config.payload_variant.lora = config.lora; - break; - case Config_bluetooth_tag: - fromRadioScratch.config.which_payload_variant = Config_bluetooth_tag; - fromRadioScratch.config.payload_variant.bluetooth = config.bluetooth; - break; + case Config_device_tag: + fromRadioScratch.config.which_payload_variant = Config_device_tag; + fromRadioScratch.config.payload_variant.device = config.device; + break; + case Config_position_tag: + fromRadioScratch.config.which_payload_variant = Config_position_tag; + fromRadioScratch.config.payload_variant.position = config.position; + break; + case Config_power_tag: + fromRadioScratch.config.which_payload_variant = Config_power_tag; + fromRadioScratch.config.payload_variant.power = config.power; + fromRadioScratch.config.payload_variant.power.ls_secs = default_ls_secs; + break; + case Config_network_tag: + fromRadioScratch.config.which_payload_variant = Config_network_tag; + fromRadioScratch.config.payload_variant.network = config.network; + break; + case Config_display_tag: + fromRadioScratch.config.which_payload_variant = Config_display_tag; + fromRadioScratch.config.payload_variant.display = config.display; + break; + case Config_lora_tag: + fromRadioScratch.config.which_payload_variant = Config_lora_tag; + fromRadioScratch.config.payload_variant.lora = config.lora; + break; + case Config_bluetooth_tag: + fromRadioScratch.config.which_payload_variant = Config_bluetooth_tag; + fromRadioScratch.config.payload_variant.bluetooth = config.bluetooth; + break; } // NOTE: The phone app needs to know the ls_secs value so it can properly expect sleep behavior. // So even if we internally use 0 to represent 'use default' we still need to send the value we are // using to the app (so that even old phone apps work with new device loads). - + config_state++; // Advance when we have sent all of our config objects if (config_state > Config_bluetooth_tag) { @@ -211,37 +225,37 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) DEBUG_MSG("getFromRadio=STATE_SEND_MODULECONFIG\n"); fromRadioScratch.which_payload_variant = FromRadio_moduleConfig_tag; switch (config_state) { - case ModuleConfig_mqtt_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_mqtt_tag; - fromRadioScratch.moduleConfig.payload_variant.mqtt = moduleConfig.mqtt; - break; - case ModuleConfig_serial_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_serial_tag; - fromRadioScratch.moduleConfig.payload_variant.serial = moduleConfig.serial; - break; - case ModuleConfig_external_notification_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_external_notification_tag; - fromRadioScratch.moduleConfig.payload_variant.external_notification = moduleConfig.external_notification; - break; - case ModuleConfig_range_test_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_range_test_tag; - fromRadioScratch.moduleConfig.payload_variant.range_test = moduleConfig.range_test; - break; - case ModuleConfig_telemetry_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_telemetry_tag; - fromRadioScratch.moduleConfig.payload_variant.telemetry = moduleConfig.telemetry; - break; - case ModuleConfig_canned_message_tag: - fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_canned_message_tag; - fromRadioScratch.moduleConfig.payload_variant.canned_message = moduleConfig.canned_message; - break; + case ModuleConfig_mqtt_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_mqtt_tag; + fromRadioScratch.moduleConfig.payload_variant.mqtt = moduleConfig.mqtt; + break; + case ModuleConfig_serial_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_serial_tag; + fromRadioScratch.moduleConfig.payload_variant.serial = moduleConfig.serial; + break; + case ModuleConfig_external_notification_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_external_notification_tag; + fromRadioScratch.moduleConfig.payload_variant.external_notification = moduleConfig.external_notification; + break; + case ModuleConfig_range_test_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_range_test_tag; + fromRadioScratch.moduleConfig.payload_variant.range_test = moduleConfig.range_test; + break; + case ModuleConfig_telemetry_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_telemetry_tag; + fromRadioScratch.moduleConfig.payload_variant.telemetry = moduleConfig.telemetry; + break; + case ModuleConfig_canned_message_tag: + fromRadioScratch.moduleConfig.which_payload_variant = ModuleConfig_canned_message_tag; + fromRadioScratch.moduleConfig.payload_variant.canned_message = moduleConfig.canned_message; + break; } config_state++; // Advance when we have sent all of our ModuleConfig objects if (config_state > ModuleConfig_canned_message_tag) { state = STATE_SEND_COMPLETE_ID; - config_state = Config_device_tag; + config_state = 0; } break; @@ -274,7 +288,8 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) if (fromRadioScratch.which_payload_variant != 0) { // Encapsulate as a FromRadio packet size_t numbytes = pb_encode_to_bytes(buf, FromRadio_size, FromRadio_fields, &fromRadioScratch); - // DEBUG_MSG("encoding toPhone packet to phone variant=%d, %d bytes\n", fromRadioScratch.which_payloadVariant, numbytes); + + DEBUG_MSG("encoding toPhone packet to phone variant=%d, %d bytes\n", fromRadioScratch.which_payload_variant, numbytes); return numbytes; } @@ -282,7 +297,7 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) return 0; } -void PhoneAPI::handleDisconnect() +void PhoneAPI::handleDisconnect() { DEBUG_MSG("PhoneAPI disconnect\n"); } @@ -301,26 +316,25 @@ void PhoneAPI::releasePhonePacket() bool PhoneAPI::available() { switch (state) { - case STATE_SEND_NOTHING: - return false; - case STATE_SEND_MY_INFO: - return true; - case STATE_SEND_CONFIG: - return true; - case STATE_SEND_MODULECONFIG: - return true; - case STATE_SEND_NODEINFO: - if (!nodeInfoForPhone) - nodeInfoForPhone = nodeDB.readNextInfo(); - return true; // Always say we have something, because we might need to advance our state machine - case STATE_SEND_COMPLETE_ID: - return true; - case STATE_SEND_PACKETS: { - if (!packetForPhone) - packetForPhone = service.getForPhone(); - bool hasPacket = !!packetForPhone; - // DEBUG_MSG("available hasPacket=%d\n", hasPacket); - return hasPacket; + case STATE_SEND_NOTHING: + return false; + case STATE_SEND_MY_INFO: + case STATE_SEND_CHANNELS: + case STATE_SEND_CONFIG: + case STATE_SEND_MODULECONFIG: + case STATE_SEND_COMPLETE_ID: + return true; + case STATE_SEND_NODEINFO: + if (!nodeInfoForPhone) + nodeInfoForPhone = nodeDB.readNextInfo(); + return true; // Always say we have something, because we might need to advance our state machine + + case STATE_SEND_PACKETS: { + if (!packetForPhone) + packetForPhone = service.getForPhone(); + bool hasPacket = !!packetForPhone; + // DEBUG_MSG("available hasPacket=%d\n", hasPacket); + return hasPacket; } default: assert(0); // unexpected state - FIXME, make an error code and reboot diff --git a/src/mesh/PhoneAPI.h b/src/mesh/PhoneAPI.h index fb372bde1..cbac5f688 100644 --- a/src/mesh/PhoneAPI.h +++ b/src/mesh/PhoneAPI.h @@ -16,13 +16,13 @@ * Eventually there should be once instance of this class for each live connection (because it has a bit of state * for that connection) */ -class PhoneAPI - : public Observer // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member +class PhoneAPI : public Observer // FIXME, we shouldn't be inheriting from Observer, instead use CallbackObserver as a member { enum State { STATE_SEND_NOTHING, // Initial state, don't send anything until the client starts asking for config STATE_SEND_MY_INFO, // send our my info record STATE_SEND_NODEINFO, // states progress in this order as the device sends to to the client + STATE_SEND_CHANNELS, // Send all channels STATE_SEND_CONFIG, // Replacement for the old Radioconfig STATE_SEND_MODULECONFIG, // Send Module specific config STATE_SEND_COMPLETE_ID, @@ -31,7 +31,7 @@ class PhoneAPI State state = STATE_SEND_NOTHING; - int8_t config_state = Config_device_tag; + uint8_t config_state = 0; /** * Each packet sent to the phone has an incrementing count diff --git a/src/mesh/generated/admin.pb.h b/src/mesh/generated/admin.pb.h index 9392c19a0..9b93bfd44 100644 --- a/src/mesh/generated/admin.pb.h +++ b/src/mesh/generated/admin.pb.h @@ -59,8 +59,6 @@ typedef struct _AdminMessage { AdminMessage_ModuleConfigType get_module_config_request; /* Send the current Config in the response to this message. */ ModuleConfig get_module_config_response; - /* Send all channels in the response to this message */ - bool get_all_channel_request; /* Get the Canned Message Module messages in the response to this message. */ bool get_canned_message_module_messages_request; /* Get the Canned Message Module messages in the response to this message. */ @@ -139,7 +137,6 @@ extern "C" { #define AdminMessage_get_config_response_tag 6 #define AdminMessage_get_module_config_request_tag 7 #define AdminMessage_get_module_config_response_tag 8 -#define AdminMessage_get_all_channel_request_tag 9 #define AdminMessage_get_canned_message_module_messages_request_tag 10 #define AdminMessage_get_canned_message_module_messages_response_tag 11 #define AdminMessage_get_device_metadata_request_tag 12 @@ -170,7 +167,6 @@ X(a, STATIC, ONEOF, UENUM, (payload_variant,get_config_request,get_confi X(a, STATIC, ONEOF, MESSAGE, (payload_variant,get_config_response,get_config_response), 6) \ X(a, STATIC, ONEOF, UENUM, (payload_variant,get_module_config_request,get_module_config_request), 7) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,get_module_config_response,get_module_config_response), 8) \ -X(a, STATIC, ONEOF, BOOL, (payload_variant,get_all_channel_request,get_all_channel_request), 9) \ X(a, STATIC, ONEOF, BOOL, (payload_variant,get_canned_message_module_messages_request,get_canned_message_module_messages_request), 10) \ X(a, STATIC, ONEOF, STRING, (payload_variant,get_canned_message_module_messages_response,get_canned_message_module_messages_response), 11) \ X(a, STATIC, ONEOF, BOOL, (payload_variant,get_device_metadata_request,get_device_metadata_request), 12) \ diff --git a/src/mesh/generated/mesh.pb.h b/src/mesh/generated/mesh.pb.h index 6849fac85..ee72ff504 100644 --- a/src/mesh/generated/mesh.pb.h +++ b/src/mesh/generated/mesh.pb.h @@ -4,6 +4,7 @@ #ifndef PB_MESH_PB_H_INCLUDED #define PB_MESH_PB_H_INCLUDED #include +#include "channel.pb.h" #include "config.pb.h" #include "module_config.pb.h" #include "portnums.pb.h" @@ -652,6 +653,8 @@ typedef struct _FromRadio { bool rebooted; /* Include module config */ ModuleConfig moduleConfig; + /* One packet is sent for each channel */ + Channel channel; }; } FromRadio; @@ -854,6 +857,7 @@ extern "C" { #define FromRadio_config_complete_id_tag 7 #define FromRadio_rebooted_tag 8 #define FromRadio_moduleConfig_tag 9 +#define FromRadio_channel_tag 10 #define ToRadio_packet_tag 1 #define ToRadio_peer_info_tag 2 #define ToRadio_want_config_id_tag 3 @@ -1001,7 +1005,8 @@ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,config,config), 5) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,log_record,log_record), 6) \ X(a, STATIC, ONEOF, UINT32, (payload_variant,config_complete_id,config_complete_id), 7) \ X(a, STATIC, ONEOF, BOOL, (payload_variant,rebooted,rebooted), 8) \ -X(a, STATIC, ONEOF, MESSAGE, (payload_variant,moduleConfig,moduleConfig), 9) +X(a, STATIC, ONEOF, MESSAGE, (payload_variant,moduleConfig,moduleConfig), 9) \ +X(a, STATIC, ONEOF, MESSAGE, (payload_variant,channel,channel), 10) #define FromRadio_CALLBACK NULL #define FromRadio_DEFAULT NULL #define FromRadio_payload_variant_packet_MSGTYPE MeshPacket @@ -1010,6 +1015,7 @@ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,moduleConfig,moduleConfig), #define FromRadio_payload_variant_config_MSGTYPE Config #define FromRadio_payload_variant_log_record_MSGTYPE LogRecord #define FromRadio_payload_variant_moduleConfig_MSGTYPE ModuleConfig +#define FromRadio_payload_variant_channel_MSGTYPE Channel #define ToRadio_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,packet,packet), 1) \