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;
}
Пример #2
0
/// \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;
}