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