/*

Skip Directory 0.1

VLSI Solution Oy - VS1000B 

27.8.2007

Pekka Lehtonen

UI patch that can skip to next directory when feature and next
are pressed simulatenously.

Notice: You will need to comment out the enum keyEvent from the
header files or add the custom event (ke_skipnext = 100,) there.

*/

#include <stdlib.h>
#include <stdio.h>
#include <vs1000.h>
#include <minifat.h>
#include <player.h>
#include <codec.h>
#include <audio.h>
#include <usb.h>
#include <vsNand.h>
#include <mappertiny.h>


s_int32 curDir = 0;

extern struct CodecServices cs; // Publish VS1000 internal data structure

void UserInterfaceIdleHook(void); // Prototype of ROM idle hook function

enum keyEvent {
#if 1
  ke_null = 0,
  ke_previous,
  ke_next,
  ke_rewind,
  ke_forward,
  ke_volumeUp,   /* +0.5dB */
  ke_volumeDown, /* -0.5dB */
  ke_earSpeaker, /* 0, 16000U, 38000U, 54000U */
  ke_earSpeakerToggle, /* 0, 38000U */
  ke_randomToggle,
  ke_randomToggleNewSong,
  ke_pauseToggle,
  ke_powerOff,
  ke_ff_faster,  /* increase play speed */
  ke_ff_slower,  /* decrease play speed */
  ke_ff_off,     /* back to normal play speed */
  ke_volumeUp2,  /* +1.0dB */
  ke_volumeDown2,/* -1.0dB */
#endif
  //custom events
  ke_skipnext = 100,
 
};

// Define key masks for the buttons on the Developer Board PCB.
#define KEY_VD 1
#define KEY_VU 1<<1
#define KEY_PREV 1<<2
#define KEY_NEXT 1<<3
#define KEY_FEAT 1<<4

// Define custom key mapping
const struct KeyMapping myKeyMap[] = {
  {KEY_VU,                            ke_volumeUp2  }, // Key A: Volume step up
  {KEY_VU | KEY_LONG_PRESS,           ke_volumeUp2 }, // Key A: Volume up continuous
  {KEY_VD,                            ke_volumeDown2}, // Key B: Volume step dn
  {KEY_VD | KEY_LONG_PRESS,           ke_volumeDown2}, // Key B: Volume dn continuous
  {KEY_PREV,                          ke_previous  }, // Key C: Previous song
  {KEY_NEXT,                          ke_next      }, // Key D: Next song
  {KEY_FEAT,                          ke_earSpeaker      }, // Key D: Next song
  {KEY_FEAT | KEY_LONG_ONESHOT,       ke_randomToggle }, // Key D: Next song
  {KEY_PREV | KEY_LONG_PRESS,   ke_rewind    }, // Key E with Key A: rewind
  {KEY_NEXT | KEY_LONG_PRESS,   ke_forward   }, // Key E with Key B: fast forward
  {KEY_POWER, ke_pauseToggle }, 
  {KEY_POWER | KEY_LONG_ONESHOT, ke_powerOff  }, // Only one event after long press
  {KEY_FEAT | KEY_NEXT, ke_skipnext  }, //custom event
  {0, ke_null} // End of key mappings
};



void MyKeyEventHandler(enum keyEvent event){
  switch((int)event){
  case ke_skipnext: //custom event
    curDir = minifatInfo.parentDir; // remember current dir
    break;
  default:
    RealKeyEventHandler(event); //handle all the other events
    break;
  }
}


void MyUiFunc(void)
{
  if (curDir == minifatInfo.parentDir){ //skip to next file until 
                                        //new dir is found
    RealKeyEventHandler(ke_next);
  }
  UserInterfaceIdleHook();
} 


void main(void) {
  SetHookFunction((u_int16)IdleHook, MyUiFunc);
  currentKeyMap = myKeyMap; // Use own key mapping
  SetHookFunction((u_int16)KeyEventHandler, MyKeyEventHandler);
}
