techage_modpack/techage/lua_controller/commands.lua
2020-05-31 22:31:18 +02:00

187 lines
5.4 KiB
Lua

--[[
Techage
=======
Copyright (C) 2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
commands.lua:
Register all basic controller commands
]]--
-- store protection data locally
local LocalRef = {}
local function not_protected(owner, numbers)
if owner and numbers then
LocalRef[owner] = LocalRef[owner] or {}
if LocalRef[owner][numbers] == nil then
LocalRef[owner][numbers] = techage.check_numbers(numbers, owner)
end
return LocalRef[owner][numbers]
end
return false
end
techage.lua_ctlr.register_function("get_input", {
cmnd = function(self, num)
num = tostring(num or "")
return techage.lua_ctlr.get_input(self.meta.number, num)
end,
help = ' $get_input(num) --> "on", "off", or nil\n'..
' Read local input value from device with number "num".\n'..
' example: inp = $get_input("1234")\n'..
" The device has to be connected with the controller."
})
techage.lua_ctlr.register_function("read_data", {
cmnd = function(self, num, ident, add_data)
num = tostring(num or "")
return techage.send_single(self.meta.number, num, ident, add_data)
end,
help = " $read_data(num, ident, add_data)\n"..
" Read any kind of data from another block.\n"..
' "num" is the block number\n'..
' "ident" specifies the data to be read\n'..
' "add_data" is additional data (optional)\n'..
' example: sts = $read_data("1234", "state")'
})
techage.lua_ctlr.register_function("time_as_str", {
cmnd = function(self)
local t = minetest.get_timeofday()
local h = math.floor(t*24) % 24
local m = math.floor(t*1440) % 60
return string.format("%02d:%02d", h, m)
end,
help = " $time_as_str() --> e.g. '18:45'\n"..
" Read time of day as string (24h).\n"..
' example: time = $time_as_str()'
})
techage.lua_ctlr.register_function("time_as_num", {
cmnd = function(self, num)
local t = minetest.get_timeofday()
local h = math.floor(t*24) % 24
local m = math.floor(t*1440) % 60
return h * 100 + m
end,
help = " $time_as_num() --> e.g.: 1845\n"..
" Read time of day as number (24h).\n"..
' example: time = $time_as_num()'
})
techage.lua_ctlr.register_action("send_cmnd", {
cmnd = function(self, num, cmnd, data)
num = tostring(num or "")
cmnd = tostring(cmnd or "")
if not_protected(self.meta.owner, num) then
return techage.send_single(self.meta.number, num, cmnd, data)
end
end,
help = " $send_cmnd(num, cmnd, add_data)\n"..
' Send a command to the device with number "num".\n'..
' "cmnd" is the command as text string\n'..
' "add_data" is additional data (optional)\n'..
' example: $send_cmnd("1234", "on")'
})
techage.lua_ctlr.register_action("set_filter", {
cmnd = function(self, num, slot, val)
num = tostring(num or "")
slot = tostring(slot or "red")
val = tostring(val or "on")
if not_protected(self.meta.owner, num) then
techage.send_single(self.meta.number, num, "filter", {slot=slot, val=val})
end
end,
help = " $set_filter(num, slot, val)\n"..
' Turn on/off a Distributor filter slot.\n'..
' example: $set_filter("1234", "red", "off")'
})
techage.lua_ctlr.register_action("display", {
cmnd = function(self, num, row, text)
num = tostring(num or "")
row = tonumber(row or 1) or 1
text = tostring(text or "")
if not_protected(self.meta.owner, num) then
if text:byte(1) ~= 32 then -- left aligned?
text = "<"..text -- use the '<' lcdlib control char for left-aligned
else
text = text:sub(2) -- delete blank for centered
end
if row == 0 then -- add line?
techage.send_single(self.meta.number, num, "add", text)
else
techage.send_single(self.meta.number, num, "set", {row = row, str = text})
end
end
end,
help = " $display(num, row, text)\n"..
' Send a text line to the display with number "num".\n'..
" 'row' is a value from 1..5, or 0 for scroll screen\n"..
" and add a new line. If the first char of the string\n"..
" is a blank, the text will be horizontally centered.\n"..
' example: $display("123", 1, "Hello "..name)'
})
techage.lua_ctlr.register_action("clear_screen", {
cmnd = function(self, num)
num = tostring(num or "")
if not_protected(self.meta.owner, num) then
techage.send_single(self.meta.number, num, "clear", nil)
end
end,
help = " $clear_screen(num)\n"..
' Clear the screen of the display\n'..
' with number "num".\n'..
' example: $clear_screen("1234")'
})
techage.lua_ctlr.register_action("chat", {
cmnd = function(self, text)
text = tostring(text or "")
minetest.chat_send_player(self.meta.owner, "[TA4 Lua Controller] "..text)
end,
help = " $chat(text,...)\n"..
" Send yourself a chat message.\n"..
' example: $chat("Hello "..name)'
})
techage.lua_ctlr.register_action("door", {
cmnd = function(self, pos, text)
pos = tostring(pos or "")
text = tostring(text or "")
pos = minetest.string_to_pos("("..pos..")")
if pos then
local door = doors.get(pos)
if door then
local player = {
get_player_name = function() return self.meta.owner end,
is_player = function() return true end,
}
if text == "open" then
door:open(player)
elseif text == "close" then
door:close(player)
end
end
end
end,
help = " $door(pos, text)\n"..
' Open/Close a door at position "pos"\n'..
' example: $door("123,7,-1200", "close")\n'..
" Hint: Use the Techage Programmer to\ndetermine the door position."
})
-- function not_protected(owner, number(s))
techage.lua_ctlr.not_protected = not_protected