mirror of
https://github.com/zenith391/OCEmu.git
synced 2025-09-29 07:53:29 -04:00
Various things
Add persistence code to the eeprom, so it will actually work when booting OCEmu convert a print -> cprint Implement the HTTP side of the internet card Add clipboard support to the keyboard Edit the readme to mention luasocket and luasec
This commit is contained in:
parent
53f8bcbd13
commit
ca66a9e20c
@ -4,12 +4,16 @@ OCEmu - OpenComputers Emulator
|
|||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Needs luafilesystem, utf8, and luaffi
|
Needs luafilesystem, utf8, and luaffi.
|
||||||
|
|
||||||
|
luasocket is required for the Internet Component.
|
||||||
|
|
||||||
|
luasec is optional but is required for HTTPS.
|
||||||
|
|
||||||
```
|
```
|
||||||
luarocks-5.2 install luafilesystem
|
luarocks-5.2 install luafilesystem
|
||||||
luarocks-5.2 install utf8
|
luarocks-5.2 install utf8
|
||||||
git clone https://github.com/colesbury/luaffi.git
|
git clone https://github.com/gamax92/luaffi.git
|
||||||
cd luaffi
|
cd luaffi
|
||||||
make
|
make
|
||||||
sudo cp ffi.so /appropriate/path/for/lua/libraries/
|
sudo cp ffi.so /appropriate/path/for/lua/libraries/
|
||||||
|
@ -2,10 +2,43 @@ local address, slot, filename = ...
|
|||||||
|
|
||||||
local crc32 = require("support.crc32")
|
local crc32 = require("support.crc32")
|
||||||
|
|
||||||
|
local directory = elsa.filesystem.getSaveDirectory() .. "/" .. address
|
||||||
|
if not elsa.filesystem.exists(directory) then
|
||||||
|
elsa.filesystem.createDirectory(directory)
|
||||||
|
end
|
||||||
|
|
||||||
local code = elsa.filesystem.read(filename)
|
local code = elsa.filesystem.read(filename)
|
||||||
local data = ""
|
local data = ""
|
||||||
local label = "EEPROM"
|
local label = "EEPROM"
|
||||||
local readonly = false
|
local readonly = false
|
||||||
|
if elsa.filesystem.exists(directory .. "/data.lua") then
|
||||||
|
local fn, err = elsa.filesystem.load(directory .. "/data.lua","t",{})
|
||||||
|
if not fn then
|
||||||
|
cprint("Failed to unpersist eeprom @" .. address .. ": " .. err)
|
||||||
|
else
|
||||||
|
local ncode,ndata,nlabel,nread = fn()
|
||||||
|
if type(ncode) ~= "string" or type(ndata) ~= "string" or type(nlabel) ~= "string" or type(nread) ~= "boolean" then
|
||||||
|
cprint("Failed to unpersist eeprom @" .. address .. ": Invalid persist data")
|
||||||
|
cprint("code) " .. type(ncode))
|
||||||
|
cprint("data) " .. type(ndata))
|
||||||
|
cprint("labl) " .. type(nlabel))
|
||||||
|
cprint("read) " .. type(nread))
|
||||||
|
else
|
||||||
|
code,data,label,readonly = ncode,ndata,nlabel,nread
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function persist()
|
||||||
|
local file, err = io.open(directory .. "/data.lua", "wb")
|
||||||
|
if not file then
|
||||||
|
cprint("Failed to persist eeprom @" .. address .. ": " .. err)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
file:write(string.format("return %q,%q,%q,%s",code,data,label,tostring(readonly)):gsub("\\\n","\\n") .. "")
|
||||||
|
file:close()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
-- eeprom component
|
-- eeprom component
|
||||||
local obj = {}
|
local obj = {}
|
||||||
@ -22,6 +55,7 @@ function obj.setData(newdata) -- Overwrite the currently stored byte array.
|
|||||||
error("not enough space",3)
|
error("not enough space",3)
|
||||||
end
|
end
|
||||||
data = newdata
|
data = newdata
|
||||||
|
persist()
|
||||||
end
|
end
|
||||||
function obj.getDataSize() -- Get the storage capacity of this EEPROM.
|
function obj.getDataSize() -- Get the storage capacity of this EEPROM.
|
||||||
cprint("eeprom.getDataSize")
|
cprint("eeprom.getDataSize")
|
||||||
@ -43,6 +77,7 @@ function obj.setLabel(newlabel) -- Set the label of the EEPROM.
|
|||||||
compCheckArg(1,newlabel,"string","nil")
|
compCheckArg(1,newlabel,"string","nil")
|
||||||
if newlabel == nil then newlabel = "EEPROM" end
|
if newlabel == nil then newlabel = "EEPROM" end
|
||||||
label = newlabel:sub(1,16)
|
label = newlabel:sub(1,16)
|
||||||
|
persist()
|
||||||
return label
|
return label
|
||||||
end
|
end
|
||||||
function obj.getChecksum() -- Get the checksum of the data on this EEPROM.
|
function obj.getChecksum() -- Get the checksum of the data on this EEPROM.
|
||||||
@ -64,14 +99,16 @@ function obj.set(newcode) -- Overwrite the currently stored byte array.
|
|||||||
error("not enough space",3)
|
error("not enough space",3)
|
||||||
end
|
end
|
||||||
code = newcode
|
code = newcode
|
||||||
|
persist()
|
||||||
end
|
end
|
||||||
function obj.makeReadonly(checksum) -- Make this EEPROM readonly if it isn't already. This process cannot be reversed!
|
function obj.makeReadonly(checksum) -- Make this EEPROM readonly if it isn't already. This process cannot be reversed!
|
||||||
print("eeprom.makeReadonly", checksum)
|
cprint("eeprom.makeReadonly", checksum)
|
||||||
compCheckArg(1,checksum,"string")
|
compCheckArg(1,checksum,"string")
|
||||||
if checksum ~= obj.getChecksum() then
|
if checksum ~= obj.getChecksum() then
|
||||||
return nil, "incorrect checksum"
|
return nil, "incorrect checksum"
|
||||||
end
|
end
|
||||||
readonly = true
|
readonly = true
|
||||||
|
persist()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,6 +6,11 @@ if not okay then
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
local url = require("socket.url")
|
local url = require("socket.url")
|
||||||
|
local okay, http = pcall(require, "ssl.https")
|
||||||
|
if not okay then
|
||||||
|
cprint("Cannot use HTTPS: " .. http)
|
||||||
|
http = require("socket.http")
|
||||||
|
end
|
||||||
|
|
||||||
component.connect("filesystem",gen_uuid(),nil,"lua/component/internet",true)
|
component.connect("filesystem",gen_uuid(),nil,"lua/component/internet",true)
|
||||||
|
|
||||||
@ -94,17 +99,48 @@ function obj.connect(address, port) -- Opens a new TCP connection. Returns the h
|
|||||||
return fakesocket
|
return fakesocket
|
||||||
end
|
end
|
||||||
function obj.request(url, postData) -- Starts an HTTP request. If this returns true, further results will be pushed using `http_response` signals.
|
function obj.request(url, postData) -- Starts an HTTP request. If this returns true, further results will be pushed using `http_response` signals.
|
||||||
--STUB
|
|
||||||
cprint("internet.request",url, postData)
|
cprint("internet.request",url, postData)
|
||||||
compCheckArg(1,url,"string")
|
compCheckArg(1,url,"string")
|
||||||
if not config.get("internet.enableHttp",true) then
|
if not config.get("internet.enableHttp",true) then
|
||||||
return nil, "http requests are unavailable"
|
return nil, "http requests are unavailable"
|
||||||
end
|
end
|
||||||
local post
|
-- TODO: Check for too many connections
|
||||||
if type(postData) == "string" then
|
if type(postData) ~= "string" then
|
||||||
post = postData
|
postData = nil
|
||||||
end
|
end
|
||||||
return nil
|
-- TODO: This works ... but is slow.
|
||||||
|
local page, _, headers, status = http.request(url, postData)
|
||||||
|
local protocol, code, message = status:match("(.-) (.-) (.*)")
|
||||||
|
code = tonumber(code)
|
||||||
|
local fakesocket = {
|
||||||
|
read = function(n)
|
||||||
|
cprint("(socket) read",n)
|
||||||
|
-- OC doesn't actually return n bytes when requested.
|
||||||
|
if page == nil then
|
||||||
|
return nil, "connection lost"
|
||||||
|
elseif page == "" then
|
||||||
|
return nil
|
||||||
|
else
|
||||||
|
-- Return up to 8192 bytes
|
||||||
|
local data = page:sub(1,8192)
|
||||||
|
page = page:sub(8193)
|
||||||
|
return data
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
response = function()
|
||||||
|
cprint("(socket) response")
|
||||||
|
return code, message, headers
|
||||||
|
end,
|
||||||
|
close = function()
|
||||||
|
cprint("(request) close")
|
||||||
|
page = nil
|
||||||
|
end,
|
||||||
|
finishConnect = function()
|
||||||
|
cprint("(socket) finishConnect")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}
|
||||||
|
return fakesocket
|
||||||
end
|
end
|
||||||
|
|
||||||
local cec = {}
|
local cec = {}
|
||||||
|
@ -2,6 +2,7 @@ local address = ...
|
|||||||
|
|
||||||
local ffi = require("ffi")
|
local ffi = require("ffi")
|
||||||
local lua_utf8 = require("utf8")
|
local lua_utf8 = require("utf8")
|
||||||
|
local SDL = elsa.SDL
|
||||||
|
|
||||||
-- Conversion table for SDL2 keys to LWJGL key codes
|
-- Conversion table for SDL2 keys to LWJGL key codes
|
||||||
local keys = require("support.sdl_to_lwjgl")
|
local keys = require("support.sdl_to_lwjgl")
|
||||||
@ -21,6 +22,11 @@ function elsa.keydown(event)
|
|||||||
local key = keyevent.keysym.scancode
|
local key = keyevent.keysym.scancode
|
||||||
cprint("keydown",keys[key])
|
cprint("keydown",keys[key])
|
||||||
table.insert(kbdcodes,{type="key_down",addr=address,code=keys[key]})
|
table.insert(kbdcodes,{type="key_down",addr=address,code=keys[key]})
|
||||||
|
if keys[key] == 210 then
|
||||||
|
if SDL.hasClipboardText() > 0 then
|
||||||
|
table.insert(machine.signals,{"clipboard",address,ffi.string(SDL.getClipboardText())})
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function elsa.keyup(event)
|
function elsa.keyup(event)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user