Урок 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)
---------------------------------------------
Отписываемся на счёт полезности урока, и стоит ли продолжать уроки?