| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
lm2:ce:timer [2020/08/05 20:17] ruben |
lm2:ce:timer [2020/11/30 14:12] (текущий) |
| Создадим проект, который будет работать с системным таймером. Исполняемые модули находятся в репозитарии [[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]]. Необходимый минимум доступен по ссылкам: |
| |
| * {{:lm2:ce:win_timer_project.zip|win_timer_project.zip}} | * {{:lm2:ce:win_timer_project_start.zip|win_timer_project_start.zip}} |
| * {{:lm2:ce:rpi_timer_project_start.zip|rpi_timer_project_start.zip}} | * {{:lm2:ce:rpi_timer_project_start.zip|rpi_timer_project_start.zip}} |
| ==== Создание структуры директорий ==== | ==== Создание структуры директорий ==== |
| |
| Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_templates|Библиотека элементов]]». Создайте в папке configs файл templates.xml. Название файла должно совпадать с названием, указанным в файле описания панелей. Необходимо описать элементы на панели. Файл должен содержать следующий код: | Основная статья «[[https://wiki.lambda-mu.com/lm2/ce/s_templates|Библиотека элементов]]». Создайте в папке configs файл templates.xml. Название файла должно совпадать с названием, указанным в файле описания панелей. Необходимо описать элементы на панели. Файл должен содержать следующий код: |
| <code> | |
| |
| | <code xml> |
| <!-- объявление xml --> | <!-- объявление xml --> |
| <?xml version="1.0" encoding="utf-8" standalone="yes"?> | <?xml version="1.0" encoding="utf-8" standalone="yes"?> |
| | <!-- корневой элемент --> |
| <root> | <root> |
| | <!-- объявление библиотеки --> |
| <Library> | <Library> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| <Element ID="bg" Width="800" Height="480"> | <Element ID="bg" Width="800" Height="480"> |
| <Comment>Background</Comment> | <Comment>Background</Comment> |
| | <!-- подэлемент прямоугольник, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, цвет, цвет заливки, толщина контура, радиус закругления углов --> |
| <Rectangle ID="bg" Rect="50,50,700,380" Color="white" BGColor="black" Thickness="1" CornerRadius="10"/> | <Rectangle ID="bg" Rect="50,50,700,380" Color="white" BGColor="black" Thickness="1" CornerRadius="10"/> |
| </Element> | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникльный идентификатор, |
| | размеры элемента --> |
| <Element ID="button" Width="200" Height="80"> | <Element ID="button" Width="200" Height="80"> |
| | <!-- подэлемент прямоугольник, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, цвет, цвет заливки, толщина контура, радиус закругления углов --> |
| <Rectangle ID="bg" Rect="full" Color="white" BGColor="black" Thickness="2" CornerRadius="5"/> | <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"/> | <TextBox ID="text" Rect="full" TextTID="txtExit" Font="Default" Size="30" Align="Center" VAlign="Center"/> |
| </Element> | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, масштаб --> |
| <Element ID="logo" Width="369" Height="595" Scale="0.25"> | <Element ID="logo" Width="369" Height="595" Scale="0.25"> |
| | <!-- подэлемент изображение, задаются следующие свойства: размеры и положение, путь к рендеру --> |
| <Image Rect="full" Source="logo.png"/> | <Image Rect="full" Source="logo.png"/> |
| </Element> | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| <Element ID="clock" Width="300" Height="130"> | <Element ID="clock" Width="300" Height="130"> |
| <Comment>Цифровые часы</Comment> | <Comment>Цифровые часы</Comment> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру --> |
| <Image ID="face" Rect="full" Source="clock2Face.png"/> | <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="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="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="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"/> | <Image ID="digit4" Rect="230,33,38,64" Source="digits.png" SpriteIndex="0" Visible="true"/> |
| | <!-- задается свойство lua-кодом --> |
| <Property PropertyID="value" Default="0000"> | <Property PropertyID="value" Default="0000"> |
| <LUA><![CDATA[ | <LUA><![CDATA[ |
| | -- этот код управляет цифрами на таймере |
| local digits = value | local digits = value |
| for i = 1, 4 do | for i = 1, 4 do |
| </Property> | </Property> |
| </Element> | </Element> |
| | <!-- элемент библиотеки, задаются следующие свойства: уникальный идентификатор, |
| | размеры элемента, --> |
| <Element ID="lamp" Width="130" Height="130"> | <Element ID="lamp" Width="130" Height="130"> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта --> |
| <Image ID="off" Rect="full" Source="lamp.png" SpriteIndex="0"/> | <Image ID="off" Rect="full" Source="lamp.png" SpriteIndex="0"/> |
| | <!-- подэлемент изображение, задаются следующие свойства: уникальный идентификатор, |
| | размеры и положение, путь к рендеру, индекс спрайта, видимость --> |
| <Image ID="on" Rect="full" Source="lamp.png" SpriteIndex="1" Visible="false"/> | <Image ID="on" Rect="full" Source="lamp.png" SpriteIndex="1" Visible="false"/> |
| | <!-- задается свойство lua-кодом --> |
| <Property PropertyID="state" Default="off"> | <Property PropertyID="state" Default="off"> |
| <LUA><![CDATA[ | <LUA><![CDATA[ |
| if value == "default" then | if value == "default" then |
| Set("state.=off") | Set("state.=off") |
| | -- состояние горящей лампы |
| elseif value == "on" then | elseif value == "on" then |
| Set("on.Visible=ani(0:true)") | Set("on.Visible=ani(0:true)") |
| Set("off.Visible=ani(0:true;200:false)") | Set("off.Visible=ani(0:true;200:false)") |
| Set("off.Opacity=ani(0:1.0;200:0)") | Set("off.Opacity=ani(0:1.0;200:0)") |
| | -- состояние выключенной лампы |
| elseif value == "off" then | elseif value == "off" then |
| Set("on.Visible=ani(0:true;200:false)") | Set("on.Visible=ani(0:true;200:false)") |
| Set("off.Visible=ani(0:true)") | Set("off.Visible=ani(0:true)") |
| Set("off.Opacity=ani(0:0;200:1.0)") | Set("off.Opacity=ani(0:0;200:1.0)") |
| | -- состояние мигающей лампы |
| elseif value:sub(1, 5) == "blink" then | elseif value:sub(1, 5) == "blink" then |
| local t1, t2 = value:match("blink(%d+),(%d+)") | local t1, t2 = value:match("blink(%d+),(%d+)") |
| </Library> | </Library> |
| </root> | </root> |
| | |
| |
| </code> | </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> |
| | -- timer.lua |
| | -- в Clock хранится текущее время в виде секунд - seconds и минут - minutes, а также интервал таймера в миллисекундах - interval и статус таймера - on = false|true |
| | Clock = {seconds = 0; -- секунды |
| | minutes = 0; -- минуты |
| | interval = 1000; -- интервал обновления |
| | on = false; -- статус таймера |
| | } |
| | |
| | -- При нажатии на кнопку Старт - включается таймеры tick и lamp и текст кнопки становится Стоп |
| | -- При нажатии на кнопку Стоп - таймер tick выключается и текст кнопки становится Старт |
| | function H_startstoptimer(ev) |
| | if Clock.on == false then |
| | Clock.on = true |
| | SetText('main.btStartStop.text.Text', 'txtStop') |
| | -- Включаем таймер на Clock.interval с цикличным срабатыванием (once = false) |
| | sys.StartTimer("tick", Clock.interval, false) |
| | -- Включаем лампу и одноразовый таймер на 5с |
| | Set('main.Lamp.state.', 'on') |
| | sys.StartTimer("lamp", 5000) |
| | else |
| | Clock.on = false |
| | SetText('main.btStartStop.text.Text', 'txtStart') |
| | -- Останавливаем цикличный таймер |
| | sys.StopTimer("tick") |
| | end |
| | end |
| | AddEventHandler('main.btStartStop.Mouse.LeftPress', 'H_startstoptimer') |
| | |
| | -- По таймеру tick обновляются часы |
| | function H_refresh(ev) |
| | Clock.seconds = Clock.seconds + Clock.interval/1000 |
| | if Clock.seconds> 60 then |
| | Clock.minutes = Clock.minutes + 1 |
| | Clock.seconds = Clock.seconds - 60 |
| | end |
| | if Clock.minutes> 60 then |
| | Clock.minutes = Clock.minutes - 60 |
| | end |
| | -- Устанавливаем значение цифровых часов |
| | Set("main.Clock.value.", string.format("%02d%02d", Clock.minutes, math.floor(Clock.seconds))) |
| | end |
| | AddEventHandler('timer.tick.finished.', 'H_refresh') |
| | |
| | -- По таймеру lamp выключается лампа |
| | function H_lamp(ev) |
| | Set('main.Lamp.state.', 'off') |
| | end |
| | AddEventHandler('timer.lamp.finished.', 'H_lamp') |
| | |
| | |
| | </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]] |
| |
| |