Index: apps/iap.c =================================================================== --- apps/iap.c (revision 24224) +++ apps/iap.c (working copy) @@ -51,7 +51,7 @@ static unsigned long iap_remotebtn = 0; static int iap_repeatbtn = 0; -static bool iap_btnrepeat = false, iap_btnshuffle = false; +static bool iap_btnrepeat = false, iap_btnshuffle = false, iap_mode2on = false; unsigned char serbuf[RX_BUFLEN]; static int serbuf_i = 0; @@ -149,7 +149,8 @@ static unsigned char chksum = 0; /* Restart if the sync word is seen */ - if(x == 0x55 && last_x == 0xff/* && newpkt*/) + if((x == 0x55 && last_x == 0xff /* && newpkt*/) || + (x == 0x55 && iap_mode2on == true)) { serbuf[0] = 0; serbuf_i = 0; @@ -377,6 +378,7 @@ if(serbuf[2] != 0) return; iap_remotebtn = BUTTON_NONE; iap_remotetick = false; + iap_mode2on = true; if(serbuf[0] >= 3 && serbuf[3] != 0) { @@ -457,6 +459,15 @@ } else iap_btnrepeat = false; + + if(serbuf[5] & 4) /* power off */ + { + /* notify accessory that ipod goes in sleep mode */ + unsigned char data[] = {0x00, 0x23, 0x03}; + iap_send_pkt(data, sizeof(data)); + /* power the ipod off, since there is no actual sleep mode */ + sys_poweroff(); + } if(serbuf[5] & 16) /* ffwd */ { @@ -466,7 +477,31 @@ { iap_remotebtn |= BUTTON_RC_LEFT; } + if(serbuf[5] & 64) /* menu */ + { + iap_remotebtn |= BUTTON_RC_MENU; + } + if(serbuf[5] & 128) /* select */ + { + iap_remotebtn |= BUTTON_RC_SELECT; + } } + else if(serbuf[0] >= 6 && serbuf[6] != 0) + { + if(serbuf[6] & 1) /* up arrow */ + { + iap_remotebtn |= BUTTON_RC_UP; + } + if(serbuf[6] & 2) /* down arrow */ + { + iap_remotebtn |= BUTTON_RC_DOWN; + } + } + /* end of repetitive command */ + else + { + iap_mode2on = false; + } } /* Handle Mode 3 */ else if (serbuf[1] == 0x03) Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 24224) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -305,19 +305,34 @@ *****************************************************************************/ static const struct button_mapping remote_button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_RC_LEFT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_UP, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_STD_OK, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_STD_MENU, BUTTON_RC_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_STD_QUICKSCREEN, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_STD_CONTEXT, BUTTON_RC_SELECT|BUTTON_REPEAT,BUTTON_RC_SELECT }, + { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, LAST_ITEM_IN_LIST }; /* remote_button_context_standard */ static const struct button_mapping remote_button_context_wps[] = { - { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, - { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_WPS_BROWSE, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_WPS_CONTEXT, BUTTON_RC_SELECT|BUTTON_REPEAT,BUTTON_RC_SELECT }, + { ACTION_WPS_VIEW_PLAYLIST, BUTTON_RC_SELECT|BUTTON_PLAY, BUTTON_NONE }, + { ACTION_WPS_MENU, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + { ACTION_WPS_QUICKSCREEN, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, { ACTION_WPS_PLAY, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, @@ -338,6 +353,116 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* remote_button_context_tree */ +static const struct button_mapping remote_button_context_tree_scroll_lr[] = { + { ACTION_NONE, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT }, + { ACTION_TREE_ROOT_INIT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_RC_LEFT }, + { ACTION_TREE_PGLEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_TREE_PGLEFT, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT|BUTTON_REPEAT }, + { ACTION_NONE, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT }, + { ACTION_TREE_PGRIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_TREE_PGRIGHT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT|BUTTON_REPEAT }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), +}; /* remote_button_context_tree_scroll_lr */ + +static const struct button_mapping remote_button_context_settings[] = { + { ACTION_SETTINGS_INC, BUTTON_RC_UP, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_settings */ + +static const struct button_mapping remote_button_context_yesno[] = { + { ACTION_YESNO_ACCEPT, BUTTON_RC_SELECT, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* remote_button_context_yesno */ + +static const struct button_mapping remote_button_context_bmark[] = { + { ACTION_BMS_DELETE, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), +}; /* remote_button_context_bmark */ + +static const struct button_mapping remote_button_context_quickscreen[] = { + { ACTION_QS_TOP, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_QS_TOP, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_SELECT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_quickscreen */ + +static const struct button_mapping remote_button_context_pitchscreen[] = { + { ACTION_PS_INC_SMALL, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_PS_INC_BIG, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_PS_DEC_BIG, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFTOFF, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_TOGGLE_MODE, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_PS_RESET, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_RC_SELECT, BUTTON_NONE }, + { ACTION_PS_SLOWER, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_FASTER, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_pitchscreen */ + +static const struct button_mapping remote_button_context_keyboard[] = { + { ACTION_KBD_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SELECT, BUTTON_RC_SELECT, BUTTON_NONE }, + { ACTION_KBD_DONE, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_KBD_ABORT, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + { ACTION_KBD_UP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_MORSE_INPUT, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, + { ACTION_KBD_MORSE_SELECT, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* remote_button_context_keyboard */ + +#ifdef HAVE_RECORDING +const struct button_mapping remote_button_context_recscreen[] = { + + { ACTION_REC_NEWFILE, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_STD_MENU, BUTTON_RC_SELECT|BUTTON_REPEAT, BUTTON_RC_SELECT }, + { ACTION_REC_PAUSE, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_STD_CANCEL, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_INC, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_recscreen */ +#endif + + #if CONFIG_TUNER static const struct button_mapping remote_button_context_radio[] = { { ACTION_FM_STOP, BUTTON_RC_PLAY | BUTTON_REPEAT, BUTTON_NONE }, @@ -360,9 +485,36 @@ case CONTEXT_WPS: return remote_button_context_wps; case CONTEXT_TREE: + case CONTEXT_MAINMENU: + if (global_settings.hold_lr_for_scroll_in_list) + return remote_button_context_tree_scroll_lr; + /* else fall through to CUSTOM|CONTEXT_TREE */ case CONTEXT_CUSTOM|CONTEXT_TREE: return remote_button_context_tree; + case CONTEXT_LIST: + return remote_button_context_standard; + case CONTEXT_SETTINGS_EQ: + case CONTEXT_SETTINGS_COLOURCHOOSER: + case CONTEXT_SETTINGS_TIME: + case CONTEXT_SETTINGS: + case CONTEXT_SETTINGS_RECTRIGGER: + return remote_button_context_settings; + case CONTEXT_YESNOSCREEN: + return remote_button_context_yesno; + case CONTEXT_BOOKMARKSCREEN: + return remote_button_context_bmark; + case CONTEXT_QUICKSCREEN: + return remote_button_context_quickscreen; + case CONTEXT_PITCHSCREEN: + return remote_button_context_pitchscreen; + case CONTEXT_KEYBOARD: + return remote_button_context_keyboard; +#ifdef HAVE_RECORDING + case CONTEXT_RECSCREEN: + return remote_button_context_recscreen; +#endif + #ifdef CONFIG_TUNER case CONTEXT_FM: return remote_button_context_radio; Index: firmware/target/arm/ipod/button-target.h =================================================================== --- firmware/target/arm/ipod/button-target.h (revision 24224) +++ firmware/target/arm/ipod/button-target.h (working copy) @@ -59,10 +59,16 @@ #define BUTTON_RC_RIGHT 0x00020000 #define BUTTON_RC_VOL_UP 0x00010000 #define BUTTON_RC_VOL_DOWN 0x00008000 +#define BUTTON_RC_SELECT 0x00200000 +#define BUTTON_RC_MENU 0x00400000 +#define BUTTON_RC_UP 0x00800000 +#define BUTTON_RC_DOWN 0x01000000 #define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\ |BUTTON_RC_LEFT|BUTTON_RC_RIGHT\ - |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN) + |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN\ + |BUTTON_RC_MENU|BUTTON_RC_SELECT\ + |BUTTON_RC_UP|BUTTON_RC_DOWN) #else #define BUTTON_REMOTE 0 #endif