case study 3 distributed network

Dependencies:   mbed C12832 LM75B rtos

Committer:
jasonberry
Date:
Fri Nov 19 16:22:43 2021 +0000
Revision:
1:a817566e1bb3
Parent:
0:9c8b3fc1ada3
masters case study 3 distributed network

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