Esempio n. 1
0
void animate_pulse(widget_ptr wid)
{
    int i, dt, d;
    int x, y;
    SDL_Rect rect;
    int speed = 500;

    if (!pulse_count) {
	server_pulse();
    }

    rect.w = pipet + 2;
    rect.h = pipet + 2;
    i = 0;
    while (i<pulse_count) {
	x = pulse_list[i].x;
	y = pulse_list[i].y;
	d = pulse_list[i].dir;
	dt = tick - pulse_list[i].tick;
	if (dt > speed) {
	    pulse_count--;
	    memmove(&pulse_list[i], &pulse_list[i+1], sizeof(pulse_s) * (pulse_count - i));

	    add_dir(&x, &y, x, y, d);
	    new_pulse(x, y, (d + 2) % 4);
	} else {
	    //wrap cases:
	    if (dir[d].x == -1 && 2 * dt > speed && !x) {
		x += boardw;
	    }
	    if (dir[d].x == 1 && 2 * dt > speed && x == boardw - 1) {
		x -= boardw;
	    }
	    if (dir[d].y == -1 && 2 * dt > speed && !y) {
		y += boardh;
	    }
	    if (dir[d].y == 1 && 2 * dt > speed && y == boardh - 1) {
		y -= boardh;
	    }

	    rect.x = x * (cellw + border) + pipex - 1;
	    rect.x += dir[d].x * (cellw + border) * dt / speed;
	    rect.x += border + padding;

	    rect.y = y * (cellh + border) + border + padding;
	    rect.y += dir[d].y * (cellh + border) * dt / speed;
	    rect.y += pipey - 1;
	    widget_fillrect(wid, &rect, c_pulse);
	    i++;
	}
    }
}
Esempio n. 2
0
int extinputs_parse(const char *filename, struct pulse **cfginputs, int N)
{
    FILE *fin;
    char buf[MAX_LINE];

    char *start;
    char *end;
    char *values;

    int error = 0;

    fin = fopen(filename, "r");
    if (!fin)
        return -1;

    int lineno = 0;

    double t, q, i, d, m;       /* the values to be read */

    /* Scan through file line by line */
    while (fgets(buf, sizeof(buf), fin) != NULL) {
        lineno++;
        start = lskip(rstrip(buf));     /* chop whites */

        if (*start && *start != '#') {
            /* Remove possible comments at the end */
            end = find_char_or_comment(start, '#');
            if (*end == '#')
                *end = '\0';
            values = rstrip(start);
            /* Not a comment, must be a line containing 4 numbers */
            /* Scan and check if the inputs is correctly formatted */
            if (sscanf(values, "%lf %lf %lf %lf %lf", &t, &d, &q, &i, &m) == 5) {
                if (t >= 0 && d > 0 && m >= 0) {
                    *cfginputs = append_pulse(*cfginputs, new_pulse(N, t, d, q, i, m));
                } else {
                    printf("Durations and time onsets should be positive.\n");
                    printf("Check configuration file for external inputs.\n");
                    error = lineno;
                }
            } else if (!error) {
                /* No '=' found on name=value line  */
                error = lineno;
            }
        }
    }
    fclose(fin);
    return error;
}
Esempio n. 3
0
void ultrasonic_update_fsm(uint8 cmd, uint8 *param)
{
	enum states 
	{ 
		s_waiting_for_ping=0,	//0 
		s_waiting_for_echo,		//1
		s_none=255
	};
	static enum states state=s_waiting_for_ping;
	static enum states last_state=s_none;
	static u32 t_entry=0;
	static u08 initialized=0;
	static u08 newpulse=0;
	static u32 t_ping=0;
	static u32 pulse;
	static u16 distance;
	static u08 sensor=0;
	DEFINE_CFG2(u08,bitmap,4,1);
	DEFINE_CFG2(u32,echo_timeout,4,2);
	DEFINE_CFG2(u32,intra_delay,4,3);
	

	//task_open();

	if(!initialized)
	{
		initialized=1;

		usb_printf("ultrasonic_update_fsm()\n");

		PREPARE_CFG2(bitmap);					
		PREPARE_CFG2(echo_timeout);					
		PREPARE_CFG2(intra_delay);					
	}

	//while(1)
	{
		UPDATE_CFG2(bitmap);					
		UPDATE_CFG2(echo_timeout);					
		UPDATE_CFG2(intra_delay);					


		first_(s_waiting_for_ping)
		{
			enter_(s_waiting_for_ping) 
			{  
				NOP();
			}
			
			if(get_ms() - t_ping >= intra_delay)
			{
				PING(sonar_pin[sensor]);
				newpulse = new_pulse(sensor); //clear the pulse capture state
				t_ping = get_ms();
				state = s_waiting_for_echo;
			}

			exit_(s_waiting_for_ping)  
			{ 
				NOP();
			}
		}

		next_(s_waiting_for_echo)
		{
			enter_(s_waiting_for_echo) 
			{  
				NOP();
			}

			newpulse = new_high_pulse(sensor);
			if(newpulse)
			{
				pulse = pulse_to_microseconds(get_last_high_pulse(sensor));
				distance = ((pulse*10)/148) + 2;
				state = s_waiting_for_ping;
			}
			else if( get_ms()-t_ping >= echo_timeout)
			{
				distance = 4000;
				state = s_waiting_for_ping;
			}

			exit_(s_waiting_for_echo)  
			{ 
				s.inputs.sonar[sensor] = distance;
				s.us_avg[sensor] = (s.us_avg[sensor]*3 + distance)/4;

				sensor=get_next_sensor();
				if(get_ms() - t_ping >= intra_delay)
				{
					PING(sonar_pin[sensor]);
					newpulse = new_pulse(sensor);
					t_ping = get_ms();
					state = s_waiting_for_echo;
				}
			}
		}
	}
}
Esempio n. 4
0
int main (int argc, char**argv)
{
	/* declare variables */
	PSF_PROPS outprops; // properties of output soundfile
	psf_format outformat = PSF_FMT_UNKNOWN; 
	double dur, freq, amp, peakdiff;
	float val;
	double minval, maxval, maxamp;
	int srate, nharms;
	unsigned long i, j;
	int i_out;
	int wavetype = -1;
	int chans;
	unsigned long width = DEFAULT_WIDTH;
	unsigned long nbufs, outframes, remainder, nframes, framesread;
	oscilt_tickfunc tickfunc = tabitick; // default table lookup is interpolating

	/* init resources */
	int ofd = -1;
	int error = 0;
	FILE *fpamp = NULL; // amplitude breakpoint file
	FILE *fpfreq = NULL; // frequency breakpoint file
	float* buffer = NULL;
	BRKSTREAM* ampstream = NULL; // breakpoint amplitude values
	BRKSTREAM* freqstream = NULL; // breakpoint frequency values
	GTABLE* gtable = NULL; // wave table with guard point
	OSCILT* p_osc = NULL; // oscillator using table lookup	
	unsigned long brkampSize = 0, // number of breakpoints
	              brkfreqSize = 0;
	
	printf("TABGEN: a table lookup oscillator generator.\n");

	/* check for command line options */
	if (argc > 1)
	{
		while (argv[1][0]=='-')
		{
			switch(argv[1][1])
			{
				case('\0'):
					printf("Error:   you did not specify an option.\n"
					       "options: -wN  set width of lookup table "
					       "to N points (default: 1024 points)\n"
					       "         -t   use truncating lookup "
					       "(default: interpolating lookup)\n");
					return 1;
				case('t'):
					if (argv[1][2] == '\0')
						tickfunc = tabtick;	
					else
					{
						printf("Error:   %s is not a valid option.\n"
						       "options: -wN  set width of lookup table "
						       "to N points (default: 1024 points)\n"
						       "         -t   use truncating lookup "
						       "(default: interpolating lookup)\n",
						        argv[1]);
						return 1;	
					}
					break;
				case('w'):
					if (argv[1][2] == '\0')
					{
						printf("Error: you did not specify a table lookup width.\n");
						return 1;
					}
					if (argv[1][2] >= '0' && argv[1][2] <= '9')
					{
						width = atoi(&argv[1][2]);
						if (width < 1)
						{
							printf("Error: table width must be at least 1\n");
							return 1;
						}
						break;
					}
				default:
						printf("Error:   %s is not a valid option.\n"
						       "options: -wN  set width of lookup table "
						       "to N points (default: 1024 points)\n"
						       "         -t   use truncating lookup "
						       "(default: interpolating lookup)\n",
						        argv[1]);
						return 1;	
			}
			argc--;
			argv++;
		}
	}

	/* check for sufficient command line input */
	if (argc != ARG_NARGS)
	{
		printf("Error: insufficient number of arguments.\n"
		       "Usage: tabgen [-wN] [-t] outfile dur srate nchans amp freq type nharms\n"
		       "       -wN:      w option sets the width of the lookup table to N points\n"
		       "                 N >= 1\n"
		       "       -t:       t option selects truncating table lookup\n"
		       "                 default is interpolating table lookup\n"
		       "       outfile:  output soundfile\n"
		       "                 set to 16-bit format\n"
		       "                 use any of .wav .aiff .aif .afc .aifc formats\n"
		       "       dur:      duration of soundfile (seconds)\n"
		       "       srate:    sample rate\n"
		       "       nchans:   number of channels\n"
		       "       amp:      amplitude value or breakpoint file\n"
		       "                 0.0 < amp <= 1.0\n"
		       "       freq:     frequency value or breakpoint file\n"
		       "                 freq >= 0.0\n"
		       "       type:     oscillator wave type\n"
		       "                 sine, square, triangle, sawup, sawdown, pulse\n"
		       "       nharms:   number of wave harmonics that are\n"
		       "                 added together in oscillator bank\n" 
		       "                 nharms >= 1\n"
		      );
		return 1;
	} 

	/* check duration input */
	dur = atof(argv[ARG_DUR]);
	if (dur <= 0.0)
	{
		printf("Error: duration must be positive.\n");
		return 1;
	}

	/* check sample rate input */
	srate = atoi(argv[ARG_SR]);
	if (srate <= 0)
	{
		printf("Error: sample rate must be positive.\n");
		return 1;		
	}
	outprops.srate = srate;

	/* check number of channels input */
	chans = atoi(argv[ARG_CHANS]);
	if (chans <= STDWAVE || chans > MC_WAVE_EX)
	{ 
		printf("Error: portsf does not support %d channels.\n",
		        chans);
		return 1;
	}
	outprops.chans = chans;

	/* check the output soundfile extension */
	outformat = psf_getFormatExt(argv[ARG_OUTFILE]);
	if (outformat == PSF_FMT_UNKNOWN)
	{
		printf("Error: outfile extension unknown.\n"
		       "       use any of .wav .aiff .aif .afc .aifc formats\n");
		return 1; 
	}	
	outprops.format = outformat;

	/* check for number of harmonics */
	nharms = atoi(argv[ARG_NHARMS]);
	if (nharms <= 0)
	{
		printf("Error: you must enter a positive number for harmonics.\n");
		return 1;
	} 
	
	/* get the wavetype */
	int count = 0;
	while (argv[ARG_TYPE][count] != '\0') count++;

	switch (count)
	{
		case (WAVE_SINE):
			if (!strcmp(argv[ARG_TYPE],"sine"))
				wavetype = WAVE_SINE;
			break;
		case (WAVE_SAWUP): 
			if (!strcmp(argv[ARG_TYPE],"sawup"))
				wavetype = WAVE_SAWUP;
		/* case (WAVE_PULSE): */
			if (!strcmp(argv[ARG_TYPE],"pulse"))
				wavetype = WAVE_PULSE;
			break;
		case (WAVE_SQUARE):
			if (!strcmp(argv[ARG_TYPE],"square"))
				wavetype = WAVE_SQUARE;
			break;
		case (WAVE_SAWDOWN):
			if (!strcmp(argv[ARG_TYPE],"sawdown"))
				wavetype = WAVE_SAWDOWN;
			break;	
		case (WAVE_TRIANGLE):
			if (!strcmp(argv[ARG_TYPE],"triangle"))
				wavetype = WAVE_TRIANGLE;
			break;
		default:
			wavetype = -1;
	} 
	if (wavetype < 0) 
	{
		printf("Error:    %s is not a valid wave type.\n"
		       "wavetype: sine, square, triangle, sawup, sawdown, pulse\n",
		        argv[ARG_TYPE]); 
		return 1;
	}

	/* start portsf */
	psf_init();

	/* create output soundfile - set to 16-bit by default */
	outprops.samptype = PSF_SAMP_16;
	outprops.chformat = PSF_STDWAVE;
	ofd = psf_sndCreate(argv[ARG_OUTFILE],&outprops,0,0,PSF_CREATE_RDWR);
	if (ofd < 0)
	{
		printf("Error: unable to create soundfile \"%s\"\n",
		        argv[ARG_OUTFILE]);
		return 1;
	}

	/* resources have been gathered at this point
	   use goto upon hitting any errors */

	/* get amplitude value or breakpoint file */
	fpamp = fopen(argv[ARG_AMP],"r");		
	if (fpamp == NULL)
	{
		/* if the user specified a non-existant breakpoint file
		   or didn't specify a breakpoint value */
		if ( (argv[ARG_AMP][0] < '0' || argv[ARG_AMP][0] > '9') &&
		   (argv[ARG_AMP][0] != '.' && argv[ARG_AMP][0] != '-') ||
		   (argv[ARG_AMP][0] == '.' && (argv[ARG_AMP][1] < '0' || argv[ARG_AMP][1] > '9')) ||
		   (argv[ARG_AMP][0] == '-' && (argv[ARG_AMP][1] < '0' || argv[ARG_AMP][1] > '9') && argv[ARG_AMP][1] != '.') )
		{
			printf("Error: breakpoint file \"%s\" does not exist.\n",
			        argv[ARG_AMP]);
			error++;
			goto exit;
		}
		/* the user specified a breakpoint value */
		amp = atof(argv[ARG_AMP]);
		if (amp <= 0.0 || amp > 1.0)
		{
			printf("Error: amplitude value out of range.\n"
			       "       0.0 < amp <= 1.0\n");
			error++;
			goto exit;
		}
	}
	else
	{
		/* gather breakpoint values */
		ampstream = bps_newstream(fpamp,outprops.srate,&brkampSize);
		if (ampstream == NULL)
		{
			printf("Error reading breakpoint values from file \"%s\".\n",
			        argv[ARG_AMP]);
			error++;
			goto exit;			
		}
		if (bps_getminmax(ampstream,&minval,&maxval))
		{
			printf("Error: unable to read breakpoint range "
			       "from file \"%s\".\n", argv[ARG_AMP]);
			error++;
			goto exit;
		}
		if (minval <= 0.0 || minval > 1.0 || maxval <= 0.0 || maxval > 1.0)
		{
			printf("Error: breakpoint amplitude values out of range in file \"%s\"\n"
			       "       0.0 < amp <= 1.0\n", argv[ARG_AMP]);
			error++;
			goto exit; 
		}
		maxamp = maxval; // retain the maximum breakpoint amplitude value	
	}

	/* get frequency value or breakpoint file */
	fpfreq = fopen(argv[ARG_FREQ],"r");
	if (fpfreq == NULL)
	{
		if ( (argv[ARG_FREQ][0] < '0' || argv[ARG_FREQ][0] > '9') &&
		   (argv[ARG_FREQ][0] != '.' && argv[ARG_FREQ][0] != '-') ||
		   (argv[ARG_FREQ][0] == '.' && (argv[ARG_FREQ][1] < '0' || argv[ARG_FREQ][1] > '9')) ||
		   (argv[ARG_FREQ][0] == '-' && (argv[ARG_FREQ][1] < '0' || argv[ARG_FREQ][1] > '9') && argv[ARG_FREQ][1] != '.') )
		{
			printf("Error: breakpoint file \"%s\" does not exist.\n",
			        argv[ARG_FREQ]);
			error++;
			goto exit;
		}
		freq = atof(argv[ARG_FREQ]);
		if (freq <= 0.0)
		{
			printf("Error: frequency must be positive.\n");
			error++;
			goto exit;
		}
	}
	else
	{
		freqstream = bps_newstream(fpfreq,outprops.srate,&brkfreqSize);
		if (freqstream == NULL)
		{
			printf("Error reading breakpoing values from file \"%s\".\n",
			        argv[ARG_FREQ]);
			error++;
			goto exit;
		}	
		if (bps_getminmax(freqstream,&minval,&maxval))
		{
			printf("Error: unable to read breakpoint range "
			       "from file \"%s\".\n", argv[ARG_FREQ]);
			error++;
			goto exit;
		}
		if (minval < 0.0 || maxval < 0.0)
		{
			printf("Error: breakpoint frequency values out of range in file \"%s\"\n"
			       "       freq >= 0.0\n", argv[ARG_FREQ]);
			error++;
			goto exit;
		}
	}

	/* create an outfile buffer */	
	nframes = DEFAULT_NFRAMES;
	buffer = (float *) malloc (sizeof(float) * nframes * outprops.chans);
	if (buffer == NULL)
	{
		printf("No memory!\n");
		error++;
		goto exit;
	}

	/* calculate the total number of outfile frames */
	outframes = (unsigned long) (dur * outprops.srate + 0.5);	

	/* calculate the number of buffers used in outfile */
	nbufs = outframes / nframes;
	remainder = outframes - nframes * nbufs; 
	if (remainder > 0)
		nbufs++;

	/* allocate space for new wavetype table oscillator 
	   and initialize oscillator */
	switch (wavetype)
	{
		case (WAVE_SINE):
			gtable = new_sine(width); 
			if (gtable == NULL)
			{
				printf("Error: unable to create a sine wave table.\n");
				error++;
				goto exit;
			}
			p_osc = new_oscilt(outprops.srate,gtable,0); 
			break;
		case (WAVE_SQUARE):
			gtable = new_square(width,nharms);
			if (gtable == NULL)
			{
				printf("Error: unable to create a square wave table.\n");
				error++;
				goto exit;
			}
			p_osc = new_oscilt(outprops.srate,gtable,0); 
			break;
		case (WAVE_TRIANGLE):
			gtable = new_triangle(width,nharms);
			if (gtable == NULL)
			{
				printf("Error: unable to create a triangle wave table.\n");
				error++;
				goto exit;
			}
			p_osc = new_oscilt(outprops.srate,gtable,0.25); 
			break;
		case (WAVE_SAWUP):
		if (!strcmp(argv[ARG_TYPE],"pulse")) /* case (WAVE_PULSE): */
		{
			gtable = new_pulse(width,nharms);
			if (gtable == NULL)
			{
				printf("Error: unable to create a pulse wave table.\n");
				error++;
				goto exit;
			}
			p_osc = new_oscilt(outprops.srate,gtable,0);
			break;
		}
		case (WAVE_SAWDOWN):
			if (wavetype==WAVE_SAWUP)
				gtable = new_saw(width,nharms,SAW_UP);
			else 
				gtable = new_saw(width,nharms,SAW_DOWN);
			if (gtable == NULL)
			{
				printf("Error: unable to create a saw%s wave table.\n",
				        (wavetype==SAW_UP)?"up":"down");
				error++;
				goto exit;
			}	
			p_osc = new_oscilt(outprops.srate,gtable,0);
			break;
	}	

	printf("Creating soundfile...\n");

	/* process soundfile */
	framesread = 0;
	for (i=0; i < nbufs; i++)	
	{
		/* update outfile copy status after the buffer
		   is refreshed every 100 times */
		if(i%100)
		{
			printf("%lu frames copied... %d%%\r",
			        framesread, (int)(framesread*100/outframes));
		} 
		/* clear update status when done */
		if (i==(nbufs-1))
			printf("                                        \n");

		if ((i == (nbufs-1)) && remainder)	
			nframes = remainder;
		for (j=0; j < nframes; j++)
		{
			if (ampstream)
				amp = bps_tick(ampstream);
			if (freqstream)
				freq = bps_tick(freqstream);
			val = tickfunc(p_osc,freq) * amp;	
			for (i_out=0; i_out < outprops.chans; i_out++)
				buffer[j*outprops.chans + i_out] = val;
		}
		if (psf_sndWriteFloatFrames(ofd,buffer,nframes) != nframes)
		{
			printf("Error: unable to write frames to outfile.\n");
			error++;
			break;
		}
		framesread += nframes;
	}

	/* make sure peak amplitude roughly matches the
	   user requested amplitude */
	if (ampstream)
		peakdiff = maxamp-psf_sndPeakValue(ofd,&outprops);
	else	
		peakdiff = amp-psf_sndPeakValue(ofd,&outprops);
	if ((peakdiff>.001) || (peakdiff<-.001))
	{
		printf("ERROR: unable to generate the correct peak\n"
		       "       amplitude for %s\n", argv[ARG_OUTFILE]);
		error++;
	}

	printf("Done. %d error%s\n"
	       "soundfile created: %s\n"
	       "number of frames:  %lu\n",
	        error, (error==1)?"":"s",
	        argv[ARG_OUTFILE], framesread);

	/* display soundfile properties if successfully copied */
	if (!error)
		psf_sndInfileProperties(argv[ARG_OUTFILE],ofd,&outprops);

	/* clean resources */
	exit:
	if (ofd >= 0)
	{
		if (psf_sndClose(ofd))
		{
			printf("Error: unable to close soundfile: %s\n",
			        argv[ARG_OUTFILE]); 
		}
		else if (error)
		{
			printf("There was an error while processing the soundfile.\n"
			       "Deleting soundfile: %s\n", argv[ARG_OUTFILE]);
			if (remove(argv[ARG_OUTFILE]))
				printf("Error: unable to delete %s\n", argv[ARG_OUTFILE]);
			else
				printf("%s successfully deleted.\n", argv[ARG_OUTFILE]); 
		}
	}
	if (fpamp)
	{
		if (fclose(fpamp))
		{
			printf("Error: unable to close breakpoint file \"%s\"\n",
			        argv[ARG_AMP]);	
		}
	} 
	if (fpfreq)
	{
		if (fclose(fpfreq))
		{
			printf("Error: unable to close breakpoint file \"%s\"\n",
			        argv[ARG_FREQ]);
		}
	}
	if (buffer)
	{
		free(buffer);
		buffer = NULL;
	}
	if (ampstream)
	{
		bps_freepoints(ampstream);
		ampstream = NULL;
	}
	if (freqstream)
	{
		bps_freepoints(freqstream);
		freqstream = NULL;
	}
	if (gtable)
		gtable_free(&gtable);
	if (p_osc)
	{
		free(p_osc);
		p_osc = NULL;
	}
	psf_finish();

	return error;
}
Esempio n. 5
0
void server_pulse()
{
    new_pulse(sourcex, sourceybottom, -1);
    new_pulse(sourcex, sourceytop, -1);
}