diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 3e692b53..a36c754f 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -184,6 +184,10 @@ static uint32_t _atoi(const char* sp) { /* -------------------------------------------------------------------------------------- */ +#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS +#define REQ_TYPE_KEEP_ALIVE 0x02 +#define REQ_TYPE_GET_TELEMETRY_DATA 0x03 + #define MAX_SIGN_DATA_LEN (8*1024) // 8K class MyMesh : public BaseChatMesh { @@ -203,6 +207,7 @@ class MyMesh : public BaseChatMesh { uint32_t sign_data_len; uint8_t cmd_frame[MAX_FRAME_SIZE+1]; uint8_t out_frame[MAX_FRAME_SIZE+1]; + CayenneLPP telemetry; struct Frame { uint8_t len; @@ -644,6 +649,22 @@ protected: #endif } + uint8_t onContactRequest(const ContactInfo& contact, uint32_t sender_timestamp, const uint8_t* data, uint8_t len, uint8_t* reply) override { + if (data[0] == REQ_TYPE_GET_TELEMETRY_DATA) { + telemetry.reset(); + telemetry.addVoltage(TELEM_CHANNEL_SELF, (float)board.getBattMilliVolts() / 1000.0f); + // query other sensors -- target specific + sensors.querySensors(contact.flags, telemetry); + + memcpy(reply, &sender_timestamp, 4); // reflect sender_timestamp back in response packet (kind of like a 'tag') + + uint8_t tlen = telemetry.getSize(); + memcpy(&reply[4], telemetry.getBuffer(), tlen); + return 4 + tlen; + } + return 0; // unknown + } + void onContactResponse(const ContactInfo& contact, const uint8_t* data, uint8_t len) override { uint32_t sender_timestamp; memcpy(&sender_timestamp, data, 4); @@ -734,7 +755,8 @@ protected: public: MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) - : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL) + : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL), + telemetry(MAX_PACKET_PAYLOAD - 4) { _iter_started = false; offline_queue_len = 0; @@ -1592,6 +1614,8 @@ void setup() { #error "need to define filesystem" #endif + sensors.begin(); + #ifdef HAS_UI ui_task.begin(disp, the_mesh.getNodePrefs(), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION, the_mesh.getBLEPin()); #endif @@ -1599,4 +1623,5 @@ void setup() { void loop() { the_mesh.loop(); + sensors.loop(); } diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index c019f246..3926cfec 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -74,7 +74,9 @@ /* ------------------------------ Code -------------------------------- */ -#define CMD_GET_STATUS 0x01 +#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS +#define REQ_TYPE_KEEP_ALIVE 0x02 +#define REQ_TYPE_GET_TELEMETRY_DATA 0x03 #define RESP_SERVER_LOGIN_OK 0 // response to ANON_REQ @@ -126,6 +128,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { #if MAX_NEIGHBOURS NeighbourInfo neighbours[MAX_NEIGHBOURS]; #endif + CayenneLPP telemetry; ClientInfo* putClient(const mesh::Identity& id) { uint32_t min_time = 0xFFFFFFFF; @@ -172,12 +175,13 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { #endif } - int handleRequest(ClientInfo* sender, uint8_t* payload, size_t payload_len) { - uint32_t now = getRTCClock()->getCurrentTimeUnique(); - memcpy(reply_data, &now, 4); // response packets always prefixed with timestamp + int handleRequest(ClientInfo* sender, uint32_t sender_timestamp, uint8_t* payload, size_t payload_len) { + // uint32_t now = getRTCClock()->getCurrentTimeUnique(); + // memcpy(reply_data, &now, 4); // response packets always prefixed with timestamp + memcpy(reply_data, &sender_timestamp, 4); // reflect sender_timestamp back in response packet (kind of like a 'tag') switch (payload[0]) { - case CMD_GET_STATUS: { // guests can also access this now + case REQ_TYPE_GET_STATUS: { // guests can also access this now RepeaterStats stats; stats.batt_milli_volts = board.getBattMilliVolts(); stats.curr_tx_queue_len = _mgr->getOutboundCount(); @@ -200,9 +204,18 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { return 4 + sizeof(stats); // reply_len } + case REQ_TYPE_GET_TELEMETRY_DATA: { + telemetry.reset(); + telemetry.addVoltage(TELEM_CHANNEL_SELF, (float)board.getBattMilliVolts() / 1000.0f); + // query other sensors -- target specific + sensors.querySensors(sender->is_admin ? 0xFF : 0x00, telemetry); + + uint8_t tlen = telemetry.getSize(); + memcpy(&reply_data[4], telemetry.getBuffer(), tlen); + return 4 + tlen; // reply_len + } } - // unknown command - return 0; // reply_len + return 0; // unknown command } mesh::Packet* createSelfAdvert() { @@ -422,7 +435,7 @@ protected: memcpy(×tamp, data, 4); if (timestamp > client->last_timestamp) { // prevent replay attacks - int reply_len = handleRequest(client, &data[4], len - 4); + int reply_len = handleRequest(client, timestamp, &data[4], len - 4); if (reply_len == 0) return; // invalid command client->last_timestamp = timestamp; @@ -527,7 +540,7 @@ protected: public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _cli(board, this, &_prefs, this) + _cli(board, this, &_prefs, this), telemetry(MAX_PACKET_PAYLOAD - 4) { memset(known_clients, 0, sizeof(known_clients)); next_local_advert = next_flood_advert = 0; @@ -754,6 +767,8 @@ void setup() { command[0] = 0; + sensors.begin(); + the_mesh.begin(fs); #ifdef DISPLAY_CLASS @@ -790,4 +805,5 @@ void loop() { } the_mesh.loop(); + sensors.loop(); } diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index a6eafc5d..eabcf98e 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -121,8 +121,9 @@ struct PostInfo { #define CLIENT_KEEP_ALIVE_SECS 128 -#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS -#define REQ_TYPE_KEEP_ALIVE 0x02 +#define REQ_TYPE_GET_STATUS 0x01 // same as _GET_STATS +#define REQ_TYPE_KEEP_ALIVE 0x02 +#define REQ_TYPE_GET_TELEMETRY_DATA 0x03 #define RESP_SERVER_LOGIN_OK 0 // response to ANON_REQ @@ -157,6 +158,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { int next_client_idx; // for round-robin polling int next_post_idx; PostInfo posts[MAX_UNSYNCED_POSTS]; // cyclic queue + CayenneLPP telemetry; ClientInfo* putClient(const mesh::Identity& id) { for (int i = 0; i < num_clients; i++) { @@ -279,6 +281,51 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { #endif } + int handleRequest(ClientInfo* sender, uint32_t sender_timestamp, uint8_t* payload, size_t payload_len) { + // uint32_t now = getRTCClock()->getCurrentTimeUnique(); + // memcpy(reply_data, &now, 4); // response packets always prefixed with timestamp + memcpy(reply_data, &sender_timestamp, 4); // reflect sender_timestamp back in response packet (kind of like a 'tag') + + switch (payload[0]) { + case REQ_TYPE_GET_STATUS: { + ServerStats stats; + stats.batt_milli_volts = board.getBattMilliVolts(); + stats.curr_tx_queue_len = _mgr->getOutboundCount(); + stats.curr_free_queue_len = _mgr->getFreeCount(); + stats.last_rssi = (int16_t) radio_driver.getLastRSSI(); + stats.n_packets_recv = radio_driver.getPacketsRecv(); + stats.n_packets_sent = radio_driver.getPacketsSent(); + stats.total_air_time_secs = getTotalAirTime() / 1000; + stats.total_up_time_secs = _ms->getMillis() / 1000; + stats.n_sent_flood = getNumSentFlood(); + stats.n_sent_direct = getNumSentDirect(); + stats.n_recv_flood = getNumRecvFlood(); + stats.n_recv_direct = getNumRecvDirect(); + stats.n_full_events = getNumFullEvents(); + stats.last_snr = (int16_t)(radio_driver.getLastSNR() * 4); + stats.n_direct_dups = ((SimpleMeshTables *)getTables())->getNumDirectDups(); + stats.n_flood_dups = ((SimpleMeshTables *)getTables())->getNumFloodDups(); + stats.n_posted = _num_posted; + stats.n_post_push = _num_post_pushes; + + memcpy(&reply_data[4], &stats, sizeof(stats)); + return 4 + sizeof(stats); + } + + case REQ_TYPE_GET_TELEMETRY_DATA: { + telemetry.reset(); + telemetry.addVoltage(TELEM_CHANNEL_SELF, (float)board.getBattMilliVolts() / 1000.0f); + // query other sensors -- target specific + sensors.querySensors(sender->permission == RoomPermission::ADMIN ? 0xFF : 0x00, telemetry); + + uint8_t tlen = telemetry.getSize(); + memcpy(&reply_data[4], telemetry.getBuffer(), tlen); + return 4 + tlen; // reply_len + } + } + return 0; // unknown command + } + protected: float getAirtimeBudgetFactor() const override { return _prefs.airtime_factor; @@ -591,44 +638,22 @@ protected: sendDirect(reply, client->out_path, client->out_path_len); } } - } else if (data[4] == REQ_TYPE_GET_STATUS) { - ServerStats stats; - stats.batt_milli_volts = board.getBattMilliVolts(); - stats.curr_tx_queue_len = _mgr->getOutboundCount(); - stats.curr_free_queue_len = _mgr->getFreeCount(); - stats.last_rssi = (int16_t) radio_driver.getLastRSSI(); - stats.n_packets_recv = radio_driver.getPacketsRecv(); - stats.n_packets_sent = radio_driver.getPacketsSent(); - stats.total_air_time_secs = getTotalAirTime() / 1000; - stats.total_up_time_secs = _ms->getMillis() / 1000; - stats.n_sent_flood = getNumSentFlood(); - stats.n_sent_direct = getNumSentDirect(); - stats.n_recv_flood = getNumRecvFlood(); - stats.n_recv_direct = getNumRecvDirect(); - stats.n_full_events = getNumFullEvents(); - stats.last_snr = (int16_t)(radio_driver.getLastSNR() * 4); - stats.n_direct_dups = ((SimpleMeshTables *)getTables())->getNumDirectDups(); - stats.n_flood_dups = ((SimpleMeshTables *)getTables())->getNumFloodDups(); - stats.n_posted = _num_posted; - stats.n_post_push = _num_post_pushes; - - now = getRTCClock()->getCurrentTimeUnique(); - memcpy(reply_data, &now, 4); // response packets always prefixed with timestamp - memcpy(&reply_data[4], &stats, sizeof(stats)); - uint8_t reply_len = 4 + sizeof(stats); - - if (packet->isRouteFlood()) { - // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response - mesh::Packet* path = createPathReturn(client->id, secret, packet->path, packet->path_len, - PAYLOAD_TYPE_RESPONSE, reply_data, reply_len); - if (path) sendFlood(path); - } else { - mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, client->id, secret, reply_data, reply_len); - if (reply) { - if (client->out_path_len >= 0) { // we have an out_path, so send DIRECT - sendDirect(reply, client->out_path, client->out_path_len); - } else { - sendFlood(reply); + } else { + int reply_len = handleRequest(client, sender_timestamp, &data[4], len - 4); + if (reply_len > 0) { // valid command + if (packet->isRouteFlood()) { + // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response + mesh::Packet* path = createPathReturn(client->id, secret, packet->path, packet->path_len, + PAYLOAD_TYPE_RESPONSE, reply_data, reply_len); + if (path) sendFlood(path); + } else { + mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, client->id, secret, reply_data, reply_len); + if (reply) { + if (client->out_path_len >= 0) { // we have an out_path, so send DIRECT + sendDirect(reply, client->out_path, client->out_path_len); + } else { + sendFlood(reply); + } } } } @@ -667,7 +692,7 @@ protected: public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _cli(board, this, &_prefs, this) + _cli(board, this, &_prefs, this), telemetry(MAX_PACKET_PAYLOAD - 4) { next_local_advert = next_flood_advert = 0; _logging = false; @@ -918,6 +943,8 @@ void setup() { command[0] = 0; + sensors.begin(); + the_mesh.begin(fs); #ifdef DISPLAY_CLASS @@ -954,4 +981,5 @@ void loop() { } the_mesh.loop(); + sensors.loop(); } diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 30bb52bd..1d0d847f 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -254,6 +254,10 @@ protected: Serial.printf(" %s\n", text); } + uint8_t onContactRequest(const ContactInfo& contact, uint32_t sender_timestamp, const uint8_t* data, uint8_t len, uint8_t* reply) override { + return 0; // unknown + } + void onContactResponse(const ContactInfo& contact, const uint8_t* data, uint8_t len) override { // not supported } diff --git a/platformio.ini b/platformio.ini index 8c4766a8..42a19256 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ lib_deps = rweather/Crypto @ ^0.4.0 adafruit/RTClib @ ^2.1.3 melopero/Melopero RV3028 @ ^1.1.0 + electroniccats/CayenneLPP @ 1.4.0 build_flags = -w -DNDEBUG -DRADIOLIB_STATIC_ONLY=1 -DRADIOLIB_GODMODE=1 -D LORA_FREQ=869.525 -D LORA_BW=250 diff --git a/src/helpers/BaseChatMesh.cpp b/src/helpers/BaseChatMesh.cpp index 97aefff4..673c0058 100644 --- a/src/helpers/BaseChatMesh.cpp +++ b/src/helpers/BaseChatMesh.cpp @@ -178,6 +178,27 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender } else { MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported message type: %u", (uint32_t) flags); } + } else if (type == PAYLOAD_TYPE_REQ && len > 4) { + uint32_t sender_timestamp; + memcpy(&sender_timestamp, data, 4); + uint8_t reply_len = onContactRequest(from, sender_timestamp, &data[4], len - 4, temp_buf); + if (reply_len > 0) { + if (packet->isRouteFlood()) { + // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response + mesh::Packet* path = createPathReturn(from.id, secret, packet->path, packet->path_len, + PAYLOAD_TYPE_RESPONSE, temp_buf, reply_len); + if (path) sendFlood(path); + } else { + mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, from.id, secret, temp_buf, reply_len); + if (reply) { + if (from.out_path_len >= 0) { // we have an out_path, so send DIRECT + sendDirect(reply, from.out_path, from.out_path_len); + } else { + sendFlood(reply); + } + } + } + } } else if (type == PAYLOAD_TYPE_RESPONSE && len > 0) { onContactResponse(from, data, len); } diff --git a/src/helpers/BaseChatMesh.h b/src/helpers/BaseChatMesh.h index ed6e1c3a..d91a0a86 100644 --- a/src/helpers/BaseChatMesh.h +++ b/src/helpers/BaseChatMesh.h @@ -114,6 +114,7 @@ protected: virtual uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const = 0; virtual void onSendTimeout() = 0; virtual void onChannelMessageRecv(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t timestamp, const char *text) = 0; + virtual uint8_t onContactRequest(const ContactInfo& contact, uint32_t sender_timestamp, const uint8_t* data, uint8_t len, uint8_t* reply) = 0; virtual void onContactResponse(const ContactInfo& contact, const uint8_t* data, uint8_t len) = 0; // storage concepts, for sub-classes to override/implement diff --git a/src/helpers/SensorManager.h b/src/helpers/SensorManager.h new file mode 100644 index 00000000..84d6c7b0 --- /dev/null +++ b/src/helpers/SensorManager.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +#define TELEM_PERM_LOCATION 0x02 + +#define TELEM_CHANNEL_SELF 1 // LPP data channel for 'self' device + +class SensorManager { +public: + virtual bool begin() { return false; } + virtual bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { return false; } + virtual void loop() { } +}; diff --git a/variants/generic-e22/target.cpp b/variants/generic-e22/target.cpp index f3028faa..d9b70c3a 100644 --- a/variants/generic-e22/target.cpp +++ b/variants/generic-e22/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/generic-e22/target.h b/variants/generic-e22/target.h index 77ae8664..e5c116e1 100644 --- a/variants/generic-e22/target.h +++ b/variants/generic-e22/target.h @@ -7,10 +7,12 @@ #include #include #include +#include extern ESP32Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/generic_espnow/target.cpp b/variants/generic_espnow/target.cpp index 743a7aeb..6b5d4e44 100644 --- a/variants/generic_espnow/target.cpp +++ b/variants/generic_espnow/target.cpp @@ -7,6 +7,7 @@ ESP32Board board; ESPNOWRadio radio_driver; ESP32RTCClock rtc_clock; +SensorManager sensors; bool radio_init() { rtc_clock.begin(); diff --git a/variants/generic_espnow/target.h b/variants/generic_espnow/target.h index 16eeaa2e..99b6f577 100644 --- a/variants/generic_espnow/target.h +++ b/variants/generic_espnow/target.h @@ -2,10 +2,12 @@ #include #include +#include extern ESP32Board board; extern ESPNOWRadio radio_driver; extern ESP32RTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/heltec_v2/target.cpp b/variants/heltec_v2/target.cpp index 284fa600..efb86c67 100644 --- a/variants/heltec_v2/target.cpp +++ b/variants/heltec_v2/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/heltec_v2/target.h b/variants/heltec_v2/target.h index bfdb6132..92aec7f2 100644 --- a/variants/heltec_v2/target.h +++ b/variants/heltec_v2/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern HeltecV2Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/heltec_v3/target.cpp b/variants/heltec_v3/target.cpp index 768cd84c..27e0ebf9 100644 --- a/variants/heltec_v3/target.cpp +++ b/variants/heltec_v3/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/heltec_v3/target.h b/variants/heltec_v3/target.h index 04fec40c..b6ab2577 100644 --- a/variants/heltec_v3/target.h +++ b/variants/heltec_v3/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern HeltecV3Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_t3s3/target.cpp b/variants/lilygo_t3s3/target.cpp index 8e8b8e75..4073518f 100644 --- a/variants/lilygo_t3s3/target.cpp +++ b/variants/lilygo_t3s3/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/lilygo_t3s3/target.h b/variants/lilygo_t3s3/target.h index 8eed467f..eef923ab 100644 --- a/variants/lilygo_t3s3/target.h +++ b/variants/lilygo_t3s3/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern ESP32Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 24e4a342..101ab09c 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/lilygo_tbeam/target.h b/variants/lilygo_tbeam/target.h index 1fd68a84..2c1897ef 100644 --- a/variants/lilygo_tbeam/target.h +++ b/variants/lilygo_tbeam/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern TBeamBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tbeam_SX1262/target.cpp b/variants/lilygo_tbeam_SX1262/target.cpp index 65f64734..4dcc3cf1 100644 --- a/variants/lilygo_tbeam_SX1262/target.cpp +++ b/variants/lilygo_tbeam_SX1262/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/lilygo_tbeam_SX1262/target.h b/variants/lilygo_tbeam_SX1262/target.h index 16234e3c..bcc80ef1 100644 --- a/variants/lilygo_tbeam_SX1262/target.h +++ b/variants/lilygo_tbeam_SX1262/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern TBeamBoardSX1262 board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.cpp b/variants/lilygo_tbeam_supreme_SX1262/target.cpp index c7ab2984..bbdd604e 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.cpp +++ b/variants/lilygo_tbeam_supreme_SX1262/target.cpp @@ -23,7 +23,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); - +SensorManager sensors; static void setPMUIntFlag(){ pmuIntFlag = true; diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.h b/variants/lilygo_tbeam_supreme_SX1262/target.h index 2ee3cb01..f14b2142 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.h +++ b/variants/lilygo_tbeam_supreme_SX1262/target.h @@ -5,10 +5,12 @@ #include #include #include +#include extern TBeamS3SupremeBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tlora_v2_1/target.cpp b/variants/lilygo_tlora_v2_1/target.cpp index 740e0561..76d12382 100644 --- a/variants/lilygo_tlora_v2_1/target.cpp +++ b/variants/lilygo_tlora_v2_1/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/lilygo_tlora_v2_1/target.h b/variants/lilygo_tlora_v2_1/target.h index 5c0910cb..9e73bc37 100644 --- a/variants/lilygo_tlora_v2_1/target.h +++ b/variants/lilygo_tlora_v2_1/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern LilyGoTLoraBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/picow/target.cpp b/variants/picow/target.cpp index 81a3665b..22d2d854 100644 --- a/variants/picow/target.cpp +++ b/variants/picow/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/picow/target.h b/variants/picow/target.h index 1881ed2a..a89b5ba8 100644 --- a/variants/picow/target.h +++ b/variants/picow/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern PicoWBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index a3ea1879..212e3b25 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/promicro/target.h b/variants/promicro/target.h index 79d0862f..b2c4f9d2 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -7,10 +7,12 @@ #include #include #include +#include extern PromicroBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/rak4631/target.cpp b/variants/rak4631/target.cpp index 17e76532..aaa3e8f1 100644 --- a/variants/rak4631/target.cpp +++ b/variants/rak4631/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/rak4631/target.h b/variants/rak4631/target.h index cd32c12d..91f1d719 100644 --- a/variants/rak4631/target.h +++ b/variants/rak4631/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern RAK4631Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/station_g2/target.cpp b/variants/station_g2/target.cpp index 988ac4fc..e279b139 100644 --- a/variants/station_g2/target.cpp +++ b/variants/station_g2/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/station_g2/target.h b/variants/station_g2/target.h index 96fd5095..e44c2ebe 100644 --- a/variants/station_g2/target.h +++ b/variants/station_g2/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern StationG2Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index cf51cc91..45c48fb9 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -8,6 +8,7 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock rtc_clock; +T1000SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 @@ -84,3 +85,19 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +bool T1000SensorManager::begin() { + // TODO: init GPS + return true; +} + +bool T1000SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { + if (requester_permissions & TELEM_PERM_LOCATION) { // does requester have permission? + telemetry.addGPS(TELEM_CHANNEL_SELF, _lat, _lon, _alt); + } + return true; +} + +void T1000SensorManager::loop() { + // TODO: poll GPS serial, set _lat, _lon, _alt +} diff --git a/variants/t1000-e/target.h b/variants/t1000-e/target.h index 83bd3eae..a47d05b2 100644 --- a/variants/t1000-e/target.h +++ b/variants/t1000-e/target.h @@ -6,10 +6,21 @@ #include #include #include +#include + +class T1000SensorManager : public SensorManager { + float _lat, _lon, _alt; +public: + T1000SensorManager(): _lat(0), _lon(0), _alt(0) { } + bool begin() override; + bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; + void loop() override; +}; extern T1000eBoard board; extern WRAPPER_CLASS radio_driver; extern VolatileRTCClock rtc_clock; +extern T1000SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/t114/target.cpp b/variants/t114/target.cpp index 07a60688..31215e82 100644 --- a/variants/t114/target.cpp +++ b/variants/t114/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/t114/target.h b/variants/t114/target.h index 8d80c0ec..b1c05b83 100644 --- a/variants/t114/target.h +++ b/variants/t114/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern T114Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/techo/target.cpp b/variants/techo/target.cpp index ecffc37a..0aabfd47 100644 --- a/variants/techo/target.cpp +++ b/variants/techo/target.cpp @@ -10,6 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/techo/target.h b/variants/techo/target.h index 4a66f24e..0ec9ab04 100644 --- a/variants/techo/target.h +++ b/variants/techo/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern TechoBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/xiao_c3/target.cpp b/variants/xiao_c3/target.cpp index bab602cc..0ed1609d 100644 --- a/variants/xiao_c3/target.cpp +++ b/variants/xiao_c3/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/xiao_c3/target.h b/variants/xiao_c3/target.h index c0a1eb32..0aea87dd 100644 --- a/variants/xiao_c3/target.h +++ b/variants/xiao_c3/target.h @@ -7,10 +7,12 @@ #include #include #include +#include extern XiaoC3Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/xiao_nrf52/target.cpp b/variants/xiao_nrf52/target.cpp index 0707aa39..1d23e76a 100644 --- a/variants/xiao_nrf52/target.cpp +++ b/variants/xiao_nrf52/target.cpp @@ -9,6 +9,7 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock rtc_clock; +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/xiao_nrf52/target.h b/variants/xiao_nrf52/target.h index 85f1ce1c..868664b5 100644 --- a/variants/xiao_nrf52/target.h +++ b/variants/xiao_nrf52/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern XiaoNrf52Board board; extern WRAPPER_CLASS radio_driver; extern VolatileRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/xiao_s3_wio/target.cpp b/variants/xiao_s3_wio/target.cpp index ddb700b7..517b9ef6 100644 --- a/variants/xiao_s3_wio/target.cpp +++ b/variants/xiao_s3_wio/target.cpp @@ -14,6 +14,7 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 diff --git a/variants/xiao_s3_wio/target.h b/variants/xiao_s3_wio/target.h index 8eed467f..eef923ab 100644 --- a/variants/xiao_s3_wio/target.h +++ b/variants/xiao_s3_wio/target.h @@ -6,10 +6,12 @@ #include #include #include +#include extern ESP32Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; +extern SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed();