Browse Source

Initial commit

feature/build_system
Maximilian Stiefel 4 years ago
parent
commit
aef254b8bc
  1. 41
      .gitignore
  2. 87
      drivers/a4988.cpp
  3. 49
      include/a4988.h
  4. 24
      main.cpp

41
.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++

87
drivers/a4988.cpp

@ -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;
}
}

49
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 <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*/

24
main.cpp

@ -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…
Cancel
Save