VisionaryEndian.h
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
20 // -- END LICENSE BLOCK ------------------------------------------------
21 
22 #pragma once
23 
24 #include <cstdint>
25 #include <cstring>
26 
27 #define ENDIAN_LITTLE
28 
29 // Configuration of CoLa command byte order according to the target device
30 //
31 // Define COLA_BYTE_ORDER_ENDIAN_LITTLE in case of the following devices:
32 // * SICK SafeVisionary2
33 //
34 // Define COLA_BYTE_ORDER_ENDIAN_BIG in case of the following devices:
35 // * SICK Visionary-S
36 // * SICK Visionary-T
37 // * SICK Visionary-T VGA
38 // * SICK Visionary-t Mini
39 //
40 #define COLA_BYTE_ORDER_ENDIAN_LITTLE
41 //#define COLA_BYTE_ORDER_ENDIAN_BIG
42 
43 namespace visionary {
44 
45 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
46 
47 template <class T>
48 T readUnaligned(const void* ptr)
49 {
50  T r;
51  memcpy(&r, ptr, sizeof(T));
52  return r;
53 }
54 
55 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
56 
57 
58 template <typename TAlias, typename T>
59 inline T byteswapAlias(T val);
60 
61 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
62 
63 inline uint8_t byteswap(uint8_t val)
64 {
65  return val;
66 }
67 inline int8_t byteswap(int8_t val)
68 {
69  return byteswapAlias<uint8_t>(val);
70 }
71 inline char byteswap(char val)
72 {
73  return byteswapAlias<uint8_t>(val);
74 }
75 
76 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
77 
78 inline uint16_t byteswap(uint16_t val)
79 {
80  return ((val << 8) & 0xFF00) | ((val >> 8) & 0x00FF);
81 }
82 inline int16_t byteswap(int16_t val)
83 {
84  return byteswapAlias<uint16_t>(val);
85 }
86 inline wchar_t byteswap(wchar_t val)
87 {
88  return byteswapAlias<uint16_t>(val);
89 }
90 
91 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 
93 inline uint32_t byteswap(uint32_t val)
94 {
95  val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0x00FF00FF);
96  return ((val << 16) & 0xFFFF0000) | ((val >> 16) & 0x0000FFFF);
97 }
98 inline int32_t byteswap(int32_t val)
99 {
100  return byteswapAlias<uint32_t>(val);
101 }
102 inline float byteswap(float val)
103 {
104  union
105  {
106  float f32;
107  uint32_t u32;
108  } v;
109  v.f32 = val;
110  v.u32 = byteswap(v.u32);
111 
112  return v.f32;
113 }
114 
115 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
116 
117 inline uint64_t byteswap(uint64_t val)
118 {
119  val = ((val << 8) & 0xFF00FF00FF00FF00) | ((val >> 8) & 0x00FF00FF00FF00FF);
120  val = ((val << 16) & 0xFFFF0000FFFF0000) | ((val >> 16) & 0x0000FFFF0000FFFF);
121  return ((val << 32) & 0xFFFFFFFF00000000) | ((val >> 32) & 0x00000000FFFFFFFF);
122 }
123 inline int64_t byteswap(int64_t val)
124 {
125  return byteswapAlias<uint64_t>(val);
126 }
127 inline double byteswap(double val)
128 {
129  union
130  {
131  double f64;
132  uint64_t u64;
133  } v;
134  v.f64 = val;
135  v.u64 = byteswap(v.u64);
136 
137  return v.f64;
138 }
139 
140 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
141 
142 template <typename TAlias, typename T>
143 inline T byteswapAlias(T val)
144 {
145  return static_cast<T>(byteswap(static_cast<TAlias>(val)));
146 }
147 
148 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
149 
150 #if defined ENDIAN_LITTLE
151 template <typename T>
152 inline T nativeToLittleEndian(T x)
153 {
154  return x;
155 }
156 
157 template <typename T>
158 inline T littleEndianToNative(T x)
159 {
160  return x;
161 }
162 
163 template <typename T>
164 inline T nativeToBigEndian(T x)
165 {
166  return byteswap(x);
167 }
168 
169 template <typename T>
170 inline T bigEndianToNative(T x)
171 {
172  return byteswap(x);
173 }
174 #elif defined ENDIAN_BIG
175 template <typename T>
176 inline T nativeToLittleEndian(T x)
177 {
178  return byteswap(x);
179 }
180 
181 template <typename T>
182 inline T littleEndianToNative(T x)
183 {
184  return byteswap(x);
185 }
186 
187 template <typename T>
188 inline T nativeToBigEndian(T x)
189 {
190  return x;
191 }
192 
193 template <typename T>
194 inline T bigEndianToNative(T x)
195 {
196  return x;
197 }
198 #else
199 #error Endianess is not defined, please define either LITTLE_ENDIAN or BIG_ENDIAN depending on the platform.
200 #endif
201 
202 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
203 
204 template <typename T>
205 inline T readUnalignBigEndian(const void* ptr)
206 {
207  return bigEndianToNative<T>(readUnaligned<T>(ptr));
208 }
209 
210 template <typename T>
211 inline T readUnalignLittleEndian(const void* ptr)
212 {
213  return littleEndianToNative<T>(readUnaligned<T>(ptr));
214 }
215 
216 #if defined COLA_BYTE_ORDER_ENDIAN_LITTLE
217 template <typename T>
219 {
220  return nativeToLittleEndian<T>(x);
221 }
222 template <typename T>
223 inline T readUnalignColaByteOrder(const void* ptr)
224 {
225  return littleEndianToNative<T>(readUnaligned<T>(ptr));
226 }
227 #elif defined COLA_BYTE_ORDER_ENDIAN_BIG
228 template <typename T>
229 inline T nativeToColaByteOrder(T x)
230 {
231  return nativeToBigEndian<T>(x);
232 }
233 template <typename T>
234 inline T readUnalignColaByteOrder(const void* ptr)
235 {
236  return bigEndianToNative<T>(readUnaligned<T>(ptr));
237 }
238 #else
239 #error Endianess for CoLa byte order is not defined, please define either COLA_BYTE_ORDER_ENDIAN_LITTLE or COLA_BYTE_ORDER_ENDIAN_BIG depending on the target device.
240 #endif
241 
242 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
243 
244 } // namespace visionary
visionary::littleEndianToNative
T littleEndianToNative(T x)
Definition: VisionaryEndian.h:158
visionary::nativeToBigEndian
T nativeToBigEndian(T x)
Definition: VisionaryEndian.h:164
visionary::byteswap
uint8_t byteswap(uint8_t val)
Definition: VisionaryEndian.h:63
visionary
Definition: AuthenticationLegacy.h:25
visionary::readUnaligned
T readUnaligned(const void *ptr)
Definition: VisionaryEndian.h:48
visionary::readUnalignLittleEndian
T readUnalignLittleEndian(const void *ptr)
Definition: VisionaryEndian.h:211
visionary::nativeToColaByteOrder
T nativeToColaByteOrder(T x)
Definition: VisionaryEndian.h:218
visionary::bigEndianToNative
T bigEndianToNative(T x)
Definition: VisionaryEndian.h:170
visionary::nativeToLittleEndian
T nativeToLittleEndian(T x)
Definition: VisionaryEndian.h:152
visionary::byteswapAlias
T byteswapAlias(T val)
Definition: VisionaryEndian.h:143
visionary::readUnalignBigEndian
T readUnalignBigEndian(const void *ptr)
Definition: VisionaryEndian.h:205
visionary::readUnalignColaByteOrder
T readUnalignColaByteOrder(const void *ptr)
Definition: VisionaryEndian.h:223


sick_safevisionary_base
Author(s):
autogenerated on Sat Oct 21 2023 02:24:26