Changes

Jump to: navigation, search

Students/Ian Petrov

9,327 bytes removed, 09:10, 20 March 2010
no edit summary
----
<pre>
<span style="color: #7E7E7E;">//Ian&nbsp;Petrov&nbsp;VIS147A&nbsp;Final</span><span style="color: #7E7E7E;">//code&nbsp;edited&nbsp;from&nbsp;Adafruit&nbsp;Wave&nbsp;Shield&nbsp;Site</span>#include&nbsp;<FatReader.h>#include&nbsp;<SdReader.h>#include&nbsp;<avr/pgmspace.h>#include&nbsp;<span style="color: #006699;">"WaveUtil.h"</span>#include&nbsp;<span style="color: #006699;">"WaveHC.h"</span>
SdReader&nbsp;card;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // This object holds the information for the card</span>FatVolume&nbsp;vol;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // This holds the information for the partition on the card</span>FatReader&nbsp;root;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // This holds the information for the filesystem on the card</span>FatReader&nbsp;f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // This holds the information for the file we're play</span>
WaveHC&nbsp;wave;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // This is the only wave (audio) object, since we will only play one at a time</span>
#define&nbsp;DEBOUNCE&nbsp;100&nbsp;&nbsp;<span style="color: #7E7E7E;"> // button debouncer</span>
<span style="color: #7E7E7E;">//&nbsp;this&nbsp;handy&nbsp;function&nbsp;will&nbsp;return&nbsp;the&nbsp;number&nbsp;of&nbsp;bytes&nbsp;currently&nbsp;free&nbsp;in&nbsp;RAM,&nbsp;great&nbsp;for&nbsp;debugging!&nbsp;&nbsp;&nbsp;</span> <span style="color: #CC6600;">int</span> freeRam(<span style="color: #CC6600;">void</span>)
{
&nbsp;&nbsp; extern&nbsp;<span style="color: #CC6600;">int</span> __bss_end; &nbsp;&nbsp; extern&nbsp;<span style="color: #CC6600;">int</span> *__brkval; &nbsp;&nbsp;<span style="color: #CC6600;"> int</span> free_memory; &nbsp;&nbsp;<span style="color: #CC6600;"> if</span>((<span style="color: #CC6600;">int</span>)__brkval == 0) {&nbsp;&nbsp;&nbsp;&nbsp; free_memory&nbsp;=&nbsp;((<span style="color: #CC6600;">int</span>)&free_memory) - ((<span style="color: #CC6600;">int</span>)&__bss_end); &nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #CC6600;"> else</span> {&nbsp;&nbsp;&nbsp;&nbsp; free_memory&nbsp;=&nbsp;((<span style="color: #CC6600;">int</span>)&free_memory) - ((<span style="color: #CC6600;">int</span>)__brkval); &nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #CC6600;"> return</span> free_memory; }&nbsp;
<span style="color: #CC6600;">void</span> sdErrorCheck(<span style="color: #CC6600;">void</span>)
{
&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (!card.errorCode()) <span style="color: #CC6600;">return</span>;&nbsp;&nbsp; putstring(<span style="color: #006699;">"\n\rSD I/O error: "</span>);&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">print</span>(card.errorCode(), <span style="color: #006699;">HEX</span>);&nbsp;&nbsp; putstring(<span style="color: #006699;">", "</span>);&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(card.errorData(), <span style="color: #006699;">HEX</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> while</span>(1);
}
<span style="color: #CC6600;">void</span> <span style="color: #CC6600;"><b>setup</b></span>() {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // set up serial port</span>&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">begin</span>(9600);&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"WaveHC with 6 buttons"</span>);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; putstring(<span style="color: #006699;">"Free RAM: "</span>); <span style="color: #7E7E7E;">// This can help with debugging, running out of RAM is bad</span>&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(freeRam()); <span style="color: #7E7E7E;">// if this is under 150 bytes it may spell trouble!</span>&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // Set the output pins for the DAC control. This pins are defined in the library</span>&nbsp;&nbsp;<span style="color: #CC6600;"> pinMode</span>(2, <span style="color: #006699;">OUTPUT</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> pinMode</span>(3, <span style="color: #006699;">OUTPUT</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> pinMode</span>(4, <span style="color: #006699;">OUTPUT</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> pinMode</span>(5, <span style="color: #006699;">OUTPUT</span>);&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // pin13 LED</span>&nbsp;&nbsp;<span style="color: #CC6600;"> pinMode</span>(13, <span style="color: #006699;">OUTPUT</span>);&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // enable pull-up resistors on switch pins (analog inputs)</span>&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(14, <span style="color: #006699;">HIGH</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(15, <span style="color: #006699;">HIGH</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(16, <span style="color: #006699;">HIGH</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(17, <span style="color: #006699;">HIGH</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(18, <span style="color: #006699;">HIGH</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> digitalWrite</span>(19, <span style="color: #006699;">HIGH</span>);&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you</span>&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (!card.init()) { <span style="color: #7E7E7E;">//play with 8 MHz spi (default faster!) </span>&nbsp;&nbsp;&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"Card init. failed!"</span>); <span style="color: #7E7E7E;">// Something went wrong, lets print out why</span>&nbsp;&nbsp;&nbsp;&nbsp; sdErrorCheck();&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span>&nbsp;&nbsp; }&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // enable optimize read - some cards may timeout. Disable if you're having problems</span>&nbsp;&nbsp; card.partialBlockRead(<span style="color: #CC6600;">true</span>);&nbsp; <span style="color: #7E7E7E;">//&nbsp;Now&nbsp;we&nbsp;will&nbsp;look&nbsp;for&nbsp;a&nbsp;FAT&nbsp;partition!</span>&nbsp;&nbsp; uint8_t&nbsp;part;&nbsp;&nbsp;<span style="color: #CC6600;"> for</span> (part = 0; part < 5; part++) { <span style="color: #7E7E7E;">// we have up to 5 slots to look in</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (vol.init(card, part)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>; <span style="color: #7E7E7E;">// we found one, lets bail</span>&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (part == 5) { <span style="color: #7E7E7E;">// if we ended up not finding one :(</span>&nbsp;&nbsp;&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"No valid FAT partition!"</span>);&nbsp;&nbsp;&nbsp;&nbsp; sdErrorCheck();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // Something went wrong, lets print out why</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span>&nbsp;&nbsp; }&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // Lets tell the user about what we found</span>&nbsp;&nbsp; putstring(<span style="color: #006699;">"Using partition "</span>);&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">print</span>(part, <span style="color: #006699;">DEC</span>);&nbsp;&nbsp; putstring(<span style="color: #006699;">", type is FAT"</span>);&nbsp;&nbsp;<span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(vol.fatType(),<span style="color: #006699;">DEC</span>); <span style="color: #7E7E7E;">// FAT16 or FAT32?</span>&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // Try to open the root directory</span>&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (!root.openRoot(vol)) {&nbsp;&nbsp;&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"Can't open root dir!"</span>); <span style="color: #7E7E7E;">// Something went wrong,</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span>&nbsp;&nbsp; }&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // Whew! We got past the tough parts.</span>&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"Ready!"</span>);
}
<span style="color: #CC6600;">void</span> playcomplete(<span style="color: #CC6600;">char</span> good) {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // call our helper to find and play this name</span>&nbsp;&nbsp; playfile(<span style="color: #006699;">"GOOD.WAV"</span>);&nbsp;&nbsp;<span style="color: #CC6600;"> while</span> (wave.isplaying) {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // do nothing while its playing</span>&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #7E7E7E;"> // now its done playing</span>
}
<span style="color: #CC6600;">void</span> <span style="color: #CC6600;"><b>loop</b></span>() {&nbsp;&nbsp;<span style="color: #7E7E7E;"> //putstring("."); // uncomment this to see if the loop isnt running </span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #CC6600;"> switch</span> (check_switches()) { <span style="color: #7E7E7E;">//this is the loop which cycles the arnold sounds based</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> case</span> 1: <span style="color: #7E7E7E;">//on which switch you connect to.</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; playcomplete(<span style="color: #006699;">"STOP.WAV"</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> case</span> 2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; playcomplete(<span style="color: #006699;">"SOB.WAV"</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> case</span> 3:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; playcomplete(<span style="color: #006699;">"DONT.WAV"</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> case</span> 4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; playcomplete(<span style="color: #006699;">"LACK.WAV"</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> case</span> 5:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; playcomplete(<span style="color: #006699;">"FIST.WAV"</span>);&nbsp;&nbsp; }
}
<span style="color: #CC6600;">byte</span> check_switches()
{
&nbsp;&nbsp;<span style="color: #CC6600;"> static</span> <span style="color: #CC6600;">byte</span> previous[6];&nbsp;&nbsp;<span style="color: #CC6600;"> static</span> <span style="color: #CC6600;">long</span> time[6];&nbsp;&nbsp;<span style="color: #CC6600;"> byte</span> reading;&nbsp;&nbsp;<span style="color: #CC6600;"> byte</span> pressed;&nbsp;&nbsp;<span style="color: #CC6600;"> byte</span> index;&nbsp;&nbsp; pressed&nbsp;=&nbsp;0;
&nbsp;&nbsp;<span style="color: #CC6600;"> for</span> (<span style="color: #CC6600;">byte</span> index = 0; index < 6; ++index) {&nbsp;&nbsp;&nbsp;&nbsp; reading&nbsp;=&nbsp;<span style="color: #CC6600;">digitalRead</span>(14 + index);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (reading == <span style="color: #006699;">LOW</span> && previous[index] == <span style="color: #006699;">HIGH</span> && <span style="color: #CC6600;">millis</span>() - time[index] > DEBOUNCE)&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7E7E7E;"> // switch pressed</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time[index]&nbsp;=&nbsp;<span style="color: #CC6600;">millis</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pressed&nbsp;=&nbsp;index&nbsp;+&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #CC6600;"> break</span>;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; previous[index]&nbsp;=&nbsp;reading;&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #7E7E7E;"> // return switch number (1 - 6)</span>&nbsp;&nbsp;<span style="color: #CC6600;"> return</span> (pressed);
}
<span style="color: #7E7E7E;">//&nbsp;Plays&nbsp;a&nbsp;full&nbsp;file&nbsp;from&nbsp;beginning&nbsp;to&nbsp;end&nbsp;with&nbsp;no&nbsp;pause.</span><span style="color: #CC6600;">void</span> playcomplete(<span style="color: #CC6600;">char</span> *name) {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // call our helper to find and play this name</span>&nbsp;&nbsp; playfile(name);&nbsp;&nbsp;<span style="color: #CC6600;"> while</span> (wave.isplaying) {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // do nothing while its playing</span>&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #7E7E7E;"> // now its done playing</span>
}
<span style="color: #CC6600;">void</span> playfile(<span style="color: #CC6600;">char</span> *name) {&nbsp;&nbsp;<span style="color: #7E7E7E;"> // see if the wave object is currently doing something</span>&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (wave.isplaying) {<span style="color: #7E7E7E;">// already playing something, so stop it!</span>&nbsp;&nbsp;&nbsp;&nbsp; wave.<span style="color: #CC6600;">stop</span>(); <span style="color: #7E7E7E;">// stop it</span>&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #7E7E7E;"> // look in the root directory and open the file</span>&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (!f.open(root, name)) {&nbsp;&nbsp;&nbsp;&nbsp; putstring(<span style="color: #006699;">"Couldn't open file "</span>); <span style="color: #CC6600;"><b>Serial</b></span>.<span style="color: #CC6600;">print</span>(name); <span style="color: #CC6600;">return</span>;&nbsp;&nbsp; }&nbsp;&nbsp;<span style="color: #7E7E7E;"> // OK read the file and turn it into a wave object</span>&nbsp;&nbsp;<span style="color: #CC6600;"> if</span> (!wave.create(f)) {&nbsp;&nbsp;&nbsp;&nbsp; putstring_nl(<span style="color: #006699;">"Not a valid WAV"</span>); <span style="color: #CC6600;">return</span>;&nbsp;&nbsp; }&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #7E7E7E;"> // ok time to play! start playback</span>&nbsp;&nbsp; wave.play();
}
 
</pre>
25
edits

Navigation menu