mirror of
https://github.com/XeonSquared/OC-Copper.git
synced 2024-11-23 09:58:06 +11:00
A few adjustments to culib, a fix to relib, and adding a few missing things
This commit is contained in:
parent
2c13ad9469
commit
7f9623ddbd
@ -36,13 +36,13 @@ return function (hostname, transmit, onReceive, time)
|
|||||||
|
|
||||||
-- How many packets need to be stored in seenBefore's keyspace
|
-- How many packets need to be stored in seenBefore's keyspace
|
||||||
-- before 'panic' is the best response?
|
-- before 'panic' is the best response?
|
||||||
local tuningMaxSeenBeforeCountBeforeEmergencyFlush = 0x300
|
local tuningMaxSeenBeforeCountBeforeEmergencyFlush = 0x100
|
||||||
|
|
||||||
-- Prevents OOM by LKR cache flooding - how many entries can the LKR have, max?
|
-- Prevents OOM by LKR cache flooding - how many entries can the LKR have, max?
|
||||||
-- (Though spamming packets from many sources is now a viable method for dropping LKR,
|
-- (Though spamming packets from many sources is now a viable method for dropping LKR,
|
||||||
-- it used to be a viable OOM method.)
|
-- it used to be a viable OOM method.)
|
||||||
-- Note that setting this to 0 or less will effectively result in a value of 1.
|
-- Note that setting this to 0 or less will effectively result in a value of 1.
|
||||||
local tuningMaxLKREntries = 0x400
|
local tuningMaxLKREntries = 0x200
|
||||||
|
|
||||||
-- Expect another packet after this amount of time,
|
-- Expect another packet after this amount of time,
|
||||||
-- or else clear the known receivers cache entry.
|
-- or else clear the known receivers cache entry.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
-- I, 20kdc, release this into the public domain.
|
||||||
|
-- No warranty is provided, implied or otherwise.
|
||||||
-- Chat client
|
-- Chat client
|
||||||
local serv = ({...})[1]
|
local serv = ({...})[1]
|
||||||
local event = require("event")
|
local event = require("event")
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
-- I, 20kdc, release this into the public domain.
|
||||||
|
-- No warranty is provided, implied or otherwise.
|
||||||
-- Chat server.
|
-- Chat server.
|
||||||
local occure = require("occure")
|
local occure = require("occure")
|
||||||
local event = require("event")
|
local event = require("event")
|
||||||
|
131
oc/app/iot-mgr.lua
Normal file
131
oc/app/iot-mgr.lua
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
-- I, 20kdc, release this into the public domain.
|
||||||
|
-- No warranty is provided, implied or otherwise.
|
||||||
|
|
||||||
|
-- Controller for objects following the 'IoT protocol'
|
||||||
|
-- (see <soontobe> provided microcontroller source)
|
||||||
|
|
||||||
|
local occure = require("occure")
|
||||||
|
local event = require("event")
|
||||||
|
local args = {...}
|
||||||
|
local cmdinfo = {
|
||||||
|
["help"] = {"Lists the commands"},
|
||||||
|
["discover"] = {"Sends a packet on the discovery port to a given address", "target"},
|
||||||
|
["get"] = {"Gets a value", "target", "index"},
|
||||||
|
["set"] = {"Sets a value", "target", "index", "data"},
|
||||||
|
["invoke"] = {"Runs an action", "target", "index", "data"}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function packet(tp, idx, data)
|
||||||
|
return string.char(idx + (tp * 64)) .. data
|
||||||
|
end
|
||||||
|
|
||||||
|
local didGet = false
|
||||||
|
local getTarg = 0
|
||||||
|
local function getHelper(tp, tfrom, tto, p, d, u)
|
||||||
|
if tp ~= "copper_packet" then return end
|
||||||
|
if p == 4 then
|
||||||
|
if tto == occure.getHostname() then
|
||||||
|
if d:sub(1, 1) == packet(3, getTarg, "") then
|
||||||
|
print(d)
|
||||||
|
didGet = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function displayDisc(d)
|
||||||
|
local types = {
|
||||||
|
[0] = "void",
|
||||||
|
[0x40] = "void=",
|
||||||
|
[0x80] = "action(void)",
|
||||||
|
[1] = "string",
|
||||||
|
[0x41] = "string=",
|
||||||
|
[0x81] = "action(string)",
|
||||||
|
[2] = "boolean",
|
||||||
|
[0x42] = "boolean=",
|
||||||
|
[0x82] = "action(boolean)",
|
||||||
|
[3] = "float",
|
||||||
|
[0x43] = "float=",
|
||||||
|
[0x83] = "action(float)",
|
||||||
|
[4] = "descriptor",
|
||||||
|
[0x44] = "descriptor=",
|
||||||
|
[0x84] = "action(descriptor)",
|
||||||
|
}
|
||||||
|
while #d > 7 do
|
||||||
|
local tp = d:byte()
|
||||||
|
local n = types[tp] or ("unknown " .. tp)
|
||||||
|
print(" " .. d:sub(2, 8) .. ": " .. n)
|
||||||
|
d = d:sub(9)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function discHelper(tp, tfrom, tto, p, d, u)
|
||||||
|
if tp ~= "copper_packet" then return end
|
||||||
|
if p == 4 then
|
||||||
|
if tto == occure.getHostname() then
|
||||||
|
if d:byte() == 0xC0 then
|
||||||
|
-- Discovery response.
|
||||||
|
print("\"" .. tfrom .. "\"")
|
||||||
|
displayDisc(d:sub(2))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local commands = {
|
||||||
|
["help"] = function ()
|
||||||
|
for k, v in pairs(cmdinfo) do
|
||||||
|
print(k .. ": " .. v[1])
|
||||||
|
for i = 2, #v do
|
||||||
|
print(" " .. v[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
["discover"] = function (target)
|
||||||
|
occure.output(target, 1, "", true)
|
||||||
|
event.listen("copper_packet", discHelper)
|
||||||
|
pcall(os.sleep, 10)
|
||||||
|
event.ignore("copper_packet", discHelper)
|
||||||
|
end,
|
||||||
|
["get"] = function (target, index)
|
||||||
|
index = tonumber(index)
|
||||||
|
local ack = false
|
||||||
|
getTarg = index
|
||||||
|
didGet = false
|
||||||
|
occure.output(target, 4, packet(0, index, ""), false, function() ack = true end)
|
||||||
|
event.listen("copper_packet", getHelper)
|
||||||
|
local safety = 0
|
||||||
|
while (not didGet) and (safety < 30) do
|
||||||
|
os.sleep(1)
|
||||||
|
safety = safety + 1
|
||||||
|
end
|
||||||
|
event.ignore("copper_packet", getHelper)
|
||||||
|
if not didGet then
|
||||||
|
if ack then
|
||||||
|
print("ACK'd but no response - bad parameters likely.")
|
||||||
|
else
|
||||||
|
print("Didn't get any response, not even an ACK.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
["set"] = function (target, index, data)
|
||||||
|
index = tonumber(index)
|
||||||
|
local complete = nil
|
||||||
|
occure.output(target, 4, packet(1, index, data), false, function() complete = "acknowledged!" end, function() complete = "unacknowledged :(" end)
|
||||||
|
while not complete do
|
||||||
|
os.sleep(1)
|
||||||
|
end
|
||||||
|
print(complete)
|
||||||
|
end,
|
||||||
|
["invoke"] = function (target, index, data)
|
||||||
|
index = tonumber(index)
|
||||||
|
local complete = nil
|
||||||
|
occure.output(target, 4, packet(2, index, data), false, function() complete = "acknowledged!" end, function() complete = "unacknowledged :(" end)
|
||||||
|
while not complete do
|
||||||
|
os.sleep(1)
|
||||||
|
end
|
||||||
|
print(complete)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
if not commands[args[1]] then error("No such command - try 'iot-mgr help'") end
|
||||||
|
if #args ~= #cmdinfo[args[1]] then error("Parameter count mismatch.") end
|
||||||
|
commands[args[1]](select(2, table.unpack(args)))
|
@ -1,3 +1,5 @@
|
|||||||
|
-- I, 20kdc, release this into the public domain.
|
||||||
|
-- No warranty is provided, implied or otherwise.
|
||||||
local occure = require("occure")
|
local occure = require("occure")
|
||||||
local computer = require("computer")
|
local computer = require("computer")
|
||||||
local event = require("event")
|
local event = require("event")
|
||||||
|
@ -45,7 +45,7 @@ They are, as follows:
|
|||||||
|
|
||||||
Part 3. Discovery & Description
|
Part 3. Discovery & Description
|
||||||
|
|
||||||
Upon the receipt of any unreliable packet on port 1 that is addressed to "*" or the IoT device name,
|
Upon the receipt of any packet on port 1 that is addressed to "*" or the IoT device name,
|
||||||
it should send a packet back on port 4 formatted as a Get response packet for variable 0.
|
it should send a packet back on port 4 formatted as a Get response packet for variable 0.
|
||||||
|
|
||||||
Variable 0 is always the Descriptor, which describes the variables and actions available.
|
Variable 0 is always the Descriptor, which describes the variables and actions available.
|
||||||
|
@ -40,6 +40,8 @@ The final header byte is the actual indicator of what is in the packet.
|
|||||||
0x00 indicates that this is an unreliable packet.
|
0x00 indicates that this is an unreliable packet.
|
||||||
0x01 indicates that this is a reliable packet, expecting acknowledgement.
|
0x01 indicates that this is a reliable packet, expecting acknowledgement.
|
||||||
0x02 indicates that this is an acknowledgement for a reliable packet.
|
0x02 indicates that this is an acknowledgement for a reliable packet.
|
||||||
|
Other packets should be ignored as far as information is concerned,
|
||||||
|
but as for routing-wise, not dropped.
|
||||||
|
|
||||||
An example scenario will now be presented:
|
An example scenario will now be presented:
|
||||||
|
|
||||||
|
@ -124,8 +124,7 @@ return function (hostname, transmit, onRReceive, time, culib)
|
|||||||
local t = time()
|
local t = time()
|
||||||
while i <= #timers do
|
while i <= #timers do
|
||||||
if timers[i][2] <= t then
|
if timers[i][2] <= t then
|
||||||
timers[i][1]()
|
table.remove(timers, i)[1]()
|
||||||
table.remove(timers, i)
|
|
||||||
else
|
else
|
||||||
i = i + 1
|
i = i + 1
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user