motofan logo
16 страниц V < 1 2 3 > »         
> 

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

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 килобайт ) Кол-во скачиваний: 1151
  3. "Язык программирования C"
    Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 897
Исходники эльфов
  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 килобайт ) Кол-во скачиваний: 2168
Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 897
Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1151
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
conanxu
сообщение 2.11.2007, 15:32


Новичок
*

Группа: Пользователи
Сообщений: 7
Регистрация: 30.10.2007
Пользователь №: 152 263
Модель телефона: 13816523558

Рейтинг: 0



to Vilko:
it didn't show warning message,but when i run it,my phone will also restart.Can you help me to find which mistake i have make?<
Attachment is my source file.
Thank you.

Сообщение отредактировал conanxu - 2.11.2007, 15:32
Прикрепленный файл ToneDBKiller.rar   ( 1.87 килобайт ) Кол-во скачиваний: 365
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 2.11.2007, 16:53


0xFFFF
******

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

Рейтинг: 1224



conanxu, first of all - have you updated the library to 071029? Most likely it is the problem.

Oops, ive forgot to add mem functions sad.gif Add this to the SDK by yourself:
Ой, я забыл добавить функции для работы с памятью в SDK sad.gif Добавьте в SDK:
Код
void *suAllocMem(UINT32 size, INT32 *result); //result can be NULL
void suFreeMem(void *ptr);

Use it instead of malloc and free
Используйте их вместо malloc и free

If you still have problems with u_atou, then you haven't updated the SDK to v0.1a

Vilko, так не получится - нельзя определить, импорт "известный" или нет sad.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
conanxu
сообщение 3.11.2007, 3:35


Новичок
*

Группа: Пользователи
Сообщений: 7
Регистрация: 30.10.2007
Пользователь №: 152 263
Модель телефона: 13816523558

Рейтинг: 0



Andy51, thank you for your help. the string convert is normal. Now,there is a new problem. I try to implement the function.when i press star double, it will delete the tonedbfiles. when i press star first and then press pound, it will exit. but in practice, i only press star once at first. it will delete the tonedbfiles. i press other key at first , then press star double. it works normal.here is my code for keyevent handle function.
Код

UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    static BOOL bPressStar = FALSE;
    EVENT_T     *event = AFW_GetEv(ev_st);

    UtilLogStringData(" *** ELF *** HelloWorld: key pressed 0x%X", event->data.key_pressed);

    DL_AudPlayTone(event->data.key_pressed, 6);
    
    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == FALSE)
            bPressStar = TRUE;
        else
        {
            DelToneDBFile();
            return ToneDBKillerExit(ev_st, app);
        }
    }
    else
    {
        if(bPressStar == TRUE && event->data.key_pressed == KEY_POUND)
            return ToneDBKillerExit(ev_st, app);
        bPressStar = FALSE;
    }
    
    return RESULT_OK;
}


i think the var bPressStar maybe is TRUE at first.

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


0xFFFF
******

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

Рейтинг: 1224



conanxu, edited your message... About the question: try to catch EV_KEY_RELEASE event and make in its handler bPressStar = TRUE. The cause could be that you're catching the event twice.

btw, maybe Vilko would be so kind to explain how to use UtilLogStringData? wink.gif It would be quite a help to all interested programmers smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
conanxu
сообщение 4.11.2007, 12:28


Новичок
*

Группа: Пользователи
Сообщений: 7
Регистрация: 30.10.2007
Пользователь №: 152 263
Модель телефона: 13816523558

Рейтинг: 0



I modified my code.
Код

BOOL bPressStar = FALSE;

/* Handler of the HW_STATE_ANY event (it used in every state) */
const EVENT_HANDLER_ENTRY_T any_state_handlers[] =
{  
    { EV_KEY_PRESS,             HandleKeypress },
    { EV_KEY_RELEASE,           HandleKeyrelease },

    // The list must always end with such record
    { STATE_HANDLERS_END,           NULL           },
};

UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);

    UtilLogStringData(" *** ELF *** HelloWorld: key pressed 0x%X", event->data.key_pressed);

    DL_AudPlayTone(event->data.key_pressed, 6);
    
    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == TRUE)
        {
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star double");
            DelToneDBFile();
            return ToneDBKillerExit(ev_st, app);
        }
        else
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star once");
    }
    else
    {
        if(bPressStar == TRUE && event->data.key_pressed == KEY_POUND)
        {
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star and pound");
            return ToneDBKillerExit(ev_st, app);
        }
        else
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed other");
    }
    
    return RESULT_OK;
}

