Все для Sony Ericsson, патчи, эльфы, моддинг, прошивка
  
Логин: Пароль: Запомнить: Привет гость! Зарегистрируйся или авторизируйся для получения доп. возможностей!
Разделы
PDA версия сайта
TrackIDentify
Новости
Статьи
Файлы
Патчи
Патчи A2
Патчи db2020
Эльфы
Исходники эльфов
Wiki
Форум
Опросы
Обратная связь
Развернуть/Свернуть
 
Развернуть/Свернуть

Создание Эльфов : Эльфостроение : Эльфы : Форум : Для Sony Ericsson патчи эльфы моддинг прошивка
/  Список форумов
   /  Эльфы
      /  Эльфостроение
   /  Создание Эльфов
На печать 
Правила 
Страница 193 из 211: « 1 ... 189 190 191 192 [193] 194 195 196 197 ... 211 »

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 elfcheck.rar (32.56 kb; 1014 hits) Скачать файл
saveevents.elf saveevents.elf (1.13 kb; 439 hits) Скачать файл
iar_templates.zip 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 - R4HA014
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 Green
Sony 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 - R4HA014
WMR 795407939817
WMZ 160582394547
Спасибо сказали: IDOL1234
Страница 193 из 211: « 1 ... 189 190 191 192 [193] 194 195 196 197 ... 211 »


Похожие темы

  • Поиск
  • Права
Вы не можете начинать темы.
Вы не можете редактировать свои сообщения.
Вы не можете создавать опросы.
Вы не можете вкладывать файлы в сообщения.
Вы не можете отвечать на сообщения.
Вы не можете удалять свои сообщения.
Вы не можете голосовать.

Главная Новости Статьи Файлы Патчи Форум Опросы PDA
- Генерация страницы: 0.29 секунд | 12 Запросов | HTML: 104.75 КБ -