long long findmax (int depth, int level, int pos) { int curr_width = depth; int curr_start = series (depth - 1, TRI); int current = retval(depth, pos); // reached the end of this search if (level == 1) return current; // top of the pyramid if (depth < 2) return tri[0]; // far left edge if (pos == 1) return (findmax (depth - 1, level - 1, pos) + current); // far right edge if (pos == curr_width) return (findmax (depth - 1, level - 1, pos - 1) + current); // find the maximum value and return it current += maxlong ( // look left findmax (depth - 1, level - 1, pos-1), // look right findmax (depth - 1, level - 1, pos)); return current; }
/// \brief Sets the samplerate of the oscilloscope. /// \param samplerate The samplerate that should be met (S/s). /// \return The samplerate that has been set. unsigned long int fd_runtime_setsamplerate5200(FDRuntime* self, unsigned short int samplerateId) { unsigned long int samplerate = self->samplerates[samplerateId]; if(!fd_runtime_getdeviceisconnected(self) || samplerate == 0) return 0; // Pointers to needed commands FDCommandSetSamplerate5200* ss = (FDCommandSetSamplerate5200*)g_object_ref(self->commands[COMMAND_SETSAMPLERATE5200]); //FDCommandSetBuffer5200* sb = (FDCommandSetBuffer5200*)g_object_ref(self->commands[COMMAND_SETBUFFER5200]); FDCommandSetTrigger5200* st = (FDCommandSetTrigger5200*)g_object_ref(self->commands[COMMAND_SETTRIGGER5200]); unsigned char fastRate; unsigned short int value; unsigned char byte3; if (generate5200DividerValue(samplerate, &fastRate, &byte3, &value) < 0) { // Not using fastRate, because all fastRate modes are not dynamically generated. self->samplerateMax = self->samplerateChannelMax; if (fastRate) self->samplerateMax = self->samplerateFastMax; // The maximum sample rate depends on the buffer size unsigned int bufferDivider = 1;/* switch(commandSetBuffer5200->getBufferSize()) { case BUFFERID_ROLL: bufferDivider = 1000; break; case BUFFERID_LARGE: bufferDivider = 2; break; default: break; }*/ // Get divider that would provide the requested rate, can't be zero self->samplerateMax /= bufferDivider; self->samplerateDivider = maxlong(self->samplerateMax / samplerate, (long unsigned int) 1); // Use normal mode if we need valueSlow or it would meet the rate at least as exactly as fast rate mode if(fastRate) { unsigned long int slowSamplerate = self->samplerateChannelMax / bufferDivider; unsigned long int slowDivider = maxlong(slowSamplerate / samplerate, (long unsigned int) 1); if(self->samplerateDivider > 4 || (abs((double) slowSamplerate / slowDivider - samplerate) <= abs(((double) self->samplerateMax / self->samplerateDivider) - samplerate))) { fastRate = FALSE; self->samplerateMax = slowSamplerate; self->samplerateDivider = slowDivider; } } g_message("Calculating new samplerate values. Requesting %lu S/s",samplerate); g_message("Using Samplerate: %lu Using Divider: %lu", self->samplerateMax, self->samplerateDivider); // Split the resulting divider into the values understood by the device double computed = ((double)self->samplerateDivider - 3.0)/2.0; value = maxshort((unsigned short int)(computed+0.5), (unsigned short int)0); } else { self->samplerateMax = self->samplerateChannelMax; if (fastRate) self->samplerateMax = self->samplerateFastMax; self->samplerateDivider = maxlong(self->samplerateMax / samplerate, (long unsigned int) 1); } g_message("Value= %u Byte3= %i fastMode= %i",value, (unsigned int)byte3, (unsigned int)fastRate); // Store samplerate fast value fd_commandsetsamplerate5200_setSamplerateFast(ss, byte3); // Store samplerate slow value (two's complement) fd_commandsetsamplerate5200_setSamplerateSlow(ss, 0xffff - value); // Set fast rate when used fd_commandsettrigger5200_setFastRate(st, fastRate); g_object_unref(ss); g_object_unref(st); self->commandPending[COMMAND_SETSAMPLERATE5200] = TRUE; self->commandPending[COMMAND_SETTRIGGER5200] = TRUE; //self->updateBufferSize(self->bufferSize); //self->setTriggerSlope(self->triggerSlope); return self->samplerateMax / self->samplerateDivider; }