/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    Copyright (c) 2020 Texas Instruments Incorporated
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *         @file  chipOBLeProfile.h
 *         This file contains the CHIPOBLE profile definitions and prototypes
 *         prototypes.
 */

#ifndef CHIPOBLEPROFILE_H
#define CHIPOBLEPROFILE_H

#ifdef __cplusplus
#include <ble/Ble.h>
#include <platform/internal/BLEManager.h>
#include <platform/internal/CHIPDeviceLayerInternal.h>

extern "C" {
#endif

/*********************************************************************
 * INCLUDES
 */

/*********************************************************************
 * CONSTANTS
 */

// Simple Keys Profile Services bit fields
#define CHIPOBLEPROFILE_SERVICE 0x00000001

#define CHIPOBLE_SERV_UUID 0xFFF6           // Service UUID
#define CHIPOBLEPROFILE_TX_CHAR_UUID 0x129D // GATT indications/read
#define CHIPOBLEPROFILE_RX_CHAR_UUID 0x119D // GATT Writes

#define CHIPOBLEPROFILE_SERV_UUID_BASE128(uuid)                                                                                    \
    0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, LO_UINT16(uuid), HI_UINT16(uuid), 0x00, 0x00

#define CHIPOBLEPROFILE_CHAR_UUID_BASE128(uuid)                                                                                    \
    HI_UINT16(uuid), LO_UINT16(uuid), 0x9F, 0x42, 0x9C, 0x4F, 0x9F, 0x95, 0x59, 0x45, 0x3D, 0x26, 0xF5, 0x2E, 0xEE, 0x18

#define CHIPOBLEPROFILE_TX_CHAR 0  // R uint8 - Profile Characteristic 1 (CHIPOBLE Tx) value
#define CHIPOBLEPROFILE_RX_CHAR 1  // W uint8 - Profile Characteristic 2 (CHIPOBLE Rx) value
#define CHIPOBLEPROFILE_CCCWrite 2 // Client Characteristic Configuration

#define CHIPOBLEPROFILE_CHAR_LEN (244)
#define CHIPOBLEPROFILE_MAX_DESCRIPTION_LEN (20)

/*********************************************************************
 * TYPEDEFS
 */

/* Callback when a characteristic value has changed */
typedef void (*chipOBleProfileChange_t)(uint8 paramID, uint16 len, uint16_t connHandle);

typedef struct
{
    chipOBleProfileChange_t pfnchipOBleProfileChange; // Called when characteristic value changes
} chipOBleProfileCBs_t;

/*********************************************************************
 * API FUNCTIONS
 */

/*
 * CHIPoBLEProfile_AddService- Initializes the CHIPoBLE Profile service by registering
 *          GATT attributes with the GATT server.
 *
 * @param   services - services to add. This is a bit map and can
 *                     contain more than one service.
 */

bStatus_t CHIPoBLEProfile_AddService(uint32 services);

/*
 *    CHIPoBLEProfile_RegisterAppCBs - Registers the application callback function.
 *                    Only call this function once.
 *
 *    appCallbacks - pointer to application callbacks.
 */
bStatus_t CHIPoBLEProfile_RegisterAppCBs(chipOBleProfileCBs_t * appCallbacks);

/*
 *    CHIPoBLEProfile_SetParameter - Set a Simple GATT Profile parameter.
 *
 *    param - Profile parameter ID
 *    len - length of data to right
 *    value - pointer to data to write.  This is dependent on
 *          the parameter ID and WILL be cast to the appropriate
 *          data type (example: data type of uint16 will be cast to
 *          uint16 pointer).
 */
bStatus_t CHIPoBLEProfile_SetParameter(uint8 param, uint8 len, void * value, uint8_t taskId);

/*
 *    CHIPoBLEProfile_GetParameter - Get a Simple GATT Profile parameter.
 *
 *    param - Profile parameter ID
 *    value - pointer to data to write.  This is dependent on
 *          the parameter ID and WILL be cast to the appropriate
 *          data type (example: data type of uint16 will be cast to
 *          uint16 pointer).
 */
bStatus_t CHIPoBLEProfile_GetParameter(uint8 param, void * value, uint16_t len);

#ifdef __cplusplus
}
#endif

#endif /* CHIPOBLEPROFILE_H */
