Четверг, 26.06.2025, 19:04
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Популярные разделыВНИМАНИЕ!!!Новое важноеЛучшие пользователиРанг
Патчи DB2020                           //тем:(43)//ответов:(687!)
Эльфы                                       //тем:(141)//ответов:(343!)
Драйвера звука                      //тем:(7)//ответов:(117!)
Приложения                             //тем:(7)//ответов:(259!)
ФОРУМ БЫСТРОЙ ПОМОЩИ!   //тем:(36)//ответов:(300!)
Mega Pack's                             //тем:(173)//ответов:(178!)

rylev                  
MAA71              
Kanada7p7       
Olegarh24       
-LiNuX-             
u729                 







  • Страница 1 из 1
  • 1
Урок по созданию простого эльфа
Arban Дата: Вторник, 01.07.2008, 21:51 | Сообщение # 1


Новичок
Сообщений: 8
Новичок
 
Репутация:8 
Модель Телефона:K750 [] 
Статус: :-(
Статус ICQ:428667455 *
Урок 1. Создание простого эльфа Фонарик

Скачиваем IAR Embedded Workbench 4.0 Evaluation
Скачиваем папку Include с SVN и ложим в папку с IAR'ом
Скачиваем папку HelloWorld с SVN и ложим в папку с IAR'ом

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

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

Code

#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:

Code

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);
}

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

Code
#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==0) // можно также прописать if (!lamp_status); проверяем выключен ли фонарик
{
for (lamp_level=0; lamp_level<=90; lamp_level+=10) // создаём цикл for для плавного включения фонарика
{
SetLampLevel(lamp_level); //после каждой проверки задаём уровень яркости функцией SetLampLevel
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;

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);
}

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

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

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

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

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

Автор: Arban
Специально для se-team и seclub.my1.ru

Добавлено (01.07.2008, 21:51)
---------------------------------------------
Отписываемся на счёт полезности урока, и стоит ли продолжать уроки?

Сообщение отредактировал Arban - Вторник, 01.07.2008, 21:51
 
Sotik Дата: Вторник, 01.07.2008, 22:20 | Сообщение # 2


>>ВРЕДНЫЙ<<
Сообщений: 736
Знаток
 За хорошию репутацию За 150 постов За 250 Постов За 500 Постов
Репутация:67 
Модель Телефона:K550i->W610i [] 
Статус: :-(
Статус ICQ:264650355 *
Arban, хороший, доступно написаный урок! я думаю продолжать стоит - может ты этим и займешься? wink



не забывайте о БЭКАПАХ при любых издевательствах над своим телефоном!!!

 
Arban Дата: Вторник, 01.07.2008, 22:22 | Сообщение # 3


Новичок
Сообщений: 8
Новичок
 
Репутация:8 
Модель Телефона:K750 [] 
Статус: :-(
Статус ICQ:428667455 *
Sotik11, я этим и займусь wink
 
Sotik Дата: Вторник, 01.07.2008, 22:30 | Сообщение # 4


>>ВРЕДНЫЙ<<
Сообщений: 736
Знаток
 За хорошию репутацию За 150 постов За 250 Постов За 500 Постов
Репутация:67 
Модель Телефона:K550i->W610i [] 
Статус: :-(
Статус ICQ:264650355 *
Arban, отлично, ждем новых уроков!



не забывайте о БЭКАПАХ при любых издевательствах над своим телефоном!!!

 
Sanek Дата: Среда, 02.07.2008, 11:30 | Сообщение # 5


Admin
Сообщений: 1878
Новичок
 За хорошию репутацию За 150 постов За 250 Постов За 500 Постов За 1000 Постов
Репутация:110 
Модель Телефона:K790i [] 
Статус: :-(
Статус ICQ:366980736 *
Классный урок! smile Жаль у меня фонарика нету sad

Важно!
Набор команды на сайт
 
Arban Дата: Четверг, 03.07.2008, 11:16 | Сообщение # 6


Новичок
Сообщений: 8
Новичок
 
Репутация:8 
Модель Телефона:K750 [] 
Статус: :-(
Статус ICQ:428667455 *
Sanek, попробуй с чем-нибудь другим biggrin
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright seclub.my1.ru © 2025 Хостинг от uCoz