AP_HAL_ChibiOS: correct neopixel bitwidth

Use 64-bit timestamps for dshot send checks
This commit is contained in:
Andy Piper 2023-11-11 21:54:15 +00:00 committed by Randy Mackay
parent fb62a0e32c
commit 0f495be64a
2 changed files with 6 additions and 3 deletions

View File

@ -1002,6 +1002,7 @@ void RCOutput::set_group_mode(pwm_group &group)
case MODE_PROFILED: case MODE_PROFILED:
{ {
uint8_t bits_per_pixel = 24; uint8_t bits_per_pixel = 24;
uint32_t bit_width = NEOP_BIT_WIDTH_TICKS;
bool active_high = true; bool active_high = true;
if (!start_led_thread()) { if (!start_led_thread()) {
@ -1011,6 +1012,7 @@ void RCOutput::set_group_mode(pwm_group &group)
if (group.current_mode == MODE_PROFILED) { if (group.current_mode == MODE_PROFILED) {
bits_per_pixel = 25; bits_per_pixel = 25;
bit_width = PROFI_BIT_WIDTH_TICKS;
active_high = false; active_high = false;
} }
@ -1025,7 +1027,7 @@ void RCOutput::set_group_mode(pwm_group &group)
// calculate min time between pulses taking into account the DMAR parallelism // calculate min time between pulses taking into account the DMAR parallelism
const uint32_t pulse_time_us = 1000000UL * bit_length / rate; const uint32_t pulse_time_us = 1000000UL * bit_length / rate;
if (!setup_group_DMA(group, rate, NEOP_BIT_WIDTH_TICKS, active_high, buffer_length, pulse_time_us, false)) { if (!setup_group_DMA(group, rate, bit_width, active_high, buffer_length, pulse_time_us, false)) {
group.current_mode = MODE_PWM_NONE; group.current_mode = MODE_PWM_NONE;
break; break;
} }
@ -1608,7 +1610,8 @@ bool RCOutput::serial_led_send(pwm_group &group)
} }
#ifndef DISABLE_DSHOT #ifndef DISABLE_DSHOT
if (irq.waiter || (group.dshot_state != DshotState::IDLE && group.dshot_state != DshotState::RECV_COMPLETE)) { if (irq.waiter || (group.dshot_state != DshotState::IDLE && group.dshot_state != DshotState::RECV_COMPLETE)
|| AP_HAL::micros64() - group.last_dmar_send_us < (group.dshot_pulse_time_us + 50)) {
// doing serial output or DMAR input, don't send DShot pulses // doing serial output or DMAR input, don't send DShot pulses
return false; return false;
} }

View File

@ -405,7 +405,7 @@ private:
#endif #endif
// are we safe to send another pulse? // are we safe to send another pulse?
bool can_send_dshot_pulse() const { bool can_send_dshot_pulse() const {
return is_dshot_protocol(current_mode) && AP_HAL::micros() - last_dmar_send_us > (dshot_pulse_time_us + 50); return is_dshot_protocol(current_mode) && AP_HAL::micros64() - last_dmar_send_us > (dshot_pulse_time_us + 50);
} }
// return whether the group channel is both enabled in the group and for output // return whether the group channel is both enabled in the group and for output