Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

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?

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 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