]> hydra-www.ietfng.org Git - acmetensortoys-esp-lua_lamp/commitdiff
lampulator: tidy and add easy way to get last message
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Wed, 1 Apr 2020 20:35:20 +0000 (21:35 +0100)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Wed, 1 Apr 2020 20:35:20 +0000 (21:35 +0100)
Now, left-clicking on the window will push the last received line
(which includes the MQTT topic) to the system clipboard.

linux-draw-love/draw.lua
linux-draw-love/main.lua
linux-draw-love/net.lua

index 431a91452c780f66d373c3adf63047f7fbcc4501..8cee2dc0609c18980f86e120fc3d827ee8530ae2 100644 (file)
@@ -4,7 +4,7 @@ ltmr = require "love.timer"
 lthr = require "love.thread"
 
 imgd = limg.newImageData(8,4)
-netchan = lthr.getChannel ( "netc" )
+drawchan = lthr.getChannel ( "drawc" )
 framechan = lthr.getChannel ( "framec" )
 
 -- emulate enough framebuffer functionality, backed by a Lua array <<<
@@ -174,7 +174,7 @@ end
 -- >>>
 
 while true do
-  local line = netchan:demand(snooze)
+  local line = drawchan:demand(snooze)
 
   if line then
     local from, cmd = line:match("^(%S+)%s+(.*)$")
index 580ced9cec0bc6772631b719ffa17430e4878cb3..f49c768b90208c96eee086ee7cb0a082f179d385 100644 (file)
@@ -1,54 +1,50 @@
 function love.threaderror(thread, errorstr)
   print("Thread error!", thread, errorstr)
-  love.event.push('quit')
+  love.event.quit(1)
 end
 
 function love.load()
   love.window.setTitle("lampulator")
   love.window.setMode(32, 16, { display = 1, x = 0, y = 0 })
 
-  framechan = love.thread.getChannel ( "framec" );
-  netchan = love.thread.getChannel ( "netc" );
+  drawchan  = love.thread.getChannel ("drawc" ) -- main -> draw
+  framechan = love.thread.getChannel ("framec") -- draw -> main
+  netchan   = love.thread.getChannel ("netc"  ) -- net  -> main
 
-  netthread = love.thread.newThread ( "net.lua" );
+  netthread = love.thread.newThread  ("net.lua")
   netthread:start()
 
-  drawthread = love.thread.newThread ( "draw.lua" );
+  drawthread = love.thread.newThread ("draw.lua")
   drawthread:start()
 end
 
--- Override the event loop
-function love.run()
-  if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
-  if love.timer then love.timer.step() end
-
-  return function()
-    local dt = 0
-
-    if love.event then
-      local name, a,b,c,d,e,f
-      love.event.pump()
-      for name, a,b,c,d,e,f in love.event.poll() do
-        if name == "quit" then
-          if not love.quit or not love.quit() then
-            return a or 0
-          end
-        end
-        love.handlers[name](a,b,c,d,e,f)
-      end
-    end
+love.timer = nil -- don't tick, we do that ourselves in update
+
+local lastnetline
+
+function love.mousepressed(x, y, btn, ist, presses)
+  if btn == 1 and lastnetline then
+    love.system.setClipboardText(lastnetline)
+  end
+end
 
-    -- XXX We have to poll the threads periodically to catch errors
-    local imgd = framechan:demand(1)
-    if imgd then
+function love.update()
+  -- Poor man's fanout
+  local line = netchan:pop()
+  if line then
+    lastnetline = line
+    drawchan:push(line)
+  end
+
+  -- We have to let the event loop run every so often, even if there
+  -- aren't frames coming our way.
+  local imgd = framechan:demand(1)
+  if imgd then
+    love.draw = function()
       local img = love.graphics.newImage(imgd)
       img:setFilter('nearest')
       love.graphics.clear(love.graphics.getBackgroundColor())
       love.graphics.draw(img, 0, 0, 0, 4, 4)
     end
-    love.graphics.present()
-
-    if love.timer then dt = love.timer.step() end
-
   end
 end
index cbe674d213413ddf1883986d76ec5fb6a4667574..9057bb6a28821440f4f22878a9820cdfcf0529d2 100644 (file)
@@ -7,4 +7,4 @@ netchan = lthr.getChannel ( "netc" )
 for line in io.lines() do
   netchan:push(line)
 end
-lev.push("quit")
+lev.quit(0)