Thread

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed-rtos mbed

Fork of DISCO-F746NG_LCDTS_demo by ST

Revision:
2:5ca8733edc78
Parent:
0:9933f7db9a9b
--- a/main.cpp	Wed Oct 07 15:55:00 2015 +0000
+++ b/main.cpp	Thu Dec 22 05:57:00 2016 +0000
@@ -1,9 +1,134 @@
 #include "mbed.h"
 #include "TS_DISCO_F746NG.h"
 #include "LCD_DISCO_F746NG.h"
+#include "Thread.h"
+#include "rtos.h"
+
+
 
 LCD_DISCO_F746NG lcd;
 TS_DISCO_F746NG ts;
+Mutex stdio_mutex;
+uint8_t r=0,g=0,b=0;
+
+
+
+
+
+class DRAW            //クラス宣言
+{
+private:
+    uint32_t color;
+    uint16_t Xpos;
+    uint16_t Ypos;
+    uint16_t Rad;
+public:
+    void fillcircle(uint32_t col,uint16_t x,uint16_t y,uint16_t rad);
+};
+
+
+void DRAW::fillcircle(uint32_t col,uint16_t x,uint16_t y,uint16_t rad){
+    lcd.SetTextColor(col|0xFF000000);
+    lcd.FillCircle(x,y,rad);
+}
+
+
+DRAW draw;
+
+void lcd_r_thread(void const *args) {
+    while (true) {
+        stdio_mutex.lock();
+        draw.fillcircle(r*0x00010000,100,150,30);
+        stdio_mutex.unlock();
+        r++;
+        Thread::wait(20);
+    }
+}
+void lcd_g_thread(void const *args) {
+    while (true) {
+        stdio_mutex.lock();
+        draw.fillcircle(g*0x00000100,200,150,30);
+        stdio_mutex.unlock();
+        g++;
+        Thread::wait(40);
+    }
+}
+void lcd_b_thread(void const *args) {
+    while (true) {
+        stdio_mutex.lock();
+        draw.fillcircle(b,300,150,30);
+        stdio_mutex.unlock();
+        b++;
+        Thread::wait(60);
+    }
+}
+void RGBtext(void const *args) {
+    uint8_t text[30];
+    while (true) {
+        stdio_mutex.lock();
+        lcd.SetFont(&Font24);
+        lcd.SetTextColor(LCD_COLOR_WHITE);
+        sprintf((char*)text, "R:0x%x",r);
+        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+        sprintf((char*)text, "G:0x%x",g);
+        lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
+        sprintf((char*)text, "B:0x%x",b);
+        lcd.DisplayStringAt(0, LINE(2), (uint8_t *)&text, LEFT_MODE);
+        stdio_mutex.unlock();
+        Thread::wait(100);
+    }
+}
+void TPtext(void const *args) {
+    TS_StateTypeDef TS_State;
+    uint16_t x, y;
+    uint8_t text[30];
+    uint8_t status;
+    uint8_t idx;
+    uint8_t cleared = 0;
+    uint8_t prev_nb_touches = 0;
+    while (true) {
+        stdio_mutex.lock();
+        lcd.SetFont(&Font12);
+        lcd.SetTextColor(LCD_COLOR_WHITE);
+
+        ts.GetState(&TS_State);
+        if (TS_State.touchDetected) {
+            // Clear lines corresponding to old touches coordinates
+            if (TS_State.touchDetected < prev_nb_touches) {
+                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
+                    lcd.ClearStringLine(idx);
+                }
+            }
+            prev_nb_touches = TS_State.touchDetected;
+
+            cleared = 0;
+
+            sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
+            lcd.DisplayStringAt(150, LINE(0), (uint8_t *)&text, LEFT_MODE);
+
+            for (idx = 0; idx < TS_State.touchDetected; idx++) {
+                x = TS_State.touchX[idx];
+                y = TS_State.touchY[idx];
+                sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
+                lcd.DisplayStringAt(150, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
+            }
+
+            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
+        } else {
+            if (!cleared) {
+                lcd.Clear(LCD_COLOR_BLACK);
+                sprintf((char*)text, "Touches: 0");
+                lcd.DisplayStringAt(150, LINE(0), (uint8_t *)&text, LEFT_MODE);
+                cleared = 1;
+            }
+        }        
+        stdio_mutex.unlock();
+        Thread::wait(1);
+    }
+}
+
+
+
 
 int main()
 {
@@ -14,6 +139,12 @@
     uint8_t idx;
     uint8_t cleared = 0;
     uint8_t prev_nb_touches = 0;
+    
+//    RtosTimer lcd_r_timer(fillcircle, osTimerPeriodic, (void *)0);
+//    RtosTimer lcd_r_timer(fillcircle(r*0x00010000,100,150,30), osTimerPeriodic);
+
+
+    
 
     lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE);
     wait(1);
