local json = require "json" local databaseStorage = peripheral.find("drive") or error("No drive attached", 0) if (databaseStorage.isDiskPresent() == false or databaseStorage.getDiskLabel() ~= "Farming Data") then error("Missing or wrong drive", 0) end local databaseModem = peripheral.find("modem") or error("No modem attached", 0) local fieldDataChannel = 420 -- Request Field Data Channel local setupFieldChannel = 421 -- Setup Field Channel if (databaseModem.isOpen(fieldDataChannel) or databaseModem.isOpen(setupFieldChannel)) then databaseModem.closeAll() end databaseModem.open(fieldDataChannel) databaseModem.open(setupFieldChannel) local function listenForFieldDataRequests() while true do local event, _, incomingChannel, replyChannel, message, _ = os.pullEvent("modem_message") if (incomingChannel == fieldDataChannel) then local databaseFile = io.open("/" .. databaseStorage.getMountPath() .. "/field_data.txt", "r") local database = json.decode(databaseFile:read("*a")) databaseFile:close() databaseFile = nil end end end local function listenForFieldSetups() while true do local event, _, incomingChannel, replyChannel, message, _ = os.pullEvent("modem_message") if (incomingChannel == setupFieldChannel) then local databaseFile = io.open("/" .. databaseStorage.getMountPath() .. "/field_data.txt", "w") local database = json.decode(databaseFile:read("*a")) databaseFile:write(json.encode(database)) databaseFile:close() databaseFile = nil end end end local function listenForDiskEject() repeat local _, side = os.pullEvent("disk_eject") until side ~= nil error("Disk was ejected!") end local function listenForPeripheralDetach() repeat local _, side = os.pullEvent("peripheral_detach") until side ~= nil error("Modem was removed!") end parallel.waitForAny(listenForFieldDataRequests, listenForFieldSetups, listenForDiskEject, listenForPeripheralDetach)