| #ifndef MOTORS_ALGORITHMS_H_ |
| #define MOTORS_ALGORITHMS_H_ |
| |
| #include <stdint.h> |
| #include <array> |
| |
| namespace frc971 { |
| namespace motors { |
| |
| struct ReadingsToBalance { |
| // Adds a single reading at index. |
| void Add(int index, int32_t value) { |
| sums[index] += value; |
| ++weights[index]; |
| } |
| |
| int32_t sums[3]; |
| int weights[3]; |
| }; |
| |
| struct BalancedReadings { |
| float readings[3]; |
| }; |
| |
| // Returns three readings which add up to 0 and are the same distances apart as |
| // the input ones (by weight). The distances between the averages of the inputs |
| // and the corresponding outputs will be inversely proportional to the weights. |
| BalancedReadings BalanceReadings(ReadingsToBalance to_balance); |
| |
| inline BalancedReadings BalanceSimpleReadings( |
| const ::std::array<float, 3> readings) { |
| float offset = 0; |
| for (int i = 0; i < 3; ++i) { |
| offset += readings[i]; |
| } |
| |
| offset = offset / 3.0f; |
| |
| BalancedReadings r; |
| for (int i = 0; i < 3; ++i) { |
| r.readings[i] = static_cast<float>(readings[i]) - offset; |
| } |
| return r; |
| } |
| |
| inline BalancedReadings BalanceSimpleReadings(const uint16_t readings[3]) { |
| float offset = 0; |
| for (int i = 0; i < 3; ++i) { |
| offset += static_cast<float>(readings[i]); |
| } |
| |
| BalancedReadings r; |
| for (int i = 0; i < 3; ++i) { |
| r.readings[i] = static_cast<float>(readings[i]) + offset / -3; |
| } |
| return r; |
| } |
| |
| } // namespace motors |
| } // namespace frc971 |
| |
| #endif // MOTORS_ALGORITHMS_H_ |