void KnxConnection::Run (pth_sem_t * stop1) { if (url_m == "") return; stop_m = pth_event (PTH_EVENT_SEM, stop1); bool retry = true; while (retry) { con_m = EIBSocketURL(url_m.c_str()); if (con_m) { EIBSetEvent (con_m, stop_m); if (EIBOpen_GroupSocket (con_m, 0) != -1) { logger_m.infoStream() << "KnxConnection: Group socket opened. Waiting for messages." << endlog; // If scope reached this point, there is no doubt that the // connection with the bus is up and ready. isReady_m = true; int retval; while ((retval = checkInput()) > 0) { /* TODO: find another way to check if event occured struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; pth_select_ev(0,0,0,0,&tv,stop); */ } if (retval == -1) retry = false; } else logger_m.errorStream() << "Failed to open group socket." << endlog; if (con_m) EIBClose(con_m); con_m = 0; } else logger_m.errorStream() << "Failed to open knxConnection url." << endlog; if (retry) { struct timeval tv; tv.tv_sec = 60; tv.tv_usec = 0; pth_select_ev(0,0,0,0,&tv,stop_m); if (pth_event_status (stop_m) == PTH_STATUS_OCCURRED) retry = false; } } logger_m.infoStream() << "Out of KnxConnection loop." << endlog; pth_event_free (stop_m, PTH_FREE_THIS); stop_m = 0; }
int TcpClientIOPort::get(uint8_t* buf, int len, pth_event_t stop) { logger_m.debugStream() << "get(buf, len=" << len << ")" << endlog; bool retry = true; while (retry) { Socket so(this); if (so.sockfd_m >= 0) { ssize_t i = pth_read_ev(so.sockfd_m, buf, len, stop); logger_m.debugStream() << "Out of read " << i << endlog; if (i > 0) { std::string msg(reinterpret_cast<const char*>(buf), i); logger_m.debugStream() << "Received '" << msg << "' on ioport " << getID() << endlog; return i; } else { if (pth_event_status (stop) == PTH_STATUS_OCCURRED) retry = false; else if (permanent_m && permanentSockfd_m >= 0) { close(permanentSockfd_m); permanentSockfd_m = -1; } } } else { struct timeval tv; tv.tv_sec = 60; tv.tv_usec = 0; pth_select_ev(0,0,0,0,&tv,stop); if (pth_event_status (stop) == PTH_STATUS_OCCURRED) retry = false; } } logger_m.debugStream() << "Abort get() on ioport " << getID() << endlog; return -1; }