UINT32 HandleKeyrelease( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);

    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == FALSE)
            bPressStar = TRUE;
    }
    else
        bPressStar = FALSE;
    return RESULT_OK;
}

now, it works normally

Edit by A51 - Do not forget to use [code][/code] tags!

Сообщение отредактировал Andy51 - 4.11.2007, 13:35
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 6.11.2007, 14:06


Мастер
****

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

Рейтинг: 323



Код

UINT8 DL_FsWriteFile( void* buffer,
                      UINT32 size,
                      UINT32 count,
                      FILE_HANDLE_T handle,
                      UINT32* written);

Для чего параметр written?
Долго эксперементировал с функциями файловой системы, но тело постоянно уходило в ребут при вызове DL_FsWriteFile. В конце концов добился правильной работы вот так:
Код

UINT8 fwrite( void* buffer, UINT32 size, UINT32 count, FILE f ) {
    return DL_FsWriteFile( buffer, size, count, f, (((UINT32*)buffer)-4) );
}

Вот только я не уверен правильно ли это?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 6.11.2007, 16:17


0xFFFF
******

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

Рейтинг: 1224



G-XaD, ты ведь работал с fwrite? Если помнишь, она возвращает количество записанных блоков размером size. Так вот DL_FsWriteFile вместо этого возвращает код ошибки, а количество записанных блоков - через параметр written.
Т.е. правильно так:
Код
UINT32 fwrite( void* buffer, UINT32 size, UINT32 count, FILE f )
{
    UINT32 written;
    DL_FsWriteFile( buffer, size, count, f, &written);
    return written;
}


Сообщение отредактировал Andy51 - 6.11.2007, 16:18
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 15.11.2007, 12:23


Мастер
****

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

Рейтинг: 323



теперь сделать бекап PDS совсем легко. Не прийдется даже переводить телефон во флеш-режим.
Эльф делает бекап памяти длинной в 0x10000 байт начиная с адресса 0x10010000 в файл /b/PDS.smg.

Закачиваем эльф, запускаем.
жмем на теле 1 чтобы сделать бекап (будет звук).
2 чтобы проверить существование бекап-файла (будет звук: да/нет).
3 чтобы удалить бекап (будет звук: да/нет).
* или # чтобы закрыть эльф (будет звук).
Прикрепленный файл PDSBackuper.rar   ( 3.04 килобайт ) Кол-во скачиваний: 566
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
S@modelkin
сообщение 18.11.2007, 7:37


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

Группа: Пользователи
Сообщений: 81
Регистрация: 18.11.2007
Из: Нововаршавка, Омская обл.
Пользователь №: 154 260
Модель телефона: L7
Прошивка: Iron FX E0R

Рейтинг: 33



Andy51,
1) Когда выйдет новый SDK? А то я уже все функции перепробовал...
2) Кстати, я нашёл тут gnuarm. В нём много стандарных библиотек c++, но я просто не успел ещё им воспользоваться. Самое, что меня радует - это то, что в нём есть stdio.h smile.gif И ВОПРОС! Можно ли им пользоваться при написании эльфов? (там папочка есть arm-elf, и в ней много загололвочных файлов)
3) Наверное немного неуместный вопрос, но откуда взялась функция из dl.h (она там одна, просто забыл как называется), ну на проигрывание тона? Её в стандартных библиотеках нет, значит это наверное стандартная функция прошивки... И ещё: где можно(если можно) взять все эти функции?

Сообщение отредактировал S@modelkin - 18.11.2007, 7:40
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 18.11.2007, 10:39


0xFFFF
******

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

Рейтинг: 1224



Цитата(S@modelkin @ Сегодня, 10:37)

Когда выйдет новый SDK? А то я уже все функции перепробовал...
*

Это не так просто делается...
Цитата(S@modelkin @ Сегодня, 10:37)

Можно ли им пользоваться при написании эльфов?
*

Можно, но далеко не всеми функциями. printf-ы использовать не получится, а всякие sprintf - пожалста. Статическая линковка не рекомендуется, лучше использовать функции, которые уже есть в прошивке.
Цитата(S@modelkin @ Сегодня, 10:37)

где можно(если можно) взять все эти функции?
*

Берёшь из эльфа gsm_flash_dev. Найдёшь там кстати функции libc - можешь добавить в библиотеку и юзать на здоровье. Да и если получится - поможешь тем самым расширению SDK wink.gif

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


