Последнее обновление:
August 28, 2017

Есть мысль... Жми, напиши!
Что имеем: Постов : 167 Авторов: 1 Категорий: 37

Компиляций libusb из исходников на Windows

Тут особо нечего рассказывать, всё не так трудно, поэтому минимум комментов.

Качаем MSYS2, ставим, запускаем  C:\msys32\mingw32.exe

pacman -Syu
pacman -Su
pacman -S git
pacman -S base-devel 
pacman -S libtool
pacman -S mingw-w64-i686-toolchain

touch /e/LibUSB2
cd /e/LibUSB2/
git clone https://github.com/libusb/libusb .
./autogen.sh
touch build-Win32
cd build-Win32
touch bin
../configure --prefix=/e/LibUSB2/build-Win32/bin --build=i686-w64-mingw32 --host=i686-w64-mingw32
make -j4
make install

Вся либа будет в /e/LibUSB2/build-Win32/bin.

Вот как-то так =)

Views :

9

Кросскомпиляция Qt 5.7, Qt 5.8 для Raspberry Pi 1,2,3 под Windows

В общем на Ubuntu скомпилили, открываем пост и компилим теперь под Windows.

1. Качаем актуальную версию Raspbian Jessie  и с помощью WinFLASHTool  пишем её на сд карточку.

2. так же.

3.

Качаем msys2, ставим в папку C:\SysGCC\msys2\

Качаем MinGW 4.9.2, распаковываем в папку C:\SysGCC\mingw32

Качаем Python 2.7.x

Запускаем C:\SysGCC\msys2\mingw32.exe,

pacman -Syu #попросит закрыть - закрываем, запускаем вновь и прописываем далее: 
pacman -Su 
pacman -S openssh 
pacman -S rsync
pacman -S make 
pacman -S perl 
pacman -S python
pacman -S python2
pacman -S wget
pacman -S patch
pacman -S pkg-config 
pacman -S diffutils

и остальное прописываем так же

4.  Качаем тулчейн и ставим в C:\SysGCC\Raspberry

5. Запускаем C:\SysGCC\Raspberry\TOOLS\UpdateSysroot.bat, нажимаем select, подключаемся к малине (пользователь «pi» пароль «raspberry») и в список синхронизации дописываем

/opt/vc/

6. Пропускаем, за нас это сделал шаг 5.

7.

cd /c/SysGCC/Raspberry
git clone --recursive https://github.com/qt/qt5 -b 5.7 Qt57Sources
cd Qt57Sources
BASEPATH=/c/SysGCC/Raspberry
PATH=$PATH:/c/SysGCC/Raspberry/bin
PATH=$PATH:/c/SysGCC/mingw32/bin
./configure -skip wayland -c++std 11 -skip webkit -release -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$BASEPATH/bin/arm-linux-gnueabihf- -sysroot $BASEPATH/arm-linux-gnueabihf/sysroot -opensource -confirm-license -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ -skip qtscript -make libs -prefix $BASEPATH/qt5pi -extprefix $BASEPATH/qt5pi -hostprefix $BASEPATH/qt5 -v
make -j 4
make install

Здесь компилится для Raspberry Pi 1, для 2 и 3 в исходном посте.

Для Qt 5.7 нужно применить патчик:

wget http://pavelk.ru/wp-content/uploads/qt57raspberrypi.patch
patch -p1 < qt57raspberrypi.patch

8. так же

9. так же

10. так же

11. так же

12. так же

12.1. так же

12.2. Путь C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-g++

12.3. Путь C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-gdb
           для qmake путь C:\SysGCC\Raspberry\qt5\bin\qmake

12.4. так же

12.5. так же

14. так же

15. ????

16. PROFIT!

Views :

566

Кросскомпиляция Qt 5.9 для Raspberry Pi 1,2,3

Пока в разгаре новогодние праздники захотелось попробовать в действии Raspberry Pi (модель 1, но так же подходит и для 2,3), а именно чего-нибудь для неё написать, хотя бы Hello World с помощью Qt. Ставить весь Qt на саму малинку как-то долго, да и пока на ней компилируется простейшая программа можно упиться в усмерть, поэтому будем настраивать кроссс-компиляцию, что бы всю разработку вести на своём пк (Ubuntu 16.10  x64).

Приступаем.

Обновлено для Qt 5.9

1. Первым делом необходимо скачать образ ОС для малинки, это будет raspbian и залить её на SD карточку, которая уже должна быть воткнута.

mkdir ~/Projects/RaspberryPI 
cd ~/Projects/RaspberryPI 
wget http://downloads.raspberrypi.org/raspbian_latest -O wheezy-raspbian-latest.zip 
unzip wheezy-raspbian-latest.zip 
sudo dd if=2016-11-25-raspbian-jessie.img of=/dev/mmcblk0 bs=4M
С новыми версиями Raspberry Jessie может не компилиться, либо для этого придётся бить в бубен. Проверенная версия 2016-11-29, качать тут.

Кстати, что бы узнать адрес флэшки, наберите lsblk

Если так случалось, что нет картридера, то залить прошивку можно и на винде с помощью win32diskimager (запускать от рута)

2. Когда заливка завершиться, вытаскиваем СДшку и загружаем с неё малинку.

Теперь её немножко надо настроить, переходим Menu -> Preferences -> Raspberry Pi configuration

Жмём «expand filesyste», Включаем «ssh», «GPU memory» ставим в 256 и «overclock» на 950, перезагружаемся.

Подключаемся к сети (если есть свисток, то к можно по вафле), вбиваем в консольке (Menu->Accessories->Terminal)  ifconfig, запоминаем айпишник, на этом пока что всё.

3. Приконнектимся к малинке по ssh, раскомментим получение исходников пакетов, установим нужные пакеты и создадим нужные папки

ssh pi@192.168.2.101  (пароль по дефолту "raspberry")
sudo nano /etc/apt/sources.list  #расскомментить строчку с deb-src
sudo apt-get update
sudo apt-get build-dep qt4-x11 # и идём пить кофе минут 30
sudo apt-get build-dep qt5-default
sudo apt-get build-dep libqt5gui5
sudo apt-get install build-essential perl python git
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison
sudo apt-get install libbz2-dev libgcrypt11-dev libdrm-dev libcups2-dev libatkmm-1.6-dev
sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
sudo apt-get install xcompmgr libgl1-mesa-dri 
sudo apt-get install libalut-dev libalut0 mesa-utils
sudo raspi-config #enable GL driver from advanced options
sudo mkdir /usr/local/qt5pi
sudo chmod -R 777 /usr/local/qt5pi

4. Так, возвращаемся к хосту, качаем тулчейн:

mkdir raspi
cd raspi
git clone https://github.com/raspberrypi/tools

5. Создаём sysroot и через rsync синхронизируем его с малиновым, что бы оттуда взять заголовочники, либы и компилятор

IP=192.168.2.101 # айпишник малинки
rsync -avz pi@$IP:/lib sysroot  # опять идём пить кофе
rsync -avz pi@$IP:/usr/include sysroot/usr
rsync -avz pi@$IP:/usr/lib sysroot/usr # можно сходить просраться
rsync -avz pi@$IP:/opt/vc sysroot/opt

6. Дальше необходимо поправить символьные ссылки, что бы они были относительно нашей скопированной sysroot, для этого есть готовый скриптик, качаем и запускаем:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

7. Теперь можно склонировать Qt, сконфигурировать и запустить на компиляцию

git clone https://github.com/qt/qt5 -b 5.9.0 Qt59Sources
cd Qt59Sources
perl init-repository --module-subset=default,-qtwebkit,-qtwebkit-examples,-qtwebengine,-qtquick1 
BASEPATH=~/Projects/RaspberryPI/raspi # базовый путь, где все наши манипуляции происходят (без слэша на конце)
./configure -skip wayland -skip webkit -no-xcb -no-icu -nomake tests -nomake examples -c++std 11 -optimized-qmake -reduce-exports -no-pch -release -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$BASEPATH/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot $BASEPATH/sysroot -opensource -confirm-license -make libs -prefix $BASEPATH/qt5pi -extprefix $BASEPATH/qt5pi -hostprefix $BASEPATH/qt5 -v
make -j 4 # и поспим часик (4 - количество ядер проца, для ускорения)
make install

Кстати, тут компилиться для Raspberry Pi 1, поменяйте в -device linux-rasp-pi-g++  на -device linux-rasp-pi2-g++ для Raspberry Pi2 и на -device linux-rpi3-g++ для Raspberry Pi 3, а так же добавить -no-use-gold-linker.

8. Теперь закинем на малинку скомпилированные библиотеки и заголовочники Qt:

cd ../
rsync -avz qt5pi pi@$IP:/usr/local

9. Ну и можно собрать пример и закинуть на малинку:

cd Qt59Sources/qtbase/examples/opengl/qopenglwidget
$BASEPATH/qt5/bin/qmake
make
scp qopenglwidget pi@$IP:/home/pi

10. На девайсе необходимо дать знать линковщику о наших либах, а так же создать qt.conf в папке, откуда будем запускать все Qt приложения:

ssh pi@192.168.2.101 (пароль по дефолту "raspberry")
echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
echo QT_PLUGIN_PATH=/usr/local/qt5pi/plugins/ | sudo tee -a /etc/environment
printf "[Paths]\nPlugins=/usr/local/qt5pi/plugins\nQml2Imports=/usr/local/qt5pi/qml" | sudo tee ~/qt.conf
cd /usr/local/qt5pi/lib
sudo ldconfig

Перезагружаем малинку.

11. Но запускать ещё рано, у rasbian по дефолту грузиться mesa драйвер и opengl пахать не будет по нормальному, поэтому заставим её использовать нужный:

Не факт! Сначала всё таки лучше попробовать запустить =)
sudo rm /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2

Вот теперь наконец-то можно запустить пример! Он на малинке /home/pi/qopenglwidget

Если не запускается, в консольке прописываем

export QT_LOGGING_RULES=qt.qpa.*=true
./qopenglwidget

И гуглим ошибки.

12. С этим разобрались, теперь настроим QtCreator что бы можно было компилить и запускать на малинке в один клик:

12.1. Параметры->Устройства->Добавить
Обычное Linux-устройство
название на свой вкус и цвет
вводим айпишник, логин и пароль
завершить

12.2. Параметры->Сборка и запуск->Компиляторы->Добавить
GCC
Название: Raspberry Pi GCC
Путь: /home/pavelk/Projects/RaspberryPI/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++

12.3. Параметры->Сборка и запуск->Отладчики->Добавить
Название: Raspberry Pi GDB
Путь: /home/pavelk/Projects/RaspberryPI/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gdb

12.4. Параметры->Сборка и запуск->Профили Qt->Добавить
Название: Qt 5.6.3 Raspberry Pi
Путь: /home/pavelk/Projects/RaspberryPI/qt5/bin/qmake

12.5. Параметры->Сборка и запуск->Комплекты->Добавить
Название: Raspberry Pi
Тип устройства: Обычное Linux-устройство
Устройство: выбираем добавленное из первого шага
Компилятор C++: Raspberry Pi GCC
Отладчик: Raspberry Pi GDB
Профиль Qt: Qt 5.6.3 Raspberry Pi

12.6. Нажимаем «Применить».

14. Создаём новый проект, в *.pro файл добавляем:

INSTALLS        = target
target.path     = /home/pi

Компилим и после завершения проект должен запуститься на малинке.

Вот как-то так в общем =)

P.S. Большая часть была взята с https://wiki.qt.io/RaspberryPi2EGLFS с моими небольшими правками — думал всё сложнее будет =)

 

Views :

2319

Программирование и отладка STM32F3 Discovery в QtCreator под Windows

Впринципе, алгоритм действий точно такой же, как и в предыдущем посте под Ubuntu

Обновил ссылку на новый ARM GCC

Здесь приведу лишь отличия по пунктам

  1. Качаем  драйвер, распаковываем и ставим. Вместо ST-Link поставим OpenOCD  , скачиваем, распаковываем в любую папку.
  2. так же
  3. Качаем GCC ARM с https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads (справа в списке экзешник) и ставим.  отладчик qtcreator-gdb-7-7-mingw32_nt-6-1-i686 (т.к. для Qt Creator нужно, что бы он был с поддержкой питона), распаковываем в любую папку и прописываем полный путь, имя на ваше усмотрение.
  4. Путь компилятораC:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin\arm-none-eabi-gcc.exe (либо в ту папку, куда поставили)
  5. При добавлении выбираем OpenOCD, запуск в режиме pipe,
    исполняемый файл: прописываете полный путь до OpenOCD.exe,
    файл конфигурации ставите <full path>\openocd-0.9.0\scripts\board\stm32f3discovery.cfg  под свою плату.
  6. Также
  7. Также

Вот как -то так =)

Если вылетает при отладке, либо при её завершении, поставьте в Qt Creator -> Инструменты -> Параметры -> Отладчик -> GDB, расширенные
галку у «Использовать асинхронный режим для работы с программой»
Если будет ошибка «Unknown remote qXfer reply: OK», то см. пункт 5.1 из статьи для Ubuntu

P.S  Вместо OpenOCD можно использовать старую добрую st-link-utility под Windows, но она старовата и, как мне кажется, тормознута.

Views :

381

Программирование и отладка STM32F3 Discovery в QtCreator под Ubuntu

Спустя три года опять решил поиграться с STM32F, но уже вплотную.

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

Ось — Ubuntu 16.04, под Windows тут недалеко.

1.  Поставим сам отладчик для STM т.е. gdb сервер

Для этого клонируем репозиторий и собираем ST-Link Utility

cd ~/Projects/ST-Link-Utility
git clone https://github.com/texane/stlink .
make release
sudo make install
sudo ldconfig
sudo udevadm control --reload-rules
sudo  udevadm trigger

Вот впринципе сервер скомпиллен, запускать его для вывода справки:

st-util -h

2. Включаем в QtCreator плагин Help -> About Plugins -> галка напротив BareMetal и перезапускаем QtCreator

3. Дальше необходимо поставить компилятор и отладчик для архитектуры ARM

sudo apt-get install gcc-arm-none-eabi
sudo apt-get install gdb-arm-none-eabi

4. Добавляем их в QtCreator

Preferences -> Build & Run -> Compillers -> Add -> GCC

Название на ваше усмотрение, у меня: arm-none-eabi-gcc

Путь прописываем такой: /usr/bin/arm-none-eabi-gcc

Preferences -> Build & Run -> Debuggers -> Add

Название на ваше усмотрение, у меня: arm-none-eabi-gdb 

Путь прописываем такой: /usr/bin/arm-none-eabi-gdb 

5. Создадим устройство, переходим в Preferences ->BareMetal -> Add ST-Link

название на ваше усмотрение, у меня ST-Link-Utility

режим запуска: TCP/IP

исполняемый файл: st-util

хост: localhost, порт: 4242

5.1 Нужно дать отладчику дополнительное время для ожидания подключения:

Options->Debugger->GDB->Additional Startup Commands и прописать

set remotetimeout 10

6. Теперь добавляем комплект сборки:

Preferences -> Build & Run -> Kits -> Add

Название на ваше усмотрение, у меня Qt for Bare Metal

Тип устройства: Bare Metal

Устройство: Нажимаете Manager -> Add -> Bare Metal

Название на ваше усмотрение, у меня ST-Link1

Тип сервера gdb:  ST-Link-Utility (из предыдущего шага)

Компилятор:  как задали в предыдущем шаге, у меня arm-none-eabi-gcc

Отладчик: как задали в предыдущем шаге, у меня arm-none-eabi-gdb

Профиль Qt: отсутствует

7. Так, с подготовкой закончили, создаём новый проект, импортировав его шаблон из Git репозитория File-> New -> Import -> Git.

