Big Mouth Billy Bass automation library

Dependents:   BillyBass_with_SD

Revision:
1:9b1f3eb204ac
Parent:
0:84aaade0de8f
Child:
3:6c91a6232c4a
--- a/song.cpp	Mon Jun 17 22:17:59 2013 +0000
+++ b/song.cpp	Tue Jun 18 00:07:47 2013 +0000
@@ -15,8 +15,6 @@
 char const *Song::sampleExtension = "raw";
 // class static
 unsigned const Song::NO_FISH = MAX_FISH + 1;
-// class static
-std::list<Song*> Song::songs;
 
 // _name is relative to BASS_DIRECTORY
 // class static
@@ -31,11 +29,11 @@
         pc.printf("parseFilename(%s) failed\r\n", _name);
         goto on_error;
     }
+    pc.printf("parsed filename OK\r\n");
     if (! s->readActions()) {
         pc.printf("readActions(%s) failed\r\n", _name);
         goto on_error;
     }
-    songs.push_back(s);
 
     return s;
 
@@ -44,36 +42,6 @@
     return 0;
 }
 
-// class static
-void Song::clearAllSongs()
-{
-    for (std::list<Song *>::const_iterator song = songs.begin(); song != songs.end(); song++)
-        delete *song;
-    songs.clear();
-}
-
-// class static
-unsigned Song::readAllSongs(DIR *bassDir)
-{
-    if (!bassDir) return 0;
-    clearAllSongs();
-
-    while (dirent *dir = bassDir->readdir()) {
-        pc.printf("Reading %s\r\n", dir->d_name);
-        unsigned namelen = strlen(dir->d_name);
-        if (namelen > 9 && !strcasecmp(dir->d_name + namelen - 3, sampleExtension)) {
-            Song *song = Song::newSong(dir->d_name);
-            if (!song) {
-                pc.printf("ERROR reading %s\r\n", dir->d_name);
-            } else {
-                song->print(pc);
-            }
-        }
-    }
-
-    return songs.size();
-}
-
 bool Song::parseFilename(char const *_name)
 {
     if (strlen(_name) > MAX_BASENAME_LENGTH)
@@ -117,11 +85,14 @@
 
 bool Song::readActions()
 {
+    pc.printf("reading actions of %s\r\n", getTextFileName());
+
     FILE *txtfile = fopen(getTextFileName(), "r");
     if (!txtfile)  {
         pc.printf("can't open %s\r\n", getTextFileName());
         return false;
-    }
+    } else
+        pc.printf("opened %s OK\r\n", getTextFileName());
     bool retval = false;
 
     BillyBass *bass = BillyBass::bassNumber(whichFish);
@@ -131,16 +102,18 @@
     }
 
     // read actions from file
+    static char textFileBuffer[ 2048 ];
+    memset(textFileBuffer, 0, sizeof(textFileBuffer));
+    int nread = fread(textFileBuffer, 1, sizeof(textFileBuffer), txtfile);
+    pc.printf("Read %d\r\n", nread);
+    if (nread <= 0 || nread == sizeof(textFileBuffer)) {
+        goto done;
+    }
     unsigned line = 1;
-    char actionLine[ MAX_ACTION_LINE_LENGTH + 1 ];
-    while (true) {
-        if (!fgets(actionLine, sizeof(actionLine), txtfile))
-            break;
-
-        // delete trailing whitespace
-        char *p = actionLine + strlen(actionLine) - 1;
-        while (isspace(*p)) *p-- = 0;
-
+    for (char *actionLine = strtok(textFileBuffer, "\r\n");
+            actionLine;
+            actionLine = strtok(0, "\r\n"), line++) {
+        char *p;
         float startTime = strtof(actionLine, &p);
         if (p == actionLine)
             goto done;
@@ -150,29 +123,23 @@
         if (q == p)
             goto done;
 
-        while (isspace(*q)) q++;
-
         char const *outName;
-        DigitalOut *out = bass->outputNamed(q, &outName);
+        DigitalOut *out = bass->outputNamed(++q, &outName);
         if (!out) {
             pc.printf("%s line %d: bad outname \"%s\"\r\n", getTextFileName(), line, q);
             goto done;
         }
         pc.printf("%d add %f %f %s\r\n", line, startTime, endTime, outName);
 
-        actions.push_back(Action(startTime, true, out, outName));
-        actions.push_back(Action(endTime, false, out, outName));
-
-        line++;
+        // actions.push_back(Action(startTime, true, out, outName));
+        // actions.push_back(Action(endTime, false, out, outName));
     }
 
     std::sort(actions.begin(), actions.end()); // sort actions by time
     retval = true;
 
 done:
-    if (!retval) {
-        pc.printf("Error reading action from \"%s\"\r\n", actionLine);
-    }
+
     fclose(txtfile);
     return retval;
 }