diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..51fac7f --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ + +main + +# Created by https://www.toptal.com/developers/gitignore/api/c++ +# Edit at https://www.toptal.com/developers/gitignore?templates=c++ + +### C++ ### +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# End of https://www.toptal.com/developers/gitignore/api/c++ diff --git a/drivers/a4988.cpp b/drivers/a4988.cpp new file mode 100644 index 0000000..5adf0db --- /dev/null +++ b/drivers/a4988.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +#include + +namespace simon { + c_allegro_4988::c_allegro_4988(a4988_settings_t* pset) + : m_pset(pset), m_initialized(false), m_alive(true) + { + + } + void c_allegro_4988::run(void) + { + if (!m_initialized) { + initialize(); + } + while(m_alive) + { + std::cout << "In thread" << std::endl; + if (!m_queue.empty()) { + auto& move = m_queue.front(); + if (!set_pwm_freq(std::round(1e6/move.period_us))) { + // TODO: proper error handling + } + gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); + gpioWrite(m_pset->gpio_dir, move.dir); + std::cout << move.period_us << " - " << move.steps << std::endl; + auto t_sleep = move.period_us*move.steps; + std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); + gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, 0); + m_queue.pop(); + } + else { + m_alive = false; + } + } + } + void c_allegro_4988::post(move_t move) + { + m_queue.push(move); + } + void c_allegro_4988::initialize(void) + { + // TODO: proper error management throwing exceptions + if(m_pset == nullptr) { + return; + } + // Configure clock source for PWM + gpioCfgClock(CFG_SAMPLE_RATE_US, CFG_PERIPHERAL_SRC_PCM, CFG_DEPRECATED_ARG); + // Initialize pigpio library + gpioInitialise(); + // Configure as outputs + gpioSetMode(m_pset->gpio_en, PI_OUTPUT); + gpioSetMode(m_pset->gpio_dir, PI_OUTPUT); + // Initialize outputs + enable(); + gpioWrite(m_pset->gpio_dir, 0); + // Set PWM to 0 + m_pwm_freq = 1000; + gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, 0); + m_initialized = true; + } + int c_allegro_4988::enable(void) + { + // TODO: proper error handling + gpioWrite(m_pset->gpio_en, 0); + return 0; + } + int c_allegro_4988::disable(void) + { + // TODO: proper error handling + gpioWrite(m_pset->gpio_en, 1); + return 0; + } + int c_allegro_4988::set_pwm_freq(const unsigned pwm_freq) + { + if (pwm_freq > PI_HW_PWM_MAX_FREQ) { + return 1; + } + m_pwm_freq = pwm_freq; + return 0; + } + +} diff --git a/include/a4988.h b/include/a4988.h new file mode 100644 index 0000000..368c11d --- /dev/null +++ b/include/a4988.h @@ -0,0 +1,49 @@ +#ifndef INCLUDED_DRIVER_ALLEGRO_4988 +#define INCLUDED_DRIVER_ALLEGRO_4988 + +#define CFG_SAMPLE_RATE_US 5 +#define CFG_PERIPHERAL_SRC_PCM 1 +#define CFG_DEPRECATED_ARG 0 + +#include + +namespace simon { + + typedef struct + { + const unsigned gpio_en; + const unsigned gpio_step; + const unsigned gpio_dir; + const bool gpio_microsteps[3]; + } a4988_settings_t; + + typedef struct + { + unsigned steps; + bool dir; + unsigned period_us; + } move_t; + + + class c_allegro_4988 + { + public: + c_allegro_4988(a4988_settings_t* set); + int enable(void); + int disable(void); + void post(move_t move); + void run(void); + private: + a4988_settings_t* m_pset; + bool m_initialized; + std::queue m_queue; + unsigned m_pwm_freq; + bool m_alive; + private: + void initialize(void); + int set_pwm_freq(const unsigned pwm_freq); + }; + +} // namespace simon + +#endif /*INCLUDED_DRIVER_ALLEGRO_4988*/ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..ea6e46f --- /dev/null +++ b/main.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +int main() +{ + using namespace simon; + a4988_settings_t a4988_set{ + .gpio_en = 17, + .gpio_step = 18, + .gpio_dir = 22, + .gpio_microsteps{ + true, true, true + } + }; + c_allegro_4988 a4988(&a4988_set); + move_t move{32768, true, 100}; + std::thread t1(std::bind(&c_allegro_4988::run, &a4988)); + a4988.post(move); + t1.join(); + std::cout << "Hello camera" << std::endl; + return 0; +}