Пользовательского поиска
Вторник, 21.11.2017, 18:23
Приветствую Вас Гость | RSS
Главная | Школа редактирования скриптов. - Страница 3 - Форум | Регистрация | Вход
Меню Проекта
Форма входа
Логин:
Пароль:
Мы Рекомендуем:
Мнение Общественности
Какую файловую систему на флешке вы предпочитаете?
1. NTFS
2. FAT-16/32
3. Ext-2/3
4. Другую
Всего ответов: 4929
Статистика
GreenFlash
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 3 из 3«123
Модератор форума: Sh1td0wn 
Форум » Мультизагрузочная флешка » Общий » Школа редактирования скриптов. (Тут учат создавать и редактировать свои скрипты inc.)
Школа редактирования скриптов.
BEGFRAETДата: Среда, 26.01.2011, 17:23 | Сообщение # 1
Неизвестный
Группа: Проверенные
Сообщений: 13
Репутация: 4
Статус: Отсутствует
Школа редактирования скриптов

Приветствую всех в этой теме.Я хочу вас научить редактировать и создавать свои скрипты для gfxboot формата inc.

Вам известно, что inc скрипты отвечают за многие вещи в вашей теме, так давайте разберём некоторые из них.

Quote (BEGFRAET)
Правила этой темы включают:

Описание языка,
используемого в скриптах для gfxboot

ПОСМОТРЕТЬ
справочный файл
gfxboot.html

Тема будет продвигаться за счет коллектива: http://rasprus.at.ua/ и всех других пользователей, которые захотели поделиться своими знаниями.

Сообщение отредактировал BEGFRAET - Пятница, 28.01.2011, 17:14
 
r-milvusДата: Среда, 16.03.2011, 00:33 | Сообщение # 31
Неизвестный
Группа: Пользователи
Сообщений: 10
Репутация: 2
Статус: Отсутствует
мдааа, а я специально старался в том же... потом малость уже напутал...
 
ded2007Дата: Пятница, 15.04.2011, 13:02 | Сообщение # 32
Профессионал
Группа: Проверенные
Сообщений: 595
Репутация: 80
Статус: Отсутствует
Как в gfxboot сделать пропускаемые строки меню.
(из топика "Темы gfxboot (загрузочные темы для gfxmenu)")

1. Делаем резервную копию своего main.inc

2. Открываем main.inc в текстовом редакторе.

3. Поиском по тексту находим образец "/main.input" (без кавычек разумеется)
- это начало скрипта, обрабатывающего нажатия клавиш
- открывающая фигурная скобка, идущая после указанного текста, показывает
начало скрипта
- закрывающая скобка, соответствующая данной (все фигурные скобки парные,
поэтому удобно использовать редактор с подсветкой синтаксиса) сопровождена
словом } def и расположена после блока

Code
dup 0 ne {     
            pop 0     
        } if

- внутри этого скрипта анализируются нажатия различных клавиш. Поскольку
код нажатой клавиши сравнивается с кодами подлежащими обработке, то скрипт
состоит из набора блоков "if", которые ограничены командами вида
Code
dup ПроверяемыйКОД eq {     
        ....     
        ....     
        pop 0     
        } if

Нас будут интересовать блоки от keyUp и keyDown.



@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ

Сообщение отредактировал ded2007 - Пятница, 15.04.2011, 13:13
 
McRexДата: Пятница, 07.10.2011, 17:20 | Сообщение # 33
Неизвестный
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Отсутствует
Всем доброго времени суток.
Сам из личного опыта пытаюсь сводить все к компактности, поэтому пользовался длительное время ядром скомпилированным gfxboot-3.3-custom. Правда сейчас очень заинтересовался внесением в этот код функции "Time" из @DED-LEGO@ (НЕ аналоговый вариант!). Вывод времени в формате "чч:мм:сс" с возможностью изменять положение и цвет фона/чисел. Как упомянул уважаемый ded2007 код сам по себе не сложный.

Хотелось бы как-то оформить эту функцию в отдельном .inc файле, автономном (чтобы его можно было прикрутить к любым исходникам любому пользователю).
Сейчас использую версию от Alser, очень нравится его компактность и минимализм. (Файлы исходники с изменениями прикреплены). Единственное заменен шрифт на классический, и закомментирована строка вывода цифрового таймера (у меня она плохо работает, цифры таймера накладываются друг на друга).

Описывать свои попытки вырезать функцию TIME из @DED-LEGO@ не стал, потому как сам понимаю что функция должна быть написана заново, что мне самому и не по силам.
Прикрепления: files.rar(462Kb)


Сообщение отредактировал McRex - Пятница, 07.10.2011, 17:49
 
ded2007Дата: Пятница, 07.10.2011, 19:56 | Сообщение # 34
Профессионал
Группа: Проверенные
Сообщений: 595
Репутация: 80
Статус: Отсутствует
Обработка нажатий клавиш, действия при открытии (инициализации) gfxboot, действия по таймауту. Как при написании inc-скриптов повлиять на обработку подобных событий? Например, в описании языка скриптов для gfxboot есть функция time, которая, судя по ее описанию, помещает в стек количество секунд прошедших с полуночи.
Допустим, мы напишем скрипт, который переводит эти секунды в часы, минуты и секунды и выведем результат. Но через секунду показания изменятся и результат уже будет неверным, значит нам нужно «привязаться» к обработке событий связанных с системными часами. Как же это делается?
Если мы дадим скрипту произвольное имя, то как компилятор определит, что это событие нужно связать с системными часами? Решение заключается в использовании ПРЕДОПРЕДЕЛЕННЫХ имен.
В вышеназванном описании одним из первых идет раздел ”Callbacks”, в котором описано назначение нескольких функций с ПРЕДОПРЕДЕЛЕННЫМИ ИМЕНАМИ. Рассмотрим две из них -Timeout и Timer. Обе они связаны с системными часами (точнее с прерыванием INT 8h).
В подробности архитектуры вдаваться не будем, просто примем как факт, что при каждом прерывании INT 8h, вызываются скрипты с именами Timeout и Timer.
Скрипт Timeout предназначен для реализации автозапуска пункта меню. Он регулярно вызывается, но только до первого нажатия клавиши или собственно срабатывания автозапуска пункта меню. Стартовое значение устанавливается тем менеджером загрузки, который вызывает gfxboot. (В нашем случае grub4dos передает значение timeout из menu.lst). Таким образом, Timeout не подходит для наших целей, т.к. часы «остановятся» при первом же нажатии на клавиатуру.
Скрипт же Timer – это то, что нам надо, он вызывается при каждом прерывании INT 8h, без всяких «если».
Прерывание INT 8h случается приблизительно 18,3 раза в секунду (точнее 1193180/65536). Это даже чаще, чем нам надо. Но в этом есть и свой минус. Если наш алгоритм выполняется дольше, чем 1/18.3=0,055 сек. Например, длительная перерисовка на экране, то налицо реальный риск повторного входа в процедуру обработки еще до окончания предыдущего действа. Думаю, что проще всего защититься от подобных «накладок» с помощью «флага» - переменной, которая разрешает или запрещает начало работы алгоритма.


@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ

Сообщение отредактировал ded2007 - Пятница, 07.10.2011, 20:04
 
ded2007Дата: Пятница, 07.10.2011, 20:07 | Сообщение # 35
Профессионал
Группа: Проверенные
Сообщений: 595
Репутация: 80
Статус: Отсутствует
Попробуем все эти мысли объединить в скрипте.
1. Итак, скрипт должен иметь имя Timer:
Code
/Timer { pop

} def

pop – это мы сбрасываем значение, которое помещается в стек при вызове Timer. То, что это необходимо я выяснил экспериментально (иначе сразу следует переполнение стека), а вот, что там за значение, выяснить не удосужился wink , а в описании этого нет.

2. Реализуем флаг, который разрешает вход в скрипт
Code
/Timer { pop
flag 0 ne {  % вход разрешен, только если flag не равен 0

} if
} def

Code
/Timer { pop
           flag 0 ne {  % вход разрешен, только если flag не равен 0
              /flag 0 def    % запретим повторный вход до окончания алгоритма
             % здесь алгоритм...
             /flag 1 def    % разрешим вход
           } if
} def

Смотрите, когда работает алгоритм, флаг все время запрещает повторное начало алгоритма. А по окончании обработки разрешение на вход восстанавливается.

Осталось разобраться с самим алгоритмом.
3. Вот тут как раз таки «подводный камень». По описанию, функция time возвращает в стеке количество секунд с полуночи, а фактически это «счетчик тиков» с полуночи. Тех самых «тиков», которые 18,3 раза в секунду wink . Плюс еще и число 18,3 не совсем точное, плюс некоторые проблемы из-за целочисленной арифметики. И все таки ...
Code
     /ticks_total time def   % тиков с полуночи
           /hh ticks_total 65543 div def  % текущий час
           /ostatok ticks_total hh 65543 mul sub def
           /mm ostatok 1092 div def  % текущая минута
           /ostatok ostatok mm 1092 mul sub def
           /ss ostatok 16384 mul 298295 div def % текущая секунда

65543 – число тиков в одном часу, 1092 –в одной минуте, а 16384/298295 это 1/18,3.

4. Осталось подготовить (зачистить) место на экране…
Code
     0x000000 setcolor
           0 0 moveto
           80 fontheight fillrect


5. И вывести три числа в нужном формате
Code
     0xffffff setcolor
           ss mm hh "%02d:%02d:%02d" s.print.buf sprintf s.print.buf show




6. Ах, да! Еще начальные значения. Они размещаются за пределами скрипта Timer.
Code
/flag 1 def    % разрешаем первичный вход
/s.print.buf 128 string def  % буфер для вывода текста


7. Все это сохраняем в файл с именем, скажем, clock.inc там же где и остальные inc-и. А что бы он «подхватился» при компиляции, в файле boot.config дописываем строчку
%% include clock.inc

8. Компилируем и пробуем. wizard

PS. За счет простоты кода имеем 17 бесполезных перерисовок из каждых 18! pocus
PSS. Дефектом алгоритма (из-за целочисленной арифметики) является не совсем точное отбражение секунд. Сравните показания в QEMU c реальным временем. tomato
Прикрепления: clock.inc(1Kb)


@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ

Сообщение отредактировал ded2007 - Суббота, 08.10.2011, 10:50
 
McRexДата: Пятница, 07.10.2011, 23:24 | Сообщение # 36
Неизвестный
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Отсутствует
Замечательная статья.
Не знаю как будет работать код если включать его в компиляцию последним, поэтому решил попробовать вписать до common но после timeout.
Code
%% include timeout.inc
%% include clock.inc
%% include common.inc


Посчитал, что так будет разумней исходя из того что timeout должен идти до common huh

И для смены цвета под фоновую картинку достаточно изменить значение цвета фона в hex в коде:
Code
0x000000 setcolor
Черный Фон. На скриншоте ниже, я изменял это значение на нужное мне "CFCFCF" - светло серое.

А для смены цвета самих цифр:
Code
0xffffff setcolor
Белые цифры. В моей версии это значение равно "000000".

Чистая компиляция с первого раза, показатель грамотного кода. Спасибо.
В процессе наблюдения в QEMU заметно отставание на пол секунды от реального времени. О чем Вы и предупреждали. wink

Вот как выглядит готовый результат:


Осталась небольшая мелочь, нужно задать координаты X и Y для смены местоположения на экране. В таком виде координаты берутся x=1, y=1 (первый пиксель, начальная позиция в левом верхнем углу).

UPDATE: Поправка
Из-за своей неопытности не разглядел участок кода.
Для изменения положения нужно лишь изменить команду, идущей после установки значения цвета фона:
Code
  0 0  moveto

Где первый ноль, это координата X, второй соответственно Y.
Для себя я установил значения: x=700, y=4.

UPDATE: Ошибка
Только сейчас заметил, секунды и минуты идут точно, но часы запаздывают на 3 часа. Пока я пишу это сообщение имею 23 часа, скрипт же показывает 20... где-то в подсчете тиков не точность я полагаю.

Хочу дождаться полуночи и посмотреть как изменится подсчет количества тиков после наступления полуночи.


Сообщение отредактировал McRex - Суббота, 08.10.2011, 01:13
 
ded2007Дата: Суббота, 08.10.2011, 01:05 | Сообщение # 37
Профессионал
Группа: Проверенные
Сообщений: 595
Репутация: 80
Статус: Отсутствует
McRex, c цветами Вы определились верно, координаты не (1;1), a (0;0) их видим в команде
0 0 moveto

