Sorry for not replying earlier but I have not yet gotten any time to
actually try it out on a raspberry.
Hopefully tonight.... anyway - if the original code worked then the
following "could" there is probably mistakes since I compiled this on
windows and the ::open call in not working there...
#include
#include <iostream>
#include
#include
#include
#include
class gpio_interrupt
{
public:
gpio_interrupt(boost::asio::io_service &ios, unsigned int number) :
_socket(ios)
{
open(number);
}
~gpio_interrupt()
{
close();
}
void open(unsigned int number)
{
boost::system::error_code ec;
open(number, ec);
boost::asio::detail::throw_error(ec, "open");
}
void open(unsigned int number, boost::system::error_code& ec)
{
std::ostringstream filename;
filename << "/sys/class/gpio/gpio" << number << "/value";
int fd = ::open(filename.str().c_str(), O_RDONLY | O_NONBLOCK);
if (fd < 0)
{
ec = boost::system::error_code(errno,
boost::asio::error::get_system_category());
return;
}
_socket.assign(boost::asio::ip::udp::v4(), fd, ec);
}
void close()
{
boost::system::error_code ec;
cancel(ec);
boost::asio::detail::throw_error(ec, "close");
}
void close(boost::system::error_code& ec)
{
cancel(ec);
}
void cancel()
{
boost::system::error_code ec;
_socket.cancel(ec);
boost::asio::detail::throw_error(ec, "close");
}
void cancel(boost::system::error_code& ec)
{
_socket.cancel(ec);
}
void async_wait(boost::function
cb) {
_socket.async_receive(boost::asio::null_buffers(), [cb](const
boost::system::error_code& ec, std::size_t bytes_transferred)
{
cb(ec);
});
}
private:
boost::asio::ip::udp::socket _socket;
};
int main(int argc, char **argv)
{
boost::asio::io_service ios;
boost::asio::io_service::work work(ios);
boost::thread thread(boost::bind(&boost::asio::io_service::run, &ios));
gpio_interrupt interrupt(ios, 21);
interrupt.async_wait([](const boost::system::error_code& ec)
{
if (ec)
{
std::cout << ec.message() << std::endl;
return;
}
std::cout << "Pin changed state" << std::endl;
});
while (true)
{
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
// just dummy - do something else here...
}
ios.stop();
thread.join();
return 0;
}