SHARE
TWEET

Clock

Oeed Dec 20th, 2014 (edited) 244 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local _, err = pcall(function()
  2.         local timezones = {
  3.                 {'America/Los_Angeles', 'Los Angeles', 0},
  4.                 {'Europe/London', 'London', 0},
  5.                 {'Australia/Adelaide', 'Adelaide', 0},
  6.                 {'Pacific/Auckland', 'Auckland', 0}
  7.         }
  8.  
  9.         -- Thanks tobit for this
  10.         function drawCircle( centerX, centerY, radius, col, solid )
  11.             solid = solid or false
  12.             local isAdvanced = term.isColor and term.isColor()
  13.             local char = isAdvanced and " " or "|"
  14.             if isAdvanced then term.setBackgroundColor( col ) end
  15.             local radStep = 1/(1.5*radius)
  16.             for angle = 1, math.pi+radStep, radStep do
  17.                 local pX = math.cos( angle ) * radius * 1.5
  18.                 local pY = math.sin( angle ) * radius
  19.                 if solid then
  20.                     local chord = 2*math.abs(pX)
  21.                     term.setCursorPos( centerX - chord/2, centerY - pY )
  22.                     write( char:rep( chord ) )
  23.                     term.setCursorPos( centerX - chord/2, centerY + pY )
  24.                     write( char:rep( chord ) )
  25.                 else
  26.                     for i=-1,1,2 do
  27.                         for j=-1,1,2 do
  28.                             term.setCursorPos( centerX + i*pX, centerY + j*pY )
  29.                             write( char )
  30.                         end
  31.                     end
  32.                 end
  33.             end
  34.         end
  35.  
  36.         local function drawClock(timezone)
  37.                 local night = false
  38.                 local time = timezones[timezone][3]
  39.                 if time <= 6 or time >= 18 then
  40.                         night = true
  41.                 end
  42.  
  43.                 local w, h = term.getSize()
  44.                 term.setBackgroundColour(colours.black)
  45.                 term.clear()
  46.                 local centerX, centerY = math.ceil(w/2)+1, math.ceil(h/2)
  47.                 drawCircle(centerX, centerY, math.ceil(h/2), (night and colours.grey or colours.white), true)
  48.  
  49.  
  50.                 for i = 0, 11 do
  51.                         local minDeg = i * 2 * math.pi / 12
  52.                     hyp1 = math.ceil(h/2) - 1
  53.                     _w1 = math.cos(minDeg) * hyp1 * 1.5
  54.                     _h1 = math.sin(minDeg) * hyp1
  55.                     hyp2 = math.ceil(h/2) - 4
  56.                     _w2 = math.cos(minDeg) * hyp2 * 1.5
  57.                     _h2 = math.sin(minDeg) * hyp2
  58.  
  59.                         paintutils.drawLine(centerX + _w1, centerY + _h1, centerX + _w2, centerY + _h2, colours.lightGrey)
  60.                 end
  61.  
  62.             local hour = time % 12
  63.             local minute = math.floor((time - math.floor(time))*60)
  64.  
  65.             local hourDeg = hour * 2 * math.pi / 12 - math.pi/2
  66.             local hyp = math.ceil(h/2) - 6
  67.             local _w = math.cos(hourDeg) * hyp * 1.5
  68.             local _h = math.sin(hourDeg) * hyp
  69.                 paintutils.drawLine(centerX, centerY, centerX + _w, centerY + _h, (night and colours.white or colours.black))
  70.  
  71.             local minDeg = minute * 2 * math.pi / 60 - math.pi/2
  72.             hyp = math.ceil(h/2) - 3
  73.             _w = math.cos(minDeg) * hyp * 1.5
  74.             _h = math.sin(minDeg) * hyp
  75.                 paintutils.drawLine(centerX, centerY, centerX + _w, centerY + _h, colours.red)
  76.         end
  77.  
  78.         local monitors = {}
  79.         local sides = {'front','right', 'back', 'left'}
  80.  
  81.         for i, v in ipairs(sides) do
  82.                 if peripheral.getType(v) == 'modem' then
  83.                         local tRemote = peripheral.call( v, "getNamesRemote" )
  84.                         monitors[i] = {}
  85.                         for i2, name in ipairs(tRemote) do
  86.                                 if peripheral.getType(name) == 'monitor' then
  87.                                         local m = peripheral.wrap(name)
  88.                                         local w,h = m.getSize()
  89.                                         if h == 40 then
  90.                                                 monitors[i][1] = m
  91.                                         else
  92.                                                 monitors[i][2] = m
  93.                                                 m.setTextScale(4)
  94.                                         end
  95.                                 end
  96.                         end
  97.                 end
  98.         end
  99.  
  100.         local function drawTimezone(i)
  101.                 local w, h = term.getSize()
  102.                 term.setBackgroundColour(colours.black)
  103.                 term.clear()
  104.                 local name = timezones[i][2]
  105.                 term.setCursorPos(math.ceil((w - #name)/2) + 1, 1)
  106.                 term.write(name)
  107.         end
  108.  
  109.         local function updateTimes()
  110.                 os.startTimer(60)
  111.                 for i, v in ipairs(timezones) do
  112.                         v[3] = v[3] + 1/60
  113.                 end
  114.         end
  115.  
  116.         local function downloadTimes()
  117.                 for i, v in ipairs(timezones) do
  118.                         local h = http.get('http://api.timezonedb.com/?zone='..v[1]..'&key=ASEPIBTKXXQA')
  119.                         local s = h.readAll()
  120.                         local t = s:match('<timestamp>(%d+)</timestamp>')
  121.                         v[3] = (t/60/60)%24
  122.                         print('Downloaded: '..v[2] .. ' ('..v[3]..')')
  123.                 end
  124.                 os.setAlarm(0)
  125.         end
  126.  
  127.         downloadTimes()
  128.         os.startTimer(60)
  129.         os.queueEvent('draw')
  130.  
  131.         while true do
  132.                 local event, detail = os.pullEvent()
  133.                 if event == 'alarm' then
  134.                         downloadTimes()
  135.                 elseif event == 'timer' then
  136.                         updateTimes()
  137.                 elseif event == 'char' and detail == '\\' then
  138.                         os.reboot()
  139.                 end
  140.  
  141.                 for i, v in ipairs(monitors) do
  142.                         term.redirect(v[2])
  143.                         drawTimezone(i)
  144.                         term.redirect(v[1])
  145.                         drawClock(i)
  146.                 end
  147.                 term.redirect(term.native())
  148.         end
  149. end)
  150. if err then
  151.         term.redirect(term.native())
  152.         printError(err)
  153.         os.startTimer(5)
  154.         print('Press any key to cancel reboot.')
  155.         local ev = os.pullEvent()
  156.         if ev == 'timer' then
  157.                 os.reboot()
  158.         end
  159. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top