Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MCP23017 mbed-rtos WattBob_TextLCD
main.cpp@6:a026e0651ad5, 2018-03-27 (annotated)
- Committer:
- Steaar
- Date:
- Tue Mar 27 13:21:36 2018 +0000
- Revision:
- 6:a026e0651ad5
- Parent:
- 5:e62e0e3084fc
- Child:
- 7:84c2156e1ace
speed and tasks 1-6 functional. Priorities
Who changed what in which revision?
| User | Revision | Line number | New 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 | 5:e62e0e3084fc | 35 | DigitalIn lightSwitch(p8); | 
| Steaar | 5:e62e0e3084fc | 36 | DigitalIn lIndicate(p11); | 
| Steaar | 5:e62e0e3084fc | 37 | DigitalIn rIndicate(p12); | 
| Steaar | 0:1580a6dbd6a9 | 38 | |
| Steaar | 4:72c487215487 | 39 | Serial pc(USBTX, USBRX); // serial tx, rx | 
| Steaar | 2:51a06b9a52d1 | 40 | |
| Steaar | 1:c2c4bd530112 | 41 | Thread sp; | 
| Steaar | 1:c2c4bd530112 | 42 | Thread task1; | 
| Steaar | 1:c2c4bd530112 | 43 | Thread task2; | 
| Steaar | 1:c2c4bd530112 | 44 | Thread task3; | 
| Steaar | 1:c2c4bd530112 | 45 | Thread task4; | 
| Steaar | 1:c2c4bd530112 | 46 | Thread task5; | 
| Steaar | 1:c2c4bd530112 | 47 | Thread task6; | 
| Steaar | 1:c2c4bd530112 | 48 | Thread task7; | 
| Steaar | 1:c2c4bd530112 | 49 | Thread task8; | 
| Steaar | 1:c2c4bd530112 | 50 | Thread task9; | 
| Steaar | 1:c2c4bd530112 | 51 | Thread task10; | 
| Steaar | 5:e62e0e3084fc | 52 | Semaphore ac(1); | 
| Steaar | 1:c2c4bd530112 | 53 | |
| Steaar | 4:72c487215487 | 54 | typedef struct { // mail | 
| Steaar | 2:51a06b9a52d1 | 55 | float m_speed; | 
| Steaar | 2:51a06b9a52d1 | 56 | float m_acc; | 
| Steaar | 2:51a06b9a52d1 | 57 | float m_br; | 
| Steaar | 4:72c487215487 | 58 | uint32_t counter; // A counter value | 
| Steaar | 2:51a06b9a52d1 | 59 | } mail_t; | 
| Steaar | 2:51a06b9a52d1 | 60 | |
| Steaar | 2:51a06b9a52d1 | 61 | Mail<mail_t, 100> mail_box; | 
| Steaar | 2:51a06b9a52d1 | 62 | |
| Steaar | 5:e62e0e3084fc | 63 | void acceleration() // 1. read brake and accelerator 10 | 
| Steaar | 4:72c487215487 | 64 | { | 
| Steaar | 4:72c487215487 | 65 | while (1) { | 
| Steaar | 5:e62e0e3084fc | 66 | //ac.wait(); | 
| Steaar | 4:72c487215487 | 67 | acc = accel.read()*3.3; | 
| Steaar | 4:72c487215487 | 68 | br = brake.read()*3.3; | 
| Steaar | 5:e62e0e3084fc | 69 | //ac.release(); | 
| Steaar | 5:e62e0e3084fc | 70 | Thread::wait(100); | 
| Steaar | 4:72c487215487 | 71 | } | 
| Steaar | 4:72c487215487 | 72 | } | 
| Steaar | 4:72c487215487 | 73 | void getSpeed() // 20Hz calculation for speed & distance | 
| Steaar | 4:72c487215487 | 74 | { | 
| Steaar | 4:72c487215487 | 75 | while (1) { | 
| Steaar | 6:a026e0651ad5 | 76 | speed = (acc - br)*16.835; // speed in m/s. Max = 55 | 
| Steaar | 4:72c487215487 | 77 | if (speed < 0) { | 
| Steaar | 4:72c487215487 | 78 | speed = 0; | 
| Steaar | 4:72c487215487 | 79 | } | 
| Steaar | 6:a026e0651ad5 | 80 | kmph = speed*3.6; // convert speed to km/ph. Change to *2.24 for ~mph | 
| Steaar | 6:a026e0651ad5 | 81 | distance = distance + (speed*0.05)/1000; // distance = speed*time (/1000 for m to km) | 
| Steaar | 5:e62e0e3084fc | 82 | Thread::wait(50); | 
| Steaar | 4:72c487215487 | 83 | } | 
| Steaar | 4:72c487215487 | 84 | } | 
| Steaar | 4:72c487215487 | 85 | void ignition() // 2. Read engine on/off show LED 2 | 
| Steaar | 4:72c487215487 | 86 | { | 
| Steaar | 4:72c487215487 | 87 | while (1) { | 
| Steaar | 5:e62e0e3084fc | 88 | if (engine.read() > 0) { | 
| Steaar | 4:72c487215487 | 89 | engLight = 1; | 
| Steaar | 4:72c487215487 | 90 | } | 
| Steaar | 5:e62e0e3084fc | 91 | else{ | 
| Steaar | 5:e62e0e3084fc | 92 | engLight = 0; | 
| Steaar | 5:e62e0e3084fc | 93 | } | 
| Steaar | 5:e62e0e3084fc | 94 | Thread::wait(500); | 
| Steaar | 4:72c487215487 | 95 | } | 
| Steaar | 4:72c487215487 | 96 | } | 
| Steaar | 4:72c487215487 | 97 | void speedo() // 3. Average last n speed readings 5 | 
| Steaar | 4:72c487215487 | 98 | { | 
| Steaar | 4:72c487215487 | 99 | while (1) { | 
| Steaar | 4:72c487215487 | 100 | for (int i = 0; i<3; i++) { | 
| Steaar | 6:a026e0651ad5 | 101 | aveSpeed = kmph + aveSpeed; // in km/h | 
| Steaar | 4:72c487215487 | 102 | } | 
| Steaar | 6:a026e0651ad5 | 103 | aveSpeed = aveSpeed/4; | 
| Steaar | 4:72c487215487 | 104 | |
| Steaar | 4:72c487215487 | 105 | Thread::wait(200); | 
| Steaar | 4:72c487215487 | 106 | } | 
| Steaar | 4:72c487215487 | 107 | } | 
| Steaar | 4:72c487215487 | 108 | void braking() // 4. Brake indicated by LED 2 | 
| Steaar | 4:72c487215487 | 109 | { | 
| Steaar | 4:72c487215487 | 110 | while (1) { | 
| Steaar | 5:e62e0e3084fc | 111 | if ( br > 0) { | 
| Steaar | 4:72c487215487 | 112 | brakeLights = 1; | 
| Steaar | 4:72c487215487 | 113 | } | 
| Steaar | 5:e62e0e3084fc | 114 | else{ | 
| Steaar | 5:e62e0e3084fc | 115 | brakeLights = 0; | 
| Steaar | 5:e62e0e3084fc | 116 | } | 
| Steaar | 4:72c487215487 | 117 | |
| Steaar | 4:72c487215487 | 118 | Thread::wait(500); | 
| Steaar | 4:72c487215487 | 119 | } | 
| Steaar | 4:72c487215487 | 120 | } | 
| Steaar | 4:72c487215487 | 121 | void greatScott() // 5. if speed > 88 LED on 1 | 
| Steaar | 4:72c487215487 | 122 | { | 
| Steaar | 4:72c487215487 | 123 | while (1) { | 
| Steaar | 6:a026e0651ad5 | 124 | if (kmph > 141.6) { // 141.6 km = 88 miles | 
| Steaar | 4:72c487215487 | 125 | fluxCapacitor = 1; | 
| Steaar | 4:72c487215487 | 126 | } | 
| Steaar | 6:a026e0651ad5 | 127 | else{ | 
| Steaar | 6:a026e0651ad5 | 128 | fluxCapacitor = 0; | 
| Steaar | 6:a026e0651ad5 | 129 | } | 
| Steaar | 4:72c487215487 | 130 | |
| Steaar | 4:72c487215487 | 131 | Thread::wait(1000); | 
| Steaar | 4:72c487215487 | 132 | } | 
| Steaar | 4:72c487215487 | 133 | } | 
| Steaar | 4:72c487215487 | 134 | void LCD() // 6. display odometer and speed 2 | 
| Steaar | 4:72c487215487 | 135 | { | 
| Steaar | 4:72c487215487 | 136 | while (1) { | 
| Steaar | 4:72c487215487 | 137 | |
| Steaar | 4:72c487215487 | 138 | lcd->locate(0,0); | 
| Steaar | 4:72c487215487 | 139 | lcd->printf("KM:%0.1f",distance); | 
| Steaar | 4:72c487215487 | 140 | lcd->locate(1,0); | 
| Steaar | 6:a026e0651ad5 | 141 | lcd->printf("KM/H:%.1f",aveSpeed); | 
| Steaar | 5:e62e0e3084fc | 142 | lcd->locate(0,8); | 
| Steaar | 5:e62e0e3084fc | 143 | //ac.wait(); | 
| Steaar | 6:a026e0651ad5 | 144 | lcd->printf("sp:%0.1f",kmph); | 
| Steaar | 6:a026e0651ad5 | 145 | //lcd->locate(1,8); | 
| Steaar | 5:e62e0e3084fc | 146 | //ac.release(); | 
| Steaar | 5:e62e0e3084fc | 147 | //lcd->printf("b:%d",engine.read()); | 
| Steaar | 4:72c487215487 | 148 | |
| Steaar | 4:72c487215487 | 149 | Thread::wait(500); | 
| Steaar | 4:72c487215487 | 150 | } | 
| Steaar | 4:72c487215487 | 151 | } | 
| Steaar | 4:72c487215487 | 152 | void send_thread (void) // 7. Send speed, acc, brake to MAILq 0.2 | 
| Steaar | 2:51a06b9a52d1 | 153 | { | 
| Steaar | 2:51a06b9a52d1 | 154 | uint32_t i = 0; | 
| Steaar | 2:51a06b9a52d1 | 155 | while (true) { | 
| Steaar | 2:51a06b9a52d1 | 156 | i++; // fake data update | 
| Steaar | 2:51a06b9a52d1 | 157 | mail_t *mail = mail_box.alloc(); | 
| Steaar | 2:51a06b9a52d1 | 158 | mail->m_speed = speed; | 
| Steaar | 2:51a06b9a52d1 | 159 | mail->m_acc = acc; | 
| Steaar | 2:51a06b9a52d1 | 160 | mail->m_br = br; | 
| Steaar | 2:51a06b9a52d1 | 161 | mail->counter = i; | 
| Steaar | 2:51a06b9a52d1 | 162 | mail_box.put(mail); | 
| Steaar | 2:51a06b9a52d1 | 163 | |
| Steaar | 2:51a06b9a52d1 | 164 | osEvent evt = mail_box.get(); | 
| Steaar | 2:51a06b9a52d1 | 165 | if (evt.status == osEventMail) { | 
| Steaar | 2:51a06b9a52d1 | 166 | mail_t *mail = (mail_t*)evt.value.p; | 
| Steaar | 4:72c487215487 | 167 | printf("\nSpeed: %.1f \n\r" , mail->m_speed); | 
| Steaar | 2:51a06b9a52d1 | 168 | printf("Acceleration: %.2f \n\r" , mail->m_acc); | 
| Steaar | 4:72c487215487 | 169 | printf("Braking: %.1f \n\r", mail->m_br); | 
| Steaar | 2:51a06b9a52d1 | 170 | |
| Steaar | 2:51a06b9a52d1 | 171 | mail_box.free(mail); | 
| Steaar | 2:51a06b9a52d1 | 172 | } | 
| Steaar | 2:51a06b9a52d1 | 173 | Thread::wait(5000); | 
| Steaar | 2:51a06b9a52d1 | 174 | } | 
| Steaar | 2:51a06b9a52d1 | 175 | } | 
| Steaar | 4:72c487215487 | 176 | void toSerial() // 8. MAIL q to serial PC 0.05 | 
| Steaar | 1:c2c4bd530112 | 177 | { | 
| Steaar | 1:c2c4bd530112 | 178 | while (1) { | 
| Steaar | 4:72c487215487 | 179 | osEvent evt = mail_box.get(); | 
| Steaar | 4:72c487215487 | 180 | mail_t *mail = (mail_t*)evt.value.p; | 
| Steaar | 4:72c487215487 | 181 | pc.printf("\nSpeed: %.2f \n\r", mail->m_speed); | 
| Steaar | 4:72c487215487 | 182 | pc.printf("Acceleration: %.2f \n\r", mail->m_acc); | 
| Steaar | 4:72c487215487 | 183 | pc.printf("Braking: %.2f \n\r", mail->m_br); | 
| Steaar | 1:c2c4bd530112 | 184 | |
| Steaar | 4:72c487215487 | 185 | Thread::wait(20000); | 
| Steaar | 0:1580a6dbd6a9 | 186 | } | 
| Steaar | 0:1580a6dbd6a9 | 187 | } | 
| Steaar | 4:72c487215487 | 188 | void lights() // 9. set side lights 1 | 
| Steaar | 1:c2c4bd530112 | 189 | { | 
| Steaar | 1:c2c4bd530112 | 190 | while (1) { | 
| Steaar | 1:c2c4bd530112 | 191 | if (lightSwitch == 1) { | 
| Steaar | 1:c2c4bd530112 | 192 | sideLights = 1; | 
| Steaar | 2:51a06b9a52d1 | 193 | } else { | 
| Steaar | 2:51a06b9a52d1 | 194 | sideLights = 0; | 
| Steaar | 1:c2c4bd530112 | 195 | } | 
| Steaar | 1:c2c4bd530112 | 196 | |
| Steaar | 1:c2c4bd530112 | 197 | Thread::wait(1000); | 
| Steaar | 0:1580a6dbd6a9 | 198 | } | 
| Steaar | 0:1580a6dbd6a9 | 199 | } | 
| Steaar | 4:72c487215487 | 200 | void indicators() // 10. flash indicators 0.5 | 
| Steaar | 1:c2c4bd530112 | 201 | { | 
| Steaar | 1:c2c4bd530112 | 202 | while (1) { | 
| Steaar | 4:72c487215487 | 203 | |
| Steaar | 4:72c487215487 | 204 | if ((lIndicate == 1) && (rIndicate == 1)) { // If both switch on | 
| Steaar | 4:72c487215487 | 205 | lIndicator = !lIndicator; // both LED at 2Hz | 
| Steaar | 0:1580a6dbd6a9 | 206 | rIndicator = !rIndicator; | 
| Steaar | 4:72c487215487 | 207 | wait(0.5); | 
| Steaar | 1:c2c4bd530112 | 208 | } | 
| Steaar | 4:72c487215487 | 209 | else if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on | 
| Steaar | 4:72c487215487 | 210 | lIndicator = !lIndicator; // left LED at 1Hz | 
| Steaar | 4:72c487215487 | 211 | wait(1); | 
| Steaar | 1:c2c4bd530112 | 212 | } | 
| Steaar | 4:72c487215487 | 213 | else if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on | 
| Steaar | 4:72c487215487 | 214 | rIndicator = !rIndicator; // right LED at 1Hz | 
| Steaar | 4:72c487215487 | 215 | wait(1); | 
| Steaar | 1:c2c4bd530112 | 216 | } | 
| Steaar | 1:c2c4bd530112 | 217 | |
| Steaar | 1:c2c4bd530112 | 218 | Thread::wait(2000); | 
| Steaar | 0:1580a6dbd6a9 | 219 | } | 
| Steaar | 0:1580a6dbd6a9 | 220 | } | 
| Steaar | 4:72c487215487 | 221 | |
| Steaar | 0:1580a6dbd6a9 | 222 | |
| Steaar | 0:1580a6dbd6a9 | 223 | int main() | 
| Steaar | 0:1580a6dbd6a9 | 224 | { | 
| Steaar | 0:1580a6dbd6a9 | 225 | par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip | 
| Steaar | 0:1580a6dbd6a9 | 226 | lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display | 
| Steaar | 0:1580a6dbd6a9 | 227 | par_port->write_bit(1,BL_BIT); // turn LCD backlight ON | 
| Steaar | 1:c2c4bd530112 | 228 | |
| Steaar | 6:a026e0651ad5 | 229 | sp.start(getSpeed); //20 y | 
| Steaar | 6:a026e0651ad5 | 230 | task1.start(acceleration); //10 y | 
| Steaar | 6:a026e0651ad5 | 231 | task2.start(ignition); //2 .setPriority(); y | 
| Steaar | 6:a026e0651ad5 | 232 | task3.start(speedo); //5 y | 
| Steaar | 6:a026e0651ad5 | 233 | task4.start(braking); //2 y | 
| Steaar | 6:a026e0651ad5 | 234 | task5.start(greatScott); //1 y | 
| Steaar | 6:a026e0651ad5 | 235 | task6.start(LCD); //2 y | 
| Steaar | 5:e62e0e3084fc | 236 | // task7.start(callback(send_thread)); //0.2 | 
| Steaar | 5:e62e0e3084fc | 237 | // task8.start(toSerial); //0.05 | 
| Steaar | 5:e62e0e3084fc | 238 | // task9.start(lights); //1 | 
| Steaar | 5:e62e0e3084fc | 239 | // task10.start(indicators); //0.5 | 
| Steaar | 5:e62e0e3084fc | 240 | |
| Steaar | 0:1580a6dbd6a9 | 241 | } | 
| Steaar | 0:1580a6dbd6a9 | 242 | |
| Steaar | 0:1580a6dbd6a9 | 243 | |
| Steaar | 1:c2c4bd530112 | 244 |