motofan logo
46 страниц V « < 41 42 43 44 > »         
> 

Софт для ZN5 и прочих MotoMAGX: MGX и PEP, Разработка, портирование и обсуждение нативного софта

EXL
сообщение 26.8.2011, 12:34 Закрепленное сообщение!


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Мануал: Компиляция приложений для MotoMAGX OS, создание пакетов

Прикрепленное изображение

Для портирования и сборки приложений для нашей платформы в первую очередь нам нужны:

1. Компьютер с Linux OS. Или Windows OS с установленным Virtual BOX/VMware Player, в крайнем случае под виндой можно воспользоваться AndLinux'ом или Cygwin'ом.
2. SDK & Toolchains для MotoMagX + Исходники программ/приложений.
3. Программист/Разработчик или начинающий программист (1 шт.).

Я рассмотрю наиболее приемлемый многим начинающим разработчикам способ, с использованием популярного дистрибутива Ubuntu 11 (Linux OS) в виртуальной машине VMware Player в Windows OS. Те пользователи, у которых стоит Linux OS на компе, могут скачать SDK & Toolchains | Зеркало | Зеркало | Зеркало и сразу перескочить на пункт #4.

Итак, начнём:

1. Загрузка необходимых для разработки инструментов и файлов:

1.1. Скачиваем ISO-образ диска Ubuntu 11. Я качал себе в городской сетке, пошарьтесь в своих тоже, может найдёте. На всякий случай, ссылка: [Download | Скачать] на скачивание с официального сайта: http://www.ubuntu.com Там вы можете выбрать любую конфигурацию под свой компьютер (amd/i386) и т.д.

1.2. Скачиваем VMware Player - Скачать можно с официального сайта: [Download | Скачать] или тут: [Mirror | Зеркало]

