motofan logo
16 страниц V « < 13 14 15 16 >        
> 

Учимся писать эльфов вместе, Обсуждение процесса кодинга

Andy51
сообщение 29.10.2007, 20:13 Закрепленное сообщение!


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Вот и долгожданное обновление SDK до v0.2

Основные новшества с прошлой версии:
+ Добавлено множество функций в SDK
+ Добавлено два новых примера - на этот раз GUI

Что внутри:
Папка SDK - ну, и так ясно, заголовочные файлы. За описаниями функций заглядываем в эту папку.

helloworld_snd - первый пример эльфа. Несколько нестандартный HelloWorld, заменяет озвучку цифровой клавиатуры системными звуками. Предназначен в основном для изучения структуры приложения (Application), ну и как пример приложения, работающего в фоне.

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

ListTest - пример использования диалога List. Значительно более сложный пример, предназначен для изучения возможностей и принципов управления диалогами.

make_*.bat - батники для сборки эльфов-примеров. Эльфы расчитаны на компиляцию с комплектом ADS. Из-за правил форума, я не могу включить его в SDK, однако оставляю ссылки
http://ifolder.ru/3937671
http://slil.ru/25060171
http://rapidshare.com/files/67580866/ads.7z.html

Lib.o - для функционирования эльфа под моим загрузчиком, необходимо подлинковать этот файл к проекту (в make.bat уже прописан).
Внимание! Этот файл не зависит от конкретной версии прошивки, под которую собирается эльф, но, тем не менее, зависит от версии библиотеки!
В этом SDK уже включен Lib.o для библиотеки v071218 (оч. старый - не забудьте обновить, если понадобятся новые функции)

Пара слов об т.н. Application.
В телефонах motorola есть система AFW, которая позволяет, не затрачивая лишних ресурсов процессора на обеспечение "полноценной" многозадачности, достаточно полноценно работать нескольким приложениям, ориентированным на диалог с пользователем. Как это работает: приложения представляют собой, фактически, набор обработчиков событий(ивентов, events) + структура данных приложения. Откликаясь на те или иные события, приложения поочерёдно обрабатывают списки накопившихся ивентов. Таким образом, мы фактически имеем невытесняющую многозадачность.
Есть теоретическая возможность писать и эльфы, выделенные в отдельный процесс(task), но эта часть всё ещё в разработке.

Книги по Си
  1. Руководство полного идиота по программированию (на языке Си) - Не смотря на такое название все азы разжёваны. Если вы вообще никогда не видели Си, начните с этой книги
  2. Герберт Шилдт, "Полный справочник по С (4-е издание)"
    Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1155
  3. "Язык программирования C"
    Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 899
Исходники эльфов
  1. SRC by om2804
  2. SRC by G-XaD
SDK
  1. SDK by om2804
  2. SDK by G-XaD
Эльфостроение на motoWiki

Компилятор + исходники от om2804 для EP1 скачать

Сообщение отредактировал om2804 - 3.5.2011, 13:59
Прикрепленный файл SDKv02.rar   ( 24.88 килобайт ) Кол-во скачиваний: 2174
Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 899
Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1155
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 23.4.2010, 11:44


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



tim apple, а консоль и запись в лог-файл на флешке, нынче не в почёте?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 23.4.2010, 12:08


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



baat,
про консоль промолчу, а лог-файл требуется крайне редко (главным образом для логирования на этапе загрузки телефона)

Сообщение отредактировал tim apple - 23.4.2010, 12:08
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
harchello
сообщение 24.4.2010, 9:27


Интересующийся
**

Группа: Пользователи
Сообщений: 34
Регистрация: 1.12.2008
Пользователь №: 187 435
Модель телефона: Motorola

Рейтинг: 4



Как можно выличить ошибку:
Код
BUILD DRMCHANGER DEBUG
LINK DRMChanger_dbg_tmp.elf
c:\devkitPro\devkitARM\bin\arm-eabi-ld.exe: cannot find std.sa
make: *** [DRMChanger_dbg_tmp.elf] Error 1

Исходники скачал с svn. Сам файл std.sa находится в папке "libgen", там же постлинкер.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DarkCoder
сообщение 24.4.2010, 11:20


Интересующийся
**

Группа: Пользователи
Сообщений: 70
Регистрация: 26.9.2009
Пользователь №: 206 965
Модель телефона: Motorola V3i

