Инструменты пользователя

Инструменты сайта


lm2:ce:timer

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
lm2:ce:timer [2020/08/05 20:17]
ruben
lm2:ce:timer [2020/11/30 14:12] (текущий)
Строка 36: Строка 36:
 Создадим проект, который будет работать с системным таймером. Исполняемые модули находятся в репозитарии [[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}}
 ==== Создание структуры директорий ==== ==== Создание структуры директорий ====
Строка 143: Строка 143:
  
 Основная статья «[[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
Строка 179: Строка 208:
       </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)")
Строка 191: Строка 228:
             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)")
Строка 196: Строка 234:
             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+)")
Строка 215: Строка 254:
     </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]]
  
  
lm2/ce/timer.1596647845.txt.gz · Последнее изменение: 2020/11/30 14:12 (внешнее изменение)