Big Mouth Billy Bass automation library

Dependents:   BillyBass_with_SD

Revision:
4:f009306756b3
Parent:
3:6c91a6232c4a
Child:
6:ea8136eb6976
--- a/song.hpp	Tue Jun 18 13:11:07 2013 +0000
+++ b/song.hpp	Tue Jun 18 14:10:34 2013 +0000
@@ -10,22 +10,24 @@
 class Song
 {
 public:
-    typedef std::vector<Action> actions_t;
+    typedef Action actions_t[ MAX_ACTIONS_PER_SONG ];
 
     // _name is relative to BASS_DIRECTORY
     // return a pointer to a fully read-in Song if valid
-    // also adds new song to songs
     static Song *newSong(char const *_name);
 
-    Song() : sequenceNumber(0), whichFish(NO_FISH), basename(0), extension(0) {
-        fullname[0] = 0;
-        actions.reserve(MAX_ACTIONS_PER_SONG);
+
+    void reset() {
+        sequenceNumber = 0;
+        whichFish = NO_FISH;
+        basename = 0;
+        extension = 0;
+        numActions = 0;
     }
-    ~Song() {
-        actions.clear();
+
+    BillyBass * myFish() {
+        return BillyBass::bassNumber(whichFish);
     }
-    
-    BillyBass * myFish() { return BillyBass::bassNumber(whichFish); }
     bool isValid() const {
         return basename != 0 && whichFish != NO_FISH;
     }
@@ -48,24 +50,37 @@
         strcpy(extension, textExtension);
         return fullname;
     }
-    actions_t &getActions() {
+    Action *getActions() {
         return actions;
     }
+    bool addAction(float _time, int _state, DigitalOut* _out) {
+        if (numActions >= MAX_ACTIONS_PER_SONG) return false;
+        actions[numActions++].set(_time, _state, _out);
+        return true;
+    }
+    unsigned getNumActions() const {
+        return numActions;
+    }
 
     void print(FILE *f) {
         fprintf(f, "%s fish=%u seq=%u\r\n", getSampleFileName(), whichFish, sequenceNumber);
-        for (actions_t::const_iterator action_it = actions.begin(); action_it != actions.end(); action_it++) {
-            Action const &action = *action_it;
-            fprintf(f, "%0.02f %s %d\r\n", action.actionTime, action.outputName, action.desiredState ? 1 : 0);
+        Action *lastAction = actions + numActions;
+        for (Action *action = actions; action < lastAction; action++) {
+            fprintf(f, "%0.02f %s %d\r\n", action->actionTime, myFish()->outputName(action->output), action->desiredState);
         }
     }
 
 protected:
+    Song() {
+        reset();
+    }
+    ~Song() {}
 
     static char const directoryName[ BASS_DIRECTORY_LENGTH + 1 ];
     static unsigned const NO_FISH;
     static char const *textExtension;
     static char const *sampleExtension;
+    static Song theSong;
 
     unsigned sequenceNumber;    // 0-relative
     unsigned whichFish;         // 0-relative
@@ -73,6 +88,7 @@
     char *basename;     // points into fullname
     char *extension;    // points into fullname
     actions_t actions;
+    unsigned numActions;
 };
 
 #endif                                 // __included_song_hpp