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