A test program for the RS animatronic lab board motor drivers.
Dependencies: HBridge mbed FatFileSystem MSCFileSystem WavPlayer
Revision 2:f8199cc69b20, committed 2012-09-21
- Comitter:
- p07gbar
- Date:
- Fri Sep 21 14:24:10 2012 +0000
- Parent:
- 1:939f893149f2
- Commit message:
- Working
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ActionCue/Action.h Fri Sep 21 14:24:10 2012 +0000
@@ -0,0 +1,30 @@
+#ifndef ACTION_H
+#define ACTION_H
+
+class Action
+{
+ public:
+ Action()
+ {
+ actionTime = 0;
+ actionType = -1;
+ actionInt = 0;
+ actionFloat = 0;
+ }
+
+ Action(float time, int type, int aint, float afloat)
+ {
+ actionTime = time;
+ actionType = type;
+ actionInt = aint;
+ actionFloat = afloat;
+ }
+
+ float actionTime;
+ int actionType;
+ int actionInt;
+ float actionFloat;
+};
+
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ActionCue/ActionCue.cpp Fri Sep 21 14:24:10 2012 +0000
@@ -0,0 +1,94 @@
+#include "ActionCue.h"
+#include "mbed.h"
+
+#define ACTIONCUE_ORDERLIMIT 100
+
+ActionCue::ActionCue()
+{
+ start = 0;
+ finish = 0;
+ numStored = 0;
+ for(int i = 0; i < ACTIONCUE_SIZE; i++)
+ {
+ cue[i] = Action();
+ }
+}
+
+void ActionCue::addAction(Action action_to_add)
+{
+ cue[finish] = action_to_add;
+ finish++;
+ numStored++;
+ if(finish >= start && numStored > ACTIONCUE_SIZE)
+ {
+ start++;
+ }
+ finish = wrap(finish);
+ start = wrap(start);
+}
+
+int ActionCue::numActionsStored()
+{
+ return numStored;
+}
+
+Action ActionCue::nextAction()
+{
+ return cue[start];
+}
+
+void ActionCue::usedFirst()
+{
+ start++;
+ numStored--;
+ finish = wrap(finish);
+ start = wrap(start);
+}
+
+Action ActionCue::actionAt(float time)
+{
+ for(int i = 0; i < ACTIONCUE_SIZE; i++)
+ {
+ if(cue[i].actionTime == time) return cue[i];
+ }
+ return Action();
+}
+
+void ActionCue::orderCue()
+{
+ int swapcount = 1;
+ int runcount = 0;
+ Action temp;
+ while((swapcount > 0) && runcount < ACTIONCUE_ORDERLIMIT)
+ {
+ swapcount = 0;
+ for(int i = 0; i < (numStored - 1); i++)
+ {
+ if(cue[wrap(i+1+start)].actionTime <= cue[wrap(i+start)].actionTime)
+ {
+ temp = cue[wrap(i+start)];
+ cue[wrap(i+start)] = cue[wrap(i+1+start)];
+ cue[wrap(i+1+start)] = temp;
+ swapcount++;
+ }
+ }
+ runcount++;
+ }
+ //printf("Ran: %i\n\r",runcount);
+}
+
+int ActionCue::wrap(int in)
+{
+ while(in >= ACTIONCUE_SIZE)
+ {
+ in -= ACTIONCUE_SIZE;
+ }
+ return in;
+}
+
+
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ActionCue/ActionCue.h Fri Sep 21 14:24:10 2012 +0000
@@ -0,0 +1,40 @@
+#ifndef ACTIONCUE_H
+#define ACTIONCUE_H
+
+#define ACTIONCUE_SIZE 100
+#include "Action.h"
+
+class ActionCue
+{
+ public:
+
+ ActionCue();
+
+ void addAction(Action action_to_add);
+
+ int numActionsStored();
+
+ Action nextAction();
+
+ void usedFirst();
+
+ Action actionAt(float time);
+
+ void orderCue();
+
+ private:
+
+ Action cue[ACTIONCUE_SIZE];
+
+ int start;
+
+ int finish;
+
+ int numStored;
+
+ int wrap(int in);
+
+
+};
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FatFileSystem.lib Fri Sep 21 14:24:10 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/p07gbar/code/FatFileSystem/#e869ee8f3c3d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MSCFileSystem.lib Fri Sep 21 14:24:10 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/chris/code/MSCFileSystem/#dcc326e4d358
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WavPlayer.lib Fri Sep 21 14:24:10 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/p07gbar/code/WavPlayer/#a7380cfc1987
--- a/main.cpp Thu Sep 20 11:38:48 2012 +0000
+++ b/main.cpp Fri Sep 21 14:24:10 2012 +0000
@@ -1,14 +1,155 @@
-#include "mbed.h"
-#include "HBridge.h"
-
-HBridge hbridge(p18,p15,p22);
-DigitalIn button(p16);
-AnalogIn pot1(p19);
-
-int main() {
- button.mode(PullDown);
- while(1) {
- hbridge.speed((pot1 - 0.5) * 2);
- hbridge.power(bool(button));
- }
-}
+#include "mbed.h"
+#include "HBridge.h"
+#include "ActionCue.h"
+#include "WavPlayer.h"
+#include "MSCFileSystem.h"
+
+#define TICK_TIME 0.05
+
+MSCFileSystem msc("msc"); // Mount flash drive under the name "msc"
+LocalFileSystem local("local");
+WavPlayer player;
+
+HBridge hbridge(p18,p15,p22);
+DigitalIn button(p16);
+AnalogIn pot1(p19);
+
+HBridge hbridge2(p28,p27,p21);
+DigitalIn button2(p17);
+AnalogIn pot2(p20);
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+
+ActionCue cue;
+
+Ticker ticks;
+
+float c_time;
+
+int audioNumber = 0;
+float audioTime = 0;
+
+extern "C" void HardFault_Handler()
+{
+ error("Hard Fault!\n");
+}
+
+
+enum actionTypes
+{
+ Null = -1,
+ Debug = 0,
+ c_led1,
+ c_led2,
+ motor1,
+ motor2,
+ play
+};
+
+void onTick()
+{
+ while(cue.numActionsStored() > 0)
+ {
+ Action act = cue.nextAction();
+ if(act.actionTime <= c_time)
+ {
+ cue.usedFirst();
+ //printf("Action. Time: %f Type: %i\n\r",act.actionTime, act.actionType);
+ switch(act.actionType)
+ {
+ case Debug:
+ printf("Action. Time: %f Type: %i\n\r",act.actionTime, act.actionType);
+ break;
+ case c_led1:
+ led1 = bool(act.actionInt);
+ break;
+ case c_led2:
+ led2 = bool(act.actionInt);
+ break;
+ case motor1:
+ hbridge.speed(act.actionFloat);
+ hbridge.power(true);
+ break;
+ case motor2:
+ hbridge2.speed(act.actionFloat);
+ hbridge2.power(true);
+ break;
+ case play:
+ audioNumber = act.actionInt;
+ audioTime = act.actionFloat;
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ c_time += float(TICK_TIME);
+}
+
+actionTypes parseType(char in[4])
+{
+ if(strcmp(in, "NULL") == 0) return Null;
+ else if(strcmp(in, "DEBG") == 0) return Debug;
+ else if(strcmp(in, "LED1") == 0) return c_led1;
+ else if(strcmp(in, "LED2") == 0) return c_led2;
+ else if(strcmp(in, "MTR1") == 0) return motor1;
+ else if(strcmp(in, "MTR2") == 0) return motor2;
+ else if(strcmp(in, "PLAY") == 0) return play;
+ else return Null;
+}
+
+int main() {
+ button.mode(PullDown);
+ ticks.attach(&onTick,TICK_TIME);
+ c_time = 0;
+ int returned = 4;
+ printf("Opening the file \n\r");
+ FILE* sequence = fopen("/local/seq.txt","r");
+
+ if(sequence != NULL)
+ {
+ printf("File opened\n\r");
+ while(returned >= 2)
+ {
+ float temptime = 0;
+ char code[5];
+ int tempint = 0;
+ float tempfloat = 0;
+ returned = fscanf(sequence, "%f %4s %d %f", &temptime, &code, &tempint, &tempfloat);
+
+ if(returned >= 2)
+ {
+ actionTypes temptype = parseType(code);
+ Action act(temptime, temptype, tempint, tempfloat);
+ cue.addAction(act);
+ printf("Read Action. Time: %f Type: %i\n\r",act.actionTime, act.actionType);
+
+ }
+ }
+ }
+
+ cue.orderCue();
+
+ while(1)
+ {
+ if(audioNumber != 0)
+ {
+ char filename[16];
+ sprintf(filename, "/msc/%2.2i.wav",audioNumber);
+ printf("Playin': %s\n\r",filename);
+ FILE* file = fopen(filename, "r");
+ player.open(&file);
+ if(audioTime == 0) player.play();
+ else player.play(audioTime);
+ fclose(file);
+ audioNumber = 0;
+ }
+ }
+
+
+}