Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

Archived

This topic is now archived and is closed to further replies.

  • 0
The Simon

event.pull Issue

Question

Hi!

I am working on a long distance robot control program. I have a Geolyzer and Linked Card installed inside of it for getting an image of the robot's surroundings and then sends the data to my control station where the mod OpenGlasses draws blocks for an illustration. I got it working when I simply registered a event.listen() at the start of the program, but it is kind of an inconvenience if I want other kinds of signals from the robot. So my idea was to only have one registered when it's waiting for the scan data and when it's done it should unregister it. But this new approach doesn't seem to work for some reason. I made it print out its return value when I registered/unregistered it, and it returned 1 and false.

I have no idea how to proceed to the next step. Help is appreciated!

station.lua

local c = require("component")
local lights = require("lights")
local gButtons = require("gButtonAPI4")
local gKeyboard = require("gKeyboard")
local event = require("event")
local ser = require("serialization")
local thread = require("thread")
local d = require("computer")

local GPU = c.proxy("332a93bc-f0a6-4c71-9460-d7a7d6ee0d2c")
local APU = c.proxy("4ba6d276-efab-474c-ba48-bcbd7fd62353")
--local glasses = c.glasses

local terrain = {}
local localPos = {0,0,0}
local facing = "W" -- S W N E (+Z -X -Z +X)



local digitDisplays = {
  {
    "a87d9238-f46e-4b17-b605-6d8771fba4c4",
    "28dfb050-4f70-4bf8-b221-cc84ab43c660",
    "fef15435-a434-4e33-a3ca-3f725e02dd7f",
    "c0941fad-d5fb-4dce-b356-724431e6b66c"
  },
  {
    "d5a80dc6-963c-4fb5-98ea-711ebb2ff1eb",
    "c868c412-22f5-4605-8e4a-b4bce3e1320c",
    "19b54b1e-8970-4305-9294-d3582d85d06d",
    "c06effa6-bada-4ddc-8578-c46d155b4250"
  },
  {
    "6191d4e0-715f-4c8c-a98e-8960c79c26ab",
    "54ab4452-b63f-4b43-a1e1-13208eac1628",
    "84948db9-81dd-4646-932f-a047ecdef4d7",
    "f226bacf-7af6-47ad-be01-6bb31fcfda9b"
  }
}

local function compress(tab)
  tab = ser.serialize(tab)
  tab = c.data.deflate(tab)
  return tab
end

local function decompress(val)
  val = c.data.inflate(val)
  val = ser.unserialize(val)
  return val
end

local function addBlock(pos,color)
  local x = c.glasses.addCube3D()
  x.set3DPos(table.unpack(pos))
  x.setColor(table.unpack(color))
  x.setAlpha(0.7)
  x.setScale(0.8)
  return x
end

local function HSL(hue, saturation, lightness, alpha)
    if hue < 0 or hue > 360 then
        return 0, 0, 0, alpha
    end
    if saturation < 0 or saturation > 1 then
        return 0, 0, 0, alpha
    end
    if lightness < 0 or lightness > 1 then
        return 0, 0, 0, alpha
    end
    local chroma = (1 - math.abs(2 * lightness - 1)) * saturation
    local h = hue/60
    local x =(1 - math.abs(h % 2 - 1)) * chroma
    local r, g, b = 0, 0, 0
    if h < 1 then
        r,g,b=chroma,x,0
    elseif h < 2 then
        r,b,g=x,chroma,0
    elseif h < 3 then
        r,g,b=0,chroma,x
    elseif h < 4 then
        r,g,b=0,x,chroma
    elseif h < 5 then
        r,g,b=x,0,chroma
    else
        r,g,b=chroma,0,x
    end
    local m = lightness - chroma/2
    return (r+m)*255,(g+m)*255,(b+m)*255
end

lights.digit(3,digitDisplays[1],0xff033d)
lights.digit(5,digitDisplays[2],0xff033d)
lights.digit(9,digitDisplays[3],0xff033d)

GPU.set(25,5,"Le GPU")
APU.set(25,5,"La APU")

for i=1,5 do d.beep() end

local function receiveScanData(_,_,_,_,_,msg1,msg2,msg3,msg4)
  print(msg1)
  if msg1 == "scanData" then

  else
    --[[addBlock(table.unpack(decompress(msg1)),{0,255,0})
    addBlock(table.unpack(decompress(msg2)),{0,255,0})
    addBlock(table.unpack(decompress(msg3)),{0,255,0})
    addBlock(table.unpack(decompress(msg4)),{0,255,0})--]]
    local coord = {decompress(msg1),decompress(msg2),decompress(msg3),decompress(msg4)}
    for i in pairs(coord) do
      thisHue = 360 - ((coord[i][1]+5))/9*360
      addBlock({coord[i][1],coord[i][2],coord[i][3]},{HSL(thisHue, 1, 0.5, 1)})
      if coord[i][2] then print(coord[i][1],coord[i][2],coord[i][3],thisHue) end
    end
  end
end
--event,_,linkingCard,_,_,msg1,msg2,msg3,msg4
--event.listen("modem_message",receiveScanData)

