/*
 * Amazon FreeRTOS Platform V1.0.0
 * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://aws.amazon.com/freertos
 * http://www.FreeRTOS.org
 */

/**
 * @file iot_platform_types_posix.h
 * @brief Definitions of platform layer types on POSIX systems.
 */

#ifndef _IOT_PLATFORM_TYPES_AFR_H_
#define _IOT_PLATFORM_TYPES_AFR_H_

#include "timers.h"

typedef struct iot_mutex_internal
{
    StaticSemaphore_t xMutex; /**< FreeRTOS mutex. */
    BaseType_t recursive;     /**< Type; used for indicating if this is reentrant or normal. */
} iot_mutex_internal_t;

/**
 * @brief The native mutex type on AFR systems.
 */
typedef iot_mutex_internal_t _IotSystemMutex_t;

typedef struct iot_sem_internal
{
    StaticSemaphore_t xSemaphore; /**< FreeRTOS semaphore. */
} iot_sem_internal_t;

/**
 * @brief The native semaphore type on AFR systems.
 */
typedef iot_sem_internal_t _IotSystemSemaphore_t;

/**
 * @brief Holds information about an active detached thread so that we can
 *        delete the FreeRTOS task when it completes
 */
typedef struct threadInfo
{
    void * pArgument;                   /**< @brief Argument to `threadRoutine`. */
    void ( * threadRoutine )( void * ); /**< @brief Thread function to run. */
} threadInfo_t;

/**
 * @brief Holds information about an active timer.
 */
typedef struct timerInfo
{
    TimerHandle_t timer;                /**< @brief Underlying timer. */
    void ( * threadRoutine )( void * ); /**< @brief Thread function to run on timer expiration. */
    void * pArgument;                   /**< @brief First argument to threadRoutine. */
    StaticTimer_t xTimerBuffer;         /**< Memory that holds the FreeRTOS timer. */
    TickType_t xTimerPeriod;            /**< Period of this timer. */
} timerInfo_t;

/**
 * @brief Represents an #IotTimer_t on AFR systems.
 */
typedef timerInfo_t _IotSystemTimer_t;

struct IotNetworkServerInfo;
struct IotNetworkCredentials;
struct _networkConnection;

typedef struct IotNetworkServerInfo const * _IotNetworkServerInfo_t;
typedef struct IotNetworkCredentials * _IotNetworkCredentials_t;
typedef struct _networkConnection * _IotNetworkConnection_t;

#endif /* ifndef _IOT_PLATFORM_TYPES_POSIX_H_ */
