瀏覽代碼

fix bug; save settings

Chris Mullins 8 年之前
父節點
當前提交
6d08d84d01
共有 5 個文件被更改,包括 126 次插入14 次删除
  1. 10 5
      lib/Settings/Settings.cpp
  2. 2 0
      lib/Settings/Settings.h
  3. 4 1
      lib/WebServer/PatternHandler.cpp
  4. 42 3
      src/main.cpp
  5. 68 5
      web/index.html

+ 10 - 5
lib/Settings/Settings.cpp

@@ -5,11 +5,16 @@
 void Settings::deserialize(Settings& settings, String json) {
 void Settings::deserialize(Settings& settings, String json) {
   DynamicJsonBuffer jsonBuffer;
   DynamicJsonBuffer jsonBuffer;
   JsonObject& parsedSettings = jsonBuffer.parseObject(json);
   JsonObject& parsedSettings = jsonBuffer.parseObject(json);
-    
-  settings.adminUsername = parsedSettings.get<String>("admin_username");
-  settings.adminPassword = parsedSettings.get<String>("admin_password");
-  settings.cePin = parsedSettings["ce_pin"];
-  settings.csnPin = parsedSettings["csn_pin"];
+  deserialize(settings, parsedSettings);
+}
+
+void Settings::deserialize(Settings& settings, JsonObject& parsedSettings) {
+  if (parsedSettings.success()) {
+    settings.adminUsername = parsedSettings.get<String>("admin_username");
+    settings.adminPassword = parsedSettings.get<String>("admin_password");
+    settings.cePin = parsedSettings["ce_pin"];
+    settings.csnPin = parsedSettings["csn_pin"];
+  }
 }
 }
 
 
 void Settings::load(Settings& settings) {
 void Settings::load(Settings& settings) {

+ 2 - 0
lib/Settings/Settings.h

@@ -1,5 +1,6 @@
 #include <Arduino.h>
 #include <Arduino.h>
 #include <StringStream.h>
 #include <StringStream.h>
+#include <ArduinoJson.h>
 
 
 #ifndef _SETTINGS_H_INCLUDED
 #ifndef _SETTINGS_H_INCLUDED
 #define _SETTINGS_H_INCLUDED
 #define _SETTINGS_H_INCLUDED
@@ -20,6 +21,7 @@ public:
   { }
   { }
 
 
   static void deserialize(Settings& settings, String json);
   static void deserialize(Settings& settings, String json);
+  static void deserialize(Settings& settings, JsonObject& json);
   static void load(Settings& settings);
   static void load(Settings& settings);
   
   
   void save();
   void save();

+ 4 - 1
lib/WebServer/PatternHandler.cpp

@@ -4,7 +4,7 @@ PatternHandler::PatternHandler(
     const String& pattern, 
     const String& pattern, 
     const HTTPMethod method, 
     const HTTPMethod method, 
     const PatternHandler::TPatternHandlerFn fn
     const PatternHandler::TPatternHandlerFn fn
-  ) : method(method), fn(fn) {
+  ) : method(method), fn(fn), tokenPositions(NULL) {
   Vector<StringToken>* tokenPositions = new Vector<StringToken>();
   Vector<StringToken>* tokenPositions = new Vector<StringToken>();
   tokenize(pattern, tokenPositions);
   tokenize(pattern, tokenPositions);
   
   
@@ -32,6 +32,9 @@ bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
   tokenPositions = new Vector<StringToken>();
   tokenPositions = new Vector<StringToken>();
   tokenize(requestUri, tokenPositions);
   tokenize(requestUri, tokenPositions);
   
   
+  Serial.print(tokenPositions->size());
+  Serial.println(" tokens in URL");
+  
   if (numPatternTokens == tokenPositions->size()) {
   if (numPatternTokens == tokenPositions->size()) {
     for (int i = 0; i < numPatternTokens; i++) {
     for (int i = 0; i < numPatternTokens; i++) {
       const StringToken urlTokenP = (*tokenPositions)[i];
       const StringToken urlTokenP = (*tokenPositions)[i];

+ 42 - 3
src/main.cpp

@@ -33,15 +33,29 @@ void handleUpdateGateway(const UrlTokenBindings* urlBindings) {
 }
 }
 
 
 void handleUpdateGroup(const UrlTokenBindings* urlBindings) {
 void handleUpdateGroup(const UrlTokenBindings* urlBindings) {
+  Serial.println("Yeehaw?");
+  
   DynamicJsonBuffer buffer;
   DynamicJsonBuffer buffer;
   JsonObject& request = buffer.parse(server.arg("plain"));
   JsonObject& request = buffer.parse(server.arg("plain"));
   
   
+  if (!request.success()) {
+    server.send(400, "text/plain", "Invalid JSON");
+    return;
+  }
+  
+  Serial.println("deserialized");
+  
   const uint16_t deviceId = parseInt<uint16_t>(urlBindings->get("device_id"));
   const uint16_t deviceId = parseInt<uint16_t>(urlBindings->get("device_id"));
   const uint8_t groupId = urlBindings->get("group_id").toInt();
   const uint8_t groupId = urlBindings->get("group_id").toInt();
   
   
+  Serial.println(deviceId);
+  Serial.println(groupId);
+  
   if (request.containsKey("status")) {
   if (request.containsKey("status")) {
     const String& statusStr = request.get<String>("status");
     const String& statusStr = request.get<String>("status");
     MiLightStatus status = (statusStr == "on" || statusStr == "true") ? ON : OFF;
     MiLightStatus status = (statusStr == "on" || statusStr == "true") ? ON : OFF;
+    Serial.println(status);
+    Serial.println((int)milightClient);
     milightClient->updateStatus(deviceId, groupId, status);
     milightClient->updateStatus(deviceId, groupId, status);
   }
   }
   
   
@@ -152,16 +166,41 @@ void onWebUpdated() {
   server.send(200, "text/plain", "success");
   server.send(200, "text/plain", "success");
 }
 }
 
 
+void initMilightClient() {
+  if (milightClient) {
+    delete milightClient;
+  }
+  
+  milightClient = new MiLightClient(settings.cePin, settings.csnPin);
+  milightClient->begin();
+}
+
+void handleUpdateSettings() {
+  DynamicJsonBuffer buffer;
+  const String& rawSettings = server.arg("plain");
+  JsonObject& parsedSettings = buffer.parse(rawSettings);
+  
+  if (parsedSettings.success()) {
+    Settings::deserialize(settings, parsedSettings);
+    settings.save();
+    initMilightClient();
+    
+    server.send(200, "application/json", "true");
+  } else {
+    server.send(400, "application/json", "\"Invalid JSON\"");
+  }
+}
+
 void setup() {
 void setup() {
   Serial.begin(9600);
   Serial.begin(9600);
   wifiManager.autoConnect();
   wifiManager.autoConnect();
   SPIFFS.begin();
   SPIFFS.begin();
   Settings::load(settings);
   Settings::load(settings);
-  
-  milightClient = new MiLightClient(settings.cePin, settings.csnPin);
-  milightClient->begin();
+  initMilightClient();
   
   
   server.on("/", HTTP_GET, handleServeFile(WEB_INDEX_FILENAME, "text/html"));
   server.on("/", HTTP_GET, handleServeFile(WEB_INDEX_FILENAME, "text/html"));
+  server.on("/settings", HTTP_GET, handleServeFile(SETTINGS_FILE, "application/json"));
+  server.on("/settings", HTTP_POST, handleUpdateSettings);
   server.on("/gateway_traffic", HTTP_GET, handleListenGateway);
   server.on("/gateway_traffic", HTTP_GET, handleListenGateway);
   server.onPattern("/gateways/:device_id/:group_id", HTTP_PUT, handleUpdateGroup);
   server.onPattern("/gateways/:device_id/:group_id", HTTP_PUT, handleUpdateGroup);
   server.onPattern("/gateways/:device_id", HTTP_PUT, handleUpdateGateway);
   server.onPattern("/gateways/:device_id", HTTP_PUT, handleUpdateGateway);

+ 68 - 5
web/index.html

@@ -22,6 +22,8 @@
     .radio-option { padding: 0 5px; cursor: pointer; }
     .radio-option { padding: 0 5px; cursor: pointer; }
     .command-buttons { list-style: none; margin: 0; padding: 0; }
     .command-buttons { list-style: none; margin: 0; padding: 0; }
     .command-buttons li { display: inline-block; margin-right: 1em; }
     .command-buttons li { display: inline-block; margin-right: 1em; }
+    .form-entry { margin: 0 0 20px 0; }
+    .form-entry .form-control { width: 20em; }
     .btn-secondary { 
     .btn-secondary { 
       background-color: #fff; 
       background-color: #fff; 
       border: 1px solid #ccc;
       border: 1px solid #ccc;
@@ -64,11 +66,18 @@
   <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.0/bootstrap-slider.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.0/bootstrap-slider.min.js"></script>
   
   
   <script lang="text/javascript">
   <script lang="text/javascript">
+    var FORM_SETTINGS = ["admin_username", "admin_password", "ce_pin", "csn_pin"];
+  
     var activeUrl = function() {
     var activeUrl = function() {
-      return "/gateways/" +
-        $('input[name="deviceId"]').val() +
-        "/" +
-        $('#groupId input:checked').data('value');
+      var deviceId = $('input[name="deviceId"]').val()
+        , groupId = $('#groupId input:checked').data('value');
+        
+      if (deviceId == "") {
+        alert("Please enter a device ID.");
+        throw "abc";
+      }
+        
+      return "/gateways/" + deviceId + "/" + groupId;
     }
     }
     
     
     var updateGroup = _.throttle(
     var updateGroup = _.throttle(
@@ -94,6 +103,13 @@
       });
       });
     };
     };
     
     
+    var loadSettings = function() {
+      $.getJSON('/settings', function(val) {
+        Object.keys(val).forEach(function(k) {
+          $('#settings input[name="' + k + '"]').val(val[k]);
+        });
+      });
+    };
     
     
     $(function() {
     $(function() {
       $('.radio-option').click(function() {
       $('.radio-option').click(function() {
@@ -157,6 +173,38 @@
           $(this).html('Stop Sniffing');
           $(this).html('Stop Sniffing');
         }
         }
       });
       });
+      
+      var settings = "";
+      
+      FORM_SETTINGS.forEach(function(k) {
+        var elmt = '<div class="form-entry">';
+        elmt += '<label for="' + k + '">' + k + '</label>';
+        elmt += '<input type="text" class="form-control" name="' + k + '"/>';
+        elmt += '</div>';
+        settings += elmt;
+      });
+        
+      $('#settings').prepend(settings);
+      $('#settings').submit(function(e) {
+        var obj = {};
+        FORM_SETTINGS.forEach(function(k) {
+          obj[k] = $('#settings input[name="' + k + '"]').val();
+        });
+        
+        $.ajax(
+          "/settings",
+          {
+            method: 'post',
+            contentType: 'application/json',
+            data: JSON.stringify(obj)
+          }
+        );
+        
+        e.preventDefault();
+        return false;
+      });
+      
+      loadSettings();
     });
     });
   </script>
   </script>
   
   
@@ -174,7 +222,7 @@
     <div class="row">
     <div class="row">
       <div class="col-sm-4">
       <div class="col-sm-4">
         <label for="deviceId">Device Id</label>
         <label for="deviceId">Device Id</label>
-        <input type="text" class="input" name="deviceId" />
+        <input type="text" class="form-control" name="deviceId" />
       </div>
       </div>
       
       
       <div class="col-sm-8">
       <div class="col-sm-8">
@@ -259,6 +307,21 @@
       </div>
       </div>
     </div>
     </div>
     
     
+    <div class="row header-row">
+      <div class="col-sm-12">
+        <h1>Settings</h1>
+      </div>
+    </div>
+    
+    <div>&nbsp;</div>
+    
+    <div class="row">
+      <div class="col-sm-12">
+        <form action="#" id="settings">
+          <input type="submit" class="btn btn-success" value="Submit" />
+        </form>
+      </div>
+    </div>
     
     
     <div class="row header-row">
     <div class="row header-row">
       <div class="col-sm-12">
       <div class="col-sm-12">