blob: 3f505bc73310a798ad3668fbec63d85c54239858 [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
Brian Silverman9ccec6e2018-10-21 22:06:35 -07009float sin_float_table[SinCosFloatTableSize() + 1];
10float cos_float_table[SinCosFloatTableSize() + 1];
11
12::std::array<GenericInitializer *, 10> global_initializers{};
Brian Silverman8d3816a2017-07-03 18:52:15 -070013
14} // namespace math_internal
15
Brian Silverman9ccec6e2018-10-21 22:06:35 -070016using math_internal::SinCosFloatTableSize;
Brian Silverman8d3816a2017-07-03 18:52:15 -070017
18__attribute__((cold)) void MathInit() {
Brian Silverman9ccec6e2018-10-21 22:06:35 -070019 for (uint32_t i = 0; i < SinCosFloatTableSize() + 1; ++i) {
Brian Silverman8d3816a2017-07-03 18:52:15 -070020 const double float_theta =
21 (static_cast<int32_t>(i) -
Brian Silverman9ccec6e2018-10-21 22:06:35 -070022 static_cast<int32_t>(SinCosFloatTableSize() / 2)) *
Brian Silverman8d3816a2017-07-03 18:52:15 -070023 static_cast<double>(math_internal::FloatMaxMagnitude()) /
Brian Silverman9ccec6e2018-10-21 22:06:35 -070024 static_cast<double>(SinCosFloatTableSize() / 2);
Brian Silverman8d3816a2017-07-03 18:52:15 -070025 math_internal::sin_float_table[i] = sin(float_theta);
26 math_internal::cos_float_table[i] = cos(float_theta);
27 }
Brian Silverman9ccec6e2018-10-21 22:06:35 -070028 for (math_internal::GenericInitializer *initializer :
29 math_internal::global_initializers) {
30 if (initializer != nullptr) {
31 initializer->Initialize();
32 }
33 }
Brian Silverman8d3816a2017-07-03 18:52:15 -070034}
35
Brian Silvermana96c1a42018-05-12 12:11:31 -070036} // namespace motors
Brian Silverman8d3816a2017-07-03 18:52:15 -070037} // namespace frc971