Dependencies: MODSERIAL mbed-rtos mbed
Diff: main.cpp
- 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); }