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@2:51a06b9a52d1, 2018-03-26 (annotated)
- Committer:
- Steaar
- Date:
- Mon Mar 26 14:47:56 2018 +0000
- Revision:
- 2:51a06b9a52d1
- Parent:
- 1:c2c4bd530112
- Child:
- 3:d888509e77b8
All features added. Test time for each. Test on red box
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 | 0:1580a6dbd6a9 | 10 | MCP23017 *par_port; // pointer to 16-bit parallel I/O object |
| Steaar | 0:1580a6dbd6a9 | 11 | WattBob_TextLCD *lcd; // pointer to 2*16 chacater LCD object |
| Steaar | 0:1580a6dbd6a9 | 12 | |
| Steaar | 0:1580a6dbd6a9 | 13 | AnalogIn accel(p15); // Analog |
| Steaar | 0:1580a6dbd6a9 | 14 | AnalogIn brake(p16); |
| Steaar | 0:1580a6dbd6a9 | 15 | float speed = 0; |
| Steaar | 1:c2c4bd530112 | 16 | float aveSpeed; |
| Steaar | 0:1580a6dbd6a9 | 17 | float acc = 0; |
| Steaar | 0:1580a6dbd6a9 | 18 | float br = 0; |
| Steaar | 0:1580a6dbd6a9 | 19 | float dif; |
| Steaar | 1:c2c4bd530112 | 20 | float distance = 0; |
| Steaar | 0:1580a6dbd6a9 | 21 | |
| Steaar | 0:1580a6dbd6a9 | 22 | Timer tim; |
| Steaar | 0:1580a6dbd6a9 | 23 | long int t; |
| Steaar | 0:1580a6dbd6a9 | 24 | |
| Steaar | 2:51a06b9a52d1 | 25 | DigitalOut sideLights(LED1);// mbed out |
| Steaar | 1:c2c4bd530112 | 26 | DigitalOut lIndicator(LED2); |
| Steaar | 1:c2c4bd530112 | 27 | DigitalOut rIndicator(LED3); |
| Steaar | 0:1580a6dbd6a9 | 28 | DigitalOut engLight(LED4); |
| Steaar | 0:1580a6dbd6a9 | 29 | |
| Steaar | 2:51a06b9a52d1 | 30 | DigitalOut brakeLights(p6);// redbox out |
| Steaar | 0:1580a6dbd6a9 | 31 | DigitalOut fluxCapacitor(p7); |
| Steaar | 0:1580a6dbd6a9 | 32 | |
| Steaar | 2:51a06b9a52d1 | 33 | DigitalIn lightSwitch(p8);// switches |
| Steaar | 0:1580a6dbd6a9 | 34 | DigitalIn lIndicate(p9); |
| Steaar | 0:1580a6dbd6a9 | 35 | DigitalIn rIndicate(p10); |
| Steaar | 1:c2c4bd530112 | 36 | DigitalIn engine(p5); |
| Steaar | 0:1580a6dbd6a9 | 37 | |
| Steaar | 2:51a06b9a52d1 | 38 | Serial pc(USBTX, USBRX);// serial tx, rx |
| Steaar | 2:51a06b9a52d1 | 39 | |
| Steaar | 1:c2c4bd530112 | 40 | Thread sp; |
| Steaar | 1:c2c4bd530112 | 41 | Thread task1; |
| Steaar | 1:c2c4bd530112 | 42 | Thread task2; |
| Steaar | 1:c2c4bd530112 | 43 | Thread task3; |
| Steaar | 1:c2c4bd530112 | 44 | Thread task4; |
| Steaar | 1:c2c4bd530112 | 45 | Thread task5; |
| Steaar | 1:c2c4bd530112 | 46 | Thread task6; |
| Steaar | 1:c2c4bd530112 | 47 | Thread task7; |
| Steaar | 1:c2c4bd530112 | 48 | Thread task8; |
| Steaar | 1:c2c4bd530112 | 49 | Thread task9; |
| Steaar | 1:c2c4bd530112 | 50 | Thread task10; |
| Steaar | 1:c2c4bd530112 | 51 | |
| Steaar | 2:51a06b9a52d1 | 52 | /* Mail */ |
| Steaar | 2:51a06b9a52d1 | 53 | typedef struct { |
| Steaar | 2:51a06b9a52d1 | 54 | float m_speed; |
| Steaar | 2:51a06b9a52d1 | 55 | float m_acc; |
| Steaar | 2:51a06b9a52d1 | 56 | float m_br; |
| Steaar | 2:51a06b9a52d1 | 57 | uint32_t counter; /* A counter value */ |
| Steaar | 2:51a06b9a52d1 | 58 | } mail_t; |
| Steaar | 2:51a06b9a52d1 | 59 | |
| Steaar | 2:51a06b9a52d1 | 60 | Mail<mail_t, 100> mail_box; |
| Steaar | 2:51a06b9a52d1 | 61 | |
| Steaar | 2:51a06b9a52d1 | 62 | void send_thread (void) |
| Steaar | 2:51a06b9a52d1 | 63 | { |
| Steaar | 2:51a06b9a52d1 | 64 | uint32_t i = 0; |
| Steaar | 2:51a06b9a52d1 | 65 | while (true) { |
| Steaar | 2:51a06b9a52d1 | 66 | i++; // fake data update |
| Steaar | 2:51a06b9a52d1 | 67 | mail_t *mail = mail_box.alloc(); |
| Steaar | 2:51a06b9a52d1 | 68 | mail->m_speed = speed; |
| Steaar | 2:51a06b9a52d1 | 69 | mail->m_acc = acc; |
| Steaar | 2:51a06b9a52d1 | 70 | mail->m_br = br; |
| Steaar | 2:51a06b9a52d1 | 71 | mail->counter = i; |
| Steaar | 2:51a06b9a52d1 | 72 | mail_box.put(mail); |
| Steaar | 2:51a06b9a52d1 | 73 | |
| Steaar | 2:51a06b9a52d1 | 74 | osEvent evt = mail_box.get(); |
| Steaar | 2:51a06b9a52d1 | 75 | if (evt.status == osEventMail) { |
| Steaar | 2:51a06b9a52d1 | 76 | mail_t *mail = (mail_t*)evt.value.p; |
| Steaar | 2:51a06b9a52d1 | 77 | printf("\nSpeed: %.2f \n\r" , mail->m_speed); |
| Steaar | 2:51a06b9a52d1 | 78 | printf("Acceleration: %.2f \n\r" , mail->m_acc); |
| Steaar | 2:51a06b9a52d1 | 79 | printf("Braking: %.2f \n\r", mail->m_br); |
| Steaar | 2:51a06b9a52d1 | 80 | |
| Steaar | 2:51a06b9a52d1 | 81 | mail_box.free(mail); |
| Steaar | 2:51a06b9a52d1 | 82 | } |
| Steaar | 2:51a06b9a52d1 | 83 | Thread::wait(5000); |
| Steaar | 2:51a06b9a52d1 | 84 | } |
| Steaar | 2:51a06b9a52d1 | 85 | } |
| Steaar | 2:51a06b9a52d1 | 86 | |
| Steaar | 1:c2c4bd530112 | 87 | |
| Steaar | 1:c2c4bd530112 | 88 | void acceleration() //run at 20hz // 1 read brake and accelerator 10 |
| Steaar | 1:c2c4bd530112 | 89 | { |
| Steaar | 1:c2c4bd530112 | 90 | while (1) { |
| Steaar | 1:c2c4bd530112 | 91 | acc = accel.read()*3.3; |
| Steaar | 1:c2c4bd530112 | 92 | br = brake.read()*3.3; |
| Steaar | 1:c2c4bd530112 | 93 | Thread::wait(500); |
| Steaar | 1:c2c4bd530112 | 94 | } |
| Steaar | 0:1580a6dbd6a9 | 95 | } |
| Steaar | 1:c2c4bd530112 | 96 | void getSpeed() // 20Hz |
| Steaar | 1:c2c4bd530112 | 97 | { |
| Steaar | 1:c2c4bd530112 | 98 | while (1) { |
| Steaar | 1:c2c4bd530112 | 99 | dif = acc - br; |
| Steaar | 1:c2c4bd530112 | 100 | t = tim.read(); |
| Steaar | 1:c2c4bd530112 | 101 | speed = speed + (dif*t*3.6); |
| Steaar | 1:c2c4bd530112 | 102 | if (speed < 0) { |
| Steaar | 1:c2c4bd530112 | 103 | speed = 0; |
| Steaar | 1:c2c4bd530112 | 104 | } |
| Steaar | 1:c2c4bd530112 | 105 | distance = distance + (speed*t + (0.5*dif*(t*t)))/1000; |
| Steaar | 1:c2c4bd530112 | 106 | tim.reset(); |
| Steaar | 1:c2c4bd530112 | 107 | |
| Steaar | 1:c2c4bd530112 | 108 | Thread::wait(100); |
| Steaar | 0:1580a6dbd6a9 | 109 | } |
| Steaar | 0:1580a6dbd6a9 | 110 | } |
| Steaar | 1:c2c4bd530112 | 111 | void ignition() // 2 Read engine on/off show LED 2 |
| Steaar | 1:c2c4bd530112 | 112 | { |
| Steaar | 1:c2c4bd530112 | 113 | while (1) { |
| Steaar | 1:c2c4bd530112 | 114 | if (engine == 1) { |
| Steaar | 1:c2c4bd530112 | 115 | engLight = 1; |
| Steaar | 1:c2c4bd530112 | 116 | } |
| Steaar | 1:c2c4bd530112 | 117 | |
| Steaar | 1:c2c4bd530112 | 118 | Thread::wait(500); |
| Steaar | 0:1580a6dbd6a9 | 119 | } |
| Steaar | 0:1580a6dbd6a9 | 120 | } |
| Steaar | 1:c2c4bd530112 | 121 | void speedo() // 3 Average last n speed readings 2 |
| Steaar | 1:c2c4bd530112 | 122 | { |
| Steaar | 1:c2c4bd530112 | 123 | while (1) { |
| Steaar | 1:c2c4bd530112 | 124 | for (int i = 0; i<3; i++) { |
| Steaar | 1:c2c4bd530112 | 125 | aveSpeed = speed + aveSpeed; |
| Steaar | 1:c2c4bd530112 | 126 | } |
| Steaar | 1:c2c4bd530112 | 127 | speed = speed/4; |
| Steaar | 1:c2c4bd530112 | 128 | |
| Steaar | 1:c2c4bd530112 | 129 | Thread::wait(200); |
| Steaar | 0:1580a6dbd6a9 | 130 | } |
| Steaar | 0:1580a6dbd6a9 | 131 | } |
| Steaar | 1:c2c4bd530112 | 132 | void braking() // 4 Brake indicated by LED 2 |
| Steaar | 1:c2c4bd530112 | 133 | { |
| Steaar | 1:c2c4bd530112 | 134 | while (1) { |
| Steaar | 1:c2c4bd530112 | 135 | if ( br>0) { |
| Steaar | 1:c2c4bd530112 | 136 | brakeLights = 1; |
| Steaar | 1:c2c4bd530112 | 137 | } |
| Steaar | 1:c2c4bd530112 | 138 | |
| Steaar | 1:c2c4bd530112 | 139 | Thread::wait(500); |
| Steaar | 0:1580a6dbd6a9 | 140 | } |
| Steaar | 0:1580a6dbd6a9 | 141 | } |
| Steaar | 1:c2c4bd530112 | 142 | void greatScott() // 5 if speed > 88 LED on 1 |
| Steaar | 1:c2c4bd530112 | 143 | { |
| Steaar | 1:c2c4bd530112 | 144 | while (1) { |
| Steaar | 1:c2c4bd530112 | 145 | if (speed > 88) { |
| Steaar | 1:c2c4bd530112 | 146 | fluxCapacitor = 1; |
| Steaar | 1:c2c4bd530112 | 147 | } |
| Steaar | 1:c2c4bd530112 | 148 | |
| Steaar | 1:c2c4bd530112 | 149 | Thread::wait(1000); |
| Steaar | 1:c2c4bd530112 | 150 | } |
| Steaar | 1:c2c4bd530112 | 151 | } |
| Steaar | 1:c2c4bd530112 | 152 | void LCD() // 6 display odometer and speed 2 |
| Steaar | 1:c2c4bd530112 | 153 | { |
| Steaar | 1:c2c4bd530112 | 154 | while (1) { |
| Steaar | 1:c2c4bd530112 | 155 | t = tim.read(); |
| Steaar | 1:c2c4bd530112 | 156 | distance = speed * (t/3600); |
| Steaar | 1:c2c4bd530112 | 157 | |
| Steaar | 1:c2c4bd530112 | 158 | lcd->locate(0,0); |
| Steaar | 1:c2c4bd530112 | 159 | lcd->printf("KM:%0.1f",distance); |
| Steaar | 1:c2c4bd530112 | 160 | lcd->locate(1,0); |
| Steaar | 1:c2c4bd530112 | 161 | lcd->printf("KMPH:%0.1f",speed); |
| Steaar | 1:c2c4bd530112 | 162 | |
| Steaar | 1:c2c4bd530112 | 163 | Thread::wait(500); |
| Steaar | 1:c2c4bd530112 | 164 | } |
| Steaar | 0:1580a6dbd6a9 | 165 | } |
| Steaar | 0:1580a6dbd6a9 | 166 | // 7 Send speed, acc, brake to 100 0.2 |
| Steaar | 0:1580a6dbd6a9 | 167 | // element MAIL q MBED RTOS |
| Steaar | 0:1580a6dbd6a9 | 168 | // 8 MAIL q to serial PC 0.05 |
| Steaar | 1:c2c4bd530112 | 169 | void lights() // 9 side light switch, set lights 1 |
| Steaar | 1:c2c4bd530112 | 170 | { |
| Steaar | 1:c2c4bd530112 | 171 | while (1) { |
| Steaar | 1:c2c4bd530112 | 172 | if (lightSwitch == 1) { |
| Steaar | 1:c2c4bd530112 | 173 | sideLights = 1; |
| Steaar | 2:51a06b9a52d1 | 174 | } else { |
| Steaar | 2:51a06b9a52d1 | 175 | sideLights = 0; |
| Steaar | 1:c2c4bd530112 | 176 | } |
| Steaar | 1:c2c4bd530112 | 177 | |
| Steaar | 1:c2c4bd530112 | 178 | Thread::wait(1000); |
| Steaar | 0:1580a6dbd6a9 | 179 | } |
| Steaar | 0:1580a6dbd6a9 | 180 | } |
| Steaar | 1:c2c4bd530112 | 181 | void indicators() // 10. Read indicator switches, flash |
| Steaar | 1:c2c4bd530112 | 182 | { |
| Steaar | 1:c2c4bd530112 | 183 | while (1) { |
| Steaar | 1:c2c4bd530112 | 184 | if ((lIndicate == 1) && (rIndicate == 1)) { // both LED at 2Hz If both switch on |
| Steaar | 0:1580a6dbd6a9 | 185 | lIndicator = !lIndicator; |
| Steaar | 0:1580a6dbd6a9 | 186 | rIndicator = !rIndicator; |
| Steaar | 1:c2c4bd530112 | 187 | // Thread::wait(2000); |
| Steaar | 1:c2c4bd530112 | 188 | } |
| Steaar | 1:c2c4bd530112 | 189 | if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on |
| Steaar | 0:1580a6dbd6a9 | 190 | lIndicator = !lIndicator; // left LED at 1Hz |
| Steaar | 1:c2c4bd530112 | 191 | // Thread::wait(1000); |
| Steaar | 1:c2c4bd530112 | 192 | } |
| Steaar | 1:c2c4bd530112 | 193 | if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on |
| Steaar | 0:1580a6dbd6a9 | 194 | rIndicator = !rIndicator; // right LED at 1Hz |
| Steaar | 1:c2c4bd530112 | 195 | // Thread::wait(1000); |
| Steaar | 1:c2c4bd530112 | 196 | } |
| Steaar | 1:c2c4bd530112 | 197 | |
| Steaar | 1:c2c4bd530112 | 198 | Thread::wait(2000); |
| Steaar | 0:1580a6dbd6a9 | 199 | } |
| Steaar | 0:1580a6dbd6a9 | 200 | } |
| Steaar | 2:51a06b9a52d1 | 201 | void toSerial()//7 |
| Steaar | 2:51a06b9a52d1 | 202 | { |
| Steaar | 2:51a06b9a52d1 | 203 | while (1) { |
| Steaar | 2:51a06b9a52d1 | 204 | osEvent evt = mail_box.get(); |
| Steaar | 2:51a06b9a52d1 | 205 | mail_t *mail = (mail_t*)evt.value.p; |
| Steaar | 2:51a06b9a52d1 | 206 | pc.printf("\nSpeed: %.2f \n\r", mail->m_speed); |
| Steaar | 2:51a06b9a52d1 | 207 | pc.printf("Acceleration: %.2f \n\r", mail->m_acc); |
| Steaar | 2:51a06b9a52d1 | 208 | pc.printf("Braking: %.2f \n\r", mail->m_br); |
| Steaar | 2:51a06b9a52d1 | 209 | |
| Steaar | 2:51a06b9a52d1 | 210 | Thread::wait(20000); |
| Steaar | 2:51a06b9a52d1 | 211 | } |
| Steaar | 2:51a06b9a52d1 | 212 | } |
| Steaar | 0:1580a6dbd6a9 | 213 | |
| Steaar | 0:1580a6dbd6a9 | 214 | int main() |
| Steaar | 0:1580a6dbd6a9 | 215 | { |
| Steaar | 0:1580a6dbd6a9 | 216 | par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip |
| Steaar | 0:1580a6dbd6a9 | 217 | lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display |
| Steaar | 0:1580a6dbd6a9 | 218 | par_port->write_bit(1,BL_BIT); // turn LCD backlight ON |
| Steaar | 1:c2c4bd530112 | 219 | |
| Steaar | 2:51a06b9a52d1 | 220 | sp.start(getSpeed); //20 |
| Steaar | 2:51a06b9a52d1 | 221 | task1.start(acceleration); //10 |
| Steaar | 2:51a06b9a52d1 | 222 | task2.start(ignition); //2 |
| Steaar | 2:51a06b9a52d1 | 223 | task3.start(speedo); //5 |
| Steaar | 2:51a06b9a52d1 | 224 | task4.start(braking); //2 |
| Steaar | 2:51a06b9a52d1 | 225 | task5.start(greatScott); //1 |
| Steaar | 2:51a06b9a52d1 | 226 | task6.start(LCD); //2 |
| Steaar | 2:51a06b9a52d1 | 227 | task7.start(callback(send_thread)); //0.2 |
| Steaar | 2:51a06b9a52d1 | 228 | //task8.start(); //0.05 |
| Steaar | 2:51a06b9a52d1 | 229 | task9.start(lights); //1 |
| Steaar | 2:51a06b9a52d1 | 230 | task10.start(indicators); //0.5 |
| Steaar | 0:1580a6dbd6a9 | 231 | } |
| Steaar | 0:1580a6dbd6a9 | 232 | |
| Steaar | 0:1580a6dbd6a9 | 233 | |
| Steaar | 1:c2c4bd530112 | 234 |