Мотокодер
******

Группа: Легенды MotoFan.Ru
Сообщений: 1 331
Регистрация: 23.6.2003
Из: Москва
Пользователь №: 71
Модель телефона: E398+, Е1000, ...

Рейтинг: 1116



весь stdlib (libc) в прошивке присутствует. так что ищите и пользуйтесь без сомнений )
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
S@modelkin
сообщение 18.11.2007, 11:26


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

Группа: Пользователи
Сообщений: 81
Регистрация: 18.11.2007
Из: Нововаршавка, Омская обл.
Пользователь №: 154 260
Модель телефона: L7
Прошивка: Iron FX E0R

Рейтинг: 33



Опять вопросы возниклиsmile.gif
1) В gnuarm есть прога: arm-elf-jar.exe. В описании вроде бы(точно не знаю), написано, что она из jar делает elf. Это реально?
2) Чё-то я туплю или чё...smile.gif Как это взять из эльфа gsm_flash_dev?

Сообщение отредактировал S@modelkin - 18.11.2007, 11:31
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Vilko
сообщение 18.11.2007, 11:28


Мотокодер
******

Группа: Легенды MotoFan.Ru
Сообщений: 1 331
Регистрация: 23.6.2003
Из: Москва
Пользователь №: 71
Модель телефона: E398+, Е1000, ...

Рейтинг: 1116



S@modelkin,
найти нужную функцию в эльфе по имени.
сделать ее паттерну. найти функцию по паттерну в целевой прошивке.
дописать в либу эту функцию с использованием адреса...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 18.11.2007, 11:32


0xFFFF
******

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

Рейтинг: 1224



Цитата(S@modelkin @ Сегодня, 14:26)

В gnuarm есть прога: arm-elf-jar.exe. В описании вроде бы(точно не знаю), написано, что она из jar делает elf. Это реально.
*

Ну, пробуй... Расскажешь, если что получится
Цитата(S@modelkin @ Сегодня, 14:26)

Как это взять из эльфа gsm_flash_dev?
*


тут

Добавлено позже (18.11.2007, 14:35):
Цитата(Vilko @ Сегодня, 14:28)

найти функцию по паттерну в целевой прошивке.
дописать в либу эту функцию с использованием адреса...
*

Два этих пункта комплект портации делает самостоятельно, нужно просто добавить паттерну в functions.pat. Да, ещё в LTE2 многие функции libc находятся в IROM - это уж надо добавлять их в LTE2_IROM.sym
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 8.12.2007, 2:06


Мастер
****

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

Рейтинг: 323



Andy51,

Решил рассказать об ошибках
1) В файле SDK\dl.h неправильный код кнопки камеры. Я у себя исправил на
Код
#define KEY_CAM     0x3F // was 64

2) Помоему кусок кода неработает.
Код
    if( AFW_InquireRoutingStackByRegId( reg_id ) == RESULT_OK )
    {
        return RESULT_FAIL; // Нам не нужен второй экземпляр
    }

Судя по логеру я запускал 2 одинаковых приложения и получал 2 ответа на одно нажатие кнопки.
Немного порывшись в прошивке я нашел вызов функции AFW_AddAppToRoutingStack, это очень похоже на корень проблемы wink.gif

Сообщение отредактировал G-XaD - 8.12.2007, 2:07
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 18.12.2007, 19:35


0xFFFF
******

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

Рейтинг: 1224



SDK обновлён до v0.2. Много изменений - всего и не припомню... В общем, SDK вырос больше чем в два раза smile.gif

Ну, и конечно же, не забываем обновить библиотеку!

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


0xFFFF
******

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

Рейтинг: 1224



Кстати говоря, я добавлял работу с редактируемыми формами и полями практически наобум. И, соответственно, не проверял этого, так что предоставляю разработчикам простор для исследований smile.gif
Также обратите внимание на функции файлового поиска, добавленные в filesystem.h - таким способом я получал список файлов в FBrowser. Назначение большинства флагов в FS_SEARCH_PARAMS_T также туманно.
В dl.h я добавил функции таймера. Как он работает я думаю, я понял, но опять же не проверял. При активации таймера с помощью APP_UtilStartTimer начинается отсчёт времени. Когда таймер срабатывает, возникает соответствующий ивент, который и надо обработать. APP_UtilStopTimer, насколько я понимаю, нужен только в случае циклического таймера. Я полагаю, многие обратят внимание на то, что с помощью этих функций возможно создать только один таймер. Дело в том, что это - утилитные функции, которые в свою очередь вызывают функции таймера более "низкого" уровня. Так что возможность создания нескольких таймеров присутствует, если добавить в SDK соответствующие функции.
Кстати говоря, в прошивке кроме таймеров есть ещё т.н. Alarms - насколько я понимаю, предназначены они для долгосрочного планирования ( по-моему, использовать таймер с миллисекундным разрешением - не есть хорошо для задачи, которая должна сработать через, скажем, неделю smile.gif )

