|
@ -5,11 +5,17 @@ |
|
|
#include <thread> |
|
|
#include <thread> |
|
|
#include <string> |
|
|
#include <string> |
|
|
#include <memory> |
|
|
#include <memory> |
|
|
|
|
|
#include <algorithm> |
|
|
|
|
|
#include <iterator> |
|
|
|
|
|
|
|
|
#include <iostream> |
|
|
#include <iostream> |
|
|
|
|
|
|
|
|
namespace simon { |
|
|
namespace simon { |
|
|
namespace a4988 { |
|
|
namespace a4988 { |
|
|
|
|
|
// Anonymous namespace
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
c_allegro_4988::c_allegro_4988(std::unique_ptr<a4988_settings_t> ptr_set) |
|
|
c_allegro_4988::c_allegro_4988(std::unique_ptr<a4988_settings_t> ptr_set) |
|
|
: m_ptr_set(std::move(ptr_set)), m_initialized(false), m_alive(true) |
|
|
: m_ptr_set(std::move(ptr_set)), m_initialized(false), m_alive(true) |
|
|
{ |
|
|
{ |
|
@ -30,11 +36,22 @@ namespace simon { |
|
|
if (!set_pwm_freq(std::round(1e6/move->period_us))) { |
|
|
if (!set_pwm_freq(std::round(1e6/move->period_us))) { |
|
|
// TODO: proper error handling
|
|
|
// TODO: proper error handling
|
|
|
} |
|
|
} |
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); |
|
|
if (m_hw_pwm_possible) { |
|
|
gpioWrite(m_ptr_set->gpio_dir, move->dir); |
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
gpioSetPWMfrequency(m_ptr_set->gpio_step, m_pwm_freq); |
|
|
|
|
|
gpioPWM(m_ptr_set->gpio_step, PI_SW_PWM_RANGE/2); |
|
|
|
|
|
} |
|
|
|
|
|
gpioWrite(m_ptr_set->gpio_dir, move->dir); |
|
|
auto t_sleep = move->period_us*move->steps; |
|
|
auto t_sleep = move->period_us*move->steps; |
|
|
std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); |
|
|
std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); |
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); |
|
|
if (m_hw_pwm_possible) { |
|
|
|
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
gpioPWM(m_ptr_set->gpio_step, 0); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
else if (*cmd == "enable") { |
|
|
else if (*cmd == "enable") { |
|
|
auto enable = std::static_pointer_cast<c_enable>(cmd); |
|
|
auto enable = std::static_pointer_cast<c_enable>(cmd); |
|
@ -83,7 +100,11 @@ namespace simon { |
|
|
gpioWrite(m_ptr_set->gpio_dir, 0); |
|
|
gpioWrite(m_ptr_set->gpio_dir, 0); |
|
|
// Set PWM to 0
|
|
|
// Set PWM to 0
|
|
|
m_pwm_freq = 1000; |
|
|
m_pwm_freq = 1000; |
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); |
|
|
unsigned pwms[] = {PI_PWM_0, PI_PWM_1}; |
|
|
|
|
|
bool m_hw_pwm_possible = std::find(std::begin(pwms), std::end(pwms), m_ptr_set->gpio_step) != std::end(pwms); |
|
|
|
|
|
if (m_hw_pwm_possible) { |
|
|
|
|
|
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); |
|
|
|
|
|
} |
|
|
m_initialized = true; |
|
|
m_initialized = true; |
|
|
} |
|
|
} |
|
|
int c_allegro_4988::enable(void) |
|
|
int c_allegro_4988::enable(void) |
|
|