Pārlūkot izejas kodu

* repeater: various "region" CLI changes
* transport codes 0000 and FFFF reserved

Scott Powell 9 mēneši atpakaļ
vecāks
revīzija
963290ea15

+ 11 - 6
examples/simple_repeater/MyMesh.cpp

@@ -892,7 +892,7 @@ void MyMesh::clearStats() {
 
 void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply) {
   if (region_load_active) {
-    if (*command == 0) {  // empty line, signal to terminate 'load' operation
+    if (StrHelper::isBlank(command)) {  // empty/blank line, signal to terminate 'load' operation
       region_map = temp_map;  // copy over the temp instance as new current map
       region_load_active = false;
 
@@ -908,7 +908,7 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
 
       while (*ep && *ep != 'F') ep++;  // look for (optional) flags
 
-      if (indent > 0 && indent < 8) {
+      if (indent > 0 && indent < 8 && strlen(np) > 0) {
         auto parent = load_stack[indent - 1];
         if (parent) {
           auto old = region_map.findByName(np);
@@ -985,7 +985,7 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
       bool success = region_map.save(_fs);
       strcpy(reply, success ? "OK" : "Err - save failed");
     } else if (n >= 3 && strcmp(parts[1], "allowf") == 0) {
-      auto region = strcmp(parts[2], "*") == 0 ? &region_map.getWildcard() : region_map.findByNamePrefix(parts[2]);
+      auto region = region_map.findByNamePrefix(parts[2]);
       if (region) {
         region->flags &= ~REGION_DENY_FLOOD;
         strcpy(reply, "OK");
@@ -993,7 +993,7 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
         strcpy(reply, "Err - unknown region");
       }
     } else if (n >= 3 && strcmp(parts[1], "denyf") == 0) {
-      auto region = strcmp(parts[2], "*") == 0 ? &region_map.getWildcard() : region_map.findByNamePrefix(parts[2]);
+      auto region = region_map.findByNamePrefix(parts[2]);
       if (region) {
         region->flags |= REGION_DENY_FLOOD;
         strcpy(reply, "OK");
@@ -1003,12 +1003,17 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
     } else if (n >= 3 && strcmp(parts[1], "get") == 0) {
       auto region = region_map.findByNamePrefix(parts[2]);
       if (region) {
-        sprintf(reply, " %s %s", region->name, (region->flags & REGION_DENY_FLOOD) ? "" : "F");
+        auto parent = region_map.findById(region->parent);
+        if (parent && parent->id != 0) {
+          sprintf(reply, " %s (%s) %s", region->name, parent->name, (region->flags & REGION_DENY_FLOOD) ? "" : "F");
+        } else {
+          sprintf(reply, " %s %s", region->name, (region->flags & REGION_DENY_FLOOD) ? "" : "F");
+        }
       } else {
         strcpy(reply, "Err - unknown region");
       }
     } else if (n >= 3 && strcmp(parts[1], "home") == 0) {
-      auto home = strcmp(parts[2], "*") == 0 ? &region_map.getWildcard() : region_map.findByNamePrefix(parts[2]);
+      auto home = region_map.findByNamePrefix(parts[2]);
       if (home) {
         region_map.setHomeRegion(home);
         sprintf(reply, " home is now %s", home->name);

+ 4 - 0
src/helpers/RegionMap.cpp

@@ -144,6 +144,8 @@ RegionEntry* RegionMap::findMatch(mesh::Packet* packet, uint8_t mask) {
 }
 
 RegionEntry* RegionMap::findByName(const char* name) {
+  if (strcmp(name, "*") == 0) return &wildcard;
+
   for (int i = 0; i < num_regions; i++) {
     auto region = &regions[i];
     if (strcmp(name, region->name) == 0) return region;
@@ -152,6 +154,8 @@ RegionEntry* RegionMap::findByName(const char* name) {
 }
 
 RegionEntry* RegionMap::findByNamePrefix(const char* prefix) {
+  if (strcmp(prefix, "*") == 0) return &wildcard;
+
   RegionEntry* partial = NULL;
   for (int i = 0; i < num_regions; i++) {
     auto region = &regions[i];

+ 5 - 0
src/helpers/TransportKeyStore.cpp

@@ -9,6 +9,11 @@ uint16_t TransportKey::calcTransportCode(const mesh::Packet* packet) const {
   sha.update(&type, 1);
   sha.update(packet->payload, packet->payload_len);
   sha.finalizeHMAC(key, sizeof(key), &code, 2);
+  if (code == 0) {     // reserve codes 0000 and FFFF
+    code++;
+  } else if (code == 0xFFFF) {
+    code--;
+  }
   return code;
 }
 

+ 7 - 0
src/helpers/TxtDataHelpers.cpp

@@ -19,6 +19,13 @@ void StrHelper::strzcpy(char* dest, const char* src, size_t buf_sz) {
   }
 }
 
+bool StrHelper::isBlank(const char* str) {
+  while (*str) {
+    if (*str++ != ' ') return false;
+  }
+  return true;
+}
+
 #include <Arduino.h>
 
 union int32_Float_t 

+ 1 - 0
src/helpers/TxtDataHelpers.h

@@ -12,4 +12,5 @@ public:
   static void strncpy(char* dest, const char* src, size_t buf_sz);
   static void strzcpy(char* dest, const char* src, size_t buf_sz);   // pads with trailing nulls
   static const char* ftoa(float f);
+  static bool isBlank(const char* str);
 };