blob: 574ef9ad2c9fdce820fc95807920f53e8efb5537 [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 Silvermand4dc1262018-09-23 16:50:34 -07009float sin_float_table[SinCosFloatTableSize() + 1]
10 __attribute__((section(".sram_l")));
11float cos_float_table[SinCosFloatTableSize() + 1]
12 __attribute__((section(".sram_l")));
Brian Silverman9ccec6e2018-10-21 22:06:35 -070013
14::std::array<GenericInitializer *, 10> global_initializers{};
Brian Silverman8d3816a2017-07-03 18:52:15 -070015
16} // namespace math_internal
17
Brian Silverman9ccec6e2018-10-21 22:06:35 -070018using math_internal::SinCosFloatTableSize;
Brian Silverman8d3816a2017-07-03 18:52:15 -070019
20__attribute__((cold)) void MathInit() {
Brian Silverman9ccec6e2018-10-21 22:06:35 -070021 for (uint32_t i = 0; i < SinCosFloatTableSize() + 1; ++i) {
Brian Silverman8d3816a2017-07-03 18:52:15 -070022 const double float_theta =
23 (static_cast<int32_t>(i) -
Brian Silverman9ccec6e2018-10-21 22:06:35 -070024 static_cast<int32_t>(SinCosFloatTableSize() / 2)) *
Brian Silverman8d3816a2017-07-03 18:52:15 -070025 static_cast<double>(math_internal::FloatMaxMagnitude()) /
Brian Silverman9ccec6e2018-10-21 22:06:35 -070026 static_cast<double>(SinCosFloatTableSize() / 2);
Brian Silverman8d3816a2017-07-03 18:52:15 -070027 math_internal::sin_float_table[i] = sin(float_theta);
28 math_internal::cos_float_table[i] = cos(float_theta);
29 }
Brian Silverman9ccec6e2018-10-21 22:06:35 -070030 for (math_internal::GenericInitializer *initializer :
31 math_internal::global_initializers) {
32 if (initializer != nullptr) {
33 initializer->Initialize();
34 }
35 }
Brian Silverman8d3816a2017-07-03 18:52:15 -070036}
37
Brian Silvermana96c1a42018-05-12 12:11:31 -070038} // namespace motors
Brian Silverman8d3816a2017-07-03 18:52:15 -070039} // namespace frc971