control: Create parameter trigger

Create a new event trigger that will run actions when a parameter is
either added, removed, or changed.

When the trigger is enabled it is added to the Manager class since that
is where parameters are stored, and then the Manager watches for
parameter changes and runs actions as needed.

The JSON config would look like:
{
    "class": "parameter",
    "parameter": "pcie_floor_index"
}

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I8ff281d49ac780e8ff38f3e8ed02ab95395f1fd3
diff --git a/control/json/triggers/parameter.cpp b/control/json/triggers/parameter.cpp
new file mode 100644
index 0000000..3abe57c
--- /dev/null
+++ b/control/json/triggers/parameter.cpp
@@ -0,0 +1,48 @@
+/**
+ * Copyright © 2021 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "parameter.hpp"
+
+#include "../manager.hpp"
+
+#include <fmt/format.h>
+
+namespace phosphor::fan::control::json::trigger::parameter
+{
+
+using json = nlohmann::json;
+
+enableTrigger
+    triggerParameter(const json& jsonObj, const std::string& eventName,
+                     std::vector<std::unique_ptr<ActionBase>>& actions)
+{
+    if (!jsonObj.contains("parameter"))
+    {
+        auto msg = fmt::format(
+            "Event '{}' parameter trigger is missing 'parameter'", eventName);
+        log<level::ERR>(msg.c_str());
+        throw std::runtime_error(msg);
+    }
+
+    auto name = jsonObj["parameter"].get<std::string>();
+
+    return [name](const std::string& eventName, Manager* mgr,
+                  const std::vector<Group>& groups,
+                  std::vector<std::unique_ptr<ActionBase>>& actions) {
+        Manager::addParameterTrigger(name, actions);
+    };
+}
+
+} // namespace phosphor::fan::control::json::trigger::parameter