Dependencies:   MODSERIAL mbed-rtos mbed

Revision:
2:5914e8cbf992
Parent:
1:f213d3a65eb4
Child:
3:d97aeeb78f1c
--- a/main.cpp	Sat Mar 21 20:47:36 2015 +0000
+++ b/main.cpp	Mon Mar 23 19:14:11 2015 +0000
@@ -4,25 +4,39 @@
 #include "math.h"
 
 #define BT_BAUD 9600
-#define NUM_LRAS 8
+#define NUM_LRAS 7
+#define NUM_ENS 8
+
 #define DEBUGGING true
 
 // bluetooth serial
 // p9 - tx, p10 - rx
 MODSERIAL bt(p9, p10); //only receiving pin is actually needed
 
-//DigitalOut led[4] = {
+//DigitalOut leds[4] = {
 //    DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)
 //};
 
+int leds[NUM_LRAS];
+
+//PwmOut lra[NUM_LRAS] = {
+//    PwmOut(p5), PwmOut(p6), PwmOut(p14), PwmOut(p20),
+//    PwmOut(p25), PwmOut(p26), PwmOut(p34), PwmOut(p36)
+//};
+
 PwmOut lra[NUM_LRAS] = {
-    PwmOut(p5), PwmOut(p6), PwmOut(p14), PwmOut(p20), 
-    PwmOut(p25), PwmOut(p26), PwmOut(p34), PwmOut(p36)
+    PwmOut(p5), PwmOut(p6),PwmOut(p17),PwmOut(p20),
+    PwmOut(p25),PwmOut(p26),PwmOut(p34)
 };
 
-DigitalOut lra_en[NUM_LRAS] = {
-    DigitalOut(p7), DigitalOut(p8), DigitalOut(p11), DigitalOut(p12),
-    DigitalOut(p13), DigitalOut(p29), DigitalOut(p30), DigitalOut(p35)
+//DigitalOut lra_en[NUM_ENS] = {
+//    DigitalOut(p7), DigitalOut(p8), DigitalOut(p11), DigitalOut(p12),
+//    DigitalOut(p13), DigitalOut(p29), DigitalOut(p30), DigitalOut(p35)
+//};
+
+DigitalOut lra_en[NUM_ENS] = {
+    DigitalOut(p7), DigitalOut(p8),DigitalOut(p11),DigitalOut(p12),
+    DigitalOut(p13),DigitalOut(p29),DigitalOut(p30), DigitalOut(p35)
 };
 
 int lraOn_ms[NUM_LRAS];
@@ -31,51 +45,52 @@
 
 Thread* lra_thread[NUM_LRAS];
 Thread* commThread;
-RtosTimer* timer[NUM_LRAS];
-int counter[NUM_LRAS] = {0};
+RtosTimer* timer;
+unsigned long counter_ms;
 
 void timer_cb(void const *n)
 {
-    counter[(int)n]++;
+    counter_ms++;
 }
 
 void lra_fun(void const *n)
 {
+    unsigned long startTime_ms;
+    int elapsed_ms;
     int leftToWait_ms;
 
     while (true) {
-        // Turn On LRA:     
-        //if((int)n < 4) {
-        //    led[(int)n] = 1; 
-        //}
+        // Turn On LRA:
+        leds[(int)n] = 1;
         lra_en[(int)n] = 1;
-        lra[(int)n] = ceil(lraIntensity[(int)n]); //set initial intensity
-        counter[(int)n] = 0; //reset counter to 0
+        lra[(int)n] = lraIntensity[(int)n]; //set initial intensity
+        startTime_ms = counter_ms; //get start time
 
-        leftToWait_ms = lraOn_ms[(int)n] - counter[(int)n];
+        leftToWait_ms = lraOn_ms[(int)n];
         while( leftToWait_ms > 0) {
             //printf("time: %d\n",leftToWait_ms);
             Thread::signal_wait(0x1,(uint32_t) leftToWait_ms); //signal number, wait time
-            leftToWait_ms = lraOn_ms[(int)n] - counter[(int)n];
-            lra[(int)n] = ceil(lraIntensity[(int)n]); //adjust intensity according to current value
+            elapsed_ms = (int)(counter_ms-startTime_ms);
+            leftToWait_ms = lraOn_ms[(int)n] - elapsed_ms;
+            lra[(int)n] = lraIntensity[(int)n]; //adjust intensity according to current value
         }
 
 
-        //if((int)n < 4) {
-        //    led[(int)n] = 0; 
-        //}
+        leds[(int)n] = 0;
         //Set LRA PWM to 0.5
         lra[(int)n] = 0.5f;
-        //Turn LRA Off
+        //Turn LRA Off by setting enable pin to 0
         lra_en[(int)n] = 0;
 
         //set rest time to sleep while the lra is off
-        leftToWait_ms = lraPeriod_ms[(int)n]-counter[(int)n];
+        elapsed_ms = (int)(counter_ms-startTime_ms);
+        leftToWait_ms = lraPeriod_ms[(int)n]-elapsed_ms;
         while( leftToWait_ms > 0) {
             //printf("time: %d\n",leftToWait_ms);
             Thread::signal_wait(0x2,(uint32_t) leftToWait_ms); //signal number, wait time
             //it woke up!
-            leftToWait_ms = lraPeriod_ms[(int)n] - counter[(int)n];
+            elapsed_ms = (int)(counter_ms-startTime_ms);
+            leftToWait_ms = lraPeriod_ms[(int)n] - elapsed_ms;;
         }
     }
 }
@@ -101,7 +116,7 @@
     float newIntensity;
     int newOnTime;
     int newTotalTime;
-    
+
     while (true) {
         // Wait here until we detect the \0 going into the buffer.
         //new data in the buffer, read it out
@@ -159,20 +174,29 @@
     bt.attach(&rx_cb, MODSERIAL::RxIrq); // attach callback to get '\0' command
 
     commThread = new Thread(commThread_cb);
-    
+    //start universal timer to count up a counter
+    timer = new RtosTimer(timer_cb,osTimerPeriodic);
+    counter_ms=0;
+    timer->start(1); //run timer every millisecond
+
+    for(int i = 0; i < NUM_ENS; i++) {
+        lra_en[i] = 0;
+    }
+
+
     //initialize and start everything
     for(int i = 0; i < NUM_LRAS; i++) {
-        
+
         //set pwm frequency
-        lra[i].period_us(20);
-        
+        lra[i].period_us(100);
+
+        //initialize values
+        lra[i] = 0.5f;
+
         //set starting vibration
         lraOn_ms[i] = 100;
         lraPeriod_ms[i] = 1000;
-        lraIntensity[i] = 0.5f;
-        //start timers
-        timer[i]= new RtosTimer(timer_cb,osTimerPeriodic, (void *) i);
-        timer[i]->start(1); //run timer every millisecond
+        lraIntensity[i] = 0.0f;
         //Set up lra threads
         lra_thread[i] = new Thread(lra_fun, (void *)i);
     }