/*****************************************************************************\

  File Name: MediaPlayer.h
  
  Description: Main include file for the MediaPlayer application.
               
  Copyright(c) 2007 Analog Devices Incorporated. All Rights Reserved.
  

\*****************************************************************************/
#ifndef __MEDIAPLAYER_H__
#define __MEDIAPLAYER_H__

#include <drivers/adi_dev.h>            
#include <adi_ssl_Init.h>
#include <stdlib.h>
#include <stdio.h>

#include <string.h>

//#include <lib_def.h>
#include "os_cfg.h"
//#include <os_cpu.h>
#include <ucos_ii.h>

//#include <audio.h>
//#include <codec.h>

#include "devicecontrol.h"

/*****************************************************************************

Macros

*****************************************************************************/

#define     DCB_QUEUE_ENTRIES                       (10) /* # DCB entries allowed */

#define     MAX_FILE_NAME_LEN	                	256 /* Maximum File name length */
#define     MAX_PATH_NAME_LEN	                	512 /* Maximum path name length */


/*****************************************************************************

Globals

*****************************************************************************/

/* handle to the callback service */
extern ADI_DCB_HANDLE adi_dcb_QueueHandle;


/*-----------------------------------------------------------------------------
 * Define thread stack sizes - These must be reviewed and tweaked later as we 
 *                           know better.
 *-----------------------------------------------------------------------------*/
#define THRD_STACKSIZE     (300)
#define BOOT_THREAD_STACK_SIZE (300)  

//-----------------------------------------------------------------------------

/*-----------------------------------------------------------------------------
 * Define thread priority levels
 * Note: make sure all threads priority levels are define here
 * Priority 0,1,2,3 and Lowest,Lowest-1,Lowest-2,Lowest_3 are reserved for uCOS
 *-----------------------------------------------------------------------------*/

// - Must be reviewed later as we know better!

#define  OS_BOOT_THREAD_PRIO       4
/* priority(OS_LOWEST_PRIO - 2) is reserved for OS timer */
//#define  OS_TASK_TMR_PRIO       (OS_LOWEST_PRIO - 2)

#define THRD_PRIORITY_MANAGER_VIDEO	(OS_LOWEST_PRIO- 3)

#define THRD_PRIORITY_MANAGER_AUDIO	(OS_LOWEST_PRIO- 4)

#define THRD_PRIORITY_MANAGER_APPLICATION     (OS_LOWEST_PRIO- 5) 

#define THRD_PRIORITY_KPAD     (OS_LOWEST_PRIO-6)
 
#define THRD_PRIORITY_MANAGER_FILESYSTEM	(OS_LOWEST_PRIO- 7)

#define THRD_PRIORITY_MANAGER_DISPLAY	(OS_LOWEST_PRIO- 8)

#define THRD_PRIORITY_LCD  (OS_LOWEST_PRIO- 9)

#define THRD_PRIORITY_MANAGER_PLAYER   (OS_LOWEST_PRIO- 10)

#define THRD_PRIORITY_TWHEEL  (OS_LOWEST_PRIO- 11)

#define THRD_PRIORITY_USB  (OS_LOWEST_PRIO- 12) 

#define THRD_PRIORITY_POLL_MEDIA (OS_LOWEST_PRIO- 13)


#define THRD_PRIORITY_TSCREEN  (OS_LOWEST_PRIO- 14)
#define THRD_PRIORITY_BLINK_LED	(OS_LOWEST_PRIO- 15)
#define THRD_PRIORITY_MEDIAPLAYER	(OS_LOWEST_PRIO- 16)


#define  OS_BOOT_THREAD_ID (OS_BOOT_THREAD_PRIO)

#define POLL_MEDIA_THREAD_ID (THRD_PRIORITY_POLL_MEDIA)

#define USB_THREAD_ID (THRD_PRIORITY_USB)
 
#define TWHEEL_THREAD_ID (THRD_PRIORITY_TWHEEL)

#define MANAGER_PLAYER_ID (THRD_PRIORITY_MANAGER_PLAYER)

#define LCD_THREAD_ID (THRD_PRIORITY_LCD)

#define MANAGER_DISPLAY_ID (THRD_PRIORITY_MANAGER_DISPLAY)

#define MANAGER_FILESYSTEM_ID (THRD_PRIORITY_MANAGER_FILESYSTEM)

#define KPAD_THREAD_ID (THRD_PRIORITY_KPAD)

#define MANAGER_APPLICATION_ID (THRD_PRIORITY_MANAGER_APPLICATION)

#define MANAGER_AUDIO_ID (THRD_PRIORITY_MANAGER_AUDIO)

#define MANAGER_VIDEO_ID (THRD_PRIORITY_MANAGER_VIDEO)
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Application inter thread communication message structure.  For more details
// on the ID and function values as well as the paramters (1st or 2nd) which
// may be passed, refer to the Messages ID tables.
typedef struct __MPPMESSAGE_STRUCT__
{
    INT32U   uMID;   //Message ID.
    INT32U Param1; //1st message parameter
    void *Param2; //2nd message parameter
    
} MPPMESSAGE;

//-----------------------------------------------------------------------------
//  MPP Message IDs
//-----------------------------------------------------------------------------
#define MSGID_FILE_SELECT   		0x00008000 
#define MSGID_PLAYER_PLAY			0x00008001
#define MSGID_PLAYER_PAUSE			0x00008002
#define MSGID_PLAYER_STOP			0x00008003
#define MSGID_NEXT_ENTRY			0x00008004
#define MSGID_PREV_ENTRY			0x00008005
#define MSGID_VOLUME_UP				0x00008006
#define MSGID_VOLUME_DN				0x00008007
#define MSGID_USB_CONNECT			0x00008008
#define MSGID_USB_DISCONNECT		0x00008009
#define MSGID_FILEXFR_START			0x0000800a
#define MSGID_FILEXFR_STOP			0x0000800b
#define MSGID_LCD_CBACK				0x0000800c	
#define MSGID_TERMINATE_MPP			0x0000800d
#define	MSGID_LCD_FILESELECT		0x0000800e
#define	MSGID_LCD_REFRESH_RESET		0x0000800f
#define	MSGID_LCD_REFRESH_RESUME	0x00008010
#define MSGID_LCD_TAG				0x00008011
#define MSGID_LCD_STATUS			0x00008012
#define MSGID_PLAY_AUDIO			0x00008013
#define MSGID_PIXEL_DONE			0x00008014
#define MSGID_TEST 					0x00008015
#define MSGID_PLAYER_RESUME			0x00008016
#define MSGID_CMD_STATUS			0x00008017
#define MSGID_START_DECODE_AUDIO	0x00008018
#define MSGID_STOP_DECODE			0x00008019
#define MSGID_START_DECODE_VIDEO	0x0000801a
#define MSGID_FSS_MEDIA_CHANGE		0x0000801b
#define	MSGID_LCD_REFRESH_TEST		0x0000801c

/*-----------------------------------------------------------------------------*/
/* number of APP_INPUT-DEVICES messages that can be buffered */
#define SZ_MSGQ_APP_INPUTDEV (10)
/* number of APP commands that can be buffered */
#define SZ_MSGQ_APP_CMD (10)

#define KPAD_CMD_ARR_SIZE 		(10)	// number of KPAD commands that can be buffered

/* number of messages that can be buffered */
#define SZ_MSGQ_BUF (10)


typedef struct
{
	OS_EVENT *sem;
	void  *pInfo;
}semaphore_t;

typedef struct {
    u8 type;       	 			 /* type (file or directory) */
    char entryname[80];          /* Entry name */
    u32 size;                 	 /* File Size */
    char date[80];      		 /* Entry Date & Time */
}FILEENTRY;

typedef struct {
	u32 numVol;                /* number of volume */
    u32 indexnum;                /* index number */
    FILEENTRY flist[100];
    
}DRIVEENTRY;



typedef struct {
    u32 numVol;                /* number of volume */
    char ident[5];
}VOLUME_ENTRY;

typedef struct
{
	int type;
	char title[MAX_FILE_NAME_LEN];	
}AUDIO_FILE_INFO;


typedef struct
{
	u8 *pY;
	u8 *pU;
	u8 *pV;
	u8 *pRGB;
	u32 ImageWidth;
	u32 ImageHeight;
	u32 Y_Offset;
	u32 UV_Offset;
	u32 RGB_Offset;	
	u32 LCDWidth;
} tRGBConversion;


enum
{
	NULL_TYPE,
	AAC_TYPE,
	MP3_TYPE,
	WAV_TYPE,
	WMA_TYPE,
	JPG_TYPE,
	MPEG4_TYPE,	
	INV_TYPE,	
	RAW_TYPE,
	BMP_TYPE
};

enum
{
	STATE_NONE,
	STATE_IDLE,
	STATE_PLAY,
	STATE_PAUSE
};

enum
{
	MODE_NONE,
	MODE_AUDIO,
	MODE_IMAGE
};



enum
{
	NO_TAG_DISPLAY,
	TAG_DISPLAY,
	TAG_CLEAR
};

enum
{
	FILETYPE_NONE,
	FILETYPE_FILE,
	FILETYPE_DIRECTORY,
	FILETYPE_DRIVE
};	


typedef struct
{
	char *song_title;
	char *song_artist;
	char *song_album;
	char *song_track_time;
	int	file_type;

}lcd_taginfo_t;

/*
*********************************************************************************************************
*                                                TRACING
*********************************************************************************************************
*/
#define  mon_printf								printf

#define  TRACE_LEVEL_OFF                        0
#define  TRACE_LEVEL_INFO                       1
#define  TRACE_LEVEL_DEBUG                      2

#define  APP_TRACE_LEVEL                        TRACE_LEVEL_DEBUG
#define  APP_TRACE                              mon_printf

#define  CLK_TRACE_LEVEL                        TRACE_LEVEL_OFF
#define  CLK_TRACE                              mon_printf

#define  TTCP_TRACE                             mon_printf

#define  APP_TRACE_INFO(x)                     ((APP_TRACE_LEVEL >= TRACE_LEVEL_INFO)  ? (void)(APP_TRACE(x)) : (void)0)
#define  APP_TRACE_DEBUG(x)                     ((APP_TRACE_LEVEL >= TRACE_LEVEL_DEBUG) ? (void)(APP_TRACE(x)) : (void)0)

//#define  APP_TRACE_DEBUG                     printf

//-----------------------------------------------------------------------------
//                     EXTERN - FUNCTION PROTOTYPES
//-----------------------------------------------------------------------------
extern void CoreTimerInit( INT32U /* scale */, INT32U /* Timer Counter */);
extern void app_main(void);
extern void init_mgr_application(void);
extern void init_mgr_player(void);
extern void init_mgr_filesystem(void);
extern void init_mgr_display(void);


extern int init_devicecontrol(void);

extern int init_thumbwheel(void);
extern int init_touchscreen(void);
extern int init_uart(void);
extern int init_usb(void);

extern int init_fss( void );
extern int init_codec(void);
extern int init_pixel_compositor(void);

extern int close_lcd(void);
extern int close_keypad(void);
extern int close_thumbwheel(void);
extern int close_usb(void);
extern int close_fss(void);
extern int close_codec(void);
extern int close_pixel_compositor(void);


extern void display_fileselector	(u8 *pBuffer, DRIVEENTRY *pFileSystem, u32 FileSelectionIndex);
extern void display_filelist	 	(u8 *pBuffer, DRIVEENTRY *pFileSystem, u32 FileSelectionIndex);
extern void display_filetag	 	(u8 *pBuffer, lcd_taginfo_t *pTag, u32 Type);
extern void display_statusinfo	 	(u8 *pBuffer, u32 Status);

extern void display_filelistframe	(u8 *pBuffer);
extern void display_filetagframe 	(u8 *pBuffer);
extern void display_statusframe  	(u8 *pBuffer);

extern void display_test  	(u8 *pBuffer);
extern void display_start_message(u8 *pBuffer);


/* eVPP function */
extern void post_process_video(	u8 *ptr_src_yuv, u8 *ptr_dest_yuv422, u8 *ptr_dest_rgb, int decoded_image_width, int decoded_image_height, int actual_image_width,int actual_image_height);

#if defined(__ADSP_MOAB__) // ADSP-BF54x EZ-Kit

	extern int init_lcd_LQ043T1DG01(void);
	extern int init_keypad_548(void);
	extern int init_codec_1980(void);

	extern int close_lcd_LQ043T1DG01(void);
	extern int close_keypad_548(void);
	extern int close_codec_1980(void);

#endif

#if defined(__ADSP_KOOKABURRA__) // ADSP-BF527 EZ-Kit 

	extern int init_lcd_T350MCQB01(void);
	extern int init_keypad_MAX1233(void);
	extern int init_codec_52xc1(void);

	extern int close_lcd_T350MCQB01(void);
	extern int close_keypad_MAX1233(void);
	extern int close_codec_52xc1(void);

#endif




/* Exernal Initialization functions */
extern void PlayAudioFile(char *FileName);

extern void launch_thread_keypad(void);
extern void launch_thread_lcd(void); 


extern u32 MPPState;
extern u32 MPPMode;
extern volatile bool StopButton;
extern ADI_SEM_HANDLE PauseSemaphoreHandle;
extern volatile bool PauseButton;


#endif  //__MEDIAPLAYER_H__
