mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 19:19:21 +01:00
380 lines
9.7 KiB
Lua
Executable File
380 lines
9.7 KiB
Lua
Executable File
local ecs = require("ECSAPI")
|
||
local fs = require("filesystem")
|
||
local event = require("event")
|
||
local component = require("component")
|
||
local gpu = component.gpu
|
||
|
||
--Список месяцев
|
||
local months = {
|
||
"Январь",
|
||
"Февраль",
|
||
"Март",
|
||
"Апрель",
|
||
"Май",
|
||
"Июнь",
|
||
"Июль",
|
||
"Август",
|
||
"Сентябрь",
|
||
"Октябрь",
|
||
"Ноябрь",
|
||
"Декабрь",
|
||
}
|
||
|
||
--Количество дней в месяцах
|
||
local countOfDays = {
|
||
31,
|
||
28,
|
||
31,
|
||
30,
|
||
31,
|
||
30,
|
||
31,
|
||
31,
|
||
30,
|
||
31,
|
||
30,
|
||
31,
|
||
}
|
||
|
||
--Сдвиг дня недели по дате в каждом месяце
|
||
local monthDateMove = {
|
||
3,
|
||
2,
|
||
3,
|
||
2,
|
||
3,
|
||
2,
|
||
3,
|
||
3,
|
||
2,
|
||
3,
|
||
2,
|
||
3,
|
||
}
|
||
|
||
--Графика
|
||
local numbers = {
|
||
["1"] = {
|
||
{0, 1, 0},
|
||
{0, 1, 0},
|
||
{0, 1, 0},
|
||
{0, 1, 0},
|
||
{0, 1, 0},
|
||
},
|
||
["2"] = {
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{1, 1, 1},
|
||
{1, 0, 0},
|
||
{1, 1, 1},
|
||
},
|
||
["3"] = {
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
["4"] = {
|
||
{1, 0, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{0, 0, 1},
|
||
},
|
||
["5"] = {
|
||
{1, 1, 1},
|
||
{1, 0, 0},
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
["6"] = {
|
||
{1, 1, 1},
|
||
{1, 0, 0},
|
||
{1, 1, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
["7"] = {
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{0, 0, 1},
|
||
{0, 0, 1},
|
||
{0, 0, 1},
|
||
},
|
||
["8"] = {
|
||
{1, 1, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
["9"] = {
|
||
{1, 1, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
{0, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
["0"] = {
|
||
{1, 1, 1},
|
||
{1, 0, 1},
|
||
{1, 0, 1},
|
||
{1, 0, 1},
|
||
{1, 1, 1},
|
||
},
|
||
}
|
||
|
||
--Всякие переменные
|
||
local constants = {
|
||
xSpaceBetweenNumbers = 2,
|
||
ySpaceBetweenNumbers = 1,
|
||
xSpaceBetweenMonths = 4,
|
||
ySpaceBetweenMonths = 1,
|
||
currentYear = 2015,
|
||
currentMonth = 9,
|
||
currentDay = 26,
|
||
programYear = 2015,
|
||
programMonth = 1,
|
||
proramDay = 1,
|
||
usualDayColor = 0x262626,
|
||
weekendColor = 0x880000,
|
||
backgroundColor = 0xEEEEEE,
|
||
dayNamesColor = 0x888888,
|
||
monthsColor = 0xCC0000,
|
||
currentDayColor = 0xFFFFFF,
|
||
bigNumberColor = 0x262626,
|
||
}
|
||
|
||
local xMax, yMax = gpu.maxResolution()
|
||
|
||
--Объекты для тача
|
||
local obj = {}
|
||
local function newObj(class, name, ...)
|
||
obj[class] = obj[class] or {}
|
||
obj[class][name] = {...}
|
||
end
|
||
|
||
--Проверка года на "високосность"
|
||
local function visokosniy(year)
|
||
if year % 4 == 0 or year % 400 == 0 then return true else return false end
|
||
end
|
||
|
||
--Отрисовать месяц
|
||
local function drawMonth(x, y, firstDay, countOfDays, year, month)
|
||
|
||
local xPos, yPos = x, y + 4
|
||
local counter = 1
|
||
local startDrawing = false
|
||
local separator = string.rep(" ", constants.xSpaceBetweenNumbers)
|
||
ecs.colorText(x, y, constants.monthsColor, months[month])
|
||
ecs.colorText(x, y + 2, constants.dayNamesColor,"Пн"..separator.."Вт"..separator.."Ср"..separator.."Чт"..separator.."Пт"..separator.."Сб"..separator.."Вс")
|
||
for j = 1, 6 do
|
||
xPos = x
|
||
for i = 1, 7 do
|
||
if i < 6 then gpu.setForeground(constants.usualDayColor) else gpu.setForeground(constants.weekendColor) end
|
||
if counter == constants.currentDay and year == constants.currentYear and month == constants.currentMonth then ecs.square(xPos-1, yPos, 4, 1, constants.weekendColor); gpu.setForeground(constants.currentDayColor) else gpu.setBackground(constants.backgroundColor) end
|
||
if counter > countOfDays then break end
|
||
if i >= firstDay then startDrawing = true end
|
||
if startDrawing then gpu.set(xPos, yPos, tostring(counter)); counter = counter + 1 end
|
||
xPos = xPos + constants.xSpaceBetweenNumbers + 2
|
||
end
|
||
yPos = yPos + constants.ySpaceBetweenNumbers + 1
|
||
end
|
||
end
|
||
|
||
--Получить номер следующего дня
|
||
local function getNextDay(day)
|
||
if day < 7 then
|
||
return (day + 1)
|
||
else
|
||
return 1
|
||
end
|
||
end
|
||
|
||
--Просчитать данные о годе
|
||
local function calculateYear(year, dayOf1Jan)
|
||
local massivGoda = {}
|
||
local visokosniy = visokosniy(year)
|
||
|
||
local firstDayPosition = dayOf1Jan
|
||
|
||
--Получаем количество дней в каждом месяце
|
||
for month = 1, 12 do
|
||
--Создаем подмассив месяца в массиве года
|
||
massivGoda[month] = {}
|
||
--Если это февраль
|
||
if month == 2 then
|
||
--Если год високосный
|
||
if visokosniy then
|
||
massivGoda[month].countOfDays = 29
|
||
massivGoda[month].firstDayPosition = firstDayPosition
|
||
firstDayPosition = getNextDay(firstDayPosition)
|
||
--Если не високосный
|
||
else
|
||
massivGoda[month].countOfDays = 28
|
||
massivGoda[month].firstDayPosition = firstDayPosition
|
||
end
|
||
--Если не февраль
|
||
else
|
||
massivGoda[month].countOfDays = countOfDays[month]
|
||
massivGoda[month].firstDayPosition = firstDayPosition
|
||
for i = 1, monthDateMove[month] do
|
||
firstDayPosition = getNextDay(firstDayPosition)
|
||
end
|
||
end
|
||
end
|
||
|
||
return massivGoda
|
||
end
|
||
|
||
--Получить день недели первого января указанного года
|
||
local function polu4itDenNedeliPervogoJanvarja(year, debug)
|
||
local den = 0
|
||
|
||
local difference = math.abs(year - 1010)
|
||
local koli4estvoVisokosnih
|
||
|
||
if difference % 4 == 0 then
|
||
koli4estvoVisokosnih = difference / 4
|
||
elseif difference % 4 == 1 then
|
||
koli4estvoVisokosnih = math.floor(difference / 4)
|
||
elseif difference % 4 == 2 then
|
||
koli4estvoVisokosnih = math.floor(difference / 4)
|
||
elseif difference % 4 == 3 then
|
||
koli4estvoVisokosnih = math.floor(difference / 4) + 1
|
||
end
|
||
|
||
local sdvig = difference + koli4estvoVisokosnih
|
||
|
||
if sdvig % 7 == 0 then
|
||
den = 1
|
||
else
|
||
den = sdvig % 7 + 1
|
||
end
|
||
|
||
if debug then
|
||
print("Год: "..year)
|
||
print("Разница в годах: "..difference)
|
||
print("Кол-во високосных: "..koli4estvoVisokosnih)
|
||
print("Сдвиг по дням: "..sdvig)
|
||
print("День недели: "..den)
|
||
print(" ")
|
||
end
|
||
|
||
return den
|
||
end
|
||
|
||
--Нарисовать календарь
|
||
local function drawCalendar(xPos, yPos, year)
|
||
ecs.square(xPos, yPos, 120, 48, constants.backgroundColor)
|
||
--Получаем позицию первого января указанного года
|
||
local janFirst = polu4itDenNedeliPervogoJanvarja(year)
|
||
--Получаем массив года
|
||
local massivGoda = calculateYear(year, janFirst)
|
||
|
||
--Перебираем массив года
|
||
for i = 1, #massivGoda do
|
||
--Рисуем месяц
|
||
drawMonth(xPos, yPos, massivGoda[i].firstDayPosition, massivGoda[i].countOfDays, year, i)
|
||
--Корректируем коорды
|
||
xPos = xPos + constants.xSpaceBetweenMonths + 27
|
||
if i % 4 == 0 then xPos = 3; yPos = yPos + constants.ySpaceBetweenMonths + 15 end
|
||
end
|
||
end
|
||
|
||
local function drawSymbol(x, y, symbol)
|
||
local xPos, yPos = x, y
|
||
for j = 1, #numbers[symbol] do
|
||
xPos = x
|
||
for i = 1, #numbers[symbol][j] do
|
||
if numbers[symbol][j][i] ~= 0 then
|
||
gpu.set(xPos, yPos, " ")
|
||
end
|
||
xPos = xPos + 2
|
||
end
|
||
yPos = yPos + 1
|
||
end
|
||
end
|
||
|
||
local function drawYear(x, y, year)
|
||
year = tostring(year)
|
||
for i = 1, #year do
|
||
drawSymbol(x, y, string.sub(year, i, i))
|
||
x = x + 8
|
||
end
|
||
end
|
||
|
||
local next, prev
|
||
|
||
local function drawInfo()
|
||
local xPos, yPos = 127, 4
|
||
ecs.square(xPos, yPos, 30, 5, constants.backgroundColor)
|
||
gpu.setBackground(constants.bigNumberColor)
|
||
drawYear(xPos, yPos, constants.programYear)
|
||
yPos = yPos + 6
|
||
|
||
local name = "Следующий год"; newObj("Buttons", name, ecs.drawButton(xPos, yPos, 30, 3, name, 0xDDDDDD, 0x262626)); yPos = yPos + 4
|
||
name = "Предыдущий год"; newObj("Buttons", name, ecs.drawButton(xPos, yPos, 30, 3, name, 0xDDDDDD, 0x262626)); yPos = yPos + 4
|
||
name = "Выйти"; newObj("Buttons", name, ecs.drawButton(xPos, yPos, 30, 3, name, 0xDDDDDD, 0x262626)); yPos = yPos + 4
|
||
|
||
end
|
||
|
||
local function drawAll()
|
||
--Очищаем экран
|
||
ecs.square(1, 1, xMax, yMax, constants.backgroundColor)
|
||
--Рисуем календарик
|
||
drawCalendar(3, 2, constants.programYear)
|
||
--Рисуем парашу
|
||
drawInfo()
|
||
end
|
||
|
||
--------------------------------------------------------------------------------------------------------------------
|
||
|
||
if xMax < 150 then error("This program requires Tier 3 GPU and Tier 3 Screen.") end
|
||
--Запоминаем старое разрешение экрана
|
||
local xOld, yOld = gpu.getResolution()
|
||
--Ставим максимальное
|
||
gpu.setResolution(xMax, yMax)
|
||
--Получаем данные о текущей дате (os.date выдает неверную дату и месяц, забавно)
|
||
constants.currentDay, constants.currentMonth, constants.currentYear = ecs.getHostTime(2)
|
||
constants.programDay, constants.programMonth, constants.programYear = constants.currentDay, constants.currentMonth, constants.currentYear
|
||
--Рисуем все
|
||
drawAll()
|
||
|
||
while true do
|
||
local e = {event.pull()}
|
||
if e[1] == "touch" then
|
||
for key in pairs(obj["Buttons"]) do
|
||
if ecs.clickedAtArea(e[3], e[4], obj["Buttons"][key][1], obj["Buttons"][key][2], obj["Buttons"][key][3], obj["Buttons"][key][4]) then
|
||
ecs.drawButton(obj["Buttons"][key][1], obj["Buttons"][key][2], 30, 3, key, constants.weekendColor, constants.currentDayColor)
|
||
os.sleep(0.2)
|
||
|
||
if key == "Следующий год" then
|
||
constants.programYear = constants.programYear + 1
|
||
elseif key == "Предыдущий год" then
|
||
constants.programYear = constants.programYear - 1
|
||
elseif key == "Выйти" then
|
||
gpu.setResolution(xOld, yOld)
|
||
ecs.prepareToExit()
|
||
return
|
||
end
|
||
|
||
drawInfo()
|
||
drawCalendar(3, 2, constants.programYear)
|
||
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|