Да, и в обновлённую библиотеку были включены все новые функции разработчиков на сегодняшний день.

Сообщение отредактировал Andy51 - 19.12.2007, 17:22
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 21.12.2007, 15:29


Мастер
****

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

Рейтинг: 323



Выкладую исходники (если кому интересно) очень косячного tomato.gif файл-браузера. В принципе для ознакомления работы с поиском фалов. Через некоторое время юзания вылазит ребут, хотя с памятью вроде нормально работаю. В акшены нельзя вроде кинуть строку юникод, поэтому в там строки из лэнга - они означают "сменить диск". Иконки в дрм особо не искал. Потом какнибудь доделаю wink.gif

Требуется наличие в либе функций
Код
u_strcmp A E35000001351000003A00000012FFF1E
u_strncmp A E3520000135000001351000003A00000


Уже есть в библиотеке v071218 - A51

Сообщение отредактировал Andy51 - 21.12.2007, 16:39
Прикрепленный файл Motocmd.rar   ( 13.31 килобайт ) Кол-во скачиваний: 346
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 21.12.2007, 17:11


0xFFFF
******

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

Рейтинг: 1224



Цитата(G-XaD @ Сегодня, 18:29)

В акшены нельзя вроде кинуть строку юникод
*

Как это нельзя? Я помню, как китайцы жаловались, что в предыдущем FBrowser у них не отображались некоторые действия, которые я задавал по-русски в коде...
Цитата(G-XaD @ Сегодня, 18:29)

Через некоторое время юзания вылазит ребут, хотя с памятью вроде нормально работаю
*

Кхем...
Код
// Эта функция выделяет память! После ее использования обязательно освобождать эту память!
Ты писал? Так чего не соблюдаешь? laugh.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
RekGRpth
сообщение 12.1.2008, 10:33


Начинающий патчер
****

Группа: Пользователи
Сообщений: 234
Регистрация: 6.11.2006
Пользователь №: 106 009
Модель телефона: RoverPC N6
Прошивка: WM 6.1

Рейтинг: 359.5



ListTest.elf - для использования ввода строк, требует функцию
AFW_TranslateEvEvD T B5701C161C0D1C042800D01248682300
Прикрепленный файл ListTest.rar   ( 3.52 килобайт ) Кол-во скачиваний: 312
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 13.1.2008, 0:23


0xFFFF
******

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

Рейтинг: 1224



Цитата(RekGRpth @ Вчера, 13:33)

требует функцию AFW_TranslateEvEvD
*

На самом деле не требует. Вместо AFW_TranslateEvEvD отлично катит AFW_AddEvEvD.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Last1Left
сообщение 5.2.2008, 19:36


Опытный
***

Группа: Пользователи
Сообщений: 103
Регистрация: 30.1.2008
Из: Romania
Пользователь №: 161 862
Модель телефона: v360 ACR / Nokia N82
Прошивка: FallenAngel

Рейтинг: 97



updated SDK in english
Прикрепленный файл SDK.rar   ( 15.12 килобайт ) Кол-во скачиваний: 185
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 14.2.2008, 16:04


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



Попробовал поставить вместо NOTICE_TYPE_DEFAULT в ХВгуи ельфе 4 и получил, мне кажется полезную вещ - он не исчезает по времени а по нажатию на любую клавишу, буду эксперементировать, можед быть сделаю расписание звонков начала и конца занятийsmile.gif

Сообщение отредактировал MONSTER92 - 14.2.2008, 16:07
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 15.2.2008, 13:11


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



Хм, а у нас какиенибуть функции преобразования исла в строку есть, чтото я ничего так понять и не смог sad.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 15.2.2008, 16:29


0xFFFF
******

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

Рейтинг: 1224