1.3. Скачиваем SDK & Toolchains для MotoMagX. [Download | Скачать] - полная версия, включающая в себя 2 тулчейна SDL (От испанцев) + QT (От Ant-On'a) а также python, bennugd, boost и множество различных библиотек. Инструкция по установке есть внутри или ниже можно прочитать подробно.
Тем, кто хочет разрабатывать приложения на SDL, можно скачать небольшой тулчейн для сборки приложений: [Download | Скачать] [Mirror | Зеркало]

2. Мануалы по установке VMware, Ubuntu и SDK & Toolchains в картинках:*
* - картинки открывать лучше всего в новом окне, нажав колёсико мышки. После открытия воспользуйтесь масштабированием, например, в стандартном просмоторщике картинок.

2.1. Установка программы VMware для самых маленьких.
2.2. Установка Linux OS в программу VMware, на примере Ubuntu 11.
2.3. Установка дополнительных инструментов (VMware-tools) в Ubuntu 11. Необходимо для перемещения файлов между Ubuntu в виртуальной машине и виндой.

2.1.:    2.2.:    2.3.:

Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

3. Мануалы по установке, текстом.

3.1. Установка VMware-tools для Ubuntu 11.
3.1.1. Стартуем Ubuntu 11, вверху нажимаем "Virtual Machine", затем "Install VMware Tools...
3.1.2. Ждём загрузки инструментов (нужно подключение к интернету!), затем снова вверху нажимаем "Virtual Machine" -> "Install VMware Tools...
3.1.3. С открывшегося диска копируем архив в формате *.tar.gz например в /home/user (user - ваше имя при установке Ubuntu), распаковываем его.
3.1.4. Запускаем терминал и выполняем в нём следующее:
Код

cd /home/user/vmware-tools-distrib
sudo ./vmware-install.pl

После команды sudo надо ввести пароль, который мы указывали при установке Ubuntu.
3.1.5. Умный скрипт сам предложит вам вводить нужные значения (в квадратных скобках), вводите их.
3.1.6. После успешной установки инструментов, перезагрузите компьютер.
3.1.7. Данные инструменты помогут с лёгкостью переносить файлы из Windows в Linux Ubuntu, просто копируя их или перенося из окна в окно, как вы это делали в Windows. Кроме того, появится множество разрешений для экрана системы.

3.2. Общие папки между системами для обмена файлами.
3.2.1. Стартуем Ubuntu 11, вверху нажимаем "Virtual Machine", затем "Virtual Machine Settings"
3.2.2. Переходим на вкладку "Options", выбираем "Shared Folders"
3.2.3. Переключатель "Folder sharing" ставим в положение "Always enabled", нажимаем кнопку "Add".
3.2.4. На компьютере выбираем любую папку, добавляем её, жмём ОК.
3.2.5. Теперь в Ubunte, в папке /mnt/hgfs видим добавленную нами папку из Windows.

4. Установка SDK & Toolchains.

4.1. Скачиваем архив тулчейна (*.tar.gz), перемещаем его в папку /home/user (user - ник при установке Ubuntu).
4.2. Выполняем команды, новая строка - Enter, вместо user естественно пишем своё имя, после команды sudo потребуется ввести пароль, который мы указывали при установке Ubuntu.
Код

sudo mkdir /mmc
sudo chown user -R /opt
sudo chown user -R /home
sudo chown user -R /mmc
sudo ln -s -d /opt/toolchains/motomagx/arm-eabi -t /
mkdir /opt/toolchains
mkdir /home/z6
mkdir /mmc/mmca1
tar -C /opt/toolchains -xzvf /home/user/motomagx-toolchains_12_08_2011.tar.gz
cp /opt/toolchains/motomagx/setenv-z6.sh /home/z6
cp /opt/toolchains/motomagx/setenv-z6-2.sh /home/z6

4.3. Обратите внимание на имя скаченного вами архива с тулчейном! Именно его нужно вводить в восьмой строке кода, приведённого выше!
4.4. Установленный тулчейн:
Прикрепленное изображение

5. Запуск окружения, компиляция программ и helloworld'a.

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

cd /home/z6
. setenv-z6.sh

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

5.2. HelloWorld.
5.2.1. Создаём пустой файл с именем hello.c в папке /home/z6 (Правой клавишей по пустому месту, "Create Document" -> "Empty File")
5.2.2. Редактируем его содержимое следующим образом, сохраняем:
Код

// Hello World for Motorola Magx!

#include <stdio.h>

int main(void)
{
    printf ("Hello Moto!!!\n");
    return 0;
}

5.2.3. Компилируем:
Код

cd /home/z6
arm-linux-gnueabi-gcc hello.c -o hello

5.2.4. Полученный исполнительный файл "hello" кидаем на телефон и запускаем через телнет!
Код

Mobilinux(TM) 4.1
Welcome 2 Motorola ZN5!
[root@Symbiosis ~]
#> /mmc/mmca1/hello
Hello Moto!!!


5.3. Работа с утилитой Make* и SDL библиотекой.
* - Утилита Make позволяет компилировать достаточно сложные проекты. Подробнее тут: http://ru.wikipedia.org/wiki/Make
5.3.1. Скачиваем следующие исходники, распаковываем в папку /home/z6:
Прикрепленный файл ballgame_src.tar.gz   ( 34 килобайт ) Кол-во скачиваний: 21679

5.3.2. Запускаем терминал и окружение для компиляции, переходим в папку с проектом, выполняем команду make:
Код

cd /home/z6/ballgame_src
make

После выполнения команды будет выполнена компиляция проекта и создан mgx пакет. Для очистки проекта от объектного кода и бинарников, следует выполнить make clean. Для создание mgx пакета - команду make mgx.
5.3.3. Теперь можно кинуть пакет на карту памяти и попробовать запустить. (Для SDL приложений вам потребуется установленные SDL-библиотеки!)
5.3.4. Структура простейшего Makefile для компиляции HelloWorld'a:
Код

# MakeFile for HelloWorld
# Motorola MotoMAGX

CC = arm-linux-gnueabi-gcc  
STRIP = arm-linux-gnueabi-strip
  
CFLAGS = # Необходимые флаги
LDFLAGS = # Необходимые флаги
OPTIMIZATION = -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -O2 # Оптимизация под процессор

INCLUDE = $(CFLAGS) $(OPTIMIZATION) -I/dir # Путь к нужным хэдэрам.
LIBS = $(LDFLAGS) -L/dir # Путь к нужным либам

BIN = hello # Бинарник

all:
    $(CC) -c hello.c -o hello.o $(INCLUDE)
    $(CC) -o $(BIN) hello.o $(LIBS)
    $(STRIP) $(BIN)
clean:
    rm -f ./*.o $(BIN)

Если положить данный Makefile рядом с hello.c, и выполнить make, получим исполнительный файл.
5.3.5. Замена строк, для портирования SDL проектов:
Код

CC:=gcc ---> CC:=arm-linux-gnueabi-gcc
cc=gcc ---> CC=arm-linux-gnueabi-gcc
cxx=g++ ---> CXX=arm-linux-gnueabi-g++
ld=ld ---> LD=arm-linux-gnueabi-ld
ar=ar ---> AR=arm-linux-gnueabi-ar
as=as---> AS=arm-linux-gnueabi-as
oc=oc ---> OC=arm-linux-gnueabi-objcopy
ranlib=ranlib ---> RANLIB=arm-linux-gnueabi-ranlib
strip=strip ---> STRIP=arm-linux-gnueabi-strip
В INCLUDE или CFLAGS добавляем `sdl-config --cflags`
В LIBS или LDFLAGS добавляем `sdl-config --libs` -lнеобходимая_библиотека


5.4. Работа с утилитой configure* и SDL библиотекой.
* - Скрипт configure создаёт Makefile и позволяет компилировать сложные проекты, состоящие из множества файлов. Подробнее тут: http://en.wikipedia.org/wiki/Configure_script
5.4.1. Пример работы. Скачиваем исходники, распаковываем в папку /home/z6:
Прикрепленный файл PTC-demos.tar.gz   ( 33.29 килобайт ) Кол-во скачиваний: 21807

5.4.2. Выполняем следующее:
Код

cd /home/z6/PTC-demos
./configure --host=arm-linux-gnueabi
make

После этих команд у нас появятся исполнительные файлы Fire и Tunnel. Копируем их в корень карточки телефона.
5.4.3. Запускаем через телнет следующим образом:
Код

export LD_LIBRARY_PATH=/mmc/mmca1/games/lib:$LD_LIBRARY_PATH
chmod +x /mmc/mmca1/Fire
/mmc/mmca1/Fire

5.4.4. Для установки файлов в нужную директорию используется prefix и команда make install:
Код

mkdir /home/z6/test
cd /home/z6/PTC-demos
./configure --host=arm-linux-gnueabi --prefix=/home/z6/test
make
make install

После этого нужные нам файлы будут в папке /home/z6/test.
5.4.5. Для чистки объектного кода и бинарников используется команда make clean, для удаления сконфигурированных Makefile'ов используется команда make distclean (полная очистка).

5.5. Деббагер "Segmentation fault"
5.5.1. Качаем gdb и распаковываем архив на карту памяти, в папку /mmc/mmca1/games
Исполнительные файлы должны быть собраны с префиксом '-g' и не должны быть пострипаные
5.5.2. Выполняем (gdb):
Код

ulimit -c unlimited
./<bin_app>
Segmentation fault (core dumped)
файл <core> будет создан
../bin/gdb ./<bin_app> <core>

5.5.3 Выполняем (strace):
Код

../bin/strace ./<bin_app>


5.6. Скрипт запуска для SDL приложений:
Код

#!/bin/sh
mypath=${0%/*}
LIBDIR1=/ezxlocal/download/mystuff/games/lib
LIBDIR2=/mmc/mmca1/games/lib
LIBDIR3=$mypath/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBDIR1:$LIBDIR2:$LIBDIR3
export HOME=$mypath
export SDL_QT_INVERT_ROTATION=1
cd $mypath
sleep 1

exec $mypath/<bin_app>

5.6.1. Если нужен вывод лога в файл, заменяем последнюю строку в скрипте на
Код
exec $mypath/bin_app >$mypath/stdout.txt 2>$mypath/stderr.txt


5.7. HelloWorld с использованием GUI и функций телефона.
5.7.1. Скачиваем архив, распаковываем в /home/z6:
Прикрепленный файл Helloworld_GUI.tar.gz   ( 80.01 килобайт ) Кол-во скачиваний: 21983

5.7.2. Выполняем:
Код

cd /home/z6/папка с нужным проектом
make PLATFORM=EZX-ZN5

или просто make
5.7.3. Кидаем исполнительные файлы на телефон и пробуем запустить, должно получиться что-то типа этого:
Прикрепленное изображение

5.8. Собираем MgxBox.
5.8.1. Скачиваем архив, распаковываем в /home/z6:
Прикрепленный файл MgxBox.tar.gz   ( 5.23 мегабайт ) Кол-во скачиваний: 23248

5.8.2. Выполняем:
Код

cd /home/z6/MgxBox/MgxBox_GUI_ru
make PLATFORM=EZX-ZN5
cd /home/z6/MgxBox/p7zip_9.20.1
make all2
make install
cp -r /mmc/mmca1/p7zip/lib/p7zip /home/z6/MgxBox/Release/app/p7zip

5.8.3. Кидаем папку /home/z6/MgxBox/Release на телефон и пробуем запустить бинарник в папке Release/app, если всё нормально, должно получиться что-то типа этого:
Прикрепленное изображение

6. Создание пакетов вручную.

6.1. Создание MGX пакета:
6.1.1. Создаём папку, помещаем в нее необходимые файлы (дата файлы приложения, исполнительные файлы, скрипт запуска, иконку).
6.1.2. Создаём в папке файл "Имя папки".cfg, редактируем его содержимое следующим образом:
Код

Name = Test
Exec = run.sh
Icon = icon.png
Author = Ant-ON
Version = 1.0
Comment = Port for ZN5 by EXL

Где, Name - имя программы, Exec - запускаемый файл, Icon - иконка, Author - Автор программы, Version - Версия программы, Comment - Комментарий.
6.1.3. Запаковываем папку в любой удобный вам архив (RAR, TAR, GZ, 7Z, ZIP), и переименовываем в "имя программы".mgx

6.2. Создание PEP пакета:
6.2.1. Создаём папку с именем "app", помещаем в нее необходимые файлы (дата файлы приложения, исполнительные файлы, скрипт запуска).
6.2.2. Создаём рядом с папкой файл "description.ini", редактируем его содержимое следующим образом:
Код

[Actions]
Silent=0
InstallApp = 1  
AddAppToMenu = 1

[InstallApp]
Name = Jump n Blob
Exec = run.sh
InstallPath = ../../mmc/mmca1/.Programs/jump_n_blob/
AppLockable = 1
Author = http://www.2d-retroperspectives.org | Philipp. Port by -=Strelok=-, EXL (c) MotoFan.Ru 08.01.2010
Version = 0.1
Daemon = 1
BigIcon= icon.png
AniIcon= icon.png
Icon= icon.png

[AddAppToMenu]
ParentFolder= root

Где, Name - имя программы, Exec - запускаемый файл, Icon | AniIcon | BigIcon - иконка, Author - Автор программы, Version - Версия программы, InstallPath - Путь установки.
6.2.3. Создаём иконку, рядом с папкой "app" и "description.ini".
6.2.4. Запаковываем иконку, папку "app" и "description.ini" в архив формата TAR, затем сжимаем его в GZ переименовываем в "имя программы".pep

7. Полезные ссылки, документация, наши проекты.

7.1. Исходники, сайты с исходниками. Множество интересных проектов есть на code.google.com и sf.net
7.1.1. Исходники проектов, базирующихся на SDL:
libsdl.org/games
libsdl.org/demos
http://dl.openhandhelds.org/cgi-bin/gp2x.cgi?0,0,0,0,46
http://dl.openhandhelds.org/cgi-bin/dingoo.cgi?0,0,0,0,46
7.1.2. Исходники проектов, базирующихся на QT:
http://www.elsix.org/index.php?w=browse - В основном там под Sharp Zaurus, но идеи создания приложений и сорцы найти можно.

7.2. Документация, темы для прочтения:
Пробуем портировать игры и проги сами
Разработка софта под MOTOMAGX, начну небольшой HOWTO
Компиляция нативных приложений под E6/A1200, Создание окружения для компиляции
SDL библиотека
http://plg.lrn.ru/wiki/Заглавная_Страница
http://plg.lrn.ru/doc/sdl/index.html
http://doc.qt.nokia.com

7.3. Проекты:
http://code.google.com/p/open-mgx/ - исходники программ от Ant-On'a
http://code.google.com/p/sdl-magx/ - библиотека SDL HW для MotoMAgx от Ant-On'a
http://code.google.com/p/zmessanger/ - нативная аська, автор Ant-On
http://sourceforge.net/projects/qte2console/ - qte2console от DoomChisel
http://code.google.com/p/motocakerteam/ - исходники программ от испанцев MotoCakerTeam
http://code.google.com/p/zsoft/

8. Мануалы данной темы:

Если кто не может запустить ZN5Encoder в Magic box - пост #290
Нативные заставки на основе портированных мной и Neomoto демок! - пост #291
Мануал по установке Tmake в тулчейн, и правки созданного им MakeFile - пост #484
Изучение разделяемых библиотек (so) - пост #1440
Эмуляция нажатия клавиш на Motorola ZN5 - пост #1684


© EXL for MotoFan.Ru 27.08.2011
Прикрепленный файл ballgame_src.tar.gz   ( 34 килобайт ) Кол-во скачиваний: 21679
Прикрепленный файл PTC-demos.tar.gz   ( 33.29 килобайт ) Кол-во скачиваний: 21807
Прикрепленный файл Helloworld_GUI.tar.gz   ( 80.01 килобайт ) Кол-во скачиваний: 21983
Прикрепленный файл MgxBox.tar.gz   ( 5.23 мегабайт ) Кол-во скачиваний: 23248
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 12.11.2021, 5:00


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
А работало?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 12.11.2021, 5:12


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



EXL, ZN5 и раньше работало как модем+телнет и т.д., а Z6 вот токо сетевое устройство появлялося.


Добавлено позже (12.11.2021, 8:14):
fill.sa, всё наоборот, это из cdc_ether вырезан код MOTOMAGX, а в zaurus остался.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 12.11.2021, 6:58


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
Добавление обратно этого кода в модуль cdc_ether, но с USB_PID 0x6425 проблему не решает? Модуль cdc_ether удалось пересобрать на OpenSUSE?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 13.11.2021, 10:11


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Ну теперь у меня терминал ПК именуєтся как ZN5 crazy.gif
Код
Zn5:~ # busybox ifconfig
enp0s18f2u1 Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          inet addr:192.168.16.2  Bcast:192.168.16.255  Mask:255.255.255.0
          inet6 addr: xxxx::xxx:xxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1494  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:5412 (5.2 KiB)

Zn5:~ # ping 192.168.16.2
PING 192.168.16.2 (192.168.16.2) 56(84) bytes of data.
64 bytes from 192.168.16.2: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 192.168.16.2: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 192.168.16.2: icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from 192.168.16.2: icmp_seq=4 ttl=64 time=0.069 ms
64 bytes from 192.168.16.2: icmp_seq=5 ttl=64 time=0.036 ms
64 bytes from 192.168.16.2: icmp_seq=6 ttl=64 time=0.076 ms
64 bytes from 192.168.16.2: icmp_seq=7 ttl=64 time=0.068 ms
64 bytes from 192.168.16.2: icmp_seq=8 ttl=64 time=0.058 ms
64 bytes from 192.168.16.2: icmp_seq=9 ttl=64 time=0.068 ms
64 bytes from 192.168.16.2: icmp_seq=10 ttl=64 time=0.067 ms
64 bytes from 192.168.16.2: icmp_seq=11 ttl=64 time=0.066 ms
64 bytes from 192.168.16.2: icmp_seq=12 ttl=64 time=0.070 ms
^C
--- 192.168.16.2 ping statistics ---
12 packets transmitted, 12 received, 0% packet loss, time 11248ms
rtt min/avg/max/mdev = 0.036/0.066/0.076/0.010 ms
Zn5:~ # telnet 192.168.16.2
Trying 192.168.16.2...
telnet: connect to address 192.168.16.2: Connection refused

И с тела пингуется ПК, но телнет всеравно не работает.
ПС: режым тулз (6424).

Цитата(EXL @ Вчера, 9:58)
* Модуль cdc_ether удалось пересобрать на OpenSUSE?

Да, токо он раз в 10 больше весит стандартного.
Цитата(EXL @ Вчера, 9:58)
* Добавление обратно этого кода в модуль cdc_ether, но с USB_PID 0x6425 проблему не решает?

Не.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 13.11.2021, 11:13


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 17:11)
* И с тела пингуется ПК, но телнет всеравно не работает.

А USB-устройство в ifconfig не появляется (на стороне компа) и телефона (по ifconfig usbl0 192.168.16.2)?
Возможно без этих устройств ничего работать не будет. Кстати, может быть порты на Telnet у тебя закрыты в системе, поэтому не работает? Нужно открывать 23 порт вроде. В CentOS/RHEL/Fedora вот так открывается:

Код
sudo firewall-cmd --zone=public --permanent --add-service=telnet
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all

В OpenSUSE возможно точно так же.

Цитата(VINRARUS @ Сегодня, 17:11)
* Да, токо он раз в 10 больше весит стандартного.

Это нормально. Там по умолчанию просто debug-символы вкомпиливаются. Их можно обрезать по идее командой:

Код
strip --strip-debug *.ko

ps.gif Кстати можно без make install их подгрузить перед экспериментами вот так:

Код
make V=1
strip --strip-debug *.ko

sudo modprobe usbnet
sudo insmod cdc_ether.ko
sudo insmod zaurus.ko

sudo modprobe -r zaurus
sudo modprobe -r cdc_ether
sudo modprobe -r usbnet


И потом выгрузить (команды через пустую строку).

Цитата(VINRARUS @ Сегодня, 17:11)
* ПС: режым тулз (6424).

А режим "Modem & Tools" это 0x6425? Тогда по идее смена этого USB_PID не играет вообще никакой роли.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 13.11.2021, 13:07


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 14:13)
* А USB-устройство в ifconfig не появляется (на стороне компа)

glare.gif Я ж логи давал:
Цитата(VINRARUS @ 10.11.2021, 21:52)
* [.] zaurus 8-2:1.2 enp0s18f2u1: renamed from usb0

Цитата(VINRARUS @ Сегодня, 13:11)
* Zn5:~ # busybox ifconfig
enp0s18f2u1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.16.2 Bcast:192.168.16.255 Mask:255.255.255.0
inet6 addr: xxxx::xxx:xxx:xxxx:xxxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1494 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:5412 (5.2 KiB)

Цитата(EXL @ Сегодня, 14:13)
* Кстати можно без make install их подгрузить перед экспериментами вот так:

Так и делаю. happy.gif
Цитата(EXL @ Сегодня, 14:13)
* И потом выгрузить (команды через пустую строку).

Я использую rmmod. king.gif
Цитата(EXL @ Сегодня, 14:13)
* А режим "Modem & Tools" это 0x6425? Тогда по идее смена этого USB_PID не играет вообще никакой роли.

Играет, я поменял на 6424. И даже если все 3 всунуть то оно по разному работает.

Сообщение отредактировал VINRARUS - 13.11.2021, 13:09
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 13.11.2021, 13:41


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
Ладно, пофиг пока на этот Telnet, но порты всё-таки проверь. Я в сетях слабо шарю, не могу пока ничего определённого сказать. Я так и не понял каким способом ты достиг того, что у тебя устройство появилось в ifconfig на стороне хоста (компа). Заменой USB_PID на 0x6424?

Цитата(VINRARUS @ 10.10.2021, 4:11)
* А шо, в С++ нету функцыи аналогичной pidof? shok.gif Там же примитивное сканирование /proc...

Кстати, на C++ и Qt 2 функция для сканирования /proc будет выглядеть не настолько огромным листингом, как я предполагал:

Код
static pid_t getFirstPidOfProcess(const QString &aProcessName) {
    const QDir lProcDir("/proc");
    if (lProcDir.isReadable()) {
        QFileInfoListIterator lIt(*lProcDir.entryInfoList(QDir::Dirs | QDir::NoSymLinks));
        for (bool lIsOk = false; const QFileInfo *lFi = lIt.current(); ++lIt) {
            const QString lProcDirName = lFi->fileName();
            const pid_t lPid = lProcDirName.toInt(&lIsOk);
            if (lIsOk) {
                QFile lCmdLineFile("/proc/" + lProcDirName + "/cmdline");
                if (lCmdLineFile.open(IO_ReadOnly)) {
                    QString lCmdLine;
                    if ((lCmdLineFile.readLine(lCmdLine, PATH_MAX) != -1) && lCmdLine.contains(aProcessName))
                        return lPid;
                }
            }
        }
    }
    return -1;
}

Собственно, сопоставимо с версией которая выполняла в Shell утилиту busybox pidof -s phone:

Код
static unsigned long GetPhoneProcessPid(void) {
    unsigned long lResult = 0;
    char lPidBuffer[LENGTH_PID_BUFFER] = { '\0' };
    FILE *lCmdPipe = popen(PHONE_PIDOF_COMMAND, "r");
    if (lCmdPipe) {
        fgets(lPidBuffer, LENGTH_PID_BUFFER, lCmdPipe);
        if (QString(lPidBuffer).stripWhiteSpace().isEmpty())
            TO_ERR("libredkey.so: Error: PID of '%s' pipe command is wrong.\n", PHONE_PIDOF_COMMAND);
        else
            lResult = strtoul(lPidBuffer, NULL, 10);
        pclose(lCmdPipe);
    } else
        TO_ERR("libredkey.so: Error: Cannot execute '%s' pipe command.\n", PHONE_PIDOF_COMMAND);
    TO_DBG("libredkey.so: Debug: PID of 'phone' process is '%lu'.\n", lResult);
    return lResult;
}

Так что заменил её в библиотеке libredkey.so, надеюсь ничего не сломал biggrin.gif

Прикреплённые файлы:
Прикрепленный файл libredkey.zip   ( 14.36 килобайт ) Кол-во скачиваний: 9
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 13.11.2021, 16:13


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



baby.gifЭээээээээээээээээээээээээээээээээээ... ввооообще после ребута на стандартных дровах:
Код
localhost:~ # dmesg
[.] usb 8-1: new full-speed USB device number 6 using ohci-pci
[.] usb 8-1: not running at top speed; connect to a high speed hub
[.] usb 8-1: New USB device found, idVendor=22b8, idProduct=6425, bcdDevice= 1.01
[.] usb 8-1: New USB device strings: Mfr=3, Product=2, SerialNumber=0
[.] usb 8-1: Product: ZN5
[.] usb 8-1: Manufacturer: Motorola Inc.
[.] cdc_acm 8-1:1.0: ttyACM0: USB ACM device
[.] zaurus 8-1:1.2 usb0: register 'zaurus' at usb-0000:00:12.0-1, pseudo-MDLM (BLAN) device, aa:aa:aa:aa:aa:aa
[.] zaurus 8-1:1.2 enp0s18f0u1i2: renamed from usb0


localhost:~ # busybox ifconfig
enp0s18f0u1i2 Link encap:Ethernet  HWaddr bb:bb:bb:bb:bb:bb  
          inet addr:192.168.16.2  Bcast:192.168.16.255  Mask:255.255.255.0
          inet6 addr: xxxx:xxx:xxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1494  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:4858 (4.7 KiB)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:zzz.zzz.zzz.zzz  P-t-P:169.254.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:751 (751.0 B)  TX bytes:800 (800.0 B)

localhost:~> telnet 169.254.0.1
Trying 169.254.0.1...
Connected to 169.254.0.1.
Escape character is '^]'.

Mobilinux(TM) 4.1, Linux/armv6l 2.6.10_dev
MotoMAGX: LinuxJava 6.3, ZiniMOD beta 2
17:38:01 '_'
# busybox ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:401 errors:0 dropped:0 overruns:0 frame:0
          TX packets:401 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:28570 (27.9 KiB)  TX bytes:28570 (27.9 KiB)

ppp0      Link encap:Point-Point Protocol  
          inet addr:169.254.0.1  P-t-P:zzz.zzz.zzz.zzz  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:99 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:4895 (4.7 KiB)  TX bytes:12254 (11.9 KiB)

psd_data5 Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:169.254.0.2  Mask:255.0.0.0
          UP RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1812 (1.7 KiB)  TX bytes:1880 (1.8 KiB)

#

punk.gifКороче openSUSE рулит и я с ПК по модему ZN5 можу в интернет выходить, тогда и телнет работает, но если связь модема в настройках сети KDE отрубить все плюшки тоже пропадают, хотя одно из 2 устройств осталось.
Код
localhost:~ # busybox ifconfig
enp0s18f0u1i2 Link encap:Ethernet  HWaddr bb:bb:bb:bb:bb:bb  
          inet addr:192.168.16.2  Bcast:192.168.16.255  Mask:255.255.255.0
          inet6 addr: xxxx:xxx:xxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1494  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:4858 (4.7 KiB)


Но телнет не работает так. not_i.gif


Добавлено позже (13.11.2021, 19:17):
Значит ему cdc_ether обрезаного хватает, видимо за 9 лет шото новое выросло в ядре...superman.gif

Добавлено позже (13.11.2021, 19:22):
search.gifНо на Z6 модемный режым не включился всёравно, хотя 1 сетевое устройство вроде есть.


Добавлено позже (13.11.2021, 19:30):
ps.gifВот так выглядит:
Прикрепленное изображениеПрикрепленное изображение
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 13.11.2021, 16:30


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS, Это с каким USB_PID у тебя оно работает?

Цитата(VINRARUS @ Сегодня, 23:13)
* Значит ему cdc_ether обрезаного хватает, видимо за 9 лет шото новое выросло в ядре...superman.gif

Да там ничего обрезанного нет. Там, напротив, в китайском cdc_ether почему-то MotoMAGX-устройство добавляется в какой-то Black List. Вот я и думал, может оно как-то влияет. Но похоже никак не влияет.

Цитата(VINRARUS @ Сегодня, 23:13)
* Но на Z6 модемный режым не включился всёравно, хотя 1 сетевое устройство вроде есть.

Может у Z6 там другие USB_PID или USB_VID? Посмотри в Windows на режиме "Modem & Tools" с подцепленным Telnet'ом в Диспетчере устройств.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 13.11.2021, 16:36


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



EXL, модем и тулз (6425), как и прописано в родном заурусе.
Цитата(EXL @ Сегодня, 19:30)
* в китайском cdc_ether почему-то MotoMAGX-устройство добавляется в какой-то Black List. Вот я и думал, может оно как-то влияет. Но похоже никак не влияет.

Может задумка была шобы подключалося всё кроме модема?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 13.11.2021, 16:59


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 23:36)
* Может задумка была шобы подключалося всё кроме модема?

Вряд ли, скорее всего просто по аналогии делали.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 14.11.2021, 7:44


Гуру
******

Группа: Разработчики
Сообщений: 1 240
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



На магиксе а режиме модем эмулируется типовой модем и должен работать со стандарными драйверами модема. Никакого доп кода для этого ненужно.
Про пид я писал, их два в зависимости от режима телефона.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 14.11.2021, 14:43


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Разобрался с тем, как генерировать нажатия клавиш на клавиатуре MotoMAGX-телефонов программно, вставляя KeyEvent'ы прямо в очередь драйвера. Буду писать здесь всю информацию на всякий случай, поэтому пост получится объёмным. Если лень всё это читать, переходите сразу в последний практический раздел в самом низу поста. Итак, в MotoMAGX-телефонах в /dev/ имеется несколько типов устройств. На старой платформе LJ 6.x (Z6, V8, ZN5, U9, Z6W, AURA) используются /dev/keypad0, /dev/keypadI и /dev/keypadB, которые возможно остались ещё в наследство от EZX, а на LJ 7.x (E8, EM30, VE66, EM35, VA76r и MotoMAGX Emulator) используется одно всеобъемлющее устройство /dev/vkm через которое можно управлять огромным количеством всяких разных Event'ов, в т. ч. и сенсорным колесом Omega Wheel. Но пока нас интересует лишь отправка нажатий на кнопки телефона.

Работа с /dev/vkm и /dev/keypadX происходит через функцию ioctl(), в аргументы которой вставляется либо адрес структуры, которая содержит всю необходимую информацию, либо просто нужный keycode у KeyEvent'а, пример кода на языке программирования "C" для двух разных драйверов:

Код
static int send_event_to_vkm_driver(const int vkm_device_fd, const key_code_long_t keycode) {
    fprintf(stderr, "Keycode is: 0x%08X, dec: %u\n", keycode, keycode);

    MOTO_INPUT_EVENT_T vkm_event;
    vkm_event.type = MOTO_INPUT_EVENT_TYPE_KEY;
    vkm_event.event.key_event = (keycode | MOTO_INPUT_KEY_EVENT_PRESSED_MASK);

    return ioctl(vkm_device_fd, MOTO_INPUT_IOC_INSERT_EVENT, &vkm_event);
}

static int send_event_to_keypad_driver(const int keypad_device_fd, const key_code_short_t keycode) {
    fprintf(stderr, "Keycode is: 0x%04X, dec: %hu\n", keycode, keycode);

    return ioctl(device_fd, KEYPAD_IOC_INSERT_EVENT, (keycode | KEYDOWN));
}

Интересный момент. Посылка драйверу обычного keycode'а кнопки означает отжатие клавиши. Для того, чтобы зарегистрировать именно нажатие старший бит в keycode'е должен быть установлен в "1", что достигается конструкцией (keycode | KEYDOWN) для /dev/keypadX, где KEYDOWN это 0x8000 (16-битное целое число) или (keycode | MOTO_INPUT_KEY_EVENT_PRESSED_MASK) для /dev/vkm, где MOTO_INPUT_KEY_EVENT_PRESSED_MASK это 0x80000000 (32-битное целое число).

В итоге у меня получилась такая вот простенькая утилитка pushkey, исходный код которой опубликован здесь: https://github.com/EXL/keyd/blob/master/pushkey/pushkey.c

Использовать её можно как-то так:

Код
|pushkey| by EXL, v1.0, 14-Nov-2021

Usage:
    pushkey <keycode> <device> <mode>

Examples:
    pushkey 0x8001         # Нажать кнопку "1" на устройстве "/dev/keypadI", обычный режим
    pushkey 0x0001         # Отпустить кнопку "1" на устройстве "/dev/keypadI", обычный режим

    pushkey 0x8001 i       # Нажать кнопку "1" на устройстве "/dev/keypadI", обычный режим
    pushkey 0x0001 i       # Отпустить кнопку "1" на устройстве "/dev/keypadI", обычный режим

    pushkey 0x8001 b       # Нажать кнопку "1" на устройстве "/dev/keypadB", обычный режим
    pushkey 0x0001 b       # Отпустить кнопку "1" на устройстве "/dev/keypadB", обычный режим

    pushkey 0x31 i a       # Нажать кнопку "1" на устройстве "/dev/keypadI", режим ASCII
    pushkey 0x31 b a       # Нажать кнопку "1" на устройстве "/dev/keypadB", режим ASCII

    pushkey 0x0001 i s     # Нажать кнопку "1" на устройстве "/dev/keypadI", режим одиночного нажатия
    pushkey 0x0001 b s     # Нажать кнопку "1" на устройстве "/dev/keypadB", режим одиночного нажатия

    pushkey 0x80000004 v   # Нажать кнопку "4" на устройстве "/dev/vkm", обычный режим
    pushkey 0x00000004 v   # Отпустить кнопку "4" на устройстве "/dev/vkm", обычный режим

    pushkey 0x00000004 v s # Нажать кнопку "4" на устройстве "/dev/vkm", режим одиночного нажатия

Распишу немного подробнее. В обычном режиме, который активирован по умолчанию, происходит отправка одного Event'а с выбранным keycode'ом в аргументе утилиты. То есть за нажатием клавиши должен явно следовать вызов этой же утилиты с keycode'ом её отжатия. Подобное в теории можно использовать для эмуляции длительного нажатия клавиши таким образом:

Код
#!/bin/sh
pushkey 0x8001
sleep 2
pushkey 0x0001

Хотя это пока не тестировалось. Режим одиночного нажатия кнопки посылает за Event'ом с keycode'ом нажатия клавиши сразу же Event её отжатия, это наиболее подходящий режим для того чтобы разово эмулировать нажатие какой-либо клавиши на клавиатуре. Режим ASCII наверное действует аналогично режиму одиночного нажатия, только вместо keycode'а в качестве аргумента он принимает код символа из таблицы ASCII, например, у единички это будет 0x31, а вот какие там коды использовала Motorola для таких кнопок, как красная и зелёная трубки, мне неизвестно, поскольку реального мобильного телефона у меня нет, чтобы это проверить.

Касательно устройств, то как уже было отмечено выше, на Motorola ZN5 используется /dev/keypadI и /dev/keypadB, первое устройство реагирует на отправку нажатий цифровой клавиатуры, красной и зелёной трубок и пр. (протестировано), а вот за что отвечает второе устройство я пока не знаю. Возможно за нажатия кнопок на дополнительной Morphing Mode клавиатуре, там где корзинка удаления изображения из приложения Галереи и прочее. Либо же за кнопки на проводной или Bluetooth-гарнитурах. А может быть вообще для каких-то служебных целей, на что намекает комментарий в заголовочном файле ядра. Если кто выяснит назначение /dev/keypadB, отпишитесь пожалуйста в этой теме.

Теперь самое интересное, коды клавиш. Для устройства /dev/vkm я ничего не смог найти в заголовочных файлах, зато нашёл кучку файликов в MotoMAGX Emulator, где перечислены эти коды на различных раскладках клавиатуры, которые видимо планировалось использовать в реальных устройствах. Но похоже что они не совсем полные. Для эмулятора используется раскладка 6x6 (упоминаются ещё 5x5 и 8x8), которая выглядит вот так:

Код
# This file defines the mapping from the function key name to
# the key index used in VKM -- standard 6x6 keypad device driver.
KEYPAD_6              = 0
KEYPAD_8              = 1
KEYPAD_7              = 2
KEYPAD_2              = 3
KEYPAD_4              = 4
KEYPAD_RIGHT          = 6
KEYPAD_DOWN           = 7
KEYPAD_9              = 8
KEYPAD_UP             = 9
KEYPAD_LEFT           = 10
KEYPAD_1              = 12
KEYPAD_3              = 13
KEYPAD_5              = 14
KEYPAD_SIDE_SELECT    = 15
KEYPAD_SIDE_UP        = 16
KEYPAD_MENU           = 18
KEYPAD_SLEFT          = 19
KEYPAD_STAR           = 20
KEYPAD_SEND           = 21
KEYPAD_SRIGHT         = 22
KEYPAD_CARRIER        = 24
KEYPAD_CLEAR          = 25
KEYPAD_POUND          = 26
KEYPAD_SIDE_DOWN      = 28
KEYPAD_AF             = 30
KEYPAD_0              = 32
KEYPAD_IMAGING        = 35
KEYPAD_END            = 36

Файлики эти я тоже прикрепляю, может кому-нибудь они пригодятся. А вот для устройств /dev/keypadI и /dev/keypadB, которые используются на Motorola ZN5, определения кодов кнопок доступны в исходниках ядра, в заголовочном файле keypad.h: https://github.com/fillsa/motomagx-kernel_linux_hardhat/blob/master/linux-2.6.x/include/linux/keypad.h:125-257, их можно все протестировать и посмотреть что именно происходит при их отправке в драйвер. Только нужно не забывать конвертировать их из DEC в HEX, для этого можно использовать python:

Код
python
>>> hex(23)
'0x17'
>>> hex(36)
'0x24'
>>> hex(45)
'0x2d'

Благодаря тому, что отправка Event'ов теперь работает, можно к Web-серверу в телефоне прикрутить не только просмотр экрана, но и удалённое управление телефоном или попытаться доделать VNC Server.

Эмуляция нажатия клавиш на Motorola ZN5

1. Открываем по ссылке файлик keypad.h, находим в нём секцию в которой перечислены keycode'ы.
2. Конвертируем код клавиши из DEC в HEX, например, для клавиши Backspace KEYPAD_CLEAR 22, это будет 0x16.
3. Запускаем утилиту pushkey со слеудующими аргументами и проверяем что эта клавиша нажалась на телефоне:

Код
pushkey 0x0016 i s

4. Повторяем для следующей интересующей нас кнопки.

В итоге для использования утилиты или опубликованного мной API в своей программе можно составить необходимую таблицу заведомо рабочих keycode'ов и их ассоциаций с реальными кнопками на клавиатуре.

Прикреплённые файлы:
Прикрепленный файл smobee_config.zip   ( 6.73 килобайт ) Кол-во скачиваний: 15
Прикрепленный файл pushkey.zip   ( 2.65 килобайт ) Кол-во скачиваний: 15
Прикрепленный файл pushkey_EMU.zip   ( 2.83 килобайт ) Кол-во скачиваний: 13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 14.11.2021, 20:20


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



EXL, класна игрушка! clapping.gif
Цитата(EXL @ Сегодня, 17:43)
* Только нужно не забывать конвертировать их из DEC в HEX, для этого можно использовать python:

Ой, та ладно:
Код
printf "%x\n DEC

А вот шобы играться с шыком:
Код
while read N; do N=`printf "%x\n" $N`; ./pushkey 0x$N b s; done

king.gif

Добавлено позже (14.11.2021, 23:54):
Проблемка с главной кнопой зины
Код
#запускаем камеру:
./pushkey 0x0019 b s

#фокусируемся на мгновение:
./pushkey 0x0036 b s

#фокус не происходит:
./pushkey 0x0036 b

#фоткать не выходит, хотя в режыме видео работает:
./pushkey 0x0019 b s
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 15.11.2021, 11:43


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
Я правильно понимаю, что KeyEvent'ы вставляются как в /dev/keypadI, так и в /dev/keypadB, разницы никакой нет? Или же они вставляются только в /dev/keypadB? Или же /dev/keypadB отвечает только за кнопки камеры? Проясни этот момент.

Цитата(VINRARUS @ Сегодня, 3:20)
* Проблемка с главной кнопой зины

Там кстати возможна такая ситуация, что зажатие кнопки детектируется не как обычное зажатие, а как очередь из KeyEvent'ов постоянных одиночных нажатий с каким-либо произвольным промежутком. У себя на эмуляторе попробовал верхнюю команду и удалось получить зажатие клавиши, попробуй нижнюю команду у себя:

Код
for i in $(seq 1 10); do ./pushkey_EMU 0x80000004 v; usleep 100000; done; usleep 100000; ./pushkey_EMU 0x00000004 v

for i in $(seq 1 10); do ./pushkey 0x8036 b; usleep 100000; done; usleep 100000; ./pushkey 0x0036 b

Нажатие кнопки фокуса будет как 0x8036, а вот отжатие на 0x0036, а ты просто отжимал эту кнопочку по идее. В общем экспериментируй потихоньку.

ps.gif Если будет время, составь табличку вида:

Код
+-------------------------------------+----------------------------------+-------------------+-------------------+
| Название реальной кнопки в телефоне | Название кнопки в файле keypad.h | Код клавиши в HEX | Код клавиши в DEC |
+-------------------------------------+----------------------------------+-------------------+-------------------+
|                 "0"                 |            KEYPAD_0              |        0x00       |         0         |
|                 "1"                 |            KEYPAD_1              |        0x01       |         1         |
|                 "2"                 |            KEYPAD_2              |        0x02       |         2         |
|                 "3"                 |            KEYPAD_3              |        0x03       |         3         |
|                 "4"                 |            KEYPAD_4              |        0x04       |         4         |
|                 "5"                 |            KEYPAD_5              |        0x05       |         5         |
|                 "6"                 |            KEYPAD_6              |        0x06       |         6         |
|                 "7"                 |            KEYPAD_7              |        0x07       |         7         |
|                 "8"                 |            KEYPAD_8              |        0x08       |         8         |
|                 "9"                 |            KEYPAD_9              |        0x09       |         9         |
|                 "#"                 |          KEYPAD_POUND            |        0x0A       |         10        |
|                 "*"                 |          KEYPAD_START            |        0x0B       |         11        |
|                 ...                 |            ........              |        ....       |         ..        |
+-------------------------------------+----------------------------------+-------------------+-------------------+

Она поможет легче ориентироваться.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 15.11.2021, 21:29


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 14:43)
* Я правильно понимаю, что KeyEvent'ы вставляются как в /dev/keypadI, так и в /dev/keypadB, разницы никакой нет?

Я разницы не заметил пока вообще. blind.gif Даже ести нажат a отжымается на b нормально.
Цитата(EXL @ Сегодня, 14:43)
* Там кстати возможна такая ситуация, что зажатие кнопки детектируется не как обычное зажатие, а как очередь из KeyEvent'ов постоянных одиночных нажатий с каким-либо произвольным промежутком.

Та вроде нет. nea.gif
Цитата(EXL @ Сегодня, 14:43)
* Нажатие кнопки фокуса будет как 0x8036, а вот отжатие на 0x0036, а ты просто отжимал эту кнопочку по идее. В общем экспериментируй потихоньку.

Аааааааааааааааааааааааааааааааааааааааааааааааааа...
Я не заметил разницу между 0x8036 и 0x0036 huh1.gif
Код
./pushkey 0x8036 a; sleep 1; ./pushkey 0x0019 b s; ./pushkey 0x0036 b

Так фокусируется и фоткает без проблем! happy.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 15.11.2021, 22:56


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 4:29)
* Я разницы не заметил пока вообще. blind.gif Даже ести нажат a отжымается на b нормально.

Хорошо, используй тогда "i", то есть /dev/keypadI по умолчанию, по крайней мере в keypad.h описание устройств следующее:

Код
/* device name from ezx */
#define DEVFS_NAME         "keypad0"
#define KEYPAD_DEVICENAME  "/dev/keypad0"

/* device name from juix, same as keypad0  */
#define DEVFS_JNAME         "keypad"
#define KEYPAD_JDEVICENAME  "/dev/keypad"

/* device name for inserting events */
#define DEVFS_INAME         "keypadI"
#define KEYPADI_DEVICENAME  "/dev/keypadI"

/* device name for getting bitmap information */
#define DEVFS_BNAME         "keypadB"
#define KEYPADB_DEVICENAME  "/dev/keypadB"

А устройства "a" там нет, только "i" /dev/keypadI, "b" /dev/keypadB и "v" /dev/vkm, это режимы третьим аргументом "a" ASCII или "s" Single идут.

Цитата(VINRARUS @ Сегодня, 4:29)
*
Так фокусируется и фоткает без проблем! happy.gif

А вот так?

Код
./pushkey 0x8036 i; sleep 1; ./pushkey 0x0019 i s; ./pushkey 0x0036 i
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 16.11.2021, 19:35


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 1:56)
* А устройства "a" там нет

Да блин.black eye.gif Это всё оранжевый шрифт...
Цитата(EXL @ Сегодня, 1:56)
* А вот так?

Да, нармально фоткает.ph34r.gif

Сообщение отредактировал VINRARUS - 16.11.2021, 19:44
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 17.11.2021, 14:45


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
Можешь теперь использовать эту утилитку в своём Web Server'е. Как я понял для того же снятия скриншота там бинарь qtsnap (или аналогичный) вызывается и перезаписывает скриншот-картинку, которая подцепляется потом сервером.

То есть если организовать на HTML-страничке "клавиатурку", клавиши которой будут вызывать pushkey с нужными аргументами и после перегружать "обновлять" этот скриншот, получится удалённое управление телефоном. Правда, не самое быстрое, конечно.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 17.11.2021, 21:07


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Вчера, 17:45)
* Как я понял для того же снятия скриншота там бинарь qtsnap (или аналогичный) вызывается и перезаписывает скриншот-картинку, которая подцепляется потом сервером.

Токо он в png сохраняет, а это сильно нагружает ЦП. Можеш скриншотник консольный c сохранением в bmp сделать?
Думаю в bmp будет легче системе делать чем png или даже jpg. clapping.gif
Цитата(EXL @ Вчера, 17:45)
* и после перегружать "обновлять" этот скриншот

...или обновлять в фрейме постоянно, если не очень накладно по ЦП времени будет.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 17.11.2021, 21:15


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 4:07)
* Можеш скриншотник консольный c сохранением в bmp сделать?

А исходники есть у кого этого скриншотника? С другой стороны BMP будет больше весить (всегда 230 КБ), нагрузка на сеть возрастёт. Если найду, пересоберу, посмотришь будет оно быстрее или нет.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 18.11.2021, 20:01


Гуру
******

Группа: Разработчики
Сообщений: 1 240
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



VINRARUS,
Этож не калькулятор что бы на паре картинок заметить разницу пнг/бмп.
Поди видео вообще нельзя запускать в телефоне)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 19.11.2021, 0:44


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



fill.sa,
https://github.com/EXL/ImageBenchmark
SAedition MOD для Zn5, самый быстрый мод

Да нет, там есть разница. Возможно что именно из-за этой разницы в том же iconres.ezx много каких иконок хранятся в BMP, или как там его *.g вроде называют, аналог насколько я понимаю. Место-то на флешке телефона не резиновое, если могли бы сжать, сжимали. А то эти громадные iconres.ezx'ы под 50 МБ встречаются на некоторых телефонах. Громадные из-за того, что там битмапы хранят.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 19.11.2021, 19:49


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Вчера, 0:15)
* А исходники есть у кого этого скриншотника?

Есть бинарник. smile.gif
Прикрепленный файл snap.zip   ( 8.01 килобайт ) Кол-во скачиваний: 11
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 19.11.2021, 22:29


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS, Спасибо, зареверсил бинарь и вижу что это какой-то слишком навороченный скриношотер, похоже там используется QBrush для рисования красного прямоугольниках где-то в углу экрана. Ещё работа с текстом какая-то есть и другая функциональность вроде поворота скриншота или подобное.

В итоге взял идею Ant-ON'а и получился такой простейший код, который использует чисто Qt'овские API для снятия скриншота довольно хитрым способом создания невидимого прозрачного QWidget'а на весь экран, "фоном" которого будет всё то, что лежит под ним:

Код
// zgrab.cpp
#include <qapplication.h>
#include <qpixmap.h>
#include <qwidget.h>

#include <stdio.h>

#define SCR_WIDTH  240
#define SCR_HEIGHT 320

int main(int argc, char *argv[]) {
    if (argc == 2) {
        QApplication app(argc, argv);
        QWidget fullScreenWidget(0);
        fullScreenWidget.setFocusPolicy(QWidget::NoFocus);
        fullScreenWidget.setBackgroundMode(QWidget::NoBackground);
        fullScreenWidget.setFixedSize(SCR_WIDTH, SCR_HEIGHT);
        fullScreenWidget.show();
        QPixmap fullScreenPixmap(SCR_WIDTH, SCR_HEIGHT, -1, QPixmap::BestOptim);
        bitBlt(&fullScreenPixmap, 0, 0, &fullScreenWidget, 0, 0, SCR_WIDTH, SCR_HEIGHT, Qt::CopyROP, true);
        fullScreenPixmap.save(argv[1], QStringList::split(".", argv[1])[1].upper());
    } else
        fprintf(stderr, "Usage:\n\tzgrab screenshot.<format>\n\nExample:\n\tzgrab screenshot.png\n\tzgrab screenshot.bmp\n");
    return 0;
}

Компилировать так:

Код
# Motorola ZN5
/arm-eabi/bin/arm-linux-gnueabi-g++ -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -I/arm-eabi/lib/qt-zn5/include -I/arm-eabi/lib/ezx-zn5/include -I/arm-eabi/arm-linux-gnueabi/include zgrab.cpp -o zgrab -Wl,-rpath-link,/arm-eabi/lib/ezx-zn5/lib -L/arm-eabi/lib/ezx-zn5/lib -lqte-mt
/arm-eabi/bin/arm-linux-gnueabi-strip -s zgrab

# MotoMAGX Emulator
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-g++ -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -I/opt/toolchains/motomagx/emulator/include zgrab.cpp -o zgrab -L/opt/toolchains/motomagx/emulator/lib -lqte-mt
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-strip -s zgrab

Использовать как:

Код
./zgrab screenshot.bmp
./zgrab screenshot.png
./zgrab screenshot.jpeg

Поддерживает следующие форматы в Qt: PNG, BMP, XBM, XPM, JPEG (писать расширение нужно именно как JPEG, не JPG), PBM, PGM, PPM. Форматы GIF и MNG не поддерживаются.

Заодно сделал небольшой бенчмарк по форматам в эмуляторе, хотя на реальном устройстве ситуация может сильно отличаться laugh.gif

Код
+----------+----------+----------+----------+----------+----------+----------+----------+
|   BMP    |   PNG    |   JPEG   |   XBM    |   XPM    |   PBM    |   PGM    |   PPM    |
+----------+----------+----------+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.16s | 0m 0.08s | 0m 0.08s | 0m 0.26s | 0m 0.06s | 0m 0.07s | 0m 0.04s |
| 0m 0.00s | 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.01s | 0m 0.11s | 0m 0.03s | 0m 0.01s | 0m 0.21s | 0m 0.01s | 0m 0.02s | 0m 0.01s |
+----------+----------+----------+----------+----------+----------+----------+----------+
| 0m 0.03s | 0m 0.18s | 0m 0.07s | 0m 0.04s | 0m 0.26s | 0m 0.07s | 0m 0.07s | 0m 0.03s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.01s |
| 0m 0.00s | 0m 0.12s | 0m 0.04s | 0m 0.01s | 0m 0.19s | 0m 0.01s | 0m 0.02s | 0m 0.01s |
+----------+----------+----------+----------+----------+----------+----------+----------+
| 0m 0.05s | 0m 0.15s | 0m 0.08s | 0m 0.07s | 0m 0.26s | 0m 0.07s | 0m 0.04s | 0m 0.05s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.01s | 0m 0.11s | 0m 0.01s | 0m 0.04s | 0m 0.20s | 0m 0.03s | 0m 0.01s | 0m 0.03s |
+----------+----------+----------+----------+----------+----------+----------+----------+
| 0m 0.07s | 0m 0.16s | 0m 0.08s | 0m 0.07s | 0m 0.27s | 0m 0.06s | 0m 0.03s | 0m 0.01s |
| 0m 0.01s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.02s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.03s | 0m 0.09s | 0m 0.02s | 0m 0.03s | 0m 0.20s | 0m 0.01s | 0m 0.00s | 0m 0.00s |
+----------+----------+----------+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.15s | 0m 0.09s | 0m 0.08s | 0m 0.25s | 0m 0.06s | 0m 0.08s | 0m 0.05s |
| 0m 0.00s | 0m 0.02s | 0m 0.00s | 0m 0.00s | 0m 0.02s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.01s | 0m 0.09s | 0m 0.02s | 0m 0.02s | 0m 0.15s | 0m 0.02s | 0m 0.02s | 0m 0.01s |
+----------+----------+----------+----------+----------+----------+----------+----------+

