Wirepas SDK for Mesh 2.4 GHz latest
v1.5.2
v1.5.3
v1.5.4
v1.5.5
v1.6.0.beta1
latest
Main Page
Related Pages
Data Structures
Files
Example applications
File List
Globals
util.h
Go to the documentation of this file.
1
/* Copyright 2017 Wirepas Ltd. All Rights Reserved.
2
*
3
* See file LICENSE.txt for full license details.
4
*
5
*/
6
7
#ifndef UTIL_H
8
#define UTIL_H
9
46
#include <stdint.h>
47
#include <stdbool.h>
48
49
#define Util_isLtUint8(a, b) ((int8_t)((a) - (b)) < 0)
50
#define Util_isGtOrEqUint8(a, b) ((int8_t)((a) - (b)) >= 0)
51
#define Util_isLtUint16(a, b) ((int16_t)((a) - (b)) < 0)
52
#define Util_isGtOrEqUint16(a, b) ((int16_t)((a) - (b)) >= 0)
53
#define Util_isGtOrEqUint32(a, b) !Util_isLtUint32(a, b)
54
55
bool
Util_isLtUint32
(uint32_t a, uint32_t b);
56
57
#define Util_isGtUint8(a, b) (!Util_isGtOrEqUint8(b, a))
58
#define Util_isGtUint16(a, b) (!Util_isGtOrEqUint16(b, a))
59
#define Util_isGtUint32(a, b) (!Util_isGtOrEqUint32(b, a))
60
66
bool
Util_isSmallest
(
const
uint32_t a,
const
uint32_t b,
const
uint32_t c);
67
75
bool
Util_inBetween
(
const
uint32_t a,
const
uint32_t b,
const
uint32_t c);
76
77
/* Aligning macros for structs.
78
*
79
* These can be used in structs to align the struct members correctly,
80
* especially when preceeding struct member size varies by some compilation
81
* flag
82
*
83
* Usage:
84
* STRUCT_ALIGN_4(prev_type);
85
* STRUCT_ALIGN_2(prev_type);
86
*
87
* These align the next member in struct to 4 or 2 byte boundary.
88
*
89
* For example:
90
* typedef struct
91
* {
92
* another_struct_t a;
93
*
94
* STRUCT_ALIGN_4(another_struct_t);
95
*
96
* uint32_t b;
97
* } example_struct_t;
98
*
99
* In this case, if length of another_struct_t varies, this ensures that b is
100
* aligned to 32-bit boundary (4 bytes)
101
*
102
* Another example:
103
* typedef struct
104
* {
105
* another_struct_t a;
106
*
107
* STRUCT_ALIGN_2(another_struct_t);
108
*
109
* uint16_t b;
110
* } example_struct_t;
111
*
112
* This case, align macro ensures that b is aligned to 16-bit boundary
113
*
114
* NOTE: Do NOT use in PACKED structs!
115
*/
116
117
// These are macro replacement redirection forumulas to do the correct operation
118
#define SA_MEMBERNAME(line) align ## line
119
#define SA_BASE(prev_type, size, line) \
120
uint8_t SA_MEMBERNAME(line) \
121
[sizeof(prev_type)%size ? size-(sizeof(prev_type)%size) : 0]
122
123
#define STRUCT_ALIGN_4(prev_type) SA_BASE(prev_type, 4, __LINE__)
124
//uint8_t align ## __LINE__ [sizeof(prev_type)%4 ? 4-(sizeof(prev_type)%4) : 0]
125
#define STRUCT_ALIGN_2(prev_type) SA_BASE(prev_type, 2, __LINE__)
126
// uint8_t align ## __LINE__ [sizeof(prev_type)%2 ? 1 : 0]
127
134
uint8_t
Util_bitCountU8
(uint8_t value);
135
136
#endif // #ifndef __UTIL_H__
Util_bitCountU8
uint8_t Util_bitCountU8(uint8_t value)
Calculate the '1' bits in 8-bit value.
Util_isSmallest
bool Util_isSmallest(const uint32_t a, const uint32_t b, const uint32_t c)
Util_isLtUint32
bool Util_isLtUint32(uint32_t a, uint32_t b)
Util_inBetween
bool Util_inBetween(const uint32_t a, const uint32_t b, const uint32_t c)