Рейтинг: 34.5



У меня файл std.sa находится в папке elfs2 и всё нормально собирается. Короче должен быть в путях он.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
harchello
сообщение 24.4.2010, 13:17


Интересующийся
**

Группа: Пользователи
Сообщений: 34
Регистрация: 1.12.2008
Пользователь №: 187 435
Модель телефона: Motorola

Рейтинг: 4



DarkCoder, спасибо! Разобрался, но сталкнулся с другой:
Код
BUILD DRMCHANGER DEBUG
PL DRMChanger_dbg.elf
PostLinker utility v1.2.31
by Andy51 2009-2010
make: *** [DRMChanger_dbg.elf] Error 127

Как ее можно побороть?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 26.4.2010, 2:02


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



harchello,
make.exe должен быть от Mingw, а не msys.
чтобы узнать набери в консоли: make -v

Сообщение отредактировал tim apple - 26.4.2010, 2:02
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
harchello
сообщение 27.4.2010, 13:28


Интересующийся
**

Группа: Пользователи
Сообщений: 34
Регистрация: 1.12.2008
Пользователь №: 187 435
Модель телефона: Motorola

Рейтинг: 4



tim apple, спасибо! Проблема была в make.exe
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
llldimedrolll
сообщение 30.5.2010, 9:23


Мастер
****

Группа: Разработчики
Сообщений: 212
Регистрация: 30.3.2009
Из: Украина,Краснодон,Луг область
Пользователь №: 196 795
Модель телефона: ROKR E1, N73
Прошивка: DAR 2.16


Настроение:
Ура Весна!!!=)



Рейтинг: 200



в чём у мя ошибка

obj\Release\helloworld_snd.o||In function `Timer':|
helloworld_snd.c:(.text+0xf8)||undefined reference to `EV_UNLOC_KPAD'|
||=== Сборка закончена: 1 ошибок, 0 предупреждений ===|




Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 30.5.2010, 9:31


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



llldimedrolll, в функции Timer...

там ты ссылаешься на некое "EV_UNLOC_KPAD", оно такое не знает...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
llldimedrolll
сообщение 30.5.2010, 9:33


Мастер
****

Группа: Разработчики
Сообщений: 212
Регистрация: 30.3.2009
Из: Украина,Краснодон,Луг область
Пользователь №: 196 795
Модель телефона: ROKR E1, N73
Прошивка: DAR 2.16


Настроение:
Ура Весна!!!=)



Рейтинг: 200



ну я понял а конкретней
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 30.5.2010, 9:37


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



llldimedrolll, конкретнее код дай, скажу где ошибка...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
llldimedrolll
сообщение 30.5.2010, 9:42


Мастер
****

Группа: Разработчики
Сообщений: 212
Регистрация: 30.3.2009
Из: Украина,Краснодон,Луг область
Пользователь №: 196 795
Модель телефона: ROKR E1, N73
Прошивка: DAR 2.16


Настроение:
Ура Весна!!!=)



Рейтинг: 200



baat, держи
Прикрепленный файл 1.rar   ( 2.36 килобайт ) Кол-во скачиваний: 73
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 30.5.2010, 9:49


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



llldimedrolll, AFW_CreateInternalQueuedEvAux( *EV_UNLOC_KPAD-0xE , 0x65, 0, 0 ); // разблокируем клавиатуру
вот тут смотри

а если ldrGetConstVal(EV_UNLOC_KPAD)-0xE написать вместо *EV_UNLOC_KPAD-0xE или просто без '*'?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
llldimedrolll
сообщение 30.5.2010, 9:55


Мастер
****

Группа: Разработчики
Сообщений: 212
Регистрация: 30.3.2009
Из: Украина,Краснодон,Луг область
Пользователь №: 196 795
Модель телефона: ROKR E1, N73
Прошивка: DAR 2.16


Настроение:
Ура Весна!!!=)



Рейтинг: 200



