4 changed files with 201 additions and 0 deletions
			
			
		@ -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++ | 
				
			||||
@ -0,0 +1,87 @@ | 
				
			|||||
 | 
					#include <include/a4988.h> | 
				
			||||
 | 
					#include <pigpio.h> | 
				
			||||
 | 
					#include <queue> | 
				
			||||
 | 
					#include <cmath> | 
				
			||||
 | 
					#include <thread> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#include <iostream> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
@ -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 <queue> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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<move_t> 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*/ | 
				
			||||
@ -0,0 +1,24 @@ | 
				
			|||||
 | 
					#include <iostream> | 
				
			||||
 | 
					#include <include/a4988.h> | 
				
			||||
 | 
					#include <thread> | 
				
			||||
 | 
					#include <functional> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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; | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue