Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

Committer:
Steaar
Date:
Tue Mar 27 10:15:57 2018 +0000
Revision:
4:72c487215487
Parent:
3:d888509e77b8
Child:
5:e62e0e3084fc
Fix priorities

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