Просмотр исходного кода

lock param writes when LOCK_LEVEL != 0

Andrew Tridgell 3 лет назад
Родитель
Сommit
30051b2a5e
1 измененных файлов с 46 добавлено и 41 удалено
  1. 46 41
      RemoteIDModule/DroneCAN.cpp

+ 46 - 41
RemoteIDModule/DroneCAN.cpp

@@ -576,51 +576,56 @@ void DroneCAN::handle_param_getset(CanardInstance* ins, CanardRxTransfer* transf
     if (vp->flags & PARAM_FLAG_HIDDEN) {
         vp = nullptr;
     }
-    if (vp != nullptr && req.name.len != 0 && req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_EMPTY) {
-        // param set
-        switch (vp->ptype) {
-        case Parameters::ParamType::UINT8:
-            if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_INTEGER_VALUE) {
-                return;
-            }
-            vp->set_uint8(uint8_t(req.value.integer_value));
-            break;
-        case Parameters::ParamType::UINT32:
-            if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_INTEGER_VALUE) {
-                return;
-            }
-            vp->set_uint32(uint32_t(req.value.integer_value));
-            break;
-        case Parameters::ParamType::FLOAT:
-            if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_REAL_VALUE) {
-                return;
-            }
-            vp->set_float(req.value.real_value);
-            break;
-        case Parameters::ParamType::CHAR20: {
-            if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_STRING_VALUE) {
-                return;
+    if (vp != nullptr && req.name.len != 0 &&
+        req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_EMPTY) {
+        if (g.lock_level != 0) {
+            can_printf("Parameters locked");
+        } else {
+            // param set
+            switch (vp->ptype) {
+            case Parameters::ParamType::UINT8:
+                if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_INTEGER_VALUE) {
+                    return;
+                }
+                vp->set_uint8(uint8_t(req.value.integer_value));
+                break;
+            case Parameters::ParamType::UINT32:
+                if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_INTEGER_VALUE) {
+                    return;
+                }
+                vp->set_uint32(uint32_t(req.value.integer_value));
+                break;
+            case Parameters::ParamType::FLOAT:
+                if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_REAL_VALUE) {
+                    return;
+                }
+                vp->set_float(req.value.real_value);
+                break;
+            case Parameters::ParamType::CHAR20: {
+                if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_STRING_VALUE) {
+                    return;
+                }
+                char v[21] {};
+                strncpy(v, (const char *)&req.value.string_value.data[0], req.value.string_value.len);
+                if (vp->min_len > 0 && strlen(v) < vp->min_len) {
+                    can_printf("%s too short - min %u", vp->name, vp->min_len);
+                } else {
+                    vp->set_char20(v);
+                }
+                break;
             }
-            char v[21] {};
-            strncpy(v, (const char *)&req.value.string_value.data[0], req.value.string_value.len);
-            if (vp->min_len > 0 && strlen(v) < vp->min_len) {
-                can_printf("%s too short - min %u", vp->name, vp->min_len);
-            } else {
-                vp->set_char20(v);
+            case Parameters::ParamType::CHAR64: {
+                if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_STRING_VALUE) {
+                    return;
+                }
+                char v[65] {};
+                strncpy(v, (const char *)&req.value.string_value.data[0], req.value.string_value.len);
+                vp->set_char64(v);
+                break;
             }
-            break;
-        }
-        case Parameters::ParamType::CHAR64: {
-            if (req.value.union_tag != UAVCAN_PROTOCOL_PARAM_VALUE_STRING_VALUE) {
+            default:
                 return;
             }
-            char v[65] {};
-            strncpy(v, (const char *)&req.value.string_value.data[0], req.value.string_value.len);
-            vp->set_char64(v);
-            break;
-        }
-        default:
-            return;
         }
     }
     if (vp != nullptr) {