Arduino_VESC_Library
vesc_utility.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the arduino vesc library (https://github.com/arduino_vesc)
3  *
4  * Copyright (c) 2019 Gianmarco Vitelli
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, version 3.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 #include <Arduino.h>
19 #include <math.h>
20 #include <stdbool.h>
21 #include "vesc_utility.h"
22 
30 void VescUtility::utility_append_int16(uint8_t* buffer, int16_t number, int32_t *index) {
31  buffer[(*index)++] = number >> 8;
32  buffer[(*index)++] = number;
33 }
34 
42 void VescUtility::utility_append_uint16(uint8_t* buffer, uint16_t number, int32_t *index) {
43  buffer[(*index)++] = number >> 8;
44  buffer[(*index)++] = number;
45 }
46 
54 void VescUtility::utility_append_int32(uint8_t* buffer, int32_t number, int32_t *index) {
55  buffer[(*index)++] = number >> 24;
56  buffer[(*index)++] = number >> 16;
57  buffer[(*index)++] = number >> 8;
58  buffer[(*index)++] = number;
59 }
60 
68 void VescUtility::utility_append_uint32(uint8_t* buffer, uint32_t number, int32_t *index) {
69  buffer[(*index)++] = number >> 24;
70  buffer[(*index)++] = number >> 16;
71  buffer[(*index)++] = number >> 8;
72  buffer[(*index)++] = number;
73 }
74 
83 void VescUtility::utility_append_float16(uint8_t* buffer, float number, float scale, int32_t *index) {
84  VescUtility::utility_append_int16(buffer, (int16_t)(number * scale), index);
85 }
86 
95 void VescUtility::utility_append_float32(uint8_t* buffer, float number, float scale, int32_t *index) {
96  VescUtility::utility_append_int32(buffer, (int32_t)(number * scale), index);
97 }
98 
106 void VescUtility::utility_append_float32_auto(uint8_t* buffer, float number, int32_t *index) {
107  int e = 0;
108  float sig = frexpf(number, &e);
109  float sig_abs = fabsf(sig);
110  uint32_t sig_i = 0;
111 
112  if (sig_abs >= 0.5) {
113  sig_i = (uint32_t)((sig_abs - 0.5f) * 2.0f * 8388608.0f);
114  e += 126;
115  }
116 
117  uint32_t res = ((e & 0xFF) << 23) | (sig_i & 0x7FFFFF);
118  if (sig < 0) {
119  res |= 1U << 31;
120  }
121 
122  VescUtility::utility_append_uint32(buffer, res, index);
123 }
124 
132 int16_t VescUtility::utility_get_int16(const uint8_t *buffer, int32_t *index) {
133  int16_t res = ((uint16_t) buffer[*index]) << 8 |
134  ((uint16_t) buffer[*index + 1]);
135  *index += 2;
136  return res;
137 }
138 
146 uint16_t VescUtility::utility_get_uint16(const uint8_t *buffer, int32_t *index) {
147  uint16_t res = ((uint16_t) buffer[*index]) << 8 |
148  ((uint16_t) buffer[*index + 1]);
149  *index += 2;
150  return res;
151 }
152 
160 int32_t VescUtility::utility_get_int32(const uint8_t *buffer, int32_t *index) {
161  int32_t res = ((uint32_t) buffer[*index]) << 24 |
162  ((uint32_t) buffer[*index + 1]) << 16 |
163  ((uint32_t) buffer[*index + 2]) << 8 |
164  ((uint32_t) buffer[*index + 3]);
165  *index += 4;
166  return res;
167 }
168 
176 uint32_t VescUtility::utility_get_uint32(const uint8_t *buffer, int32_t *index) {
177  uint32_t res = ((uint32_t) buffer[*index]) << 24 |
178  ((uint32_t) buffer[*index + 1]) << 16 |
179  ((uint32_t) buffer[*index + 2]) << 8 |
180  ((uint32_t) buffer[*index + 3]);
181  *index += 4;
182  return res;
183 }
184 
193 float VescUtility::utility_get_float16(const uint8_t *buffer, float scale, int32_t *index) {
194  return VescUtility::utility_get_int16(buffer, index) / scale;
195 }
196 
205 float VescUtility::utility_get_float32(const uint8_t *buffer, float scale, int32_t *index) {
206  return VescUtility::utility_get_int32(buffer, index) / scale;
207 }
208 
216 float VescUtility::utility_get_float32_auto(const uint8_t *buffer, int32_t *index) {
217  uint32_t res = VescUtility::utility_get_uint32(buffer, index);
218 
219  int e = (res >> 23) & 0xFF;
220  uint32_t sig_i = res & 0x7FFFFF;
221  bool neg = res & (1U << 31);
222 
223  float sig = 0.0;
224  if (e != 0 || sig_i != 0) {
225  sig = (float)sig_i / (8388608.0 * 2.0) + 0.5;
226  e -= 126;
227  }
228 
229  if (neg) {
230  sig = -sig;
231  }
232 
233  return ldexpf(sig, e);
234 }
VescUtility::utility_append_int32
static void utility_append_int32(uint8_t *buffer, int32_t number, int32_t *index)
append int32 to buffer
Definition: vesc_utility.cpp:54
VescUtility::utility_get_float16
static float utility_get_float16(const uint8_t *buffer, float scale, int32_t *index)
get float16 from buffer
Definition: vesc_utility.cpp:193
vesc_utility.h
VescUtility::utility_get_uint32
static uint32_t utility_get_uint32(const uint8_t *buffer, int32_t *index)
get uint32_t from buffer
Definition: vesc_utility.cpp:176
VescUtility::utility_get_int32
static int32_t utility_get_int32(const uint8_t *buffer, int32_t *index)
get int32_t from buffer
Definition: vesc_utility.cpp:160
VescUtility::utility_append_float16
static void utility_append_float16(uint8_t *buffer, float number, float scale, int32_t *index)
append float16 to buffer
Definition: vesc_utility.cpp:83
VescUtility::utility_append_int16
static void utility_append_int16(uint8_t *buffer, int16_t number, int32_t *index)
append int16 to buffer
Definition: vesc_utility.cpp:30
VescUtility::utility_get_float32_auto
static float utility_get_float32_auto(const uint8_t *buffer, int32_t *index)
get float32 from buffer auto scale
Definition: vesc_utility.cpp:216
VescUtility::utility_get_float32
static float utility_get_float32(const uint8_t *buffer, float scale, int32_t *index)
get float32 from buffer
Definition: vesc_utility.cpp:205
VescUtility::utility_get_uint16
static uint16_t utility_get_uint16(const uint8_t *buffer, int32_t *index)
get uint16_t from buffer
Definition: vesc_utility.cpp:146
VescUtility::utility_append_uint16
static void utility_append_uint16(uint8_t *buffer, uint16_t number, int32_t *index)
append uint16 to buffer
Definition: vesc_utility.cpp:42
VescUtility::utility_append_float32
static void utility_append_float32(uint8_t *buffer, float number, float scale, int32_t *index)
append float32 to buffer
Definition: vesc_utility.cpp:95
VescUtility::utility_append_float32_auto
static void utility_append_float32_auto(uint8_t *buffer, float number, int32_t *index)
append float32 to buffer auto scale
Definition: vesc_utility.cpp:106
VescUtility::utility_append_uint32
static void utility_append_uint32(uint8_t *buffer, uint32_t number, int32_t *index)
append uint32 to buffer
Definition: vesc_utility.cpp:68
VescUtility::utility_get_int16
static int16_t utility_get_int16(const uint8_t *buffer, int32_t *index)
get int16 from buffer
Definition: vesc_utility.cpp:132