Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

Committer:
Steaar
Date:
Tue Mar 27 15:11:02 2018 +0000
Revision:
8:09b78bc5551f
Parent:
7:84c2156e1ace
Child:
9:c3c90e137cfb
All working, tasks need tidied. Empty mail queue

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Steaar 0:1580a6dbd6a9 1 #include "mbed.h"
Steaar 0:1580a6dbd6a9 2 #include "rtos.h"
Steaar 0:1580a6dbd6a9 3
Steaar 0:1580a6dbd6a9 4 #include "MCP23017.h"
Steaar 0:1580a6dbd6a9 5 #include "WattBob_TextLCD.h"
Steaar 0:1580a6dbd6a9 6
Steaar 0:1580a6dbd6a9 7 #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT)
Steaar 0:1580a6dbd6a9 8 #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT)
Steaar 0:1580a6dbd6a9 9
Steaar 4:72c487215487 10 MCP23017 *par_port; // pointer to 16-bit parallel I/O object
Steaar 4:72c487215487 11 WattBob_TextLCD *lcd; // pointer to 2*16 chacater LCD object
Steaar 0:1580a6dbd6a9 12
Steaar 4:72c487215487 13 AnalogIn accel(p15); // Analog
Steaar 0:1580a6dbd6a9 14 AnalogIn brake(p16);
Steaar 5:e62e0e3084fc 15 float speed;
Steaar 5:e62e0e3084fc 16 float kmph;
Steaar 1:c2c4bd530112 17 float aveSpeed;
Steaar 5:e62e0e3084fc 18 float acc;
Steaar 5:e62e0e3084fc 19 float br;
Steaar 1:c2c4bd530112 20 float distance = 0;
Steaar 0:1580a6dbd6a9 21
Steaar 4:72c487215487 22 Timer tim, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;// integrate with wait?
Steaar 0:1580a6dbd6a9 23
Steaar 4:72c487215487 24 int indicount = 0;
Steaar 4:72c487215487 25
Steaar 4:72c487215487 26 DigitalOut sideLights(LED1); // mbed out
Steaar 1:c2c4bd530112 27 DigitalOut lIndicator(LED2);
Steaar 1:c2c4bd530112 28 DigitalOut rIndicator(LED3);
Steaar 0:1580a6dbd6a9 29 DigitalOut engLight(LED4);
Steaar 0:1580a6dbd6a9 30
Steaar 4:72c487215487 31 DigitalOut brakeLights(p6); // redbox out
Steaar 0:1580a6dbd6a9 32 DigitalOut fluxCapacitor(p7);
Steaar 0:1580a6dbd6a9 33
Steaar 5:e62e0e3084fc 34 DigitalIn engine(p5); // switches
Steaar 7:84c2156e1ace 35 DigitalIn lightSwitch(p8);
Steaar 5:e62e0e3084fc 36 DigitalIn lIndicate(p11);
Steaar 5:e62e0e3084fc 37 DigitalIn rIndicate(p12);
Steaar 0:1580a6dbd6a9 38
Steaar 7:84c2156e1ace 39 int l, r, lr;
Steaar 7:84c2156e1ace 40
Steaar 4:72c487215487 41 Serial pc(USBTX, USBRX); // serial tx, rx
Steaar 2:51a06b9a52d1 42
Steaar 1:c2c4bd530112 43 Thread sp;
Steaar 1:c2c4bd530112 44 Thread task1;
Steaar 8:09b78bc5551f 45 Thread task246;
Steaar 1:c2c4bd530112 46 Thread task3;
Steaar 8:09b78bc5551f 47 //Thread task4;
Steaar 8:09b78bc5551f 48 Thread task59;
Steaar 8:09b78bc5551f 49 //Thread task6;
Steaar 1:c2c4bd530112 50 Thread task7;
Steaar 1:c2c4bd530112 51 Thread task8;
Steaar 8:09b78bc5551f 52 //Thread task9;
Steaar 1:c2c4bd530112 53 Thread task10;
Steaar 7:84c2156e1ace 54 Thread indi;
Steaar 5:e62e0e3084fc 55 Semaphore ac(1);
Steaar 1:c2c4bd530112 56
Steaar 4:72c487215487 57 typedef struct { // mail
Steaar 2:51a06b9a52d1 58 float m_speed;
Steaar 2:51a06b9a52d1 59 float m_acc;
Steaar 2:51a06b9a52d1 60 float m_br;
Steaar 4:72c487215487 61 uint32_t counter; // A counter value
Steaar 2:51a06b9a52d1 62 } mail_t;
Steaar 2:51a06b9a52d1 63
Steaar 2:51a06b9a52d1 64 Mail<mail_t, 100> mail_box;
Steaar 2:51a06b9a52d1 65
Steaar 5:e62e0e3084fc 66 void acceleration() // 1. read brake and accelerator 10
Steaar 4:72c487215487 67 {
Steaar 4:72c487215487 68 while (1) {
Steaar 5:e62e0e3084fc 69 //ac.wait();
Steaar 4:72c487215487 70 acc = accel.read()*3.3;
Steaar 4:72c487215487 71 br = brake.read()*3.3;
Steaar 5:e62e0e3084fc 72 //ac.release();
Steaar 5:e62e0e3084fc 73 Thread::wait(100);
Steaar 4:72c487215487 74 }
Steaar 4:72c487215487 75 }
Steaar 4:72c487215487 76 void getSpeed() // 20Hz calculation for speed & distance
Steaar 4:72c487215487 77 {
Steaar 4:72c487215487 78 while (1) {
Steaar 6:a026e0651ad5 79 speed = (acc - br)*16.835; // speed in m/s. Max = 55
Steaar 4:72c487215487 80 if (speed < 0) {
Steaar 4:72c487215487 81 speed = 0;
Steaar 4:72c487215487 82 }
Steaar 6:a026e0651ad5 83 kmph = speed*3.6; // convert speed to km/ph. Change to *2.24 for ~mph
Steaar 6:a026e0651ad5 84 distance = distance + (speed*0.05)/1000; // distance = speed*time (/1000 for m to km)
Steaar 5:e62e0e3084fc 85 Thread::wait(50);
Steaar 4:72c487215487 86 }
Steaar 4:72c487215487 87 }
Steaar 8:09b78bc5551f 88 void LCD() // 6. display odometer and speed 2
Steaar 8:09b78bc5551f 89 {
Steaar 8:09b78bc5551f 90 lcd->locate(0,0);
Steaar 8:09b78bc5551f 91 lcd->printf("KM:%0.1f",distance);
Steaar 8:09b78bc5551f 92 lcd->locate(1,0);
Steaar 8:09b78bc5551f 93 lcd->printf("KM/H:%.1f",aveSpeed);
Steaar 8:09b78bc5551f 94 lcd->locate(0,8);
Steaar 8:09b78bc5551f 95 //ac.wait();
Steaar 8:09b78bc5551f 96 lcd->printf("sp:%0.1f",kmph);
Steaar 8:09b78bc5551f 97 //lcd->locate(1,8);
Steaar 8:09b78bc5551f 98 //ac.release();
Steaar 8:09b78bc5551f 99 //lcd->printf("b:%d",engine.read());
Steaar 8:09b78bc5551f 100 }
Steaar 8:09b78bc5551f 101 void braking() // 4. Brake indicated by LED 2
Steaar 8:09b78bc5551f 102 {
Steaar 8:09b78bc5551f 103 if ( br > 0) {
Steaar 8:09b78bc5551f 104 brakeLights = 1;
Steaar 8:09b78bc5551f 105 } else {
Steaar 8:09b78bc5551f 106 brakeLights = 0;
Steaar 8:09b78bc5551f 107 }
Steaar 8:09b78bc5551f 108 }
Steaar 8:09b78bc5551f 109 void t246() // 2. Read engine on/off show LED 2
Steaar 4:72c487215487 110 {
Steaar 4:72c487215487 111 while (1) {
Steaar 5:e62e0e3084fc 112 if (engine.read() > 0) {
Steaar 4:72c487215487 113 engLight = 1;
Steaar 7:84c2156e1ace 114 } else {
Steaar 5:e62e0e3084fc 115 engLight = 0;
Steaar 5:e62e0e3084fc 116 }
Steaar 8:09b78bc5551f 117 LCD();
Steaar 8:09b78bc5551f 118 braking();
Steaar 8:09b78bc5551f 119
Steaar 5:e62e0e3084fc 120 Thread::wait(500);
Steaar 4:72c487215487 121 }
Steaar 4:72c487215487 122 }
Steaar 4:72c487215487 123 void speedo() // 3. Average last n speed readings 5
Steaar 4:72c487215487 124 {
Steaar 4:72c487215487 125 while (1) {
Steaar 4:72c487215487 126 for (int i = 0; i<3; i++) {
Steaar 6:a026e0651ad5 127 aveSpeed = kmph + aveSpeed; // in km/h
Steaar 4:72c487215487 128 }
Steaar 6:a026e0651ad5 129 aveSpeed = aveSpeed/4;
Steaar 4:72c487215487 130
Steaar 4:72c487215487 131 Thread::wait(200);
Steaar 4:72c487215487 132 }
Steaar 4:72c487215487 133 }
Steaar 4:72c487215487 134 void lights() // 9. set side lights 1
Steaar 1:c2c4bd530112 135 {
Steaar 1:c2c4bd530112 136 while (1) {
Steaar 7:84c2156e1ace 137 if (lightSwitch.read() == 1) {
Steaar 1:c2c4bd530112 138 sideLights = 1;
Steaar 2:51a06b9a52d1 139 } else {
Steaar 2:51a06b9a52d1 140 sideLights = 0;
Steaar 1:c2c4bd530112 141 }
Steaar 1:c2c4bd530112 142
Steaar 1:c2c4bd530112 143 Thread::wait(1000);
Steaar 0:1580a6dbd6a9 144 }
Steaar 0:1580a6dbd6a9 145 }
Steaar 8:09b78bc5551f 146 void t59() // 5. if speed > 88 LED on 1
Steaar 8:09b78bc5551f 147 {
Steaar 8:09b78bc5551f 148 while (1) {
Steaar 8:09b78bc5551f 149 if (kmph > 141.6) { // 141.6 km = 88 miles
Steaar 8:09b78bc5551f 150 fluxCapacitor = 1;
Steaar 8:09b78bc5551f 151 } else {
Steaar 8:09b78bc5551f 152 fluxCapacitor = 0;
Steaar 8:09b78bc5551f 153 }
Steaar 8:09b78bc5551f 154 lights();
Steaar 8:09b78bc5551f 155
Steaar 8:09b78bc5551f 156 Thread::wait(1000);
Steaar 8:09b78bc5551f 157 }
Steaar 8:09b78bc5551f 158 }
Steaar 8:09b78bc5551f 159 void send_thread (void) // 7. Send speed, acc, brake to MAILq 0.2
Steaar 8:09b78bc5551f 160 {
Steaar 8:09b78bc5551f 161 while (true) {
Steaar 8:09b78bc5551f 162 mail_t *mail = mail_box.alloc();
Steaar 8:09b78bc5551f 163 mail->m_speed = kmph;
Steaar 8:09b78bc5551f 164 mail->m_acc = acc;
Steaar 8:09b78bc5551f 165 mail->m_br = br;
Steaar 8:09b78bc5551f 166 mail_box.put(mail);
Steaar 8:09b78bc5551f 167
Steaar 8:09b78bc5551f 168 Thread::wait(5000);
Steaar 8:09b78bc5551f 169 }
Steaar 8:09b78bc5551f 170 }
Steaar 8:09b78bc5551f 171 void toSerial() // 8. MAIL q to serial PC 0.05
Steaar 8:09b78bc5551f 172 {
Steaar 8:09b78bc5551f 173 while (1) {
Steaar 8:09b78bc5551f 174 osEvent evt = mail_box.get();
Steaar 8:09b78bc5551f 175 mail_t *mail = (mail_t*)evt.value.p;
Steaar 8:09b78bc5551f 176 pc.printf("\nSpeed: %.2f \n\r", mail->m_speed);
Steaar 8:09b78bc5551f 177 pc.printf("Acceleration: %.2f \n\r", mail->m_acc);
Steaar 8:09b78bc5551f 178 pc.printf("Braking: %.2f \n\r", mail->m_br);
Steaar 8:09b78bc5551f 179 //pc.printf("\r\nSpeed: %.2f ", kmph);
Steaar 8:09b78bc5551f 180 //pc.printf(", Acceleration: %.2f", acc);
Steaar 8:09b78bc5551f 181 //pc.printf(", Braking: %.2f", br);
Steaar 8:09b78bc5551f 182
Steaar 8:09b78bc5551f 183 Thread::wait(20000);
Steaar 8:09b78bc5551f 184 }
Steaar 8:09b78bc5551f 185 }
Steaar 8:09b78bc5551f 186
Steaar 7:84c2156e1ace 187 void indicators() // 10. check indicators 0.5
Steaar 1:c2c4bd530112 188 {
Steaar 1:c2c4bd530112 189 while (1) {
Steaar 7:84c2156e1ace 190
Steaar 4:72c487215487 191 if ((lIndicate == 1) && (rIndicate == 1)) { // If both switch on
Steaar 7:84c2156e1ace 192 lr = 1; // both LED at 2Hz
Steaar 7:84c2156e1ace 193 } else if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on
Steaar 7:84c2156e1ace 194 l = 1; // left LED at 1Hz
Steaar 7:84c2156e1ace 195 r = 0;
Steaar 7:84c2156e1ace 196 lr = 0;
Steaar 7:84c2156e1ace 197 } else if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on
Steaar 7:84c2156e1ace 198 r = 1; // right LED at 1Hz
Steaar 7:84c2156e1ace 199 l = 0;
Steaar 7:84c2156e1ace 200 lr = 0;
Steaar 7:84c2156e1ace 201 } else if ((lIndicate == 0) && (rIndicate == 0)) { // both off
Steaar 7:84c2156e1ace 202 r = 0;
Steaar 7:84c2156e1ace 203 l = 0;
Steaar 7:84c2156e1ace 204 lr = 0;
Steaar 1:c2c4bd530112 205 }
Steaar 1:c2c4bd530112 206
Steaar 1:c2c4bd530112 207 Thread::wait(2000);
Steaar 0:1580a6dbd6a9 208 }
Steaar 0:1580a6dbd6a9 209 }
Steaar 4:72c487215487 210
Steaar 7:84c2156e1ace 211 void indicate() // flash indicators
Steaar 7:84c2156e1ace 212 {
Steaar 7:84c2156e1ace 213 while (1) {
Steaar 7:84c2156e1ace 214 int x = 1000;
Steaar 7:84c2156e1ace 215 if (lr == 1) { // If both switch on
Steaar 7:84c2156e1ace 216 lIndicator = !lIndicator; // both LED at 2Hz
Steaar 7:84c2156e1ace 217 rIndicator = !rIndicator;
Steaar 7:84c2156e1ace 218 x = 500;
Steaar 7:84c2156e1ace 219 } else if (l == 1) { // if left switch on
Steaar 7:84c2156e1ace 220 lIndicator = !lIndicator; // left LED at 1Hz
Steaar 7:84c2156e1ace 221 rIndicator = 0;
Steaar 7:84c2156e1ace 222 x = 1000;
Steaar 7:84c2156e1ace 223 } else if (r == 1) { // if right switch on
Steaar 7:84c2156e1ace 224 rIndicator = !rIndicator; // right LED at 1Hz
Steaar 7:84c2156e1ace 225 lIndicator = 0;
Steaar 7:84c2156e1ace 226 x = 1000;
Steaar 7:84c2156e1ace 227 }
Steaar 7:84c2156e1ace 228
Steaar 7:84c2156e1ace 229 Thread::wait(x);
Steaar 7:84c2156e1ace 230 }
Steaar 7:84c2156e1ace 231 }
Steaar 7:84c2156e1ace 232
Steaar 0:1580a6dbd6a9 233
Steaar 0:1580a6dbd6a9 234 int main()
Steaar 0:1580a6dbd6a9 235 {
Steaar 0:1580a6dbd6a9 236 par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip
Steaar 0:1580a6dbd6a9 237 lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display
Steaar 0:1580a6dbd6a9 238 par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
Steaar 1:c2c4bd530112 239
Steaar 6:a026e0651ad5 240 sp.start(getSpeed); //20 y
Steaar 6:a026e0651ad5 241 task1.start(acceleration); //10 y
Steaar 8:09b78bc5551f 242 task246.start(t246); //2 .setPriority(); y 4, 6
Steaar 6:a026e0651ad5 243 task3.start(speedo); //5 y
Steaar 8:09b78bc5551f 244 //task4.start(braking); //2 y
Steaar 8:09b78bc5551f 245 task59.start(t59); //1 y 9
Steaar 8:09b78bc5551f 246 //task6.start(LCD); //2 y
Steaar 8:09b78bc5551f 247 task7.start(callback(send_thread)); //0.2
Steaar 8:09b78bc5551f 248 task8.start(toSerial); //0.05
Steaar 8:09b78bc5551f 249 //task9.start(lights); //1 y
Steaar 7:84c2156e1ace 250 task10.start(indicators); //0.5 y
Steaar 7:84c2156e1ace 251 indi.start(indicate); // 1-2 y
Steaar 5:e62e0e3084fc 252
Steaar 0:1580a6dbd6a9 253 }
Steaar 0:1580a6dbd6a9 254
Steaar 0:1580a6dbd6a9 255
Steaar 1:c2c4bd530112 256