Управляем чем угодно откуда угодно

QtQuick. QML Конструктор для управлялки.

Обсуждение клиентского ПО для доступа к виртурилке, управления и мониторинга

QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 11 дек 2014, 00:57

Приветствую всех!

Как-то давно я был на презентации компании Nokia, на которой рассказывали про QtQuick и язык QML. И недавно подумал, что неплохо б на такой штуке сделать конструктор, из которого можно самому собрать управлялку совершенно не напрягаясь. Ну + в новой версии авторы обещают поддержку всяких андроидов, айфонов и тд.

Кто не в курсе, что это за зверь (QtQuick), то, если кратко, это такая надстройка над Qt, которая позволяет легко строить интерфейсы, просто описывая их простым декларативным языком (QML), который, ко всему прочему, имеет встроенную машину JS. Все это строится на сигналах, которые известны многим с Qt.
Более детально можно почитать в первоисточнике тут: http://qt-project.org/doc/qt-5/qtquick-index.html

Ко всему прочему QtQuick очень просто расширяется дополнениями из языка С++.

Итак новый проектик-велосипед gui-client для ferro-remote =) Исходники, по традиции, на github тут https://github.com/newenclave/ferro-rem ... gui-client

Сам по себе проект - простая запускалка "скриптов" на QML. На данный момент туда импортируются несколько классов, позволяющих работать с виртурилкой (если быть точнее, то с агентом, на ней запущенном).
А именно:
  • Клиент - позволяет соединиться с указанным хостом. Имеет сигналы о соединении, рассоединении, готовности, ошибок. Клиент является базой для всех остальных классов. Клиентов может быть несколько в одном приложении и они могут быть соединены с разными железками (например есть малинка и виртурилка и одна единственная управлялка может работать с обоими сразу, например передавать файлы от одной к другой через себя или реагировать на изменения состояния пинов на одной железке и выставлять состояния на другой ).
  • OS - позволяет выполнить произвольную консольную команду на серверной стороне (кудаж без этого?)
  • Fs - доступ к файловой системе устройства. Этот класс предназначен для работы с директориями и объектами Fs. То есть базовые возможности, как то: узнать есть ли объект, узнать его основные харр-ки (директория (пустая/непустая), файл, линк), узнать размер файла, проитерировать содержимое директории. + быстрая запись/быстрое чнение из файла, то есть позволяет прочитать или записать за одно действие, удобно, когда нужно в драйвер какую-то строку скормить один раз.
  • File - работа с файлом. Все как обычно, открыть, почитаться, записать, сдвинуть позицию, узнать позицию, подписаться на события (если файл - спец. устройство; событие вывернуто как сигнал)
  • GPIO - класс для работы с GPIO. собственно тоже все очевидно. Естественно на пинах, поддерживающих прерывания, можно ловить события об изменении значения, в качестве сигналов.
Есть еще классы, которые нельзя описать декларативно, а можно только использовать из функций JS, либо из свойств других классов. Это, например, итераторы директорий, класс со сведением о файловом объекте.

Далее насколько простых примеров со скриншотами:

Самый простой - приложение, которое просто соединяется с указанным хостом: QML Состоит из клиента, кнопки, текстового окошка, и лейбла, куда выводится состояние либо ошибка соединения. При нажатии на кнопку происходит попытка соединения, на всех фазах соединения меняется текст на лейбле. Все описано в одном файле, используются компоненты QtQuick.Controls 1.1, которые выглядят нативно на системах. Результат выглядит вот так: Изображение

Второй пример - пример из Wiki ;) куда ж без "поморгать диодиком"? QML.
Тут уже используются базовые элементы типа "прямоугольник", поэтому окошко выглядит крайне отстойно =)
Сам скрипт состоит из клиента, "кнопки" MyButton, лейблочки с состоянием, еще одной круглой кнопки с текстом (!!!), файлового компонента, который связан с "/dev/v2r_gpio".
Вот так выглядит описание открытого файла в QML
Код: Выделить всё
 FrClientFile {
    id: v2rFile  // id компонента
    client: generalClient // клиент, канал которого использует компонент
    mode: "wb" // режим открытия; для записи в бинарном виде.
    path: "/dev/v2r_gpio" // путь
}

