Alan Ffrench / Mbed 2 deprecated Experiment_2_5

Dependencies:   mbed

Committer:
alanffrench
Date:
Wed Jul 29 18:51:38 2020 +0000
Revision:
0:52468b19aa21
Threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alanffrench 0:52468b19aa21 1 // example to test the mbed Lab Board lcd lib with the mbed rtos
alanffrench 0:52468b19aa21 2 // Pot1 change the contrast
alanffrench 0:52468b19aa21 3 // Pot2 change the speed of the sin wave
alanffrench 0:52468b19aa21 4
alanffrench 0:52468b19aa21 5 #include "mbed.h"
alanffrench 0:52468b19aa21 6 #include "rtos.h"
alanffrench 0:52468b19aa21 7 #include "Small_6.h"
alanffrench 0:52468b19aa21 8 #include "Small_7.h"
alanffrench 0:52468b19aa21 9 #include "Arial_9.h"
alanffrench 0:52468b19aa21 10 #include "stdio.h"
alanffrench 0:52468b19aa21 11 #include "C12832_lcd.h"
alanffrench 0:52468b19aa21 12
alanffrench 0:52468b19aa21 13 // LCD object
alanffrench 0:52468b19aa21 14 C12832_LCD LCD;
alanffrench 0:52468b19aa21 15
alanffrench 0:52468b19aa21 16 AnalogIn Pot1(p19);
alanffrench 0:52468b19aa21 17 AnalogIn Pot2(p20);
alanffrench 0:52468b19aa21 18 BusIn joy(p15,p12,p13,p16);
alanffrench 0:52468b19aa21 19 DigitalIn fire(p14);
alanffrench 0:52468b19aa21 20
alanffrench 0:52468b19aa21 21 BusOut leds(LED1,LED2,LED3,LED4);
alanffrench 0:52468b19aa21 22
alanffrench 0:52468b19aa21 23
alanffrench 0:52468b19aa21 24 // mutex to make the lcd lib thread save
alanffrench 0:52468b19aa21 25 Mutex lcd_mutex;
alanffrench 0:52468b19aa21 26
alanffrench 0:52468b19aa21 27 // Thread 1
alanffrench 0:52468b19aa21 28 // print counter into first line and wait for 1 s
alanffrench 0:52468b19aa21 29 void thread1(void const *args)
alanffrench 0:52468b19aa21 30 {
alanffrench 0:52468b19aa21 31 int i;
alanffrench 0:52468b19aa21 32 i = 0;
alanffrench 0:52468b19aa21 33 while(true) { // thread loop
alanffrench 0:52468b19aa21 34 lcd_mutex.lock();
alanffrench 0:52468b19aa21 35 LCD.locate(0,0);
alanffrench 0:52468b19aa21 36 LCD.set_font((unsigned char*) Small_6);
alanffrench 0:52468b19aa21 37 LCD.printf("Thread1 count: %d",i);
alanffrench 0:52468b19aa21 38 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 39 i++;
alanffrench 0:52468b19aa21 40 Thread::wait(1000);
alanffrench 0:52468b19aa21 41 }
alanffrench 0:52468b19aa21 42 }
alanffrench 0:52468b19aa21 43
alanffrench 0:52468b19aa21 44 // Thread 2
alanffrench 0:52468b19aa21 45 // print counter into third line and wait for 0,5s
alanffrench 0:52468b19aa21 46 void thread2(void const *args)
alanffrench 0:52468b19aa21 47 {
alanffrench 0:52468b19aa21 48 int k;
alanffrench 0:52468b19aa21 49 k = 0;
alanffrench 0:52468b19aa21 50 while(true) { // thread loop
alanffrench 0:52468b19aa21 51 lcd_mutex.lock();
alanffrench 0:52468b19aa21 52 LCD.locate(0,20);
alanffrench 0:52468b19aa21 53 LCD.set_font((unsigned char*) Arial_9);
alanffrench 0:52468b19aa21 54 LCD.printf("Thread 2 count : %d",k);
alanffrench 0:52468b19aa21 55 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 56 k++;
alanffrench 0:52468b19aa21 57 Thread::wait(500); // wait 0.5s
alanffrench 0:52468b19aa21 58 }
alanffrench 0:52468b19aa21 59 }
alanffrench 0:52468b19aa21 60
alanffrench 0:52468b19aa21 61 // Thread 3
alanffrench 0:52468b19aa21 62 // print a sin function in a small window
alanffrench 0:52468b19aa21 63 // the value of pot 1 change the speed of the sinwave
alanffrench 0:52468b19aa21 64 void thread3(void const *args)
alanffrench 0:52468b19aa21 65 {
alanffrench 0:52468b19aa21 66 int i,k,v;
alanffrench 0:52468b19aa21 67 double s,a;
alanffrench 0:52468b19aa21 68 k = 1;
alanffrench 0:52468b19aa21 69 lcd_mutex.lock();
alanffrench 0:52468b19aa21 70 LCD.rect(89,0,127,17,1);
alanffrench 0:52468b19aa21 71 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 72 while(true) { // thread loop
alanffrench 0:52468b19aa21 73 v = Pot1.read_u16(); // get value of pot 1
alanffrench 0:52468b19aa21 74 lcd_mutex.lock();
alanffrench 0:52468b19aa21 75 for (i=90; i<127; i++) {
alanffrench 0:52468b19aa21 76 s = 8 * sin((long double)(i+k) /5); // pixel to print
alanffrench 0:52468b19aa21 77 a = 8 * sin((long double)(i+k-1) /5); // old pixel to erase
alanffrench 0:52468b19aa21 78 LCD.pixel(i,9 + (int)a ,0); // erase pixel
alanffrench 0:52468b19aa21 79 LCD.pixel(i,9 + (int)s ,1); // print pixel
alanffrench 0:52468b19aa21 80 }
alanffrench 0:52468b19aa21 81 LCD.copy_to_lcd(); // LCD.pixel do not update the lcd
alanffrench 0:52468b19aa21 82 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 83 k++;
alanffrench 0:52468b19aa21 84 Thread::wait(v/100); // value of pot1 / 100
alanffrench 0:52468b19aa21 85 }
alanffrench 0:52468b19aa21 86 }
alanffrench 0:52468b19aa21 87
alanffrench 0:52468b19aa21 88 // Thread 4
alanffrench 0:52468b19aa21 89 // input pot 2 and change the contrast of lcd
alanffrench 0:52468b19aa21 90 void thread4(void const *args)
alanffrench 0:52468b19aa21 91 {
alanffrench 0:52468b19aa21 92 int k;
alanffrench 0:52468b19aa21 93 while(true) { // thread loop
alanffrench 0:52468b19aa21 94 k = Pot2.read_u16(); // get the value of poti 2
alanffrench 0:52468b19aa21 95 k = k >> 10; // we need only 6 bit for contrast
alanffrench 0:52468b19aa21 96 lcd_mutex.lock();
alanffrench 0:52468b19aa21 97 LCD.set_contrast(k);
alanffrench 0:52468b19aa21 98 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 99 Thread::wait(500); // wait 0.5s
alanffrench 0:52468b19aa21 100 }
alanffrench 0:52468b19aa21 101 }
alanffrench 0:52468b19aa21 102 void thread5(void const *args)
alanffrench 0:52468b19aa21 103 {
alanffrench 0:52468b19aa21 104 while(1) {
alanffrench 0:52468b19aa21 105 if (fire) {
alanffrench 0:52468b19aa21 106 leds=0xf;
alanffrench 0:52468b19aa21 107 } else {
alanffrench 0:52468b19aa21 108 leds=joy;
alanffrench 0:52468b19aa21 109 }
alanffrench 0:52468b19aa21 110 wait(0.1);
alanffrench 0:52468b19aa21 111 }
alanffrench 0:52468b19aa21 112 }
alanffrench 0:52468b19aa21 113
alanffrench 0:52468b19aa21 114 // print the actual contrast
alanffrench 0:52468b19aa21 115 int main()
alanffrench 0:52468b19aa21 116 {
alanffrench 0:52468b19aa21 117 int j;
alanffrench 0:52468b19aa21 118 LCD.cls();
alanffrench 0:52468b19aa21 119
alanffrench 0:52468b19aa21 120 Thread t1(thread1); //start thread1
alanffrench 0:52468b19aa21 121 Thread t2(thread2); //start thread2
alanffrench 0:52468b19aa21 122 Thread t3(thread3); //start thread3
alanffrench 0:52468b19aa21 123 Thread t4(thread4); //start thread4
alanffrench 0:52468b19aa21 124 Thread t5(thread5); //start thread4
alanffrench 0:52468b19aa21 125
alanffrench 0:52468b19aa21 126 while(true) { // main is the next thread
alanffrench 0:52468b19aa21 127 lcd_mutex.lock();
alanffrench 0:52468b19aa21 128 LCD.locate(0,9);
alanffrench 0:52468b19aa21 129 LCD.set_font((unsigned char*) Small_7);
alanffrench 0:52468b19aa21 130 j = LCD.get_contrast(); // read the actual contrast
alanffrench 0:52468b19aa21 131 LCD.printf("contrast : %d",j);
alanffrench 0:52468b19aa21 132 lcd_mutex.unlock();
alanffrench 0:52468b19aa21 133 Thread::wait(500); // wait 0.5s
alanffrench 0:52468b19aa21 134 }
alanffrench 0:52468b19aa21 135
alanffrench 0:52468b19aa21 136 }