/** * Methode virtuelle qui teste si une donnée est présente dans le buffer circulaire * Cette methode teste si un messageAsservissement est present * @return true si la donnee est disponible, false sinon * @see onReceive() */ bool RS232Sensor::isDataAvailable() { //boost::interprocess::scoped_lock<boost::mutex> lock(a_mutex, boost::interprocess::try_to_lock); this->a_mutex.lock(); // On protege les donnees (a_buffer) int bufferAvailable = this->a_buffer.dataAvailable(); // On calcul le nombre d'octets non lu this->a_mutex.unlock(); // On deverouille le mutex if(bufferAvailable >= 7) { this->a_mutex.lock(); // On protege le mutex while(this->a_buffer.see() != 17 && bufferAvailable > 0) { unsigned char c; this->a_buffer >> c; //_DISPLAY("i" << (int)c << "|"); bufferAvailable--; } this->a_mutex.unlock(); // On deverouille le mutex if(bufferAvailable >= 7) { unsigned char sensorID = this->a_buffer.see(1); if(a_sensors.sensorExist((unsigned int)sensorID)) { Sensor s = a_sensors.getSensor(sensorID); if(bufferAvailable >= s.getSize() + 6) return true; } else { //_DISPLAY(std::endl << sensorID << std::endl); //_DEBUG("Le message n'appartient a aucun capteur connu", WARNING); unsigned char c; this->a_buffer >> c; //_DISPLAY((unsigned int)sensorID << "c" << (int)c << "|"); bufferAvailable--; } }