1 // Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
2 // This Source Code Form is subject to the terms of the Mozilla Public
3 // License, v. 2.0. If a copy of the MPL was not distributed with this
4 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 
6 #ifndef VSOMEIP_V3_BYTEORDER_HPP
7 #define VSOMEIP_V3_BYTEORDER_HPP
8 
9 #if defined(LINUX)
10 #include <endian.h>
11 #elif defined(FREEBSD)
12 #include <sys/endian.h>
13 #else
14 // TEST IF THERE COULD BE AN ERROR!
15 //#error "Undefined OS (only Linux/FreeBSD are currently supported)"
16 #endif
17 
18 #if __BYTE_ORDER == __LITTLE_ENDIAN
19 
20 #define VSOMEIP_BYTES_TO_WORD(x0, x1) (uint16_t((x0) << 8 | (x1)))
21 #define VSOMEIP_BYTES_TO_LONG(x0, x1, x2, x3) (uint32_t((x0) << 24 | (x1) << 16 | (x2) << 8 | (x3)))
22 
23 #define VSOMEIP_WORDS_TO_LONG(x0, x1) (uint32_t((x0) << 16 | (x1)))
24 
25 #define VSOMEIP_WORD_BYTE0(x) (uint8_t((x) & 0xFF))
26 #define VSOMEIP_WORD_BYTE1(x) (uint8_t((x) >> 8))
27 
28 #define VSOMEIP_LONG_BYTE0(x) (uint8_t((x) & 0xFF))
29 #define VSOMEIP_LONG_BYTE1(x) (uint8_t(((x) >> 8) & 0xFF))
30 #define VSOMEIP_LONG_BYTE2(x) (uint8_t(((x) >> 16) & 0xFF))
31 #define VSOMEIP_LONG_BYTE3(x) (uint8_t(((x) >> 24) & 0xFF))
32 
33 #define VSOMEIP_LONG_WORD0(x) (uint16_t((x) & 0xFFFF))
34 #define VSOMEIP_LONG_WORD1(x) (uint16_t(((x) >> 16) & 0xFFFF))
35 
36 #elif __BYTE_ORDER == __BIG_ENDIAN
37 
38 #define VSOMEIP_BYTES_TO_WORD(x0, x1) (uint16_t((x1) << 8 | (x0)))
39 #define VSOMEIP_BYTES_TO_LONG(x0, x1, x2, x3) (uint32_t((x3) << 24 | (x2) << 16 | (x1) << 8 | (x0)))
40 
41 #define VSOMEIP_WORDS_TO_LONG(x0, x1) (uint32_t((x1) << 16 | (x0)))
42 
43 #define VSOMEIP_WORD_BYTE0(x) (uint8_t((x) >> 8))
44 #define VSOMEIP_WORD_BYTE1(x) (uint8_t((x) & 0xFF))
45 
46 #define VSOMEIP_LONG_BYTE0(x) (uint8_t(((x) >> 24) & 0xFF))
47 #define VSOMEIP_LONG_BYTE1(x) (uint8_t(((x) >> 16) & 0xFF))
48 #define VSOMEIP_LONG_BYTE2(x) (uint8_t(((x) >> 8) & 0xFF))
49 #define VSOMEIP_LONG_BYTE3(x) (uint8_t((x) & 0xFF))
50 
51 #define VSOMEIP_LONG_WORD0(x) (uint16_t(((x) >> 16) & 0xFFFF))
52 #define VSOMEIP_LONG_WORD1(x) (uint16_t((x) & 0xFFFF))
53 
54 #else
55 
56 #error "__BYTE_ORDER is not defined!"
57 
58 #endif
59 
60 #endif // VSOMEIP_V3_BYTEORDER_HPP_
61