Урок 1. Создание простого эльфа Фонарик : Эльфостроение : Форум |
Страница 1 из 3: [1] 2 3 » |
arban: |
08.01.09, 19:08 |
Урок 1. Создание простого эльфа Фонарик Скачиваем IAR Сливаем SVN Советую делать это Tortoise SVN, или мучаться по файлику всё лить Часть 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 ] |
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 |