Репозиторий с шаблоном: https://github.com/Riflio/STM32F3DiscoveryQtCreatorTemplate

Путь выбираете свой.

Смените комплект на Qt for Bare Metal и можно наконец то прожать Run, в окне вывод приложения должно появиться примерно это:

Отладка запущена
st-util 1.2.0-147-g3de5cf0
Flash page at addr: 0x08000000 erased
Flash page at addr: 0x08000800 erased
Flash page at addr: 0x08001000 erased

И светодиоды должны начать зажигаться по кругу.

Если вылетает при отладке, либо при её завершении, поставьте в Qt Creator -> Инструменты -> Параметры -> Отладчик -> GDB, расширенные
галку у «Использовать асинхронный режим для работы с программой»
Если будет ошибка «Unknown remote qXfer reply: OK«, то см. пункт 5.1

P.S. Как создавать шаблон под другие контроллеры?
Сделать его достаточно просто, потребуется CMSIS — в ней содержатся описания для доступа к регистрам периферии и STM32F30x_StdPeriph_Driver (в новых версиях переименован в HAL)
Всё это ищется в недрах сайта st.com    ldscripts были найдены в каком-то демо-проекте 😀

Вот как-то так =)

Views :

685

Ubuntu LTSP fat clients install OPENCHROME drivers

На этот раз достался очередной толстый клиент, но с видяхой VIA VX900, подключил в сеть и опять облом: картинка вся в мыле, не то разрешение и не работает OpenGL, при попытке узнать как он там:

glxinfo

Получаем кучу

Xlib:  extension "GLX" missing on display ":0.0".

Понятно дело, в предыдущий раз были поставлены дрова на Нвидию т.к. остальные клиенты на ней, а теперь зоопарк.

Чтож, добавим в эот зоопарк дрова на VIA VX900, а именно свободные openchrome

Переходим в рут к ltsp, подключаем нужные разделы и ставим дрова:

sudo su
export LTSP_HANDLE_DAEMONS=false
chroot /opt/ltsp/i386
mount -t proc proc /proc
apt-get install xserver-xorg-video-openchrome

разумеется нужно в lts.conf указать конкретный драйвер:

[client mac]
   XSERVER=openchrome

