Объясните как сделать так чтобы скрипт запускался в час ночи и выключался в 2 часа ночи.
Как это прописать.
Заранее благодарен за ответы.
// Скрипт 0
// должен работать с 1 до 2 часов ночи
.... код скрипта
end_script
// Скрипт 1 запускаем сразу (работает всё время)
set #startH 1 // Время старта скрипта 0 (час)
set #startM 0 // мин
set #endH 2 // Время остановки скрипта 0 (час)
set #endM 0 // мин
set #startT ( #startH * 60 ) + #startM // переводим в количество минут от полуночи
set #endT ( #endH * 60 ) + #endM
if #startT < endT
set #adTime 0
else // Диапазон времени пересекает полночь
set #adTime 24 * 60
set #endT #endT + #adTime
end_if
set #started 0 // флаг - "скрипт 0 не запущен"
:nachalo
set #curT ( hour * 60 ) + min // текущее значение минут от полуночи
if #curT < #startT
set #curT #curT + #adTime
end_if
if ( #startT <= #curT ) AND ( #curT <= #endT)
set #inTime 1 // Флаг - текущее время находится внутри рабочего диапазона
else
set #inTime 0
end_if
if ( #inTime = 1 ) AND ( #started = 0) // находимся в рабочем диапазоне и скрипт 0 не запущен
set #started 1
start_script 0 // запускаем скрипт 0
else
if ( #inTime = 0 ) AND ( #started > 0 ) // вышли за пределы рабочего диапазона и скрипт 0 запущен
set #started 0
stop_script 0 // останавливаем скрипт 0
end_if
end_if
wait 10s // ожидание
goto nachalo
set linedelay 0
set logging close
set logging open 0 0 1024 200
set logging clear
set logging __________________________________________
// В первой строке введите название события.
// Во второй строке режим напоминания.
// Флаги режима напоминания:
// + Одноразовая задача ( режим 0 )
// + Ежечасная ( режим 0 )
// + Ежедневная ( режим 0 )
// + Ежемесячная ( режим 0 )
// + Ежегодная ( режим 0 )
// 1-7 + Еженедельная (номер дня недели)
// Возможно еще добавлю:
// - Каждые N дней
// - Каждые № минут
// - Секунд??
// Далее по порядку в отдельных строках
// введите параметры от года до минут.
// Может отсутсвовать по _порядку_ (!!!) любое
// количество параметров даты начиная с года.
// Минуты обязательны.
set %event [ 1 1 ] Сделай то-то
set %event [ 1 2 ] 0
set %event [ 1 3 ] 10
set %event [ 1 4 ] 00
set %event [ 4 1 ] Сделай это
set %event [ 4 2 ] 0
set %event [ 4 3 ] 14
set %event [ 4 4 ] 00
set #eventCount size ( %event )
set %event [ 1 10 ] ""
set %clearEvent [ 1 40 ] ""
set $clear ""
set #nClearEvent 1
for #i 1 #eventCount 1 // Преобразовываем в удобоваримый вид %event
set $nameEvent %event [ #i 1 ]
if $nameEvent <> $clear // Исключаем пропущенные элементы массива (например, после удаления задания из середины).
set $modeElement %event [ #i 2 ]
if ( $modeElement < 0 ) or ( $modeElement > 7 ) // Проверяемя корректность выбранного режима проверки.
msg В событии ''$nameEvent'' неверно указан режим напоминания. Задайте режим в set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set $fistTimeParam %event [ #i 3 ]
if $fistTimeParam = $clear // Проверяем корректность введнного времени.
msg В событии ''$nameEvent'' отсутсвует или неверно указано время. Задайте время начиная с set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set %clearEvent [ #nClearEvent 1 ] %event [ #i 1 ] // Начинаем формирование "чистого" массива с событиями.
set %clearEvent [ #nClearEvent 2 ] %event [ #i 2 ]
set %clearEvent [ #nClearEvent 6 ] %event [ #i 1 ] \ %event [ #i 2 ] \ %event [ #i 3 ] \ // Делаем уникальный штамп евента для сравнения.
set #y 4
set $eventForWhile %event [ #i #y ]
while $eventForWhile <> $clear // Считаем количество введнных параметров события
set %clearEvent [ #nClearEvent 6 ] %clearEvent [ #nClearEvent 6 ] %event [ #i #y ] \ // Делаем уникальный штамп евента для сравнения.
set #y #y + 1
set $eventForWhile %event [ #i #y ]
end_while
set %clearEvent [ #nClearEvent 9 ] #y - 1
// set logging В событии ''%event [ #i 1 ]'' ( #nClearEvent реальное проверяемое) %clearEvent [ #nClearEvent 9 ] параметров.
// set logging Событие ''%event [ #i 1 ]'' добавлено в обработку.
set #countEventParam %clearEvent [ #nClearEvent 9 ]
if ( #countEventParam = 8 ) or ( #second = 1 ) // Прощитывать ли секунды.
set #yClearEvent 15
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
else
set #yClearEvent 14
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
end_if
set #nClearEvent #nClearEvent + 1
end_if
end_for
set #sizeClearEvent size ( %clearEvent )
for #nClearEvent 1 #sizeClearEvent 1 // Дублируем загруженные данные в область проверки. Разделение сделано для восстановления изменившихся данных в ходе работы.
for #i 10 15 1
set #timeCheck #i + 10
set %clearEvent [ #nClearEvent #timeCheck ] %clearEvent [ #nClearEvent #i ]
end_for
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ]
end_for
load_array %lastClearEvent Last_Clear_Event.txt
set #sizeLastClearEvent size ( %lastClearEvent )
for #nClearEvent 1 #sizeClearEvent 1
for #i 1 #sizeLastClearEvent 1
set $eventstamp %clearEvent [ #nClearEvent 6 ]
set $lastEventstamp %lastClearEvent [ #i 1 ]
if $eventstamp = $lastEventstamp
set %clearEvent [ #nClearEvent 7 ] %lastClearEvent [ #i 2 ]
break
end_if
end_for
end_for
set logging Задач загружено: #sizeClearEvent за timer мс
set logging Year Month Day Hour : Min : Sec
// Элементы массива %ClearEvent
// Максимальнальное значеие второй размерности: 20
// Содержание:
// 1 - название задачи.
// 2 - изначальный режим задачи загруженный из %event (ежедневная,
// одноразовая, ежемесечная и т.д.). Используется для восстановелнерия
// проверяемого режима, который меняется во время отсрочки задачи.
// 3 - 5 зарезервировано.
// 6 - слепленные через " \ " все элементы %event. Нужен для сличения
// загруженных элементов с таблицей прошлой работы скрипта.
// Сличение производится для загрузки таймштампа последнего
// оповещения о событии.
// 7 - содержит $lastHitTimestamp.
// Используется для определения было ли оповещение в задавнное время.
// Например: ежедневная задача на 14:00, сейчас 17:00.
// Сравнивая $lastHitTimestamp с $currentTimestamp мы определяем
// Выполнялась ли уже задача. В $lastHitTimestamp не (!!!) входят
// указанныепараметры события. Т.е. для примера выше будт содержаться:
// год, месяц, число.
// 8 - изначально загруженное количество элементов из %Event.
// Для отсечение секунд, если они не указаны.
// 9 - количество параметров в исходном %event [ i ].
// 19 - проверяемое количество параметров даты.
// Использыется для определения последнего не пустого столбца.
// Необходимо при определении границ параметров даты.
// 10 - 15 изначальные параметры даты задачи (год, месяц, день, час, минуты).
// 20 - 25 время следующего срабатывания.
set %dayInMonth [ 1 ] 31
set %dayInMonth [ 2 ] 28
set %dayInMonth [ 3 ] 31
set %dayInMonth [ 4 ] 30
set %dayInMonth [ 5 ] 31
set %dayInMonth [ 6 ] 30
set %dayInMonth [ 7 ] 31
set %dayInMonth [ 8 ] 31
set %dayInMonth [ 9 ] 30
set %dayInMonth [ 10 ] 31
set %dayInMonth [ 11 ] 30
set %dayInMonth [ 12 ] 31
set linedelay 1
:start
for #nClearEvent 1 #sizeClearEvent 1
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set #mode %clearEvent [ #nClearEvent 2 ]
if ( #mode > 0 ) and ( #mode < 8 )
gosub dayOfWeek
if #dayOfWeek <> #mode
continue
end_if
end_if
// if #mode = 0
set $currentTimestamp $clear
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
for #i 20 #endFor 1 // Формируем таймштамп
set $currentTimestamp $currentTimestamp %timeArr [ #i ] \
end_for
set $lastHitTimestamp %clearEvent [ #nClearEvent 7 ]
set logging $currentTimestamp == $lastHitTimestamp
if $currentTimestamp <> $lastHitTimestamp // Проверка была ли уже выполнена задача.
set #startFor 27 - %clearEvent [ #nClearEvent 19 ] // Вычисляем с какого элемента массива нам необходмо делать проверку. Зависит от количества введеных параметров даты.
set #endFor %clearEvent [ #nClearEvent 18 ]
// set logging #endFor
set #timeHit 0
for #i #startFor #endFor 1 // Сравнение введенных параметров времени с текущим временем.
// set logging %clearEvent [ #nClearEvent #i ]
set #timeElementOfEvent %clearEvent [ #nClearEvent #i ]
set #timeElementCurrentTime %timeArr [ #i ]
// set logging #nClearEvent #i #timeElementOfEvent <= #timeElementCurrentTime
if ( #timeElementOfEvent < #timeElementCurrentTime ) or ( ( #timeElementOfEvent = #timeElementCurrentTime ) and ( #i = #endFor ) )
set #timeHit 1
break
end_if
if #timeElementOfEvent = #timeElementCurrentTime
continue
end_if
break
end_for
if #timeHit = 1
alarm online
msg %clearEvent [ #nClearEvent 1 ]
set $addWaiting prompt ("Выполнено" "Напомнить через 15 минут" "Напомнить через 30 минут" "Напомнить через 1 час" "Другое" )
if $addWaiting = 1
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ] // Возвращаем изначальное количество проверяемых елементов.
set %clearEvent [ #nClearEvent 20 ] %clearEvent [ #nClearEvent 10 ]
set %clearEvent [ #nClearEvent 21 ] %clearEvent [ #nClearEvent 11 ]
set %clearEvent [ #nClearEvent 22 ] %clearEvent [ #nClearEvent 12 ]
set %clearEvent [ #nClearEvent 23 ] %clearEvent [ #nClearEvent 13 ]
set %clearEvent [ #nClearEvent 24 ] %clearEvent [ #nClearEvent 14 ]
set %clearEvent [ #nClearEvent 25 ] %clearEvent [ #nClearEvent 15 ]
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set $lastHitTimestamp $clear // Делаем корректный таймштамп (после отсрочек нельзя тупо присвоить #currentTimeStamp)
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
// set logging %clearEvent [ #nClearEvent 19 ] #endFor
for #n 20 #endFor 1 // Формируем таймштамп
set $lastHitTimestamp $lastHitTimestamp %timeArr [ #n ] \
end_for
set %clearEvent [ #nClearEvent 7 ] $lastHitTimestamp
save_array %clearEvent 1 6 -1 2 last_clear_event.txt
break
end_if
set %clearEvent [ #nClearEvent 19 ] 7
set #y Year// Формируем дату для последующего пересчета ( например 67 мин = 1 час 7 мин)
set #mo Month
set #d Day
set #h Hour
set #m Min
set #s Sec
if $addWaiting = 0
set #m #m + 5
end_if
if $addWaiting = 2
set #m #m + 15
end_if
if $addWaiting = 3
set #m #m + 30
end_if
if $addWaiting = 4
set #h #h + 1
end_if
if $addWaiting = 5
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
end_if
gosub timeCalc
// set logging #y #mo #d #h #m #s
set %clearEvent [ #nClearEvent 20 ] #y
set %clearEvent [ #nClearEvent 21 ] #mo
set %clearEvent [ #nClearEvent 22 ] #d
set %clearEvent [ #nClearEvent 23 ] #h
set %clearEvent [ #nClearEvent 24 ] #m
set %clearEvent [ #nClearEvent 25 ] #s
continue
end_if // Если время устроило - показываем таблички.
end_if // Проверка была ли уже выполнена задача.
continue
// end_if // if #mode = 0 ежесекундный/минутный/часный/дневный/годный режим.
end_for // Перебор всех существующих задач (%clearEvent)
goto start
:timeCalc // Пересчитываем дату ( например 67 мин = 1 час 7 мин).
if #s > 59
set #m #m + #s / 60
set #s #s - #s / 60 * 60
end_if
if #m > 59
set #h #h + #m / 60
set #m #m - #m / 60 * 60
end_if
if #h > 23
set #d #d + #h / 24
set #h #h - #h / 24 * 24
end_if
while #d > 28
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12 + 1
end_if
set #dayInMonth %dayInMonth [ #mo ]
if #mo = 2
set #ymod ( #y - #y / 400 * 400 ) * ( #y - #y / 4 * 4 + ( #y - #y / 100 * 100 - 100 ) / 100 ) // Високосный ли год. Вернет 0, если високосный.
if #ymod = 0
set #dayInMonth #dayInMonth + 1
end_if
end_if
set #addMo #d / ( #dayInMonth + 1 )
if #addMo > 0
set #mo #mo + 1
set #d #d - #dayInMonth
else
break
end_if
end_while
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12
end_if
return
:dayOfWeek
if Month > 2 // Расчет дня недели.
set #m Month -2
set #century Year / 100
set #yearr Year - #century * 100
else
set #m Month +10
set #yearr Year - Year / 100 * 100 - 1
set #century #y / 100
end_if
set #dayOfWeek Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
// set logging Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
set #dayOfWeek #dayOfWeek - #dayOfWeek / 7 * 7
if #dayOfWeek = 0
set #dayOfWeek 7
end_if
// set logging #dayOfWeek
return
set linedelay 0
set logging close
set logging open 0 0 1024 200
set logging clear
set logging __________________________________________
// В первой строке введите название события.
// Во второй строке режим напоминания.
// Флаги режима напоминания:
// + Одноразовая задача ( режим 0 )
// + Ежечасная ( режим 0 )
// + Ежедневная ( режим 0 )
// + Ежемесячная ( режим 0 )
// + Ежегодная ( режим 0 )
// 1-7 + Еженедельная (номер дня недели)
// Возможно еще добавлю:
// - Каждые N дней
// - Каждые № минут
// - Секунд??
// Далее по порядку в отдельных строках
// введите параметры от года до минут.
// Может отсутсвовать по _порядку_ (!!!) любое
// количество параметров даты начиная с года.
// Минуты обязательны.
set %event [ 1 1 ] Сделай то-то
set %event [ 1 2 ] 0
set %event [ 1 3 ] 10
set %event [ 1 4 ] 00
set %event [ 4 1 ] Сделай это
set %event [ 4 2 ] 0
set %event [ 4 3 ] 14
set %event [ 4 4 ] 00
set #eventCount size ( %event )
set %event [ 1 10 ] ""
set %clearEvent [ 1 40 ] ""
set $clear ""
set #nClearEvent 1
for #i 1 #eventCount 1 // Преобразовываем в удобоваримый вид %event
set $nameEvent %event [ #i 1 ]
if $nameEvent <> $clear // Исключаем пропущенные элементы массива (например, после удаления задания из середины).
set $modeElement %event [ #i 2 ]
if ( $modeElement < 0 ) or ( $modeElement > 7 ) // Проверяемя корректность выбранного режима проверки.
msg В событии ''$nameEvent'' неверно указан режим напоминания. Задайте режим в set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set $fistTimeParam %event [ #i 3 ]
if $fistTimeParam = $clear // Проверяем корректность введнного времени.
msg В событии ''$nameEvent'' отсутсвует или неверно указано время. Задайте время начиная с set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set %clearEvent [ #nClearEvent 1 ] %event [ #i 1 ] // Начинаем формирование "чистого" массива с событиями.
set %clearEvent [ #nClearEvent 2 ] %event [ #i 2 ]
set %clearEvent [ #nClearEvent 6 ] %event [ #i 1 ] \ %event [ #i 2 ] \ %event [ #i 3 ] \ // Делаем уникальный штамп евента для сравнения.
set #y 4
set $eventForWhile %event [ #i #y ]
while $eventForWhile <> $clear // Считаем количество введнных параметров события
set %clearEvent [ #nClearEvent 6 ] %clearEvent [ #nClearEvent 6 ] %event [ #i #y ] \ // Делаем уникальный штамп евента для сравнения.
set #y #y + 1
set $eventForWhile %event [ #i #y ]
end_while
set %clearEvent [ #nClearEvent 9 ] #y - 1
// set logging В событии ''%event [ #i 1 ]'' ( #nClearEvent реальное проверяемое) %clearEvent [ #nClearEvent 9 ] параметров.
// set logging Событие ''%event [ #i 1 ]'' добавлено в обработку.
set #countEventParam %clearEvent [ #nClearEvent 9 ]
if ( #countEventParam = 8 ) or ( #second = 1 ) // Прощитывать ли секунды.
set #yClearEvent 15
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
else
set #yClearEvent 14
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
end_if
set #nClearEvent #nClearEvent + 1
end_if
end_for
set #sizeClearEvent size ( %clearEvent )
for #nClearEvent 1 #sizeClearEvent 1 // Дублируем загруженные данные в область проверки. Разделение сделано для восстановления изменившихся данных в ходе работы.
for #i 10 15 1
set #timeCheck #i + 10
set %clearEvent [ #nClearEvent #timeCheck ] %clearEvent [ #nClearEvent #i ]
end_for
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ]
end_for
load_array %lastClearEvent Last_Clear_Event.txt
set #sizeLastClearEvent size ( %lastClearEvent )
for #nClearEvent 1 #sizeClearEvent 1
for #i 1 #sizeLastClearEvent 1
set $eventstamp %clearEvent [ #nClearEvent 6 ]
set $lastEventstamp %lastClearEvent [ #i 1 ]
if $eventstamp = $lastEventstamp
set %clearEvent [ #nClearEvent 7 ] %lastClearEvent [ #i 2 ]
break
end_if
end_for
end_for
set logging Задач загружено: #sizeClearEvent за timer мс
set logging Year Month Day Hour : Min : Sec
// Элементы массива %ClearEvent
// Максимальнальное значеие второй размерности: 20
// Содержание:
// 1 - название задачи.
// 2 - изначальный режим задачи загруженный из %event (ежедневная,
// одноразовая, ежемесечная и т.д.). Используется для восстановелнерия
// проверяемого режима, который меняется во время отсрочки задачи.
// 3 - 5 зарезервировано.
// 6 - слепленные через " \ " все элементы %event. Нужен для сличения
// загруженных элементов с таблицей прошлой работы скрипта.
// Сличение производится для загрузки таймштампа последнего
// оповещения о событии.
// 7 - содержит $lastHitTimestamp.
// Используется для определения было ли оповещение в задавнное время.
// Например: ежедневная задача на 14:00, сейчас 17:00.
// Сравнивая $lastHitTimestamp с $currentTimestamp мы определяем
// Выполнялась ли уже задача. В $lastHitTimestamp не (!!!) входят
// указанныепараметры события. Т.е. для примера выше будт содержаться:
// год, месяц, число.
// 8 - изначально загруженное количество элементов из %Event.
// Для отсечение секунд, если они не указаны.
// 9 - количество параметров в исходном %event [ i ].
// 19 - проверяемое количество параметров даты.
// Использыется для определения последнего не пустого столбца.
// Необходимо при определении границ параметров даты.
// 10 - 15 изначальные параметры даты задачи (год, месяц, день, час, минуты).
// 20 - 25 время следующего срабатывания.
set %dayInMonth [ 1 ] 31
set %dayInMonth [ 2 ] 28
set %dayInMonth [ 3 ] 31
set %dayInMonth [ 4 ] 30
set %dayInMonth [ 5 ] 31
set %dayInMonth [ 6 ] 30
set %dayInMonth [ 7 ] 31
set %dayInMonth [ 8 ] 31
set %dayInMonth [ 9 ] 30
set %dayInMonth [ 10 ] 31
set %dayInMonth [ 11 ] 30
set %dayInMonth [ 12 ] 31
set linedelay 1
:start
for #nClearEvent 1 #sizeClearEvent 1
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set #mode %clearEvent [ #nClearEvent 2 ]
if ( #mode > 0 ) and ( #mode < 8 )
gosub dayOfWeek
if #dayOfWeek <> #mode
continue
end_if
end_if
// if #mode = 0
set $currentTimestamp $clear
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
for #i 20 #endFor 1 // Формируем таймштамп
set $currentTimestamp $currentTimestamp %timeArr [ #i ] \
end_for
set $lastHitTimestamp %clearEvent [ #nClearEvent 7 ]
set logging $currentTimestamp == $lastHitTimestamp
if $currentTimestamp <> $lastHitTimestamp // Проверка была ли уже выполнена задача.
set #startFor 27 - %clearEvent [ #nClearEvent 19 ] // Вычисляем с какого элемента массива нам необходмо делать проверку. Зависит от количества введеных параметров даты.
set #endFor %clearEvent [ #nClearEvent 18 ]
// set logging #endFor
set #timeHit 0
for #i #startFor #endFor 1 // Сравнение введенных параметров времени с текущим временем.
// set logging %clearEvent [ #nClearEvent #i ]
set #timeElementOfEvent %clearEvent [ #nClearEvent #i ]
set #timeElementCurrentTime %timeArr [ #i ]
// set logging #nClearEvent #i #timeElementOfEvent <= #timeElementCurrentTime
if ( #timeElementOfEvent < #timeElementCurrentTime ) or ( ( #timeElementOfEvent = #timeElementCurrentTime ) and ( #i = #endFor ) )
set #timeHit 1
break
end_if
if #timeElementOfEvent = #timeElementCurrentTime
continue
end_if
break
end_for
if #timeHit = 1
alarm online
msg %clearEvent [ #nClearEvent 1 ]
set $addWaiting prompt ("Выполнено" "Напомнить через 15 минут" "Напомнить через 30 минут" "Напомнить через 1 час" "Другое" )
if $addWaiting = 1
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ] // Возвращаем изначальное количество проверяемых елементов.
set %clearEvent [ #nClearEvent 20 ] %clearEvent [ #nClearEvent 10 ]
set %clearEvent [ #nClearEvent 21 ] %clearEvent [ #nClearEvent 11 ]
set %clearEvent [ #nClearEvent 22 ] %clearEvent [ #nClearEvent 12 ]
set %clearEvent [ #nClearEvent 23 ] %clearEvent [ #nClearEvent 13 ]
set %clearEvent [ #nClearEvent 24 ] %clearEvent [ #nClearEvent 14 ]
set %clearEvent [ #nClearEvent 25 ] %clearEvent [ #nClearEvent 15 ]
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set $lastHitTimestamp $clear // Делаем корректный таймштамп (после отсрочек нельзя тупо присвоить #currentTimeStamp)
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
// set logging %clearEvent [ #nClearEvent 19 ] #endFor
for #n 20 #endFor 1 // Формируем таймштамп
set $lastHitTimestamp $lastHitTimestamp %timeArr [ #n ] \
end_for
set %clearEvent [ #nClearEvent 7 ] $lastHitTimestamp
save_array %clearEvent 1 6 -1 2 last_clear_event.txt
break
end_if
set %clearEvent [ #nClearEvent 19 ] 7
set #y Year// Формируем дату для последующего пересчета ( например 67 мин = 1 час 7 мин)
set #mo Month
set #d Day
set #h Hour
set #m Min
set #s Sec
if $addWaiting = 0
set #m #m + 5
end_if
if $addWaiting = 2
set #m #m + 15
end_if
if $addWaiting = 3
set #m #m + 30
end_if
if $addWaiting = 4
set #h #h + 1
end_if
if $addWaiting = 5
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
end_if
gosub timeCalc
// set logging #y #mo #d #h #m #s
set %clearEvent [ #nClearEvent 20 ] #y
set %clearEvent [ #nClearEvent 21 ] #mo
set %clearEvent [ #nClearEvent 22 ] #d
set %clearEvent [ #nClearEvent 23 ] #h
set %clearEvent [ #nClearEvent 24 ] #m
set %clearEvent [ #nClearEvent 25 ] #s
continue
end_if // Если время устроило - показываем таблички.
end_if // Проверка была ли уже выполнена задача.
continue
// end_if // if #mode = 0 ежесекундный/минутный/часный/дневный/годный режим.
end_for // Перебор всех существующих задач (%clearEvent)
goto start
:timeCalc // Пересчитываем дату ( например 67 мин = 1 час 7 мин).
if #s > 59
set #m #m + #s / 60
set #s #s - #s / 60 * 60
end_if
if #m > 59
set #h #h + #m / 60
set #m #m - #m / 60 * 60
end_if
if #h > 23
set #d #d + #h / 24
set #h #h - #h / 24 * 24
end_if
while #d > 28
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12 + 1
end_if
set #dayInMonth %dayInMonth [ #mo ]
if #mo = 2
set #ymod ( #y - #y / 400 * 400 ) * ( #y - #y / 4 * 4 + ( #y - #y / 100 * 100 - 100 ) / 100 ) // Високосный ли год. Вернет 0, если високосный.
if #ymod = 0
set #dayInMonth #dayInMonth + 1
end_if
end_if
set #addMo #d / ( #dayInMonth + 1 )
if #addMo > 0
set #mo #mo + 1
set #d #d - #dayInMonth
else
break
end_if
end_while
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12
end_if
return
:dayOfWeek
if Month > 2 // Расчет дня недели.
set #m Month -2
set #century Year / 100
set #yearr Year - #century * 100
else
set #m Month +10
set #yearr Year - Year / 100 * 100 - 1
set #century #y / 100
end_if
set #dayOfWeek Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
// set logging Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
set #dayOfWeek #dayOfWeek - #dayOfWeek / 7 * 7
if #dayOfWeek = 0
set #dayOfWeek 7
end_if
// set logging #dayOfWeek
return
set linedelay 0
set logging close
set logging open 0 0 1024 200
set logging clear
set logging __________________________________________
// В первой строке введите название события.
// Во второй строке режим напоминания.
// Флаги режима напоминания:
// + Одноразовая задача ( режим 0 )
// + Ежечасная ( режим 0 )
// + Ежедневная ( режим 0 )
// + Ежемесячная ( режим 0 )
// + Ежегодная ( режим 0 )
// 1-7 + Еженедельная (номер дня недели)
// Возможно еще добавлю:
// - Каждые N дней
// - Каждые № минут
// - Секунд??
// Далее по порядку в отдельных строках
// введите параметры от года до минут.
// Может отсутсвовать по _порядку_ (!!!) любое
// количество параметров даты начиная с года.
// Минуты обязательны.
set %event [ 1 1 ] Сделай то-то
set %event [ 1 2 ] 0
set %event [ 1 3 ] 10
set %event [ 1 4 ] 00
set %event [ 4 1 ] Сделай это
set %event [ 4 2 ] 0
set %event [ 4 3 ] 14
set %event [ 4 4 ] 00
set #eventCount size ( %event )
set %event [ 1 10 ] ""
set %clearEvent [ 1 40 ] ""
set $clear ""
set #nClearEvent 1
for #i 1 #eventCount 1 // Преобразовываем в удобоваримый вид %event
set $nameEvent %event [ #i 1 ]
if $nameEvent <> $clear // Исключаем пропущенные элементы массива (например, после удаления задания из середины).
set $modeElement %event [ #i 2 ]
if ( $modeElement < 0 ) or ( $modeElement > 7 ) // Проверяемя корректность выбранного режима проверки.
msg В событии ''$nameEvent'' неверно указан режим напоминания. Задайте режим в set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set $fistTimeParam %event [ #i 3 ]
if $fistTimeParam = $clear // Проверяем корректность введнного времени.
msg В событии ''$nameEvent'' отсутсвует или неверно указано время. Задайте время начиная с set % event [ #i 2 ]. Между "%" и "event" пробела быть не должно.
end_if
set %clearEvent [ #nClearEvent 1 ] %event [ #i 1 ] // Начинаем формирование "чистого" массива с событиями.
set %clearEvent [ #nClearEvent 2 ] %event [ #i 2 ]
set %clearEvent [ #nClearEvent 6 ] %event [ #i 1 ] \ %event [ #i 2 ] \ %event [ #i 3 ] \ // Делаем уникальный штамп евента для сравнения.
set #y 4
set $eventForWhile %event [ #i #y ]
while $eventForWhile <> $clear // Считаем количество введнных параметров события
set %clearEvent [ #nClearEvent 6 ] %clearEvent [ #nClearEvent 6 ] %event [ #i #y ] \ // Делаем уникальный штамп евента для сравнения.
set #y #y + 1
set $eventForWhile %event [ #i #y ]
end_while
set %clearEvent [ #nClearEvent 9 ] #y - 1
// set logging В событии ''%event [ #i 1 ]'' ( #nClearEvent реальное проверяемое) %clearEvent [ #nClearEvent 9 ] параметров.
// set logging Событие ''%event [ #i 1 ]'' добавлено в обработку.
set #countEventParam %clearEvent [ #nClearEvent 9 ]
if ( #countEventParam = 8 ) or ( #second = 1 ) // Прощитывать ли секунды.
set #yClearEvent 15
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
else
set #yClearEvent 14
set %clearEvent [ #nClearEvent 8 ] #yClearEvent
set %clearEvent [ #nClearEvent 18 ] #yClearEvent + 10
for #i2 3 #countEventParam 1
set %clearEvent [ #nClearEvent #yClearEvent ] %event [ #i #countEventParam ]
set #countEventParam #countEventParam - 1
set #yClearEvent #yClearEvent - 1
end_for
// set logging %clearEvent [ #nClearEvent 10 ] %clearEvent [ #nClearEvent 11 ] %clearEvent [ #nClearEvent 12 ] %clearEvent [ #nClearEvent 13 ] %clearEvent [ #nClearEvent 14 ] %clearEvent [ #nClearEvent 15 ]
end_if
set #nClearEvent #nClearEvent + 1
end_if
end_for
set #sizeClearEvent size ( %clearEvent )
for #nClearEvent 1 #sizeClearEvent 1 // Дублируем загруженные данные в область проверки. Разделение сделано для восстановления изменившихся данных в ходе работы.
for #i 10 15 1
set #timeCheck #i + 10
set %clearEvent [ #nClearEvent #timeCheck ] %clearEvent [ #nClearEvent #i ]
end_for
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ]
end_for
load_array %lastClearEvent Last_Clear_Event.txt
set #sizeLastClearEvent size ( %lastClearEvent )
for #nClearEvent 1 #sizeClearEvent 1
for #i 1 #sizeLastClearEvent 1
set $eventstamp %clearEvent [ #nClearEvent 6 ]
set $lastEventstamp %lastClearEvent [ #i 1 ]
if $eventstamp = $lastEventstamp
set %clearEvent [ #nClearEvent 7 ] %lastClearEvent [ #i 2 ]
break
end_if
end_for
end_for
set logging Задач загружено: #sizeClearEvent за timer мс
set logging Year Month Day Hour : Min : Sec
// Элементы массива %ClearEvent
// Максимальнальное значеие второй размерности: 20
// Содержание:
// 1 - название задачи.
// 2 - изначальный режим задачи загруженный из %event (ежедневная,
// одноразовая, ежемесечная и т.д.). Используется для восстановелнерия
// проверяемого режима, который меняется во время отсрочки задачи.
// 3 - 5 зарезервировано.
// 6 - слепленные через " \ " все элементы %event. Нужен для сличения
// загруженных элементов с таблицей прошлой работы скрипта.
// Сличение производится для загрузки таймштампа последнего
// оповещения о событии.
// 7 - содержит $lastHitTimestamp.
// Используется для определения было ли оповещение в задавнное время.
// Например: ежедневная задача на 14:00, сейчас 17:00.
// Сравнивая $lastHitTimestamp с $currentTimestamp мы определяем
// Выполнялась ли уже задача. В $lastHitTimestamp не (!!!) входят
// указанныепараметры события. Т.е. для примера выше будт содержаться:
// год, месяц, число.
// 8 - изначально загруженное количество элементов из %Event.
// Для отсечение секунд, если они не указаны.
// 9 - количество параметров в исходном %event [ i ].
// 19 - проверяемое количество параметров даты.
// Использыется для определения последнего не пустого столбца.
// Необходимо при определении границ параметров даты.
// 10 - 15 изначальные параметры даты задачи (год, месяц, день, час, минуты).
// 20 - 25 время следующего срабатывания.
set %dayInMonth [ 1 ] 31
set %dayInMonth [ 2 ] 28
set %dayInMonth [ 3 ] 31
set %dayInMonth [ 4 ] 30
set %dayInMonth [ 5 ] 31
set %dayInMonth [ 6 ] 30
set %dayInMonth [ 7 ] 31
set %dayInMonth [ 8 ] 31
set %dayInMonth [ 9 ] 30
set %dayInMonth [ 10 ] 31
set %dayInMonth [ 11 ] 30
set %dayInMonth [ 12 ] 31
set linedelay 1
:start
for #nClearEvent 1 #sizeClearEvent 1
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set #mode %clearEvent [ #nClearEvent 2 ]
if ( #mode > 0 ) and ( #mode < 8 )
gosub dayOfWeek
if #dayOfWeek <> #mode
continue
end_if
end_if
// if #mode = 0
set $currentTimestamp $clear
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
for #i 20 #endFor 1 // Формируем таймштамп
set $currentTimestamp $currentTimestamp %timeArr [ #i ] \
end_for
set $lastHitTimestamp %clearEvent [ #nClearEvent 7 ]
set logging $currentTimestamp == $lastHitTimestamp
if $currentTimestamp <> $lastHitTimestamp // Проверка была ли уже выполнена задача.
set #startFor 27 - %clearEvent [ #nClearEvent 19 ] // Вычисляем с какого элемента массива нам необходмо делать проверку. Зависит от количества введеных параметров даты.
set #endFor %clearEvent [ #nClearEvent 18 ]
// set logging #endFor
set #timeHit 0
for #i #startFor #endFor 1 // Сравнение введенных параметров времени с текущим временем.
// set logging %clearEvent [ #nClearEvent #i ]
set #timeElementOfEvent %clearEvent [ #nClearEvent #i ]
set #timeElementCurrentTime %timeArr [ #i ]
// set logging #nClearEvent #i #timeElementOfEvent <= #timeElementCurrentTime
if ( #timeElementOfEvent < #timeElementCurrentTime ) or ( ( #timeElementOfEvent = #timeElementCurrentTime ) and ( #i = #endFor ) )
set #timeHit 1
break
end_if
if #timeElementOfEvent = #timeElementCurrentTime
continue
end_if
break
end_for
if #timeHit = 1
alarm online
msg %clearEvent [ #nClearEvent 1 ]
set $addWaiting prompt ("Выполнено" "Напомнить через 15 минут" "Напомнить через 30 минут" "Напомнить через 1 час" "Другое" )
if $addWaiting = 1
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
set %clearEvent [ #nClearEvent 19 ] %clearEvent [ #nClearEvent 9 ] // Возвращаем изначальное количество проверяемых елементов.
set %clearEvent [ #nClearEvent 20 ] %clearEvent [ #nClearEvent 10 ]
set %clearEvent [ #nClearEvent 21 ] %clearEvent [ #nClearEvent 11 ]
set %clearEvent [ #nClearEvent 22 ] %clearEvent [ #nClearEvent 12 ]
set %clearEvent [ #nClearEvent 23 ] %clearEvent [ #nClearEvent 13 ]
set %clearEvent [ #nClearEvent 24 ] %clearEvent [ #nClearEvent 14 ]
set %clearEvent [ #nClearEvent 25 ] %clearEvent [ #nClearEvent 15 ]
set %timeArr [ 20 ] Year
set %timeArr [ 21 ] Month
set %timeArr [ 22 ] Day
set %timeArr [ 23 ] Hour
set %timeArr [ 24 ] Min
set %timeArr [ 25 ] Sec
set $lastHitTimestamp $clear // Делаем корректный таймштамп (после отсрочек нельзя тупо присвоить #currentTimeStamp)
set #endFor 26 - %clearEvent [ #nClearEvent 19 ]
// set logging %clearEvent [ #nClearEvent 19 ] #endFor
for #n 20 #endFor 1 // Формируем таймштамп
set $lastHitTimestamp $lastHitTimestamp %timeArr [ #n ] \
end_for
set %clearEvent [ #nClearEvent 7 ] $lastHitTimestamp
save_array %clearEvent 1 6 -1 2 last_clear_event.txt
break
end_if
set %clearEvent [ #nClearEvent 19 ] 7
set #y Year// Формируем дату для последующего пересчета ( например 67 мин = 1 час 7 мин)
set #mo Month
set #d Day
set #h Hour
set #m Min
set #s Sec
if $addWaiting = 0
set #m #m + 5
end_if
if $addWaiting = 2
set #m #m + 15
end_if
if $addWaiting = 3
set #m #m + 30
end_if
if $addWaiting = 4
set #h #h + 1
end_if
if $addWaiting = 5
set %clearEvent [ #nClearEvent 7 ] $currentTimestamp
end_if
gosub timeCalc
// set logging #y #mo #d #h #m #s
set %clearEvent [ #nClearEvent 20 ] #y
set %clearEvent [ #nClearEvent 21 ] #mo
set %clearEvent [ #nClearEvent 22 ] #d
set %clearEvent [ #nClearEvent 23 ] #h
set %clearEvent [ #nClearEvent 24 ] #m
set %clearEvent [ #nClearEvent 25 ] #s
continue
end_if // Если время устроило - показываем таблички.
end_if // Проверка была ли уже выполнена задача.
continue
// end_if // if #mode = 0 ежесекундный/минутный/часный/дневный/годный режим.
end_for // Перебор всех существующих задач (%clearEvent)
goto start
:timeCalc // Пересчитываем дату ( например 67 мин = 1 час 7 мин).
if #s > 59
set #m #m + #s / 60
set #s #s - #s / 60 * 60
end_if
if #m > 59
set #h #h + #m / 60
set #m #m - #m / 60 * 60
end_if
if #h > 23
set #d #d + #h / 24
set #h #h - #h / 24 * 24
end_if
while #d > 28
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12 + 1
end_if
set #dayInMonth %dayInMonth [ #mo ]
if #mo = 2
set #ymod ( #y - #y / 400 * 400 ) * ( #y - #y / 4 * 4 + ( #y - #y / 100 * 100 - 100 ) / 100 ) // Високосный ли год. Вернет 0, если високосный.
if #ymod = 0
set #dayInMonth #dayInMonth + 1
end_if
end_if
set #addMo #d / ( #dayInMonth + 1 )
if #addMo > 0
set #mo #mo + 1
set #d #d - #dayInMonth
else
break
end_if
end_while
if #mo > 12
set #y #y + #mo / 12
set #mo #mo - #mo / 12 * 12
end_if
return
:dayOfWeek
if Month > 2 // Расчет дня недели.
set #m Month -2
set #century Year / 100
set #yearr Year - #century * 100
else
set #m Month +10
set #yearr Year - Year / 100 * 100 - 1
set #century #y / 100
end_if
set #dayOfWeek Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
// set logging Day + ( ( 13 * #m - 1 ) / 5 ) + #yearr + ( #yearr / 4 ) + ( #century / 4 ) - 2 * #century
set #dayOfWeek #dayOfWeek - #dayOfWeek / 7 * 7
if #dayOfWeek = 0
set #dayOfWeek 7
end_if
// set logging #dayOfWeek
return
пилот:
if dayofweek year(), month(), day() = 1
...
end_if
lua в пилоте:
if dayofweek (year(), month(), day()) == 1 then
...
end
log dayofweek (year, month, day)
if dayofweek (year, month, day) = 1 // если понедельник
log ++++
end_if
end_script
--lua
log (os.date("%w")) -- день недели
if os.date("%w") == "1" then -- если понедельник
log("++++")
end