MONSTER92, ltoa, sprintf и прочие пристутствуют в прошивке (в IROM для LTE2 скорее всего) - добавить нетрудно.
У меня даже есть sprintf - он в CG1 как на LTE, так и на LTE2
Код
sprintf T 1 B40FB530B091A9160889900F480C0089
extern int sprintf(char * /*s*/, const char * /*format*/, ...);
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 15.2.2008, 17:54


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



тоесть для использование sprintf пирмерно sprintf(/*строка, в которую будет записан результат*/,/*строка из которой формируется результат*/ "Variable i= %i",/*список переменных*/, i/* int i*/); , правильно?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 15.2.2008, 20:12


0xFFFF
******

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

Рейтинг: 1224



MONSTER92, да, всё правильно. Всё как у printf, только первый параметр добавился
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 17.2.2008, 7:39


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



А функция DL_ClkGetTime(TIME *time); должна получать время?
Напишите пожалуйста пример ёе еспользования smile.gif

ypedef struct
{
UINT8 hour;
UINT8 minute;
UINT8 seconds;
} TIME;

Значит при заданной переменной TIME timenow; через timenow.hour мы сможим получить час?

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


0xFFFF
******

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

Рейтинг: 1224



MONSTER92,
Код
TIME timenow;
UINT8 hoursnow;
DL_ClkGetTime(&timenow);
hoursnow = timenow.hour;
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 17.2.2008, 13:55


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



unsure.gif Cтранно при добавлении в код образуется много ошибок
Код

D:\SDK>tcc -ISDK -c -bigend -apcs /interwork helloworld_gui.c
"helloworld_gui.c", line 149: Serious error: C2304E: <command> expected but foun
d 'int'
"helloworld_gui.c", line 151: Serious error: C2292E: typedef name 'WCHAR' used i
n expression context
"helloworld_gui.c", line 151: Serious error: C2284E: expected ';' after command
- inserted before 'msg'
"helloworld_gui.c", line 151: Error: C2456E: undeclared name, inventing 'extern
int msg'
"helloworld_gui.c", line 151: Serious error: C2947E: Illegal types for operands:
<subscript>
"helloworld_gui.c", line 152: Serious error: C2304E: <command> expected but foun
d 'char'
"helloworld_gui.c", line 153: Error: C2456E: undeclared name, inventing 'extern
int msg2'
"helloworld_gui.c", line 153: Error: C2456E: undeclared name, inventing 'extern
int i'
"helloworld_gui.c", line 153: Error: C3029E: <argument 1 to 'sprintf'>: implicit
cast of non-0 int to pointer
"helloworld_gui.c", line 154: Error: C3029E: <argument 1 to 'u_atou'>: implicit
cast of non-0 int to pointer
"helloworld_gui.c", line 154: Error: C3029E: <argument 2 to 'u_atou'>: implicit
cast of non-0 int to pointer
helloworld_gui.c: 0 warnings, 6 errors, 5 serious errors

Скорее всего значение имеет только первая из них, при закоментировании строчек
Код

DL_ClkGetTime(&timenow);
hoursnow = timenow.hour;
всё снова работает нормально

Сообщение отредактировал MONSTER92 - 17.2.2008, 13:59
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 17.2.2008, 14:51


0xFFFF
******

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

Рейтинг: 1224



MONSTER92, покажи полный код функции
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 17.2.2008, 14:58


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



Я просто эксперементирую с helloWorld Gui , покачто хочу чтоб время вывелось, потом наверно буду делать время до ближайшего звонка smile.gif
Код

