// ................................................................... #include
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <corso.h>

extern XVideoData xvd;

main()
{
	int dalpha,dx,dy,i,ii,interval,ix,iy,j,key;
	clock_t musec1,musec2;
	char titolo[20];
	timespec ts1,ts2;
	
	// ..........................................................................
	ts1.tv_sec=0;
	interval=30000000;
	sprintf(titolo,"Bruco");
	// ......................................................... apri la finestra
	StartXWindow(800,150,0,0,titolo,1);
	// ........................................................... scegli l'input
	XSelectInput(xvd.display,xvd.win[0],KeyPressMask|KeyReleaseMask|ExposureMask);
	// ..................................................................... loop
	ii=0;
	XSync(xvd.display,TRUE);
	for (;;ii++)
	{
		XSync(xvd.display,FALSE);
		musec1=clock();
		i=ii%xvd.width[0];
		dx=21+int(4.0*sin(0.5*double(i)));
		dy=21-int(4.0*sin(0.5*double(i)));
		dalpha=int(2560.0*(1.0+sin(0.4*double(i))));
		// .................................................... pulisci la finestra
		XSetForeground(xvd.display,xvd.gc,xvd.white);
		XFillRectangle(xvd.display,xvd.backpix[0],xvd.gc,0,0,xvd.width[0],
									 xvd.height[0]);
		// ...................................................... disegna lo sfondo
		XSetForeground(xvd.display,xvd.gc,xvd.brown);
		XFillRectangle(xvd.display,xvd.backpix[0],xvd.gc,0,135,xvd.width[0],20);
		XSetForeground(xvd.display,xvd.gc,xvd.black);
		// .................................................... scrivi l'intervallo
		XPrintf(0,350,0,1,TRUE,"Intervallo: %d ns     ",interval);
		// ........................................................................
		XSetForeground(xvd.display,xvd.gc,xvd.green[2]);
		ix=ii-dx;
		for (j=0;j<6;j++)
		{
			ix=(ix+(dx-2))%xvd.width[0];
			iy=110+int(5.0*sin(0.5*double(ix)));
			XFillArc(xvd.display,xvd.backpix[0],xvd.gc,ix,iy,dx,dy,0,23040);
		}
		XSetForeground(xvd.display,xvd.gc,xvd.white);
		XFillArc(xvd.display,xvd.backpix[0],xvd.gc,ix,iy,dx,dy,-dalpha,dalpha);
		XSetForeground(xvd.display,xvd.gc,xvd.black);
		XFillArc(xvd.display,xvd.backpix[0],xvd.gc,ix+12,iy+4,4,4,0,23040);
		XDrawLine(xvd.display,xvd.backpix[0],xvd.gc,ix+10,iy,ix+20,iy-20);
		XDrawLine(xvd.display,xvd.backpix[0],xvd.gc,ix+10,iy,ix+30,iy-20);
		XRedraw();
		musec2=clock();
		ts1.tv_nsec=interval-(musec2-musec1)*1000;
		if (ts1.tv_nsec>0) nanosleep(&ts1,&ts2);
		if (XCheckTypedWindowEvent(xvd.display,xvd.win[0],KeyPress,&xvd.ev))
		{
			key=XReadAfter(0);
			if (key==-1) continue;
			if (key=='+')
			{
				interval=int(double(interval)/1.1);
				continue;
			}
			if (key=='-')
			{
				interval=int(double(interval)*1.1);
				continue;
			}
			break;
		}
		else if (XCheckTypedWindowEvent(xvd.display,xvd.win[0],KeyRelease,&xvd.ev))
			key=XReadAfter(0);
	}
	// .................................................................. aspetta
	XWait(0);
	// ....................................................... chiudi la finestra
	CloseXWindow();
}

