|
|
@@ -54,6 +54,8 @@
|
|
|
#define CMD_SEND_CONTROL_DATA 55 // v8+
|
|
|
#define CMD_GET_STATS 56 // v8+, second byte is stats type
|
|
|
#define CMD_SEND_ANON_REQ 57
|
|
|
+#define CMD_SET_AUTOADD_CONFIG 58
|
|
|
+#define CMD_GET_AUTOADD_CONFIG 59
|
|
|
|
|
|
// Stats sub-types for CMD_GET_STATS
|
|
|
#define STATS_TYPE_CORE 0
|
|
|
@@ -85,6 +87,7 @@
|
|
|
#define RESP_CODE_ADVERT_PATH 22
|
|
|
#define RESP_CODE_TUNING_PARAMS 23
|
|
|
#define RESP_CODE_STATS 24 // v8+, second byte is stats type
|
|
|
+#define RESP_CODE_AUTOADD_CONFIG 25
|
|
|
|
|
|
#define SEND_TIMEOUT_BASE_MILLIS 500
|
|
|
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f
|
|
|
@@ -110,6 +113,8 @@
|
|
|
#define PUSH_CODE_BINARY_RESPONSE 0x8C
|
|
|
#define PUSH_CODE_PATH_DISCOVERY_RESPONSE 0x8D
|
|
|
#define PUSH_CODE_CONTROL_DATA 0x8E // v8+
|
|
|
+#define PUSH_CODE_CONTACT_DELETED 0x8F // used to notify client app of deleted contact when overwriting oldest
|
|
|
+#define PUSH_CODE_CONTACTS_FULL 0x90 // used to notify client app that contacts storage is full
|
|
|
|
|
|
#define ERR_CODE_UNSUPPORTED_CMD 1
|
|
|
#define ERR_CODE_NOT_FOUND 2
|
|
|
@@ -120,6 +125,15 @@
|
|
|
|
|
|
#define MAX_SIGN_DATA_LEN (8 * 1024) // 8K
|
|
|
|
|
|
+// Auto-add config bitmask
|
|
|
+// Bit 0: If set, overwrite oldest non-favourite contact when contacts file is full
|
|
|
+// Bits 1-4: these indicate which contact types to auto-add when manual_contact_mode = 0x01
|
|
|
+#define AUTO_ADD_OVERWRITE_OLDEST (1 << 0) // 0x01 - overwrite oldest non-favourite when full
|
|
|
+#define AUTO_ADD_CHAT (1 << 1) // 0x02 - auto-add Chat (Companion) (ADV_TYPE_CHAT)
|
|
|
+#define AUTO_ADD_REPEATER (1 << 2) // 0x04 - auto-add Repeater (ADV_TYPE_REPEATER)
|
|
|
+#define AUTO_ADD_ROOM_SERVER (1 << 3) // 0x08 - auto-add Room Server (ADV_TYPE_ROOM)
|
|
|
+#define AUTO_ADD_SENSOR (1 << 4) // 0x10 - auto-add Sensor (ADV_TYPE_SENSOR)
|
|
|
+
|
|
|
void MyMesh::writeOKFrame() {
|
|
|
uint8_t buf[1];
|
|
|
buf[0] = RESP_CODE_OK;
|
|
|
@@ -262,9 +276,54 @@ bool MyMesh::isAutoAddEnabled() const {
|
|
|
return (_prefs.manual_add_contacts & 1) == 0;
|
|
|
}
|
|
|
|
|
|
+bool MyMesh::shouldAutoAddContactType(uint8_t contact_type) const {
|
|
|
+ if ((_prefs.manual_add_contacts & 1) == 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t type_bit = 0;
|
|
|
+ switch (contact_type) {
|
|
|
+ case ADV_TYPE_CHAT:
|
|
|
+ type_bit = AUTO_ADD_CHAT;
|
|
|
+ break;
|
|
|
+ case ADV_TYPE_REPEATER:
|
|
|
+ type_bit = AUTO_ADD_REPEATER;
|
|
|
+ break;
|
|
|
+ case ADV_TYPE_ROOM:
|
|
|
+ type_bit = AUTO_ADD_ROOM_SERVER;
|
|
|
+ break;
|
|
|
+ case ADV_TYPE_SENSOR:
|
|
|
+ type_bit = AUTO_ADD_SENSOR;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false; // Unknown type, don't auto-add
|
|
|
+ }
|
|
|
+
|
|
|
+ return (_prefs.autoadd_config & type_bit) != 0;
|
|
|
+}
|
|
|
+
|
|
|
+bool MyMesh::shouldOverwriteWhenFull() const {
|
|
|
+ return (_prefs.autoadd_config & AUTO_ADD_OVERWRITE_OLDEST) != 0;
|
|
|
+}
|
|
|
+
|
|
|
+void MyMesh::onContactOverwrite(const uint8_t* pub_key) {
|
|
|
+ if (_serial->isConnected()) {
|
|
|
+ out_frame[0] = PUSH_CODE_CONTACT_DELETED;
|
|
|
+ memcpy(&out_frame[1], pub_key, PUB_KEY_SIZE);
|
|
|
+ _serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void MyMesh::onContactsFull() {
|
|
|
+ if (_serial->isConnected()) {
|
|
|
+ out_frame[0] = PUSH_CODE_CONTACTS_FULL;
|
|
|
+ _serial->writeFrame(out_frame, 1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void MyMesh::onDiscoveredContact(ContactInfo &contact, bool is_new, uint8_t path_len, const uint8_t* path) {
|
|
|
if (_serial->isConnected()) {
|
|
|
- if (!isAutoAddEnabled() && is_new) {
|
|
|
+ if (!shouldAutoAddContactType(contact.type) && is_new) {
|
|
|
writeContactRespFrame(PUSH_CODE_NEW_ADVERT, contact);
|
|
|
} else {
|
|
|
out_frame[0] = PUSH_CODE_ADVERT;
|
|
|
@@ -1663,6 +1722,15 @@ void MyMesh::handleCmdFrame(size_t len) {
|
|
|
} else {
|
|
|
writeErrFrame(ERR_CODE_TABLE_FULL);
|
|
|
}
|
|
|
+ } else if (cmd_frame[0] == CMD_SET_AUTOADD_CONFIG) {
|
|
|
+ _prefs.autoadd_config = cmd_frame[1];
|
|
|
+ savePrefs();
|
|
|
+ writeOKFrame();
|
|
|
+ } else if (cmd_frame[0] == CMD_GET_AUTOADD_CONFIG) {
|
|
|
+ int i = 0;
|
|
|
+ out_frame[i++] = RESP_CODE_AUTOADD_CONFIG;
|
|
|
+ out_frame[i++] = _prefs.autoadd_config;
|
|
|
+ _serial->writeFrame(out_frame, i);
|
|
|
} else {
|
|
|
writeErrFrame(ERR_CODE_UNSUPPORTED_CMD);
|
|
|
MESH_DEBUG_PRINTLN("ERROR: unknown command: %02X", cmd_frame[0]);
|