nvoid
Expert
Регистрация: 29.11.07 Сообщений: 1375 Репутация: 380
#1921 [28.12.07, 11:46] Создание Эльфов
Предлагаю создать тему, посвященную созданию Эльфов. Думаю, удобнее будет собрать ссылки, посвященные Эльфам, в одной теме, а не оффтопить в разных...
Список функций находится в файле *.lib.vkp
Ссылки: ∙
Описание некоторых функций в Wiki ∙
Созадние ELF под Siemens ∙
Создание ELF под Siemens (здесь больше) ∙
Урезанная IAR ∙
Патч для IAR ∙
Учебник по СИ ∙
Основы программирования эльфов SVN :
∙
TortoiseSVN (программа для работы с SVN) ∙
svn://svn.boba.su/ARM -
Зеркало (http mirror) Siemens SVN
∙
svn://svn.boba.su/SE -
Зеркало (http mirror) Sony Ericsson SVN
для доступа на svn используйте guest/guest
Другие темы :
Вопросы о СИ (языке) Исходники Эльфов Компиляция ЭП Уроки :
Создание простого эльфа Фонарик от arban.
Создание GUI от arban:
часть 1 ,
часть 2 .
---------------------------------------------
elfcheck - простая прога, которая проверяет, используются ли в эльфах (включая эльфлоадер) функции, которых нет в либе.
simple tool which checks whether there are functions used in elfs (including elfloader) that are not included in library.
Q: How use elfcheck?
Q: Как использовать?
R: Look this page
here saveevents.elf - сохранение евентов (EVENT)
(c)
den_po ---------------------------------------------
Шаблоны эльфов для IAR Некоторые полезные для разработчиков шаблоны эльфов.
На данный момент имеются:
1) Пустой эльф
2) Пустой эльф со своей книгой
3) Эльф-рисовальщик на главном экране
4) Эльф для RegFile (по сути - пустой эльф, но с дополнительными входными параметрами)
5) Эльф с графическим интерфейсом - списком
6) Эльф-патч, который можно конвертировать в *.vkp при помощи elf2vkp
Установка: скопируйте содержимое архива в IAR\ARM\config\template\
Использование: Project->New project->Elf SDK->Нужный шаблон
(C)
UltraShot ---------------------------------------------
Раздел в Wiki, посвященный созданию эльфов
Прикрепленный к сообщению файл: elfcheck.rar (
32.56 kb; 1014 hits)
Скачать файл saveevents.elf (
1.13 kb; 439 hits)
Скачать файл iar_templates.zip (
114.52 kb; 720 hits)
Скачать файл
Motorola EM30
Спасибо сказали: pahon, Zormax, scorpion1616, Evil-Racer, Alex_E, avens, DuMOHsmol, TahaSpawn, vodoo999, Alex1992, ELECTRO-NIC, JohnNorth, HotRabbit, ENSAIER, Olegat0r, scorpion16_Richi, Oganyan-Arthur, Melodic_Death, toha257, farid, mugen, VovanLS, blacklizard, ZuZiK aka pavelsh, Metaler, Atreyu, Nook, Vov4ик, KnoonK, a6b6
E1kolyan
Developer
Регистрация: 8.7.07 Сообщений: 663 Репутация: 11934 Откуда: Челябинск
#1922 [27.11.11, 01:25] Re: Создание Эльфов
IDOL1234 , куча исходников есть на форуме...
Sony Ericsson C905 SW-R1FA035 Sony Ericsson K810 SW-R8BF003 Sony Xperia™ S ZTE Blade X3
Спасибо сказали: farid
IDOL1234
Пользователь
Регистрация: 29.3.11 Сообщений: 113 Репутация: 1 Откуда: СПб
#1923 [27.11.11, 05:07] Re: Создание Эльфов
Metaler , мне нужно генерировать нажатие по таймеру, а не подменять нажатые клавиши. В том-то всё и дело..E1kolyan , возможно, я не там искал. Пересмотрел исходники с СВН, прошёлся по ним поиском, но функции, которые мне советовали чуть выше (не кейхук, ещё выше), используются в них всего несколько раз, причём в совершенно непонятном для меня контексте (какие-то манипуляции с графикой, кажется). Поискал ключевые слова по форуму - тоже не нашёл.. [ Редактировано IDOL1234 в 27.11.11 05:08 ] [ Редактировано IDOL1234 в 27.11.11 05:10 ]
пшшшшшшшшшшшшшш!
SummerWood
Пользователь
Регистрация: 26.8.10 Сообщений: 101 Репутация: 161
#1924 [28.11.11, 14:38] Re: Создание Эльфов
есть ли аналог javax.sound.sampled.* в библ-ке функций?
Спасибо сказали: SERGK393
IDOL1234
Пользователь
Регистрация: 29.3.11 Сообщений: 113 Репутация: 1 Откуда: СПб
#1925 [30.11.11, 00:41] Re: Создание Эльфов
Если я не ошибаюсь, эльф может только воспроизвести звук, поддерживаемый телефоном, и записать его в файл при помощи встроенного диктофона. Никаких "низкоуровневых" операций над звуком на данный момент не осуществляется (за исключением ручного редактирования файлов, но этим вроде бы никто не занимается).
Добавлено 2.12.11 01:08 Объясните пожалуйста содержимое файла dyn_syntax.cfg: что такое, например, ACTION_INFO? Почему-то ACTION_INFO_TAG ни разу не отловился...
Какие константы соответствуют какому событию? (ну, кроме кодов и событий клавиш)
Какие ивенты можно сгенерировать, не используя pagehook?
----
Как можно передавать информацию на внешнее устройство? Понятно, что оно может имитировать подключение/отключение гарнитуры через определённые промежутки времени, а телефон может отвечать воспроизведением коротенького звука через гарнитуру, но это же ЧУДОВИЩНО! Есть ли другие способы? На вики есть куча функций, связанных с работой аксессуаров, но все они без описаний..
----
Традиционный вопрос по OMAC
Этот эльф использует n_macros.h, который устарел. В нём используется функция text2id. Её нужно (?) заменить на textid_create. Но как быть с textid_delete?
Собственно, файл
Код:
#ifndef N_MACROS #define N_MACROS//////////////////////////////////////////////////////////////////////////////// // n_macros.h // Various macros collected in one file by nkls // Needed by most of my sources // Use it and share it any way you want. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // STRID / IMGID #define STRID_NULL 0x6FFFFFFF // I've got used to these, but they are the #define IMGID_NULL 0xFFFF // same as NOIMAGE and EMPTY_SID #define IMGID wchar_t//////////////////////////////////////////////////////////////////////////////// // MAX / MIN / ABS #ifndef MIN #define MIN(_a_, _b_) (((_a_)<(_b_))?(_a_):(_b_)) #endif #ifndef MAX #define MAX(_a_, _b_) (((_a_)>(_b_))?(_a_):(_b_)) #endif #ifndef ABS #define ABS(_a_) ((_a_)>=0?(_a_):-(_a_)) #endif//////////////////////////////////////////////////////////////////////////////// // STRID macros // 16-bit wchar_t strings #define WSTR2ID(_wstr_) Str2ID(_wstr_, 0, SID_ANY_LEN) #define CWSTR2ID(_wstr_) Str2ID(_wstr_, 0, MAXELEMS(_wstr_)-1) #define WSTRN2ID(_wstr_, _LEN_) Str2ID(_wstr_, 0, _LEN_)// 8-bit char strings #define STR2ID(_str_) Str2ID(_str_, 6, SID_ANY_LEN) #define CSTR2ID(_str_) Str2ID(_str_, 6, sizeof(_str_)-1) #define STRN2ID(_str_, _LEN_) Str2ID(_str_, 6, _LEN_)// STRID merge #define MERGEID(_IDArray_, _LEN_) Str2ID(_IDArray_, 5, _LEN_)// Integer to STRID #define INT2ID int2strID// String element to ID #define STRELEM2ID(_elem_) (0x78000000+(_elem_))// PRNTFSTRID #define PRNTFSTRID(_buf_, ...) STRN2ID(_buf_, sprintf(_buf_, __VA_ARGS__))//////////////////////////////////////////////////////////////////////////////// // MessageBox() macros // STRID Message box (with timeout and parent book) macro #define STRIDMSGTB(__STRID__, __TIME__, __BOOK__) MessageBox(STRID_NULL, __STRID__, IMGID_NULL, 1, __TIME__, __BOOK__)// String Message box (with timeout and parent book) macros #define WSTRMSGTB(__LSTR__, __TIME__, __BOOK__) STRIDMSGTB(WSTR2ID(__LSTR__), __TIME__, __BOOK__) #define STRMSGTB(__STR__, __TIME__, __BOOK__) STRIDMSGTB(STR2ID(__STR__), __TIME__, __BOOK__) #define CWSTRMSGTB(__LSTR__, __TIME__, __BOOK__) STRIDMSGTB(CWSTR2ID(__LSTR__), __TIME__, __BOOK__) #define CSTRMSGTB(__STR__, __TIME__, __BOOK__) STRIDMSGTB(CSTR2ID(__STR__), __TIME__, __BOOK__)// STRID Message box (with parent book and no timeout) macro #define STRIDMSGB(__STRID__, __BOOK__) STRIDMSGTB(__STRID__, 0, __BOOK__)// String Message box (with parent book and no timeout) macros #define WSTRMSGB(__LSTR__, __BOOK__) STRIDMSGB(WSTR2ID(__LSTR__), __BOOK__) #define STRMSGB(__STR__, __BOOK__) STRIDMSGB(STR2ID(__STR__), __BOOK__) #define CWSTRMSGB(__LSTR__, __BOOK__) STRIDMSGB(CWSTR2ID(__LSTR__), __BOOK__) #define CSTRMSGB(__STR__, __BOOK__) STRIDMSGB(CSTR2ID(__STR__), __BOOK__)// STRID Message box (with no parent book and timeout) macro #define STRIDMSGT(__STRID__, __TIME__) STRIDMSGBT(__STRID__, __TIME__, NULL)// String Message box (with no parent book and timeout) macros #define WSTRMSGT(__LSTR__, __TIME__) STRIDMSGT(WSTR2ID(__LSTR__), __TIME__) #define STRMSGT(__STR__, __TIME__) STRIDMSGT(STR2ID(__STR__), __TIME__) #define CWSTRMSGT(__LSTR__, __TIME__) STRIDMSGT(CWSTR2ID(__LSTR__), __TIME__) #define CSTRMSGT(__STR__, __TIME__) STRIDMSGT(CSTR2ID(__STR__), __TIME__)// STRID Message box macro #define STRIDMSG(__STRID__) STRIDMSGB(__STRID__, NULL)// String Message box macros #define WSTRMSG(__LSTR__) STRIDMSG(WSTR2ID(__LSTR__)) #define STRMSG(__STR__) STRIDMSG(STR2ID(__STR__)) #define CWSTRMSG(__LSTR__) STRIDMSG(CWSTR2ID(__LSTR__)) #define CSTRMSG(__STR__) STRIDMSG(CSTR2ID(__STR__))// PRINTFMSG #define PRINTFMSG(_buf_, ...) STRIDMSG(STRN2ID(_buf_, sprintf(_buf_, __VA_ARGS__)))//////////////////////////////////////////////////////////////////////////////// // DEBUG // DEBUG Condition Message #ifndef NDEBUG #define DEBCOND(cond) {if(cond){debug_printf("\nDEBCOND: %s\n", #cond);CSTRMSG(#cond);}} #define DEBCONDS(cond,_str_) {if(cond){debug_printf("\nDEBCOND: %s\n", _str_);CSTRMSG(_str_);}} #else #define DEBCOND(...) #define DEBCONDS(...) #endif//////////////////////////////////////////////////////////////////////////////// // Debug msg and printf. note: no printf message longer than 300 chars! #ifndef NDEBUG #define DEBUG_MSG(_str_) STRMSG(_str_) #define DEBUG_PRINTF(...) debug_printf(__VA_ARGS__) #define DEBUG_PRINTF_MSG(...) {char s[300];STRN2ID(s, MAX(sprintf(s, __VA_ARGS__), 299));} #else #define DEBUG_MSG(_str_) #define DEBUG_PRINTF(...) #define DEBUG_PRINTF_MSG(...) #endif #endif
[ Редактировано IDOL1234 в 2.12.11 10:38 ]
пшшшшшшшшшшшшшш!
SERGK393
Elfmaker
Регистрация: 25.1.09 Сообщений: 330 Репутация: 1897 Откуда: Воронеж, Россия
#1926 [02.12.11, 19:59] Re: Создание Эльфов
IDOL1234 , вообще-то textid_delete не существует, есть TextID_Destroy. И некоторые переопределения уже есть в инклудах, такие как TEXTID, IMAGEID, EMPTY_TEXTID
K310I - R4 HA 014 WMR 795407939817 WMZ 160582394547
Спасибо сказали: MrGraL
IDOL1234
Пользователь
Регистрация: 29.3.11 Сообщений: 113 Репутация: 1 Откуда: СПб
#1927 [02.12.11, 22:17] Re: Создание Эльфов
вообще-то textid_delete не существует, есть TextID_Destroy
Ошибся, по памяти писал.
некоторые переопределения уже есть в инклудах, такие как TEXTID, IMAGEID, EMPTY_TEXTID
Хм... Посмотрим..
Помогите пожалуйста разобраться с механизмом реализации нажатия в OMAC'e. Я довёл его до компилируемого состояния (отключил месседжбоксы и отладку, исправил таймеры и хуки), но я не понимаю, для чего именно нужен хук (он же события отлавливает О_о), описаний некоторый инструкций в рунете я не нашёл.
Код:
Код:
//////////////////////////////////////////////////////////////////////////////// // // Opera Mini Accelerometer Control (OMAC) - main.c // (c) nkls 2010-2011 // // // // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Includes #include <Lib_Clara.h> #include <Dll.h>//#include <n_macros.h> ------------------------------------------------------------------------------ #include "accelerometer_interface.h" #include "..\Dlls\Accelerometer\export\AccelerometerDll.h"//////////////////////////////////////////////////////////////////////////////// // Definitions #define ELF_NAME "OperaMini AccelControl" #define ELF_VERSION "v1.1" "Я" #define ELF_AUTHOR "nkls" #define STR_ABOUT ELF_NAME " " ELF_VERSION "\n" \ "© " ELF_AUTHOR "\n" \ "\n" \ "build " __DATE__ " " __TIME__//////////////////////////////////////////////////////////////////////////////// // Typedefs typedef struct { BOOK * book; DISP_OBJ_ONCLOSE_METHOD defOnClose; DISP_OBJ_ONKEY_METHOD defOnKey; }OM_HOOK_DATA; typedef enum { SCROLL_NO_SCROLL=0, SCROLL_UP, SCROLL_DOWN, SCROLL_LEFT, SCROLL_RIGHT, } SCROLL_MODE; typedef struct { BOOK book; OM_HOOK_DATA * hook; ACCELEROMETER_DLL_DATA * acc_dll; u16 catch_timer; u16 acc_check_timer; u16 check_timer_retries; SCROLL_MODE scroll; int tilt; int catch_retry_count; bool isHorizontal; bool isTiltScrollActivated; bool usingz; }OMAC_BOOK;//////////////////////////////////////////////////////////////////////////////// // Method declarations static void onCloseBook(BOOK * book); void freeOMBookHook(OM_HOOK_DATA * omdata); void onAccCheckTimer(u16, LPARAM data); int onMainGotFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16); int onMainLostFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16);//////////////////////////////////////////////////////////////////////////////// // elf exit void elf_exit(void){kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());}//////////////////////////////////////////////////////////////////////////////// // book methods int isCUIDisplayableBook(BOOK * bk) { if(!strcmp(bk->xbook->name, "CUIDisplayableBook")) return 1; return 0; } int isOMBook(BOOK * bk) { if(!strcmp(bk->xbook->name, "CUIDisplayableBook")) { char s[32]; TextID_GetString(BookObj_GetSession(bk)->name, s, MAXELEMS(s)); if(!strcmp(s, "Opera Mini")) return 1; } return 0; } int isOurOMACBook(BOOK * bk) { if(bk->onClose == onCloseBook) return 1; return 0; } int isAnyOMACBook(BOOK * bk) { if(!strcmp(bk->xbook->name, ELF_NAME)) return 1; return 0; } int isBook(BOOK * b, int * p) { return ((int*)b == p) ? 1 : 0; } bool BookExist(BOOK * book) { return (FindBookEx(isBook, (int*)book) != NULL); } inline GUI * BOOK_GetTopGUI(BOOK * b) { return (GUI*)List_Get(b->xguilist->guilist, 0); }//////////////////////////////////////////////////////////////////////////////// // Hook related methods and hooks void myOMOnKey(DISP_OBJ * p, int key, int i2, int i3, int mode) { //DEBUG_PRINTF("\nmyOMOnKey(%X, %d, %d, %d, %d)\n", p, key, i2, i3, mode); ------------------------------------------------------ OMAC_BOOK * bk = (OMAC_BOOK*)FindBook(isOurOMACBook); if(bk) { if(key == KEY_DIGITAL_0 && mode == KBD_SHORT_PRESS) { if(bk->isTiltScrollActivated ^= 1) { int x, y, z; if(ACCELEROMETER_GetCoords(bk->acc_dll, &x, &y, &z, 1) >= 0) { int useaxis = (bk->isHorizontal)?x:y; if(z < useaxis) { bk->usingz = 1; bk->tilt = z; } else { bk->usingz = 0; bk->tilt = useaxis; } } else bk->isTiltScrollActivated = 0; } else { int send_key = -1; if(bk->scroll == SCROLL_DOWN)send_key = KEY_DOWN; else if(bk->scroll == SCROLL_UP)send_key = KEY_UP; else if(bk->scroll == SCROLL_LEFT)send_key = KEY_LEFT; else if(bk->scroll == SCROLL_RIGHT)send_key = KEY_RIGHT; if(send_key != -1) { bk->hook->defOnKey(p, send_key, i2, i3, KBD_LONG_RELEASE); } } } else bk->hook->defOnKey(p, key, i2, i3, mode); } } void myOMOnClose(DISP_OBJ * p) { //DEBUG_PRINTF("\nmyOMOnClose(%X)\n", p); ------------------------------------------------------ OMAC_BOOK * bk = (OMAC_BOOK*)FindBook(isOurOMACBook); if(bk) { bk->hook->defOnClose(p); //DEBUG_PRINTF("\nmyOMOnClose: releasing hook structure...\n"); ------------------------------------------------------ freeOMBookHook(bk->hook); bk->hook = NULL; if(ACCELEROMETER_IsOpen(bk->acc_dll)) ACCELEROMETER_Close(bk->acc_dll); ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, PAGE_HOOK_REMOVE); ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, PAGE_HOOK_REMOVE); bk->isTiltScrollActivated = 0; if(bk->acc_check_timer) Timer_Kill(&bk->acc_check_timer); } //else CSTRMSG("Critical error! :,("); ------------------------------------------------------ // DEBUG_PRINTF("\nmyOMOnClose: DONE!\n"); ------------------------------------------------------ } OM_HOOK_DATA * getOMBookHook(BOOK * ombook) { OM_HOOK_DATA * omdata = (OM_HOOK_DATA*)malloc(sizeof(OM_HOOK_DATA)); memset(omdata, 0, sizeof(OM_HOOK_DATA)); //DEBUG_PRINTF("\ngetOMBookHook: creating hook structure (%X)\n", omdata); ------------------------------------------------------ omdata->book = ombook; GUI * gui = BOOK_GetTopGUI(ombook); if(gui) { DISP_OBJ * disp_obj = GUIObject_GetDispObject(gui); DISP_DESC * disp_desc = DispObject_GetDESC(disp_obj); omdata->defOnClose = DispObject_GetOnClose(disp_obj); if(omdata->defOnClose && omdata->defOnClose != myOMOnClose) DISP_DESC_SetOnClose(disp_desc, myOMOnClose); omdata->defOnKey = DispObject_GetOnKey(disp_obj); if(omdata->defOnKey && omdata->defOnKey != myOMOnKey) DISP_DESC_SetOnKey(disp_desc, myOMOnKey); // DEBUG_PRINTF("\ngetOMBookHook: filled in data structures OK\n", omdata); ------------------------------------------------------ return omdata; } //DEBUG_PRINTF("\ngetOMBookHook: failed!\n", omdata); ------------------------------------------------------ mfree(omdata); return NULL; } void freeOMBookHook(OM_HOOK_DATA * omdata) { //DEBUG_PRINTF("\nfreeOMBookHook: starting to reset hooks...\n", omdata); ------------------------------------------------------ if(BookExist(omdata->book)) { GUI * gui = BOOK_GetTopGUI(omdata->book); if(gui) { DISP_OBJ * disp_obj = GUIObject_GetDispObject(gui); DISP_DESC * disp_desc = DispObject_GetDESC(disp_obj); DISP_OBJ_ONCLOSE_METHOD doc = DispObject_GetOnClose(disp_obj); if(doc == myOMOnClose) DISP_DESC_SetOnClose(disp_desc, omdata->defOnClose); DISP_OBJ_ONKEY_METHOD dok = DispObject_GetOnKey(disp_obj); if(dok == myOMOnKey) DISP_DESC_SetOnKey(disp_desc, omdata->defOnKey); ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, PAGE_HOOK_REMOVE); ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, PAGE_HOOK_REMOVE); } } //DEBUG_PRINTF("\nfreeOMBookHook: done, releasing hook structure...\n", omdata); ------------------------------------------------------ mfree(omdata); }//////////////////////////////////////////////////////////////////////////////// // catch timer void onCatchTimer(u16, LPARAM _omacbook) { BOOK * b; OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook; if(omacbook) { if(b = FindBook(isOMBook)) { //DEBUG_PRINTF("\nonCatchTimer: found Opera Mini book! (%X)\n", b); ------------------------------------------------------ omacbook->hook = getOMBookHook(b); if(omacbook->hook == NULL) {// DEBUG_PRINTF("\nonCatchTimer: could not hook, retrying in one second...\n", b); ------------------------------------------------------ omacbook->catch_retry_count = 1; Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook); } else { //DEBUG_PRINTF("\nonCatchTimer: hooked ok, opening accelerometer handle...\n", b); ------------------------------------------------------ omacbook->catch_retry_count = 0; omacbook->catch_timer = 0; if(!ACCELEROMETER_IsOpen(omacbook->acc_dll)) ACCELEROMETER_Open(omacbook->acc_dll); Timer_ReSet(&omacbook->acc_check_timer, 1000, onAccCheckTimer, omacbook); ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1); ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, (LPARAM)omacbook, 1); } } else { omacbook->catch_retry_count--; //DEBUG_PRINTF("\nonCatchTimer: could not find Opera Mini book! (%d attempts left)\n", omacbook->catch_retry_count); ------------------------------------------------------ if(omacbook->catch_retry_count > 0) Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook); else omacbook->catch_timer = 0; } } }//////////////////////////////////////////////////////////////////////////////// // Event hooks int onSessionCreated(void * mess, BOOK * book) { OMAC_BOOK * omacbook = (OMAC_BOOK*)book;// DEBUG_PRINTF("\nELF: onSESSION_CREATED_EVENT\n"); ------------------------------------------------------ if(omacbook) { if(omacbook->hook) return 0; BOOK * b = FindBook(isCUIDisplayableBook); if(b) { char s[100]; TextID_GetString(BookObj_GetSession(b)->name, s, MAXELEMS(s)); //DEBUG_PRINTF("\nSESSION_CREATED_EVENT: %s\n", s); ------------------------------------------------------ if(!strcmp(s, "SemcOjexInvoker")) { omacbook->catch_retry_count = 5; Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook); } } } return 0; } int onMainGotFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16) { OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook; if(omacbook && omacbook->hook && !omacbook->acc_check_timer && omacbook->hook->book == book) { ACCELEROMETER_Open(omacbook->acc_dll); Timer_ReSet(&omacbook->acc_check_timer, 100, onAccCheckTimer, omacbook); //DEBUG_PRINTF("\nELF: resume OMAC\n"); ------------------------------------------------------ } return 0; } int onMainLostFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16) { OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook; if(omacbook && omacbook->hook && omacbook->acc_check_timer && omacbook->hook->book == book) { Timer_Kill(&omacbook->acc_check_timer); ACCELEROMETER_Close(omacbook->acc_dll); //DEBUG_PRINTF("\nELF: pause OMAC\n"); ---------------------------------------------- } return 0; }//////////////////////////////////////////////////////////////////////////////// // Various methods void ChangeMode(OMAC_BOOK * b) { if(b->hook) { DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey; GUI * gui = BOOK_GetTopGUI(b->hook->book); DISP_OBJ * dobj = GUIObject_GetDispObject(gui); send(dobj, KEY_STAR, 0, 1, KBD_SHORT_PRESS); send(dobj, KEY_STAR, 0, 1, KBD_SHORT_RELEASE); send(dobj, KEY_DIEZ, 0, 1, KBD_SHORT_PRESS); send(dobj, KEY_DIEZ, 0, 1, KBD_SHORT_RELEASE); } } void sendkey(OMAC_BOOK * b, int key, int mode) { //DEBUG_PRINTF("\nsendkey: %d\n", key); -------------------------------------- if(b->hook) { DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey; GUI * gui = BOOK_GetTopGUI(b->hook->book); DISP_OBJ * dobj = GUIObject_GetDispObject(gui); send(dobj, key, 0, 1, mode); } } void onAccCheckTimer(u16, LPARAM data) { OMAC_BOOK * b = (OMAC_BOOK*)data; int x, y, z; if(ACCELEROMETER_GetCoords(b->acc_dll, &x, &y, &z, 1) >= 0) { if(b->isTiltScrollActivated) { //change orientation? if(b->isHorizontal && x < 20 && y > 200 || !b->isHorizontal && y < 20 && x > 200) { b->isHorizontal = !b->isHorizontal; ChangeMode(b); // Delay, so that it won't change again within 1 second... Timer_ReSet(&b->acc_check_timer, 1000, onAccCheckTimer, data); } else { if(b->usingz) { if(b->isHorizontal)x = b->tilt - z; else y = b->tilt - z; } else { if(b->isHorizontal)x -= b->tilt; else y -= b->tilt; } x /= (18*2); // maybe not that optimal... y /= (18*2); if(x > 3) { if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_RIGHT) { sendkey(b, KEY_LEFT, KBD_SHORT_PRESS); b->scroll = SCROLL_LEFT; } } else if(x < -3) { // sensitivity difference as |a-b| != |b-a| ? if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_LEFT) { sendkey(b, KEY_RIGHT, KBD_SHORT_PRESS); b->scroll = SCROLL_RIGHT; } } else if(b->scroll == SCROLL_LEFT || b->scroll == SCROLL_RIGHT) { sendkey(b, (b->scroll==SCROLL_LEFT)?KEY_LEFT:KEY_RIGHT, KBD_LONG_RELEASE); b->scroll = SCROLL_NO_SCROLL; } if(y > 3) { if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_UP) { sendkey(b, KEY_DOWN, KBD_SHORT_PRESS); b->scroll = SCROLL_DOWN; } } else if(y < -3) { // sensitivity difference as |a-b| != |b-a| ? if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_DOWN) { sendkey(b, KEY_UP, KBD_SHORT_PRESS); b->scroll = SCROLL_UP; } } else if(b->scroll == SCROLL_DOWN || b->scroll == SCROLL_UP) { sendkey(b, (b->scroll==SCROLL_DOWN)?KEY_DOWN:KEY_UP, KBD_LONG_RELEASE); b->scroll = SCROLL_NO_SCROLL; } } } else { // (!b->isTiltScrollActivated) if(b->isHorizontal && y > 800 || !b->isHorizontal && x > 800) { b->isHorizontal = !b->isHorizontal; ChangeMode(b); // Delay, so that it won't change again within 1 second... Timer_ReSet(&b->acc_check_timer, 1000, onAccCheckTimer, data); return; } } } //else DEBUG_PRINTF("\nonAccCheckTimer: Could not get accelerometer data!\n"); --------------------------------------------- Timer_ReSet(&b->acc_check_timer, 200, onAccCheckTimer, data); }//////////////////////////////////////////////////////////////////////////////// // Page event methods static int onTerminate(void *, BOOK * book) { FreeBook(book); return 1; } static int onAuthorInfo(void * mess, BOOK * book) { //CSTRMSGB(STR_ABOUT, *(BOOK**)mess); ------------------------------------------------------ return 1; }//////////////////////////////////////////////////////////////////////////////// // Base page const PAGE_MSG HW_PageEvents[] @ "DYN_PAGE" = { SESSION_CREATED_EVENT_TAG, onSessionCreated, ELF_TERMINATE_EVENT, onTerminate, ELF_SHOW_INFO_EVENT, onAuthorInfo, NIL_EVENT_TAG, NULL }; PAGE_DESC base_page ={"HW_BasePage", 0, HW_PageEvents};//////////////////////////////////////////////////////////////////////////////// // Book methods static void onCloseBook(BOOK * book) { OMAC_BOOK * omacbook = (OMAC_BOOK*)book; if(omacbook) { if(ACCELEROMETER_IsOpen(omacbook->acc_dll)) ACCELEROMETER_Close(omacbook->acc_dll); ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, 0); ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, 0); UnLoadDLL(omacbook->acc_dll); if(omacbook->acc_check_timer) Timer_Kill(&omacbook->acc_check_timer); if(omacbook->catch_timer) Timer_Kill(&omacbook->catch_timer); if(omacbook->hook) freeOMBookHook(omacbook->hook); SUBPROC(elf_exit); } } static OMAC_BOOK * CreateOMACBook(void) { ACCELEROMETER_DLL_DATA * acc_dll = (ACCELEROMETER_DLL_DATA*)LoadDLL(L"accelerometer.dll"); if(INVALID(acc_dll)) { //char s[100]; //PRINTFMSG(s, "Failed to load accelerometer.dll! (DLL_ERROR=%d)", acc_dll); -------------------------------------------- return NULL; } if(ACCELEROMETER_Version(acc_dll) < ACCELEROMETER_DLL_VERSION_NUMBER) { UnLoadDLL(acc_dll); //CSTRMSG("You are using an outdated accelerometer.dll!\n\n" ---------------------------------------------------------------- // "Please update it to the latest version!"); return NULL; } if(!ACCELEROMETER_IsPhoneSupported(acc_dll)) { UnLoadDLL(acc_dll); //CSTRMSG("Your phone model is not supported!"); ----------------------------------------------------------- return NULL; } OMAC_BOOK * bk = (OMAC_BOOK*)malloc(sizeof(OMAC_BOOK)); memset(bk, 0, sizeof(OMAC_BOOK)); if(!CreateBook((BOOK*)bk, onCloseBook, &base_page, ELF_NAME, -1, 0)) { mfree(bk); return NULL; } bk->acc_dll = acc_dll; onSessionCreated(0, (BOOK*)bk); // Attempt to find already existing Opera Mini instance return bk; }//////////////////////////////////////////////////////////////////////////////// // Main method int main(void) { if(FindBook(isAnyOMACBook)) {// CSTRMSG("Already running!"); ------------------------------------------------------ } else if(CreateOMACBook()) return 0; SUBPROC(elf_exit); return 0; }
В частности, что это за метод такой?
Код:
if(b->hook) { DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey; ...
"1" - это add_before или add_after?
Код:
ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1);
О_о
Код:
DISP_OBJ_ONCLOSE_METHOD defOnClose; DISP_OBJ_ONKEY_METHOD defOnKey;
[ Редактировано IDOL1234 в 2.12.11 22:27 ]
пшшшшшшшшшшшшшш!
D3mon
Developer
Регистрация: 23.2.08 Сообщений: 1141 Репутация: 10348 Откуда: Краснодар
#1928 [02.12.11, 23:58] Re: Создание Эльфов
IDOL1234 , писал:
"1" - это add_before или add_after?
Код:
ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1);
ответ на этот вопрос можно найти в types.h:
Код:
typedef enum PAGE_HOOK_MODE { PAGE_HOOK_REMOVE=0, PAGE_HOOK_ADD_BEFORE, PAGE_HOOK_ADD_AFTER }PAGE_HOOK_MODE;
Советую внимательно поизучать этот файл, можно много чего интересного найти!
Sony Xperia XZ3 GreenSony Xperia Z3 Compact Orange W995i SW-R1GA026 :(
Спасибо сказали: farid
IDOL1234
Пользователь
Регистрация: 29.3.11 Сообщений: 113 Репутация: 1 Откуда: СПб
#1929 [03.12.11, 13:04] Re: Создание Эльфов
ответ на этот вопрос можно найти в types.h:
Эмм. Я это видел. Так нет ведь значений!
0 я заменил на PAGE_HOOK_REMOVE, а с остальными не разобрался.
пшшшшшшшшшшшшшш!
'Фу' сказали: farid
Pavlus
Опытный
Регистрация: 23.12.08 Сообщений: 223 Репутация: 174 Откуда: Украина.Сумы.Конотоп
#1930 [03.12.11, 14:06] Re: Создание Эльфов
Там значения автоматически подставляются. Почитай учебник по Си.
Спасибо сказали: SERGK393, IDOL1234
SERGK393
Elfmaker
Регистрация: 25.1.09 Сообщений: 330 Репутация: 1897 Откуда: Воронеж, Россия
#1931 [03.12.11, 15:20] Re: Создание Эльфов
IDOL1234 пишет:
В частности, что это за метод такой?
Код:
if(b->hook) { DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey; ...
О_о
Код:
DISP_OBJ_ONCLOSE_METHOD defOnClose; DISP_OBJ_ONKEY_METHOD defOnKey;
Код:
if(b->hook) { DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey; ...
Он находит стандартный метод нажатия клавиш
Код:
DISP_OBJ_ONCLOSE_METHOD defOnClose;
Метод при закрытии
Код:
DISP_OBJ_ONKEY_METHOD defOnKey;
Метод при нажатии клавиш
K310I - R4 HA 014 WMR 795407939817 WMZ 160582394547
Спасибо сказали: IDOL1234
Похожие темы
Вы не можете начинать темы. Вы не можете редактировать свои сообщения. Вы не можете создавать опросы. Вы не можете вкладывать файлы в сообщения. Вы не можете отвечать на сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать.