Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

Committer:
Steaar
Date:
Tue Mar 27 12:56:10 2018 +0000
Revision:
5:e62e0e3084fc
Parent:
4:72c487215487
Child:
6:a026e0651ad5
speed and distance corrected. Continue testing. Set 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 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 5:e62e0e3084fc 76 speed = (acc - br)*16.835;
Steaar 4:72c487215487 77 if (speed < 0) {
Steaar 4:72c487215487 78 speed = 0;
Steaar 4:72c487215487 79 }
Steaar 5:e62e0e3084fc 80 kmph = speed*3.6;
Steaar 5:e62e0e3084fc 81 distance = distance + (speed*0.05)/1000;
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 4:72c487215487 101 aveSpeed = speed + aveSpeed;
Steaar 4:72c487215487 102 }
Steaar 5:e62e0e3084fc 103 aveSpeed = speed/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 4:72c487215487 124 if (speed > 140) {
Steaar 4:72c487215487 125 fluxCapacitor = 1;
Steaar 4:72c487215487 126 }
Steaar 4:72c487215487 127
Steaar 4:72c487215487 128 Thread::wait(1000);
Steaar 4:72c487215487 129 }
Steaar 4:72c487215487 130 }
Steaar 4:72c487215487 131 void LCD() // 6. display odometer and speed 2
Steaar 4:72c487215487 132 {
Steaar 4:72c487215487 133 while (1) {
Steaar 4:72c487215487 134
Steaar 4:72c487215487 135 lcd->locate(0,0);
Steaar 4:72c487215487 136 lcd->printf("KM:%0.1f",distance);
Steaar 4:72c487215487 137 lcd->locate(1,0);
Steaar 5:e62e0e3084fc 138 lcd->printf("KMPH:%.1f",kmph);
Steaar 5:e62e0e3084fc 139 lcd->locate(0,8);
Steaar 5:e62e0e3084fc 140 //ac.wait();
Steaar 5:e62e0e3084fc 141 //lcd->printf("a:%0.1f",dif);
Steaar 5:e62e0e3084fc 142 lcd->locate(1,8);
Steaar 5:e62e0e3084fc 143 //ac.release();
Steaar 5:e62e0e3084fc 144 //lcd->printf("b:%d",engine.read());
Steaar 4:72c487215487 145
Steaar 4:72c487215487 146 Thread::wait(500);
Steaar 4:72c487215487 147 }
Steaar 4:72c487215487 148 }
Steaar 4:72c487215487 149 void send_thread (void) // 7. Send speed, acc, brake to MAILq 0.2
Steaar 2:51a06b9a52d1 150 {
Steaar 2:51a06b9a52d1 151 uint32_t i = 0;
Steaar 2:51a06b9a52d1 152 while (true) {
Steaar 2:51a06b9a52d1 153 i++; // fake data update
Steaar 2:51a06b9a52d1 154 mail_t *mail = mail_box.alloc();
Steaar 2:51a06b9a52d1 155 mail->m_speed = speed;
Steaar 2:51a06b9a52d1 156 mail->m_acc = acc;
Steaar 2:51a06b9a52d1 157 mail->m_br = br;
Steaar 2:51a06b9a52d1 158 mail->counter = i;
Steaar 2:51a06b9a52d1 159 mail_box.put(mail);
Steaar 2:51a06b9a52d1 160
Steaar 2:51a06b9a52d1 161 osEvent evt = mail_box.get();
Steaar 2:51a06b9a52d1 162 if (evt.status == osEventMail) {
Steaar 2:51a06b9a52d1 163 mail_t *mail = (mail_t*)evt.value.p;
Steaar 4:72c487215487 164 printf("\nSpeed: %.1f \n\r" , mail->m_speed);
Steaar 2:51a06b9a52d1 165 printf("Acceleration: %.2f \n\r" , mail->m_acc);
Steaar 4:72c487215487 166 printf("Braking: %.1f \n\r", mail->m_br);
Steaar 2:51a06b9a52d1 167
Steaar 2:51a06b9a52d1 168 mail_box.free(mail);
Steaar 2:51a06b9a52d1 169 }
Steaar 2:51a06b9a52d1 170 Thread::wait(5000);
Steaar 2:51a06b9a52d1 171 }
Steaar 2:51a06b9a52d1 172 }
Steaar 4:72c487215487 173 void toSerial() // 8. MAIL q to serial PC 0.05
Steaar 1:c2c4bd530112 174 {
Steaar 1:c2c4bd530112 175 while (1) {
Steaar 4:72c487215487 176 osEvent evt = mail_box.get();
Steaar 4:72c487215487 177 mail_t *mail = (mail_t*)evt.value.p;
Steaar 4:72c487215487 178 pc.printf("\nSpeed: %.2f \n\r", mail->m_speed);
Steaar 4:72c487215487 179 pc.printf("Acceleration: %.2f \n\r", mail->m_acc);
Steaar 4:72c487215487 180 pc.printf("Braking: %.2f \n\r", mail->m_br);
Steaar 1:c2c4bd530112 181
Steaar 4:72c487215487 182 Thread::wait(20000);
Steaar 0:1580a6dbd6a9 183 }
Steaar 0:1580a6dbd6a9 184 }
Steaar 4:72c487215487 185 void lights() // 9. set side lights 1
Steaar 1:c2c4bd530112 186 {
Steaar 1:c2c4bd530112 187 while (1) {
Steaar 1:c2c4bd530112 188 if (lightSwitch == 1) {
Steaar 1:c2c4bd530112 189 sideLights = 1;
Steaar 2:51a06b9a52d1 190 } else {
Steaar 2:51a06b9a52d1 191 sideLights = 0;
Steaar 1:c2c4bd530112 192 }
Steaar 1:c2c4bd530112 193
Steaar 1:c2c4bd530112 194 Thread::wait(1000);
Steaar 0:1580a6dbd6a9 195 }
Steaar 0:1580a6dbd6a9 196 }
Steaar 4:72c487215487 197 void indicators() // 10. flash indicators 0.5
Steaar 1:c2c4bd530112 198 {
Steaar 1:c2c4bd530112 199 while (1) {
Steaar 4:72c487215487 200
Steaar 4:72c487215487 201 if ((lIndicate == 1) && (rIndicate == 1)) { // If both switch on
Steaar 4:72c487215487 202 lIndicator = !lIndicator; // both LED at 2Hz
Steaar 0:1580a6dbd6a9 203 rIndicator = !rIndicator;
Steaar 4:72c487215487 204 wait(0.5);
Steaar 1:c2c4bd530112 205 }
Steaar 4:72c487215487 206 else if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on
Steaar 4:72c487215487 207 lIndicator = !lIndicator; // left LED at 1Hz
Steaar 4:72c487215487 208 wait(1);
Steaar 1:c2c4bd530112 209 }
Steaar 4:72c487215487 210 else if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on
Steaar 4:72c487215487 211 rIndicator = !rIndicator; // right LED at 1Hz
Steaar 4:72c487215487 212 wait(1);
Steaar 1:c2c4bd530112 213 }
Steaar 1:c2c4bd530112 214
Steaar 1:c2c4bd530112 215 Thread::wait(2000);
Steaar 0:1580a6dbd6a9 216 }
Steaar 0:1580a6dbd6a9 217 }
Steaar 4:72c487215487 218
Steaar 0:1580a6dbd6a9 219
Steaar 0:1580a6dbd6a9 220 int main()
Steaar 0:1580a6dbd6a9 221 {
Steaar 0:1580a6dbd6a9 222 par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip
Steaar 0:1580a6dbd6a9 223 lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display
Steaar 0:1580a6dbd6a9 224 par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
Steaar 1:c2c4bd530112 225
Steaar 3:d888509e77b8 226 sp.start(getSpeed); //20
Steaar 3:d888509e77b8 227 task1.start(acceleration); //10
Steaar 5:e62e0e3084fc 228 // task2.start(ignition); //2 .setPriority();
Steaar 5:e62e0e3084fc 229 // task3.start(speedo); //5
Steaar 5:e62e0e3084fc 230 // task4.start(braking); //2
Steaar 5:e62e0e3084fc 231 // task5.start(greatScott); //1
Steaar 3:d888509e77b8 232 task6.start(LCD); //2
Steaar 5:e62e0e3084fc 233 // task7.start(callback(send_thread)); //0.2
Steaar 5:e62e0e3084fc 234 // task8.start(toSerial); //0.05
Steaar 5:e62e0e3084fc 235 // task9.start(lights); //1
Steaar 5:e62e0e3084fc 236 // task10.start(indicators); //0.5
Steaar 5:e62e0e3084fc 237
Steaar 0:1580a6dbd6a9 238 }
Steaar 0:1580a6dbd6a9 239
Steaar 0:1580a6dbd6a9 240
Steaar 1:c2c4bd530112 241