Все для Sony Ericsson, патчи, эльфы, моддинг, прошивка
Логин: Пароль: Запомнить: Привет гость! Зарегистрируйся или авторизируйся для получения доп. возможностей!
Разделы
PDA версия сайта
Новости
Статьи
Файлы
Патчи
Патчи A2
Патчи db2020
Эльфы
Исходники эльфов
Wiki
Форум
Обратная связь
Развернуть/Свернуть
 
Развернуть/Свернуть

Урок 1. Создание простого эльфа Фонарик : Эльфостроение : Эльфы : Форум : Для Sony Ericsson патчи эльфы моддинг прошивка
/  Список форумов
   /  Эльфы
      /  Эльфостроение
   /  Урок 1. Создание простого эльфа Фонарик
На печать 
Правила 
Страница 1 из 3: [1] 2 3 »

arban


Elfmaker


Регистрация: 2.3.08
Сообщений: 802
Репутация: 3111





 
  #1 [08.01.09, 19:08] Урок 1. Создание простого эльфа Фонарик   

 
Урок 1. Создание простого эльфа Фонарик

Скачиваем IAR
Сливаем SVN
Советую делать это Tortoise SVN, или мучаться по файлику всё лить :-D

Часть 1. Разбор эльфа

Заходим в папку HelloWorld и запускаем файл HelloWorld.eww, в появившемся окне слева сверху, где написано Debug, щёлкаем по стрелке вниз и выбираем пункт Release. Далее ниже ищем файл main.c и выбираем его. Откроется окно с кодом:

Код: 
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"

u16 timer; // ID таймера
int lamp=0; // текущая яркость лампы
BOOK * HWBook;

int TerminateElf(void * ,BOOK* book)
{
    FreeBook(book);
    return(1);
}

typedef struct
{
    BOOK * book;
}MSG;

int ShowAuthorInfo(void *mess ,BOOK* book)
{
    MSG * msg = (MSG*)mess;
    MessageBox(0x6fFFFFFF,STR("Hello Wordl!\n\nExample elf.."),0, 1 ,5000,msg->book);
    return(1);
}

const PAGE_MSG HW_PageEvents[]@ "DYN_PAGE" =
{
    ELF_TERMINATE_EVENT , TerminateElf,
    ELF_SHOW_INFO_EVENT**, ShowAuthorInfo,
    0,0
};

PAGE_DESC base_page ={"HW_BasePage",0,HW_PageEvents};

void elf_exit(void)

{
    kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

void onTimer (u16 * unk , void * data)
{
    {
        // перезапускаем таймер
        Timer_ReSet(&timer,500,onTimer,0);
        // переключаем лампу
        SetLampLevel(lamp^=0x10);
    }
}

void onCloseHWBook(BOOK * book)
{
    if (book)
    {
        Timer_Kill(&timer);
        StatusIndication_ShowNotes(0x6FFFFFFF);
        SetLampLevel(0);
        SUBPROC(elf_exit);
    }
}

BOOK * CreateHWBook()
{
    HWBook= new BOOK;
    CreateBook(HWBook,onCloseHWBook,&base_page,"Example",-1,0);
    return(HWBook);
}

int main (void)
{
    CreateHWBook();
    // выводим текст в "заметки" на StandBy
    StatusIndication_ShowNotes(STR("Hello World!"));
    // запускаем таймер на 0.5 сек.
    timer=Timer_Set(500,onTimer,0);
    return(0);
}


Функция main (void) самая главная и в неё обычно вставляют обработчики клавиш и событий, функции которые необходимо запустить при старте эльфа и другие.

Следующая часть кода это реализация поддержки эльфа BookManager:
Код: 
BOOK * HWBook;

int TerminateElf(void * ,BOOK* book)
{
    FreeBook(book);
    return(1);
}

typedef struct
{
    BOOK * book;
}MSG;

int ShowAuthorInfo(void *mess ,BOOK* book)
{
    MSG * msg = (MSG*)mess;
    MessageBox(0x6fFFFFFF,STR("Hello Wordl!\n\nExample elf.."),0, 1 ,5000,msg->book);
    return(1);
}

const PAGE_MSG HW_PageEvents[]@ "DYN_PAGE" =
{
    ELF_TERMINATE_EVENT , TerminateElf,
    ELF_SHOW_INFO_EVENT**, ShowAuthorInfo,
    0,0
};

PAGE_DESC base_page ={"HW_BasePage",0,HW_PageEvents};

void elf_exit(void)
{
    kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

void onTimer (u16 * unk , void * data)
{
    {
        // перезапускаем таймер
        Timer_ReSet(&timer,500,onTimer,0);
        // переключаем лампу
        SetLampLevel(lamp^=0x10);
    }
}

void onCloseHWBook(BOOK * book)
{
    if (book)
    {
        Timer_Kill(&timer);
        StatusIndication_ShowNotes(0x6FFFFFFF);
        SetLampLevel(0);
        SUBPROC(elf_exit);
    }
}

BOOK * CreateHWBook()
{
    HWBook= new BOOK;
    CreateBook(HWBook,onCloseHWBook,&base_page,"Example",-1,0);
    return(HWBook);
}


И наконец начальная часть кода это определение переменных и констант (но это можно сделать и не только в начале кода) и инклудов (файлов со списком функций):

Код:
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"

u16 timer; // ID таймера
int lamp=0; // текущая яркость лампы
BOOK * HWBook;


Часть 2. Создание и компилирование эльфа.

Удаляем весь код. И печатаем там следующие строки:

Код: 
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"

void elf_exit(void)
{
    kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

int main (void)
{
    return(0);
}


где elf_exit(void) функция отключения эльфа и во всех эльфах она также должна быть.

После
Код:
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"


Печатаем следующее:

Код:
int lamp_level=0;
int lamp_status=0;


Это создание переменных lamp_level и lamp_status которые отвечают за яркость (максимальная яркость 100) фонарика и его статус (1-включен, 0-выключен).

После функции отключения эльфа печатаем:

Код: 

//создание функции обрабатывающей нажатие клавиш
int NewKey(int key, int r1 , int mode) 
{
    if (key==KEY_CAMERA_FOCUS) //нажата ли клавиша camera_focus?
    {
        if (mode==KBD_SHORT_PRESS) //короткое ли нажатие?
        {
 // можно также прописать if (!lamp_status); проверяем выключен ли фонарик
            if (lamp_status==0)
            {
 // создаём цикл for для плавного включения фонарика
                for (lamp_level=0; lamp_level<=90; lamp_level+=10)
                {
 //после каждой проверки задаём уровень яркости функцией SetLampLevel
                    SetLampLevel(lamp_level);
                    delay(25); 
//задержка для того чтобы
//цикл не проходил сразу и фонарик включился плавно
                }
                lamp_status=1; // после выхода из цикла устанавливаем 
//что фонарик включен
            }
        }
        return(-1); // после проверки нажатой 
//клавиши делаем 
//"заглушку" чтобы клавиша 
//не реагировала на стандартные 
//функции, осторожно ставьте "заглушку" 
//особенно на джойстик
    }
    return(0); //указываем что функция завершилась успешно
}


И так эта часть кода плавно включает фонарик но если вы захотите скомпилировать эльф то при нажатие на клавишу фокус камеры ничего не произодёт. А теперь в функцию main добавим наш обработчик:

ModifyKeyHook(NewKey,1);

Теперь сделаем выключения эльфа на кнопку выключение, добавляем после обработки нажатия кнопки camera_focus:

Код: 
if (key==KEY_POWER) //нажата ли клавиша power?
{
    if (mode==KBD_SHORT_PRESS) //короткое ли нажатие?
    {
//убираем обработчик, иначе 
//при выключение эльфа кнопки ещё будут обрабытываться.
        ModifyKeyHook(NewKey,0); 
 //устанавливаем нулевую яркость для 
//фонарика чтобы после выключения эльфа фонарь не горел
        SetLampLevel(0);
 //указываем что фонарик выключен
        lamp_status=0;
 //выполняем процесс завершения эльфа
        SUBPROC(elf_exit);
 //указываем что всё завершилось успешно
        return(0);
    }
    return(-1);
}


Вот какой код должен получиться:

Код: 
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"

int lamp_level=0;
int lamp_status=0;

void elf_exit(void)
{
    kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

int NewKey(int key, int r1 , int mode)
{
    if (key==KEY_CAMERA_FOCUS)
    {
        if (mode==KBD_SHORT_PRESS)
        {
            if (lamp_status==0)
            {
                for (lamp_level=0; lamp_level<=90; lamp_level+=10)
                {
                    SetLampLevel(lamp_level);
                    delay(25);
                }
                lamp_status=1;
            }
        }
        return(-1);
    }
    if (key==KEY_POWER)
    {
        if (mode==KBD_SHORT_PRESS)
        {
            ModifyKeyHook(NewKey,0);
            SetLampLevel(0);
            lamp_status=0;
            SUBPROC(elf_exit);
            return(0);
        }
        return(-1);
    }
    return(0);
}

int main (void)
{
    ModifyKeyHook(NewKey,1);
    return(0);
}


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

Примечание: в кусках кода после // идут комментарии и их не обязательно вписывать в код эльфа. Чтобы скомпилировать эльф необходимо нажать на клавишу F7. Также необходимо хотябы немного почитать учебники по языку Си.

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

Автор: Arban
Специально для se-team.com & mobilefree.justdanpo.ru

Урок делал давно ;-) но может кому пригодится.




LG Optimus
My SVN | Elflib Wiki | Elf SVN
Спасибо сказали: demon_17, Zormax, pahon, zapret007, PUZ, SkiF-1, Va_st, scorpion1616, Fire, vodoo999, Alex_E, MC_Leader

=paha=


Пользователь


Регистрация: 2.8.08
Сообщений: 127
Репутация: -24
Откуда: Минск




 
  #2 [08.01.09, 20:22] Re: Урок 1. Создание простого эльфа Фонарик   

 
IAR Embedded Workbench 4.0 Evaluation-не качается.
а обязательно полный или можно урезанный.
если можно то дай хотябы ссылку.




SE w595 r3ef001

Zormax


Admin


Регистрация: 12.12.05
Сообщений: 5820
Репутация: 5289
Откуда: Nizhniy Novgorod




 
  #3 [08.01.09, 20:24] Re: Урок 1. Создание простого эльфа Фонарик   

 
pahon, урезаный можно




TOOKY T83 (1.3.1-L2), MK808B

demon_17


Patcher


Регистрация: 16.11.07
Сообщений: 495
Репутация: 520
Откуда: Питер




 
  #4 [08.01.09, 20:41] Re: Урок 1. Создание простого эльфа Фонарик   

 
Вот ссылка на рабочий Iar 4.42 (10 mb)
pahon, чтобы это сделать зайди
Код:
Embedded Workbench 4.0 Evaluation-common-bin
там запусти IarIdePM.exe, в программе выбери "Open existing workspace" и там уже запускай HelloWorld.eww

[ Редактировано demon_17 в 8.1.09 20:41 ]




C901 R1GA028 & Samsung i8910 Omnia HD
Спасибо сказали: pahon, SkiF-1

Omega83


Пользователь


Регистрация: 7.12.08
Сообщений: 104
Репутация: 20
Откуда: Киев, Украина




 
  #5 [09.01.09, 02:35] Re: Урок 1. Создание простого эльфа Фонарик   

 
что надо знать чтобы учиться писать эльфы? язык программирования, etc?




Motorola T2288
Siemens C45
Siemens MC60
BenQ-Siemens EL71
Sony Еricsson K810i R8BA024

CyberMaster


Patchmaster


Регистрация: 24.10.07
Сообщений: 101
Репутация: 243
Откуда: Днепропетровск




 
  #6 [09.01.09, 03:11] Re: Урок 1. Создание простого эльфа Фонарик   

 
Omega83 пишет:
что надо знать чтобы учиться писать эльфы? язык программирования, etc?

Язык программирования Си. В остальном разберешся





nik_osar


Вникающий


Регистрация: 16.12.07
Сообщений: 28
Репутация: 2
Откуда: Одесса




 
  #7 [09.01.09, 04:27] Re: Урок 1. Создание простого эльфа Фонарик   

 
Все инклуды подключил, но всё-таки есть ошибка

Код: 
Building configuration: main - Debug 
Updating build tree... 
 
6  file(s) deleted. 
Updating build tree... 
func.asm 
Error[109]: Expression is too complex C:\Program Files\IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\examples\include\func.asm 52 
Error[109]: Expression is too complex C:\Program Files\IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\examples\include\func.asm 57 
Error while running Assembler 
main.c 
 
Total number of errors: 2 
Total number of warnings: 0 


Выбивает в следующих строках:
- DC32 (SFE(DYN_CONST)-SFB(DYN_CONST))>>2
- DC32 (SFE(DYN_PAGE)-SFB(DYN_PAGE))>>3



SkiF-1


Patcher


Регистрация: 8.9.08
Сообщений: 37
Репутация: 50
Откуда: Между небом и землёй




 
  #8 [09.01.09, 06:51] Re: Урок 1. Создание простого эльфа Фонарик   

 
У меня возник вопрос. С Си я не очень разбираюсь (точнее не разу не пробывал), а вот язык Турбо Паскаля знаю хорошо. Так сам вопрос, язык Си сильно отличается от Паскаля ?

arban, забыл указать, что нужно ещё скачать с СВН папку С++



И ещё, у меня нет фонарика на теле (к810), проверьте пожалуйста кто-нибудь этот эльфик (ну кому не сложно). Попробывал создать плавное выключение фонарика (только кнопку выключения не менял, осталась как в первом посте)




[ Редактировано SkiF-1 в 9.1.09 22:04 ]



Прикрепленный к сообщению файл:

main.zip main.zip (1.09 kb; 27 hits) Скачать файл


Чайник, но верно расту до самовара :-)

nik_osar


Вникающий


Регистрация: 16.12.07
Сообщений: 28
Репутация: 2
Откуда: Одесса




 
  #9 [09.01.09, 15:22] Re: Урок 1. Создание простого эльфа Фонарик   

 
SkiF-1 пишет:
...язык Си сильно отличается от Паскаля ?

Сильно))) По крайней мере все библы написаны под Си



SkiF-1


Patcher


Регистрация: 8.9.08
Сообщений: 37
Репутация: 50
Откуда: Между небом и землёй




 
  #10 [09.01.09, 15:27] Re: Урок 1. Создание простого эльфа Фонарик   

 
Я понимаю что флуд, но всё же.

nikolashka, библы - это ты имеешь ввиду dll или либа эфпака ? Хотя, наверно первое.

[ Редактировано SkiF-1 в 9.1.09 22:28 ]




Чайник, но верно расту до самовара :-)
Страница 1 из 3: [1] 2 3 »



  • Поиск
  • Права
Вы не можете начинать темы.
Вы не можете редактировать свои сообщения.
Вы не можете создавать опросы.
Вы не можете вкладывать файлы в сообщения.
Вы не можете отвечать на сообщения.
Вы не можете удалять свои сообщения.
Вы не можете голосовать.

Главная Новости Статьи Файлы Патчи Форум Опросы PDA
- Генерация страницы: 0.03 секунд | 11 Запросов | HTML: 61.64 КБ -