diff --git a/proto b/proto index 75ae9929..6bb139c0 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 75ae9929a22a0cfa65059f30b27485f2ae8f3a63 +Subproject commit 6bb139c0a43825d868a5e78c07c443f8e9e80b55 diff --git a/src/mesh/generated/admin.pb.h b/src/mesh/generated/admin.pb.h index b3d29825..36696f71 100644 --- a/src/mesh/generated/admin.pb.h +++ b/src/mesh/generated/admin.pb.h @@ -17,8 +17,10 @@ typedef struct _AdminMessage { RadioConfig set_radio; User set_owner; Channel set_channel; - bool get_radio; - uint32_t get_channel; + bool get_radio_request; + RadioConfig get_radio_response; + uint32_t get_channel_request; + Channel get_channel_response; }; } AdminMessage; @@ -35,21 +37,27 @@ extern "C" { #define AdminMessage_set_radio_tag 1 #define AdminMessage_set_owner_tag 2 #define AdminMessage_set_channel_tag 3 -#define AdminMessage_get_radio_tag 4 -#define AdminMessage_get_channel_tag 5 +#define AdminMessage_get_radio_request_tag 4 +#define AdminMessage_get_radio_response_tag 5 +#define AdminMessage_get_channel_request_tag 6 +#define AdminMessage_get_channel_response_tag 7 /* Struct field encoding specification for nanopb */ #define AdminMessage_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MESSAGE, (variant,set_radio,set_radio), 1) \ X(a, STATIC, ONEOF, MESSAGE, (variant,set_owner,set_owner), 2) \ X(a, STATIC, ONEOF, MESSAGE, (variant,set_channel,set_channel), 3) \ -X(a, STATIC, ONEOF, BOOL, (variant,get_radio,get_radio), 4) \ -X(a, STATIC, ONEOF, UINT32, (variant,get_channel,get_channel), 5) +X(a, STATIC, ONEOF, BOOL, (variant,get_radio_request,get_radio_request), 4) \ +X(a, STATIC, ONEOF, MESSAGE, (variant,get_radio_response,get_radio_response), 5) \ +X(a, STATIC, ONEOF, UINT32, (variant,get_channel_request,get_channel_request), 6) \ +X(a, STATIC, ONEOF, MESSAGE, (variant,get_channel_response,get_channel_response), 7) #define AdminMessage_CALLBACK NULL #define AdminMessage_DEFAULT NULL #define AdminMessage_variant_set_radio_MSGTYPE RadioConfig #define AdminMessage_variant_set_owner_MSGTYPE User #define AdminMessage_variant_set_channel_MSGTYPE Channel +#define AdminMessage_variant_get_radio_response_MSGTYPE RadioConfig +#define AdminMessage_variant_get_channel_response_MSGTYPE Channel extern const pb_msgdesc_t AdminMessage_msg; diff --git a/src/plugins/AdminPlugin.cpp b/src/plugins/AdminPlugin.cpp index 248a4ebd..f187fb1c 100644 --- a/src/plugins/AdminPlugin.cpp +++ b/src/plugins/AdminPlugin.cpp @@ -1,37 +1,67 @@ #include "AdminPlugin.h" +#include "Channels.h" #include "MeshService.h" #include "NodeDB.h" #include "Router.h" #include "configuration.h" #include "main.h" -#include "Channels.h" AdminPlugin *adminPlugin; +void AdminPlugin::handleGetChannel(const MeshPacket &req, uint32_t channelIndex) { + if (req.decoded.want_response) { + // We create the reply here + AdminMessage r = AdminMessage_init_default; + r.get_channel_response = channels.getByIndex(channelIndex); + reply = allocDataProtobuf(r); + } +} + +void AdminPlugin::handleGetRadio(const MeshPacket &req) +{ + if (req.decoded.want_response) { + // We create the reply here + AdminMessage r = AdminMessage_init_default; + r.get_radio_response = devicestate.radio; + reply = allocDataProtobuf(r); + } +} + bool AdminPlugin::handleReceivedProtobuf(const MeshPacket &mp, const AdminMessage *r) { assert(r); - switch(r->which_variant) { - case AdminMessage_set_owner_tag: - DEBUG_MSG("Client is setting owner\n"); - handleSetOwner(r->set_owner); - break; + switch (r->which_variant) { + case AdminMessage_set_owner_tag: + DEBUG_MSG("Client is setting owner\n"); + handleSetOwner(r->set_owner); + break; - case AdminMessage_set_radio_tag: - DEBUG_MSG("Client is setting radio\n"); - handleSetRadio(r->set_radio); - break; + case AdminMessage_set_radio_tag: + DEBUG_MSG("Client is setting radio\n"); + handleSetRadio(r->set_radio); + break; - case AdminMessage_set_channel_tag: - DEBUG_MSG("Client is setting channel\n"); - handleSetChannel(r->set_channel); - break; + case AdminMessage_set_channel_tag: + DEBUG_MSG("Client is setting channel\n"); + handleSetChannel(r->set_channel); + break; + + case AdminMessage_get_channel_request_tag: + DEBUG_MSG("Client is getting channel %d\n", r->get_channel_request); + handleGetChannel(mp, r->get_channel_request); + break; + + case AdminMessage_get_radio_request_tag: + DEBUG_MSG("Client is getting radio\n"); + handleGetRadio(mp); + break; + + default: + break; } return false; // Let others look at this message also if they want } - - void AdminPlugin::handleSetOwner(const User &o) { int changed = 0; @@ -58,11 +88,10 @@ void AdminPlugin::handleSetChannel(const Channel &cc) channels.setChannel(cc); bool didReset = service.reloadConfig(); - /* FIXME - do we need this still? + /* FIXME - do we need this still? if (didReset) { state = STATE_SEND_MY_INFO; // Squirt a completely new set of configs to the client } */ - } void AdminPlugin::handleSetRadio(const RadioConfig &r) @@ -75,19 +104,14 @@ void AdminPlugin::handleSetRadio(const RadioConfig &r) } */ } - MeshPacket *AdminPlugin::allocReply() { - assert(0); // 1.2 refactoring fixme, Not sure if anything needs this yet? - // return allocDataProtobuf(u); - return NULL; + auto r = reply; + reply = NULL; // Only use each reply once + return r; } -AdminPlugin::AdminPlugin() - : ProtobufPlugin("Admin", PortNum_ADMIN_APP, AdminMessage_fields) -{ +AdminPlugin::AdminPlugin() : ProtobufPlugin("Admin", PortNum_ADMIN_APP, AdminMessage_fields) +{ // FIXME, restrict to the admin channel for rx } - - - diff --git a/src/plugins/AdminPlugin.h b/src/plugins/AdminPlugin.h index de8ffac1..71dd5536 100644 --- a/src/plugins/AdminPlugin.h +++ b/src/plugins/AdminPlugin.h @@ -6,6 +6,8 @@ */ class AdminPlugin : public ProtobufPlugin { + MeshPacket *reply = NULL; + public: /** Constructor * name is for debugging output @@ -27,6 +29,9 @@ class AdminPlugin : public ProtobufPlugin void handleSetOwner(const User &o); void handleSetChannel(const Channel &cc); void handleSetRadio(const RadioConfig &r); + + void handleGetChannel(const MeshPacket &req, uint32_t channelIndex); + void handleGetRadio(const MeshPacket &req); }; extern AdminPlugin *adminPlugin; \ No newline at end of file