На каждый формат по три "прогона" по пять забегов, в таблицу выбирался самый лучший результат (по среднему) у каждого формата. Подводя итоги можно увидеть, что PNG в среднем снимается в три-четыре раза медленее BMP, что примерно и ожидалось, учитывая его сильную компрессию без потерь. А вот JPEG показал себя очень неплохо, возможно для использования WebServer'а стоит расмотреть именно его, так как он обеспечивает неплохую скорость снятия скриншота и минимальный размер выводимого файла. Но это всё нужно тестировать на реальном устройстве, команды для прогона бенчмарков:

Код
for i in $(seq 1 5); do busybox time ./zgrab screenshot.bmp; sleep 1; rm screenshot.bmp; done;
for i in $(seq 1 5); do busybox time ./zgrab screenshot.png; sleep 1; rm screenshot.png; done;
for i in $(seq 1 5); do busybox time ./zgrab screenshot.jpeg; sleep 1; rm screenshot.jpeg; done;

Экзотические форматы рассматривать не имеет смысла, они наверняка не поддерживаются браузером. Самый медленный из них иксовый XPM, упаковка скриншота в остальные битмапные форматы работает примерно с одной и той же скоростью, несмотря на то что многие из них либо вообще чёрно-белые, либо используют только grayscale. Фаворитом является PPM, который примерно аналогичен BMP, но имеет ещё меньший и компактный заголовок.

Прикреплённые файлы:
Прикрепленный файл zgrab.zip   ( 7.15 килобайт ) Кол-во скачиваний: 15
Прикрепленный файл screenshot_examples.zip   ( 293.73 килобайт ) Кол-во скачиваний: 16
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 21.11.2021, 20:22


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Вчера, 1:29)
* А вот JPEG показал себя очень неплохо, возможно для использования WebServer'а стоит расмотреть именно его, так как он обеспечивает неплохую скорость снятия скриншота и минимальный размер выводимого файла

...и минимальное качество. nea.gif
Прикрепленное изображение
Цитата(EXL @ Вчера, 1:29)
* Но это всё нужно тестировать на реальном устройстве, команды для прогона бенчмарков:

А табличку кто будет рисовать? dribble.gif
Код
# cd /tmp
# /home/zgrab.sh
+----------+----------+----------+
|   bmp    |   jpeg   |   png    |
+----------+----------+----------+
| 0m 0.43s | 0m 0.66s | 0m 2.10s |
| 0m 0.16s | 0m 0.36s | 0m 1.75s |
| 0m 0.06s | 0m 0.03s | 0m 0.05s |
+----------+----------+----------+
| 0m 0.48s | 0m 0.63s | 0m 2.06s |
| 0m 0.15s | 0m 0.32s | 0m 1.74s |
| 0m 0.07s | 0m 0.06s | 0m 0.08s |
+----------+----------+----------+
| 0m 0.45s | 0m 0.59s | 0m 2.07s |
| 0m 0.14s | 0m 0.31s | 0m 1.73s |
| 0m 0.05s | 0m 0.07s | 0m 0.07s |
+----------+----------+----------+
| 0m 0.47s | 0m 0.62s | 0m 2.08s |
| 0m 0.16s | 0m 0.31s | 0m 1.77s |
| 0m 0.06s | 0m 0.07s | 0m 0.04s |
+----------+----------+----------+
| 0m 0.44s | 0m 0.62s | 0m 2.06s |
| 0m 0.17s | 0m 0.34s | 0m 1.77s |
| 0m 0.06s | 0m 0.04s | 0m 0.05s |
+----------+----------+----------+

# cd /home  
# /home/zgrab.sh
+----------+----------+----------+
|   bmp    |   jpeg   |   png    |
+----------+----------+----------+
| 0m 1.89s | 0m 0.82s | 0m 2.43s |
| 0m 0.14s | 0m 0.36s | 0m 1.76s |
| 0m 0.29s | 0m 0.06s | 0m 0.08s |
+----------+----------+----------+
| 0m 1.75s | 0m 0.87s | 0m 2.55s |
| 0m 0.20s | 0m 0.36s | 0m 1.74s |
| 0m 0.23s | 0m 0.06s | 0m 0.14s |
+----------+----------+----------+
| 0m 2.09s | 0m 0.82s | 0m 2.44s |
| 0m 0.15s | 0m 0.38s | 0m 1.73s |
| 0m 0.23s | 0m 0.07s | 0m 0.11s |
+----------+----------+----------+
| 0m 1.76s | 0m 0.79s | 0m 2.53s |
| 0m 0.16s | 0m 0.32s | 0m 1.72s |
| 0m 0.24s | 0m 0.06s | 0m 0.09s |
+----------+----------+----------+
| 0m 1.39s | 0m 0.78s | 0m 2.51s |
| 0m 0.20s | 0m 0.31s | 0m 1.73s |
| 0m 0.17s | 0m 0.07s | 0m 0.09s |
+----------+----------+----------+

Для максимально жостких условий частота ЦП зафиксирована на 133 МГц. spiteful.gif
А вот скоростя загрузки с браузера при 133 МГц:
Прикрепленное изображение


Добавлено позже (21.11.2021, 23:25):
А вот при 740 МГц:
Код
# cd /tmp
# /home/zgrab.sh
+----------+----------+----------+
|   bmp    |   jpeg   |   png    |
+----------+----------+----------+
| 0m 0.13s | 0m 0.15s | 0m 0.45s |
| 0m 0.05s | 0m 0.08s | 0m 0.35s |
| 0m 0.01s | 0m 0.02s | 0m 0.03s |
+----------+----------+----------+
| 0m 0.13s | 0m 0.15s | 0m 0.44s |
| 0m 0.05s | 0m 0.07s | 0m 0.35s |
| 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+
| 0m 0.13s | 0m 0.15s | 0m 0.44s |
| 0m 0.03s | 0m 0.06s | 0m 0.35s |
| 0m 0.02s | 0m 0.01s | 0m 0.00s |
+----------+----------+----------+
| 0m 0.13s | 0m 0.15s | 0m 0.44s |
| 0m 0.05s | 0m 0.06s | 0m 0.35s |
| 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+
| 0m 0.13s | 0m 0.15s | 0m 0.45s |
| 0m 0.04s | 0m 0.06s | 0m 0.36s |
| 0m 0.01s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+

# cd /home
# /home/zgrab.sh
+----------+----------+----------+
|   bmp    |   jpeg   |   png    |
+----------+----------+----------+
| 0m 0.50s | 0m 0.17s | 0m 0.56s |
| 0m 0.02s | 0m 0.06s | 0m 0.36s |
| 0m 0.05s | 0m 0.00s | 0m 0.02s |
+----------+----------+----------+
| 0m 1.30s | 0m 0.20s | 0m 0.53s |
| 0m 0.05s | 0m 0.08s | 0m 0.36s |
| 0m 0.08s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+
| 0m 0.46s | 0m 0.20s | 0m 0.60s |
| 0m 0.02s | 0m 0.08s | 0m 0.36s |
| 0m 0.05s | 0m 0.00s | 0m 0.00s |
+----------+----------+----------+
| 0m 0.41s | 0m 0.20s | 0m 0.55s |
| 0m 0.05s | 0m 0.08s | 0m 0.36s |
| 0m 0.05s | 0m 0.00s | 0m 0.03s |
+----------+----------+----------+
| 0m 0.44s | 0m 0.20s | 0m 0.56s |
| 0m 0.03s | 0m 0.08s | 0m 0.35s |
| 0m 0.05s | 0m 0.00s | 0m 0.01s |
+----------+----------+----------+

Прикрепленное изображение

Добавлено позже (21.11.2021, 23:28):
Для потокового слайдшоу действительно предпочтительнее jpeg, но, блин, качество...
Прикрепленный файл zgrab_test.zip   ( 3.68 килобайт ) Кол-во скачиваний: 13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 21.11.2021, 21:46


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 3:22)
* Для потокового слайдшоу действительно предпочтительнее jpeg, но, блин, качество...

Может быть тогда сделать какую-нибудь опцию выбора между PNG и JPEG?

Тут вот ещё один вариант снятия скриншота сделал из одной моей программки, которая превращает CG41.smg и CG42.smg из разобранной прошивки в BMP'шки. Вот, fill.sa, получается этот код и пригодился. Используется чистый C, к сожалению в BMP нестандартный 18bpp не загонишь, а так было бы ещё быстрее:

Код
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define RGB666_TO_RGB888(color) \
    ((((color) & (0x3F << 0)) <<  2) | (((color) & (0x3F <<  6)) << 4) | (((color) & (0x3F << 12)) <<  6))

typedef struct {
    int32_t width;
    int32_t height;
    uint32_t size;
    uint32_t depth;
} display_t;

/* See: https://en.wikipedia.org/wiki/BMP_file_format */
#pragma pack(push, 1)
typedef struct {
    /* Bitmap file header */
    uint16_t file_magic;
    uint32_t file_size;
    uint32_t bytes_reserved;
    uint32_t bitmap_start;
    /* DIB header (bitmap information header) */
    uint32_t dib_header_size;
    int32_t bitmap_width;
    int32_t bitmap_height;
    uint16_t color_planes;
    uint16_t bitmap_bpp;
    uint32_t compression_method;
    uint32_t bitmap_size;
    int32_t bitmap_width_ppm;
    int32_t bitmap_height_ppm;
    uint32_t num_of_colors;
    uint32_t num_of_important_colors;
} bmp_header_t;
#pragma pack(pop)

static int32_t ErrUsage(void) {
    fprintf(
        stderr,
        "Usage:\n"
        "\t./fbgrab <device> <BMP image file>\n\n"
        "Example:\n"
        "\t./fbgrab /dev/fb/0 screenshot.bmp\n"
    );
    return 1;
}

static int32_t ErrFile(const char *aFileName, const char *aMode) {
    fprintf(stderr, "Cannot open '%s' file for %s.\n", aFileName, aMode);
    return 1;
}

