1) lcd must wait 2) assign high priority to lcd 3) check malloc return code 4) printf clean

Dependencies:   C12832_lcd LM75B mbed-rtos mbed

Fork of MHey_HW6_1 by M Hey

Committer:
avnisha
Date:
Wed Mar 12 20:51:16 2014 +0000
Revision:
1:52291f3a1895
Parent:
0:337ae54a3bdb
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael_embed1 0:337ae54a3bdb 1 #include "mbed.h"
Michael_embed1 0:337ae54a3bdb 2 #include "LM75B.h"
Michael_embed1 0:337ae54a3bdb 3 #include "C12832_lcd.h"
Michael_embed1 0:337ae54a3bdb 4 #include "rtos.h"
Michael_embed1 0:337ae54a3bdb 5
Michael_embed1 0:337ae54a3bdb 6 // instantiate hardware peripherals
Michael_embed1 0:337ae54a3bdb 7 LM75B tmpSns(p28,p27);
Michael_embed1 0:337ae54a3bdb 8 C12832_LCD lcd;
Michael_embed1 0:337ae54a3bdb 9 Serial pc(USBTX, USBRX); // tx, rx; used only if errors encountered
Michael_embed1 0:337ae54a3bdb 10
Michael_embed1 0:337ae54a3bdb 11 // mutex to make the lcd lib thread safe
Michael_embed1 0:337ae54a3bdb 12 Mutex lcd_mutex;
Michael_embed1 0:337ae54a3bdb 13
Michael_embed1 0:337ae54a3bdb 14 AnalogIn Pot1(p19);
Michael_embed1 0:337ae54a3bdb 15
Michael_embed1 0:337ae54a3bdb 16 typedef unsigned short potVal_t;
Michael_embed1 0:337ae54a3bdb 17 typedef float tempVal_t;
Michael_embed1 0:337ae54a3bdb 18
Michael_embed1 0:337ae54a3bdb 19 //Potentiometer values memory pool
Michael_embed1 0:337ae54a3bdb 20 MemoryPool<potVal_t, 16> potVal_mpool;
Michael_embed1 0:337ae54a3bdb 21 Queue<potVal_t, 16> potVal_queue;
Michael_embed1 0:337ae54a3bdb 22
Michael_embed1 0:337ae54a3bdb 23 //Temperature sensor values memory pool
Michael_embed1 0:337ae54a3bdb 24 MemoryPool<tempVal_t, 16> tempVal_mpool;
Michael_embed1 0:337ae54a3bdb 25 Queue<tempVal_t, 16> tempVal_queue;
Michael_embed1 0:337ae54a3bdb 26
Michael_embed1 0:337ae54a3bdb 27
Michael_embed1 0:337ae54a3bdb 28 // Thread potVal_send_thread()
Michael_embed1 0:337ae54a3bdb 29 // Pot1 sends value to LCD thread via IPC Queue
Michael_embed1 0:337ae54a3bdb 30 void potVal_send_thread(void const *args)
Michael_embed1 0:337ae54a3bdb 31 {
Michael_embed1 0:337ae54a3bdb 32 potVal_t *potValMessage;
Michael_embed1 0:337ae54a3bdb 33
Michael_embed1 0:337ae54a3bdb 34 while(true)
Michael_embed1 0:337ae54a3bdb 35 {
Michael_embed1 0:337ae54a3bdb 36 // potVal_t *potValMessage = potVal_mpool.alloc();
Michael_embed1 0:337ae54a3bdb 37 potValMessage = potVal_mpool.alloc();
avnisha 1:52291f3a1895 38 if (potValMessage == NULL) {
avnisha 1:52291f3a1895 39 pc.printf("****\n\r");
avnisha 1:52291f3a1895 40 continue;
avnisha 1:52291f3a1895 41 }
Michael_embed1 0:337ae54a3bdb 42 *potValMessage = Pot1.read_u16(); // get Pot1 value
avnisha 1:52291f3a1895 43 potVal_queue.put(potValMessage, 1000); // put it in the queue
avnisha 1:52291f3a1895 44 Thread::wait(2000);
avnisha 1:52291f3a1895 45 pc.printf("potVal_send_thread executing\n\r");
avnisha 1:52291f3a1895 46
avnisha 1:52291f3a1895 47
avnisha 1:52291f3a1895 48
Michael_embed1 0:337ae54a3bdb 49 }
Michael_embed1 0:337ae54a3bdb 50 }
Michael_embed1 0:337ae54a3bdb 51
Michael_embed1 0:337ae54a3bdb 52 // Thread tempVal_send_thread()
Michael_embed1 0:337ae54a3bdb 53 // Temperature sensor sends value to LCD thread via IPC Queue
Michael_embed1 0:337ae54a3bdb 54 void tempVal_send_thread(void const *args)
Michael_embed1 0:337ae54a3bdb 55 {
Michael_embed1 0:337ae54a3bdb 56 float *tempValMessage;
Michael_embed1 0:337ae54a3bdb 57 while(true)
Michael_embed1 0:337ae54a3bdb 58 {
Michael_embed1 0:337ae54a3bdb 59 // float *tempValMessage = tempVal_mpool.alloc();
Michael_embed1 0:337ae54a3bdb 60 tempValMessage = tempVal_mpool.alloc();
avnisha 1:52291f3a1895 61 if (tempValMessage == NULL){
avnisha 1:52291f3a1895 62 pc.printf("***\n\r");
avnisha 1:52291f3a1895 63 continue;
avnisha 1:52291f3a1895 64 }
Michael_embed1 0:337ae54a3bdb 65 *tempValMessage = ((tmpSns.read()*9/5)+32);// get Temp update
avnisha 1:52291f3a1895 66 tempVal_queue.put(tempValMessage, 1000); // put value in the queue
avnisha 1:52291f3a1895 67 Thread::wait(2000);
avnisha 1:52291f3a1895 68 pc.printf("tempVal_send_thread executing\n\r");
Michael_embed1 0:337ae54a3bdb 69 }
Michael_embed1 0:337ae54a3bdb 70 }
Michael_embed1 0:337ae54a3bdb 71
Michael_embed1 0:337ae54a3bdb 72 void lcd_thread(void const *args)
Michael_embed1 0:337ae54a3bdb 73 {
Michael_embed1 0:337ae54a3bdb 74 osEvent evt1;
Michael_embed1 0:337ae54a3bdb 75 osEvent evt2;
Michael_embed1 0:337ae54a3bdb 76
Michael_embed1 0:337ae54a3bdb 77 float *tempVal;
Michael_embed1 0:337ae54a3bdb 78 potVal_t *pot1Val;
Michael_embed1 0:337ae54a3bdb 79
Michael_embed1 0:337ae54a3bdb 80
Michael_embed1 0:337ae54a3bdb 81 while (true)
Michael_embed1 0:337ae54a3bdb 82 {
Michael_embed1 0:337ae54a3bdb 83 // osEvent evt1 = potVal_queue.get();
avnisha 1:52291f3a1895 84 evt1 = potVal_queue.get(1000); // note timeout
Michael_embed1 0:337ae54a3bdb 85 if (evt1.status == osEventMessage)
Michael_embed1 0:337ae54a3bdb 86 {
Michael_embed1 0:337ae54a3bdb 87 potVal_t *pot1Val = (potVal_t*)evt1.value.p;
Michael_embed1 0:337ae54a3bdb 88 pot1Val = (potVal_t*)evt1.value.p;
Michael_embed1 0:337ae54a3bdb 89 lcd_mutex.lock(); // exclude other thread access to lcd
Michael_embed1 0:337ae54a3bdb 90 lcd.locate(0,0);
avnisha 1:52291f3a1895 91 lcd.printf("Pot1=%d\n\r", *pot1Val);
Michael_embed1 0:337ae54a3bdb 92 lcd_mutex.unlock();
Michael_embed1 0:337ae54a3bdb 93 potVal_mpool.free(pot1Val);
Michael_embed1 0:337ae54a3bdb 94 }
Michael_embed1 0:337ae54a3bdb 95
avnisha 1:52291f3a1895 96 pc.printf("evt1 %d\n\r", evt1.status);
avnisha 1:52291f3a1895 97
Michael_embed1 0:337ae54a3bdb 98 // osEvent evt2 = tempVal_queue.get();
avnisha 1:52291f3a1895 99 evt2 = tempVal_queue.get(1000); /// note timeout
Michael_embed1 0:337ae54a3bdb 100 if (evt2.status == osEventMessage)
Michael_embed1 0:337ae54a3bdb 101 {
avnisha 1:52291f3a1895 102 // float *tempVal = (float*)evt2.value.p;
Michael_embed1 0:337ae54a3bdb 103 tempVal = (float*)evt2.value.p;
Michael_embed1 0:337ae54a3bdb 104 lcd_mutex.lock(); // exclude other thread access to lcd
avnisha 1:52291f3a1895 105 lcd.locate(0,2);
avnisha 1:52291f3a1895 106 lcd.printf("Temp=%3.1f\n\r", *tempVal);
Michael_embed1 0:337ae54a3bdb 107 lcd_mutex.unlock();
Michael_embed1 0:337ae54a3bdb 108 tempVal_mpool.free(tempVal);
Michael_embed1 0:337ae54a3bdb 109 }
avnisha 1:52291f3a1895 110 pc.printf("evt2 %d\n\r", evt2.status);
avnisha 1:52291f3a1895 111
avnisha 1:52291f3a1895 112 Thread::wait(500);
avnisha 1:52291f3a1895 113 pc.printf("LCD executing\n\r"); // note wait()
Michael_embed1 0:337ae54a3bdb 114
Michael_embed1 0:337ae54a3bdb 115 }
Michael_embed1 0:337ae54a3bdb 116 }
Michael_embed1 0:337ae54a3bdb 117
Michael_embed1 0:337ae54a3bdb 118 int main() {
avnisha 1:52291f3a1895 119
avnisha 1:52291f3a1895 120 osPriority pri;
avnisha 1:52291f3a1895 121
avnisha 1:52291f3a1895 122
avnisha 1:52291f3a1895 123
avnisha 1:52291f3a1895 124 pc.printf("main started...\n\r");
Michael_embed1 0:337ae54a3bdb 125 lcd.cls();
Michael_embed1 0:337ae54a3bdb 126 Thread thread1(potVal_send_thread);
Michael_embed1 0:337ae54a3bdb 127 pc.printf("\nthree threads started...");
Michael_embed1 0:337ae54a3bdb 128 Thread thread2(lcd_thread);
Michael_embed1 0:337ae54a3bdb 129 Thread thread3(tempVal_send_thread);
avnisha 1:52291f3a1895 130 pri = osPriorityHigh;
avnisha 1:52291f3a1895 131 thread2.set_priority(pri); // make sure lcd thread is receiving data and flushing IPC
avnisha 1:52291f3a1895 132 pc.printf("three threads started...\n\r");
Michael_embed1 0:337ae54a3bdb 133
Michael_embed1 0:337ae54a3bdb 134 while(true)
Michael_embed1 0:337ae54a3bdb 135 {
Michael_embed1 0:337ae54a3bdb 136 Thread::wait(1000);
avnisha 1:52291f3a1895 137 pc.printf("main thread executing\n\r");
Michael_embed1 0:337ae54a3bdb 138 }
Michael_embed1 0:337ae54a3bdb 139 }
Michael_embed1 0:337ae54a3bdb 140