I think it should be similar to networking code - and there is no need to
implement that there.
I'm still curious as to why we would get an interrupt because state changes
on IO pins (but that has nothing to do with boost). But as I said I have
been to busy the last week to try it out on a raspberry.
Also note that I have not thought the destruction faze through. So you
might crash there..
2015-03-16 14:18 GMT+01:00 Kyle Edwards
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
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users