static uint32_t *CreateBitmapFromFile(FILE *aReadFile, const display_t *aDisplay) {
    int32_t y, x;
    uint32_t *lBitmapRgb888 = malloc(aDisplay->size * sizeof(uint32_t));
    for (y = 0; y < aDisplay->height; ++y)
        for (x = 0; x < aDisplay->width; ++x) {
            uint32_t lPixelRgb666 = 0x000000;
            fread(&lPixelRgb666, 3, 1, aReadFile); /* RGB666 in RGB888, 3 bytes, 18-bit or 24-bit for color. */
            lBitmapRgb888[x + y * aDisplay->width] = RGB666_TO_RGB888(lPixelRgb666);
        }
    return lBitmapRgb888;
}

static void WriteBmpHeader(FILE *aWriteFile, const display_t *aDisplay) {
    bmp_header_t lBmpHeader;
    memset(&lBmpHeader, 0, sizeof(bmp_header_t));
    lBmpHeader.file_magic = 0x4D42;
    lBmpHeader.file_size = aDisplay->size * 3 + 14 + 40; /* RGB888/24/3, BMP header, DIB header. */
    lBmpHeader.bitmap_start = 0x00000036;
    lBmpHeader.dib_header_size = 0x00000028;
    lBmpHeader.bitmap_width = aDisplay->width;
    lBmpHeader.bitmap_height = aDisplay->height;
    lBmpHeader.color_planes = 0x0001;
    lBmpHeader.bitmap_bpp = 0x0018;
    lBmpHeader.bitmap_size = aDisplay->size * 3; /* RGB888/24/3. */
    fwrite(&lBmpHeader, sizeof(bmp_header_t), 1, aWriteFile);
}

static void WriteBmpBitmap(FILE *aWriteFile, const display_t *aDisplay, const uint32_t *aBitmap) {
    int32_t y, x;
    for (y = aDisplay->height - 1; y >= 0; --y)
        for (x = 0; x < aDisplay->width; ++x) {
            uint32_t lPixelRgb888 = aBitmap[x + y * aDisplay->width];
            fwrite(&lPixelRgb888, 3, 1, aWriteFile);
        }
}

int main(int argc, char *argv[]) {
    if (argc != 3)
        return ErrUsage();

    display_t lScreen;
    lScreen.width = 240;
    lScreen.height = 320;
    lScreen.size = lScreen.height * lScreen.width;
    lScreen.depth = 24;

    FILE *lSmgFile = fopen(argv[1], "rb");
    if (!lSmgFile)
        return ErrFile(argv[1], "read");
    uint32_t *lBitmap = CreateBitmapFromFile(lSmgFile, &lScreen);
    fclose(lSmgFile);

    FILE *lBmpFile = fopen(argv[2], "wb");
    if (!lBmpFile)
        return ErrFile(argv[2], "write");
    WriteBmpHeader(lBmpFile, &lScreen);
    WriteBmpBitmap(lBmpFile, &lScreen, lBitmap);
    free(lBitmap);
    fclose(lBmpFile);

    return 0;
}

Компилировать так:

Код
# Motorola ZN5
/arm-eabi/bin/arm-linux-gnueabi-gcc -pipe -Wall -W -O2 fbgrab.c -o fbgrab
/arm-eabi/bin/arm-linux-gnueabi-strip -s fbgrab

# MotoMAGX Emulator
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-gcc -pipe -Wall -W -O2 fbgrab.c -o fbgrab
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-strip -s fbgrab

Запускать так:

Код
./fbgrab /dev/fb/0 screenshot.bmp
./fbgrab /dev/fb/1 screenshot.bmp

По бенчмарку похоже этот способ чуть быстрее варианта с Qt из поста выше:

Код
# for i in $(seq 1 5); do busybox time ./fbgrab /dev/fb/0 screenshot.bmp; sleep 1; rm screenshot.bmp; done;
real    0m 0.02s
user    0m 0.00s
sys     0m 0.00s

real    0m 0.02s
user    0m 0.00s
sys     0m 0.01s

real    0m 0.00s
user    0m 0.00s
sys     0m 0.00s

real    0m 0.03s
user    0m 0.00s
sys     0m 0.01s

real    0m 0.02s
user    0m 0.00s
sys     0m 0.00s

Мне ещё вот что интересно. Будет ли захват картинки, если выполнять ./fbgrab /dev/fb/1 screenshot.bmp во время работы видоискателя камеры или же во время запуска какой-нибудь игры, которая использует аппаратно ускоренную SDL-библиотеку? Или всё равно будет чёрный экран? В эмуляторе к сожалению IPU похоже что не работает. Проверьте ради интереса, так ли это. В ядре, в файле mxcfb.h устройства описываются следующим образом:

Код
#define MXCFB_MAIN_DEVICE       "/dev/fb/0"
#define MXCFB_OVERLAY_DEVICE    "/dev/fb/1"
#define MXCFB_CLI_DEVICE        "/dev/fb/2"

По идее OVERLAY и есть вот этот вот IPU-буфер, а CLI это изображение с внешнего дисплея различных раскладушек вроде U9, VA76r и др.

Прикреплённые файлы:
Прикрепленный файл fbgrab.zip   ( 6.12 килобайт ) Кол-во скачиваний: 11
Прикрепленный файл screenshot.bmp   ( 225.05 килобайт ) Кол-во скачиваний: 13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 22.11.2021, 19:05


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 0:46)
* Может быть тогда сделать какую-нибудь опцию выбора между PNG и JPEG?

PNG не вариант, сильно медленно. Уровень зжатия жопега не регулируется там?
Цитата(EXL @ Сегодня, 0:46)
* Или всё равно будет чёрный экран?

Оно везде чорный картинко выводит. not_i.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 22.11.2021, 23:36


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 2:05)
* PNG не вариант, сильно медленно. Уровень зжатия жопега не регулируется там?

Да, регулируется в диапазоне от 0-100, пробуй:
Код
// zgrab.cpp
#include <qapplication.h>
#include <qpixmap.h>
#include <qwidget.h>

#include <stdio.h>

#define SCR_WIDTH  240
#define SCR_HEIGHT 320

int main(int argc, char *argv[]) {
    if (argc >= 2 && argc <= 3) {
        QApplication app(argc, argv);
        QWidget fullScreenWidget(0);
        fullScreenWidget.setFocusPolicy(QWidget::NoFocus);
        fullScreenWidget.setBackgroundMode(QWidget::NoBackground);
        fullScreenWidget.setFixedSize(SCR_WIDTH, SCR_HEIGHT);
        fullScreenWidget.show();
        QPixmap fullScreenPixmap(SCR_WIDTH, SCR_HEIGHT, -1, QPixmap::BestOptim);
        bitBlt(&fullScreenPixmap, 0, 0, &fullScreenWidget, 0, 0, SCR_WIDTH, SCR_HEIGHT, Qt::CopyROP, true);
        if (argc == 2)
            fullScreenPixmap.save(argv[1], QStringList::split(".", argv[1])[1].upper());
        else
            fullScreenPixmap.save(argv[1], QStringList::split(".", argv[1])[1].upper(), QString(argv[2]).toInt());
    } else
        fprintf(
            stderr,
            "Usage:\n"
            "\tzgrab screenshot.<format>\n\n"
            "Example:\n"
            "\tzgrab screenshot.png\n"
            "\tzgrab screenshot.bmp\n"
            "\tzgrab screenshot.jpeg 100\n"
            "\tzgrab screenshot.jpeg 25\n"
        );
    return 0;
}

Бенчмарк на эмуляторе не показывает существенных понижений в скорости на разном качестве JPEG:

Код
+----------+----------+----------+----------+----------+
| JPEG  25 | JPEG  50 | JPEG  65 | JPEG  85 | JPEG 100 |
+----------+----------+----------+----------+----------+
| 0m 0.07s | 0m 0.06s | 0m 0.07s | 0m 0.07s | 0m 0.06s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.01s | 0m 0.02s |
| 0m 0.00s | 0m 0.00s | 0m 0.03s | 0m 0.02s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.03s | 0m 0.07s | 0m 0.07s | 0m 0.06s | 0m 0.07s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.02s | 0m 0.04s |
+----------+----------+----------+----------+----------+
| 0m 0.08s | 0m 0.06s | 0m 0.06s | 0m 0.05s | 0m 0.07s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.06s | 0m 0.05s | 0m 0.06s | 0m 0.07s | 0m 0.07s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.01s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.06s | 0m 0.07s | 0m 0.07s | 0m 0.07s | 0m 0.07s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
| 0m 0.02s | 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.00s |
+----------+----------+----------+----------+----------+

При этом качество картинки на разных уровнях JPEG-компрессии следующее (от 25 к 100 слева направо, в конце PNG для сравнения):

Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

При сравнении обратите внимание на бордовые круги ниже иконки браузера.

Цитата(VINRARUS @ Сегодня, 2:05)
* Оно везде чорный картинко выводит. not_i.gif

Даже при ./fbgrab /dev/fb/0 screenshot.bmp что ли? Такого быть не должно.

Прикреплённые файлы:
Прикрепленный файл zgrab.zip   ( 7.97 килобайт ) Кол-во скачиваний: 13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.11.2021, 5:03


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 2:36)
* Даже при ./fbgrab /dev/fb/0 screenshot.bmp что ли? Такого быть не должно.

Робочий стол:
Прикрепленный файл screenshot.bmp   ( 225.05 килобайт ) Кол-во скачиваний: 13

ПС: на улице был туман. blind.gif
Прикрепленный файл screenshot.bmp   ( 225.05 килобайт ) Кол-во скачиваний: 13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 23.11.2021, 14:44


Гуру
******

Группа: Разработчики
Сообщений: 1 240
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Я так понимаю от хваленого бмп отказались.
По моей памяти перевод иконореса с бмп на пнг заметно ускорил работу. Замеров я не делал, сугобо субьективное мнение.
Да и по замеру винраруса страничка на пнг знатно быстрее грузится ибо в пнг меньше даннвх загружать нужно.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.11.2021, 18:30


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 17:44)
* Я так понимаю от хваленого бмп отказались.

Нет. nea.gif Качество и скорость создания bmp неоспоримы!
Цитата(fill.sa @ Сегодня, 17:44)
* По моей памяти перевод иконореса с бмп на пнг заметно ускорил работу.

Наоборот, по крайней мере на Z6. uzhas2.gif
Цитата(fill.sa @ Сегодня, 17:44)
* Да и по замеру винраруса страничка на пнг знатно быстрее грузится ибо в пнг меньше даннвх загружать нужно.

Так всем понятно шо чем меньше файл тем быстрее его передача. nhl.gif
Но для начала же его сгенерировать нада, и тут PNG с треском отстаёт в сумарном времени получения скриншота. dinamo.gif
Для кого мы тут псевдотаблички заполняли?
BMP: 0.681/0.256
JPG: 0.665/0.166
PNG: 2.131/0.484

Изображение
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 23.11.2021, 20:38


Гуру
******

Группа: Разработчики
Сообщений: 1 240
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Цитата(VINRARUS @ Сегодня, 19:30)
* Но для начала же его сгенерировать нада, и тут PNG с треском отстаёт в сумарном времени получения скриншота.
Для кого мы тут псевдотаблички заполняли?
BMP: 0.681/0.256
JPG: 0.665/0.166
PNG: 2.131/0.484


