case study 3 distributed network

Dependencies:   mbed C12832 LM75B rtos

Committer:
jasonberry
Date:
Wed Nov 25 16:33:39 2020 +0000
Revision:
0:9c8b3fc1ada3
Child:
1:a817566e1bb3
can hello

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasonberry 0:9c8b3fc1ada3 1 #include "mbed.h"
jasonberry 0:9c8b3fc1ada3 2 #include "rtos.h"
jasonberry 0:9c8b3fc1ada3 3 #include "LM75B.h"
jasonberry 0:9c8b3fc1ada3 4 #include "C12832.h"
jasonberry 0:9c8b3fc1ada3 5
jasonberry 0:9c8b3fc1ada3 6 CANMessage msg;
jasonberry 0:9c8b3fc1ada3 7
jasonberry 0:9c8b3fc1ada3 8 // STEP 1/////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 9 //baseboard address
jasonberry 0:9c8b3fc1ada3 10 #define BASE_ADDRESS 150
jasonberry 0:9c8b3fc1ada3 11
jasonberry 0:9c8b3fc1ada3 12
jasonberry 0:9c8b3fc1ada3 13
jasonberry 0:9c8b3fc1ada3 14 // STEP 2//////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 15 // phyiscal inputs
jasonberry 0:9c8b3fc1ada3 16 DigitalIn joy_up(p15);
jasonberry 0:9c8b3fc1ada3 17 DigitalIn joy_down(p12);
jasonberry 0:9c8b3fc1ada3 18 DigitalIn joy_left(p13);
jasonberry 0:9c8b3fc1ada3 19 DigitalIn joy_right(p16);
jasonberry 0:9c8b3fc1ada3 20 DigitalIn joy_fire(p14);
jasonberry 0:9c8b3fc1ada3 21
jasonberry 0:9c8b3fc1ada3 22 LM75B sensor(p28,p27);
jasonberry 0:9c8b3fc1ada3 23
jasonberry 0:9c8b3fc1ada3 24
jasonberry 0:9c8b3fc1ada3 25
jasonberry 0:9c8b3fc1ada3 26 //STEP 3///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 27 //physical outputs
jasonberry 0:9c8b3fc1ada3 28 DigitalOut led1(LED1);
jasonberry 0:9c8b3fc1ada3 29 DigitalOut led2(LED2);
jasonberry 0:9c8b3fc1ada3 30 PwmOut spkr(p26);
jasonberry 0:9c8b3fc1ada3 31
jasonberry 0:9c8b3fc1ada3 32 //STEP 4///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 33 // message structure can
jasonberry 0:9c8b3fc1ada3 34
jasonberry 0:9c8b3fc1ada3 35 ///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 36 typedef struct {
jasonberry 0:9c8b3fc1ada3 37
jasonberry 0:9c8b3fc1ada3 38 int id; /* can id */
jasonberry 0:9c8b3fc1ada3 39 char data[8]; /*can data */
jasonberry 0:9c8b3fc1ada3 40
jasonberry 0:9c8b3fc1ada3 41 } can_message_t;
jasonberry 0:9c8b3fc1ada3 42
jasonberry 0:9c8b3fc1ada3 43
jasonberry 0:9c8b3fc1ada3 44
jasonberry 0:9c8b3fc1ada3 45
jasonberry 0:9c8b3fc1ada3 46
jasonberry 0:9c8b3fc1ada3 47 //STEP 4///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 48 // ipc for can write thread
jasonberry 0:9c8b3fc1ada3 49 ///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 50 MemoryPool<can_message_t, 8> can_write_mpool;
jasonberry 0:9c8b3fc1ada3 51 Queue<can_message_t, 8> can_write_queue;
jasonberry 0:9c8b3fc1ada3 52
jasonberry 0:9c8b3fc1ada3 53 //STEP 5///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 54 // ipc for digital output thread
jasonberry 0:9c8b3fc1ada3 55
jasonberry 0:9c8b3fc1ada3 56 ////////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 57 MemoryPool<can_message_t, 8> digital_output_mpool;
jasonberry 0:9c8b3fc1ada3 58 Queue<can_message_t, 8> digital_output_queue;
jasonberry 0:9c8b3fc1ada3 59
jasonberry 0:9c8b3fc1ada3 60
jasonberry 0:9c8b3fc1ada3 61 //STEP 6///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 62 // ipc for analog output thread
jasonberry 0:9c8b3fc1ada3 63
jasonberry 0:9c8b3fc1ada3 64 ////////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 65 MemoryPool<can_message_t, 8> analog_output_mpool;
jasonberry 0:9c8b3fc1ada3 66 Queue<can_message_t, 8> analog_output_queue;
jasonberry 0:9c8b3fc1ada3 67
jasonberry 0:9c8b3fc1ada3 68 //STEP 7///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 69 // set up canbus
jasonberry 0:9c8b3fc1ada3 70 ///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 71 CAN can1(p30, p29);
jasonberry 0:9c8b3fc1ada3 72 //CAN can1(p9, p10);
jasonberry 0:9c8b3fc1ada3 73
jasonberry 0:9c8b3fc1ada3 74 //STEP 8///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 75 /* digital input Thread */
jasonberry 0:9c8b3fc1ada3 76 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 77 void digital_input_thread (void const *args) {
jasonberry 0:9c8b3fc1ada3 78
jasonberry 0:9c8b3fc1ada3 79 while (true) {
jasonberry 0:9c8b3fc1ada3 80
jasonberry 0:9c8b3fc1ada3 81 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 82 message->id = BASE_ADDRESS + 0;
jasonberry 0:9c8b3fc1ada3 83 message->data[0] = joy_up;
jasonberry 0:9c8b3fc1ada3 84 message->data[1] = joy_down;
jasonberry 0:9c8b3fc1ada3 85 message->data[2] = joy_left;
jasonberry 0:9c8b3fc1ada3 86 message->data[3] = joy_right;
jasonberry 0:9c8b3fc1ada3 87 message->data[4] = joy_fire;
jasonberry 0:9c8b3fc1ada3 88
jasonberry 0:9c8b3fc1ada3 89
jasonberry 0:9c8b3fc1ada3 90
jasonberry 0:9c8b3fc1ada3 91 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 92
jasonberry 0:9c8b3fc1ada3 93 //fun bit nod yes on fire
jasonberry 0:9c8b3fc1ada3 94 if(joy_fire == 1)
jasonberry 0:9c8b3fc1ada3 95 {
jasonberry 0:9c8b3fc1ada3 96 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 97 message->id = 142;
jasonberry 0:9c8b3fc1ada3 98 message->data[0] = 5;
jasonberry 0:9c8b3fc1ada3 99
jasonberry 0:9c8b3fc1ada3 100 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 101 }
jasonberry 0:9c8b3fc1ada3 102 else if(joy_left == 1)
jasonberry 0:9c8b3fc1ada3 103 {
jasonberry 0:9c8b3fc1ada3 104 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 105 message->id = 141;
jasonberry 0:9c8b3fc1ada3 106 message->data[0] = 1;
jasonberry 0:9c8b3fc1ada3 107
jasonberry 0:9c8b3fc1ada3 108 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 109 }
jasonberry 0:9c8b3fc1ada3 110 else if(joy_right == 1)
jasonberry 0:9c8b3fc1ada3 111 {
jasonberry 0:9c8b3fc1ada3 112 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 113 message->id = 141;
jasonberry 0:9c8b3fc1ada3 114 message->data[0] = 2;
jasonberry 0:9c8b3fc1ada3 115
jasonberry 0:9c8b3fc1ada3 116 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 117 }
jasonberry 0:9c8b3fc1ada3 118 else if(joy_up == 1)
jasonberry 0:9c8b3fc1ada3 119 {
jasonberry 0:9c8b3fc1ada3 120 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 121 message->id = 141;
jasonberry 0:9c8b3fc1ada3 122 message->data[0] = 4;
jasonberry 0:9c8b3fc1ada3 123
jasonberry 0:9c8b3fc1ada3 124 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 125 }
jasonberry 0:9c8b3fc1ada3 126 else if(joy_down == 1)
jasonberry 0:9c8b3fc1ada3 127 {
jasonberry 0:9c8b3fc1ada3 128 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 129 message->id = 141;
jasonberry 0:9c8b3fc1ada3 130 message->data[0] = 3;
jasonberry 0:9c8b3fc1ada3 131
jasonberry 0:9c8b3fc1ada3 132 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 133 }
jasonberry 0:9c8b3fc1ada3 134
jasonberry 0:9c8b3fc1ada3 135 Thread::wait(500);
jasonberry 0:9c8b3fc1ada3 136 }
jasonberry 0:9c8b3fc1ada3 137
jasonberry 0:9c8b3fc1ada3 138 }
jasonberry 0:9c8b3fc1ada3 139
jasonberry 0:9c8b3fc1ada3 140 //STEP 9///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 141 /* analog input Thread */
jasonberry 0:9c8b3fc1ada3 142 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 143 void analog_input_thread (void const *args) {
jasonberry 0:9c8b3fc1ada3 144
jasonberry 0:9c8b3fc1ada3 145 //if (sensor.open()) {
jasonberry 0:9c8b3fc1ada3 146
jasonberry 0:9c8b3fc1ada3 147 // printf("Device detected!\n");
jasonberry 0:9c8b3fc1ada3 148 while (true) {
jasonberry 0:9c8b3fc1ada3 149 can_message_t *message = can_write_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 150 message->id = BASE_ADDRESS + 1;
jasonberry 0:9c8b3fc1ada3 151 message->data[0] = sensor.read();
jasonberry 0:9c8b3fc1ada3 152 can_write_queue.put(message);
jasonberry 0:9c8b3fc1ada3 153
jasonberry 0:9c8b3fc1ada3 154 Thread::wait(500);
jasonberry 0:9c8b3fc1ada3 155 }
jasonberry 0:9c8b3fc1ada3 156 //else{
jasonberry 0:9c8b3fc1ada3 157
jasonberry 0:9c8b3fc1ada3 158 // printf("Device faulty!\n");
jasonberry 0:9c8b3fc1ada3 159
jasonberry 0:9c8b3fc1ada3 160 //}
jasonberry 0:9c8b3fc1ada3 161 }
jasonberry 0:9c8b3fc1ada3 162
jasonberry 0:9c8b3fc1ada3 163 //STEP 10///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 164 // Can write thread
jasonberry 0:9c8b3fc1ada3 165 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 166 void can_write_thread(void const *args) {
jasonberry 0:9c8b3fc1ada3 167
jasonberry 0:9c8b3fc1ada3 168 while (true) {
jasonberry 0:9c8b3fc1ada3 169 osEvent evt = can_write_queue.get();
jasonberry 0:9c8b3fc1ada3 170 if (evt.status == osEventMessage) {
jasonberry 0:9c8b3fc1ada3 171 can_message_t *message = (can_message_t*)evt.value.p;
jasonberry 0:9c8b3fc1ada3 172
jasonberry 0:9c8b3fc1ada3 173 //send canbus message
jasonberry 0:9c8b3fc1ada3 174 //can1.write(CANMessage(message->id, message->data, 8));
jasonberry 0:9c8b3fc1ada3 175 can1.write(CANMessage(message->id,message->data, 8));
jasonberry 0:9c8b3fc1ada3 176 can_write_mpool.free(message);
jasonberry 0:9c8b3fc1ada3 177 }
jasonberry 0:9c8b3fc1ada3 178
jasonberry 0:9c8b3fc1ada3 179 }
jasonberry 0:9c8b3fc1ada3 180
jasonberry 0:9c8b3fc1ada3 181 }
jasonberry 0:9c8b3fc1ada3 182
jasonberry 0:9c8b3fc1ada3 183
jasonberry 0:9c8b3fc1ada3 184
jasonberry 0:9c8b3fc1ada3 185 //STEP 11///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 186 //Can read thread
jasonberry 0:9c8b3fc1ada3 187 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 188 void can_read_thread (void const *args) {
jasonberry 0:9c8b3fc1ada3 189
jasonberry 0:9c8b3fc1ada3 190 while (true) {
jasonberry 0:9c8b3fc1ada3 191 printf("loop()\n");
jasonberry 0:9c8b3fc1ada3 192 if(can1.read(msg))
jasonberry 0:9c8b3fc1ada3 193 {
jasonberry 0:9c8b3fc1ada3 194
jasonberry 0:9c8b3fc1ada3 195 if(msg.id == BASE_ADDRESS + 5) // Then its an analog out message
jasonberry 0:9c8b3fc1ada3 196 {
jasonberry 0:9c8b3fc1ada3 197 //send to analog output ipc
jasonberry 0:9c8b3fc1ada3 198 can_message_t *message = analog_output_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 199 message->id = msg.id;
jasonberry 0:9c8b3fc1ada3 200 message->data[0] = msg.data[0];
jasonberry 0:9c8b3fc1ada3 201 analog_output_queue.put(message);
jasonberry 0:9c8b3fc1ada3 202
jasonberry 0:9c8b3fc1ada3 203 Thread::wait(500);
jasonberry 0:9c8b3fc1ada3 204 }
jasonberry 0:9c8b3fc1ada3 205
jasonberry 0:9c8b3fc1ada3 206
jasonberry 0:9c8b3fc1ada3 207 else if(msg.id == BASE_ADDRESS + 6) //then its an do message
jasonberry 0:9c8b3fc1ada3 208 {
jasonberry 0:9c8b3fc1ada3 209 //send to digital output ipc
jasonberry 0:9c8b3fc1ada3 210 can_message_t *message = digital_output_mpool.alloc();
jasonberry 0:9c8b3fc1ada3 211
jasonberry 0:9c8b3fc1ada3 212 message->id = msg.id;
jasonberry 0:9c8b3fc1ada3 213 message->data[0] = msg.data[0];
jasonberry 0:9c8b3fc1ada3 214
jasonberry 0:9c8b3fc1ada3 215 digital_output_queue.put(message);
jasonberry 0:9c8b3fc1ada3 216 Thread::wait(500);
jasonberry 0:9c8b3fc1ada3 217
jasonberry 0:9c8b3fc1ada3 218 }
jasonberry 0:9c8b3fc1ada3 219
jasonberry 0:9c8b3fc1ada3 220 // else {
jasonberry 0:9c8b3fc1ada3 221
jasonberry 0:9c8b3fc1ada3 222 //handler for other messages
jasonberry 0:9c8b3fc1ada3 223
jasonberry 0:9c8b3fc1ada3 224 // }
jasonberry 0:9c8b3fc1ada3 225
jasonberry 0:9c8b3fc1ada3 226 Thread::wait(100);
jasonberry 0:9c8b3fc1ada3 227
jasonberry 0:9c8b3fc1ada3 228 }//end of if can.read
jasonberry 0:9c8b3fc1ada3 229
jasonberry 0:9c8b3fc1ada3 230 }//end of while(1)
jasonberry 0:9c8b3fc1ada3 231
jasonberry 0:9c8b3fc1ada3 232 } //end of thread
jasonberry 0:9c8b3fc1ada3 233
jasonberry 0:9c8b3fc1ada3 234
jasonberry 0:9c8b3fc1ada3 235
jasonberry 0:9c8b3fc1ada3 236
jasonberry 0:9c8b3fc1ada3 237
jasonberry 0:9c8b3fc1ada3 238
jasonberry 0:9c8b3fc1ada3 239
jasonberry 0:9c8b3fc1ada3 240 //STEP 12///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 241 // Analog_ouptut_thread
jasonberry 0:9c8b3fc1ada3 242 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 243 void Analog_ouptut_thread(void const *args) {
jasonberry 0:9c8b3fc1ada3 244
jasonberry 0:9c8b3fc1ada3 245 while (true) {
jasonberry 0:9c8b3fc1ada3 246
jasonberry 0:9c8b3fc1ada3 247 osEvent evt = analog_output_queue.get();
jasonberry 0:9c8b3fc1ada3 248
jasonberry 0:9c8b3fc1ada3 249
jasonberry 0:9c8b3fc1ada3 250 if (evt.status == osEventMessage) {
jasonberry 0:9c8b3fc1ada3 251 can_message_t *message = (can_message_t*)evt.value.p;
jasonberry 0:9c8b3fc1ada3 252
jasonberry 0:9c8b3fc1ada3 253
jasonberry 0:9c8b3fc1ada3 254 //drive the speaker based on can message
jasonberry 0:9c8b3fc1ada3 255 spkr.period(1/(2000 + (message->data[0]* 50))); //generate a tone based on data[0] value range from 2000 + 0*50 to 2000 + 255*50
jasonberry 0:9c8b3fc1ada3 256 spkr=0.5;
jasonberry 0:9c8b3fc1ada3 257
jasonberry 0:9c8b3fc1ada3 258 analog_output_mpool.free(message);
jasonberry 0:9c8b3fc1ada3 259 }
jasonberry 0:9c8b3fc1ada3 260 }
jasonberry 0:9c8b3fc1ada3 261
jasonberry 0:9c8b3fc1ada3 262 }
jasonberry 0:9c8b3fc1ada3 263
jasonberry 0:9c8b3fc1ada3 264
jasonberry 0:9c8b3fc1ada3 265
jasonberry 0:9c8b3fc1ada3 266 //STEP 13///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 267 // Digital_ouptut_thread
jasonberry 0:9c8b3fc1ada3 268 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 269 void Digital_output_thread(void const *args) {
jasonberry 0:9c8b3fc1ada3 270
jasonberry 0:9c8b3fc1ada3 271 while (true) {
jasonberry 0:9c8b3fc1ada3 272
jasonberry 0:9c8b3fc1ada3 273 osEvent evt = digital_output_queue.get();
jasonberry 0:9c8b3fc1ada3 274
jasonberry 0:9c8b3fc1ada3 275
jasonberry 0:9c8b3fc1ada3 276 if (evt.status == osEventMessage) {
jasonberry 0:9c8b3fc1ada3 277 can_message_t *message = (can_message_t*)evt.value.p;
jasonberry 0:9c8b3fc1ada3 278
jasonberry 0:9c8b3fc1ada3 279 //drive the digital ouptut based on can message
jasonberry 0:9c8b3fc1ada3 280
jasonberry 0:9c8b3fc1ada3 281 if (message->data[0] == 1 ) {
jasonberry 0:9c8b3fc1ada3 282
jasonberry 0:9c8b3fc1ada3 283 led1 = 1;}
jasonberry 0:9c8b3fc1ada3 284
jasonberry 0:9c8b3fc1ada3 285 else {
jasonberry 0:9c8b3fc1ada3 286
jasonberry 0:9c8b3fc1ada3 287 led1 = 0;}
jasonberry 0:9c8b3fc1ada3 288
jasonberry 0:9c8b3fc1ada3 289
jasonberry 0:9c8b3fc1ada3 290
jasonberry 0:9c8b3fc1ada3 291 digital_output_mpool.free(message);
jasonberry 0:9c8b3fc1ada3 292
jasonberry 0:9c8b3fc1ada3 293 } //end of if statement
jasonberry 0:9c8b3fc1ada3 294
jasonberry 0:9c8b3fc1ada3 295 }//end of while loop
jasonberry 0:9c8b3fc1ada3 296
jasonberry 0:9c8b3fc1ada3 297 }
jasonberry 0:9c8b3fc1ada3 298
jasonberry 0:9c8b3fc1ada3 299
jasonberry 0:9c8b3fc1ada3 300
jasonberry 0:9c8b3fc1ada3 301 //STEP 13///////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 302 // START THREADS
jasonberry 0:9c8b3fc1ada3 303 //////////////////////////////////////////////////////
jasonberry 0:9c8b3fc1ada3 304 int main() {
jasonberry 0:9c8b3fc1ada3 305 Thread thread1(Digital_output_thread);
jasonberry 0:9c8b3fc1ada3 306
jasonberry 0:9c8b3fc1ada3 307 Thread thread2(Analog_ouptut_thread);
jasonberry 0:9c8b3fc1ada3 308
jasonberry 0:9c8b3fc1ada3 309 Thread thread3(can_read_thread);
jasonberry 0:9c8b3fc1ada3 310
jasonberry 0:9c8b3fc1ada3 311 Thread thread4(can_write_thread);
jasonberry 0:9c8b3fc1ada3 312
jasonberry 0:9c8b3fc1ada3 313 Thread thread5(analog_input_thread );
jasonberry 0:9c8b3fc1ada3 314
jasonberry 0:9c8b3fc1ada3 315 Thread thread6(digital_input_thread);
jasonberry 0:9c8b3fc1ada3 316
jasonberry 0:9c8b3fc1ada3 317
jasonberry 0:9c8b3fc1ada3 318 while(true)
jasonberry 0:9c8b3fc1ada3 319
jasonberry 0:9c8b3fc1ada3 320 {
jasonberry 0:9c8b3fc1ada3 321
jasonberry 0:9c8b3fc1ada3 322 led2 !=led2;
jasonberry 0:9c8b3fc1ada3 323
jasonberry 0:9c8b3fc1ada3 324 Thread::wait(500);
jasonberry 0:9c8b3fc1ada3 325
jasonberry 0:9c8b3fc1ada3 326 }
jasonberry 0:9c8b3fc1ada3 327
jasonberry 0:9c8b3fc1ada3 328
jasonberry 0:9c8b3fc1ada3 329
jasonberry 0:9c8b3fc1ada3 330 }