local kernelArgs={...} local apis=kernelArgs[1] local drivers=kernelArgs[2] local log=kernelArgs[3] local driver={} driver.type = "component" driver.name = "CC:Periph" driver.version = "1.0.0" driver.apiVersion = 1 driver.description = "Driver for CC:Tweaked peripherals" driver.arch = "cc" driver.api = {} local native,sides if apis.peripheral then native = apis.peripheral sides = apis.rs.getSides() end function driver.api.getNames() local results = {} for n = 1, #sides do local side = sides[n] if native.isPresent(side) then table.insert(results, side) if native.hasType(side, "peripheral_hub") then local remote = native.call(side, "getNamesRemote") for _, name in ipairs(remote) do table.insert(results, name) end end end end return results end function driver.api.getType(peripheral) if type(peripheral) == "string" then -- Peripheral name passed if native.isPresent(peripheral) then return native.getType(peripheral) end for n = 1, #sides do local side = sides[n] if native.hasType(side, "peripheral_hub") and native.call(side, "isPresentRemote", peripheral) then return native.call(side, "getTypeRemote", peripheral) end end return nil else local mt = getmetatable(peripheral) if not mt or mt.__name ~= "peripheral" or type(mt.types) ~= "table" then error("bad argument #1 (table is not a peripheral)", 2) end return table.unpack(mt.types) end end function driver.api.isType(peripheral, peripheral_type) if type(peripheral) == "string" then -- Peripheral name passed if native.isPresent(peripheral) then return native.hasType(peripheral, peripheral_type) end for n = 1, #sides do local side = sides[n] if native.hasType(side, "peripheral_hub") and native.call(side, "isPresentRemote", peripheral) then return native.call(side, "hasTypeRemote", peripheral, peripheral_type) end end return nil else local mt = getmetatable(peripheral) if not mt or mt.__name ~= "peripheral" or type(mt.types) ~= "table" then error("bad argument #1 (table is not a peripheral)", 2) end return mt.types[peripheral_type] ~= nil end end function driver.api.getMethods(name) if native.isPresent(name) then return native.getMethods(name) end for n = 1, #sides do local side = sides[n] if native.hasType(side, "peripheral_hub") and native.call(side, "isPresentRemote", name) then return native.call(side, "getMethodsRemote", name) end end return nil end function driver.api.call(name, method, ...) if native.isPresent(name) then return native.call(name, method, ...) end for n = 1, #sides do local side = sides[n] if native.hasType(side, "peripheral_hub") and native.call(side, "isPresentRemote", name) then return native.call(side, "callRemote", name, method, ...) end end return nil end function driver.api.wrap(name) local methods = driver.api.getMethods(name) if not methods then return nil end local types = { driver.api.getType(name) } for i = 1, #types do types[types[i]] = true end local result = setmetatable({}, { __name = "peripheral", name = name, type = types[1], types = types, }) for _, method in ipairs(methods) do result[method] = function(...) return driver.api.call(name, method, ...) end end return result end drivers[#drivers+1] = driver