156 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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 */
 |