zefie icon

Minecraft High Speed Tape Dubbing Thing (OpenComputers + Computronics Tapes)

zefie | PRO | 02/17/21 05:30:38 PM UTC (Edited) | 0 ⭐ | 742 👁️ | Never ⏰ | []
Lua |

3.3 KB

|

None

|

0 👍

/

0 👎

local component = require("component")
local shell = require("shell")
 
local buffer_size = 131072
local drive_l_addr = "caea8bb0-4507-438f-bc74-45d24c1d5ec7"
local drive_r_addr = "08fe3266-25c4-4391-afb4-06eed05e3b86"
local drive_l
local drive_r
 
local function formatKB(num)
  return string.format("%02.f",math.floor(num / 1024)).."KB"
end
 
local function getTapeDrive(address)
  --Credits to gamax92 for this
  --Taken crom Computronics tape.lua
  local tape
  if address then
    if type(address) ~= "string" then
      io.stderr:write("'address' may only be a string")
      return
    end
    local fulladdr = component.get(address)
    if fulladdr == nil then
      io.stderr:write("No component at this address.")
      return
    end
    if component.type(fulladdr) ~= "tape_drive" then
      io.stderr:write("No tape drive at this address.")
      return
    end
    tape = component.proxy(fulladdr)
  else
    tape = component.tape_drive
  end
  return tape
end
 
drive_l = getTapeDrive(drive_l_addr)
drive_r = getTapeDrive(drive_r_addr)
 
if not drive_l.isReady() then
  io.stderr:write("Could not find tape in left drive.")
  return
end
 
if not drive_r.isReady() then
  io.stderr:write("Could not find tape in right drive.")
  return
end
 
local srcsize = drive_l.getSize()
local destsize = drive_r.getSize();
 
if srcsize > destsize then
  io.stderr:write("Destination tape is smaller than source tape! Data will be truncated.")
end
 
drive_r.setLabel(drive_l.getLabel())
 
drive_l.stop()
drive_l.seek(-srcsize)
drive_l.stop()
 
drive_r.stop()
drive_r.seek(-drive_r.getSize())
drive_r.stop()
 
local tread = 0
local written = 0
local bytes_read = 0
local bytes_written = 0
local buffer = {};
local eot = false;
 
io.write("High-speed dubbing tape "..drive_l.getLabel().." ("..formatKB(srcsize)..") to tape in deck 2 ("..formatKB(drive_r.getSize())..")...\n")
 
repeat
    if not drive_l.isReady() then
      io.stderr:write("Could not find tape in left drive.")
    end
    buffer = drive_l.read(buffer_size,false)
    tread = tread + #buffer
    if not drive_r.isReady() then
      io.stderr:write("Could not find tape in right drive.")
    end
    drive_r.write(buffer)
    written = written + #buffer
    io.write("Copying... Tape1 Pos: "..formatKB(tread).." - Tape2 Pos: "..formatKB(written).."\r")
    if written >= destsize then
      eot = true
    end
    --if we find three nil bytes in a row, assume silence
    if drive_l.read(false) == 0 then
      drive_l.seek(1)
      if drive_l.read(true) == 0 then
        if drive_l.read(true) == 0 then
          io.write("\nDetected silence at end of recorded tape...\n")
          eot = true
        else
          --unseek our check bytes
          drive_l.seek(-2)
        end
      else
        --unseek our check byte
        drive_l.seek(-1)
      end
    end
until eot
 
io.write("Wiping the remainder of the destination tape... ")
while written < destsize do
  buffer = string.rep("\xAA",buffer_size*2)
  drive_r.write(buffer);
  written = written + #buffer;
  io.write("\rWiping the remainder of the destination tape... "..string.format("%02.f",math.floor(((written / destsize) * 100))).."%\r")
end  
 
 
drive_l.seek(-drive_l.getSize())
drive_r.seek(-drive_r.getSize())
io.write("\nCopy complete.")

Comments