blob: 8441e97dbbe1422129fdc199ff86a207587ecc4a [file] [log] [blame]
Brian Silverman8d3816a2017-07-03 18:52:15 -07001#include "motors/math.h"
2
3#include <math.h>
4
5namespace frc971 {
Brian Silvermana96c1a42018-05-12 12:11:31 -07006namespace motors {
Brian Silverman8d3816a2017-07-03 18:52:15 -07007namespace math_internal {
8
9float sin_int_table[SinCosTableSize()];
10float cos_int_table[SinCosTableSize()];
11float sin_float_table[SinCosTableSize() + 1];
12float cos_float_table[SinCosTableSize() + 1];
13
14} // namespace math_internal
15
16using math_internal::SinCosTableSize;
17
18__attribute__((cold)) void MathInit() {
19 for (uint32_t i = 0; i < SinCosTableSize(); ++i) {
20 const double int_theta =
21 ((static_cast<double>(i) + 0.5) / SinCosTableSize()) * 2.0 * M_PI;
22 math_internal::sin_int_table[i] = sin(int_theta);
23 math_internal::cos_int_table[i] = cos(int_theta);
24 }
25 for (uint32_t i = 0; i < SinCosTableSize() + 1; ++i) {
26 const double float_theta =
27 (static_cast<int32_t>(i) -
28 static_cast<int32_t>(SinCosTableSize() / 2)) *
29 static_cast<double>(math_internal::FloatMaxMagnitude()) /
30 static_cast<double>(SinCosTableSize() / 2);
31 math_internal::sin_float_table[i] = sin(float_theta);
32 math_internal::cos_float_table[i] = cos(float_theta);
33 }
34}
35
Brian Silvermana96c1a42018-05-12 12:11:31 -070036} // namespace motors
Brian Silverman8d3816a2017-07-03 18:52:15 -070037} // namespace frc971