Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
iMX53+OpenGL+Qt
Pavel Ivanchenko
Добавлено 31.03.2014 22:53 Редактировалось 31.03.2014 23:05
0
Сообщение: 1
Pavel Ivanchenko
Admin
4.39

Пункты: 92788
Регистрация: 24.03.2009
Пол: Мужчина
Цитата
1. У нас есть программа, работающая на Windows-XP/7. Коротко о программе. Программа принимает по СОМ-порту от внешнего контроллера раз в секунды показания нескольких датчиков и информацию от GPS-приемника (широта, долгота, курс, скорость). Есть несколько графических окно для отображения датчиков и одно полноэкранное окно, -навигация. Из главного полноэкранного окна при нажатии кнопок могут открываться несколько обычных графических окон (в полный экран) и одно окно навигации на opengl (в полный экран). Программа написана на C#, .Net в VisualSudio, окно навигации писалось с использование TaoFramework (это портированный OpenGL в .Net).

2. Задача, -портировать эту программу на iMX53 в Linux с применением Qt.

2.1. Графическое окно с отображением датчиков перенесено на Qt и работает, проблем нет. Графика программы выводится с использование фреймбуфера:
prog -qws
2.2. Навигационное окно, выполненное в виде отдельного приложения, реализовано и работает:
navig –display simplegl:rgb16 -qws
Через форум сайта www.starterkit.ru был получен buildroot с библиотеками OpenGL, c поддержкой OpenGL ES2, на этом навигация и сделана. Согласно возможностям драйвера поддержки OpenGL, описанном в
http://qt.gitorious.org/qt-labs/simplegl/blobs/master/README
окно OpenGL может быть только одно потоке (приложении) и только на полный экран. По этому утверждению объединить обычное графическое окно на Qt и окно (в полный экран) на opengl es2 в одном приложении, как мы поняли, невозможно. Мы уже готовы с этим смириться, остается только наладить взаимодействие этих программ.

2.3. Пытаемся, пока безуспешно, наладить механизм переключения между этими программами: prog и navig. Обе программы грузятся при включении системы. Главная программа с обычной графикой открывает главное окно и по СОМ-порту начинает принимать и обрабатывать информацию. Программа на OpenGL (однооконное в полный размер) скрыто, принимает информацию, обрабатывает, но не показывает.
При нажатии кнопки на главном окне (программа prog) оно прячется: this.hide(), навигационное окно (программа navig) открывается: this->show(). Таким образом, переключения на OpenGL выполняется. Главное окно действительно исчезает, появляется окно навигации (на OpenGL). Проблема в обратном переключении. Метод hide() для окна OpenGL не работает, minimize() тоже. Погасить окно OpenGL можно либо сняв приложение (например, Control+C, -это нам не подходит), либо закрасить окно черным цветом. Причем закрашивать нужно как минимум два раза, иногда даже три раза.
glearColor(0.0f, 0.0f, 1.0f, 1.0f);//задаем черный цвет
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//красим
swapBuffers();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//красим
swapBuffers();

Самая главная проблема: КАК ЗАСТАВИТЬ ОТКРЫТЬСЯ ОКНУ ОБЫЧНОГО ГРАФИЧЕСКОГО ПРИЛОЖЕНИЕ (программа prog). Иногда оно все таки открывается, но чаще всего нет.

3. В базовом классе QGLWidget есть двойная буферизация для вывода графики. То есть рисуем в одном буфере, а когда все нарисовали, делаем swapbuffer(), который меняет буфера местами. Тот, куда мы рисовали, отображается разом на экране, а второй с экрана перемещается в память для заполнение следующим кадром. По моим экспериментам получается, что буферов не два, а три. Я занес последовательно в буфера несколько кадров, затем занесение отключил, а swapbuffer() продолжает переключать раз в секунду, и я вижу три последних кадра по кругу, пока не остановлю систему.

4. В обычном графическом окне базового класса QWidget буферизации нет (я ее не нашел). Как я понимаю, физически буфер экрана в системе один. Но как эти два приложения заставить работать последовательно, чтобы сначала один рисовал на экране, затем, по команде другой?

