Demo touching the perimeter of a circle

Dependencies:   RA8875

Files at this revision

API Documentation at this revision

Comitter:
WiredHome
Date:
Sun Apr 04 20:15:47 2021 +0000
Parent:
1:e4f92c21e329
Child:
3:d259be26795b
Commit message:
Leverage the fix in the RA8875 library.

Changed in this revision

RA8875.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/RA8875.lib	Sun Apr 04 17:17:02 2021 +0000
+++ b/RA8875.lib	Sun Apr 04 20:15:47 2021 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/WiredHome/code/RA8875/#c610b031388d
+http://mbed.org/users/WiredHome/code/RA8875/#08fc22dea762
--- a/main.cpp	Sun Apr 04 17:17:02 2021 +0000
+++ b/main.cpp	Sun Apr 04 20:15:47 2021 +0000
@@ -64,6 +64,95 @@
 const dim_t radius = 125;
 const dim_t touch_tolerance = 30;
 
+
+// 
+// Checkbox to turn on/off the touch-point
+//
+const rect_t check_tonoff = {400, 150, LCD_W-1, 182};     // Height based on double-size font
+const char * check_tonoff_msg = "[%c] Visible touchpoints";
+bool touchVisible = false;   // default hidden
+
+
+//
+// Radio buttons to select between pie pieces
+// and a dial-indent
+//
+const rect_t radio_pie = {400, 250, LCD_W-1, 282};
+const char * radio_pie_msg = "(%c) Pie-slice rendering";
+const rect_t radio_dial = {400, 300, LCD_W-1, 332};
+const char * radio_dial_msg = "(%c) Dial rendering";
+int renderOption = 0;   // pie-slice
+
+color_t edgeColor = BrightBlue;
+color_t fillColor = Black;
+
+void DrawCircle() {
+    // Draw a thickened circle
+    lcd.fillellipse(center.x, center.y, radius, radius, fillColor);
+    for (int r = 0; r <= 3; r++) {
+        lcd.ellipse(center.x, center.y, radius + r, radius + r, edgeColor);
+    }
+}
+
+void ShowUserControls() {
+    lcd.SetTextFontSize(2); // Bigger font; easier to touch
+    //
+    //      [X] Enable visible touch-points
+    //
+    lcd.foreground(White);
+    lcd.SetTextCursor(check_tonoff.p1);
+    lcd.printf(check_tonoff_msg, (touchVisible) ? 'X' : ' ');
+    lcd.rect(check_tonoff, Gray);
+    //
+    //      (*) Pie-slice rendering
+    //      ( ) Dial rendering
+    //
+    lcd.foreground(White);
+    lcd.SetTextCursor(radio_pie.p1);
+    lcd.printf(radio_pie_msg, (renderOption == 0) ? '*' : ' ');
+    lcd.rect(radio_pie, Gray);
+    lcd.foreground(White);
+    lcd.SetTextCursor(radio_dial.p1);
+    lcd.printf(radio_dial_msg, (renderOption == 1) ? '*' : ' ');
+    lcd.rect(radio_dial, Gray);
+    lcd.SetTextFontSize();
+}
+
+void DrawInitialScreen() {
+    lcd.cls();
+    lcd.foreground(White);          // Change to white
+    lcd.printf("RA8875 Touch Dial Example - Build " __DATE__ " " __TIME__ "\r\n");
+    lcd.printf("MBED v%d.%d.%d\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
+    ShowUserControls();
+    DrawCircle();
+}
+
+void TestToggleHit(point_t t) {
+    if (lcd.Intersect(check_tonoff, t)) {
+        touchVisible = !touchVisible;
+        DrawInitialScreen();
+    }
+}
+
+void TestRenderHit(point_t t) {
+    bool update = false;
+    if (lcd.Intersect(radio_pie, t)) {
+        renderOption = 0;
+        edgeColor = BrightBlue;
+        fillColor = Black;
+        update = true;
+    } else if (lcd.Intersect(radio_dial, t)) {
+        renderOption = 1;
+        edgeColor = BrightBlue;
+        fillColor = Gray;
+        update = true;
+    }
+    if (update) {
+        DrawInitialScreen();
+    }
+}
+
+
 #define PI 3.14159265359f
 
 //              ---------------
@@ -123,22 +212,24 @@
     lcd.init(LCD_W,LCD_H,LCD_C,BL_NORM);
     lcd.TouchPanelInit();
 
-    lcd.foreground(White);          // Change to white
-    lcd.printf("RA8875 Touch Dial Example - Build " __DATE__ " " __TIME__ "\r\n");
-    lcd.printf("MBED v%d.%d.%d\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
-
-    // Draw a thickened circle
-    for (int r = 0; r <= 3; r++) {
-        lcd.ellipse(center.x, center.y, radius + r, radius + r, BrightBlue);
-    }
+    DrawInitialScreen();
     
     while (1) {
         TouchCode_t touched;
-
+        static point_t lastTouch = {LCD_W, LCD_H};     // Init off-screen for easy detection
         touched = lcd.TouchPanelReadable();
         if (touched) {
             point_t Touch = lcd.TouchCoordinates();
 
+            if (touched == touch) {     // Only "on-touch"
+                TestToggleHit(Touch);
+                TestRenderHit(Touch);
+            }
+
+            lcd.foreground(White);
+            lcd.SetTextCursor(LCD_W - 8 * 9, 0);
+            lcd.printf("(%3d,%3d)", Touch.x,Touch.y);
+
             // If the touch is near the drawn circle (+/- 30 pixels),
             // compute the angle to the touch from the center of the circle
             if (abs(GetRadius(Touch, center) - radius) <= touch_tolerance) {
@@ -146,20 +237,37 @@
                 printf("Touch at (%4d,%4d) is %3d degrees from (%4d,%4d)\r\n", 
                     Touch.x, Touch.y, angle, center.x, center.y);
                 
-                // Fill the circle using 6° pie slices up to the angle of the touch
-                point_t lastP = ProjectPoint(center, 90, radius);  // seed it at angle 0
-                for (int a=6; a<=360; a+=6) {
-                    point_t p = ProjectPoint(center, 90 - a, radius);
-                    color_t fillColor = (a <= angle) ? Blue : Black;
-                    //if ((a <= angle)) {     // show the triangle coordinates (only the fill)
-                    //    printf("    (%3d,%3d), (%3d,%3d), (%3d,%3d)\r\n",
-                    //        lastP.x,lastP.y, p.x,p.y, center.x,center.y);
-                    //}
-                    lcd.filltriangle(center, p, lastP, fillColor);
-                    lastP = p;
+                point_t lastP;
+                switch (renderOption) {
+                    default:
+                    case 0:
+                        // Fill the circle using 6° pie slices up to the angle of the touch
+                        lastP = ProjectPoint(center, 90, radius);  // seed it at angle 0
+                        for (int a=6; a<=360; a+=6) {
+                            point_t p = ProjectPoint(center, 90 - a, radius);
+                            color_t fillColor = (a <= angle) ? Blue : Black;
+                            //if ((a <= angle)) {     // show the triangle coordinates (only the fill)
+                            //    printf("    (%3d,%3d), (%3d,%3d), (%3d,%3d)\r\n",
+                            //        lastP.x,lastP.y, p.x,p.y, center.x,center.y);
+                            //}
+                            lcd.filltriangle(center, p, lastP, fillColor);
+                            lastP = p;
+                        }
+                        lastTouch.x = LCD_W;    // reset to untouched for a change to the dial
+                        break;
+                    case 1:
+                        lastP = ProjectPoint(center, 90 - angle, 0.75 * radius);
+                        if (lastTouch.x != LCD_W) {
+                            lcd.fillellipse(lastTouch, radius/5,radius/5, fillColor);
+                        }
+                        lcd.fillellipse(lastP, radius/5,radius/5, Black);
+                        lastTouch = lastP;
+                        break;
                 }
                 // Show the touch point (note we're not erasing the old one)
-                lcd.fillellipse(Touch.x, Touch.y, 5, 5, BrightRed);
+                if (touchVisible) {
+                    lcd.fillellipse(Touch.x, Touch.y, 5, 5, BrightRed);
+                }
             }
         }
     }