summaryrefslogtreecommitdiff
path: root/include/angle_utils.h
blob: 22c08956a48d5571afad2b17f3eda12222786b3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifndef _ANGLE_UTILS_H_
#define _ANGLE_UTILS_H_

#include "global.h"
#include "types.h"

#define VAR_ADD(x, y)  ((x) += (y))
#define VAR_SUB(x, y)  ((x) -= (y))
#define VAR_MULT(x, y) ((x) *= (y))

#define VAR_ADD_CAST(x, y, t)  ((x) += (t)(y))
#define VAR_SUB_CAST(x, y, t)  ((x) -= (t)(y))
#define VAR_MULT_CAST(x, y, t) ((x) *= (t)(y))

#define S8_ADD(x, y)  VAR_ADD_CAST(x, y, s8)
#define U8_ADD(x, y)  VAR_ADD_CAST(x, y, u8)
#define S16_ADD(x, y) VAR_ADD_CAST(x, y, s16)
#define U16_ADD(x, y) VAR_ADD_CAST(x, y, u16)
#define S32_ADD(x, y) VAR_ADD_CAST(x, y, s32)
#define U32_ADD(x, y) VAR_ADD_CAST(x, y, u32)

#define S8_SUB(x, y)  VAR_SUB_CAST(x, y, s8)
#define U8_SUB(x, y)  VAR_SUB_CAST(x, y, u8)
#define S16_SUB(x, y) VAR_SUB_CAST(x, y, s16)
#define U16_SUB(x, y) VAR_SUB_CAST(x, y, u16)
#define S32_SUB(x, y) VAR_SUB_CAST(x, y, s32)
#define U32_SUB(x, y) VAR_SUB_CAST(x, y, u32)

#define S8_MULT(x, y)  VAR_MULT_CAST(x, y, s8)
#define U8_MULT(x, y)  VAR_MULT_CAST(x, y, u8)
#define S16_MULT(x, y) VAR_MULT_CAST(x, y, s16)
#define U16_MULT(x, y) VAR_MULT_CAST(x, y, u16)
#define S32_MULT(x, y) VAR_MULT_CAST(x, y, s32)
#define U32_MULT(x, y) VAR_MULT_CAST(x, y, u32)

#define ANGLE_ADD  S16_ADD
#define ANGLE_SUB  S16_SUB
#define ANGLE_MULT S16_MULT

// There are some angles that weren't sign-extended until the shield version
#if !PLATFORM_SHIELD
    #define S8_ADD_2   VAR_ADD
    #define U8_ADD_2   VAR_ADD
    #define S16_ADD_2  VAR_ADD
    #define U16_ADD_2  VAR_ADD
    #define S32_ADD_2  VAR_ADD
    #define U32_ADD_2  VAR_ADD
    
    #define S8_SUB_2   VAR_SUB
    #define U8_SUB_2   VAR_SUB
    #define S16_SUB_2  VAR_SUB
    #define U16_SUB_2  VAR_SUB
    #define S32_SUB_2  VAR_SUB
    #define U32_SUB_2  VAR_SUB

    #define S8_MULT_2  VAR_MULT
    #define U8_MULT_2  VAR_MULT
    #define S16_MULT_2 VAR_MULT
    #define U16_MULT_2 VAR_MULT
    #define S32_MULT_2 VAR_MULT
    #define U32_MULT_2 VAR_MULT
#else
    #define S8_ADD_2   S8_ADD
    #define U8_ADD_2   U8_ADD
    #define S16_ADD_2  S16_ADD
    #define U16_ADD_2  U16_ADD
    #define S32_ADD_2  S32_ADD
    #define U32_ADD_2  U32_ADD

    #define S8_SUB_2   S8_SUB
    #define U8_SUB_2   U8_SUB
    #define S16_SUB_2  S16_SUB
    #define U16_SUB_2  U16_SUB
    #define S32_SUB_2  S32_SUB
    #define U32_SUB_2  U32_SUB

    #define S8_MULT_2  S8_MULT
    #define U8_MULT_2  U8_MULT
    #define S16_MULT_2 S16_MULT
    #define U16_MULT_2 U16_MULT
    #define S32_MULT_2 S32_MULT
    #define U32_MULT_2 U32_MULT
#endif

#define ANGLE_ADD_2  S16_ADD_2
#define ANGLE_SUB_2  S16_SUB_2
#define ANGLE_MULT_2 S16_MULT_2

#endif // !_ANGLE_UTILS_H_