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 | |
Brian Silverman | d4dc126 | 2018-09-23 16:50:34 -0700 | [diff] [blame] | 9 | float sin_float_table[SinCosFloatTableSize() + 1] |
| 10 | __attribute__((section(".sram_l"))); |
| 11 | float cos_float_table[SinCosFloatTableSize() + 1] |
| 12 | __attribute__((section(".sram_l"))); |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 13 | |
| 14 | ::std::array<GenericInitializer *, 10> global_initializers{}; |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 15 | |
| 16 | } // namespace math_internal |
| 17 | |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 18 | using math_internal::SinCosFloatTableSize; |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 19 | |
| 20 | __attribute__((cold)) void MathInit() { |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 21 | for (uint32_t i = 0; i < SinCosFloatTableSize() + 1; ++i) { |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 22 | const double float_theta = |
| 23 | (static_cast<int32_t>(i) - |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 24 | static_cast<int32_t>(SinCosFloatTableSize() / 2)) * |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 25 | static_cast<double>(math_internal::FloatMaxMagnitude()) / |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 26 | static_cast<double>(SinCosFloatTableSize() / 2); |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 27 | math_internal::sin_float_table[i] = sin(float_theta); |
| 28 | math_internal::cos_float_table[i] = cos(float_theta); |
| 29 | } |
Brian Silverman | 9ccec6e | 2018-10-21 22:06:35 -0700 | [diff] [blame] | 30 | for (math_internal::GenericInitializer *initializer : |
| 31 | math_internal::global_initializers) { |
| 32 | if (initializer != nullptr) { |
| 33 | initializer->Initialize(); |
| 34 | } |
| 35 | } |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 36 | } |
| 37 | |
Brian Silverman | a96c1a4 | 2018-05-12 12:11:31 -0700 | [diff] [blame] | 38 | } // namespace motors |
Brian Silverman | 8d3816a | 2017-07-03 18:52:15 -0700 | [diff] [blame] | 39 | } // namespace frc971 |