При нажатии на круглую кнопку в этот файл посылается строка "set gpio 74 output 1", либо "set gpio 74 output 0", в зависимости от внутреннего состояния QML объекта. Картинка (красный диодик горит): Изображение

Ну и еще один пример - список объектов директории. Тут уже используется ListVew/Model/Delegate. Опять же подключаемся, и запрашиваем список по кнопке рефреш, список строится файловыми итераторами, после чего заполняется модель именами и признаками того, что это директория. Картинка: Изображение

Есть еще пример как отслеживать событие от смены состояния пина тыц. Открывается пин с номером GPIO7, устанавливается ему edge на both и, в случае если пину поменять значение (не важно как и откуда), компонент начинает сигналить сигналом сhangeEvent, в обработчике которого меняется цвет прямоугольника серый/красный.

Все это выглядит вот так вот просто

Код: Выделить всё
FrClientGpio {
    id: mainGpio       // имя
    index: 7              /// gpio7
    direction: FrClientGpio.Direct_Out // направление, можно не указывать
    edge: FrClientGpio.Edge_Both       // edge = both, говорит, что будет сигнал и на 1 и на 0
    client: generalClient              /// клиент, который подключен
    activeLow: true                // это для примера.
    events: true                 // говорим, что хотим событий от железки по поводу смены значения на пине
}
.....
Rectangle {
    height: 40
    width: 40
    color: "black"
    id: gpioColor
    Connections {              /// обработчик сигнала от
        target: mainGpio    /// GPIO интерфейса
        onChangeEvent: {   // реакция на сигнал
            gpioColor.color = value ? "red" : "grey"
        }
    }
}


----
Ну вот как-то так. В планах протянуть интерфейс для I2C и разобраться c окошком под GStreamer (валится, зараза, в кору). И еще написать какую-нить доку по всем интерфейсам.

Еще момент: Сборка агента и консольного клиента для v2r тут.
Есть сборка виндового гуёвого клиента (mingw), НО! только один бинарник, без всего того, что он требует (Qt5Core.dll ... ) тут. Проверить чего ему не хватает я не могу, потому как чистой винды под рукой нет, но, кому интересно, могу выложить, чего не хватает.
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: QtQuick. QML Конструктор для управлялки.

Сообщение debager » 03 дек 2015, 16:02

Тоже изучаю QT5 и мне очень интересно буду следить за проектом .
Мне пока много не понятно можно исходники в виде проекта выкладывать .
И пояснения подробные шаг за шагом для "особо одаренных" спасибо.
debager
 
Сообщения: 27
Зарегистрирован: 20 сен 2013, 10:36
Откуда: opel

Re: QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 19 июл 2016, 13:39

Допишу-ка я тут как все это собрать.

**** Вся сборка и описание процесса происходит на системе Ubuntu 16.04 х64, но на других системах проблем быть не должно. сама либа и ferro_remote вполне собирались на FreeBSD 10 и не отсвечивали.

Подготовка:

И так в системе должны быть библиотеки boost (я всегда ставлю все, чтоб потом 2 раза не бегать), компилятор протобуфера, dev-библиотека протобуфера, само собой git, cmake и g++.

Все вместе это ставится вот как-то так:
$ sudo apt-get install git cmake protobuf-compiler libprotoc-dev g++ libboost-all-dev


Сборка

Я будут собираться в директории /home/data/test, то есть это мой pwd
Код: Выделить всё
 test $ pwd
/home/data/test


Склонируем:
Код: Выделить всё
test $ git clone https://github.com/newenclave/ferro-remote
Cloning into 'ferro-remote'...
remote: Counting objects: 8857, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 8857 (delta 14), reused 0 (delta 0), pack-reused 8828
Receiving objects: 100% (8857/8857), 1012.29 KiB | 166.00 KiB/s, done.
Resolving deltas: 100% (6447/6447), done.
Checking connectivity... done.

