Haven't tested it, but at first glance it looks correct. So you don't think there's a need to implement service and all that, like I did in my code? Kyle On Mon, 2015-03-16 at 12:27 +0100, svante karlsson wrote:
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; }
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users