local component = require("component")
local shell = require("shell")
local event = require("event")
local args, options = shell.parse(...)
-- 'Smart' Computronics Tape Player Script
-- Automatically rewinds and loops tape
if not component.isAvailable("tape_drive") then
io.stderr:wrte("This program requires a tape drive to run.")
return
end
local function tapePosToTime(pos,vers)
local multi
if vers == 1 then
multi = 4096 --32768hz
else
multi = 6000 --48000hz
end
local seconds = tonumber(pos) / multi
if seconds <= 0 then
return "00:00:00";
else
hours = string.format("%02.f", math.floor(seconds/3600));
mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins*60));
return hours..":"..mins..":"..secs
end
end
local function getTapeDrive()
--Credits to gamax92 for this
--Taken from Computronics tape.lua
local tape
if options.address then
if type(options.address) ~= "string" then
io.stderr:write("'address' may only be a string.")
return
end
local fulladdr = component.get(options.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
local function handleTape(addr)
os.execute("cls")
local tape
if addr ~= nil then
tape = getTapeDrive(addr)
else
tape = getTapeDrive()
end
if not tape.isReady() then
io.stderr:write("The tape drive does not contain a tape.")
return
end
local tape_label = tape.getLabel()
local tape_length = tape.getSize()
local tape_type
--DFPWM Vers for calculating time
if tape_label == "Minecraft Radio" then
tape_tape = 1; --32768hz
else
tape_type = 2; --48000hz
end
print("Playing Tape '"..tape_label.."' until silence is detected...")
print("Tape Length: "..tapePosToTime(tape_length,tape_type).." - Tape Size: "..string.format("%02.f",math.floor(tape_length / 1024)).."KB")
print(" ")
print("Press [SPACEBAR] to exit script...")
if tape.getState() ~= "PLAYING" then
tape.play()
end
while true do
local evt, addr, char = event.pull(1, "key_up")
if char == 32 then -- space
io.write("\nSpacebar pressed, exiting script...")
break
end
if not tape.isReady() then
io.stderr:write("\nThe tape was removed! Waiting for tape...")
while not tape.isReady() do
os.sleep(1);
end
io.write("\nTape detected. Rewinding and restarting tape...\n")
tape.seek(-tape.getSize())
os.sleep(1)
handleTape(addr)
break
end
local tapepos = tape.getPosition()
io.write("["..tape.getLabel().."] "..tape.getState()..": "..tapePosToTime(tapepos).." ("..string.format("%02.f",math.floor(tapepos / 1024)).."KB) \r")
--if we find three nil bytes in a row, assume silence
if tape.read(false) == 0 then
tape.seek(1)
if tape.read(true) == 0 then
if tape.read(true) == 0 then
io.write("\nRewinding and restarting tape...\n")
tape.stop();
tape.seek(-tape.getSize())
tape.play();
end
end
end
end
end
if args[1] == nill or args[1] == "tape" then
handleTape(args[2])
else
print("Usage: radio [tape] [tapedeck_addr]")
return
end
Comments