Ellipsoid::Ellipsoid(glm::dvec3 radii) : _radii(radii) { updateInternalCache(); }
bool DHT::read(void) { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; unsigned long time = millis(); //Determine if it's appropiate to read the sensor, or return data from cache if ((time - m_lastreadtime) < m_maxIntervalRead && (errDHT_OK == m_lastError)) { return true; // will use last data from cache } m_lastreadtime = time; //reset internal data and invalidate cache m_data[0] = m_data[1] = m_data[2] = m_data[3] = m_data[4] = 0; m_lastError = errDHT_Other; m_lastTemp = NAN; m_lastHumid = NAN; //Pull the pin low for m_wakeupTimeMs milliseconds pinMode(m_kSensorPin, OUTPUT); digitalWrite(m_kSensorPin, LOW); delay(m_wakeupTimeMs); //clear interrupts cli(); //Make pin input and activate pullup pinMode(m_kSensorPin, INPUT); if (m_bPullupEnabled) { pullup(m_kSensorPin); } else { digitalWrite(m_kSensorPin, HIGH); } //Read in the transitions for (i = 0; i < MAXTIMINGS || j >= 40; i++) { counter = 0; while (digitalRead(m_kSensorPin) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) { break; } } laststate = digitalRead(m_kSensorPin); if (counter == 255) { m_lastError = errDHT_Timeout; break; } // ignore first 3 transitions if ((i >= 4) && (i % 2 == 0)) { // shove each bit into the storage bytes m_data[j / 8] <<= 1; if (counter > ONE_DURATION_THRESH_US) { m_data[j / 8] |= 1; } j++; } } sei(); #if DHT_DEBUG Serial.println(j, DEC); Serial.print(m_data[0], HEX); Serial.print(", "); Serial.print(m_data[1], HEX); Serial.print(", "); Serial.print(m_data[2], HEX); Serial.print(", "); Serial.print(m_data[3], HEX); Serial.print(", "); Serial.print(m_data[4], HEX); Serial.print(" =? "); Serial.println((m_data[0] + m_data[1] + m_data[2] + m_data[3]) & 0xFF, HEX); #endif // pull the pin high at the end //(will stay high at least 250ms until the next reading) pinMode(m_kSensorPin, OUTPUT); digitalWrite(m_kSensorPin, HIGH); // check we read 40 bits and that the checksum matches if ((j >= 40) && (m_data[4] == ((m_data[0] + m_data[1] + m_data[2] + m_data[3]) & 0xFF))) { updateInternalCache(); m_lastError = errDHT_OK; return true; } else { m_lastError = errDHT_Checksum; } return false; }