UINT32 MainStateEnter( EVENT_STACK_T *ev_st,  void *app,  ENTER_STATE_TYPE_T type )
{
    APPLICATION_T           *papp = (APPLICATION_T*) app;
    SU_PORT_T               port = papp->port;
    CONTENT_T               content;
    UIS_DIALOG_T            dialog = 0;


TIME timenow;
UINT8 hoursnow;
DL_ClkGetTime(&timenow);
hoursnow = timenow.hour;

int i=100;

WCHAR msg[100] = L"Hello world!";
char msg2[100];
  sprintf(msg2,"i=%i",i);
   u_atou(msg2, msg);
        
        
//------------ дальше без изменений

    if(type!=ENTER_STATE_ENTER) return RESULT_OK;
    
    UIS_MakeContentFromString("MCq0", &content, msg); //Создаём контент из строки
    
    dialog = UIS_CreateTransientNotice( &port, &content, 4/* NOTICE_TYPE_DEFAULT */);
    
    UtilLogStringData(" *** ELF *** HelloWorld: MainStateEnter 0x%X", dialog);
    
    if(dialog == 0) return RESULT_FAIL;

    papp->dialog = dialog;

    return RESULT_OK;
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 17.2.2008, 15:01


0xFFFF
******

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

Рейтинг: 1224



Цитата(MONSTER92 @ Сегодня, 17:58)

int i=100;

WCHAR msg[100] = L"Hello world!";
char msg2[100];
*


ads почему-то требует, чтобы все переменные объявлялись в начале функции, ДО всякого кода
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 7.5.2008, 10:47


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

Группа: Пользователи
Сообщений: 67
Регистрация: 18.6.2005
Пользователь №: 44 478
Модель телефона: V500
Прошивка: V500->V620->E1 (R373_G_0E.30.45R)

Рейтинг: 14



Я сам только начал разбираться с эльфами и возникли след. вопросы:
1) Событие EV_MME_CLOSE_COMPLETE должно срабатывать при закрытии ранее открытого файла т.е. после выполнения MME_GC_playback_delete()? У меня пока что не получается.
2) Можно ли одновременно открыть несколько файлов через MME_GC_playback_create() для их последующего воспроизведения через вызов MME_GC_playback_start()? Опять же у меня прокатывает только с одним открытым файлом в данный момент.
3) Дайте линк на "p2k Data loger" с помощью которой можно читать лог команды UtilLogStringData() - это написано в SDK в trace.h но самой програмы я найти нигде не могу. Через лог мидвея неудобно отлаживать - приходится отключать мидвей чтобы залить пересобраный эльф, потом заново коннектить мидвей, перетыкая провод.

Спасибо.

UPD:
Так и знал что сюда никто не заглянет sad.gif А тем временем вопросов всё больше - может кто научит определять количество параметров свеженайденных в прошивке функций, я бы СДК помог пополнять? А то нахожу функцию, смотрю на код в IDA и не доходит как определить кол-во и тип параметров и возварщаемое значение. Опыт в программировании есть и не маленький так что можно объяснять без азов, кратенько.

Сообщение отредактировал Dex9999 - 8.5.2008, 14:18
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Morpheuz
сообщение 21.5.2008, 2:54


Опытный
***

Группа: Пользователи
Сообщений: 109
Регистрация: 17.6.2006
Из: Харьков
Пользователь №: 88 149
Модель телефона: L7e NS2.0+Elf

Рейтинг: 3.5



serzh44
Как продвигаються дела с классами?
Как я понял для того чтобы использовать какую-то ф-ю нужно сначала ее "найти" в прошившке? или что-то не так понял?
p.s.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
kadukmm
сообщение 23.5.2008, 23:54


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

Группа: Разработчики
Сообщений: 83
Регистрация: 23.2.2007
Из: Украина, г. Винница
Пользователь №: 123 713
Модель телефона: Samsung SGH-I400
Прошивка: R373_49R&Symbian 9.1

Рейтинг: 120



Цитата(Dex9999 @ 7.5.2008, 13:47) *

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

Я так понимаю, судя по логике, нада смотреть именно асмовый код для опрееделения параметров... Т.е. нада знать какая конвенция вызова функций (типа какой параметр в каком регистре передаеться), а дальше уже просто по коду смотришь какие регистры считываються...

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


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(kadukmm @ Сегодня, 1:54)

Я так понимаю, судя по логике, нада смотреть именно асмовый код для опрееделения параметров... Т.е. нада знать какая конвенция вызова функций (типа какой параметр в каком регистре передаеться), а дальше уже просто по коду смотришь какие регистры считываються...
*


