knx
ETS configurable knx-stack
bits.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstddef>
4 #include <cstdint>
5 
6 #if defined(__linux__)
7  #include <arpa/inet.h>
8 #elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32) || defined (DeviceFamily_CC13X0)
9  #define getbyte(x,n) (*(((uint8_t*)&(x))+n))
10  #define htons(x) ( (getbyte(x,0)<<8) | getbyte(x,1) )
11  #define htonl(x) ( (getbyte(x,0)<<24) | (getbyte(x,1)<<16) | (getbyte(x,2)<<8) | getbyte(x,3) )
12  #define ntohs(x) htons(x)
13  #define ntohl(x) htonl(x)
14 #elif defined(LIBRETINY)
15  #include <lwip/udp.h>
16  #define htons(x) lwip_htons(x)
17  #define htonl(x) lwip_htonl(x)
18 #endif
19 
20 #if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32) || defined(LIBRETINY)
21  #include <Arduino.h>
22 #elif defined(ARDUINO_ARCH_ESP8266)
23  #include <Arduino.h>
24  #include <user_interface.h>
25 #elif defined(ARDUINO_ARCH_ESP32)
26  #include <Arduino.h>
27  #include <esp_wifi.h>
28 #elif defined(ESP_PLATFORM)
29  #include <lwip/inet.h>
30  #include <driver/gpio.h>
31  // // Define Arduino-like macros if needed for compatibility
32 
33  #define lowByte(val) ((val)&255)
34  #define highByte(val) (((val) >> ((sizeof(val) - 1) << 3)) & 255)
35  #define bitRead(val, bitno) (((val) >> (bitno)) & 1)
36  #define DEC 10
37  #define HEX 16
38  #define OCT 8
39  #define BIN 2
40  #define LOW 0
41  #define HIGH 1
42  #define CHANGE GPIO_INTR_ANYEDGE
43  #define FALLING GPIO_INTR_NEGEDGE
44  #define RISING GPIO_INTR_POSEDGE
45  // Implement or map Arduino-like functions if needed
46  uint32_t millis();
47  typedef void (*IsrFuncPtr)(void); // Arduino-style
48  typedef void (*EspIsrFuncPtr)(void*); // ESP-IDF-style
49  void attachInterrupt(uint32_t pin, IsrFuncPtr callback, uint32_t mode);
50 #else // Non-Arduino platforms
51  #define lowByte(val) ((val)&255)
52  #define highByte(val) (((val) >> ((sizeof(val) - 1) << 3)) & 255)
53  #define bitRead(val, bitno) (((val) >> (bitno)) & 1)
54 
55  // print functions are implemented in the platform files
56  #define DEC 10
57  #define HEX 16
58 
59  #define INPUT (0x0)
60  #define OUTPUT (0x1)
61  #define INPUT_PULLUP (0x2)
62  #define INPUT_PULLDOWN (0x3)
63 
64  #define LOW (0x0)
65  #define HIGH (0x1)
66  #define CHANGE 2
67  #define FALLING 3
68  #define RISING 4
69 
70  void delay(uint32_t millis);
71  void delayMicroseconds (unsigned int howLong);
72  uint32_t millis();
73  void pinMode(uint32_t dwPin, uint32_t dwMode);
74  void digitalWrite(uint32_t dwPin, uint32_t dwVal);
75  uint32_t digitalRead(uint32_t dwPin);
76  typedef void (*voidFuncPtr)(void);
77  void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode);
78 #endif
79 
80 #ifndef MIN
81  #define MIN(a, b) ((a < b) ? (a) : (b))
82 #endif
83 
84 #ifndef MAX
85  #define MAX(a, b) ((a > b) ? (a) : (b))
86 #endif
87 
88 #ifndef ABS
89  #define ABS(x) ((x > 0) ? (x) : (-x))
90 #endif
91 
92 #ifndef KNX_NO_PRINT
93  void print(const char[]);
94  void print(char);
95  void print(unsigned char, int = DEC);
96  void print(int, int = DEC);
97  void print(unsigned int, int = DEC);
98  void print(long, int = DEC);
99  void print(unsigned long, int = DEC);
100  void print(long long, int = DEC);
101  void print(unsigned long long, int = DEC);
102  void print(double);
103 
104  void println(const char[]);
105  void println(char);
106  void println(unsigned char, int = DEC);
107  void println(int, int = DEC);
108  void println(unsigned int, int = DEC);
109  void println(long, int = DEC);
110  void println(unsigned long, int = DEC);
111  void println(long long, int = DEC);
112  void println(unsigned long long, int = DEC);
113  void println(double);
114  void println(void);
115 
116  void printHex(const char* suffix, const uint8_t* data, size_t length, bool newline = true);
117 #else
118  #define print(...) do {} while(0)
119  #define println(...) do {} while(0)
120  #define printHex(...) do {} while(0)
121 #endif
122 
123 #ifdef KNX_ACTIVITYCALLBACK
124  #define KNX_ACTIVITYCALLBACK_DIR 0x00
125  #define KNX_ACTIVITYCALLBACK_DIR_RECV 0x00
126  #define KNX_ACTIVITYCALLBACK_DIR_SEND 0x01
127  #define KNX_ACTIVITYCALLBACK_IPUNICAST 0x02
128  #define KNX_ACTIVITYCALLBACK_NET 0x04
129 #endif
130 
131 const uint8_t* popByte(uint8_t& b, const uint8_t* data);
132 const uint8_t* popWord(uint16_t& w, const uint8_t* data);
133 const uint8_t* popInt(uint32_t& i, const uint8_t* data);
134 const uint8_t* popByteArray(uint8_t* dst, uint32_t size, const uint8_t* data);
135 uint8_t* pushByte(uint8_t b, uint8_t* data);
136 uint8_t* pushWord(uint16_t w, uint8_t* data);
137 uint8_t* pushInt(uint32_t i, uint8_t* data);
138 uint8_t* pushByteArray(const uint8_t* src, uint32_t size, uint8_t* data);
139 uint16_t getWord(const uint8_t* data);
140 uint32_t getInt(const uint8_t* data);
141 
142 void sixBytesFromUInt64(uint64_t num, uint8_t* toByteArray);
143 uint64_t sixBytesToUInt64(uint8_t* data);
144 
145 uint16_t crc16Ccitt(uint8_t* input, uint16_t length);
146 uint16_t crc16Dnp(uint8_t* input, uint16_t length);
147 
149 {
150  Float_Enc_DPT9 = 0, // 2 Byte. See Chapter 3.7.2 section 3.10 (Datapoint Types 2-Octet Float Value)
151  Float_Enc_IEEE754Single = 1, // 4 Byte. C++ float
152  Float_Enc_IEEE754Double = 2, // 8 Byte. C++ double
153 };
154 
155 
156 #if defined(ARDUINO_ARCH_SAMD)
157  // temporary undef until framework-arduino-samd > 1.8.9 is released. See https://github.com/arduino/ArduinoCore-samd/pull/399 for a PR should will probably address this
158  #undef max
159  #undef min
160  // end of temporary undef
161 #endif
uint16_t crc16Dnp(uint8_t *input, uint16_t length)
Definition: bits.cpp:153
const uint8_t * popByte(uint8_t &b, const uint8_t *data)
Definition: bits.cpp:4
void digitalWrite(uint32_t dwPin, uint32_t dwVal)
void println(const char[])
Definition: bits.cpp:314
void attachInterrupt(uint32_t pin, IsrFuncPtr callback, uint32_t mode)
uint8_t * pushInt(uint32_t i, uint8_t *data)
Definition: bits.cpp:72
uint8_t * pushByteArray(const uint8_t *src, uint32_t size, uint8_t *data)
Definition: bits.cpp:82
const uint8_t * popByteArray(uint8_t *dst, uint32_t size, const uint8_t *data)
Definition: bits.cpp:48
void print(const char[])
Definition: bits.cpp:214
void printHex(const char *suffix, const uint8_t *data, size_t length, bool newline=true)
Definition: bits.cpp:12
void sixBytesFromUInt64(uint64_t num, uint8_t *toByteArray)
Definition: bits.cpp:101
uint8_t * pushWord(uint16_t w, uint8_t *data)
Definition: bits.cpp:64
uint16_t getWord(const uint8_t *data)
Definition: bits.cpp:91
void pinMode(uint32_t dwPin, uint32_t dwMode)
uint8_t * pushByte(uint8_t b, uint8_t *data)
Definition: bits.cpp:57
void(* IsrFuncPtr)(void)
Definition: bits.h:47
void delay(uint32_t millis)
const uint8_t * popInt(uint32_t &i, const uint8_t *data)
Definition: bits.cpp:41
void(* EspIsrFuncPtr)(void *)
Definition: bits.h:48
ParameterFloatEncodings
Definition: bits.h:149
@ Float_Enc_DPT9
Definition: bits.h:150
@ Float_Enc_IEEE754Double
Definition: bits.h:152
@ Float_Enc_IEEE754Single
Definition: bits.h:151
uint16_t crc16Ccitt(uint8_t *input, uint16_t length)
Definition: bits.cpp:133
uint64_t sixBytesToUInt64(uint8_t *data)
Definition: bits.cpp:111
uint32_t millis()
void delayMicroseconds(unsigned int howLong)
uint32_t digitalRead(uint32_t dwPin)
uint32_t getInt(const uint8_t *data)
Definition: bits.cpp:96
void(* voidFuncPtr)(void)
Definition: bits.h:76
const uint8_t * popWord(uint16_t &w, const uint8_t *data)
Definition: bits.cpp:34