From fc53ad0af3c8dea64f9109d237c1d45889bcb910 Mon Sep 17 00:00:00 2001
From: mhby1g21 <mhby1g21@soton.ac.uk>
Date: Tue, 18 Feb 2025 11:17:06 +0000
Subject: [PATCH] a bit more robust http handler

---
 wifi-test/wifi-test.ino | 109 +++++++++++++++++++++++++---------------
 1 file changed, 69 insertions(+), 40 deletions(-)

diff --git a/wifi-test/wifi-test.ino b/wifi-test/wifi-test.ino
index bba90ed..5186562 100644
--- a/wifi-test/wifi-test.ino
+++ b/wifi-test/wifi-test.ino
@@ -2,7 +2,6 @@
 #include <Servo.h>
 
 // WiFi credentials
-
 // For robotic Arm 2, mac address is 30:C6:F7:03:60:80
 // the password is pUguZXWtBDzl
 const char ssid[] = "SOTON-IoT";    // Your network SSID
@@ -19,7 +18,6 @@ Servo ring;
 Servo pinky;
 
 // Servo pins
-
 const int indexPin = 5;
 const int middlePin = 4;
 const int ringPin = 3;
@@ -29,14 +27,12 @@ void setup() {
   Serial.begin(9600);
   
   // Initialize servos
- 
   index_f.attach(indexPin);
   middle.attach(middlePin);
   ring.attach(ringPin);
   pinky.attach(pinkyPin);
   
   // Set initial positions
-
   index_f.write(90);
   middle.write(90);
   ring.write(90);
@@ -64,56 +60,89 @@ void setup() {
 
 void loop() {
   WiFiClient client = server.available();
+  
   if (client) {
-    String currentLine = "";
-    while (client.connected()) {
+    Serial.println("New client connected");
+    String request = "";
+    boolean currentLineIsBlank = true;
+    unsigned long timeout = millis();
+    
+    while (client.connected() && millis() - timeout < 1000) {
       if (client.available()) {
         char c = client.read();
+        request += c;
+        
+        // If you've gotten to the end of the line (received a newline
+        // character) and the line is blank, the http request has ended,
+        // so you can send a reply
+        if (c == '\n' && currentLineIsBlank) {
+          // Send a standard http response header
+          client.println("HTTP/1.1 200 OK");
+          client.println("Content-Type: text/html");
+          client.println("Connection: close");
+          client.println();
+          
+          // Send a simple confirmation page
+          client.println("<html><body>");
+          client.println("<h1>Command received</h1>");
+          client.println("</body></html>");
+          break;
+        }
         if (c == '\n') {
-          if (currentLine.length() == 0) {
-            client.println("HTTP/1.1 200 OK");
-            client.println("Content-type:text/html");
-            client.println();
-            client.println();
-            break;
-          } else {
-            currentLine = "";
-          }
+          currentLineIsBlank = true;
         } else if (c != '\r') {
-          currentLine += c;
-        }
-        
-        // Process commands
-        // Format: /finger/angle (e.g., /thumb/180)
-        if (currentLine.startsWith("GET /")) {
-          processCommand(currentLine);
+          currentLineIsBlank = false;
         }
       }
     }
+    
+    // Process the request
+    if (request.indexOf("GET /") != -1) {
+      Serial.println("Received request: " + request);
+      processRequest(request);
+    }
+    
+    // Give the web browser time to receive the data
+    delay(10);
     client.stop();
+    Serial.println("Client disconnected");
   }
 }
 
-void processCommand(String command) {
-  Serial.println(command);
-  // Extract finger and angle from command
-  int firstSlash = command.indexOf('/');
-  int secondSlash = command.indexOf('/', firstSlash + 1);
-  int space = command.indexOf(' ', secondSlash);
+void processRequest(String request) {
+  // Extract the command path
+  int start = request.indexOf("GET ") + 4;
+  int end = request.indexOf(" HTTP");
   
-  if (firstSlash != -1 && secondSlash != -1 && space != -1) {
-    String finger = command.substring(firstSlash + 1, secondSlash);
-    int angle = command.substring(secondSlash + 1, space).toInt();
-    
-    // Constrain angle between 0 and 180
-    angle = constrain(angle, 0, 90);
+  if (start != -1 && end != -1) {
+    String command = request.substring(start, end);
+    Serial.println("Command: " + command);
     
-    // Move appropriate servo
-   
-    if (finger == "index") index_f.write(angle);
-    else if (finger == "middle") middle.write(angle);
-    else if (finger == "ring") ring.write(angle);
-    else if (finger == "pinky") pinky.write(angle);
+    // Parse command and move servos
+    if (command.startsWith("/index/")) {
+      int angle = command.substring(7).toInt();
+      angle = constrain(angle, 0, 90);
+      index_f.write(angle);
+      Serial.println("Moving index to " + String(angle));
+    }
+    else if (command.startsWith("/middle/")) {
+      int angle = command.substring(8).toInt();
+      angle = constrain(angle, 0, 90);
+      middle.write(angle);
+      Serial.println("Moving middle to " + String(angle));
+    }
+    else if (command.startsWith("/ring/")) {
+      int angle = command.substring(6).toInt();
+      angle = constrain(angle, 0, 90);
+      ring.write(angle);
+      Serial.println("Moving ring to " + String(angle));
+    }
+    else if (command.startsWith("/pinky/")) {
+      int angle = command.substring(7).toInt();
+      angle = constrain(angle, 0, 90);
+      pinky.write(angle);
+      Serial.println("Moving pinky to " + String(angle));
+    }
   }
 }
 
-- 
GitLab