Разработка ПО для лазерного толщинамера на FriendlyARM Smart210

в 11:46, , рубрики: c++ Qt Android FriendlyARM, qt, визуализация данных, Разработка под android

Краткое описание: задача заключается в измерении сечения объекта между двумя движущимися лазерными датчиками, весь расчет происходит на стороне компьютера.

В качестве средства разработки была выбрана Qt в связи с тем, что это кросс-платформенный продукт, а также OpenSource. Qt устанавливалась последняя на тот момент версии 5.4. Первоначальное использование программы предполагалось под Windows OS с сенсорным экраном. Где то на середине пути решили переделать по Smart210.

Smart210 разработка наших китайских собратьев, с возможностью установки операционок (в комплекте): WinCE 6, Linux, Qtopia, Android. Также была опробована сборка Debian.

Целевой системой на данном устройстве первоначально была Linux. Работа с контроллером толщиномера осуществляется через FT2232HL.

Использование проприетарных драйверов FTDI имеет ряд этапов и особенностей:

Требуется отключение стандартных библиотек ftdi_sio и usbserial:

sudo rmmod ftdi_sio
sudo rmmod usbserial

Это невозможно сделать без пере сборки ядра с включением этих библиотек в качестве модулей ядра.

Сборку ядра осуществлялась toolschain arm-linux- версии 4.5.1 входящей в комплект от производителя, попытка собрать ядро более новыми компиляторами приводило к неработоспособности сенсорного экрана, т. к. модуль friendlyarm-ts-mtinput (отвечающий за работу multi touch экрана) сваливался в ошибки, возможность пере сборки под новые компиляторы отсутствует (нет исходников).

В файле mini210_linux_defconfig, прописать путь к компилятору и настройку в качестве модулей ядра:

CONFIG_CROSS_COMPILE="arm-linux-"
...
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_FTDI_SIO=m

Хотя CONFIG_USB_SERIAL=m включает все зависимые библиотеки как модули ядра, в том числе и ftdi_sio (на всякий случай CONFIG_USB_SERIAL_FTDI_SIO=m). Затем выполнить команду:

./build

Так как изменился состав модулей необходимо выполнить:

make modules

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

mkyaffs2 rootfs_rtm_210 rootfs_rtm_210.img

После проделанных манипуляций стало возможным использовать библиотеку FTDI.
Qt для работы в Linux брал версию 5.3.2 и собирал с поддержкой linuxfb.

Последующее использование такого подхода выявило недостаточную скорость прорисовки (не реагировал сенсорный экран при прорисовки). Использовался для прорисовки frame buffer, отсутствие поддержки OpenGL ES со стороны драйверов.

Остановился на Android, пришлось перерисовать переписать на использования ttyUSB, т. к. драйвер FTDI под Android существует лишь для Java.

При отключение и подключении FTDI обнаружилось появление 0х00 байта, что приводило к сдвигу, а при фиксированной длине данных в 10 байт и без признака начала пакета создавало неприятность. К тому же обрыв (как аварийная ситуация мог разбить пакет), решение искать первые 10 байт прошедших проверку на CRC8:

bool Controller::readBlockN(uchar *tmp, qint64  blockSize){
    int bytesReceived = 0;
    int bytesRead = 0;
    qint64 m_blockSize = blockSize;
    while (m_blockSize > 0) {
        bytesReceived = read(uart0_filestream, ((void*)&tmp_block) + bytesRead, m_blockSize);
        if (bytesReceived > 0){
            m_blockSize -= bytesReceived;
            bytesRead += bytesReceived;
            if (bytesRead > 9) {
                if (tmp_block[bytesRead - blockSize + 9] == getCRC8((uchar*)&tmp_block + bytesRead - blockSize, 9)){
                    memcpy(tmp, (uchar*)&tmp_block + bytesRead - blockSize, 10);
                }
                else{
                    m_blockSize = 1;
                }
            }
        }
    }
    return true;
}

На этом этапе обнаружилось, что нет прав на использование портов ttyUSB* и это происходит после каждой перезагрузки. Решение — вставить строку при загрузке программы:

system("su -c 'chmod 777 /dev/ttyUSB*'");

Оставалось убрать навигационную панель (максимально использовать экран, кроме того, предполагается, что данном устройстве не будут запускаться другие приложения). Стандартная панель не реагирует на события о скрытии и всегда находится поверх всех приложений. Решил просто её удалить:

system("su -c 'rm /system/app/SystemUI.apk'");

FriendlyARM имеет аккумулятор, что не сбрасывает время, но все же решил вызывать стандартные настройки даты времени Android при запуске приложения:

system("am start -n com.android.settings/.DateTimeSettingsSetupWizard");

Графика полностью прорисована в QgraphicsView:

Статус системы:

Разработка ПО для лазерного толщинамера на FriendlyARM Smart210 - 1

Ручной режим:

Разработка ПО для лазерного толщинамера на FriendlyARM Smart210 - 2

Автоматический режим:

Разработка ПО для лазерного толщинамера на FriendlyARM Smart210 - 3

Видео:

Изыскания и результаты:

Debian:
Громоздкая, занимает ~430Мб в чистом виде, есть поддержка OpenGL ES, используется драйвер mesa. Отсутствует поддержка multi touch экрана.

Qtopia:
Отсутствие поддержки OpenGL ES, да и сама она давно не поддерживается.

Linux (rootfs_rtm_210):
Отсутствие поддержки OpenGL ES, занимает очень мало место в чистом виде ~15Мб, с установленными всеми библиотеками от Qt ~90Мб, скорость загрузки операционки чуть больше 8 сек.

WinCE 6:
Не тестировал серьезно, всего лишь покопался в бинарном файле на упоминание об OpenGL ES, да и потребовало бы спорку под CE. Время поджимало принял решение отложить.

Android:
Поддерживает OpenGL ES, занимает ~215Мб, запускается около 2 минут.

Автор: sfgep

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js