Browse Source

Fix example server-side scripts to work on new nodemcu-firmware. Specifically, call coroutine.yield() after each connection:send() except the last one, since we can no longer queue sends.

Marcos Kirsch 8 years ago
parent
commit
4d4442318d
4 changed files with 32 additions and 38 deletions
  1. 14 15
      http/args.lua
  2. 13 16
      http/file_list.lua
  3. 2 0
      http/garage_door_opener.lua
  4. 3 7
      http/node_info.lua

+ 14 - 15
http/args.lua

@@ -1,26 +1,25 @@
 return function (connection, args)
-   connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n")
-   connection:send('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Arguments</title></head>')
-   connection:send('<body>')
-   connection:send('<h1>Arguments</h1>')
+   dofile("httpserver-header.lc")(connection, 200, 'html')
 
-   local form = [===[
+   connection:send([===[
+   <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Arguments</title></head><body><h1>Arguments</h1>
    <form method="GET">
       First name:<br><input type="text" name="firstName"><br>
       Last name:<br><input type="text" name="lastName"><br>
       <input type="radio" name="sex" value="male" checked>Male<input type="radio" name="sex" value="female">Female<br>
-      <input type="submit" value="Submit">
+      <input type="submit" name="submit" value="Submit">
    </form>
-   ]===]
+   ]===])
+   coroutine.yield()
 
-   connection:send(form)
-
-   connection:send('<h2>Received the following values:</h2>')
-   connection:send("<ul>\n")
-   for name, value in pairs(args) do
-      connection:send('<li><b>' .. name .. ':</b> ' .. tostring(value) .. "<br></li>\n")
+   if args["submit"] ~= nil then
+      connection:send("<h2>Received the following values:</h2><ul>")
+      coroutine.yield()
+      for name, value in pairs(args) do
+         connection:send('<li><b>' .. name .. ':</b> ' .. tostring(value) .. "<br></li>\n")
+         coroutine.yield()
+      end
    end
 
-   connection:send("</ul>\n")
-   connection:send('</body></html>')
+   connection:send("</ul>\n</body></html>")
 end

+ 13 - 16
http/file_list.lua

@@ -1,30 +1,27 @@
 return function (connection, args)
-   connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n")
-   connection:send('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Server File Listing</title></head>')
-   connection:send('<body>')
+   dofile("httpserver-header.lc")(connection, 200, 'html')
+
+   connection:send([===[
+      <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Server File Listing</title></head>
+      <body>
+   <h1>Server File Listing</h1>
+   ]===])
    coroutine.yield()
-   connection:send('<h1>Server File Listing</h1>')
 
    local remaining, used, total=file.fsinfo()
-   connection:send("<b>Total size: </b> " .. total .. " bytes<br/>\n")
-   connection:send("<b>In Use: </b> " .. used .. " bytes<br/>\n")
-   connection:send("<b>Free: </b> " .. remaining .. " bytes<br/>\n")
-
-   connection:send("<p>\n")
-   connection:send("<b>Files:</b><br/>\n")
-   connection:send("<ul>\n")
+   connection:send("<b>Total size: </b> " .. total .. " bytes<br/>\n" ..
+                   "<b>In Use: </b> " .. used .. " bytes<br/>\n" ..
+                   "<b>Free: </b> " .. remaining .. " bytes<br/>\n" ..
+                   "<p>\n<b>Files:</b><br/>\n<ul>\n")
+   coroutine.yield()
 
    for name, size in pairs(file.list()) do
-
       local isHttpFile = string.match(name, "(http/)") ~= nil
       if isHttpFile then
          local url = string.match(name, ".*/(.*)")
          connection:send('   <li><a href="' .. url .. '">' .. url .. "</a> (" .. size .. " bytes)</li>\n")
-         -- this list could be very long, so we'll yield in order to avoid overflowing the send buffer.
          coroutine.yield()
       end
    end
-   connection:send("</ul>\n")
-   connection:send("</p>\n")
-   connection:send('</body></html>')
+   connection:send("</ul>\n</p>\n</body></html>")
 end

+ 2 - 0
http/garage_door_opener.lua

@@ -17,6 +17,7 @@ local function pushTheButton(connection, pin)
 
    -- Send back JSON response.
    connection:send("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\nCache-Control: private, no-store\r\n\r\n")
+   coroutine.yield()
    connection:send('{"error":0, "message":"OK"}')
 
 end
@@ -27,6 +28,7 @@ return function (connection, args)
    elseif args.door == "2" then pushTheButton(connection, 2)   -- GPIO2
    else
       connection:send("HTTP/1.0 400 OK\r\nContent-Type: application/json\r\nCache-Control: private, no-store\r\n\r\n")
+      coroutine.yield()
       connection:send('{"error":-1, "message":"Bad door"}')
    end
 end

+ 3 - 7
http/node_info.lua

@@ -1,16 +1,12 @@
-local function sendHeader(connection)
-   connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n")
-
-end
-
 local function sendAttr(connection, attr, val)
    connection:send("<li><b>".. attr .. ":</b> " .. val .. "<br></li>\n")
+   coroutine.yield()
 end
 
 return function (connection, args)
-   collectgarbage()
-   sendHeader(connection)
+   dofile("httpserver-header.lc")(connection, 200, 'html')
    connection:send('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>A Lua script sample</title></head><body><h1>Node info</h1><ul>')
+   coroutine.yield()
    majorVer, minorVer, devVer, chipid, flashid, flashsize, flashmode, flashspeed = node.info();
    sendAttr(connection, "NodeMCU version"       , majorVer.."."..minorVer.."."..devVer)
    sendAttr(connection, "chipid"                , chipid)