всё равно чёт непойму(
можеш поподробней написать что куда если не трудно

тогда получается


-------------- Build: Release in HeadsetIV ---------------

Компиляция: helloworld_snd.c
C:\MotoEDK\Projects\HeadsetIV\helloworld_snd.c: In function '_start':
C:\MotoEDK\Projects\HeadsetIV\helloworld_snd.c:73: warning: unused variable 'IVFile'
C:\MotoEDK\Projects\HeadsetIV\helloworld_snd.c: In function 'Timer':
C:\MotoEDK\Projects\HeadsetIV\helloworld_snd.c:167: warning: passing argument 1 of 'ldrGetConstVal' makes integer from pointer without a cast
c:\MotoEDK\SDK/loader2.h:91: note: expected 'UINT16' but argument is of type 'const UINT32 *'
Компоновка консольная программа: bin\Release\HeadsetIV.exe
obj\Release\helloworld_snd.o: In function `Timer':
helloworld_snd.c:(.text+0xfc): undefined reference to `EV_UNLOC_KPAD'
Процесс завершился со статусом 0 (0 минут, 0 секунд)
1 ошибок, 2 предупреждений



Сообщение отредактировал llldimedrolll - 30.5.2010, 10:20
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 30.5.2010, 10:03


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



llldimedrolll, если для EP2, то нужно использовать EV_KEYPAD_UNLOCK, причём так использовать:
Код
UINT32 unlock_evt = ldrGetConstVal(EV_KEYPAD_UNLOCK); // В unlock_evt будет код нужного ивента
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
llldimedrolll
сообщение 30.5.2010, 10:21


Мастер
****

Группа: Разработчики
Сообщений: 212
Регистрация: 30.3.2009
Из: Украина,Краснодон,Луг область
Пользователь №: 196 795
Модель телефона: ROKR E1, N73
Прошивка: DAR 2.16


Настроение:
Ура Весна!!!=)



Рейтинг: 200



это вместо этого писать AFW_CreateInternalQueuedEvAux( *EV_UNLOC_KPAD-0xE , 0x65, 0, 0 ); // разблокируем клавиатуру???
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 30.5.2010, 10:34


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



llldimedrolll, я ж тебе написал... и Andy51 повторил, что нужно использовать ldrGetConstVal...
в начале своей функции Timer (следующая строчка после
Код
UINT32 Timer( EVENT_STACK_T *ev_st,  APPLICATION_T *app )
{

) пишешь:
Код
UINT32 unlock_evt = ldrGetConstVal(EV_KEYPAD_UNLOCK); // В unlock_evt будет код нужного ивента

а потом вместо
Код
AFW_CreateInternalQueuedEvAux( *EV_UNLOC_KPAD-0xE , 0x65, 0, 0 ); // разблокируем клавиатуру

пишешь
Код
AFW_CreateInternalQueuedEvAux(unlock_evt , 0x65, 0, 0 ); // разблокируем клавиатуру


п.с. в асю можно ещё людям писать, включая меня, и они подскажут быстрее...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 30.5.2010, 19:34


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



Цитата(Andy51 @ Сегодня, 13:03)
UINT32 unlock_evt = ldrGetConstVal(EV_KEYPAD_UNLOCK);
*

Зачем так извращаться? Можно и так:
Код
AFW_CreateInternalQueuedEvAux( ldrGetConstVal(EV_KEYPAD_UNLOCK) , 0x65, 0, 0 );
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zeDDer
сообщение 30.5.2010, 21:00


mCore hacker
*****

Группа: Разработчики
Сообщений: 474
Регистрация: 27.6.2007
Из: Беларусь, Слуцк
Пользователь №: 139 587
Модель телефона: V3x
Прошивка: У вас такой нет)
Финалист Конкурса 2010

Рейтинг: 500



G-XaD, нам то это и понятно. На самом деле удобнее читать код который написал baat.
Мне, тебе и baat будет понятен твой вариант. Но человеку будет не понятно. ИМХО лучше занять две строки чтобы было понятно, чем одну но короче.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 30.5.2010, 21:00


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



G-XaD, чтоб біло понятнее, что откуда...
и не возникало желание писать такое
Цитата
llldimedrolll (14:52:30 30/05/2010)
0xE = ldrGetConstVal(EV_KEYPAD_UNLOCK); //код нужного ивента
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zema00
сообщение 2.6.2010, 11:46


Опытный
***

Группа: Пользователи
Сообщений: 112
Регистрация: 19.6.2009
Пользователь №: 201 595
Модель телефона: v3r
Прошивка: d3r

Рейтинг: 35



