bob558

clock

Dec 26th, 2015
68
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- http://computercraft.ru/blog/3/entry-360-finger-clock/
  2.  
  3. MT_BG    = 0x000000 -- Цвет фона при режиме показа внутриигрового времени.
  4. MT_FG    = 0xFFFFFF  -- Цвет текста при режиме показа внутриигрового времени.
  5. DAY      = 0xFFFF00 -- Цвет надписи "Day".
  6. EVENING  = 0x202080 -- Цвет надписи "Evening".
  7. NIGHT    = 0x000080 -- Цвет надписи "Night".
  8. MORNING  = 0x404000 -- Цвет надписи "Morning".
  9. RT_BG    = 0x000000 -- Цвет фона при режиме показа реального времени.
  10. RT_FG    = 0xFFFFFF -- Цвет текста при режиме показа реального времени.
  11. TIMEZONE = 0 -- Часовой пояс (от -12 до 12).
  12. CORRECT  = 0
  13. W, H     = 40, 8 -- Разрешение экрана. Рекомендуется 40x8.
  14. REDSTONE = false --[[  Если параметр будет установлен в true,
  15.                           программа будет сменять режимы при изменении
  16.                           редстоун-сигнала.                                     ]]--
  17. TOUCH    = true --[[  Если параметр будет установлен в true,
  18.                           программа будет сменять режимы по клику
  19.                           мышкой по экрану.                                     ]]--
  20. KEY1     = 13 -- Коды клавиши. По умолчанию — [Enter].0
  21. KEY2     = 28
  22. SHOWSECS = true --[[  Режим, который активируется при запуске программы.
  23.                           true — режим внутриигрового времени,
  24.                           false — режим реального времени.                      ]]--
  25. AUTOMODE = true --[[  Позволяет скрывать секунды в режиме реального времени
  26.                           при значении, равном false.                           ]]--
  27. SWDATEMT = true -- Показывать внутриигровую дату.
  28. SWDATERT = true -- Показывать реальную дату.
  29. SWDTMMT  = true -- Показывать внутриигровое время суток.
  30. SWDTMRT  = true -- Показывать реальное время суток.
  31.  
  32. local com     = require("component")
  33. local gpu     = com.gpu
  34. local unicode = require("unicode")
  35. local fs      = require("filesystem")
  36. local event   = require("event")
  37. local term    = require("term")
  38.  
  39. oldw, oldh = gpu.getResolution()
  40. gpu.setResolution(W, H)
  41. w, h = gpu.getResolution()
  42. mode = AUTOMODE
  43. noExit = true
  44.  
  45. tz = TIMEZONE + CORRECT
  46. local nums = {}
  47. nums[0] = {"███", "█ █", "█ █", "█ █", "███"}
  48. nums[1] = {"██ ", " █ ", " █ ", " █ ", "███"}
  49. nums[2] = {"███", "  █", "███", "█  ", "███"}
  50. nums[3] = {"███", "  █", "███", "  █", "███"}
  51. nums[4] = {"█ █", "█ █", "███", "  █", "  █"}
  52. nums[5] = {"███", "█  ", "███", "  █", "███"}
  53. nums[6] = {"███", "█  ", "███", "█ █", "███"}
  54. nums[7] = {"███", "  █", "  █", "  █", "  █"}
  55. nums[8] = {"███", "█ █", "███", "█ █", "███"}
  56. nums[9] = {"███", "█ █", "███", "  █", "███"}
  57.  
  58. dts = {}
  59. dts[1] = "Night"
  60. dts[2] = "Morning"
  61. dts[3] = "Day"
  62. dts[4] = "Evening"
  63.  
  64. local function centerX(str)
  65.   local len
  66.   if type(str) == "string" then
  67.     len = unicode.len(str)
  68.   elseif type(str) == "number" then
  69.     len = str
  70.   else
  71.     error("Number excepted")
  72.   end
  73.   local whereW, _ = math.modf(w / 2)
  74.   local whereT, _ = math.modf(len / 2)
  75.   local where = whereW - whereT + 1
  76.   return where
  77. end
  78.  
  79. local function centerY(lines)
  80.   local whereH, _ = math.modf(h / 2)
  81.   local whereT, _ = math.modf(lines / 2)
  82.   local where = whereH - whereT + 1
  83.   return where
  84. end
  85.  
  86. local t_correction = tz * 3600
  87.  
  88. local function getTime()
  89.     local file = io.open('/tmp/clock.dt', 'w')
  90.     file:write('')
  91.     file:close()
  92.     local lastmod = tonumber(string.sub(fs.lastModified('/tmp/clock.dt'), 1, -4)) + t_correction
  93.  
  94.     local year = os.date('%Y', lastmod)
  95.     local month = os.date('%m', lastmod)
  96.     local day = os.date('%d', lastmod)
  97.     local weekday = os.date('%A', lastmod)
  98.     local hour = os.date('%H', lastmod)
  99.     local minute  = os.date('%M', lastmod)
  100.     local sec  = os.date('%S', lastmod)
  101.     return year, month, day, weekday, hour, minute, sec
  102. end
  103.  
  104. local function sn(num)
  105.   -- SplitNumber
  106.   local n1, n2
  107.   if num >= 10 then
  108.     n1, n2 = tostring(num):match("(%d)(%d)")
  109.     n1, n2 = tonumber(n1), tonumber(n2)
  110.   else
  111.     n1, n2 = 0, num
  112.   end
  113.   return n1, n2
  114. end
  115.  
  116. local function drawNumbers(hh, mm, ss)
  117.   local firstLine = centerY(5)
  118.   local n1, n2, n3, n4, n5, n6
  119.   n1, n2 = sn(hh)
  120.   n3, n4 = sn(mm)
  121.   if ss ~= nil then
  122.     n5, n6 = sn(ss)
  123.   end
  124. --print(n1, n2, n3, n4, n5, n6, type(n1))
  125.   for i = 1, 5, 1 do
  126.     local sep
  127.     if i == 2 or i == 4 then
  128.       sep = " . "
  129.     else
  130.       sep = "   "
  131.     end
  132.     local lineToDraw = ""
  133.     if ss ~= nil then
  134.       lineToDraw = nums[n1][i] .. "  " .. nums[n2][i] .. sep .. nums[n3][i] .. "  " .. nums[n4][i] .. sep .. nums[n5][i] .. "  " .. nums[n6][i]
  135.     else
  136.       lineToDraw = nums[n1][i] .. "  " .. nums[n2][i] .. sep .. nums[n3][i] .. "  " .. nums[n4][i]
  137.     end
  138.     gpu.set(centerX(lineToDraw), firstLine + i - 1, lineToDraw)
  139.   end
  140. end
  141.  
  142. local function setDaytimeColor(hh, mm)
  143.   local daytime
  144.   if (hh == 19 and mm >= 30) or (hh > 19 and hh < 22) then
  145.     daytime = 4
  146.     gpu.setForeground(EVENING)
  147.   elseif hh >= 22 or hh < 6 then
  148.     daytime = 1
  149.     gpu.setForeground(NIGHT)
  150.   elseif hh >= 6 and hh < 12 then
  151.     daytime = 2
  152.     gpu.setForeground(MORNING)
  153.   elseif (hh >= 12 and hh < 19) or (hh == 19 and mm < 30) then
  154.     daytime = 3
  155.     gpu.setForeground(DAY)
  156.   end
  157.   return daytime
  158. end
  159.  
  160. local function drawMT()
  161.   local year, month, day, hh, mm = os.date():match("(%d+)/(%d+)/(%d+)%s(%d+):(%d+):%d+")
  162.   hh, mm = tonumber(hh), tonumber(mm)
  163.   gpu.fill(1, 1, w, h, " ")
  164.   drawNumbers(hh, mm)
  165.   if SWDTMMT then
  166.     local dtm = setDaytimeColor(hh, mm)
  167.     gpu.set(centerX(dts[dtm]), centerY(5) - 1, dts[dtm])
  168.   end
  169.   gpu.setForeground(MT_FG)
  170.   if SWDATEMT then
  171.     gpu.set(centerX(year .. "/" .. month .. "/" .. day), centerY(1) + 3, year .. "/" .. month .. "/" .. day)
  172.   end
  173. end
  174.  
  175. local function drawRT()
  176.   local year, month, day, wd, hh, mm, ss = getTime()
  177.   gpu.fill(1, 1, w, h, " ")
  178.   hh, mm, ss = tonumber(hh), tonumber(mm), tonumber(ss)
  179.   if not SHOWSECS then
  180.     ss = nil
  181.   end
  182.   drawNumbers(hh, mm, ss)
  183.   if SWDTMRT then
  184.     local dtm = setDaytimeColor(hh, mm)
  185.     gpu.set(centerX(dts[dtm]), centerY(5) - 1, dts[dtm])
  186.   end
  187.   gpu.setForeground(RT_FG)
  188.   local infoLine = wd .. ", " .. year .. "/" .. month .. "/" .. day .. "::GMT" .. TIMEZONE
  189.   if SWDATERT then
  190.     gpu.set(centerX(infoLine), centerY(1) + 3, infoLine)
  191.   end
  192. end
  193.  
  194. local function cbFunc()
  195.   if mode == true then mode = false gpu.setBackground(RT_BG) gpu.setForeground(RT_FG) else mode = true gpu.setBackground(MT_BG) gpu.setForeground(MT_FG) end
  196. end
  197.  
  198. local function checkKey(name, addr, key1, key2)
  199.   if key1 == KEY1 and key2 == KEY2 then
  200.     noExit = false
  201.   end
  202. end
  203.  
  204. gpu.fill(1, 1, w, h, " ")
  205. if TOUCH then
  206.   event.listen("touch", cbFunc)
  207. end
  208. if REDSTONE then
  209.   event.listen("redstone_changed", cbFunc)
  210. end
  211. event.listen("key_down", checkKey)
  212. term.setCursor(1, 1)
  213. while noExit do
  214.   if mode == true then
  215.     drawMT()
  216.   else
  217.     drawRT()
  218.   end
  219.   os.sleep(1)
  220. end
  221. gpu.setForeground(0xFFFFFF)
  222. gpu.setBackground(0x000000)
  223. gpu.setResolution(oldw, oldh)
  224. gpu.fill(1, 1, oldw, oldh, " ")
RAW Paste Data Copied