Потом в директории ferro-remote создадим директорию для сборки, например build, и сделаем из нее cmake.
Код: Выделить всё
test $ cd ferro-remote/
test $ git submodule init
test $ git submodule update lua
ferro-remote $ mkdir build
ferro-remote $ cd build/
build $ cmake ../
......blablabla и если все верно, то:
-- Generating done
-- Build files have been written to: /home/data/test/ferro-remote/build


2 строчки
git submodule init
git submodule update lua

скачают lua и позволят собраться lua_client'у. Впрочем, для gui клиента это не обязательно.

Можно сделать make. он соберет vtrc библиотеку, либы ferro_remote и агента. ... be patient
Код: Выделить всё
build $ make
[  1%] Generating vtrc-service.pb.h, vtrc-service.pb.cc, ../../../vtrc/include/vtrc-common/protocol/vtrc-service.pb.h
[  2%] Generating vtrc-errors.pb.h, vtrc-errors.pb.cc, ../../../vtrc/include/vtrc-common/protocol/vtrc-errors.pb.h
.....................
[ 99%] Building CXX object agent/CMakeFiles/ferro_remote_agent.dir/subsys-reactor.cpp.o
[100%] Linking CXX executable ferro_remote_agent
[100%] Built target ferro_remote_agent


Проверка:

Теперь есть агент, который можно запустить на локальной машине и подключаться. Проверить можн так:
Код: Выделить всё
 build $ ./agent/ferro_remote_agent -s 0.0.0.0:54321 -s fr.socket -l-
2016-Jul-19 12:02:28.680013 [INF] [log] Started.
2016-Jul-19 12:02:28.680109 [INF] [os] Started.
2016-Jul-19 12:02:28.680429 [INF] [fs] Started.
2016-Jul-19 12:02:28.680649 [INF] [i2c] Started.
2016-Jul-19 12:02:28.680773 [INF] [spi] Started.
2016-Jul-19 12:02:28.680952 [INF] [gpio] Started
2016-Jul-19 12:02:28.681224 [INF] [listener] tcp://0.0.0.0:54321 started
2016-Jul-19 12:02:28.681278 [INF] [listener] unix://fr.socket started
2016-Jul-19 12:02:28.681286 [INF] [listener] Started.
2016-Jul-19 12:02:28.681294 [INF] [main] Agent started.
^C⏎                                                                                                 

Запустился агент, открыл 2 точки: tcp (0.0.0.0:54321) и локальный UNIX-сокет (fr.socket)

Сборка GUI:

Далее сборка gui. Все просто, но есть один нюанс.
Открываем qtcreator и вгружаем проект, который находится тут: /home/data/test/ferro-remote/gui-client/gui-client.pro
Собссно все. Можно собирать, просто запустив сборку. Ctrl+Shift+B

НО! Сборка обломится примерно вот с таким вот диагнозом:
Код: Выделить всё
g++: error: optimized: No such file or directory
Makefile:287: recipe for target 'gui-client' failed
g++: error: debug: No such file or directory
make: *** [gui-client] Error 1

Нужно будет открыть файл /home/data/test/ferro-remote/gui-client/ferro-remote-templ.pri (прям в креаторе) и в секции LIBS убрать все строки:
Код: Выделить всё
   optimized \
....
   debug \

Файл нагенеренный при сборке библиотек и пока его чисткой не занимался. Можно, разумеется убрать все дубли библиотек, но, вроде не мешают.
Без этих строчек проект соберется без проблем.

Работа:
Проверяем...
Запустим агента:
Код: Выделить всё
 build $ ./agent/ferro_remote_agent -s 0.0.0.0:54321 -s fr.socket -l-


в запуск приложения в креаторе пропишем параметр - путь к qml файлу со сценарием. Примеры есть по пути /home/data/test/ferro-remote/gui-client/qml/examples/.
Например /home/data/test/ferro-remote/gui-client/qml/examples/os-run.qml будем запускать удаленную команду.

