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

Страница 1 из 3: [1] 2 3 »

 arban:
08.01.09, 19:08
 Урок 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

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

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

 Zormax:
08.01.09, 20:24
 pahon, урезаный можно

 demon_17:
08.01.09, 20:41
 Вот ссылка на рабочий 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 ]

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

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

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

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

Код: 
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:
09.01.09, 06:51
 У меня возник вопрос. С Си я не очень разбираюсь (точнее не разу не пробывал), а вот язык Турбо Паскаля знаю хорошо. Так сам вопрос, язык Си сильно отличается от Паскаля ?

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



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




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

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

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

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

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

 SkiF-1:
09.01.09, 15:27
 Я понимаю что флуд, но всё же.

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

[ Редактировано SkiF-1 в 9.1.09 22:28 ]
Страница 1 из 3: [1] 2 3 »

URL этой темы:
https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=3621

© 2005-2018 supertrubka.org