2021-05-07 06:19:01 +00:00
-- Change these lines to change the GUI colors.
2021-05-06 14:22:19 +00:00
accentColor = colors.gray
buttonColor = colors.lightGray
2021-05-07 04:52:48 +00:00
textColor = colors.lightGray
altTextColor = colors.gray
2021-05-06 14:22:19 +00:00
backgroundColor = colors.black
2021-05-07 06:19:01 +00:00
function round ( n ) -- We need a function to round the center of the terminal
2021-05-06 17:46:25 +00:00
return n % 1 >= 0.5 and math.ceil ( n ) or math.floor ( n )
end
2021-05-07 06:19:01 +00:00
width , height = term.getSize ( ) -- Gets the terminal size to determine the center
centerWidth = round ( width / 2 ) -- Defines the horizontal center
centerHeight = round ( height / 2 ) -- Defines the vertical center
peripherals = peripheral.getNames ( ) -- Gets peripherals to check if any disk drives are avavailable
2021-05-06 14:22:19 +00:00
if # peripherals < 0 then
print " No drive "
2021-05-07 06:19:01 +00:00
os.exit ( ) -- Exits if there's no disk drive
2021-05-06 14:22:19 +00:00
else
driveCount = 0
for n = 1 , # peripherals do
local driveCheck = peripherals [ n ]
if peripheral.getType ( driveCheck ) == " drive " then
drive = driveCheck
driveCount = driveCount + 1
end
end
if driveCount > 1 then
2021-05-07 06:19:01 +00:00
print ( " Too many disk drives. Specify where the disk drive is by running rhythmbox [drive position] " ) -- For safety reasons
2021-05-06 14:22:19 +00:00
os.exit ( )
end
end
2021-05-07 06:19:01 +00:00
--[[ Instead of calling every status by string, we call the variables storing the strings. This may ease translation if we plan to do it in the future.
] ]
2021-05-06 17:34:43 +00:00
defaultStatus = " Rhythmblock 0.0.1a "
invalidFormatStatus = " Not a music disc "
noDiscStatus = " No disc "
2021-05-07 06:19:01 +00:00
ejectText = " Eject "
2021-05-06 14:22:19 +00:00
function playDisc ( )
2021-05-07 06:19:01 +00:00
if disk.isPresent ( drive ) and disk.hasAudio ( drive ) then -- Determines if there's a disc or not and if it's a music disc
2021-05-06 14:22:19 +00:00
disk.playAudio ( drive )
2021-05-07 06:19:01 +00:00
renderStopButton ( )
2021-05-06 14:22:19 +00:00
playing = true
2021-05-07 06:19:01 +00:00
status = disk.getAudioTitle ( drive )
elseif disk.isPresent ( drive ) then -- If there's a floppy disk for example, Rhythmbox won't play it.
status = invalidFormatStatus
else -- If none of these checks are passed then it just means there's no disc in the drive.
status = noDiscStatus
2021-05-06 14:22:19 +00:00
end
end
2021-05-07 06:19:01 +00:00
function ejectDisc ( ) -- Ejects the disc! How cool is that?
if playing == true then
stopDisc ( )
disk.eject ( )
elseif disk.isPresent ( drive ) then -- If there's a disc, it'll be ejected.
disk.eject ( )
else -- If not it'll report there's no disc.
status = noDiscStatus
end
2021-05-06 14:22:19 +00:00
end
2021-05-07 06:19:01 +00:00
function stopDisc ( ) -- Stops the music
disk.stopAudio ( )
renderPlayButton ( )
playing = false
status = defaultStatus
2021-05-06 14:22:19 +00:00
end
2021-05-07 06:19:01 +00:00
function renderPlayButton ( ) -- Renders the Play button
2021-05-07 04:52:48 +00:00
paintutils.drawFilledBox ( centerWidth - 4 , centerHeight - 4 , centerWidth + 4 , centerHeight + 2 , accentColor )
2021-05-07 04:48:14 +00:00
paintutils.drawFilledBox ( centerWidth - 2 , centerHeight - 3 , centerWidth - 1 , centerHeight + 1 , buttonColor )
2021-05-07 04:52:48 +00:00
paintutils.drawFilledBox ( centerWidth , centerHeight - 2 , centerWidth + 1 , centerHeight , buttonColor )
paintutils.drawPixel ( centerWidth + 2 , centerHeight - 1 , buttonColor )
2021-05-06 17:34:43 +00:00
end
2021-05-07 06:19:01 +00:00
function renderStopButton ( ) -- Renders the Stop button
paintutils.drawFilledBox ( centerWidth - 4 , centerHeight - 4 , centerWidth + 4 , centerHeight + 2 , accentColor )
2021-05-07 06:32:24 +00:00
paintutils.drawFilledBox ( centerWidth - 2 , centerHeight - 3 , centerWidth + 2 , centerHeight + 1 , buttonColor )
2021-05-07 06:19:01 +00:00
end
function renderEjectButton ( ) -- Renders the Eject button
paintutils.drawLine ( centerWidth - 2 , centerHeight + 4 , centerWidth + 2 , centerHeight + 4 , buttonColor )
term.setTextColor ( buttonColor )
term.setCursorPos ( centerWidth - 2 , centerHeight + 4 )
term.write ( ejectText )
statusPos ( )
end
function statusPos ( ) -- Resets the status position
term.setCursorPos ( 1 , 1 )
term.setTextColor ( textColor )
end
2021-05-07 06:32:24 +00:00
term.setBackgroundColor ( backgroundColor ) -- Setting the background color
renderPlayButton ( ) -- Rendering the play button
renderEjectButton ( ) -- Rendering the eject button
status = defaultStatus --Setting the
term.clear ( )
2021-05-07 06:19:01 +00:00
2021-05-07 06:32:24 +00:00
while true do
local eventData = { os.pullEvent ( ) }
local event = eventData [ 1 ]
if event == " mouse_up " then
if eventData [ 2 ] == 1 and x >= eventData [ 3 ] - 4 and eventData [ 4 ] >= centerHeight - 4 and eventData [ 3 ] <= centerWidth + 4 and eventData [ 4 ] <= centerHeight + 2 then
2021-05-07 06:19:01 +00:00
if playing == true then
stopDisc ( )
else
playDisc ( )
end
2021-05-07 06:32:24 +00:00
elseif eventData [ 2 ] == 1 and eventData [ 3 ] >= centerWidth - 2 and eventData [ 4 ] >= centerHeight + 4 and eventData [ 3 ] <= centerWidth + 2 and eventData [ 4 ] <= centerHeight + 4 then
2021-05-07 06:19:01 +00:00
ejectDisc ( )
end
2021-05-07 06:32:24 +00:00
elseif event == " monitor_touch " then
if eventData [ 4 ] >= centerWidth - 4 and eventData [ 5 ] >= centerHeight - 4 and eventData [ 4 ] <= centerWidth + 4 and eventData [ 5 ] <= centerHeight + 2 then
if playing == true then
2021-05-07 06:19:01 +00:00
stopDisc ( )
else
playDisc ( )
end
2021-05-07 06:32:24 +00:00
elseif eventData [ 4 ] >= centerWidth - 2 and eventData [ 5 ] >= centerHeight + 4 and eventData [ 4 ] <= centerWidth + 2 and eventData [ 5 ] <= centerHeight + 4 then
ejectDisc ( )
end
elseif event == " key_up " then
local name = keys.getName ( eventData [ 2 ] ) or " unknown key "
if name == " space " then
if playing == true then
stopDisc ( )
else
playDisc ( )
end
elseif name == " q " then
os.exit ( )
end
end
2021-05-07 06:19:01 +00:00
end