examples/daemon/ledflasher: switch to onOff

Bug: 27550969
Change-Id: I3b9c940b52707cf8ee3523bf33f48c6f9e2bfc5b
Reviewed-on: https://weave-review.googlesource.com/2976
Reviewed-by: Peng Ying <pying@google.com>
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/examples/daemon/ledflasher/ledflasher.cc b/examples/daemon/ledflasher/ledflasher.cc
index 2e740b6..88403a2 100644
--- a/examples/daemon/ledflasher/ledflasher.cc
+++ b/examples/daemon/ledflasher/ledflasher.cc
@@ -12,45 +12,32 @@
 #include <bitset>
 
 namespace {
-// Supported LED count on this device
 const size_t kLedCount = 3;
 
 const char kTraits[] = R"({
-  "_ledflasher": {
+  "onOff": {
     "commands": {
-      "set": {
+      "setConfig": {
         "minimalRole": "user",
         "parameters": {
-          "led": {
-            "type": "integer",
-            "minimum": 1,
-            "maximum": 3
-          },
-          "on": { "type": "boolean" }
-        }
-      },
-      "toggle": {
-        "minimalRole": "user",
-        "parameters": {
-          "led": {
-            "type": "integer",
-            "minimum": 1,
-            "maximum": 3
+          "state": {
+            "type": "string",
+            "enum": [ "on", "off" ]
           }
         }
       }
     },
     "state": {
-      "leds": {
-        "type": "array",
-        "items": { "type": "boolean" }
+      "state": {
+        "isRequired": true,
+        "type": "string",
+        "enum": [ "on", "off" ]
       }
     }
   }
 })";
 
-const char kComponent[] = "ledflasher";
-
+const char kLedComponentPrefix[] = "led";
 }  // namespace
 
 // LedFlasherHandler is a complete command handler example that shows
@@ -62,41 +49,38 @@
     device_ = device;
 
     device->AddTraitDefinitionsFromJson(kTraits);
-    CHECK(device->AddComponent(kComponent, {"_ledflasher"}, nullptr));
-    UpdateLedState();
-
-    device->AddCommandHandler(
-        kComponent, "_ledflasher.toggle",
-        base::Bind(&LedFlasherHandler::OnFlasherToggleCommand,
-                   weak_ptr_factory_.GetWeakPtr()));
-    device->AddCommandHandler(
-        kComponent, "_ledflasher.set",
-        base::Bind(&LedFlasherHandler::OnFlasherSetCommand,
-                   weak_ptr_factory_.GetWeakPtr()));
+    for (size_t led_index = 0; led_index < led_states_.size(); led_index++) {
+      std::string component_name =
+          kLedComponentPrefix + std::to_string(led_index + 1);
+      CHECK(device->AddComponent(component_name, {"onOff"}, nullptr));
+      device->AddCommandHandler(
+          component_name, "onOff.setConfig",
+          base::Bind(&LedFlasherHandler::OnOnOffSetConfig,
+                     weak_ptr_factory_.GetWeakPtr(), led_index));
+      device->SetStateProperty(
+          component_name, "onOff.state",
+          base::StringValue{led_states_[led_index] ? "on" : "off"}, nullptr);
+    }
   }
 
  private:
-  void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnOnOffSetConfig(size_t led_index,
+                        const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
     LOG(INFO) << "received command: " << cmd->GetName();
-    int32_t led_index = 0;
     const auto& params = cmd->GetParameters();
-    bool cmd_value = false;
-    if (params.GetInteger("led", &led_index) &&
-        params.GetBoolean("on", &cmd_value)) {
-      // Display this command in terminal
+    std::string state;
+    if (params.GetString("state", &state)) {
       LOG(INFO) << cmd->GetName() << " led: " << led_index
-                << ", on: " << (cmd_value ? "true" : "false");
-
-      led_index--;
-      int new_state = cmd_value ? 1 : 0;
-      int cur_state = led_status_[led_index];
-      led_status_[led_index] = new_state;
-
-      if (cmd_value != cur_state) {
-        UpdateLedState();
+                << " state: " << state;
+      int current_state = led_states_[led_index];
+      int new_state = (state == "on") ? 1 : 0;
+      led_states_[led_index] = new_state;
+      if (new_state != current_state) {
+        device_->SetStateProperty(cmd->GetComponent(), "onOff.State",
+                                  base::StringValue{state}, nullptr);
       }
       cmd->Complete({}, nullptr);
       return;
@@ -107,41 +91,9 @@
     cmd->Abort(error.get(), nullptr);
   }
 
-  void OnFlasherToggleCommand(const std::weak_ptr<weave::Command>& command) {
-    auto cmd = command.lock();
-    if (!cmd)
-      return;
-    LOG(INFO) << "received command: " << cmd->GetName();
-    const auto& params = cmd->GetParameters();
-    int32_t led_index = 0;
-    if (params.GetInteger("led", &led_index)) {
-      LOG(INFO) << cmd->GetName() << " led: " << led_index;
-      led_index--;
-      led_status_[led_index] = ~led_status_[led_index];
-
-      UpdateLedState();
-      cmd->Complete({}, nullptr);
-      return;
-    }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "invalid_parameter_value",
-                        "Invalid parameters");
-    cmd->Abort(error.get(), nullptr);
-  }
-
-  void UpdateLedState() {
-    base::ListValue list;
-    for (uint32_t i = 0; i < led_status_.size(); i++)
-      list.AppendBoolean(led_status_[i] ? true : false);
-
-    device_->SetStateProperty(kComponent, "_ledflasher.leds", list, nullptr);
-  }
-
   weave::Device* device_{nullptr};
 
-  // Simulate LED status on this device so client app could explore
-  // Each bit represents one device, indexing from LSB
-  std::bitset<kLedCount> led_status_{0};
+  std::bitset<kLedCount> led_states_{0};
   base::WeakPtrFactory<LedFlasherHandler> weak_ptr_factory_{this};
 };