12 void run(
const void* argument) {
25 Derived* derived =
static_cast<Derived*
>(
this);
26 TickType_t xLastWakeTime;
27 static_assert(Derived::LOOP_PERIOD_MS != 0);
28 const TickType_t xFrequency = pdMS_TO_TICKS(Derived::LOOP_PERIOD_MS);
29 xLastWakeTime = xTaskGetTickCount();
32 if (derived->exit_calibrate_cond()) {
37 vTaskDelayUntil(&xLastWakeTime, xFrequency);
42 vTaskDelayUntil(&xLastWakeTime, xFrequency);
59 Derived* derived =
static_cast<Derived*
>(
this);
63 void drive(
float vx,
float vy,
float wz) {
64 Derived* derived =
static_cast<Derived*
>(
this);
65 derived->get_motor_feedback();
66 derived->calc_motor_outputs(vx, vy, wz);
67 derived->send_motor_messages();
70 float get_power_consumption() {
71 Derived* derived =
static_cast<Derived*
>(
this);
72 return derived->calc_power_consumption();
75 void set_max_power(
float new_max_power) {
76 Derived* derived =
static_cast<Derived*
>(
this);
77 derived->set_max_power_impl(new_max_power);