При запуске появится окошко (см вложение 2)

В верхнем поле нужно вписать "127.0.0.1:54321" (адрес агента), нажать кнопку "connect".
Во второе, например "gedit &" и нажать run. Если все правильно, то запустится gedit.

Соединиться можно и с агентом, запущенным на виртурилке. Уже собраный лежит тут. Нужно просто скопировать на девайс и запустить с нужными параметрами. Далее соединяться qml-никами.

Заключение:
Будут вопросы - пишите. Проект пилю время от времени, может быть где косяк какой со сборкой.
Вложения
run-qtcreator.png
run command line
run.png
run
run.png (8.8 КБ) Просмотров: 5443
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 19 июл 2016, 17:51

Отрыл Grove-LCD,
Изображение
который по i2c управялется. Скрипт
Видео. (снимал с руки телефоном...неудобно)
https://www.youtube.com/watch?v=V3hTkZCZf60

Кажется тег youtube не работает :?
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: QtQuick. QML Конструктор для управлялки.

Сообщение debager » 26 июл 2016, 00:08

Подробней пиши и системно я ни чего не понял .
Забешь на нормальную документацию будешь единственным пользователем.
Проект дельный и труда видать много положил. :)
debager
 
Сообщения: 27
Зарегистрирован: 20 сен 2013, 10:36
Откуда: opel

Re: QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 26 июл 2016, 00:18

А что непонятно? По пунктам, пожалуйста.
Вроде описал все, вплоть до команд. Под Linux, правда, но винды у меня нет, пробовать негде. Товрищ мой собирал под Win без вопросов. Могу его попросить рассказать как. Правда он в Азию уехал и сидит где-то под пальмой, и ему пофик суета :))
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: QtQuick. QML Конструктор для управлялки.

Сообщение debager » 28 июл 2016, 01:56

Напишу как только с делами разгребу .
Поставлю QT попробую не только поставить но и что поменять или добавить.
Кстати было бы здорова не грузить людей сборкой и настройкой среды а выдать
торрент на готовую виртуальную машину с внедренным примером и очень подробными комментариями кода .
и там же в коде описать не только допустимые значения параметров но зачем он нужен и как влияет на работу.
и образ вертурилки в торрент положить тоже совместимый и настроенный чтобы отладка сразу завелась.
debager
 
Сообщения: 27
Зарегистрирован: 20 сен 2013, 10:36
Откуда: opel

Re: QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 14 авг 2016, 21:10

debager писал(а):Напишу как только с делами разгребу .
а выдать торрент на готовую виртуальную машину с внедренным примером и очень подробными комментариями кода.


Да, машину собрал =) Сделал хостовую сборку и сборку для армов, проект с gui_client в qtcreator'e собрал. все в одной машине.
С комментариями, конечно, все плохо. Могу краткий экскурс в компоненты QML написать.

осталась проблема как этот файл передать заинтересованным. С торрентами тут все плохо. Пров рубит.
Файл весит 2.5 гига. В дропбокс тоже не входит :-/ есть идеи?
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: QtQuick. QML Конструктор для управлялки.

Сообщение lexxcorp » 16 авг 2016, 11:05

nwnclv писал(а):
debager писал(а):Напишу как только с делами разгребу .

Файл весит 2.5 гига. В дропбокс тоже не входит :-/ есть идеи?


Яндекс диск, майл.ру облако, если не получить за архивировать или разбить на 2.
Аватара пользователя
lexxcorp
 
Сообщения: 37
Зарегистрирован: 02 апр 2014, 15:06
Откуда: Барнаул

Re: QtQuick. QML Конструктор для управлялки.

Сообщение nwnclv » 29 авг 2016, 12:57

lexxcorp писал(а):Яндекс диск, майл.ру облако, если не получить за архивировать или разбить на 2.


Да, совсем забыл про них. Выложил на google, сегодня вечером, если время будет, напишу, что там получилось =)
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

След.

Вернуться в Софт на управляющих устройствах (iOS, Android, Win/Mac/Linux)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron