19 _msg = msg + strerror(abs(err));
22 const char* what()
const throw() {
35void gpio_BBB::irq_handler() {
37 int gpio = read(_fd_gpio, NULL, 0);
39 if (gpio < 0 || gpio >= GPIO_COUNT)
break;
41 if (usrHandler[gpio]) usrHandler[gpio](gpio, NULL);
47 for (
int i=0; i < GPIO_COUNT; ++i)
50 _fd_gpio = open(
"/dev/" GPIO_DEV_NAME, O_RDWR );
52 throw gpio_exception(
"Cannot open /dev/" GPIO_DEV_NAME
", ", errno);
56 irq_thread = std::thread([&](){ irq_handler();} );
59gpio_BBB::~gpio_BBB() {
62 write(_fd_gpio, NULL, 0);
70void gpio_BBB::gpioMode (gpio_pin_t gpio, gpio_mode_t mode) {
71 if (gpio >= GPIO_COUNT) {
74 int ret = ioctl(_fd_gpio, IOCTL_GPIO_MODE, GPIO_DATA(gpio, mode));
80bool gpio_BBB::gpioRead (gpio_pin_t gpio) {
81 return ioctl(_fd_gpio, IOCTL_GPIO_READ, gpio);
84void gpio_BBB::gpioWrite (gpio_pin_t gpio,
bool value) {
85 int ret = ioctl(_fd_gpio, IOCTL_GPIO_WRITE, GPIO_DATA(gpio, value));
91void gpio_BBB::gpioToggle (gpio_pin_t gpio) {
92 int ret = ioctl(_fd_gpio, IOCTL_GPIO_TOGGLE, gpio);
101void gpio_BBB::gpioAttachIrq (gpio_pin_t gpio, gpio_irq_t mode,
102 void (*handler)(gpio_pin_t,
void *),
void * arg) {
103 if (gpio >= GPIO_COUNT) {
106 usrHandler[gpio] = handler;
107 int ret = ioctl(_fd_gpio, IOCTL_GPIO_ATTACH_IRQ, GPIO_DATA(gpio, mode));
114void gpio_BBB::gpioDetachIrq (gpio_pin_t gpio) {
115 gpioDisableIrq(gpio);
116 usrHandler[gpio] = 0;
117 int ret = ioctl(_fd_gpio, IOCTL_GPIO_DETACH_IRQ, gpio);
123void gpio_BBB::gpioEnableIrq (gpio_pin_t gpio) {
124 int ret = ioctl(_fd_gpio, IOCTL_GPIO_ENABLE_IRQ, gpio);
130void gpio_BBB::gpioDisableIrq(gpio_pin_t gpio) {
131 int ret = ioctl(_fd_gpio, IOCTL_GPIO_DISABLE_IRQ, gpio);
137void gpio_BBB::setDebounce (uint8_t gpio, uint16_t msdelay) {
138 int ret = ioctl(_fd_gpio, IOCTL_SET_DEBOUNCE, GPIO_DATA(gpio, msdelay));