e
Dependencies: NeoStrip USBDevice mbed
main.cpp@0:5b9f87a086ce, 2015-09-22 (annotated)
- Committer:
- baraki
- Date:
- Tue Sep 22 21:49:44 2015 +0000
- Revision:
- 0:5b9f87a086ce
for use with blue mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
baraki | 0:5b9f87a086ce | 1 | #include "mbed.h" |
baraki | 0:5b9f87a086ce | 2 | #include "math.h" |
baraki | 0:5b9f87a086ce | 3 | #include "bluetoothComm.h" |
baraki | 0:5b9f87a086ce | 4 | #include "NeoStrip.h" |
baraki | 0:5b9f87a086ce | 5 | |
baraki | 0:5b9f87a086ce | 6 | #define BT_BAUD 9600 |
baraki | 0:5b9f87a086ce | 7 | #define NUM_LRAS 5 |
baraki | 0:5b9f87a086ce | 8 | #define NUM_ENS NUM_LRAS |
baraki | 0:5b9f87a086ce | 9 | #define NUM_LEVELS 7 |
baraki | 0:5b9f87a086ce | 10 | #define NUM_PULSES 5 |
baraki | 0:5b9f87a086ce | 11 | |
baraki | 0:5b9f87a086ce | 12 | #define NUM_LIDAR 7 //number of lidar |
baraki | 0:5b9f87a086ce | 13 | |
baraki | 0:5b9f87a086ce | 14 | #define LED_NUM NUM_LIDAR |
baraki | 0:5b9f87a086ce | 15 | #define LED_PIN p16 |
baraki | 0:5b9f87a086ce | 16 | |
baraki | 0:5b9f87a086ce | 17 | NeoStrip leds(LED_PIN, LED_NUM); |
baraki | 0:5b9f87a086ce | 18 | |
baraki | 0:5b9f87a086ce | 19 | PwmOut lra[NUM_LRAS] = { |
baraki | 0:5b9f87a086ce | 20 | PwmOut(p25), PwmOut(p24),PwmOut(p23),PwmOut(p22), |
baraki | 0:5b9f87a086ce | 21 | PwmOut(p21) |
baraki | 0:5b9f87a086ce | 22 | }; |
baraki | 0:5b9f87a086ce | 23 | |
baraki | 0:5b9f87a086ce | 24 | DigitalOut myLED(LED1); |
baraki | 0:5b9f87a086ce | 25 | |
baraki | 0:5b9f87a086ce | 26 | Ticker motorPulse; |
baraki | 0:5b9f87a086ce | 27 | Timeout motorOff; |
baraki | 0:5b9f87a086ce | 28 | |
baraki | 0:5b9f87a086ce | 29 | // given a number between 0 and NUM_PULSES, returns the number of times |
baraki | 0:5b9f87a086ce | 30 | // the LRA should be pulsed during the maximum pulse interval |
baraki | 0:5b9f87a086ce | 31 | int pulse[NUM_PULSES] = {9, 8, 4, 2, 1}; |
baraki | 0:5b9f87a086ce | 32 | |
baraki | 0:5b9f87a086ce | 33 | // given a number between 0 and NUM_LEVELS, returns the |
baraki | 0:5b9f87a086ce | 34 | // corresponding intensity of the LRA |
baraki | 0:5b9f87a086ce | 35 | float intensity[8] = {0.0, 150.0/255.0, 170.0/255.0, 190.0/255.0,210.0/255.0,230.0/255.0, 250.0/255.0,255.0/255.0}; |
baraki | 0:5b9f87a086ce | 36 | |
baraki | 0:5b9f87a086ce | 37 | DigitalOut lra_en[NUM_ENS] = { |
baraki | 0:5b9f87a086ce | 38 | DigitalOut(p7), DigitalOut(p8),DigitalOut(p12),DigitalOut(p13), |
baraki | 0:5b9f87a086ce | 39 | DigitalOut(p14) |
baraki | 0:5b9f87a086ce | 40 | }; |
baraki | 0:5b9f87a086ce | 41 | |
baraki | 0:5b9f87a086ce | 42 | //length of the longest period in milliseconds |
baraki | 0:5b9f87a086ce | 43 | int longPeriod=600; //1024 |
baraki | 0:5b9f87a086ce | 44 | int shortPeriod=longPeriod/pulse[0]; |
baraki | 0:5b9f87a086ce | 45 | int onPeriod=60; //100 |
baraki | 0:5b9f87a086ce | 46 | |
baraki | 0:5b9f87a086ce | 47 | bool isOn[NUM_LRAS+2]; |
baraki | 0:5b9f87a086ce | 48 | volatile int lraPulse[NUM_LRAS + 2]; |
baraki | 0:5b9f87a086ce | 49 | volatile int lraCount; |
baraki | 0:5b9f87a086ce | 50 | volatile char lraIntensity[NUM_LRAS + 2]; |
baraki | 0:5b9f87a086ce | 51 | // currently three modes of vibrating |
baraki | 0:5b9f87a086ce | 52 | // vibration period is divided into three sections |
baraki | 0:5b9f87a086ce | 53 | // motor can be: on/mid ; on/off ; on/mid |
baraki | 0:5b9f87a086ce | 54 | // MODE 1: ON ON ON |
baraki | 0:5b9f87a086ce | 55 | // MODE 2: MID OFF ON |
baraki | 0:5b9f87a086ce | 56 | // MODE 3: ON OFF MID |
baraki | 0:5b9f87a086ce | 57 | int lraMode[NUM_LRAS+2]; |
baraki | 0:5b9f87a086ce | 58 | |
baraki | 0:5b9f87a086ce | 59 | Serial pc(USBTX,USBRX); |
baraki | 0:5b9f87a086ce | 60 | |
baraki | 0:5b9f87a086ce | 61 | void motorOff3_cb(void); |
baraki | 0:5b9f87a086ce | 62 | void motorOff2_cb(void); |
baraki | 0:5b9f87a086ce | 63 | void motorOff1_cb(void); |
baraki | 0:5b9f87a086ce | 64 | void processData(char *n); |
baraki | 0:5b9f87a086ce | 65 | |
baraki | 0:5b9f87a086ce | 66 | void setColor(int num, int power){ |
baraki | 0:5b9f87a086ce | 67 | int lednum = num*2; |
baraki | 0:5b9f87a086ce | 68 | if(num == 5) |
baraki | 0:5b9f87a086ce | 69 | lednum = 3; |
baraki | 0:5b9f87a086ce | 70 | if(num == 6) |
baraki | 0:5b9f87a086ce | 71 | lednum = 5; |
baraki | 0:5b9f87a086ce | 72 | if(power >= 240) |
baraki | 0:5b9f87a086ce | 73 | leds.setPixel(lednum, 100, 0, 0); |
baraki | 0:5b9f87a086ce | 74 | else if(power >= 220 && power < 240) |
baraki | 0:5b9f87a086ce | 75 | leds.setPixel(lednum, 0, 100,0); |
baraki | 0:5b9f87a086ce | 76 | else if(power >= 200 && power < 220) |
baraki | 0:5b9f87a086ce | 77 | leds.setPixel(lednum,100,0,100); |
baraki | 0:5b9f87a086ce | 78 | else if(power >= 100 && power < 200) |
baraki | 0:5b9f87a086ce | 79 | leds.setPixel(lednum,0,0,100); |
baraki | 0:5b9f87a086ce | 80 | else |
baraki | 0:5b9f87a086ce | 81 | leds.setPixel(lednum,0,0,0); |
baraki | 0:5b9f87a086ce | 82 | } |
baraki | 0:5b9f87a086ce | 83 | |
baraki | 0:5b9f87a086ce | 84 | void processData(char *n) { |
baraki | 0:5b9f87a086ce | 85 | //try to take these variables out and make them globals to speed processing |
baraki | 0:5b9f87a086ce | 86 | int i = 0; |
baraki | 0:5b9f87a086ce | 87 | int index = 0; |
baraki | 0:5b9f87a086ce | 88 | |
baraki | 0:5b9f87a086ce | 89 | char input = n[i]; |
baraki | 0:5b9f87a086ce | 90 | |
baraki | 0:5b9f87a086ce | 91 | unsigned char newIntensity = 0; |
baraki | 0:5b9f87a086ce | 92 | |
baraki | 0:5b9f87a086ce | 93 | int m1pulse = 0; |
baraki | 0:5b9f87a086ce | 94 | int m1int = 0; |
baraki | 0:5b9f87a086ce | 95 | |
baraki | 0:5b9f87a086ce | 96 | int m2pulse = 0; |
baraki | 0:5b9f87a086ce | 97 | int m2int = 0; |
baraki | 0:5b9f87a086ce | 98 | |
baraki | 0:5b9f87a086ce | 99 | while(input !='\0'){ |
baraki | 0:5b9f87a086ce | 100 | switch ( index ) { |
baraki | 0:5b9f87a086ce | 101 | case 0: { |
baraki | 0:5b9f87a086ce | 102 | // bits 0-2: m1 pulse |
baraki | 0:5b9f87a086ce | 103 | // bits 3-5: m1 intensity |
baraki | 0:5b9f87a086ce | 104 | // bits 6-7: first 2 bits of m1 mode |
baraki | 0:5b9f87a086ce | 105 | lraPulse[0] = pulse[(int)((input & 0xE0) >> 5) - 1]; //0b11100000 |
baraki | 0:5b9f87a086ce | 106 | m1pulse = ((input & 0xE0) >> 5); |
baraki | 0:5b9f87a086ce | 107 | m1int = ((input & 0x1C) >> 2); |
baraki | 0:5b9f87a086ce | 108 | lraIntensity[0] = intensity[(int) ((input & 0x1C) >> 2)]; //0b00011100 |
baraki | 0:5b9f87a086ce | 109 | setColor(0, lraIntensity[0]); |
baraki | 0:5b9f87a086ce | 110 | lraMode[0] = (input & 0x3) << 1; //0b00000011 |
baraki | 0:5b9f87a086ce | 111 | break; |
baraki | 0:5b9f87a086ce | 112 | } |
baraki | 0:5b9f87a086ce | 113 | case 1: { |
baraki | 0:5b9f87a086ce | 114 | // bit 0: last bit of m1 mode |
baraki | 0:5b9f87a086ce | 115 | // bits 1-3: m2 pulse |
baraki | 0:5b9f87a086ce | 116 | // bits 4-6: m2 intensity |
baraki | 0:5b9f87a086ce | 117 | // bit 7: first bit of m2 mode |
baraki | 0:5b9f87a086ce | 118 | lraMode[0] = lraMode[0] | ((input & 0x80) >> 7); //0b10000000 |
baraki | 0:5b9f87a086ce | 119 | //printf("m1 pulse: %d, intensity: %d, mode: %d \n",m1pulse,m1int,lraMode[0]); |
baraki | 0:5b9f87a086ce | 120 | printf("m1 pulse: %d, intensity: %f, mode: %d \n",lraPulse[0],lraIntensity[0],lraMode[0]); |
baraki | 0:5b9f87a086ce | 121 | m2pulse = ((input & 0x70) >> 4); |
baraki | 0:5b9f87a086ce | 122 | m2int = ((input & 0xE) >> 1); |
baraki | 0:5b9f87a086ce | 123 | lraPulse[1] = pulse[(int)((input & 0x70) >> 4) - 1]; //0b01110000 |
baraki | 0:5b9f87a086ce | 124 | lraIntensity[1] = intensity[(int)((input & 0xE) >> 1)]; //0b00001110 |
baraki | 0:5b9f87a086ce | 125 | setColor(1, lraIntensity[1]); |
baraki | 0:5b9f87a086ce | 126 | lraMode[1] = (input & 0x01) << 2; //0b00000001 |
baraki | 0:5b9f87a086ce | 127 | break; |
baraki | 0:5b9f87a086ce | 128 | } |
baraki | 0:5b9f87a086ce | 129 | case 2: { |
baraki | 0:5b9f87a086ce | 130 | // bits 0-1: last 2 bits of m2 mode |
baraki | 0:5b9f87a086ce | 131 | // bits 2-4: m3 pulse |
baraki | 0:5b9f87a086ce | 132 | // bits 5-7: m3 intensity |
baraki | 0:5b9f87a086ce | 133 | lraMode[1] = lraMode[1] | ((input & 0xC0) >> 6); //0b11000000 |
baraki | 0:5b9f87a086ce | 134 | //printf("m2 pulse: %d, intensity: %d, mode: %d \n",m2pulse,m2int,lraMode[1]); |
baraki | 0:5b9f87a086ce | 135 | printf("m2 pulse: %d, intensity: %f, mode: %d \n",lraPulse[1],lraIntensity[1],lraMode[1]); |
baraki | 0:5b9f87a086ce | 136 | lraPulse[2] = pulse[(int)((input & 0x38) >> 3) - 1]; //0b00111000 |
baraki | 0:5b9f87a086ce | 137 | lraIntensity[2] = intensity[(int)(input & 0x7)]; //0b00000111 |
baraki | 0:5b9f87a086ce | 138 | setColor(2, lraIntensity[2]); |
baraki | 0:5b9f87a086ce | 139 | break; |
baraki | 0:5b9f87a086ce | 140 | } |
baraki | 0:5b9f87a086ce | 141 | case 3: { |
baraki | 0:5b9f87a086ce | 142 | // bits 0-2: m3 mode |
baraki | 0:5b9f87a086ce | 143 | // bits 3-5: m4 pulse |
baraki | 0:5b9f87a086ce | 144 | // bits 6-7: first 2 bits of m4 intensity |
baraki | 0:5b9f87a086ce | 145 | lraMode[2] = (input & 0xE0) >> 5; //0b11100000 |
baraki | 0:5b9f87a086ce | 146 | //printf("m3 pulse: %d, intensity: %d, mode: %d \n",((input & 0x38) >> 3),(input & 0x7),lraMode[2]); |
baraki | 0:5b9f87a086ce | 147 | printf("m3 pulse: %d, intensity: %f, mode: %d \n",lraPulse[2],lraIntensity[2],lraMode[2]); |
baraki | 0:5b9f87a086ce | 148 | lraPulse[3] = pulse[(int)((input & 0x1C) >> 2) - 1]; //0b00011100 |
baraki | 0:5b9f87a086ce | 149 | newIntensity = (input & 0x03) << 1; //0b00000011 |
baraki | 0:5b9f87a086ce | 150 | break; |
baraki | 0:5b9f87a086ce | 151 | } |
baraki | 0:5b9f87a086ce | 152 | case 4: { |
baraki | 0:5b9f87a086ce | 153 | // bit 0: last bit of m4 intensity |
baraki | 0:5b9f87a086ce | 154 | // bits 1-3: m4 mode |
baraki | 0:5b9f87a086ce | 155 | // bits 4-6: m5 pulse |
baraki | 0:5b9f87a086ce | 156 | // bit 7: first bit of m5 intensity |
baraki | 0:5b9f87a086ce | 157 | newIntensity = newIntensity | ((input & 0x80) >> 7); //0b10000000 |
baraki | 0:5b9f87a086ce | 158 | lraIntensity[3] = intensity[(int)newIntensity]; |
baraki | 0:5b9f87a086ce | 159 | setColor(3, lraIntensity[3]); |
baraki | 0:5b9f87a086ce | 160 | lraMode[3] = (input & 0x70) >> 4; //0b01110000 |
baraki | 0:5b9f87a086ce | 161 | lraPulse[4] = pulse[(int)((input & 0xE) >> 1) - 1]; //0b00001110 |
baraki | 0:5b9f87a086ce | 162 | newIntensity = (input & 0x01) << 2; //0b00000001 |
baraki | 0:5b9f87a086ce | 163 | break; |
baraki | 0:5b9f87a086ce | 164 | } |
baraki | 0:5b9f87a086ce | 165 | case 5: { |
baraki | 0:5b9f87a086ce | 166 | // bits 0-1: last 2 bits of m5 intensity |
baraki | 0:5b9f87a086ce | 167 | // bits 2-4: m5 mode |
baraki | 0:5b9f87a086ce | 168 | // bits 5-7: 3 bit checksum supposedly |
baraki | 0:5b9f87a086ce | 169 | newIntensity = newIntensity | ((input & 0xC0) >> 6); //0b11000000 |
baraki | 0:5b9f87a086ce | 170 | lraIntensity[4] = intensity[(int)newIntensity]; |
baraki | 0:5b9f87a086ce | 171 | setColor(4, lraIntensity[4]); |
baraki | 0:5b9f87a086ce | 172 | lraMode[4] = (input & 0x38) >> 3; //0b00111000 |
baraki | 0:5b9f87a086ce | 173 | break; |
baraki | 0:5b9f87a086ce | 174 | } |
baraki | 0:5b9f87a086ce | 175 | case 6: { //UP |
baraki | 0:5b9f87a086ce | 176 | // bits 0-2: m3 pulse UP |
baraki | 0:5b9f87a086ce | 177 | // bits 3-5: m3 intensity UP |
baraki | 0:5b9f87a086ce | 178 | lraPulse[5] = pulse[(int)((input & 0xE0) >> 5) - 1]; //0b11100000 |
baraki | 0:5b9f87a086ce | 179 | //m3pulse = ((input & 0xE0) >> 5); |
baraki | 0:5b9f87a086ce | 180 | //m3int = ((input & 0x1C) >> 2); |
baraki | 0:5b9f87a086ce | 181 | lraIntensity[5] = intensity[(int) ((input & 0x1C) >> 2)]; //0b00011100 |
baraki | 0:5b9f87a086ce | 182 | setColor(5, lraIntensity[5]); |
baraki | 0:5b9f87a086ce | 183 | break; |
baraki | 0:5b9f87a086ce | 184 | } |
baraki | 0:5b9f87a086ce | 185 | case 7: { //DOWN |
baraki | 0:5b9f87a086ce | 186 | // bits 0-2: m3 pulse DOWN |
baraki | 0:5b9f87a086ce | 187 | // bits 3-5: m3 intensity1 mode DOWN |
baraki | 0:5b9f87a086ce | 188 | lraPulse[6] = pulse[(int)((input & 0xE0) >> 5) - 1]; //0b11100000 |
baraki | 0:5b9f87a086ce | 189 | //m3pulse = ((input & 0xE0) >> 5); |
baraki | 0:5b9f87a086ce | 190 | //m3int = ((input & 0x1C) >> 2); |
baraki | 0:5b9f87a086ce | 191 | lraIntensity[6] = intensity[(int) ((input & 0x1C) >> 2)]; //0b00011100 |
baraki | 0:5b9f87a086ce | 192 | setColor(6, lraIntensity[6]); |
baraki | 0:5b9f87a086ce | 193 | |
baraki | 0:5b9f87a086ce | 194 | //if lraPulse 5 or 6 are >3, that means set middle motor to highest pulse |
baraki | 0:5b9f87a086ce | 195 | if(lraPulse[5] < 4 || lraPulse[6] < 4){ |
baraki | 0:5b9f87a086ce | 196 | lraPulse[2] = pulse[NUM_PULSES-1]; |
baraki | 0:5b9f87a086ce | 197 | lraIntensity[2] = intensity[NUM_LEVELS]; |
baraki | 0:5b9f87a086ce | 198 | } |
baraki | 0:5b9f87a086ce | 199 | break; |
baraki | 0:5b9f87a086ce | 200 | } |
baraki | 0:5b9f87a086ce | 201 | default: { |
baraki | 0:5b9f87a086ce | 202 | // do nothing |
baraki | 0:5b9f87a086ce | 203 | break; |
baraki | 0:5b9f87a086ce | 204 | } |
baraki | 0:5b9f87a086ce | 205 | } |
baraki | 0:5b9f87a086ce | 206 | index++; |
baraki | 0:5b9f87a086ce | 207 | i++; |
baraki | 0:5b9f87a086ce | 208 | input = n[i]; |
baraki | 0:5b9f87a086ce | 209 | } |
baraki | 0:5b9f87a086ce | 210 | } |
baraki | 0:5b9f87a086ce | 211 | |
baraki | 0:5b9f87a086ce | 212 | void motorPulse_cb(void){ |
baraki | 0:5b9f87a086ce | 213 | pc.printf("hi\n"); |
baraki | 0:5b9f87a086ce | 214 | for(int n=0; n<NUM_LRAS; n++) { |
baraki | 0:5b9f87a086ce | 215 | //pulse motor if lraCount is 0 |
baraki | 0:5b9f87a086ce | 216 | if(lraCount % lraPulse[n] == 0) { |
baraki | 0:5b9f87a086ce | 217 | isOn[n] = true; |
baraki | 0:5b9f87a086ce | 218 | //Set LRA PWM to desired intensity |
baraki | 0:5b9f87a086ce | 219 | //if((lraMode[n] == 1) || (lraMode[n] == 3)) |
baraki | 0:5b9f87a086ce | 220 | lra[n] = lraIntensity[n]; //full intensity |
baraki | 0:5b9f87a086ce | 221 | pc.printf("M%d : %f\n",n,lraIntensity[n]); |
baraki | 0:5b9f87a086ce | 222 | //else if(lraMode[n] == 2) |
baraki | 0:5b9f87a086ce | 223 | // lra[n] = lraIntensity[n] - 0.1; //"mid" intensity |
baraki | 0:5b9f87a086ce | 224 | //Turn LRA On by setting enable pin to 1 |
baraki | 0:5b9f87a086ce | 225 | lra_en[n] = 1; |
baraki | 0:5b9f87a086ce | 226 | } |
baraki | 0:5b9f87a086ce | 227 | } |
baraki | 0:5b9f87a086ce | 228 | lraCount++; |
baraki | 0:5b9f87a086ce | 229 | if(lraCount > 8) |
baraki | 0:5b9f87a086ce | 230 | lraCount = 1; |
baraki | 0:5b9f87a086ce | 231 | motorOff.detach(); |
baraki | 0:5b9f87a086ce | 232 | motorOff.attach(&motorOff3_cb,((float)onPeriod)/1300.0); |
baraki | 0:5b9f87a086ce | 233 | } |
baraki | 0:5b9f87a086ce | 234 | |
baraki | 0:5b9f87a086ce | 235 | int main (void) |
baraki | 0:5b9f87a086ce | 236 | { |
baraki | 0:5b9f87a086ce | 237 | //Init communication |
baraki | 0:5b9f87a086ce | 238 | robotSetup(BT_BAUD); //set baud rate of bluetooth connection |
baraki | 0:5b9f87a086ce | 239 | pc.baud(9600); |
baraki | 0:5b9f87a086ce | 240 | |
baraki | 0:5b9f87a086ce | 241 | leds.clear(); |
baraki | 0:5b9f87a086ce | 242 | leds.setBrightness(0.15); |
baraki | 0:5b9f87a086ce | 243 | |
baraki | 0:5b9f87a086ce | 244 | //initialize and start everything |
baraki | 0:5b9f87a086ce | 245 | lraCount = 0; |
baraki | 0:5b9f87a086ce | 246 | for(int i = 0; i < NUM_LRAS; i++) { |
baraki | 0:5b9f87a086ce | 247 | //set pwm frequency |
baraki | 0:5b9f87a086ce | 248 | lra[i].period_us(90); |
baraki | 0:5b9f87a086ce | 249 | //initialize values |
baraki | 0:5b9f87a086ce | 250 | //set starting vibration |
baraki | 0:5b9f87a086ce | 251 | lraIntensity[i] = 0.5f; |
baraki | 0:5b9f87a086ce | 252 | lraPulse[i] = 0; |
baraki | 0:5b9f87a086ce | 253 | lraMode[i] = 0; |
baraki | 0:5b9f87a086ce | 254 | |
baraki | 0:5b9f87a086ce | 255 | lra_en[i] = 0; |
baraki | 0:5b9f87a086ce | 256 | lra[i] = lraIntensity[i]; //set initial intensity |
baraki | 0:5b9f87a086ce | 257 | isOn[i] = false; |
baraki | 0:5b9f87a086ce | 258 | } |
baraki | 0:5b9f87a086ce | 259 | |
baraki | 0:5b9f87a086ce | 260 | motorPulse.attach(&motorPulse_cb, ((float) shortPeriod)/1000.0); |
baraki | 0:5b9f87a086ce | 261 | |
baraki | 0:5b9f87a086ce | 262 | while(1){ |
baraki | 0:5b9f87a086ce | 263 | if(getBluetoothData()){ //if the bluetooth data has finished sending (there is a \0 detected) |
baraki | 0:5b9f87a086ce | 264 | processData(bluetoothData); |
baraki | 0:5b9f87a086ce | 265 | } |
baraki | 0:5b9f87a086ce | 266 | } |
baraki | 0:5b9f87a086ce | 267 | } |
baraki | 0:5b9f87a086ce | 268 | void motorOff1_cb(void) { |
baraki | 0:5b9f87a086ce | 269 | for(int n=0;n<NUM_LRAS;n++){ |
baraki | 0:5b9f87a086ce | 270 | if(isOn[n]) { |
baraki | 0:5b9f87a086ce | 271 | if(lraMode[n] == 2 || lraMode[n] == 3){//turn off motor |
baraki | 0:5b9f87a086ce | 272 | //do NOT set isOn to 0 |
baraki | 0:5b9f87a086ce | 273 | //isOn is used to tell if the motor is in the midst of a pulse |
baraki | 0:5b9f87a086ce | 274 | //even if it is turned off during this phase |
baraki | 0:5b9f87a086ce | 275 | //Set LRA PWM to 0.5 |
baraki | 0:5b9f87a086ce | 276 | lra[n] = 0.5f; // that turns off the motor! |
baraki | 0:5b9f87a086ce | 277 | //Turn LRA Off by setting enable pin to 0 |
baraki | 0:5b9f87a086ce | 278 | lra_en[n] = 0; // no braking happening |
baraki | 0:5b9f87a086ce | 279 | } |
baraki | 0:5b9f87a086ce | 280 | //if mode is 1, leave it on |
baraki | 0:5b9f87a086ce | 281 | } |
baraki | 0:5b9f87a086ce | 282 | //motorOff[n].detach(); |
baraki | 0:5b9f87a086ce | 283 | //motorOff[n].attach(&motorOff2_cb,((float)onPeriod)/3000.0); |
baraki | 0:5b9f87a086ce | 284 | } |
baraki | 0:5b9f87a086ce | 285 | } |
baraki | 0:5b9f87a086ce | 286 | |
baraki | 0:5b9f87a086ce | 287 | void motorOff2_cb(void) { |
baraki | 0:5b9f87a086ce | 288 | for(int n=0;n<NUM_LRAS;n++){ |
baraki | 0:5b9f87a086ce | 289 | if(isOn[n]) { |
baraki | 0:5b9f87a086ce | 290 | if(lraMode[n] == 2){ //turn motor back on |
baraki | 0:5b9f87a086ce | 291 | lra[n] = lraIntensity[n]; |
baraki | 0:5b9f87a086ce | 292 | lra_en[n] = 1; |
baraki | 0:5b9f87a086ce | 293 | } |
baraki | 0:5b9f87a086ce | 294 | else if(lraMode[n] == 3){//turn motor to mid intensity |
baraki | 0:5b9f87a086ce | 295 | lra[n] = lraIntensity[n] - 0.1; |
baraki | 0:5b9f87a086ce | 296 | lra_en[n] = 1; |
baraki | 0:5b9f87a086ce | 297 | } |
baraki | 0:5b9f87a086ce | 298 | } |
baraki | 0:5b9f87a086ce | 299 | //motorOff[n].detach(); |
baraki | 0:5b9f87a086ce | 300 | //motorOff[n].attach(&motorOff3_cb,((float)onPeriod)/3000.0); |
baraki | 0:5b9f87a086ce | 301 | } |
baraki | 0:5b9f87a086ce | 302 | } |
baraki | 0:5b9f87a086ce | 303 | |
baraki | 0:5b9f87a086ce | 304 | void motorOff3_cb(void) { |
baraki | 0:5b9f87a086ce | 305 | lra[0] = 0.2f; |
baraki | 0:5b9f87a086ce | 306 | lra[1] = 0.2f; |
baraki | 0:5b9f87a086ce | 307 | lra[2] = 0.2f; |
baraki | 0:5b9f87a086ce | 308 | lra[3] = 0.2f; |
baraki | 0:5b9f87a086ce | 309 | lra[4] = 0.2f; |
baraki | 0:5b9f87a086ce | 310 | lra_en[0] = 0.2f; |
baraki | 0:5b9f87a086ce | 311 | lra_en[1] = 0.2f; |
baraki | 0:5b9f87a086ce | 312 | lra_en[2] = 0.2f; |
baraki | 0:5b9f87a086ce | 313 | lra_en[3] = 0.2f; |
baraki | 0:5b9f87a086ce | 314 | lra_en[4] = 0.2f; |
baraki | 0:5b9f87a086ce | 315 | //for(int n=0;n<NUM_LRAS;n++){ |
baraki | 0:5b9f87a086ce | 316 | // if(isOn[n]) { |
baraki | 0:5b9f87a086ce | 317 | // //turn em off |
baraki | 0:5b9f87a086ce | 318 | // isOn[n] = 0; |
baraki | 0:5b9f87a086ce | 319 | // lra[n] = 0.2f; |
baraki | 0:5b9f87a086ce | 320 | // lra_en[n] = 0; |
baraki | 0:5b9f87a086ce | 321 | // } |
baraki | 0:5b9f87a086ce | 322 | //} |
baraki | 0:5b9f87a086ce | 323 | } |