Библиотека Arduino WaveHC: как указать программе на поиск в папке в корне SD-карты? - PullRequest
1 голос
/ 27 декабря 2010

Не могу понять, как заставить программу выглядеть в определенной папке вместо корня SD-карты. Я пытался изменить путь к файлам, но все, что он говорит, это то, что он не может найти файлы.

Вот код:

#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time

#define DEBOUNCE 100  // button debouncer

// This handy function will return the number of bytes currently free in RAM, great for debugging!
int freeRam(void)
{
    extern int  __bss_end;
    extern int  *__brkval;
    int free_memory;
    if ((int)__brkval == 0) {
        free_memory = ((int)&free_memory) - ((int)&__bss_end);
}
else {
    free_memory = ((int)&free_memory) - ((int)__brkval);
}
    return free_memory;
}

void sdErrorCheck(void)
{
    if (!card.errorCode())
        return;
    putstring("\n\rSD I/O error: ");
    Serial.print(card.errorCode(), HEX);
    putstring(", ");
    Serial.println(card.errorData(), HEX);
    while(1);
}

void setup() {
    // Set up serial port
    Serial.begin(9600);
    putstring_nl("WaveHC with 6 buttons");

    putstring("Free RAM: ");  // This can help with debugging, running out of RAM is bad
    Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble!

    // Set the output pins for the DAC control. This pins are defined in the library
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);

    // pin13 LED
    pinMode(13, OUTPUT);

    // Enable pull-up resistors on switch pins (analog inputs)
    digitalWrite(14, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(16, HIGH);
    digitalWrite(17, HIGH);
    digitalWrite(18, HIGH);
    digitalWrite(19, HIGH);

    //  if (!card.init(true)) { //play with 4 MHz SPI if 8MHz isn't working for you
    if (!card.init()) {    //play with 8 MHz SPI (default faster!)
        putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
        sdErrorCheck();
        while(1);        // then 'halt' - do nothing!
    }

    // enable optimize read - some cards may timeout. Disable if you're having problems
    card.partialBlockRead(true);

    // Now we will look for a FAT partition!
    uint8_t part;
    for (part = 0; part < 5; part++) { // We have up to 5 slots to look in
        if (vol.init(card, part))
            break;         // We found one, let's bail
    }
    if (part == 5) { // if we ended up not finding one  :(
      putstring_nl("No valid FAT partition!");
      sdErrorCheck(); // Something went wrong, lets print out why
      while(1);        // then 'halt' - do nothing!
    }

    // Let's tell the user about what we found
    putstring("Using partition ");
    Serial.print(part, DEC);
    putstring(", type is FAT");
    Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?

    // Try to open the root directory
    if (!root.openRoot(vol)) {
        putstring_nl("Can't open root dir!"); // Something went wrong,
        while(1);         // then 'halt' - do nothing!
    }

    // Whew! We got past the tough parts.
    putstring_nl("Ready!");
}

void loop() {
    //putstring(".");  // Uncomment this to see if the loop isnt running
    switch (check_switches()) {
        case 1:
          playcomplete("1.WAV");
          break;
        case 2:
            playcomplete("2.WAV");
            break;
        case 3:
            playcomplete("3.WAV");
            break;
         case 4:
             playcomplete("4.WAV");
             break;
         case 5:
             playcomplete("5.WAV");
             break;
         case 6:
             playcomplete("6.WAV");
    }
}

byte check_switches()
{
    static byte previous[6];
    static long time[6];
    byte reading;
    byte pressed;
    byte index;
    pressed = 0;

    for (byte index = 0; index < 6; ++index) {
        reading = digitalRead(14 + index);
        if (reading == LOW && previous[index] == HIGH && millis() - time[index] > DEBOUNCE)
        {
            // switch pressed
            time[index] = millis();
            pressed = index + 1;
            break;
        }
        previous[index] = reading;
    }
    // return switch number (1 - 6)
    return (pressed);
}

// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
    // call our helper to find and play this name
    playfile(name);
    while (wave.isplaying) {
        // Do nothing while its playing
    }
    // Now it's done playing
}

void playfile(char *name) {
    // see if the wave object is currently doing something
    if (wave.isplaying) { // Already playing something, so stop it!
          wave.stop(); // Stop it
    }
    // Look in the root directory and open the file
    if (!f.open(root, name)) {
        putstring("Couldn't open file "); Serial.print(name); return;
    }
    // OK read the file and turn it into a wave object
    if (!wave.create(f)) {
        putstring_nl("Not a valid WAV"); return;
    }

    // OK time to play! Start playback
    wave.play();
}

1 Ответ

0 голосов
/ 21 ноября 2011

Ну, у меня нет библиотеки, но, глядя на документацию, вам сначала нужно будет открыть каталог. После того, как вы получили корневой том, сделайте что-то вроде

root.open(root, "mydir");

вероятно вскоре после

  // Try to open the root directory
  if (!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while(1);         // then 'halt' - do nothing!
  }

Когда вы распаковываете библиотеку, она поставляется с некоторой документацией HTML для классов библиотеки FAT. Если мое предложение не работает, обратитесь к документации.

...