#ifndef _ATT_H_
#define _ATT_H_
#include "yc11xx.h"
#include "ipc.h"
#include "type.h"
#include "ycdef.h"
#include "stddef.h"
#include <string.h>

//#define att_list_struct
#define	ATT_LIST_LEN    mem_rc_att_list_end-mem_rc_att_list

typedef struct
{
	uint8_t Len;
	uint8_t uuid[16];
}UUID_TYPE;

typedef struct
{
	uint16_t handle;
	UUID_TYPE  uuids;
	uint16_t dataLen;
	uint16_t dataPtr;
}FOUND_UUID_TYPE;

typedef struct
{
	uint16_t startHandle;
	uint16_t endHandle;
	UUID_TYPE uuids;
}ATTRIBUTE_GROUP_TYPE;

typedef struct
{
	uint8_t Len;
	uint8_t uuid[2];
}UUID32_TYPE;

typedef struct
{
	uint8_t Len;
	uint8_t uuid[16];
}UUID128_TYPE;

typedef struct
{
	uint16_t handle;
	uint8_t  uuid_len;
  uint8_t *uuid; 
	uint8_t dataLen;
  uint8_t *dataPtr;
}ATT_TABLE_TYPE;


#define ATT_LIST_DATA_LENGTH_BYTE 2

#define	 CLIENT_CHARACTERTIC_CONFIGURATION 0X2902
#define	 EXTERNAL_REPORT_REFERENCE 0X2907
#define	 REPORT_REFERENCE 0X2908

#define	 UUID_SERVICE_GENERIC_ACC 0x1800
#define	 UUID_SERVICE_GENERIC_ATT 0x1801
#define	 UUID_SERVICE_DEVICE_INFO 0x180a
#define	 UUID_SERVICE_BATTERY 0x180f
#define	 UUID_SERVICE_HIDS 0x1812

#define	 UUID_GATT_PRIMARY_SERVICE 0x2800
#define	 UUID_GATT_SECONDARY_SERVICE 0x2801
#define	 UUID_GATT_INCLUDE 0X2802
#define	 UUID_GATT_CHARACTERISTIC 0X2803

#define	 UUID_CHRCTR_DEVICE_NAME 0X2A00
#define	 UUID_CHRCTR_APPEARANCE 0X2A01
#define  UUID_CHRCTR_PerPreConn_Parameters  0x2A04
#define	 UUID_CHRCTR_SERVICE_CHANGED 0X2A05
#define	 UUID_CHRCTR_BATTERY_LEVEL 0X2A19
#define	 UUID_CHRCTR_KEYBOARD_INPUT 0X2A22
#define	 UUID_CHRCTR_SYSTEM_ID  0X2A23
#define  UUID_CHRCTR_MODEL_NUMBER 0X2A24
#define	 UUID_CHRCTR_SERIAL_NUMBER 0X2A25
#define	 UUID_CHRCTR_FIRMWARE 0X2A26
#define	 UUID_CHRCTR_MANUFACTURE_NAME 0X2A29
#define	 UUID_CHRCTR_KEYBOARD_OUTPUT 0X2A32
#define	 UUID_CHRCTR_MOUSE_INPUT 0X2A33
#define	 UUID_CHRCTR_HID_INFO 0X2A4A
#define	 UUID_CHRCTR_REPORT_MAP 0X2A4B
#define	 UUID_CHRCTR_HID_CTRL_POINT 0X2A4C
#define	 UUID_CHRCTR_REPORT 0X2A4D
#define	 UUID_CHRCTR_PROTOCOL_MODE 0X2A4E
#define	 UUID_CHRCTR_PNP_ID 0X2A50

#define READ_PREMITTED 0x02
#define WRITE_WITHOUT_RESPONSE_PREMITTED 0x04
#define WRITE_PREMITTED 0x08
#define NOTIFY_PREMITTED 0x10
#define INDICATE_PREMITTED 0X20

#define UUID2ARRAY(uuid) uuid&0xff, uuid>>8

