Key Table

Создание настраиваемой раскладки кнопок

Поскольку у всех юзеров кнопки могут быть распаяны по разному предлагаю ввести во все наши прошивки конфигурационный файл - таблицу соответствия скан кодов и функции кнопок. Это позволит юзерам настроить расположение кнопок под себя и сохранять эту раскладку при заливке любой из прошивок.

Что бы это работало драйвера клавиатуры в прошивках должны выдавать одинаковые скан коды. Предлагаю использовать в своих драйверах таблицу скан кодов опубликованую в разделе "Клавиши", или целиком мой драйвер клавиатуры.

Файл конфигурации сохраняется в nfl:\\SYSTEM\\keytable.cfg
В файле подряд записаны скан коды для клавиш
VK_UP
VK_DOWN
VK_LEFT
VK_RIGHT
VK_OK
VK_PLAY

Если файл отсутствует - он создается со значениями по умолчанию
0x20, 0x08,  0x04, 0x02, 0x01, 0x40

Что бы это работало нужно:

В файле /mtv_50/gui_lib/inc/Macro.h добавить строку:
#define KEYTABLE_FILE_NAME     "nfl:\\SYSTEM\\keytable.cfg"

В файле /mtv_50/common/system.c добавить строки:
int keytable[6] = {0x20, 0x08, 0x04, 0x02, 0x01, 0x40};
static int KeyTableLoaded = 0;

И две новые функции:
int SaveKeyTable(void)
{
    FILE* fp = fopen(KEYTABLE_FILE_NAME, "wb");
    if(NULL == fp){
        CRCFini();
        return 0;
    }
    fwrite(&keytable, 1, sizeof(keytable), fp);
    fclose(fp);
    CRCFini();
    return 1;
}

int LoadKeyTable(void)
{
    if (! KeyTableLoaded) {
        KeyTableLoaded = 1;
        if (CheckFileExist(KEYTABLE_FILE_NAME)) {
            FILE* fp = fopen(KEYTABLE_FILE_NAME, "r+");
            if(NULL != fp){
                fread(&keytable, 1, sizeof(keytable), fp);
                fclose(fp);
                return 1;
            }
        } else {
            SaveKeyTable();
        }
    }
    return 0;
}

В файле /mtv_50/common/boot_options.c необходимо добавить объявление внешнего массива keytable[]:
extern int keytable[6];

Затем в функции BootOpt_InitOthers() после строки
sys_create_reservefile();

добавить строку:
LoadKeyTable();

И заменить функцию
DWORD TranslateKeyCode(DWORD key)
{
.....
}

на
// vogue Night_Gryphon
// ---------------------------------------------------------------
DWORD TranslateKeyCode(DWORD key)
{
    if(key & keytable[0]){    // ....
        return VK_UP;
        }
    if(key & keytable[1]){    // ....
        return VK_DOWN;
    }
    if(key & keytable[2]){    // LEFT
        return VK_LEFT;
    }
    if(key & keytable[3]){    // RIGHT
        return VK_RIGHT;
    }
    if(key & keytable[4]){    // OK
        return VK_OK;
    }
    if(key & keytable[5]){    // PLAY
        return VK_PLAY;
    }
    return 0x0;
}

Далее в файле /mtv_50/common/keymsg.c внести правки

Заремарить строку
//#define SCAN_OK 1  // vogue

В функции MobileUpKey() и MobileDownKey() внести поправки:
static void MobileUpKey(unsigned int key)
{
//      switch(key)
        switch(TranslateKeyCode(key)) // vogue
        {
//              case  SCAN_OK:
                case  VK_OK: // vogue


static void MobileDownKey(unsigned int key)
{
printf("curkeycode = %x\n",key);
// switch(key)
switch(TranslateKeyCode(key)) // vogue
{
// case SCAN_OK:
case VK_OK: // vogue


VK_PRINTSCREEN и VK_POWERSAVE


В файле /mtv_50/gui_lib/inc/Macro.h добавить строки:
// vogue Night_Gryphon
#define VK_PRINTSCREEN             0x00000080     // PRINTSCREEN
#define VK_POWERSAVE               0x00000100     // POWERSAVE

В файле /mtv_50/common/system.c изменить строку:
int keytable[8] = {0x20, 0x08, 0x04, 0x02, 0x01, 0x40, 0x80, 0x100};

В файле /mtv_50/common/boot_options.c изменить объявление внешнего массива keytable[]:
extern int keytable[8];

Дополнить функцию TranslateKeyCode
    if(key & keytable[6]){    // PRINTSCREEN
        return VK_PRINTSCREEN;
    }
    if(key & keytable[7]){    // POWERSAVE
        return VK_POWERSAVE;
    }

В файле /mtv_50/common/keymsg.c в функции WaitMessage сделать чтобы было так
                                printf("DDDDDDDDDDD: curdownkeycode = %x\n", curdownkeycode);

                                // vogue Night_Gryphon
                                switch(TranslateKeyCode(curdownkeycode)) { // vogue
#ifdef SCREEN_SNAP_MODE
                                    case VK_PRINTSCREEN:
                                                FbSnap();
                                                curdownkeycode = 0;
                                                myPostMessage = 0;
                                                continue;
                                                break;
#endif // SCREEN_SNAP_MODE

                                    case VK_POWERSAVE:.
                                                if (PowerSaveCheck()) {
                                                    PowerSaveOff();
                                                } else {
                                                    PowerSaveOn();
                                                }

                                                curdownkeycode = 0;
                                                myPostMessage = 0;
                                                continue;
                                                break;
                                }
                                // -----------------------------------------------

                                if(1==GetMenuRollEn()){



Программа Vogue_cfg для редактирования раскладки

Для простоты и удобства редактирования раскладки была написана программа Vogue_cfg. С ее помощью можно редактировать файл keytable.cfg и изменять раскладку на удобную в текущий момент. Интерфейс программы предельно прост и отображен на рисунке слева.

Загрузить программу можно здесь: http://sites.google.com/site/vogeeky/file/vogue_cfg.rar?attredirects=0&d=1

При нажатии на кнопку "Load config" потребуется подключить устройство к USB и указать путь до файла keytable.cfg, который находиться на устройстве в папке \SYSTEM. Например: <ваш съемный диск>:\SYSTEM\keytable.cfg . После редактирования и сохранения конфигурации для вступления изменений в силу необходимо перезагрузить девайс.

История изменений:

1.0 - первый релиз
1.1 - пофикшен фильтр в диалоге сохранения конфига
1.2 - пофикшена проблемма работы на двухмониторной конфигурации
1.3 - добавлены новые обработчики VK_PRINTSCREEN и VK_POWERSAVE а так же кнопки POWER и Disabled. Программа так-же работает со старым 6-ти кнопочным конфигом, просто делая неактивными два последних пункта (VK_PRINTSCREEN и VK_POWERSAVE).

Comments