Все для Sony Ericsson, патчи, эльфы, моддинг, прошивка
  
Логин: Пароль: Запомнить: Привет гость! Зарегистрируйся или авторизируйся для получения доп. возможностей!
Разделы
PDA версия сайта
TrackIDentify
Новости
Статьи
Файлы
Патчи
Патчи 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 & supertrubka.org

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




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
Сообщений: 5826
Репутация: 5274
Откуда: 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.18 секунд | 12 Запросов | HTML: 62.07 КБ -