я попробую привести пример , а вы скажите верен ли он:
открываем в ida эльф прошивки Е398, идём например в jsa_suiteslist_agent_dialog_ev_table
судя по названию, это контекстное меню в списке java - приложений , смотрим таблицу
Код
CORE_APPS:10413E2C jsa_suiteslist_agent_dialog_ev_table
CORE_APPS:10413E2C                 DCD 0x2043
CORE_APPS:10413E2C                 DCD JsaSuitesList_Navigate+1
CORE_APPS:10413E2C                 DCD 0x2020
CORE_APPS:10413E2C                 DCD JsaSuitesList_Done+1
CORE_APPS:10413E2C                 DCD 0x202C
CORE_APPS:10413E2C                 DCD JsaSuitesList_GetData+1
CORE_APPS:10413E2C                 DCD 0x2058
CORE_APPS:10413E2C                 DCD JsaSuitesList_Select+1
CORE_APPS:10413E2C                 DCD 0x8254B
CORE_APPS:10413E2C                 DCD JsaSuitesList_Delete+1
CORE_APPS:10413E2C                 DCD 0x8254D
CORE_APPS:10413E2C                 DCD JsaSuitesList_Details+1
CORE_APPS:10413E2C                 DCD 0x82551
CORE_APPS:10413E2C                 DCD JsaSuitesList_Permissions+1
CORE_APPS:10413E2C                 DCD 0x82552
CORE_APPS:10413E2C                 DCD JsaSuitesList_SecDetails+1
CORE_APPS:10413E2C                 DCD 0x8254C
CORE_APPS:10413E2C                 DCD JsaSuitesList_TellAFriend+1
CORE_APPS:10413E2C                 DCD 0x82556
CORE_APPS:10413E2C                 DCD JsaSuitesList_SortByName+1
CORE_APPS:10413E2C                 DCD 0x82557
CORE_APPS:10413E2C                 DCD JsaSuitesList_SortBySize+1
CORE_APPS:10413E2C                 DCD 0x82558
CORE_APPS:10413E2C                 DCD JsaSuitesList_Protect+1
CORE_APPS:10413E2C                 DCD 0x20C5
CORE_APPS:10413E2C                 DCD JsaSuitesList_Shortcut+1
CORE_APPS:10413E2C                 DCD 0x82555
CORE_APPS:10413E2C                 DCD JsaSuitesList_SwitchStorage+1
CORE_APPS:10413E2C                 DCD 0xFFFFFFFF
CORE_APPS:10413E2C                 DCD 0

видим , что тут коды клавиш и другие коды, которые передаются в определённые функции.
рассмотрим к примеру участок смены места хранения java
CORE_APPS:10413E2C DCD 0x82555
CORE_APPS:10413E2C DCD JsaSuitesList_SwitchStorage+1
тоесть код 82555 передаётся в процедуру JsaSuitesList_SwitchStorage
лезем и смотрим эту процедуру
Код
CORE_APPS:1039522E JsaSuitesList_SwitchStorage
CORE_APPS:1039522E                 LDR     R2, =0x82551   ; Load from Memory
CORE_APPS:10395230                 PUSH    {R7,LR}        ; Push registers
CORE_APPS:10395232                 ADD     R2, #4         ; Rd = Op1 + Op2
CORE_APPS:10395234                 BL      JsaSuitesList_SimpleEventProcess; Branch with Link
CORE_APPS:10395238                 POP     {R7}           ; Pop registers
CORE_APPS:1039523A                 POP     {R3}           ; Pop registers
CORE_APPS:1039523C                 BX      R3             ; Branch to/from Thumb mode
CORE_APPS:1039523C; End of function JsaSuitesList_SwitchStorage

она проста : в процедуру JsaSuitesList_SimpleEventProcess передаётся значение R2
тоесть мы можем сделать эльф , который по зажатию к примеру зелёной кнопки вызова
передаст значение 82555 в процедуру JsaSuitesList_SimpleEventProcess и тем самым
переключит или вызовет диалог переключения устройств хранения java
Для этого нам нужно кроме написания эльфа добавить в elfloader.lib процедуру JsaSuitesList_SimpleEventProcess

вот так вообщем...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 26.5.2008, 4:37


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

Группа: Пользователи
Сообщений: 67
Регистрация: 18.6.2005
Пользователь №: 44 478
Модель телефона: V500
Прошивка: V500->V620->E1 (R373_G_0E.30.45R)

Рейтинг: 14



Цитата(Osta @ 24.5.2008, 11:20) *

Код
CORE_APPS:1039522E JsaSuitesList_SwitchStorage
CORE_APPS:1039522E                 LDR     R2, =0x82551; Load from Memory
CORE_APPS:10395230                 PUSH    {R7,LR}; Push registers
CORE_APPS:10395232                 ADD     R2, #4; Rd = Op1 + Op2
CORE_APPS:10395234                 BL      JsaSuitesList_SimpleEventProcess; Branch with Link
CORE_APPS:10395238                 POP     {R7}        ; Pop registers
CORE_APPS:1039523A                 POP     {R3}        ; Pop registers
CORE_APPS:1039523C                 BX      R3    ; Branch to/from Thumb mode
CORE_APPS:1039523C; End of function JsaSuitesList_SwitchStorage

она проста : в процедуру JsaSuitesList_SimpleEventProcess передаётся значение R2
тоесть мы можем сделать эльф , который по зажатию к примеру зелёной кнопки вызова
передаст значение 82555 в процедуру JsaSuitesList_SimpleEventProcess и тем самым
переключит или вызовет диалог переключения устройств хранения java
Для этого нам нужно кроме написания эльфа добавить в elfloader.lib процедуру JsaSuitesList_SimpleEventProcess


Замечательно. Наверное еще было бы хорошо не просто использовать в своем эльфе найденную функцию, а еще добавить ее в SDK и для остальных. Судя по асм-коду надо будет добавить
Код

void saSuitesList_SimpleEventProcess(int event);

потому что я не вижу чтобы какой-то регистр возвращал что-нибудь(по идее надо вернуть bool-успешно или нет прошел вызов; наверное в телефоне система не имеет "привычки" делать подобное).
А может тип передаваемого параметра не int, а скажем DWORD? Как это определить?
И второе что не понятно лично мне: а если в функции saSuitesList_SimpleEventProcess используется некий регистр (допустим там ADD R5, R2 есть) который был задан ранее чем мы видим в выше приведенных участках кода? Быть может он тоже есть параметр для вызова функции?

Сообщение отредактировал Dex9999 - 26.5.2008, 4:42
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Мачо
сообщение 26.5.2008, 5:01


Ветеран
*****

Группа: Легенды MotoFan.Ru
Сообщений: 456
Регистрация: 26.7.2004
Из: Киров
Пользователь №: 8 569
Модель телефона: Е398 (умер), E6
Прошивка: Dream A Reality 2.0
Финалист Конкурса 2010

Рейтинг: 1410



А не проще просто послать этот эвент из эльфа. И прошивка сама запустит эту функцию.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.5.2008, 6:49


0xFFFF
******

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

Рейтинг: 1224



Цитата(Dex9999 @ Сегодня, 8:37)

потому что я не вижу чтобы какой-то регистр возвращал что-нибудь(по идее надо вернуть bool-успешно или нет прошел вызов; наверное в телефоне система не имеет "привычки" делать подобное).
*

Посмотри внимательно - JsaSuitesList_SwitchStorage может возвращать значение в R0. Смотрим код
JsaSuitesList_SimpleEventProcess, в конце:
Код
ADD     R0, R6, #0
POP     {R3-R7}
POP     {R3}
BX      R3
; End of function JsaSuitesList_SimpleEventProcess

Видишь, перед выходом в R0 кладётся какое-то значение из внутреннего регистра, оно и будет так же возвращаемым значением в JsaSuitesList_SwitchStorage.
Цитата(Dex9999 @ Сегодня, 8:37)

А может тип передаваемого параметра не int, а скажем DWORD? Как это определить?
*

Ты, наверно, имел в виду UINT64? Я не помню точно, но то ли оно передаётся через R0+R1, толи через указатель... В любом случае, в прошивке оно очень редко встречается.
Цитата(Dex9999 @ Сегодня, 8:37)

И второе что не понятно лично мне: а если в функции saSuitesList_SimpleEventProcess используется некий регистр (допустим там ADD R5, R2 есть) который был задан ранее чем мы видим в выше приведенных участках кода? Быть может он тоже есть параметр для вызова функции?
*

Смотрим начало кода saSuitesList_SimpleEventProcess:
Код
PUSH    {R3-R7,LR}
ADD     R7, R2, #0
ADD     R4, R1, #0
...
Первая команда сохраняет регистры R3-R7 включительно, и регистр возврата. Ну, а в конце функции регистры восстанвливаются. Тоесть, внутри функции мы можем спокойно использовать регистры R0-R7 на наше усмотрение.
Ты спросишь - почему R0-R2 тоже? Просто есть конвенция вызова Си-функций для ARM. Она предусматривает передачу первых 4 параметров функции через регистры R0-R3, а остальных - через стек. Так что R0-R3, а так же R12 (не помню, для чего оно предусмотрено, но вроде как используется в Veneers. Т.к. бОльшая часть кода откомпилирована в Thumb, R12 в таком коде не используется) могут быть без вреда для хода остальной программы "испорчены".

Сообщение отредактировал Andy51 - 26.5.2008, 19:04
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся писать эльфов вместе, Обсуждение процесса кодинга · Эльфы, их разработка и портирование · Forum
 

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

 



Текстовая версия Сейчас: 4.7.2025, 7:13

Форум живёт: