Maximilian Stiefel
4 years ago
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