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

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


lm2:ce:timer

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
lm2:ce:timer [2020/08/05 19:49]
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_start.zip|win_timer_project_start.zip}} 
 +  * {{:lm2:ce:rpi_timer_project_start.zip|rpi_timer_project_start.zip}} 
 +==== Создание структуры директорий ====
  
-===== Пример законченного приложения для иллюстрации работы таймера: =====+Создайте папку empty_project. Это корень проекта. Скопируйте в корень исполняемый модуль (исполняемый файл .exe и динамические библиотеки .dll необходимые для старта платформы в случае Windows или скомпилированный бинарный файл в случаях систем на основе ядра Linux). 
 + 
 +Создайте в корне папку images. Это каталог для хранения рендеров. Далее мы укажем к нему путь в главном конфигурационном файле. Скопируйте в этот каталог файлы .png. 
 + 
 +Создайте в корне папку 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>
  
-Функции для работы с таймером находятся в файле **timer.lua**: 
 <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; -- секунды
Строка 48: Строка 325:
          on = false; -- статус таймера          on = false; -- статус таймера
          }          }
 +
 -- При нажатии на кнопку Старт - включается таймеры tick и lamp и текст кнопки становится Стоп -- При нажатии на кнопку Старт - включается таймеры tick и lamp и текст кнопки становится Стоп
 -- При нажатии на кнопку Стоп - таймер tick выключается и текст кнопки становится Старт -- При нажатии на кнопку Стоп - таймер tick выключается и текст кнопки становится Старт
Строка 71: Строка 349:
 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
Строка 91: Строка 369:
  
 </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]]
  
  
lm2/ce/timer.1596646161.txt.gz · Последнее изменение: 2020/11/30 14:12 (внешнее изменение)