Lab 2.5

Dependencies:   mbed mbed-rtos C12832_lcd LCD_fonts

main.cpp

Committer:
ciaranom
Date:
2020-07-31
Revision:
4:682b2fc13702
Parent:
3:3ec443c0842a

File content as of revision 4:682b2fc13702:

// example to test the mbed Lab Board lcd lib with the mbed rtos
// Pot1 change the contrast
// Pot2 change the speed of the sin wave

#include "mbed.h"
#include "rtos.h"
#include "Small_6.h"
#include "Small_7.h"
#include "Arial_9.h"
#include "stdio.h"
#include "C12832_lcd.h"


BusIn joy(p15,p12,p13,p16);
DigitalIn fire(p14);
 
BusOut leds(LED1,LED2,LED3,LED4);


// LCD object
C12832_LCD LCD;

AnalogIn Pot1(p19);
AnalogIn Pot2(p20);


// mutex to make the lcd lib thread save
Mutex lcd_mutex;

// Thread 1
// print counter into first line and wait for 1 s
void thread1(void const *args)
{
    int i;
    while(true) {       // thread loop
        lcd_mutex.lock();
        LCD.locate(0,0);
        LCD.set_font((unsigned char*) Small_6);
        LCD.printf("Thread1 count: %d",i);
        lcd_mutex.unlock();
        i++;
        Thread::wait(1000);
    }
}

// Thread 2
// print counter into third line and wait for 0,5s
void thread2(void const *args)
{
    int k;
    while(true) {       // thread loop
        lcd_mutex.lock();
        LCD.locate(0,20);
        LCD.set_font((unsigned char*) Arial_9);
        LCD.printf("Thread 2 count : %d",k);
        lcd_mutex.unlock();
        k++;
        Thread::wait(500); // wait 0.5s
    }
}

// Thread 3
// print a sin function in a small window
// the value of pot 1 change the speed of the sinwave
void thread3(void const *args)
{
    int i,k,v;
    double s,a;
    k = 1;
    lcd_mutex.lock();
    LCD.rect(89,0,127,17,1);
    lcd_mutex.unlock();
    while(true) {       // thread loop
        v = Pot1.read_u16();  // get value of pot 1
        lcd_mutex.lock();
        for (i=90; i<127; i++) {           
            s = 8 * sin((long double)(i+k) /5);   // pixel to print  
            a = 8 * sin((long double)(i+k-1) /5); // old pixel to erase
            LCD.pixel(i,9 + (int)a ,0);           // erase pixel  
            LCD.pixel(i,9 + (int)s ,1);           // print pixel  
        }
        LCD.copy_to_lcd();  // LCD.pixel do not update the lcd 
        lcd_mutex.unlock();
        k++;
        Thread::wait(v/100);   // value of pot1 / 100
    }
}

// Thread 4
// input pot 2 and change the contrast of lcd
void thread4(void const *args)
{
    int k;
    while(true) {         // thread loop
    k = Pot2.read_u16();  // get the value of poti 2
    k = k >> 10;          // we need only 6 bit for contrast
     lcd_mutex.lock();
    LCD.set_contrast(k);
     lcd_mutex.unlock();
    Thread::wait(500);    // wait 0.5s
}
}





// print the actual contrast 
int main()
{
    int j;
    LCD.cls();
  
    Thread t1(thread1); //start thread1
    Thread t2(thread2); //start thread2
    Thread t3(thread3); //start thread3
    Thread t4(thread4); //start thread4

    while(true) {       // main is the next thread
        lcd_mutex.lock();
        LCD.locate(0,9);
        LCD.set_font((unsigned char*) Small_7);
        j = LCD.get_contrast();    // read the actual contrast
        LCD.printf("contrast : %d",j);
        lcd_mutex.unlock();
        Thread::wait(500);   // wait 0.5s
        if (fire) {  //New code imported to control LEDs with joystick
            leds=0xf;
        } else {
            leds=joy;
        }
        wait(0.1);
    }

}