/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project.                                                               */
/*----------------------------------------------------------------------------*/

#pragma once

#include "hal/Types.h"

/**
 * @defgroup hal_threads Threads Functions
 * @ingroup hal_capi
 * @{
 */

typedef const void* NativeThreadHandle;

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Gets the thread priority for the specified thread.
 *
 * @param handle     Native handle pointer to the thread to get the priority for
 * @param isRealTime Set to true if thread is realtime, otherwise false
 * @param status     Error status variable. 0 on success
 * @return           The current thread priority. Scaled 1-99, with 1 being
 * highest.
 */
int32_t HAL_GetThreadPriority(NativeThreadHandle handle, HAL_Bool* isRealTime,
                              int32_t* status);

/**
 * Gets the thread priority for the current thread.
 *
 * @param handle     Native handle pointer to the thread to get the priority for
 * @param isRealTime Set to true if thread is realtime, otherwise false
 * @param status     Error status variable. 0 on success
 * @return           The current thread priority. Scaled 1-99, with 1 being
 * highest.
 */
int32_t HAL_GetCurrentThreadPriority(HAL_Bool* isRealTime, int32_t* status);

/**
 * Sets the thread priority for the specified thread.
 *
 * @param thread   Reference to the thread to set the priority of
 * @param realTime Set to true to set a realtime priority, false for standard
 * priority
 * @param priority Priority to set the thread to. Scaled 1-99, with 1 being
 * highest
 * @param status   Error status variable. 0 on success
 * @return         The success state of setting the priority
 */
HAL_Bool HAL_SetThreadPriority(NativeThreadHandle handle, HAL_Bool realTime,
                               int32_t priority, int32_t* status);

/**
 * Sets the thread priority for the current thread.
 *
 * @param thread   Reference to the thread to set the priority of
 * @param realTime Set to true to set a realtime priority, false for standard
 * priority
 * @param priority Priority to set the thread to. Scaled 1-99, with 1 being
 * highest
 * @param status   Error status variable. 0 on success
 * @return         The success state of setting the priority
 */
HAL_Bool HAL_SetCurrentThreadPriority(HAL_Bool realTime, int32_t priority,
                                      int32_t* status);

#ifdef __cplusplus
}  // extern "C"
#endif
/** @} */
