/*
 * Copyright 2012-2020,2022 NXP
 *
 * 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.
 */

#ifndef _PHNXPUCIHAL_ADAPTATION_H_
#define _PHNXPUCIHAL_ADAPTATION_H_

//#include <android/hardware/uwb/1.0/IUwb.h>
//#include <android/hardware/uwb/1.0/types.h>

typedef uint8_t uwb_event_t;
typedef uint8_t uwb_status_t;

/*`
 * The callback passed in from the UWB stack that the HAL
 * can use to pass events back to the stack.
 */
typedef void(uwb_stack_callback_t)(uwb_event_t event,
                                   uwb_status_t event_status);

/*
 * The callback passed in from the UWB stack that the HAL
 * can use to pass incomming data to the stack.
 */
typedef void(uwb_stack_data_callback_t)(uint16_t data_len, const uint8_t* p_data);

/* NXP HAL functions */
uint16_t phNxpUciHal_open(uwb_stack_callback_t* p_cback,
                     uwb_stack_data_callback_t* p_data_cback);
int32_t phNxpUciHal_write(size_t data_len, const uint8_t* p_data);
uint16_t phNxpUciHal_close();
uint16_t phNxpUciHal_coreInitialization();
uint16_t phNxpUciHal_sessionInitialization(uint32_t sessionId);

#endif /* _PHNXPUCIHAL_ADAPTATION_H_ */