Скажите пожалуйста, как выводить на экран нужные координаты из изображения? т.е. к примеру нужно прикрепленный файл не весь отобразить, а только вырезку из него, скажем по штрине 32х32, по высоте 64х32.

Сообщение отредактировал zema00 - 2.6.2010, 11:47
Прикрепленное изображение
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 2.6.2010, 11:48


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



zema00, уточняй сразу - чем выводить? Канвасом, через драйвер, на десктопе?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zema00
сообщение 2.6.2010, 12:10


Опытный
***

Группа: Пользователи
Сообщений: 112
Регистрация: 19.6.2009
Пользователь №: 201 595
Модель телефона: v3r
Прошивка: d3r

Рейтинг: 35



Andy51,
crazy.gif вот этим, под еп1:
Код
UINT32 DrawImage( BYTE *picture, RESOURCE_ID picture_res, INT16 x, INT16 y)
{
    GRAPHIC_REGION_T region;
    UINT16 height, width;

    utility_get_image_size(picture_res, &width, &height);

    region.ulc.x=x;
    region.ulc.y=y;
    region.lrc.x=x+width+1;
    region.lrc.y=y+height+1;
    // рисует картинку на рабочем столе. Gif или bitmap
    utility_draw_image( picture_res, region, NULL, NULL);

    return RESULT_OK;
}


Сообщение отредактировал zema00 - 2.6.2010, 12:11
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 2.6.2010, 17:29


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



zema00, не, с utility_draw_image не получится. Могу предложить две альтернативы:
1) Немного "сиплюсплюса" на асме - и у тебя свой вариант utility_draw_image с блекджеком и заданием области картинки для вывода. Я приблизительно так и делал в патче APSkins.
2) Использовать обычный анимированный gif, в конце концов.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zema00
сообщение 3.6.2010, 13:42


Опытный
***

Группа: Пользователи
Сообщений: 112
Регистрация: 19.6.2009
Пользователь №: 201 595
Модель телефона: v3r
Прошивка: d3r

Рейтинг: 35



Цитата(Andy51 @ 2.6.2010, 21:29) *

2) Использовать обычный анимированный gif, в конце концов.


В каком файле SDK описано как выводить анимацию ? Мне тут прикладывали исходники какого-то эльфа, но от них толку мало..
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 4.6.2010, 13:32


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