Так понятно что на сжатие какое-то время тратится. Но это по мне мелочи.
Ты на конечный результат смотри, особенно в действительностях магикса.
Да и по открытию веб страници ты сам видешь что на пнг ты успееш 5 картинок открыть пока 1 бмп прогрузится. Вот и вся твоя скорость.

Я могу ехать 200Км/ч и останавливаться кажные 10 км на заправку и охладится.
А кто-то будет ехать 100км/ч и в конечном счете мы одинаково приедем.

Я же говорю по ощущениям иконрез на пнг заметно быстрее, к сожалению проверить это никак, только по ощущениям. Ибо проверить можно только отдельные вещи в виде скорости генерации картинки, но не как не замерить весь процесс.
Если придумаешь как замерить конечный результат, с радостью почитаю конечные цифры.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.11.2021, 21:42


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(fill.sa @ Вчера, 23:38)
* Ты на конечный результат смотри, особенно в действительностях магикса.

wacko.gif Цыфры в цытате и есть конечный результат.
king.gif Если не можеш сам их итерпретировать — я помогу:
2.131÷0.681=в 3,13 раз скриншот BMP быстрее в браузере появится чем PNG, при Wi-FI подключении и мин. частоте ЦП (при 740 МГц разница уменьшается до 2х раз).
Цитата(fill.sa @ Вчера, 23:38)
* Я же говорю по ощущениям иконрез на пнг заметно быстрее, к сожалению проверить это никак, только по ощущениям. Ибо проверить можно только отдельные вещи в виде скорости генерации картинки, но не как не замерить весь процесс.

По моим ощущениям bmp скин шустрее, но уменя не тормозина — на тормозине экономия RAM решает.slow.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 23.11.2021, 21:53


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS, Очень странно, ведь на эмуляторе всё работает.
А если так сделать, будет эффект?

Код
cat /dev/fb/0 > screen.dump
./fbgrab screen.dump screen.bmp

Если нет, прицепи screen.dump для изучения.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.11.2021, 22:18


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 0:53)
* Если нет, прицепи screen.dump для изучения.

Изучай. grin.gif

Добавлено позже (24.11.2021, 2:03):
EXL, кстати zgrab при срабатывании закрывает всплывающие менюшки и нажатия кнопок подтупливают.
Прикрепленный файл screen.dump.zip   ( 488 байт ) Кол-во скачиваний: 12
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.11.2021, 4:26


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



Цитата(VINRARUS @ Вчера, 5:18)
* EXL, кстати zgrab при срабатывании закрывает всплывающие менюшки и нажатия кнопок подтупливают.

Я нашёл ещё один способ захвата картинки с экрана через Qt, без хитрости в виде создания какого-либо виджета поверх. Возможно сейчас менюшки закрываться не будут, а сама скриншотилка будет отрабатывать ещё быстрее. У меня на эмуляторе работает, проверь на реальном девайсе:

Код
// dgrab.cpp
#include <qapplication.h>
#include <qpixmap.h>
#include <qwidget.h>

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc >= 2 && argc <= 3) {
        QApplication app(argc, argv);
        QPixmap::setDefaultOptimization(QPixmap::BestOptim);
        QPixmap fullScreenPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
        if (argc == 2)
            fullScreenPixmap.save(argv[1], QStringList::split(".", argv[1])[1].upper());
        else
            fullScreenPixmap.save(argv[1], QStringList::split(".", argv[1])[1].upper(), QString(argv[2]).toInt());
    } else
        fprintf(
            stderr,
            "Usage:\n"
            "\tdgrab screenshot.<format>\n\n"
            "Example:\n"
            "\tdgrab screenshot.png\n"
            "\tdgrab screenshot.bmp\n"
            "\tdgrab screenshot.jpeg 100\n"
            "\tdgrab screenshot.jpeg 25\n"
        );
    return 0;
}

Собирать так:

Код
# Motorola ZN5
/arm-eabi/bin/arm-linux-gnueabi-g++ -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -I/arm-eabi/lib/qt-zn5/include -I/arm-eabi/lib/ezx-zn5/include -I/arm-eabi/arm-linux-gnueabi/include dgrab.cpp -o dgrab -Wl,-rpath-link,/arm-eabi/lib/ezx-zn5/lib -L/arm-eabi/lib/ezx-zn5/lib -lqte-mt
/arm-eabi/bin/arm-linux-gnueabi-strip -s dgrab

# MotoMAGX Emulator
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-g++ -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -I/opt/toolchains/motomagx/emulator/include dgrab.cpp -o dgrab -L/opt/toolchains/motomagx/emulator/lib -lqte-mt
/opt/toolchains/motomagx/emulator/bin/i686-mot-linux-gnu-strip -s dgrab

Запускать аналогично zgrab, а вот с fbgrab пока не разбирался. Вижу по размеру файла дампа, что чтение не происходит, что странно. Может быть из-за прав такое...? На root, а не ezx запускать пробовал? Нужно разбираться.

Прикреплённые файлы:
Прикрепленный файл dgrab.zip   ( 7.34 килобайт ) Кол-во скачиваний: 14
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.11.2021, 4:54


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



Цитата(EXL @ Сегодня, 7:26)
* Возможно сейчас менюшки закрываться не будут, а сама скриншотилка будет отрабатывать ещё быстрее. У меня на эмуляторе работает, проверь на реальном девайсе:

Да, так намного лучше! thumbup.gif
Цитата(EXL @ Сегодня, 7:26)
* На root, а не ezx запускать пробовал?

Ну я ж не убунтьоныш, шобы рута бояться. laugh.gif В телнете сразу рут права все.

Сообщение отредактировал VINRARUS - 25.11.2021, 4:54
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.11.2021, 15:56


Rock The Microphone
********

Группа: Администраторы
Сообщений: 3 145
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652

Рейтинг: 4654



VINRARUS,
В общем собрал все исходники утилит для снятия скриншотов на GitHub: https://github.com/EXL/MagxScreenshot/

Цитата(VINRARUS @ Сегодня, 11:54)
*
Ну я ж не убунтьоныш, шобы рута бояться. laugh.gif В телнете сразу рут права все.

Наверное пофиксил, но так и не понял в чём там дело и почему fread() и fopen() не работают, а mmap() и open() работают нормально. Правда фиг его знает как это скажется на производительности.

Добавил ещё jgrab, которая делает JPEG-скриншоты, пробуй:

Код
./fbgrab /dev/fb/0 screenshot.bmp
./jgrab /dev/fb/0 screenshot.jpg 100

Теперь "/dev/fb/0" должен нормально сниматься, а ещё можешь на "/dev/fb/1" при врубленной камере или запущенном на SDL HW приложении проверить, есть ли там чего или всё так же чёрный экран.

Прикреплённые файлы:
Прикрепленный файл MagxScreenshot.zip   ( 28.71 килобайт ) Кол-во скачиваний: 8
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.11.2021, 21:21


Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044
Модель телефона: WX160 & L7 & Z6 & ZN5-128
Прошивка: 740 MHz: Z6 and ZN5


Настроение:
youtu.be/A_yQLYLiSGQ



Рейтинг: 1211



EXL, вот теперь шыкарно! ok.gif
Новые fbgrab и jgrab:
Код

# cd /tmp
# echo 133 > /sys/mpm/op
# /home/zgrab.sh
+----------+----------+----------+----------+----------+
|   bmp    |  jpg10   |  jpg50   |  jpg90   |  jpg100  |
+----------+----------+----------+----------+----------+
| 0m 0.25s | 0m 0.20s | 0m 0.24s | 0m 0.22s | 0m 0.28s |
| 0m 0.19s | 0m 0.18s | 0m 0.18s | 0m 0.22s | 0m 0.23s |
| 0m 0.02s | 0m 0.02s | 0m 0.03s | 0m 0.01s | 0m 0.04s |
+----------+----------+----------+----------+----------+
| 0m 0.20s | 0m 0.22s | 0m 0.21s | 0m 0.25s | 0m 0.27s |
| 0m 0.19s | 0m 0.19s | 0m 0.19s | 0m 0.23s | 0m 0.27s |
| 0m 0.01s | 0m 0.01s | 0m 0.02s | 0m 0.01s | 0m 0.00s |
+----------+----------+----------+----------+----------+
| 0m 0.20s | 0m 0.23s | 0m 0.20s | 0m 0.28s | 0m 0.30s |
| 0m 0.18s | 0m 0.20s | 0m 0.20s | 0m 0.23s | 0m 0.26s |
| 0m 0.02s | 0m 0.01s | 0m 0.01s | 0m 0.00s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.23s | 0m 0.20s | 0m 0.23s | 0m 0.23s | 0m 0.28s |
| 0m 0.20s | 0m 0.19s | 0m 0.21s | 0m 0.21s | 0m 0.27s |
| 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.02s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.22s | 0m 0.19s | 0m 0.26s | 0m 0.25s | 0m 0.30s |
| 0m 0.19s | 0m 0.19s | 0m 0.21s | 0m 0.22s | 0m 0.27s |
| 0m 0.02s | 0m 0.01s | 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+----------+----------+

# echo 740 > /sys/mpm/op
# /home/zgrab.sh
+----------+----------+----------+----------+----------+
|   bmp    |  jpg10   |  jpg50   |  jpg90   |  jpg100  |
+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.05s |
| 0m 0.04s | 0m 0.05s | 0m 0.05s | 0m 0.04s | 0m 0.05s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.01s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.06s |
| 0m 0.03s | 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.06s |
| 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.05s | 0m 0.06s |
| 0m 0.04s | 0m 0.03s | 0m 0.04s | 0m 0.05s | 0m 0.05s |
| 0m 0.00s | 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.05s | 0m 0.04s | 0m 0.05s | 0m 0.05s |
| 0m 0.04s | 0m 0.05s | 0m 0.04s | 0m 0.05s | 0m 0.05s |
| 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.01s |
+----------+----------+----------+----------+----------+
| 0m 0.04s | 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.07s |
| 0m 0.03s | 0m 0.04s | 0m 0.04s | 0m 0.05s | 0m 0.06s |
| 0m 0.01s | 0m 0.00s | 0m 0.00s | 0m 0.00s | 0m 0.00s |
+----------+----------+----------+----------+----------+


Цитата(EXL @ Сегодня, 18:56)
* а ещё можешь на "/dev/fb/1" при врубленной камере

Работает в камере! dribble.gif
К стати, при закрытии камеры на /dev/fb/1 остаётся останний кадр висеть.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Софт для ZN5 и прочих MotoMAGX: MGX и PEP, Разработка, портирование и обсуждение нативного софта · Motorola ZINE ZN5, ZN5 T-Mobile · Forum
 

46 страниц V « < 41 42 43 44 > » 
Ответ в темуСоздание новой темы
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18.7.2025, 3:37

Форум живёт: