This commit is contained in:
2017-06-28 20:40:01 +02:00
parent 76dd61f48b
commit 8d2b664149
41 changed files with 5225 additions and 0 deletions

109
kawaii/gpio.cpp Normal file
View File

@@ -0,0 +1,109 @@
#include "gpio.hpp"
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <string>
using namespace std;
static string construct_filename(const string &prefix, int pin, const string &suffix)
{
stringstream filename;
filename << prefix << pin << suffix;
return filename.str();
}
gpio::gpio(int pin, pin_direction direction, pin_type type, bool default_state)
: pin(pin),
direction(direction),
type(type),
current_state(false)
{
ofstream export_file("/sys/class/gpio/export");
export_file << pin;
export_file.close();
ofstream direction_file(construct_filename("/sys/class/gpio/gpio", pin, "/direction").c_str());
if (direction == pin_direction::INPUT)
{
direction_file << "in";
}
else
{
direction_file << "out";
}
direction_file.close();
if (direction == pin_direction::OUTPUT)
{
set_value(default_state, false);
}
}
gpio::gpio(gpio&& old)
: pin(old.pin),
direction(old.direction),
type(old.type),
current_state(old.current_state)
{
old.pin = -1;
}
gpio::~gpio()
{
if (pin != -1)
{
ofstream unexport_file("/sys/class/gpio/unexport");
unexport_file << pin;
}
}
void gpio::set_value(bool on, bool use_cache)
{
if (pin == -1)
throw logic_error("Usage of moved gpio");
if (direction == pin_direction::INPUT)
{
stringstream errormsg;
errormsg << "Cannot write to input pin " << pin;
throw logic_error(errormsg.str());
}
if (!use_cache || current_state != on)
{
bool value;
if (type == pin_type::HIGH_ON)
value = on;
else
value = !on;
ofstream value_file(construct_filename("/sys/class/gpio/gpio", pin, "/value"));
value_file << value;
}
current_state = on;
}
void gpio::set_value(bool on)
{
set_value(on, true);
}
bool gpio::get_value()
{
if (pin == -1)
throw logic_error("Usage of moved gpio");
if (direction == pin_direction::OUTPUT)
return current_state;
ifstream value_file(construct_filename("/sys/class/gpio/gpio", pin, "/value"));
bool value;
value_file >> value;
bool on;
if (type == pin_type::HIGH_ON)
on = value;
else
on = !value;
return on;
}
int gpio::get_pin() const
{
return pin;
}