Можно попробовать перегрузиться, но по glxinfo опять облом =(

Смотрим /var/log/xorg.0.log, а там

 LoadModule: "glx"
...
Module glx: vendor="NVIDIA corporation"

Походу, что-то не оттуда грузиться, поэтому сделаем свой xorg.conf.openchrome, который укажем в настройках lts.conf и засунем в него портянку (взял из гугла), где в секции FIles укажем дефолтные пути загрузки:

nano /etc/X11/xorg.conf.openchrome
xorg.conf.openchrome

и пропишем в lts.conf его явно:

[client mac] 
X_CONF=/etc/X11/xorg.conf.openchrome

Можно пробовать перезагрузиться, разрешение должно прийти в норму, а вот с glxinfo опять облом, опять же смотрим xorg.0.log

AIGLX error: dlopen of /usr/lib/xorg/modules/drivers/i965_dri.so failed (/usr/lib/xorg/modules/drivers/i965_dri.so: undefined symbol: _glapi_set_dispatch)

Вот падла, что-то опять не оттуда загрузил, проверяем откуда libglx.so берёт зависимости:

ldd /usr/lib/xorg/modules/extensions/libglx.so

а там

libGL.so.1 => /usr/lib/nvidia-340/libGL.so.1

Бля, тащит libGL от Нвидии. Ладно, значит Нвидиа подсунула в ld свои настройки, идём в /etc/ld.so.conf.d смотрим в *.conf файлах отголоски Нвидии и заменяем на папку, откуда по идее должен быть libGL.so.1 (можно узнать, заюзав find / -name «libGL.so.1»)

/usr/lib/i386-linux-gnu/mesa

Ну и не забываем обновить кэш ld:

ldconfig

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

ha_ha
Таким макаром мы сломали загрузу дров Нвидии.

Создадим и для неё отдельный xorg.conf.nvidia

xorg.conf.nvidia

не забудем прописать в lts.conf для клиентов с Нвидиа карточками

[client mac] 
X_CONF=/etc/X11/xorg.conf.nvidia

Но это ещё не всё…

Дело в том, что Nvidia подменяет системный libGL своим…, а мы заменив пути в /etc/ld.so.conf.d   тем самым указали использовать системный.

и через xorg.conf это никак не настроить =((    Тоесть придётся перед загрузкой клиента заранее прописывать какой там путь должен быть.

Как это сделать более элегантно я не придумал, кроме как запускать скрипты из rc.local

 

 

Вот как-то так =)

Views :

149

Ubuntu LTSP fat clients install NVIDIA drivers

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

Пришлось поплясать с бубном, что бы внедрить в дистрибутив драйвера от Нвидии, т.к. простой установкой nvidia-current дело не обошлось и всё равно грузился драйвер vesa.

Чтож, погнали:

переключаемся в рут к ltsp и монтируем нужные разделы:

sudo su
export LTSP_HANDLE_DAEMONS=false
chroot /opt/ltsp/i386
mount -t proc proc /proc

обновим систему:

sudo su
apt-get update
apt-get dist-upgrade

снесём отголоски предыдущих установок:

apt-get remove --purge nvidia-*
apt-get autoremove

Но это потянет за собой и оболочку, поэтому её нужно вернуть обратно (замените на свою, у меня lubuntu):

apt-get install lubuntu-desktop

установим заголовочники ядра и утилиты для пересборки:

apt-get install dkms build-essential linux-headers-generic

выпилим намертво vesa:

echo options nouveau modeset=0 | tee -a /etc/modprobe.d/nouveau-kms.conf
echo 'nouveau' | sudo tee -a /etc/modules
update-initramfs -u
nano /etc/modprobe.d/blacklist-nouveau.conf
>>blacklist nouveau
>>blacklist lbm-nouveau
>>options nouveau modeset=0
>>alias nouveau off
>>alias lbm-nouveau off

Что бы наверняка, можно вообще удалить её (не забудьте глянуть будет ли оболочка в списке зависимостей, если что — вернуть обратно, как-написано выше ):

apt-get --purge remove xserver-xorg-video-nouveau 

ну и ставим новые дрова (гляньте на сайте Нвидии какие подходят):

apt-get install nvidia-340

закругляемся:

umount /proc
exit
sudo ltsp-update-kernels
sudo ltsp-update-image

Осталось только в когфиге lts.conf прописать у клиентов какой драйвер использовать:

[client mac]
   XSERVER=nvidia

После перезагрузки клиента можно глянуть какие дрова используются:

lspci -k| grep -EA2 'VGA|3D'

Вот как-то так =)

 

 

 

 

Views :

114

Конвертация QVideoFrame to OpenCV Mat в Qt5.6 и OpenCV3.1

Потребовалось на днях обрабатывать кадры с камеры (Использовалась QCamera) через OpenCV.

Да,  OpenCV может сам захватывать фреймы, но в случае с Qt QCamera работает лучше и есть больше параметров (например выбо р формата YUV или MJPG).

Вот так выглядит конвертация:

 QVideoFrame copy(frame);
    if (frame.isValid() && copy.map(QAbstractVideoBuffer::ReadOnly)) {
        Mat frameYUV=Mat(copy.height() + copy.height()/2, copy.width(), CV_8UC1, (void*)copy.bits() );
        
        Mat frameRGB;
        cvtColor(frameYUV, frameRGB, CV_YUV2BGRA_I420);

        imshow("Video", frameRGB);

    }

C камеры приходит QVideoFrame frame в формате YUV.

Вот и всё =)

 

 

Views :

157

Сервер-ретранслятор для IP H264 камер.

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

В одном проекте возникла необходимость получать видео с IP камеры, вещающей в H264 формате и всё было хорошо, пока клиентов, подключённых к камере, было раз-два да обчёлся.

