/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file mqtt_os.h
 *
 * @brief MQTT Client depends on certain OS specific functionality. The needed
 *        methods are mapped here and should be implemented based on OS in use.
 *
 * @details Memory management, mutex, logging and wall clock are the needed
 *          functionality for MQTT module. The needed interfaces are defined
 *          in the OS. OS specific port of the interface shall be provided.
 *
 */

#ifndef MQTT_OS_H_
#define MQTT_OS_H_

#include <stddef.h>
#include <kernel.h>
#include <sys/mutex.h>

#include <net/net_core.h>

#include "mqtt_internal.h"

#ifdef __cplusplus
extern "C" {
#endif

/**@brief Method to get trace logs from the module. */
#define MQTT_TRC(...) NET_DBG(__VA_ARGS__)

/**@brief Method to error logs from the module. */
#define MQTT_ERR(...) NET_ERR(__VA_ARGS__)

/**@brief Method to hexdump trace logs from the module. */
#define MQTT_HEXDUMP_TRC(_data, _length, _str) NET_HEXDUMP_DBG(_data, _length, _str)

/**@brief Method to hexdump error logs from the module. */
#define MQTT_HEXDUMP_ERR(_data, _length, _str) NET_HEXDUMP_ERR(_data, _length, _str)

/**@brief Method to hexdump warning logs from the module. */
#define MQTT_HEXDUMP_WARN(_data, _length, _str) NET_HEXDUMP_WARN(_data, _length, _str)

/**@brief Method to hexdump info logs from the module. */
#define MQTT_HEXDUMP_INFO(_data, _length, _str) NETHEXDUMP_INFO(_data, _length, _str)

/**@brief Initialize the mutex for the module, if any.
 *
 * @details This method is called during module initialization @ref mqtt_init.
 */
static inline void mqtt_mutex_init(struct mqtt_client *client)
{
	sys_mutex_init(&client->internal.mutex);
}

/**@brief Acquire lock on the module specific mutex, if any.
 *
 * @details This is assumed to be a blocking method until the acquisition
 *          of the mutex succeeds.
 */
static inline void mqtt_mutex_lock(struct mqtt_client *client)
{
	int ret = sys_mutex_lock(&client->internal.mutex, K_FOREVER);

	__ASSERT(ret == 0, "sys_mutex_lock failed with %d", ret);
	(void)ret;
}

/**@brief Release the lock on the module specific mutex, if any.
 */
static inline void mqtt_mutex_unlock(struct mqtt_client *client)
{
	int ret = sys_mutex_unlock(&client->internal.mutex);

	__ASSERT(ret == 0, "sys_mutex_unlock failed with %d", ret);
	(void)ret;
}

/**@brief Method to get the sys tick or a wall clock in millisecond resolution.
 *
 * @retval Current wall clock or sys tick value in milliseconds.
 */
static inline uint32_t mqtt_sys_tick_in_ms_get(void)
{
	return k_uptime_get_32();
}

/**@brief Method to get elapsed time in milliseconds since the last activity.
 *
 * @param[in] last_activity The value since elapsed time is requested.
 *
 * @retval Time elapsed since last_activity time.
 */
static inline uint32_t mqtt_elapsed_time_in_ms_get(uint32_t last_activity)
{
	int32_t diff = k_uptime_get_32() - last_activity;

	if (diff < 0) {
		return 0;
	}

	return diff;
}

#ifdef __cplusplus
}
#endif

#endif /* MQTT_OS_H_ */
