Buenas gente. Tengo un pequeño problema lógico que me está rompiendo el cráneo.
He creado una función que recibe una serie de datos (canal, valor de inicio, valor final, duración) y con un bucle anidado envía los datos a otra función. El bucle anidado está pensado para seguir un intervalo regular, el bucle interior se repite 25 veces en un segundo, y el exterior se repite en función del número de segundos que quiera que dure el envío, y ese dato en segundos es el que le envio a la función.
La gracia está en que el número de envíos por segundo tiene que ser constante, 25 por segundo, pero el rango de valores (valor final - valor de inicio) puede ser cualquiera. Eso significa que tengo que repetir valores o quitarlos para que ajuste a esos 25 valores por segundo, de manera escalonada y continua (no puedo eliminar los valores sobrantes de golpe al principio o al final).
La sucesión de datos, para que lo entendáis, es para subir o bajar la cantidad de luz que un dimmer le entrega a un foco. Envia el dato cada vez que el bucle interior cumple un ciclo a la función conectar.
Os copio la función para que veais el lio que he montado:
int rampa(int canal, int valor_a, int valor_b, int duracion) //Función de rampa para un canal
{
int i;
if ((canal<1) || (canal>512) || (valor_a<0) || (valor_b>255) || (valor_b<valor_a) || (valor_b>255) || (duracion<1))
{
system("cls");
cout<<"ERROR - Numero de canal o valor indicado fuera de rango\nPulsa cualquier tecla para continuar...";
getch();
return 1;
}
else
{
int i, j, k, cont, cont_b=0, intervalo, valores_segundo_sin, valores_segundo_fijo, resta, resta_cont;
intervalo=valor_b-valor_a; //Intervalo de valores de la rampa
valores_segundo_sin=intervalo/duracion; //numero de valores por segundo sin reducir a 25/s
valores_segundo_fijo=25; //numero de valores por segundo fijos
resta=valores_segundo_sin - valores_segundo_fijo; //numero de valores a eliminar en un segundo
cont=valor_a; //asignamos al contador el valor de inicio
resta_cont=valores_segundo_sin/valores_segundo_fijo; //Cada cuantos valores se elimina uno en un segundo
//Positivamos los valores resta para poder trabajar con ellos
if (resta_cont<0)
{
//Aqui la variacion de añadir o quitar IMPORTANTE
resta=resta*(-1);
}
if (resta<0)
{
resta=resta*(-1);
}
//ARRAY DE VALORES DE CANALES
char valores[526];
for (k=0; k<526; k++)
{
valores[k]=0;
}
//ARRAY DE SECUENCIA
char secuencia[1];
for (j=0; j<duracion; j++)//Este bucle dura la cantidad de segundos que se han ordenado
{
for (i=0; i<25; i++)//Este bucle dura exactamente 1 segundo y contiene 25 repeticiones
{
valores[canal-1]=cont;
secuencia[0]=secuencia[0]+1;
cont++;
cont_b++;
if (cont_b==resta_cont)
{
cont++;
cont_b=0;
}
if (secuencia[0]==255)
{
secuencia[0]=0;
}
conectar(valores, secuencia);
Sleep(40); //Pausa en ms para que el bucle dure 1s (1000ms / 25= 40ms)
}
}
return 0;
}
};
Me da dos problemas principalmente. El primero es que no recorre todo el rango de valores que le pido. Si le digo que vaya de 0 a 255, solo llega a enviar un tercio de los valores.
El segundo problema es que no cumple la pausa de 40ms. O no está bien especificado. Porque tarda muuuuuuuuuuuuuuuuuuuuuucho mas de los segundos que le especifico.
¿Debería enfocarlo todo de otra manera? ¿Que hago mal?
Gracias por la ayuda