zema00,
Исходники Tunes (svn://svn.vilko.ru/elfs2/Tunes/libs/canvas/canvas.c). Функции StartAnimationId и StopAnimationId.


Выяснил, как правильно работать с таймерами. В SDK в структуре EVENT_T добавил поле seqnum, это уникальный номер, который генерируется на запрос, вызываемый с использованием структуры IFACE_DATA_T.
Через IFACE_DATA_T::handle возвращается seqnum, который будет таким же в ивенте. Это каксается всех функций а не только таймеров.

В функциях
UINT32 DL_ClkStartTimer( IFACE_DATA_T* iface, UINT32 period, UINT32 id );
UINT32 DL_ClkStartCyclicalTimer( IFACE_DATA_T* iface, UINT32 period, UINT32 id );
id на самом деле доп. данные, которые будут в аттаче к ивенту срабатывания таймера. Например если приложение должно генерировать повторы кнопки при зажатии сюда удобнее будет поставить код кнопки, чем запоминать в глоб. переменной.

Добавлено позже (4.6.2010, 16:37):
Например:
Код
// сюда запоминаем таймеры
UINT32 uTimers[1];

    IFACE_DATA_T    iface;
    iface.port = port;
    iface.handle = 0;
    // создаем таймер
    if ( DL_ClkStartTimer( &iface, 1000, 0 ) == 1 ) {
        uTimers[0] = iface.handle;
    }


UINT32 HandleTimerExpired( EVENT_STACK_T * ev_st, APPLICATION_T * app ) {
    EVENT_T * pEvent = AFW_GetEv(ev_st);
    if ( pEvent->seqnum == uTimers[0] ) {
        // сработал наш таймер
        // ...
    }
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 6.6.2010, 20:52


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



как использовать HAPI_KEYPAD_get_keycode() на l7e? в сум и либу адрес добавил, на таймер повесил код выводить в консоль, значение всегда 0... ничего не выходит... или опять только для е398?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 7.6.2010, 2:39


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



baat,
на L7e и других телефонах с TWOPOLE-клавой эта ф-ция возвращает состояние одного столбца клавиатурной матрицы. без селектирования столбцов она бесполезна.
пример реализации можно увидеть в дуалбуте для V3i с паролем.
у меня не получилось реализовать это в эльфе - сразу рибутило телефон.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
baat
сообщение 7.6.2010, 7:08


Самый Наглый
******

Группа: В отставке
Сообщений: 1 282
Регистрация: 18.5.2006
Из: Дом, милый дом...
Пользователь №: 83 674
Модель телефона: старая модель...
Прошивка: какая уж есть...
Победитель конкурса 2008


Настроение:
...



Рейтинг: 1535



tim apple, ладно, спасибо
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zeDDer
сообщение 12.6.2010, 14:49


mCore hacker
*****

Группа: Разработчики
Сообщений: 474
Регистрация: 27.6.2007
Из: Беларусь, Слуцк
Пользователь №: 139 587
Модель телефона: V3x
Прошивка: У вас такой нет)
Финалист Конкурса 2010

Рейтинг: 500



Опять извиняюсь за отклонение от темы. Возник вопрос: что есть EV_PM_API_EXIT?
Это какой-то ID по которому из cstLibrary достаётся значение ивента для ProcessManager, который потом используется для завершения эльфа?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 12.6.2010, 14:59


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



zeDDer,
Когда приложение получает ивент EV_PM_API_EXIT, оно должно выгрузиться. Этот ивент ему может отправить в принципе любой эльф, но задумано, что ProcessManeger будет его создавать.

Я в своих эльфах использую его так:
Код
UINT32 AppReqExit( APPLICATION_T * app )
{
    UINT32            ev_code;
    ev_code = ldrFindEventHandlerTbl(any_state_handlers, HandleReqExit);
    if ( ev_code > 0 )
        return ldrSendEventToAppEmpty( app->afw_id, ev_code );
    else
        return RESULT_FAIL;
}


Добрый Модер, перенеси пож-ста эти посты в тему про писание эльфов. :)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zeDDer
сообщение 26.6.2010, 12:20


mCore hacker
*****

Группа: Разработчики
Сообщений: 474
Регистрация: 27.6.2007
Из: Беларусь, Слуцк
Пользователь №: 139 587
Модель телефона: V3x
Прошивка: У вас такой нет)
Финалист Конкурса 2010

Рейтинг: 500



Доброго времени суток.
Появился один вопрос по написанию эльфов.
Есть необходимость написать эльф, который при определённом ивенте будет выводить своё меню + чтобы была возможность вызова этого меню через пукнт например Инструменты (ивент например -0x3fe)

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

Снимал лог. По логу видно что срабатывает AFW_InquireRoutingStackByRegId(reg_id), а обработчик ивента не срабатывает. Судя по всему метки работают с ф-цией AFW_CreateInternalQueuedEvAux. Реакцией на неё будет запуск приложения.

Так вот вопрос:
можно ли как-то это обойти?
пытался сделать так:

if(AFW_InquireRoutingStackByRegId(reg_id) == RESULT_OK)
{
appShow(ev_st, elf->app);
PFprintf("%s: Application already started!\n", app_name);
return RESULT_OK;
}

получил ребут. и это всё равно не вариант. при переводе эльфа в патч у нас не будет структуры ldrElf и такого сделать не получится.
в ф-ции старта приложения нету указателя на app. есть только указтель на стэк, reg_id и третий неизвестный параметр. Может как-то можно вытянуть из них указатель на app приложения?

Сообщение отредактировал zeDDer - 26.6.2010, 12:28
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.6.2010, 15:39


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



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

Цитата(zeDDer @ Сегодня, 16:20)

ф-ции старта приложения нету указателя на app.
*


Разумеется его нет, потому что ты его ещё не создал для текущего экземпляра приложения, а создаёшь ты её сам в функции старта. AFW_InquireRoutingStackByRegId вообще для эльфов лучше не использовать - в EP2 его заменяет ldrIsLoaded.

А если тебе надо получить app для уже запущенного экземпляра эльфа - в EP2 можно использовать такой код:
Код
APPLICATION_T *app = ldrFindElf("MyElfName")->app;

Или даже такой, если эльф резидентный и всегда в одном экземпляре запускается:
Код
ldrElf        elf; // Где-то в заголовке
..
APPLICATION_T *app = elf.app;


Сообщение отредактировал Andy51 - 26.6.2010, 15:44
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zeDDer
сообщение 26.6.2010, 15:55


mCore hacker
*****

Группа: Разработчики
Сообщений: 474
Регистрация: 27.6.2007
Из: Беларусь, Слуцк
Пользователь №: 139 587
Модель телефона: V3x
Прошивка: У вас такой нет)
Финалист Конкурса 2010

Рейтинг: 500



Цитата(Andy51 @ Сегодня, 18:39)

zeDDer, может я конечно ошибаюсь, но ивенты для запуска пункта по меню и по метке - разные
*



логи говорят иначе. ивент один и тот же, только вот реакция апп на запуск через меню и через метку разная.

Цитата
AFW_InquireRoutingStackByRegId вообще для эльфов лучше не использовать - в EP2 его заменяет ldrIsLoaded.

ldrIsLoaded я использую в точке входа в эльф (_main). проверяю если есть эльф, то просто выгружаю его, если нет, то по обычной схеме APP_Register и т.д.

Если переводить эльф в патч и регистрировать его на ивент запуска пункта из меню, то при любом нажатии на этот пункт меню будет сперва вызываться та ф-ция, которую я скормил APP_Register ( void *start_fn, назовём её APPStart).
и соответственно чтобы не инициализировать всё по новой и используется AFW_InquireRoutingStackByRegId в этой APPStart.

смотрел третий параметр передаваемый в APPStart

typedef struct
{
EVENT_CODE_T evcode; //код ивента. Это есть первый код ивента из const EVENT_CODE_T *reg_table передаваемого в APP_Register
void *start_fn; //Адрес ф-ции запуска апп.
UINT32 unk1; //какой-то адрес
UINT32 unk2; //какой-то адрес
REG_ID_T reg_id; //REG_ID_T
} PARAM2_ST;

Ничего особо интересного в нету.
Ковыряюсь в прошиве что-бы хоть что-то дельное найти...

Сообщение отредактировал zeDDer - 26.6.2010, 16:10
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 27.6.2010, 6:11


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



zeDDer,
твоя ошибка в том, что регишь эльф на ивент и добавляешь обработчик на него же. в твоем случае нужно только первое.
при этом ф-ция APPStart будет вызываться и при 1м запуске эльфа и при повторных.
отличить можно с помощью AFW_InquireRoutingStackByRegId.
соответственно при первом запуске делаешь как обычно, а при повторном выводишь из фона или как тебе там нужно. при этом для app можно использовать глобальную переменную.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
zeDDer
сообщение 27.6.2010, 10:12


mCore hacker
*****

Группа: Разработчики
Сообщений: 474
Регистрация: 27.6.2007
Из: Беларусь, Слуцк
Пользователь №: 139 587
Модель телефона: V3x
Прошивка: У вас такой нет)
Финалист Конкурса 2010

Рейтинг: 500



tim apple, с глобальной переменной облом. при попытке использовать указатель на app из структуры ldrElf, я получил ребут.

Сделал чуть чуть по другому.

Код

static EVENT_HANDLER_ENTRY_T any_state_handlers[] =
{
    { STATE_HANDLERS_PM_API_EXIT,   AnyHandlePMReqExit          },
    { STATE_HANDLERS_RESERVED,      AnyHandleReqAppShow         },
    { EV_REVOKE_TOKEN,                     APP_HandleUITokenRevoked    },
    { STATE_HANDLERS_END,                NULL                        },
};


UINT32 _main (ldrElf *ela, WCHAR *params)
{
...
UINT32 reserved = elf->evbase;
reserved = ldrInitEventHandlersTbl(any_state_handlers, reserved);

EVENT_CODE_T evtable[2] = {THEME_MENU_EV, any_state_handlers[1].code};
APP_Register(evtable, 2, state_handling_table, HW_STATE_MAX, (void*)APPStart);
ldrSendEvent(evtable[0]);
...
}