5. Я провел такой эксперимент. Запустил обе программы, и заставил их рисовать одновременно. Но, так как обе рисуют раз в секунду (достаточно редко для глаза), я на экране вижу поочередное отображение окон обоих приложений.
5.1. Затем даю команду hide() обычному окну, -оно прячется, видно только окно openGL (оно раз в секунду продолжает рисовать свои кадры). Затем даю команду обычному окну открыться show(), -обычное окно появляется и начинается снова калейдоскоп поочередного отображения окон обоих приложений. То есть обычное окно правильно появляется и прячется.
5.2. Затем даю команду приложению OpenGL спрятаться: hide(). Как правило, после этой команды окно OpenGL замирает, а обычное графическое окно вообще не появляется.
Затем даю команду приложению OpenGL открыться: show(). Снова начинается калейдоскоп поочередного отображения окон обоих приложений.

6. Пытался команду спрятаться приложению OpenGL давать не через hide(), а через флаг, запрещающий в переопределенном методе рисования GLWidget::paintGL() что-либо рисовать. Поведение аналогичное.

7. Если во время калейдоскопа (поочередного отображения окон двух приложений) подгадать момент, сразу после фазы отображения обычного графического окна дать команду окну openGL скрыться (не перерисовывать себя), окно OpenGL дествительно исчезает, а окно обычной графики появляется. Но реализовать это программно, чтобы переключение выполнялось без осечек, не получается.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 31.03.2014 23:02 Редактировалось 31.03.2014 23:05 Сообщение: 2
Pavel Ivanchenko
Admin
4.39

Пункты: 92788
Регистрация: 24.03.2009
Пол: Мужчина
Цитата
По этому утверждению объединить обычное графическое окно на Qt и окно (в полный экран) на opengl es2 в одном приложении, как мы поняли, невозможно.
А что мешает попробовать в fb0 выводить opengl, а в оверлей этого же фреймбуфера (fb1) qt (только не спрашивайте как это сделать - не знаю)?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.04.2014 10:10 Сообщение: 3
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Насколько понимаю корень проблемы в этом

Цитата

окно OpenGL может быть только одно потоке (приложении) и только на полный экран. По этому утверждению объединить обычное графическое окно на Qt и окно (в полный экран) на opengl es2 в одном приложении, как мы поняли, невозможно. Мы уже готовы с этим смириться, остается только наладить взаимодействие этих программ.


нужно просто собрать Qt с поддержкой X-сервера а не собственной кутешной окнной системой QWS, Вариант библиотеки OpenGL для иксов есть, драйвер для иксов тоже есть. Буилдрут у меня есть рабочий - нужно только довести до ума, я занимался этим больше года назад. Займусь этим, как будет готово - выложу.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.04.2014 12:58 Сообщение: 4
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
А что мешает попробовать в fb0 выводить opengl, а в оверлей этого же фреймбуфера (fb1) qt (только не спрашивайте как это сделать - не знаю)?

присоединяюсь к совету - я запускал два независимых приложения под QT на разные экраны одновременно - всё прекрасно работало.. для запуска нужны ключи "в какой fb будем выводить" - легко гуглятся (наизусть не помню)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.04.2014 14:13 Сообщение: 5
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Цитата

присоединяюсь к совету - я запускал два независимых приложения под QT на разные экраны


два экрана - это прекрасно, но какое из приложений должно будет обработать событие ввода на одном и том же экране :) просто отрисовывать два приложения в два разных фреймбуфера думаю особой проблемы нет.

Цитата

При нажатии кнопки на главном окне (программа prog) оно прячется: this.hide(), навигационное окно (программа navig) открывается: this->show(). Таким образом, переключения на OpenGL выполняется. Главное окно действительно исчезает, появляется окно навигации (на OpenGL). Проблема в обратном переключении. Метод hide() для окна OpenGL не работает, minimize() тоже. Погасить окно OpenGL можно либо сняв приложение (например, Control+C, -это нам не подходит), либо закрасить окно черным цветом. Причем закрашивать нужно как минимум два раза, иногда даже три раза.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.04.2014 15:49 Сообщение: 6
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
два экрана - это прекрасно, но какое из приложений должно будет обработать событие ввода на одном и том же экране :) просто отрисовывать два приложения в два разных фреймбуфера думаю особой проблемы нет.

а это уже проблема программиста и дизайнера интерфейса софта..

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

бОльший вопрос вызывает возможность запуска более одной копии QT с OGL..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.04.2014 16:00 Редактировалось 01.04.2014 16:28 Сообщение: 7
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Цитата

фокус ввода отлично переключается программно между физически разными экранами,


а как быть с одним тачскрином ?

Цитата

соответственно, если событие над активным окном, то оно и отрабатывает..


одна маленькая проблема - они оба активны, то что одно закрашивает другое как у ТС вовсе не значит что то другое становится неактивным

Цитата

бОльший вопрос вызывает возможность запуска более одной копии QT с OGL..


с иксами не должно быть проблем и с QWS можно работать но для него нет плагина нормального, на форуме фрискейл кто-то писал но помоему так и не дописал да и исходников я не видел -только дема кривенькая.

PS может конечно и можно что-то придумать с оверлеем и переключать фокус ввода, но по-моему ничего хорошего не получится из этого - надо что-то придумывать как переключать постоянно видимость приложения с OpenGL - плагин не позволяет его скрыть вообще, придется напрямую к фреймбуферу обращаться и перенастраивать постоянно прозрачность - полностью прозрачен/непрозрачен
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 01.04.2014 17:18 Сообщение: 8
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
одна маленькая проблема - они оба активны, то что одно закрашивает другое как у ТС вовсе не значит что то другое становится неактивным


не согласен, исходя из:
Код
2.3. Пытаемся, пока безуспешно, наладить механизм переключения между этими программами: prog и navig.


работать должна одна из программ, запустили prog, насосали gps данных и запустили отрисовку navig.. закончили навигацию, вернулись в prog..

свои состояния программы знают и могут игнорировать ввод данных при неактивности..

если уж совсем припрет, можно выделить виртуальные области на общем экране и встроить фильтр для фильтрации "чужих" событий..
пусть программист потеет..

Цитата
с иксами не должно быть проблем и с QWS можно работать

это забота программиста - правильно выбрать среду для разработки.. лично я бы не стал громоздить Иксы под такой класс задач без крайней необходимости..

Цитата
надо что-то придумывать как переключать постоянно видимость приложения с OpenGL - плагин не позволяет его скрыть вообще,

простейший заброс "opengl hide window"
выводит на треды со словами "glutHideWindow()" на www.opengl.org..
может ТС надо тщательнее погуглить, т.к. с его слов "это не работает" не означает, что не действительно не работает..

Цитата
придется напрямую к фреймбуферу обращаться и перенастраивать постоянно прозрачность - полностью прозрачен/непрозрачен

если вариант устраивает и стабильно работает, то имеет право на реализацию..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
popkov
Добавлено 01.04.2014 17:20 Сообщение: 9
popkov
5

Пункты: 728
Регистрация: 31.07.2013
Комментарий от первоисточника проблемы.
Проблема дествительно только в переключении окон. Проблема фокуса ввода, от кнопки или тачскрина, не стоит пока внимания. Спрособ решения фокуса ввода есть, не хочу вдаваться в подпробности, - это не главное.
Спуститься к концу Подняться к началу
Персональная информация
popkov
Добавлено 01.04.2014 17:34 Сообщение: 10
popkov
5

Пункты: 728
Регистрация: 31.07.2013
Цитата
Цитата
нужно просто собрать Qt с поддержкой X-сервера а не собственной кутешной окнной системой QWS, Вариант библиотеки OpenGL для иксов есть, драйвер для иксов тоже есть. Буилдрут у меня есть рабочий - нужно только довести до ума, я занимался этим больше года назад. Займусь этим, как будет готово - выложу.


Очень интересное предложение. Если будет такой buildroot я обязательно попробую. Заранее спасибо.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux