| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
lm2:ce:timer [2020/08/05 19:47] ruben |
lm2:ce:timer [2020/11/30 14:12] (текущий) |
| |
| </code> | </code> |
| | |
| | ---- |
| |
| Создадим проект, который будет работать с системным таймером. Исполняемые модули находятся в репозитарии [[https://gitlab.com/lambda-mu/lm.ver2/lm2.engine.ce|lm2.engine.ce]]. Файлы для проекта находятся в репозитарии [[https://gitlab.com/lambda-mu/lm.ver2/lm2.examples|lm2.examples]]. Необходимый минимум доступен по ссылкам: | Создадим проект, который будет работать с системным таймером. Исполняемые модули находятся в репозитарии [[https://gitlab.com/lambda-mu/lm.ver2/lm2.engine.ce|lm2.engine.ce]]. Файлы для проекта находятся в репозитарии [[https://gitlab.com/lambda-mu/lm.ver2/lm2.examples|lm2.examples]]. Необходимый минимум доступен по ссылкам: |
| |
| * [[https://wiki.lambda-mu.com/_media/lm2/ce/win_empty_project_start.zip|win_empty_project_start.zip]] | * {{:lm2:ce:win_timer_project_start.zip|win_timer_project_start.zip}} |
| * [[https://wiki.lambda-mu.com/_media/lm2/ce/rpi_empty_project_start.zip|rpi_empty_project_start.zip]] | * {{:lm2:ce:rpi_timer_project_start.zip|rpi_timer_project_start.zip}} |
| | ==== Создание структуры директорий ==== |
| |
| ---- | Создайте папку empty_project. Это корень проекта. Скопируйте в корень исполняемый модуль (исполняемый файл .exe и динамические библиотеки .dll необходимые для старта платформы в случае Windows или скомпилированный бинарный файл в случаях систем на основе ядра Linux). |
| |
| ===== Пример законченного приложения для иллюстрации работы таймера: ===== | Создайте в корне папку images. Это каталог для хранения рендеров. Далее мы укажем к нему путь в главном конфигурационном файле. Скопируйте в этот каталог файлы .png. |
| |
| Функции для работы с таймером находятся в файле **timer.lua**: | Создайте в корне папку configs. Это каталог для хранения конфигурационных файлов (кроме главного конфигурационного файла, он должен быть в корне проекта). |
| | |
| | Создайте в корне папку fonts. Это каталог для используемых шрифтов. Далее мы подключим шрифты в главном конфигурационном файле. Скопируйте в этот каталог файл LiberationSerif-Regular.ttf. |
| | |
| | ==== Создание файлов ==== |
| | |
| | **Главный конфигурационный файл** |
| | |
| | Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_config|Главный конфигурационный файл]]». Создайте в корне проекта файл config.xml. Платформа по умолчанию к нему обратиться. Никаких дополнительных действий не требуется. Файл должен содержать следующий код: |
| | |
| | <code xml> |
| | <!-- объявление xml --> |
| | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент --> |
| | <root> |
| | <!-- элемент общих настроек, задаются следующие: язык, путь к рендерам, |
| | путь к конфигурационным файлам, флаг логирования --> |
| | <System |
| | Language="ru" |
| | ImagesPath="images/" |
| | ConfigsPath="configs/" |
| | Log="true"/> |
| | <!-- элемент логической машины, задаются следующие свойства: уникальный |
| | идентификатор, файл описание панелей, файл конфигурации окон, первый |
| | файл c lua-кодом для запуска --> |
| | <VM |
| | ID="main" |
| | Visual="panels.xml" |
| | StartupLayout="viewports.xml" |
| | StartupLogic="start.lua"> |
| | </VM> |
| | <!-- элемент шрифта, задаются следующие свойства: уникальный идентификатор, |
| | полный путь к файлу --> |
| | <Font ID="Default" FileName="fonts/LiberationSerif-Regular.ttf" /> |
| | </root> |
| | |
| | |
| | </code> |
| | |
| | **Файл конфигурации окон** |
| | |
| | Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_win|Конфигурация окон]]». В папку configs создайте viewports.xml. Название файла должно совпадать с названием, указанным в главном конфигурационном файле. Определите окно на первом мониторе (если у вас несколько мониторов) с разрешением 800×480. Файл должен содержать следующий код: |
| | |
| | <code xml> |
| | <!-- объявление xml --> |
| | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент, задается следующее свойство: разрешение --> |
| | <root MonitorWidth="800" MonitorHeight="480"> |
| | <!-- элемент вьюпорт, задаются следующие свойства: положение на мониторе, |
| | уникальный идентификатор --> |
| | <ViewPort Monitor="0,0" ID="main_viewport" /> |
| | </root> |
| | |
| | |
| | </code> |
| | |
| | **Файл описания панелей** |
| | |
| | Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_panels|Описание панелей]]». Создайте в папке configs файл panels.xml. Название файла должно совпадать с названием, указанным в главном конфигурационном файле. Необходимо подключить библиотеку элементов, файл со строковыми данными, описать панель с фоном, двумя кнопками, логотипом и двумя элементами содержащими спрайтшиты лампы и цифр таймера. Файл должен содержать следующий код: |
| | |
| | <code xml> |
| | <!-- объявление xml --> |
| | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент --> |
| | <root> |
| | <!-- элемент подключающий строковые данные --> |
| | <Text FileName="text.xml"/> |
| | <!-- элемент подключающий библиотеку элементов --> |
| | <Library FileName="templates.xml"/> |
| | <!-- элемент родитель панелей --> |
| | <GUI> |
| | <!-- элемент описывающий панель, задается следующее свойство: размеры вьюпорта, |
| | на который будет выводиться панель --> |
| | <Panel ID="main" VPWidth="800" VPHeight="480"> |
| | <!-- элемент на панели, задается следующее свойство: уникальный идентификатор--> |
| | <Entry ID="bg" TypeID="bg"/> |
| | <!-- элемент на панели, задается следующее свойство: уникальный идентификатор, положение на панели--> |
| | <Entry ID="btExit" TypeID="button" Top="300" Left="300"/> |
| | <!-- элемент на панели, задается следующее свойство: уникальный идентификатор, положение на панели--> |
| | <Entry ID="btStartStop" TypeID="button" Top="300" Left="520"> |
| | <!-- меняется свойство, описанное в библиотеке элементов (она уже загружена) --> |
| | <PropertySet Property="text.Text" ValueTID="txtStart"/> |
| | </Entry> |
| | <!-- элемент на панели, задаются следующие свойства: уникальный идентификатор, положение на панели --> |
| | <Entry ID="Logo" TypeID="logo" Top="60" Left="60"/> |
| | <!-- элемент на панели, задаются следующие свойства: уникальный идентификатор, положение на панели --> |
| | <Entry ID="Clock" TypeID="clock" Top="60" Left="220" /> |
| | <!-- элемент на панели, задаются следующие свойства: уникальный идентификатор, положение на панели --> |
| | <Entry ID="Lamp" TypeID="lamp" Top="60" Left="555" /> |
| | </Panel> |
| | </GUI> |
| | </root> |
| | |
| | |
| | </code> |
| | |
| | **Файл с библиотекой элементов** |
| | |
| | Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_templates|Библиотека элементов]]». Создайте в папке configs файл templates.xml. Название файла должно совпадать с названием, указанным в файле описания панелей. Необходимо описать элементы на панели. Файл должен содержать следующий код: |
| | |
| | <code xml> |
| | <!-- объявление xml --> |
| | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент --> |
| | <root> |
| | <!-- объявление библиотеки --> |
| | <Library> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| | <Element ID="bg" Width="800" Height="480"> |
| | <Comment>Background</Comment> |
| | <!-- подэлемент прямоугольник, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, цвет, цвет заливки, толщина контура, радиус закругления углов --> |
| | <Rectangle ID="bg" Rect="50,50,700,380" Color="white" BGColor="black" Thickness="1" CornerRadius="10"/> |
| | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникльный идентификатор, |
| | размеры элемента --> |
| | <Element ID="button" Width="200" Height="80"> |
| | <!-- подэлемент прямоугольник, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, цвет, цвет заливки, толщина контура, радиус закругления углов --> |
| | <Rectangle ID="bg" Rect="full" Color="white" BGColor="black" Thickness="2" CornerRadius="5"/> |
| | <!-- подэлемент текстовое поле, задаются следующие свойства: уникальный идентификатор, |
| | размер и положение, идентификатор строковых данных, шрифт, кегль, выравнивание --> |
| | <TextBox ID="text" Rect="full" TextTID="txtExit" Font="Default" Size="30" Align="Center" VAlign="Center"/> |
| | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, масштаб --> |
| | <Element ID="logo" Width="369" Height="595" Scale="0.25"> |
| | <!-- подэлемент изображение, задаются следующие свойства: размеры и положение, путь к рендеру --> |
| | <Image Rect="full" Source="logo.png"/> |
| | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| | <Element ID="clock" Width="300" Height="130"> |
| | <Comment>Цифровые часы</Comment> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру --> |
| | <Image ID="face" Rect="full" Source="clock2Face.png"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| | <Image ID="digit1" Rect="20,33,38,64" Source="digits.png" SpriteIndex="0" Visible="true"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| | <Image ID="digit2" Rect="80,33,38,64" Source="digits.png" SpriteIndex="0" Visible="true"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| | <Image ID="digit3" Rect="170,33,38,64" Source="digits.png" SpriteIndex="0" Visible="true"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| | <Image ID="digit4" Rect="230,33,38,64" Source="digits.png" SpriteIndex="0" Visible="true"/> |
| | <!-- задается свойство lua-кодом --> |
| | <Property PropertyID="value" Default="0000"> |
| | <LUA><![CDATA[ |
| | -- этот код управляет цифрами на таймере |
| | local digits = value |
| | for i = 1, 4 do |
| | local ch = digits:byte(i) |
| | if ch>= 48 and ch <= 57 then |
| | Set("digit"..i..".SpriteIndex", (ch - 48)) |
| | end |
| | end |
| | ]]></LUA> |
| | </Property> |
| | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| | <Element ID="lamp" Width="130" Height="130"> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта --> |
| | <Image ID="off" Rect="full" Source="lamp.png" SpriteIndex="0"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| | <Image ID="on" Rect="full" Source="lamp.png" SpriteIndex="1" Visible="false"/> |
| | <!-- задается свойство lua-кодом --> |
| | <Property PropertyID="state" Default="off"> |
| | <LUA><![CDATA[ |
| | if value == "default" then |
| | Set("state.=off") |
| | -- состояние горящей лампы |
| | elseif value == "on" then |
| | Set("on.Visible=ani(0:true)") |
| | Set("on.Opacity=ani(0:0;200:1.0)") |
| | Set("off.Visible=ani(0:true;200:false)") |
| | Set("off.Opacity=ani(0:1.0;200:0)") |
| | -- состояние выключенной лампы |
| | elseif value == "off" then |
| | Set("on.Visible=ani(0:true;200:false)") |
| | Set("on.Opacity=ani(0:1.0;200:0)") |
| | Set("off.Visible=ani(0:true)") |
| | Set("off.Opacity=ani(0:0;200:1.0)") |
| | -- состояние мигающей лампы |
| | elseif value:sub(1, 5) == "blink" then |
| | local t1, t2 = value:match("blink(%d+),(%d+)") |
| | if t1 == nil then t1 = 1000 end |
| | if t2 == nil then t2 = 1000 end |
| | Set("on.Visible=ani(0:true)") |
| | Set("off.Visible=ani(0:true)") |
| | local dt1 = 200 + tonumber(t1) |
| | local dt2 = dt1 + 200 |
| | local dt3 = dt2 + tonumber(t2) |
| | local s_on = "ani(0:0.0;200:1.0;"..dt1..":1.0;"..dt2..":0.0;"..dt3..":0.0;loop:true)" |
| | local s_off = "ani(0:1.0;200:0.0;"..dt1..":0.0;"..dt2..":1.0;"..dt3..":1.0;loop:true)" |
| | Set("on.Opacity="..s_on) |
| | Set("off.Opacity="..s_off) |
| | end |
| | ]]></LUA> |
| | </Property> |
| | </Element> |
| | </Library> |
| | </root> |
| | |
| | |
| | </code> |
| | |
| | **Файл со строковыми данными** |
| | |
| | Основная статья "[[:lm2:ce:s_text|Строковые данные]]". Создайте в папке configs файл text.xml. Название файла должно совпадать с названием, указанным в файле описания панелей. Необходимо добавить все строковые поля. Файл должен содержать следующий код: |
| | |
| | <code xml> |
| | <!-- объявление xml --> |
| | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент --> |
| | <root> |
| | <!-- строковые данные, задается следующее свойство: уникальный идентификатор --> |
| | <Text ID="txtEmptyProject"> |
| | <!-- языковая версия, задается следующие свойства: язык, текст --> |
| | <Entry Lang="ru" Value="Пустой проект" /> |
| | <Entry Lang="en" Value="Empty project" /> |
| | </Text> |
| | <!-- строковые данные, задается следующее свойство: уникальный идентификатор --> |
| | <Text ID="txtExit"> |
| | <!-- языковая версия, задается следующие свойства: язык, текст --> |
| | <Entry Lang="ru" Value="Выход" /> |
| | <Entry Lang="en" Value="Exit" /> |
| | </Text> |
| | <!-- строковые данные, задается следующее свойство: уникальный идентификатор --> |
| | <Text ID="txtStart"> |
| | <!-- языковая версия, задается следующие свойства: язык, текст --> |
| | <Entry Lang="ru" Value="Старт" /> |
| | <Entry Lang="en" Value="Start" /> |
| | </Text> |
| | <!-- строковые данные, задается следующее свойство: уникальный идентификатор --> |
| | <Text ID="txtStop"> |
| | <!-- языковая версия, задается следующие свойства: язык, текст --> |
| | <Entry Lang="ru" Value="Стоп" /> |
| | <Entry Lang="en" Value="Stop" /> |
| | </Text> |
| | </root> |
| | |
| | |
| | </code> |
| | |
| | **Lua-код** |
| | |
| | Основная статья"[[:lm2:ce:s_lua|Lua-код]]". Создайте в папке configs файл start.lua. Название файла должно совпадать с названием, указанным в главном конфигурационном файле. Необходимо привязать панель к вьюпорту, описать обработчик кнопкок и таймеров и привязать их к событиям. Файл должен содержать следующий код: |
| | |
| | <code lua> |
| | -- start.lua |
| | -- привязка панели |
| | Panel('main_viewport', 'main') |
| | -- подключение файла |
| | Include("timer.lua") |
| | |
| | -- обработчик нажатия на кнопку |
| | function H_Exit(_ev) |
| | sys.Exit() |
| | end |
| | -- привязка обработчика к событию |
| | AddEventHandler('main.btExit.Mouse.LeftPress', 'H_Exit') |
| | |
| | |
| | </code> |
| |
| <code lua> | <code lua> |
| | -- timer.lua |
| -- в Clock хранится текущее время в виде секунд - seconds и минут - minutes, а также интервал таймера в миллисекундах - interval и статус таймера - on = false|true | -- в Clock хранится текущее время в виде секунд - seconds и минут - minutes, а также интервал таймера в миллисекундах - interval и статус таймера - on = false|true |
| Clock = {seconds = 0; -- секунды | Clock = {seconds = 0; -- секунды |
| on = false; -- статус таймера | on = false; -- статус таймера |
| } | } |
| | |
| -- При нажатии на кнопку Старт - включается таймеры tick и lamp и текст кнопки становится Стоп | -- При нажатии на кнопку Старт - включается таймеры tick и lamp и текст кнопки становится Стоп |
| -- При нажатии на кнопку Стоп - таймер tick выключается и текст кнопки становится Старт | -- При нажатии на кнопку Стоп - таймер tick выключается и текст кнопки становится Старт |
| function H_refresh(ev) | function H_refresh(ev) |
| Clock.seconds = Clock.seconds + Clock.interval/1000 | Clock.seconds = Clock.seconds + Clock.interval/1000 |
| if Clock.seconds > 60 then | if Clock.seconds> 60 then |
| Clock.minutes = Clock.minutes + 1 | Clock.minutes = Clock.minutes + 1 |
| Clock.seconds = Clock.seconds - 60 | Clock.seconds = Clock.seconds - 60 |
| end | end |
| if Clock.minutes > 60 then | if Clock.minutes> 60 then |
| Clock.minutes = Clock.minutes - 60 | Clock.minutes = Clock.minutes - 60 |
| end | end |
| |
| </code> | </code> |
| | |
| | ==== Запуск проекта ==== |
| | |
| | Прямые ссылки на готовый проект: |
| | |
| | * {{:lm2:ce:win_timer_project.zip|win_timer_project.zip}} |
| | * {{:lm2:ce:rpi_timer_project.zip|rpi_timer_project.zip}} |
| | |
| | В следующих статьях описано как запускать проекты: |
| | |
| | * [[https://wiki.lambda-mu.com/lm2/ce/i_win|Установка и запуск платформы на Windows]] |
| | * [[https://wiki.lambda-mu.com/lm2/ce/i_rpi|Установка и запуск платформы на Raspbian]] |
| |
| |