Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

Committer:
Steaar
Date:
Wed Mar 28 13:36:53 2018 +0000
Revision:
10:5f6d15f8fc79
Parent:
9:c3c90e137cfb
Child:
11:7a8cfd29b124
All functional

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