Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 1 | #include "motors/math.h" |
| 2 | |
| 3 | #include <math.h> |
| 4 | |
| 5 | namespace frc971 { |
Brian Silverman | a96c1a4 | 2018-05-12 12:11:31 -0700 | [diff] [blame] | 6 | namespace motors { |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 7 | namespace math_internal { |
| 8 | |
| 9 | float sin_int_table[SinCosTableSize()]; |
| 10 | float cos_int_table[SinCosTableSize()]; |
| 11 | float sin_float_table[SinCosTableSize() + 1]; |
| 12 | float cos_float_table[SinCosTableSize() + 1]; |
| 13 | |
| 14 | } // namespace math_internal |
| 15 | |
| 16 | using 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 Silverman | a96c1a4 | 2018-05-12 12:11:31 -0700 | [diff] [blame] | 36 | } // namespace motors |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 37 | } // namespace frc971 |