zephyr/subsys/net/lib/mqtt/mqtt_os.h

114 lines
3.0 KiB
C

/*
* 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_ */