// const uint8_t READ_PREMITTED_ONLY[] = {READ_PREMITTED};
// const uint8_t NOTIFY_PREMITTED_ONLY[] = {NOTIFY_PREMITTED};
// const uint8_t INDICATE_PREMITTED_ONLY[] = {INDICATE_PREMITTED};
// const uint8_t WRITE_PREMITTED_ONLY[] = {WRITE_PREMITTED};
// const uint8_t WRITE_WITHOUT_RESPONSE_PREMITTED_ONLY[] = {WRITE_WITHOUT_RESPONSE_PREMITTED};
// const uint8_t READ_NOTIFY_PREMITTED[] = {WRITE_WITHOUT_RESPONSE_PREMITTED|NOTIFY_PREMITTED};
// const uint8_t READ_WRITE_WRITEWITHOUTRSP_PREMITTED[] = {WRITE_WITHOUT_RESPONSE_PREMITTED|READ_PREMITTED|WRITE_PREMITTED};
// const uint8_t READ_WRITE_PREMITTED[] = {READ_PREMITTED|WRITE_PREMITTED};
// const uint8_t READ_WRITEWITHOUTRSP_PREMITTED[] = {READ_PREMITTED|WRITE_WITHOUT_RESPONSE_PREMITTED};


// const uint8_t PRIMARY_SERVICE[] = {UUID2ARRAY(UUID_GATT_PRIMARY_SERVICE)};
// const uint8_t SECONDARY_SERVICE[] = {UUID2ARRAY(UUID_GATT_SECONDARY_SERVICE)};
// const uint8_t SERVICE_GENERIC_ACC[] = {UUID2ARRAY(UUID_SERVICE_GENERIC_ACC)};
// const uint8_t GATT_CHARACTERISTIC[] = {UUID2ARRAY(UUID_GATT_CHARACTERISTIC)};
// const uint8_t CHRCTR_DEVICE_NAME[] = {UUID2ARRAY(UUID_CHRCTR_DEVICE_NAME)};
// const uint8_t CHRCTR_APPEARANCE[] = {UUID2ARRAY(UUID_CHRCTR_APPEARANCE)};
// const uint8_t appearance_value[] = {0x80,0x01};
// const uint8_t SERVICE_GENERIC_ATT[] = {UUID2ARRAY(UUID_SERVICE_GENERIC_ATT)};
// const uint8_t CHCTR_PerPreferred_Connection_Parameters[] = {UUID2ARRAY(UUID_CHRCTR_PerPreConn_Parameters)};
// const uint8_t CHRCTR_SERVICE_CHANGED[] = {UUID2ARRAY(UUID_CHRCTR_SERVICE_CHANGED)};
// const uint8_t service_changed_value[] = {0,0};
// const uint8_t CHARACTERTIC_CONFIGURATION[] = {UUID2ARRAY(CLIENT_CHARACTERTIC_CONFIGURATION)};
// const uint8_t service_changed_conf_value[] = {0,0};
// const uint8_t SERVICE_BATTERY[] = {UUID2ARRAY(UUID_SERVICE_BATTERY)};
// const uint8_t CHRCTR_BATTERY_LEVEL[] = {UUID2ARRAY(UUID_CHRCTR_BATTERY_LEVEL)};
// const uint8_t battery_leval_conf_value[] = {0,0};
// const uint8_t SERVICE_DEVICE_INFO[] = {UUID2ARRAY(UUID_SERVICE_DEVICE_INFO)};
// const uint8_t CHRCTR_MODEL_NUMBER[] = {UUID2ARRAY(UUID_CHRCTR_MODEL_NUMBER)};
// const uint8_t model_number_value[] = {'1','1','1'};
// const uint8_t CHRCTR_MANUFACTURE_NAME[] = {UUID2ARRAY(UUID_CHRCTR_MANUFACTURE_NAME)};
// const uint8_t manufacture_name_value[] = {'n','a','n','o'};
// const uint8_t CHRCTR_PNP_ID[] = {UUID2ARRAY(UUID_CHRCTR_PNP_ID)};
// const uint8_t pnp_id_value[]={0x02,0x54,0x2b,0x00,0x16,0x00,0x00};
// const uint8_t SERVICE_HIDS[] = {UUID2ARRAY(UUID_SERVICE_HIDS)};
// const uint8_t CHRCTR_HID_INFO[] = {UUID2ARRAY(UUID_CHRCTR_HID_INFO)};
// const uint8_t hid_info[] = {0x01,0x01,0x00,0x02};
// const uint8_t CHRCTR_REPORT_MAP[] = {UUID2ARRAY(UUID_CHRCTR_REPORT_MAP)};
// const uint8_t EXTERNAL_REPORT[] = {UUID2ARRAY(EXTERNAL_REPORT_REFERENCE)};
// const uint8_t external_report_value[] ={0x19,0x2a};
// const uint8_t CHRCTR_HID_CTRL_POINT[] = {UUID2ARRAY(UUID_CHRCTR_HID_CTRL_POINT)};
// const uint8_t hid_ctrl_point_value[] = {0,0};
// const uint8_t CHRCTR_KEYBOARD_INPUT[] = {UUID2ARRAY(UUID_CHRCTR_KEYBOARD_INPUT)};
// const uint8_t keyboard_input_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t keyboard_input_conf_value[] = {0,0};
// const uint8_t CHRCTR_KEYBOARD_OUTPUT[] = {UUID2ARRAY(UUID_CHRCTR_KEYBOARD_OUTPUT)};
// const uint8_t keyboard_output_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t CHRCTR_MOUSE_INPUT[] = {UUID2ARRAY(UUID_CHRCTR_MOUSE_INPUT)};
// const uint8_t mouse_input_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t mouse_input_conf_value[] = {0,0};
// const uint8_t CHRCTR_REPORT[] = {UUID2ARRAY(UUID_CHRCTR_REPORT)};
// const uint8_t report1_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t report1_conf_value[] = {0,0};
// const uint8_t GATT_REPORT_REFERENCE[] = {UUID2ARRAY(REPORT_REFERENCE)};
// const uint8_t reportid1_input_value[] = {1,1};
// const uint8_t report8_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t report8_conf_value[] = {0,0};
// const uint8_t reportid8_input_value[] = {8,1};
// const uint8_t report3_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t report3_conf_value[] = {0,0};
// const uint8_t reportid3_input_value[] = {3,1};
// const uint8_t reportb_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t reportb_conf_value[] = {0,0};
// const uint8_t reportidb_input_value[] = {0x0b,1};
// const uint8_t report_output_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t reportid_ouput_value[] = {0,2};
// const uint8_t report_feature_value[] = {0,0,0,0,0,0,0,0};
// const uint8_t reportid_feature_value[] = {0,3};
// const uint8_t CHRCTR_PROTOCOL_MODE[] = {UUID2ARRAY(UUID_CHRCTR_PROTOCOL_MODE)};

// const uint8_t YICHIP_SERVICE[] = {0x49,0x53,0x53,0x43,0xfe,0x7d,0x4a,0xe5,0x8f,0xa9,0x9f,0xaf,0xd2,0x05,0xe4,0x55};
// const uint8_t yichip_ota_notify_value[20] = {0};
// const uint8_t yichip_ota_write_value[20] = {0};
// const uint8_t yichip_ota_notify_conf_value[] = {0,0};
/**
const uint8_t report_map_value[] =
{	0x05 ,0x01    //Usage Page Generic Desktop) 
	,0x09 ,0x06    //Usage (Keyboard) 
	,0xA1 ,0x01    //Collection (Application) 
	,0x85 ,0x0b    //report ID (HIDAPP_KEYBOARD_REPORT_ID) 
	,0x75 ,0x01    //Report Size (1) 
	,0x95 ,0x08    //Report Count (8) 
	,0x05 ,0x07    //Usage Page (Key Codes) 
	,0x19 ,0xe0    //Usage Minimum (224) 
	,0x29 ,0xe7    //Usage Maximum (231) 
	,0x15 ,0x00    //Logical Minimum (0) 
	,0x25 ,0x01    //Logical Maximum (1) 
	,0x81 ,0x02    //Input (Data, Variable, Absolute) 
	,0x95 ,0x01    //Report Count (1) 
	,0x75 ,0x08    //Report Size (8) 
	,0x81 ,0x01    //Input (Constant) reserved byte(1) 
	,0x95 ,0x05    //Report Count (5) 
	,0x75 ,0x01    //Report Size (1) 
	,0x05 ,0x08    //Usage Page (Page//for LEDs) 
	,0x19 ,0x01    //Usage Minimum (1) 
	,0x29 ,0x05    //Usage Maximum (5) 
	,0x91 ,0x02    //Output (Data, Variable, Absolute), Led report 
	,0x95 ,0x01    //Report Count (1) 
	,0x75 ,0x03    //Report Size (3) 
	,0x91 ,0x01    //Output (Constant), Led report padding 
	,0x95 ,0x06    //Report Count (6) 
	,0x75 ,0x08    //Report Size (8) 
	,0x15 ,0x00    //Logical Minimum (0) 
	,0x25 ,0xeb    //Logical Maximum (101) 
	,0x05 ,0x07    //Usage Page (Key codes) 
	,0x19 ,0x00    //Usage Minimum (0) 
	,0x29 ,0xeb    //Usage Maximum (101) 
	,0x81 ,0x00    //Input (Data, Array) Key array(6 bytes) 
	,0xC0   	 //End Collection (Application) 
	//Consumer Usepage 
	,0x05 ,0x0c    //Usage Page (Consumer Devices) 
	,0x09 ,0x01    //Usage (Consumer Control) 
	,0xa1 ,0x01    //Collection (Application) 
	,0x85 ,0x01	 //HIDAPP_REMOTE_REPORT_ID,    //report ID (01) 
	,0x19 ,0x00    //USAGE_MINIMUM (0) 
	,0x2a ,0x9c ,0x02 //USAGE_MINIMUM (29c) 
	,0x15 ,0x00    //Logical Minimum (0) 
	,0x26 ,0x9c ,0x02 //Logical Maximum (29c) 
	,0x95 ,0x01    //Report Count (1) 
	,0x75 ,0x10    //Report Size (16) 
	,0x81 ,0x00    //Input (Data, array, Absolute) 
	,0x09 ,0x02    //Usage (Numeric Key Pad ) 
	,0xa1 ,0x02    //Collection (Application) 
	,0x05 ,0x09    //Usage Page (button) 
	,0x19 ,0x01    //Usage Minimum (1) 
	,0x29 ,0x0a    //Usage Maximum (10) 
	,0x15 ,0x01    //Logical Minimum (1) 
	,0x25 ,0x0a    //Logical Maximum (10) 
	,0x95 ,0x01    //Report Count (1) 
	,0x75 ,0x08    //Report Size (8) 
	,0x81 ,0x40    //Input (Data, Variable, Relative) 
	,0xc0   	 //End Collection 
	,0xc0    	 //End Collection 
	//optional mouse data 
	,0x05 ,0x01    //Usage Page (Generic Desktop) 
	,0x09 ,0x02    //USAGE (Mouse) 
	,0xa1 ,0x01    //COLLECTION (Application) 
	,0x09 ,0x01    //USAGE (Pointer) 
	,0xa1 ,0x00    //COLLECTION (Physical) 
	,0x85 ,0x03    //HIDAPP_MOUSE_REPORT_ID,    //report ID (HIDAPP_MOUSE_REPORT_ID) 
	,0x05 ,0x01    //USAGE_PAGE (Generic Desktop) 
	,0x09 ,0x30    //USAGE (X) 
	,0x09 ,0x31    //USAGE (Y) 
	,0x15 ,0x80    //LOGICAL_MINIMUM (-127) 
	,0x25 ,0x7f    //LOGICAL_MAXIMUM (127) 
	,0x75 ,0x08    //REPORT_SIZE (8) 
	,0x95 ,0x02    //REPORT_COUNT (2) 
	,0x81 ,0x06    //INPUT (Data, Variable, Relative) 
	,0x05 ,0x09    //USAGE_PAGE (Button) 
	,0x19 ,0x01    //USAGE_MINIMUM (Button 1) 
	,0x29 ,0x05    //USAGE_MAXIMUM (Button 5) 
	,0x15 ,0x00    //LOGICAL_MINIMUM (0) 
	,0x25 ,0x01    //LOGICAL_MAXIMUM (1) 
	,0x95 ,0x05    //REPORT_COUNT (5) 
	,0x75 ,0x01    //REPORT_SIZE (1) 
	,0x81 ,0x02    //INPUT () 
	,0x95 ,0x01    //REPORT_COUNT (1) 
	,0x75 ,0x03    //REPORT_SIZE (3) 
	,0x81 ,0x03    //INPUT () 
	,0xc0    	 //End Collection (Physical) 
	,0xc0       //End Collection (Application) 
	//end mouse data
	,0x06 ,0x01 ,0xff
	,0x09 ,0x01    //Usage (Consumer Control) 
	,0xa1 ,0x02    //COLLECTION () 
	,0x85 ,0x08    //HIDAPP_VOICE_REPORT_ID,    //report ID (HIDAPP_KEYBOARD_REPORT_ID) 
	,0x09 ,0x14
	,0x75 ,0x08    //Report Size (8) 
	,0x95 ,0x14    //Report Count (20) 
	,0x15 ,0x80    //Logical Minimum (80) 
	,0x25 ,0x7f    //Logical Minimum (7f) 
	,0x81 ,0x22    //Input () 
	,0x85 ,0x04    //report ID () 
	,0x09 ,0x04    //USAGE () 
	,0x75 ,0x08    //Report Size (8) 
	,0x95 ,0x01    //Report Count (1) 
	,0x91 ,0x02    //Output 
	,0xc0
};
**/
//#define BLE_NAME_LENTH 7
//uint8_t ble_name[BLE_NAME_LENTH] = {'1','1','x','x','B','L','E'};

//uint8_t ble_conn_parameter[]={0x10,0x00,0x18,0x00,0x10,0x00,0x58,0x02};

//uint8_t YICHIP_OTA_SERVICE[] = {0xf0,0xff};
//uint8_t YICHIP_OTA_NOTIFY[] = {0xf4,0xff};
//uint8_t YICHIP_OTA_WRITE[] = {0xf5,0xff};


// const ATT_TABLE_TYPE Att_list2[] = {
//     //Primary Service: GAP
//     {0x01, 2, PRIMARY_SERVICE, 2, SERVICE_GENERIC_ACC},

//     //#Characteristic: Device Name
//     {0x02, 2, GATT_CHARACTERISTIC, 1, READ_PREMITTED_ONLY},
//     {0x03, 2, CHRCTR_DEVICE_NAME, BLE_NAME_LENTH, ble_name},

//     //Characteristic: Appearance
//     {0x04, 2, GATT_CHARACTERISTIC, 1, READ_PREMITTED_ONLY},
//     {0x05, 2, CHRCTR_APPEARANCE, 2, appearance_value},

//     //Perpheral Preferred Connection Parameters
//     {0x06, 2, GATT_CHARACTERISTIC, 1, READ_PREMITTED_ONLY},
//     {0x07, 2, CHCTR_PerPreferred_Connection_Parameters, 8, ble_conn_parameter},

//     //Primary service yichip transmit 
//     {0x08, 2, SECONDARY_SERVICE, 2, READ_PREMITTED_ONLY},

//     //Service Changed
//     {0x09, 2, GATT_CHARACTERISTIC, 1, INDICATE_PREMITTED_ONLY},
//     {0x0a, 2, CHRCTR_SERVICE_CHANGED, 1, 0},
//     //Client Characteristic Configuration
//     {0x0b, 2, CHARACTERTIC_CONFIGURATION, 1, 00},

//     //ota service
//     {0x0c, 2, PRIMARY_SERVICE, 2, YICHIP_OTA_SERVICE},

//     //ota notify
//     {0x0d, 2, GATT_CHARACTERISTIC, 1, READ_NOTIFY_PREMITTED},
//     {0x0e, 2, YICHIP_OTA_NOTIFY, 20, yichip_ota_notify_value},
//     {0x0f, 2, CHARACTERTIC_CONFIGURATION, 2, yichip_ota_notify_conf_value},

//     //ota write
//     {0x10, 2, GATT_CHARACTERISTIC, 1,WRITE_WITHOUT_RESPONSE_PREMITTED_ONLY},
//     {0x11, 2, YICHIP_OTA_WRITE, 20, yichip_ota_write_value},

//     0,
//     0,
// }
#ifdef att_list_struct
uint8_t att_list_init();
#else
uint8_t att_list_init2(uint8_t *AttPtr, uint16_t len);
void Att_profile_Config();
#endif

#endif