blob: 5eac81300618710d5226b4cd498eae1915c75a14 [file] [log] [blame]
Brian Silverman8d3816a2017-07-03 18:52:15 -07001#include "motors/math.h"
2
3#include <math.h>
4
Stephan Pleinesf63bde82024-01-13 15:59:33 -08005namespace frc971::motors {
Brian Silverman8d3816a2017-07-03 18:52:15 -07006namespace math_internal {
7
Brian Silvermand4dc1262018-09-23 16:50:34 -07008float sin_float_table[SinCosFloatTableSize() + 1]
9 __attribute__((section(".sram_l")));
10float cos_float_table[SinCosFloatTableSize() + 1]
11 __attribute__((section(".sram_l")));
Brian Silverman9ccec6e2018-10-21 22:06:35 -070012
13::std::array<GenericInitializer *, 10> global_initializers{};
Brian Silverman8d3816a2017-07-03 18:52:15 -070014
15} // namespace math_internal
16
Brian Silverman9ccec6e2018-10-21 22:06:35 -070017using math_internal::SinCosFloatTableSize;
Brian Silverman8d3816a2017-07-03 18:52:15 -070018
19__attribute__((cold)) void MathInit() {
Brian Silverman9ccec6e2018-10-21 22:06:35 -070020 for (uint32_t i = 0; i < SinCosFloatTableSize() + 1; ++i) {
Brian Silverman8d3816a2017-07-03 18:52:15 -070021 const double float_theta =
22 (static_cast<int32_t>(i) -
Brian Silverman9ccec6e2018-10-21 22:06:35 -070023 static_cast<int32_t>(SinCosFloatTableSize() / 2)) *
Brian Silverman8d3816a2017-07-03 18:52:15 -070024 static_cast<double>(math_internal::FloatMaxMagnitude()) /
Brian Silverman9ccec6e2018-10-21 22:06:35 -070025 static_cast<double>(SinCosFloatTableSize() / 2);
Brian Silverman8d3816a2017-07-03 18:52:15 -070026 math_internal::sin_float_table[i] = sin(float_theta);
27 math_internal::cos_float_table[i] = cos(float_theta);
28 }
Brian Silverman9ccec6e2018-10-21 22:06:35 -070029 for (math_internal::GenericInitializer *initializer :
30 math_internal::global_initializers) {
31 if (initializer != nullptr) {
32 initializer->Initialize();
33 }
34 }
Brian Silverman8d3816a2017-07-03 18:52:15 -070035}
36
Stephan Pleinesf63bde82024-01-13 15:59:33 -080037} // namespace frc971::motors