#ifndef _LED_CONTROL_H
#define _LED_CONTROL_H

/*************************TYPE DEF**********************/
#define NUM_OF_LEDS 4

#define DSD_START_OFFSET                     0x0200
#define EEPROM_VERSION_OFFSET           	 0x020E
#define EEPROM_HW_PARAM_POINTER_ADDRESS 	 0x0218
#define EEPROM_HW_PARAM_POINTER_ADDRRES_MAP5 0x0220
#define GPIO_SECTION_START_OFFSET        	 0x03

#define COMPATIBILITY_SECTION_LENGTH         42
#define COMPATIBILITY_SECTION_LENGTH_MAP5    84


#define EEPROM_MAP5_MAJORVERSION             5
#define EEPROM_MAP5_MINORVERSION             0


#define MAX_NUM_OF_BLINKS 					10
#define NUM_OF_GPIO_PINS 					16

#define DISABLE_GPIO_NUM 					0xFF
#define EVENT_SIGNALED 						1

#define MAX_FILE_NAME_BUFFER_SIZE 			100

#define TURN_ON_LED(GPIO, index) do{ \
							UINT gpio_val = GPIO; \
							(Adapter->LEDInfo.LEDState[index].BitPolarity == 1) ? \
							wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_SET_REG, &gpio_val ,sizeof(gpio_val)) : \
							wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_CLR_REG, &gpio_val, sizeof(gpio_val)); \
						}while(0);

#define TURN_OFF_LED(GPIO, index)  do { \
							UINT gpio_val = GPIO; \
							(Adapter->LEDInfo.LEDState[index].BitPolarity == 1) ? \
							wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_CLR_REG,&gpio_val ,sizeof(gpio_val)) : \
							wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_SET_REG,&gpio_val ,sizeof(gpio_val));  \
						}while(0);

#define B_ULONG32 unsigned long

/*******************************************************/


typedef enum _LEDColors{
	RED_LED = 1,
	BLUE_LED = 2,
	YELLOW_LED = 3,
	GREEN_LED = 4
} LEDColors; 				/*Enumerated values of different LED types*/

typedef enum LedEvents {
	SHUTDOWN_EXIT = 0x00,
	DRIVER_INIT = 0x1,
	FW_DOWNLOAD = 0x2,
	FW_DOWNLOAD_DONE = 0x4,
	NO_NETWORK_ENTRY = 0x8,
	NORMAL_OPERATION = 0x10,
	LOWPOWER_MODE_ENTER = 0x20,
	IDLEMODE_CONTINUE = 0x40,
	IDLEMODE_EXIT = 0x80,
	LED_THREAD_INACTIVE = 0x100,  //Makes the LED thread Inactivce. It wil be equivallent to putting the thread on hold.
	LED_THREAD_ACTIVE = 0x200    //Makes the LED Thread Active back.
} LedEventInfo_t;			/*Enumerated values of different driver states*/

#define DRIVER_HALT 0xff


/*Structure which stores the information of different LED types
 *  and corresponding LED state information of driver states*/
typedef struct LedStateInfo_t
{
	UCHAR LED_Type; /* specify GPIO number - use 0xFF if not used */
	UCHAR LED_On_State; /* Bits set or reset for different states */
	UCHAR LED_Blink_State; /* Bits set or reset for blinking LEDs for different states */
	UCHAR GPIO_Num;
	UCHAR 			BitPolarity;				/*To represent whether H/W is normal polarity or reverse
											  polarity*/
}LEDStateInfo, *pLEDStateInfo;


typedef struct _LED_INFO_STRUCT
{
	LEDStateInfo	LEDState[NUM_OF_LEDS];
	BOOLEAN 		bIdleMode_tx_from_host; /*Variable to notify whether driver came out
											from idlemode due to Host or target*/
	BOOLEAN			bIdle_led_off;
	wait_queue_head_t   notify_led_event;
	wait_queue_head_t	idleModeSyncEvent;
 	struct task_struct  *led_cntrl_threadid;
    int                 led_thread_running;
	BOOLEAN			bLedInitDone;

} LED_INFO_STRUCT, *PLED_INFO_STRUCT;
//LED Thread state.
#define BCM_LED_THREAD_DISABLED			 	 0 //LED Thread is not running.
#define BCM_LED_THREAD_RUNNING_ACTIVELY  	 1 //LED thread is running.
#define BCM_LED_THREAD_RUNNING_INACTIVELY	 2 //LED thread has been put on hold



#endif