Feby's Can

Dependencies:   C12832 LM75B

Committer:
feby
Date:
Wed Dec 09 17:26:40 2020 +0000
Revision:
0:84a4dc1cd81d
Febys_can

Who changed what in which revision?

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