Main fish project files

Dependencies:   SDHCFileSystem wave_player

Fork of billy by Steve Ravet

Committer:
Dean
Date:
Wed Jul 15 19:07:30 2015 +0000
Revision:
1:35e4090cf6aa
Parent:
0:ef6fc1737022
fish project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sravet 0:ef6fc1737022 1
sravet 0:ef6fc1737022 2 #include "mbed.h"
Dean 1:35e4090cf6aa 3
Dean 1:35e4090cf6aa 4 //The next two includes are from the SDHC File System
Dean 1:35e4090cf6aa 5 #include "string"
Dean 1:35e4090cf6aa 6 #include "SDHCFileSystem.h"
sravet 0:ef6fc1737022 7
sravet 0:ef6fc1737022 8 #define SAMPLE_FREQ 40000
sravet 0:ef6fc1737022 9 #define BUF_SIZE (SAMPLE_FREQ/10)
sravet 0:ef6fc1737022 10 #define SLICE_BUF_SIZE 1
sravet 0:ef6fc1737022 11
sravet 0:ef6fc1737022 12 // include this #define to enable lots of serial output
sravet 0:ef6fc1737022 13 //#define VERBOSE
sravet 0:ef6fc1737022 14
sravet 0:ef6fc1737022 15
sravet 0:ef6fc1737022 16
sravet 0:ef6fc1737022 17 typedef struct uFMT_STRUCT {
sravet 0:ef6fc1737022 18 short comp_code;
sravet 0:ef6fc1737022 19 short num_channels;
sravet 0:ef6fc1737022 20 unsigned sample_rate;
sravet 0:ef6fc1737022 21 unsigned avg_Bps;
sravet 0:ef6fc1737022 22 short block_align;
sravet 0:ef6fc1737022 23 short sig_bps;
sravet 0:ef6fc1737022 24 } FMT_STRUCT;
sravet 0:ef6fc1737022 25
sravet 0:ef6fc1737022 26
sravet 0:ef6fc1737022 27 typedef struct uMOV_STRUCT {
sravet 0:ef6fc1737022 28 long sample;
sravet 0:ef6fc1737022 29 unsigned motor;
sravet 0:ef6fc1737022 30 unsigned duty_cycle;
sravet 0:ef6fc1737022 31 unsigned played;
sravet 0:ef6fc1737022 32 } MOV_STRUCT;
sravet 0:ef6fc1737022 33
sravet 0:ef6fc1737022 34 // global MBED things
sravet 0:ef6fc1737022 35 AnalogOut DACout(p18);
sravet 0:ef6fc1737022 36 DigitalOut led1(LED1);
sravet 0:ef6fc1737022 37 DigitalOut led2(LED2);
sravet 0:ef6fc1737022 38 DigitalOut led3(LED3);
sravet 0:ef6fc1737022 39 DigitalOut led4(LED4);
sravet 0:ef6fc1737022 40 DigitalOut digout(p8);
Dean 1:35e4090cf6aa 41 DigitalIn pushbutton(p22);
Dean 1:35e4090cf6aa 42 PwmOut body(p25);
Dean 1:35e4090cf6aa 43 PwmOut mouth(p24);
sravet 0:ef6fc1737022 44 PwmOut tail(p23);
sravet 0:ef6fc1737022 45 Ticker tick;
Dean 1:35e4090cf6aa 46 SDFileSystem sd(p5, p6, p7, p13, "sd");
sravet 0:ef6fc1737022 47
sravet 0:ef6fc1737022 48 // global variables used both by the main program and the ISR
sravet 0:ef6fc1737022 49 short DAC_fifo[256]; // FIFO for the DAC
sravet 0:ef6fc1737022 50 short DAC_wptr; // FIFO pointer
sravet 0:ef6fc1737022 51 volatile short DAC_rptr; // FIFO pointer
sravet 0:ef6fc1737022 52 long slice;
sravet 0:ef6fc1737022 53 unsigned num_movements;
sravet 0:ef6fc1737022 54 unsigned current_movement;
sravet 0:ef6fc1737022 55 MOV_STRUCT movements[500];
sravet 0:ef6fc1737022 56
sravet 0:ef6fc1737022 57 void dac_out(void);
sravet 0:ef6fc1737022 58 void play_wave(char *,char *,unsigned);
sravet 0:ef6fc1737022 59 void cleanup(char *);
sravet 0:ef6fc1737022 60 unsigned process_movement_file (char *mfname, MOV_STRUCT *mv,unsigned samp_rate);
sravet 0:ef6fc1737022 61
sravet 0:ef6fc1737022 62
sravet 0:ef6fc1737022 63 int main() {
sravet 0:ef6fc1737022 64 FILE *cmdfile;
sravet 0:ef6fc1737022 65 char cmdline[100];
sravet 0:ef6fc1737022 66 char *movfile,*tmp;
sravet 0:ef6fc1737022 67 char cmdfile_name[]="/sd/fish.txt";
sravet 0:ef6fc1737022 68 unsigned slow_mode=0;
sravet 0:ef6fc1737022 69 if (pushbutton) slow_mode=1;
sravet 0:ef6fc1737022 70 led1=0; wait(.5); led1=1; wait(.5); led1=0;
sravet 0:ef6fc1737022 71 printf("\nHello, world!\n");
sravet 0:ef6fc1737022 72 if (slow_mode) printf("Slooooow mode enabled...\n");
sravet 0:ef6fc1737022 73 printf("Waiting for button push\n");
sravet 0:ef6fc1737022 74 while (!pushbutton);
sravet 0:ef6fc1737022 75 printf("Button pushed\n");
sravet 0:ef6fc1737022 76 while (1) {
sravet 0:ef6fc1737022 77 cmdfile=fopen(cmdfile_name,"rb");
sravet 0:ef6fc1737022 78 if (!cmdfile) {
sravet 0:ef6fc1737022 79 printf("Unable to open command file '%s'\n",cmdfile_name);
sravet 0:ef6fc1737022 80 exit(1);
sravet 0:ef6fc1737022 81 }
sravet 0:ef6fc1737022 82
sravet 0:ef6fc1737022 83 fgets(cmdline,100,cmdfile);
sravet 0:ef6fc1737022 84 while (!feof(cmdfile)) {
Dean 1:35e4090cf6aa 85 printf("Parsing '%s' from command file '%s'\n",cmdline,cmdfile_name);
sravet 0:ef6fc1737022 86 tmp=strchr(cmdline,'#');
sravet 0:ef6fc1737022 87 if (tmp) *tmp=0;
sravet 0:ef6fc1737022 88 movfile=strchr(cmdline,' ');
sravet 0:ef6fc1737022 89 if (movfile) {
sravet 0:ef6fc1737022 90 *movfile=0;
sravet 0:ef6fc1737022 91 movfile++;
sravet 0:ef6fc1737022 92 tmp=strchr(movfile,'\n');
sravet 0:ef6fc1737022 93 cleanup(movfile);
sravet 0:ef6fc1737022 94 if (tmp) *tmp=0;
sravet 0:ef6fc1737022 95
sravet 0:ef6fc1737022 96 #ifdef USE_PUSHBUTTON
sravet 0:ef6fc1737022 97 printf("Waiting for button push\n");
sravet 0:ef6fc1737022 98 while (!pushbutton);
sravet 0:ef6fc1737022 99 printf("Button pushed\n");
sravet 0:ef6fc1737022 100 #else
sravet 0:ef6fc1737022 101 wait_ms(2000);
sravet 0:ef6fc1737022 102 #endif
sravet 0:ef6fc1737022 103 play_wave(cmdline,movfile,slow_mode);
sravet 0:ef6fc1737022 104 printf("Back from play_wave()\n");
sravet 0:ef6fc1737022 105 } else {
sravet 0:ef6fc1737022 106 printf("Unable to parse '%s' from command file '%s'\n",cmdline,cmdfile_name);
sravet 0:ef6fc1737022 107 }
sravet 0:ef6fc1737022 108 fgets(cmdline,100,cmdfile);
sravet 0:ef6fc1737022 109 }
sravet 0:ef6fc1737022 110 fclose(cmdfile);
sravet 0:ef6fc1737022 111 printf("Goodbye, world!\n");
sravet 0:ef6fc1737022 112 }
sravet 0:ef6fc1737022 113 }
sravet 0:ef6fc1737022 114
sravet 0:ef6fc1737022 115 void play_wave(char *wavname,char *movname,unsigned slow)
sravet 0:ef6fc1737022 116 {
sravet 0:ef6fc1737022 117 unsigned chunk_id,chunk_size,channel;
sravet 0:ef6fc1737022 118 unsigned data,samp_int,i;
sravet 0:ef6fc1737022 119 short dac_data;
sravet 0:ef6fc1737022 120 char *slice_buf;
sravet 0:ef6fc1737022 121 short *data_sptr;
sravet 0:ef6fc1737022 122 unsigned char *data_bptr;
sravet 0:ef6fc1737022 123 int *data_wptr;
sravet 0:ef6fc1737022 124 FMT_STRUCT wav_format;
sravet 0:ef6fc1737022 125 FILE *wavfile;
sravet 0:ef6fc1737022 126 long num_slices;
sravet 0:ef6fc1737022 127 long long slice_value;
sravet 0:ef6fc1737022 128 int verbosity=0;
sravet 0:ef6fc1737022 129 DAC_wptr=0;
sravet 0:ef6fc1737022 130 DAC_rptr=0;
sravet 0:ef6fc1737022 131 for (i=0;i<256;i+=2) {
sravet 0:ef6fc1737022 132 DAC_fifo[i]=0;
sravet 0:ef6fc1737022 133 DAC_fifo[i+1]=3000;
sravet 0:ef6fc1737022 134 }
sravet 0:ef6fc1737022 135 DAC_wptr=4;
sravet 0:ef6fc1737022 136
sravet 0:ef6fc1737022 137 body.period_us(100);
sravet 0:ef6fc1737022 138 mouth.period_us(100);
sravet 0:ef6fc1737022 139 tail.period_us(100);
sravet 0:ef6fc1737022 140 led1=led2=led3=led4=0;
sravet 0:ef6fc1737022 141
sravet 0:ef6fc1737022 142 printf("Playing wave file '%s', mov file '%s'\n",wavname,movname);
sravet 0:ef6fc1737022 143
sravet 0:ef6fc1737022 144 wavfile=fopen(wavname,"rb");
sravet 0:ef6fc1737022 145 if (!wavfile) {
sravet 0:ef6fc1737022 146 printf("Unable to open wav file '%s'\n",wavname);
sravet 0:ef6fc1737022 147 return;
sravet 0:ef6fc1737022 148 }
sravet 0:ef6fc1737022 149
sravet 0:ef6fc1737022 150
sravet 0:ef6fc1737022 151 fread(&chunk_id,4,1,wavfile);
sravet 0:ef6fc1737022 152 fread(&chunk_size,4,1,wavfile);
sravet 0:ef6fc1737022 153 while (!feof(wavfile)) {
sravet 0:ef6fc1737022 154 printf("Read chunk ID 0x%x, size 0x%x\n",chunk_id,chunk_size);
sravet 0:ef6fc1737022 155 switch (chunk_id) {
sravet 0:ef6fc1737022 156 case 0x46464952:
sravet 0:ef6fc1737022 157 fread(&data,4,1,wavfile);
sravet 0:ef6fc1737022 158 printf("RIFF chunk\n");
sravet 0:ef6fc1737022 159 printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size);
sravet 0:ef6fc1737022 160 printf(" RIFF type 0x%x\n",data);
sravet 0:ef6fc1737022 161 break;
sravet 0:ef6fc1737022 162 case 0x20746d66:
sravet 0:ef6fc1737022 163 fread(&wav_format,sizeof(wav_format),1,wavfile);
sravet 0:ef6fc1737022 164 printf("FORMAT chunk\n");
sravet 0:ef6fc1737022 165 printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size);
sravet 0:ef6fc1737022 166 printf(" compression code %d\n",wav_format.comp_code);
sravet 0:ef6fc1737022 167 printf(" %d channels\n",wav_format.num_channels);
sravet 0:ef6fc1737022 168 printf(" %d samples/sec\n",wav_format.sample_rate);
sravet 0:ef6fc1737022 169 printf(" %d bytes/sec\n",wav_format.avg_Bps);
sravet 0:ef6fc1737022 170 printf(" block align %d\n",wav_format.block_align);
sravet 0:ef6fc1737022 171 printf(" %d bits per sample\n",wav_format.sig_bps);
sravet 0:ef6fc1737022 172 if (chunk_size > sizeof(wav_format))
sravet 0:ef6fc1737022 173 fseek(wavfile,chunk_size-sizeof(wav_format),SEEK_CUR);
sravet 0:ef6fc1737022 174 // create a slice buffer large enough to hold multiple slices
sravet 0:ef6fc1737022 175 slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
sravet 0:ef6fc1737022 176 if (!slice_buf) {
sravet 0:ef6fc1737022 177 printf("Unable to malloc slice buffer");
sravet 0:ef6fc1737022 178 exit(1);
sravet 0:ef6fc1737022 179 }
sravet 0:ef6fc1737022 180 // now that the sample rate is known, process the movement file
sravet 0:ef6fc1737022 181 num_movements=process_movement_file(movname,movements,wav_format.sample_rate);
sravet 0:ef6fc1737022 182 break;
sravet 0:ef6fc1737022 183
sravet 0:ef6fc1737022 184 case 0x61746164:
sravet 0:ef6fc1737022 185 slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE);
sravet 0:ef6fc1737022 186 if (!slice_buf) {
sravet 0:ef6fc1737022 187 printf("Unable to malloc slice buffer");
sravet 0:ef6fc1737022 188 exit(1);
sravet 0:ef6fc1737022 189 } num_slices=chunk_size/wav_format.block_align;
sravet 0:ef6fc1737022 190 printf("DATA chunk\n");
sravet 0:ef6fc1737022 191 printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size);
sravet 0:ef6fc1737022 192 printf(" %d slices\n",num_slices);
sravet 0:ef6fc1737022 193 printf(" Ideal sample interval=%d\n",(unsigned)(1000000.0/wav_format.sample_rate));
sravet 0:ef6fc1737022 194 samp_int=1000000/(wav_format.sample_rate);
sravet 0:ef6fc1737022 195 if (slow) samp_int*=1.5;
sravet 0:ef6fc1737022 196 printf(" programmed interrupt tick interval=%d\n",samp_int);
sravet 0:ef6fc1737022 197
sravet 0:ef6fc1737022 198 // starting up ticker to write samples out -- no printfs until tick.detach is called
sravet 0:ef6fc1737022 199 current_movement=0;
sravet 0:ef6fc1737022 200 tick.attach_us(&dac_out, samp_int);
sravet 0:ef6fc1737022 201 led2=1;
sravet 0:ef6fc1737022 202 for (slice=0;slice<num_slices;slice+=SLICE_BUF_SIZE) {
sravet 0:ef6fc1737022 203 fread(slice_buf,wav_format.block_align*SLICE_BUF_SIZE,1,wavfile);
sravet 0:ef6fc1737022 204 if (feof(wavfile)) {
sravet 0:ef6fc1737022 205 printf("Oops -- not enough slices in the wave file\n");
sravet 0:ef6fc1737022 206 exit(1);
sravet 0:ef6fc1737022 207 }
sravet 0:ef6fc1737022 208 data_sptr=(short *)slice_buf;
sravet 0:ef6fc1737022 209 data_bptr=(unsigned char *)slice_buf;
sravet 0:ef6fc1737022 210 data_wptr=(int *)slice_buf;
sravet 0:ef6fc1737022 211 slice_value=0;
sravet 0:ef6fc1737022 212 for (i=0;i<SLICE_BUF_SIZE;i++) {
sravet 0:ef6fc1737022 213 for (channel=0;channel<wav_format.num_channels;channel++) {
sravet 0:ef6fc1737022 214 switch (wav_format.sig_bps) {
sravet 0:ef6fc1737022 215 case 16:
sravet 0:ef6fc1737022 216 if (verbosity)
sravet 0:ef6fc1737022 217 printf("16 bit channel %d data=%d ",channel,data_sptr[channel]);
sravet 0:ef6fc1737022 218 slice_value+=data_sptr[channel];
sravet 0:ef6fc1737022 219 break;
sravet 0:ef6fc1737022 220 case 32:
sravet 0:ef6fc1737022 221 if (verbosity)
sravet 0:ef6fc1737022 222 printf("32 bit channel %d data=%d ",channel,data_wptr[channel]);
sravet 0:ef6fc1737022 223 slice_value+=data_wptr[channel];
sravet 0:ef6fc1737022 224 break;
sravet 0:ef6fc1737022 225 case 8:
sravet 0:ef6fc1737022 226 if (verbosity)
sravet 0:ef6fc1737022 227 printf("8 bit channel %d data=%d ",channel,(int)data_bptr[channel]);
sravet 0:ef6fc1737022 228 slice_value+=data_bptr[channel];
sravet 0:ef6fc1737022 229 break;
sravet 0:ef6fc1737022 230 }
sravet 0:ef6fc1737022 231 }
sravet 0:ef6fc1737022 232 slice_value/=wav_format.num_channels;
sravet 0:ef6fc1737022 233
sravet 0:ef6fc1737022 234 // slice_value is now averaged. Next it needs to be scaled to an unsigned 16 bit value
sravet 0:ef6fc1737022 235 // with DC offset so it can be written to the DAC.
sravet 0:ef6fc1737022 236 switch (wav_format.sig_bps) {
sravet 0:ef6fc1737022 237 case 8: slice_value<<=8;
sravet 0:ef6fc1737022 238 break;
sravet 0:ef6fc1737022 239 case 16: slice_value+=32768;
sravet 0:ef6fc1737022 240 break;
sravet 0:ef6fc1737022 241 case 32: slice_value>>=16;
sravet 0:ef6fc1737022 242 slice_value+=32768;
sravet 0:ef6fc1737022 243 break;
sravet 0:ef6fc1737022 244 }
sravet 0:ef6fc1737022 245 dac_data=(short unsigned )slice_value;
sravet 0:ef6fc1737022 246 if (verbosity)
sravet 0:ef6fc1737022 247 printf("sample %d wptr %d slice_value %d dac_data %u\n",slice,DAC_wptr,(int)slice_value,dac_data);
sravet 0:ef6fc1737022 248
sravet 0:ef6fc1737022 249 // finally stick it in the DAC FIFO. If the write pointer wraps around and meets the read pointer
sravet 0:ef6fc1737022 250 // the wait until the read pointer moves.
sravet 0:ef6fc1737022 251 DAC_fifo[DAC_wptr]=dac_data;
sravet 0:ef6fc1737022 252 DAC_wptr=(DAC_wptr+1) & 0xff;
sravet 0:ef6fc1737022 253 while (DAC_wptr==DAC_rptr) {
sravet 0:ef6fc1737022 254 }
sravet 0:ef6fc1737022 255 }
sravet 0:ef6fc1737022 256 }
sravet 0:ef6fc1737022 257 led2=0;
sravet 0:ef6fc1737022 258 // wait for ISR to drain FIFO
sravet 0:ef6fc1737022 259 wait_us(300);
sravet 0:ef6fc1737022 260 tick.detach();
sravet 0:ef6fc1737022 261 printf("Ticker detached\n");
sravet 0:ef6fc1737022 262 led3=1;
sravet 0:ef6fc1737022 263 free(slice_buf);
sravet 0:ef6fc1737022 264 break;
sravet 0:ef6fc1737022 265 case 0x5453494c:
sravet 0:ef6fc1737022 266 printf("INFO chunk, size %d\n",chunk_size);
sravet 0:ef6fc1737022 267 fseek(wavfile,chunk_size,SEEK_CUR);
sravet 0:ef6fc1737022 268 break;
sravet 0:ef6fc1737022 269 default:
sravet 0:ef6fc1737022 270 printf("unknown chunk type 0x%x, size %d\n",chunk_id,chunk_size);
sravet 0:ef6fc1737022 271 data=fseek(wavfile,chunk_size,SEEK_CUR);
sravet 0:ef6fc1737022 272 break;
sravet 0:ef6fc1737022 273 }
sravet 0:ef6fc1737022 274 fread(&chunk_id,4,1,wavfile);
sravet 0:ef6fc1737022 275 fread(&chunk_size,4,1,wavfile);
sravet 0:ef6fc1737022 276 }
sravet 0:ef6fc1737022 277 printf("Done with wave file\n");
sravet 0:ef6fc1737022 278 fclose(wavfile);
sravet 0:ef6fc1737022 279 led1=0;
sravet 0:ef6fc1737022 280 body.pulsewidth_us(0);
sravet 0:ef6fc1737022 281 mouth.pulsewidth_us(0);
sravet 0:ef6fc1737022 282 tail.pulsewidth_us(0);
sravet 0:ef6fc1737022 283 }
sravet 0:ef6fc1737022 284
sravet 0:ef6fc1737022 285
sravet 0:ef6fc1737022 286 void dac_out() {
Dean 1:35e4090cf6aa 287 // This line declared but not used int value;
sravet 0:ef6fc1737022 288 digout=1;
sravet 0:ef6fc1737022 289 if (!movements[current_movement].played) {
sravet 0:ef6fc1737022 290 if (movements[current_movement].sample<=slice) {
sravet 0:ef6fc1737022 291 if (movements[current_movement].motor==0) body.pulsewidth_us(movements[current_movement].duty_cycle);
sravet 0:ef6fc1737022 292 if (movements[current_movement].motor==1) mouth.pulsewidth_us(movements[current_movement].duty_cycle);
sravet 0:ef6fc1737022 293 if (movements[current_movement].motor==2) tail.pulsewidth_us(movements[current_movement].duty_cycle);
sravet 0:ef6fc1737022 294 movements[current_movement].played=1;
sravet 0:ef6fc1737022 295 current_movement++;
sravet 0:ef6fc1737022 296 }
sravet 0:ef6fc1737022 297 }
sravet 0:ef6fc1737022 298 DACout.write_u16(DAC_fifo[DAC_rptr]);
sravet 0:ef6fc1737022 299 DAC_rptr=(DAC_rptr+1) & 0xff;
sravet 0:ef6fc1737022 300 digout=0;
sravet 0:ef6fc1737022 301 }
sravet 0:ef6fc1737022 302
sravet 0:ef6fc1737022 303
sravet 0:ef6fc1737022 304 void cleanup(char *s)
sravet 0:ef6fc1737022 305 {
sravet 0:ef6fc1737022 306 char *t;
sravet 0:ef6fc1737022 307 t=strchr(s,'\n');
sravet 0:ef6fc1737022 308 if (t) *t=0;
sravet 0:ef6fc1737022 309 t=strchr(s,'\r');
sravet 0:ef6fc1737022 310 if (t) *t=0;
sravet 0:ef6fc1737022 311 }
sravet 0:ef6fc1737022 312
sravet 0:ef6fc1737022 313 unsigned process_movement_file (char *mfname, MOV_STRUCT *mv,unsigned samp_rate)
sravet 0:ef6fc1737022 314 {
sravet 0:ef6fc1737022 315 FILE *movfile;
sravet 0:ef6fc1737022 316 char line[100],*tmp;
sravet 0:ef6fc1737022 317 unsigned num_movements,i,j,x;
sravet 0:ef6fc1737022 318 movfile=fopen(mfname,"rb");
sravet 0:ef6fc1737022 319 if (!movfile) {
sravet 0:ef6fc1737022 320 printf("Unable to open mov file '%s'\n",mfname);
sravet 0:ef6fc1737022 321 return 0;
sravet 0:ef6fc1737022 322 }
sravet 0:ef6fc1737022 323
sravet 0:ef6fc1737022 324 fgets(line,100,movfile);
sravet 0:ef6fc1737022 325 num_movements=0;
sravet 0:ef6fc1737022 326 #ifdef VERBOSE
sravet 0:ef6fc1737022 327 printf("Motor report...\n");
sravet 0:ef6fc1737022 328 #endif
sravet 0:ef6fc1737022 329 while (!feof(movfile)) {
sravet 0:ef6fc1737022 330 if (line[0]!='#') {
sravet 0:ef6fc1737022 331 tmp=line;
sravet 0:ef6fc1737022 332 // first thing on line is time in ms
sravet 0:ef6fc1737022 333 movements[num_movements].sample=(atol(tmp)*samp_rate)/1000;
sravet 0:ef6fc1737022 334 // skip digits (non whitespace)
sravet 0:ef6fc1737022 335 tmp=line;
sravet 0:ef6fc1737022 336 while (*tmp!=' ' && *tmp!='\t' && *tmp!=0)
sravet 0:ef6fc1737022 337 tmp++;
sravet 0:ef6fc1737022 338 // skip whitespace
sravet 0:ef6fc1737022 339 while ((*tmp==' ' | *tmp=='\t') && *tmp!=0)
sravet 0:ef6fc1737022 340 tmp++;
sravet 0:ef6fc1737022 341 if (strstr(tmp,"body"))
sravet 0:ef6fc1737022 342 movements[num_movements].motor=0;
sravet 0:ef6fc1737022 343 if (strstr(tmp,"mouth"))
sravet 0:ef6fc1737022 344 movements[num_movements].motor=1;
sravet 0:ef6fc1737022 345 if (strstr(tmp,"tail"))
sravet 0:ef6fc1737022 346 movements[num_movements].motor=2;
sravet 0:ef6fc1737022 347 // skip letters (non whitespace)
sravet 0:ef6fc1737022 348 while (*tmp!=' ' && *tmp!='\t')
sravet 0:ef6fc1737022 349 tmp++;
sravet 0:ef6fc1737022 350 // skip whitespace
sravet 0:ef6fc1737022 351 while (*tmp==' ' | *tmp=='\t')
sravet 0:ef6fc1737022 352 tmp++;
sravet 0:ef6fc1737022 353 if (tmp)
sravet 0:ef6fc1737022 354 movements[num_movements].duty_cycle=atoi(tmp);
sravet 0:ef6fc1737022 355 movements[num_movements].played=0;
sravet 0:ef6fc1737022 356 #ifdef VERBOSE
sravet 0:ef6fc1737022 357 printf(" moving motor %d at sample %ld with duty cycle %d\n",movements[num_movements].motor,movements[num_movements].sample,movements[num_movements].duty_cycle);
sravet 0:ef6fc1737022 358 #endif
sravet 0:ef6fc1737022 359 num_movements++;
sravet 0:ef6fc1737022 360 }
sravet 0:ef6fc1737022 361 fgets(line,100,movfile);
sravet 0:ef6fc1737022 362 }
sravet 0:ef6fc1737022 363 printf(" %d movements read\n",num_movements);
sravet 0:ef6fc1737022 364 printf(" sorting movements...");
sravet 0:ef6fc1737022 365 for (i=0;i<num_movements;i++) {
sravet 0:ef6fc1737022 366 for (j=i;j<num_movements;j++) {
sravet 0:ef6fc1737022 367 if (movements[j].sample < movements[i].sample) {
sravet 0:ef6fc1737022 368 x=movements[i].sample; movements[i].sample=movements[j].sample; movements[j].sample=x;
sravet 0:ef6fc1737022 369 x=movements[i].motor ; movements[i].motor =movements[j].motor ; movements[j].motor =x;
sravet 0:ef6fc1737022 370 x=movements[i].duty_cycle;movements[i].duty_cycle=movements[j].duty_cycle;movements[j].duty_cycle=x;
sravet 0:ef6fc1737022 371 }
sravet 0:ef6fc1737022 372 }
sravet 0:ef6fc1737022 373 }
sravet 0:ef6fc1737022 374 printf("done\n");
sravet 0:ef6fc1737022 375 return num_movements;
sravet 0:ef6fc1737022 376 }