gButtons.initialize()
--name,group,label,x,y,w,h,color,alpha,callback
gButtons.createNewButton("scan",nil,"Scan",5,5,35,14,{255,0,0},0.4,function(x)
  gButtons.Color(x,{0,255,0})
  --c.glasses.removeAll()
  c.tunnel.send("scan")
  os.sleep(0.4)
  gButtons.Color(x)
end)


local function update()
  --print(event.pull(1/20,"modem_message"))
  os.sleep(1/20)
  thread.create(function()
    gButtons.update()
  end)
  thread.create(function()
    local _,_,_,_,_,o = event.pull(1/20,"modem_message")
    --print(o)
    if o == "scanData" then
      print(event.listen("modem_message",receiveScanData))
      print("Enabled")
    end
    if o == "scanDataComplete" then
      print(event.ignore("modem_message",receiveScanData))
      print("Disabled")
    end
  end)

end

while true do update() end

remote.lua (Robot)

local computer = require("computer")
local c = require("component")
local event = require("event")
local ser = require("serialization")
local tty = require("tty")
local thread = require("thread")

local hardValues = {}
local terrain = {}


--c.tunnel.send()
local function compress(val)
  val = ser.serialize(val)
  val = c.data.deflate(val)
  return val
end

local function decompress(val)
  val = c.data.inflate(val)
  val = ser.unserialize(val)
  return val
end

local function scan()
  local x = {}
  print("Analyzing ..")
  for i=-4,4 do
    for d=-4,4 do
      table.insert(x,c.geolyzer.scan(i,d))
    end
  end
  print("Done Analyzing.")
  return x
end

thread.create(function()
  os.sleep(5)
  tty.clear()
  print("Initilizing ..")
  --os.execute("/bin/components.lua")
  --c.gpu.bind("125bb046-a2c9-4182-8459-785265229229")
end):detach()



local function receive(_,_,_,_,_,msg1,msg2,msg3,msg4)
  computer.beep()
  terrain = {}
  if msg1 == "scan" then
    print("Starting Sequence ..")
    --[[for x in pairs(hardValues) do
      for z in pairs(hardValues[x]) do
        for y in pairs(hardValues[x][z]) do
          c.gpu.set(1,6,x .. " " .. y .. " " .. z)
          if hardValues[x][z][y] > 0 then
            table.insert(terrain,{x,y,z})
            --print(x .. " " .. y .. " " .. z)
            break
          end
        end
      end
    end--]]
    --local x,z = -4,-4
    for x=-4,4 do
      --x = x + 1
      for z=-4,4 do
        local tile = c.geolyzer.scan(x,z)
        --z = z + 1
        --os.sleep(2)
        --print(tile)
        for y=#tile,1,-1 do
          --print(y)
          if tile[y] ~= 0 then
            table.insert(terrain,{x,y-33,z})
            --print("Found: ",x,y,z)
            --break
          end
          if y < 31 then
            break
          end
        end
      end
    end
    print("Calculation Complete.")
    print(#terrain .. " entries.")
    print("Sending Data ..")
    c.tunnel.send("scanData")
    os.sleep(1)
    for i=1,#terrain,4 do
      c.tunnel.send(
        compress(terrain[i]),
        compress(terrain[i+1]),
        compress(terrain[i+2]),
        compress(terrain[i+3])
      )
    end
    print("Data Sent.")
    os.sleep(1)
    c.tunnel.send("scanDataComplete")
  end
end

event.listen("modem_message",receive)

local function update()
  os.sleep(0)
end

while true do update() end

 

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

Im not sure really what you're going for.. But I think the update function needs a little work. Also the event listeners you create in the update function might be acting funny because they're in threads, which are like little processes, and I think processes dump they're event registrations when they're complete(this may be nonsense...). One other note, you may want to stick to the term library instead of tty. tty is a core lib an subject to change. I think with your current setup update could look like this(below) and still hypothetically work.

local function update()
  local ev = {event.pull(1, "modem_message")}
  
  if ev[1] == "modem_message" and ev[6] == "scanData" then
    recieveScanData(table.unpack(ev))
    gButtons.update()
  end
end

 

Share this post


Link to post
Share on other sites
On 6/23/2018 at 9:32 PM, Molinko said:

Im not sure really what you're going for.. But I think the update function needs a little work. Also the event listeners you create in the update function might be acting funny because they're in threads, which are like little processes, and I think processes dump they're event registrations when they're complete(this may be nonsense...). One other note, you may want to stick to the term library instead of tty. tty is a core lib an subject to change. I think with your current setup update could look like this(below) and still hypothetically work.


local function update()
  local ev = {event.pull(1, "modem_message")}
  
  if ev[1] == "modem_message" and ev[6] == "scanData" then
    recieveScanData(table.unpack(ev))
    gButtons.update()
  end
end

 

You were right with doing it inside a threat would mess stuff up. After I registered it inside of the main loop it worked as I wanted. And I'll keep in mind to use the Term Libray from now on.

Share this post


Link to post
Share on other sites

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.