Команда %% include нужна для компилятора и если в подключаемом inc-модуле нет ссылок на другие модули, то ее расположение в boot.config может быть произвольным. Кстати, команду %% include можно использовать и в inc-модулях, а вот boot.config служит "отправной точкой" для компилятора.

Что касается времени, то у меня совпадает.
Проверим:
1 час=60сек*60мин*18,3=3600*(1193180/65536)=65543,3349609375 тиков
1 минута=60сек*18,3=60*(1193180/65536)=1092,388916015625 тиков
1 секунда=1*(1193180/65536)=298295/16384 тиков
Проверьте и Вы wink . Проведите, кстати, эксперимент влияет ли изменение часов в Windows на показания в виртуальной машине (без перезапуска)
Прикрепления: 6750035.gif(17Kb)


@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ

Сообщение отредактировал ded2007 - Суббота, 08.10.2011, 01:11
 
McRexДата: Суббота, 08.10.2011, 01:22 | Сообщение # 38
Неизвестный
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Отсутствует
С координатами я опередил Вас на пару секунд, но все равно спасибо что указали на ошибку, я и правда изначально искал координаты равные 1, и лишь потом обратил внимание на эту строку. После наступления полуночи на системном времени у меня 00, виртуальная машина оставалась запущена в этот момент и время в ней перешло в значение 21. Разве количество тиков не должно было обнулиться? Изменения системного времени в ручную без перезапуска QEMU ни к чему не приводят. Скрипт не изменяет время. Даже перезапустив QEMU он реагирует лишь на изменение минут или секунд, но не часов. Я в замешательстве...


UPDATE
Только что произвел загрузку компа с usb. Время отобразилось правильно. Предполагаю что все проблема в том что использовал QEMU через WinSetupFromUSB 1-0-beta7. Потому как даже после полной перезагрузки время в виртуальной машине не изменилось.

Большая признательность и благодарность за помощь


Сообщение отредактировал McRex - Суббота, 08.10.2011, 01:41
 
BEGFRAETДата: Пятница, 06.01.2012, 21:27 | Сообщение # 39
Неизвестный
Группа: Проверенные
Сообщений: 13
Репутация: 4
Статус: Отсутствует
Сегодня доделал программу, которая способна помочь при создании gfxboot.cfg,.
Кодовое название GGM или GrubGfxMenu.
Скачать можно с сайта скачать.
Обсуждение на форуме программы. Форум
 
BarbaДата: Суббота, 07.01.2012, 11:37 | Сообщение # 40
Экспериментатор
Группа: Проверенные
Сообщений: 121
Репутация: 13
Статус: Отсутствует
biggrin
Quote (BEGFRAET)
Сегодня доделал программу...

Молодец wink
А инструкция с описанием ГДЕ? wacko
 
BEGFRAETДата: Суббота, 07.01.2012, 21:28 | Сообщение # 41
Неизвестный
Группа: Проверенные
Сообщений: 13
Репутация: 4
Статус: Отсутствует
http://ggm.at.ua/load/tutor_po_programme_grubgfxmenu/1-1-0-1 Тутор сдесь
 
Sergey_KuДата: Четверг, 22.03.2012, 21:17 | Сообщение # 42
Неизвестный
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Отсутствует
BEGFRAET,
Спасибо. попробуем!
 
zxenДата: Четверг, 19.04.2012, 15:58 | Сообщение # 43
Неизвестный
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Отсутствует
Кто нибудь знает, как сделать вертикальную полосу прокрутки ? или хотя бы подобие какое, чтоб было понятно что меню можно листать.

Сообщение отредактировал zxen - Четверг, 19.04.2012, 15:58
 
Re_StartДата: Понедельник, 18.11.2013, 01:12 | Сообщение # 44
Неизвестный
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Отсутствует
Помогите, после редактирования файла timeout, при сборке выдает ошибку, меняю только русский текст, сам код не трогаю
 
Форум » Мультизагрузочная флешка » Общий » Школа редактирования скриптов. (Тут учат создавать и редактировать свои скрипты inc.)
Страница 3 из 3«123
Поиск:
Чат

Copyright GreenFlash © 2017
Рейтинг@Mail.ru