void fft_scope::addElement (DSPCOMPLEX x) { int32_t i; DSPFLOAT multiplier = (DSPFLOAT)segmentSize / displaySize; // inputBuffer [fillPointer] = x; fillPointer = (fillPointer + 1) % spectrumFillpoint; if (++ sampleCounter < segmentSize) return; sampleCounter = 0; for (i = 0; i < spectrumFillpoint; i ++) { DSPCOMPLEX tmp = inputBuffer [(fillPointer + i) % spectrumFillpoint]; spectrumBuffer [i] = cmul (tmp, multiplier * Window [i]); } for (i = spectrumFillpoint; i < spectrumSize; i ++) spectrumBuffer [i] = 0; spectrum_fft -> do_FFT (); mapSpectrumtoDisplay (zoomingLevel, zoomingPoint); doAverage (); showSpectrum (); }
void Timer::Pause() { if ((started == true) && (paused == false)) { paused = true; AcumulationVector[SampleIndex] = RENDERER->getRoot()->getTimer()->getMillisecondsCPU() - (StartTime + SamplingPause); PausedTime = RENDERER->getRoot()->getTimer()->getMillisecondsCPU() - StartTime; SampleIndex++; if(SampleIndex == SampleSize) { doAverage(); } } }
// // This is a kind of hack to allow the spectrumviewer to // send in vectors of size n and have them displayed // immediately void fft_scope::addElementsandShow (DSPCOMPLEX *v, int16_t n) { int16_t i, j; int32_t Incr; double temp; if (2 * n > spectrumSize) { fprintf (stderr, "Increase n = %d, size = %d\n", n, spectrumSize); return; } for (i = 0; i < n; i ++) spectrumBuffer [i] = v [i]; for (i = n; i < spectrumSize; i ++) spectrumBuffer [i] = 0; spectrum_fft -> do_FFT (); Incr = spectrumSize / displaySize; for (i = 0; i < displaySize / 2; i ++) { displayBuffer [displaySize / 2 + i] = 0; for (j = 0; j < Incr; j ++) displayBuffer [displaySize / 2 + i] += abs (spectrumBuffer [i * Incr + j]) / binWidth; displayBuffer [displaySize / 2 + i] /= Incr; } for (i = 0; i < displaySize / 2; i ++) { displayBuffer [i] = 0; for (j = 0; j < Incr; j ++) displayBuffer [i] += abs (spectrumBuffer [spectrumSize / 2 + i * Incr + j]) / binWidth; displayBuffer [i] /= Incr; } temp = (double)MaxFrequency / displaySize; for (i = 0; i < displaySize; i ++) X_axis [i] = ((double)vfo - (double)MaxFrequency + (double)((i) * (double) 2 * temp)) / ((double)scale); doAverage (); showSpectrum (); }
void GreenHouseMiddleLayer::analyze() { float temperatureAverage = 0; float airHumidityAverage = 0; float lightAverage = 0; Message newMessage; DateTime dateTime; clock.createDateTime(dateTime); newMessage.dateTime = dateTime; //add time to message prepareMessage(newMessage, CommonValues::highLayerAddress); //we have some data to analyze if (isTemperatureReadyToAnalyze) { Serial.println(F("in isTemperatureReadyToAnalyze")); //calculate average temperatureAverage = doAverage(temperatureData); //check thresholds newMessage.action = handleThresholds(temperatureAverage, CommonValues::temperatureThresholdMin, CommonValues::temperatureThresholdMax, CommonValues::heatPin,CommonValues::fanPin); //todo assign action newMessage.data = temperatureAverage; newMessage.messageType = CommonValues::dataType; newMessage.sensorType = CommonValues::temperatureType; if (!(sendMessage(newMessage))) { //TODO handle if message fails } //clear the array after done isTemperatureReadyToAnalyze = false; temperatureData.clear(); } //we have some data to analyze if (isHumidityReadyToAnalyze) { Serial.println(F("in isHumidityReadyToAnalyze")); //calculate average airHumidityAverage = doAverage(humidityData); //check thresholds handleThresholds(airHumidityAverage, CommonValues::airHumidityThresholdMin, CommonValues::airHumidityThresholdMax, CommonValues::steamPin, CommonValues::ventPin); newMessage.action = STEAMER; newMessage.data = airHumidityAverage; newMessage.messageType = CommonValues::dataType; newMessage.sensorType = CommonValues::humidityType; if (!(sendMessage(newMessage))) { // Serial.println(F("message failed, adding to unsent")); // unsentImportantMessages.add(newMessage); } //clear the array after done isHumidityReadyToAnalyze = false; humidityData.clear(); Serial.print(F("after isHumidityReadyToAnalyze clear size is :")); Serial.println(humidityData.size()); } if (isLightReadyToAnalyze) { Serial.println(F("in isLightReadyToAnalyze")); //calculate average lightAverage = doAverage(lightData); //TODO decide what to do with light thresholds newMessage.action = handleThresholds(lightAverage, CommonValues::lightThresholdMin, CommonValues::lightThresholdMax, CommonValues::lampPin, CommonValues::lampPin); newMessage.data = lightAverage; newMessage.messageType = CommonValues::dataType; newMessage.sensorType = CommonValues::lightType; if (!(sendMessage(newMessage))) { //TODO } //clear the array after done isLightReadyToAnalyze = false; lightData.clear(); } //TODO reduce duplicate code all above //no need to do average on consumption data }