@@ -32,12 +163,57 @@
     }
 
     wait(1);
-    lcd.SetFont(&Font12);
-    lcd.SetBackColor(LCD_COLOR_BLUE);
+    lcd.SetFont(&Font24);
+    lcd.SetBackColor(LCD_COLOR_BLACK);
     lcd.SetTextColor(LCD_COLOR_WHITE);
+    
+//    thread.start(lcd, color_cng);
+//    Thread::wait(5000);
+//    running = false;
+//    thread.join();
 
+//    lcd_r_timer.start(100);
+    Thread thread1(lcd_r_thread);
+    Thread thread2(lcd_g_thread);
+    Thread thread3(lcd_b_thread);
+    Thread thread4(RGBtext);
+    Thread thread5(TPtext);
+    
     while(1) {
+        
+/*        
+        lcd.SetTextColor(r*0x00010000|0xFF000000);
+        lcd.FillCircle(100,150,100);
+        lcd.SetTextColor(g*0x00000100|0xFF000000);
+        lcd.FillCircle(200,150,100);
+        lcd.SetTextColor(b|0xFF000000);
+        lcd.FillCircle(300,150,100);
+*/
+//        draw.fillcircle(r*0x00010000,100,150,30);
+//        lcd.SetTextColor(r*0x00010000|0xFF000000);
+//        lcd.FillCircle(100,150,30);
+//        lcd.SetTextColor(g*0x00000100|0xFF000000);
+//        lcd.FillCircle(200,150,30);
+//        lcd.SetTextColor(b|0xFF000000);
+//        lcd.FillCircle(300,150,30);
+/*
+        lcd.SetFont(&Font24);
+        lcd.SetTextColor(LCD_COLOR_WHITE);
+        sprintf((char*)text, "R:0x%x",r);
+        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+        sprintf((char*)text, "G:0x%x",g);
+        lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE);
+        sprintf((char*)text, "B:0x%x",b);
+        lcd.DisplayStringAt(0, LINE(2), (uint8_t *)&text, LEFT_MODE);
+*/
+/*        lcd.SetFont(&Font12);
+//        lcd.SetBackColor(~col|0xFF000000);
+//        lcd.SetTextColor(col|0xFF000000);
 
+        
+        
+        
+        
         ts.GetState(&TS_State);
         if (TS_State.touchDetected) {
             // Clear lines corresponding to old touches coordinates
@@ -51,23 +227,25 @@
             cleared = 0;
 
             sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
-            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+            lcd.DisplayStringAt(150, LINE(0), (uint8_t *)&text, LEFT_MODE);
 
             for (idx = 0; idx < TS_State.touchDetected; idx++) {
                 x = TS_State.touchX[idx];
                 y = TS_State.touchY[idx];
                 sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
-                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
+                lcd.DisplayStringAt(150, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
             }
 
             lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
         } else {
             if (!cleared) {
-                lcd.Clear(LCD_COLOR_BLUE);
+                lcd.Clear(LCD_COLOR_BLACK);
                 sprintf((char*)text, "Touches: 0");
-                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+                lcd.DisplayStringAt(150, LINE(0), (uint8_t *)&text, LEFT_MODE);
                 cleared = 1;
             }
-        }
+        }*/
     }
 }
+
+