Но пользователей проекта становилось всё больше и камера просто не выдерживала по 5-6 клиентов и начинала адцки лагать т.к. сеть у неё всего 100 мб, да и производительность около нуля.

Было решено найти софт сервера-ретранслятора, т.к. канал от сервера до клиентов достаточно толстый, а большую часть времени он просто курит бамбук,

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

Чтож, пришлось написать свой велосипед.

Ссылочка на ГитХаб.

Написан на Qt 5.6 без использования сторонних библиотек и других зависимостей.

 

Из плюшек:

  • многопоточность (которая, сука, выжирает всё, что может: по потоку на канал камеры и по потоку на клиента),
  • независимость от сторонних библиотек (просто лень искать было подходящие 😀 )
  • говнокодность (писался на скорую руку, архитектура кастовалась походу раскуривания протоколов RTSP, RTP, SDP )
  • после сборки доработать напильником ( тестировал только на камерах проекта (китайских no-name) и собственных клиентах )
  • выкладываю  как есть  и обновляться будет лишь при возникновении багов в основном проекте т.к. всем — не угодишь и смотри предыдущий пункт =)

 

 

 

Views :

356

Qt настраиваем логирование в проекте (формат лога)

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

Отладочные сообщения в QtCreator достаточно не информативные, особенно в большом проекте, а каждый раз прописывать  что-то вроде:

qDebug()<<"MyClass::functionName params"<<p1<<p2;

что бы знать в каком хоть классе и функции идёт вывод достаточно долго.

Можно перехватить вывод qDebug, а заодно qInfo, qWarning и т.д. и выводить их в файл логов (либо писать в базу, либо отправлять на лог-сервер).

Делается это так:

в main.cpp  сразу после QApplication app(…); прописываем:

 qInstallMessageHandler(myMessageHandler);

В *.pro файле добавляем:

DEFINES += QT_MESSAGELOGCONTEXT

что бы обрабатывался контекст вызова, ну и делаем свой обработчик вывода:

#include <QDateTime>
void myMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &msg)
{
    QString txt;   
    static long long uid=0; //-- номеруем вывод
    //-- название функции с классом, берём только класс и саму функцию
    QRegExp rx("([\\w-]+::[\\w-]+)");
    if (rx.indexIn(context.function) ==-1) return;
    QString function = rx.cap(1);

    QString msgSep = (msg.length()>0)? ">> " : "";

    switch (type) {
        case QtInfoMsg:
            txt = QString("Info: %1%2%3").arg(function).arg(msgSep).arg(msg);
        break;
        case QtDebugMsg:
            txt = QString("Debug: %1%2%3").arg(function).arg(msgSep).arg(msg);
            break;
        case QtWarningMsg:
            txt = QString("Warning: %1%2%3").arg(function).arg(msgSep).arg(msg);
        break;
        case QtCriticalMsg:
            txt = QString("Critical: %1%2%3").arg(function).arg(msgSep).arg(msg);
        break;
        case QtFatalMsg:
            txt = QString("Fatal: %1%2%3").arg(function).arg(msgSep).arg(msg);
            abort();
        break;
    }

    QDateTime dateTime = QDateTime::currentDateTime();
    uid++;
    txt=QString("%1:%2 %3").arg(dateTime.toString(Qt::ISODate)).arg(uid).arg(txt);

    QFile outFile(QString("%1/log-%2.log").arg(".").arg(QDate::currentDate().toString("dd.MM.yy")));
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&outFile);
    ts << txt << endl;
    outFile.close();


}

Дальше, если у вас Линь, то достаточно просто в консольке прописать:

tail -f  log-18.09.16.log

и весь вывод будет идти в реал тайме.

Если разбор выражения на отдельные поля не требуется, то можно сразу задать шаблон вывода:

в main.cpp перед QApplication  прописать:

qSetMessagePattern("%{type} %{if-category}%{category}: %{endif}%{function}: %{message}");

Подробнее можно найти в офф. доках: http://doc.qt.io/qt-5/qtglobal.html#qSetMessagePattern

Вот как-то так =)

Views :

411