Files
kunlun/inc/utils/iot_utils.h
2024-09-28 14:24:04 +08:00

156 lines
3.9 KiB
C
Executable File

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef IOT_UTILS_H
#define IOT_UTILS_H
/* exports includes */
#include "iot_utils_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* iot_mac_addr_hash() - calculate hash value based upon mac address
* @add: pointer to mac address to be caculated
* @mask: mask to be applied to the calculated value
*
* return: calculated hash value
*/
static inline uint32_t iot_mac_addr_hash(uint8_t* addr, uint32_t mask)
{
uint32_t sum = 0, i = 0;
while (i < IOT_MAC_ADDR_LEN)
sum += addr[i++];
sum &= mask;
return sum;
}
/*
* iot_meter_addr_hash() - calculate hash value based upon meter address
* @add: pointer to meter address to be caculated
* @mask: mask to be applied to the calculated value
*
* return: calculated hash value
*/
static inline uint32_t iot_meter_addr_hash(uint8_t* addr, uint32_t mask)
{
uint32_t sum = 0, i = 0;
while (i < IOT_METER_ADDR_LEN)
sum += addr[i++];
sum &= mask;
return sum;
}
/*
* iot_calc_m_ratio() - calculate the multiplex ratio for r1 * r2
* @r1: ratio 1 value
* @r2: ratio 2 value
*
* return: calculated ratio value
*/
static inline uint8_t iot_calc_m_ratio(uint8_t r1, uint8_t r2)
{
uint8_t ret;
ret = (uint8_t)((((uint32_t)(r1)) * ((uint32_t)(r2))) / 100);
if (ret > 100)
ret = 100;
return ret;
}
/*
* iot_calc_gcd() - calculate the greatest common divisor of two values
* @a: value 1
* @b: value 2
*
* return: calculated greatest common divisor
*/
static inline uint32_t iot_calc_gcd(uint16_t a, uint16_t b)
{
if (a == 0 || b == 0)
return 0;
while (a != b) {
if (a > b)
a -= b;
else
b -= a;
}
return a;
}
/*
* iot_calc_lcm() - calculate the least common multiple of two values
* @a: value 1
* @b: value 2
*
* return: calculated least common multiple
*/
static inline uint32_t iot_calc_lcm(uint16_t a, uint16_t b)
{
uint32_t tmp1, tmp2;
if (a == 0 || b == 0)
return 0;
tmp1 = a * b;
tmp2 = iot_calc_gcd(a, b);
return (tmp1 / tmp2);
}
typedef int (*iot_timeout_func)(int);
/* wait time for fun process */
/**
* @brief wait_timeout_fun - wait wait_time_ms for fun
* @param func_pointer [wait function pointer]
* @param arg [obj_func(arg)]
* @param target_value [wait return flag]
* @param wait_time_ms [wait time (ms)]
* @return [ERR_OK or ERR_TIMEOVER]
*/
uint8_t iot_wait_timeout_fun(iot_timeout_func obj_func, \
int arg, int target_value, uint32_t wait_time_ms);
typedef int (*iot_timeout_func2)(void *);
/* wait time for fun process */
/**
* @brief iot_wait_timeout_fun2 - wait wait_time_ms for fun
* @param func_pointer [wait function pointer]
* @param arg [obj_func(arg)]
* @param target_value [wait return flag]
* @param wait_time_ms [wait time (ms)]
* @return [ERR_OK or ERR_TIMEOVER]
*/
uint8_t iot_wait_timeout_fun2(iot_timeout_func2 obj_func, \
void *arg, int target_value, uint32_t wait_time_ms);
#ifdef __cplusplus
}
#endif
#endif /* IOT_UTILS_H */