UINT32 APPStart (EVENT_STACK_T *ev_st, REG_ID_T reg_id, UINT32 param2)
{
...
    if(AFW_InquireRoutingStackByRegId(reg_id) == RESULT_OK)
    {
        if(AFW_GetEvCode(ev_st) == THEME_MENU_EV)
            AFW_CreateInternalQueuedEvAux(any_state_handlers[1].code, FBF_LEAVE, 0, NULL);

        PFprintf("%s: Application already started!\n", app_name);
        return RESULT_OK;
    }
...
}

UINT32 AnyHandleReqAppShow (EVENT_STACK_T *ev_st, APPLICATION_T *app)
{
    UINT32 status = RESULT_OK;

    status |= APP_ConsumeEv(ev_st, app);
    status |= appShow(ev_st, app);

    return status;
}

Вот как-то так. В таком случае нормально работает и при вызове через пункт меню и через метку

Сообщение отредактировал zeDDer - 27.6.2010, 10:21
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 27.6.2010, 11:02


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



Цитата(zeDDer @ Сегодня, 16:12)

Вот как-то так.
*


OMG
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 27.6.2010, 16:07


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



Цитата(tim apple @ Сегодня, 14:02)

OMG
*


+1

zeDDer,
Вот как я делал:
Код
UINT32 AppStart( EVENT_STACK_T * ev_st, REG_ID_T reg_id, void * reg_hdl )
{
    THISAPP_T *            papp;
    UINT32                status;
    
    dbg("AppStart: Enter");
    
    if( AFW_InquireRoutingStackByRegId( reg_id ) == RESULT_OK ) {
        AppShow(elf.app);
        return RESULT_FAIL;
    }

    // ...
}

UINT32 AppShow( APPLICATION_T * app )
{
    return AppChangeState(app, thisapp(app)->last_state, TRUE);
}
UINT32 AppHide( APPLICATION_T * app )
{
    return AppChangeState(app, APP_STATE_BG, FALSE);
}

// Изменить стэйт + насильно показать
UINT32 AppChangeState( APPLICATION_T * app, UINT8 new_state, BOOL force_show )
{
    ADD_EVENT_DATA_T    ed;
    UINT32                ev_code;
    
    dbg("AppChangeState: state = %d / %d", new_state, force_show);
    
    ed.data_tag = 0;
    ed.data.pad[0] = new_state;
    ed.data.pad[1] = force_show;
    
    ev_code = ldrFindEventHandlerTbl(any_state_handlers, HandleChangeState);
    if ( ev_code > 0 )
        return
        AFW_CreateInternalQueuedEvPriv( ev_code, 0,
                                        app->afw_id,
                                        0, 0,
                                        &ed,
                                        FBF_FREE, 0, NULL, 0 );
    else
        return RESULT_FAIL;
}

У меня "фоновый" режим реализуется через отдельный стэйт. Стэйты в моем приложении: ANY, INIT, BG, остальные гуёвые стэйты.
Смену стэйта выполняет функция обработчик ивента (HandleChangeState). Конкретного ивента я не знаю, он назначается динамически, а нахожу я его через ldrFindEventHandlerTbl. Вместо APP_UtilChangeState используется AppChangeState.
Но в любом случае нужно делать в глобальной переменной указатель на запущенное приложение, т.к. нету функции чтобы получить его через reg_id.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
CrayZor
сообщение 29.6.2010, 14:58


Мастер
****

Группа: Пользователи
Сообщений: 168
Регистрация: 22.3.2008
Пользователь №: 167 295
Модель телефона: E398, ROKR E1, X2, G100
Прошивка: In development

Рейтинг: 70



Вопрос такого характера возможно сделат так когда выводиш графику через канвас она отображалас поверх фоновой картинки стола... Надо чтоб было как в главном меню отображение поверх фоновой картинки но чтоб очищался экран от предидущего состояния...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 29.6.2010, 15:47


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



CrayZor,
В SDK, в файл canvas.h заглядывали? Там есть:
Код
// с картинкой
UIS_DIALOG_T UIS_CreateColorCanvasWithWallpaper (  SU_PORT_T  *port,
                                                   DRAWING_BUFFER_T * drawing_buffer,
                                                   BOOL use_status_line_area,
                                                   BOOL wallpaper_flag );
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся писать эльфов вместе, Обсуждение процесса кодинга · Эльфы, их разработка и портирование · Forum
 

16 страниц V « < 13 14 15 16 >
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 10.8.2025, 0:46

Форум живёт: