Works

Dependencies:   BMP180 BNO055_fusion Fonts GPSISR HTU21D SDFileSystem UniGraphic mbed uGUI

Fork of Bicycl_Computer_NUCLEO-F411RE by Darren Ulrich

Revision:
15:b174ec6e3ca0
Parent:
14:4f0ebc5a4f00
Child:
16:e81bd672196b
--- a/main.cpp	Fri Mar 03 02:56:25 2017 +0000
+++ b/main.cpp	Wed Apr 12 20:30:06 2017 +0000
@@ -22,6 +22,10 @@
 #include "mbed.h"
 #include <math.h>
 #include "ILI9341.h"
+//#include "TFT.h"
+// Graphics GUI Library
+#include    "ugui.h"
+
 #include "SeeedStudioTFTv2.h"
 #include "BNO055.h"
 #include "HTU21D.h"
@@ -63,6 +67,12 @@
 #define PIN_TX_GPS      PA_11 //GPS Shield TX pin
 
 #define PI                  3.14159265358979f
+BNO055_ID_INF_TypeDef       bno055_id_inf;
+BNO055_EULER_TypeDef        euler_angles;
+BNO055_QUATERNION_TypeDef   quaternion;
+BNO055_LIN_ACC_TypeDef      linear_acc;
+BNO055_GRAVITY_TypeDef      gravity;
+BNO055_TEMPERATURE_TypeDef  chip_temp;
 
 #define DEVICE_NAME     "F411RE"
 
@@ -74,10 +84,22 @@
 // DigitalOut tsc_cs(PA_9, 1) ;
 // DigitalOut tft_cs(PB_6, 1) ;
 
+/** Height of display using default orientation */
+#define ILI9341_DEFAULT_HEIGHT   240
+
+/** Width of display using default orientation */
+#define ILI9341_DEFAULT_WIDTH    320
+
+/** Height of display using swapped X/Y orientation */
+#define ILI9341_SWITCH_XY_HEIGHT 320
+
+/** Width of display using swapped X/Y orientation */
+#define ILI9341_SWITCH_XY_WIDTH  240
+
 Serial pc(USBTX, USBRX);
 
 // Display
-ILI9341 TFT(SPI_8, 10000000, 
+ILI9341 TFT(SPI_8, 20000000, 
     PIN_MOSI_SPI1, PIN_MISO_SPI1,  PIN_SCLK_SPI1, 
     PIN_CS_SPI1, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
     
@@ -85,8 +107,7 @@
 TouchScreen TSC(PIN_XP, PIN_XM, PIN_YP, PIN_YM);
 
 // 3 Axis IMU
-BNO055 imu(I2C_SDA, I2C_SCL);  // New Library Adafruit
-
+BNO055 imu(I2C_SDA, I2C_SCL, PIN_RESET);  // Reset =D7, addr = BNO055_G_CHIP_ADDR, mode = MODE_NDOF <- as default
 // Humidity and Temperature
 HTU21D humid(I2C_SDA, I2C_SCL);
 
@@ -106,6 +127,11 @@
 
 void Draw_Compass_Rose(void);
 void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour);
+void ili9341_pset(UG_S16 ul_x,UG_S16 ul_y, UG_COLOR ul_color);
+void window_1_callback( UG_MESSAGE* msg );
+void window_2_callback( UG_MESSAGE* msg );
+void window_3_callback( UG_MESSAGE* msg );
+void cb1(void);
 
 const int centreX = 120;
 const int centreY = 150;
@@ -113,131 +139,252 @@
 float last_dx;
 float last_dy;
 
+int pageid = 1;
+bool pageinit = 0;
+#define PAGE1       1
+#define PAGE2       2
+#define PAGE3       3
+
+UG_GUI   gui;
+
+//Ticker to1;
+
 int main()
 {
+        //to1.attach(&cb1, 2.0);
     TFT.BusEnable(true) ;
     TFT.FastWindow(true) ;
     wait(0.1);
     TFT.cls();
     wait(0.1);
+        
+        UG_Init(&gui,ili9341_pset,ILI9341_DEFAULT_HEIGHT,ILI9341_DEFAULT_WIDTH);
+    
     Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
     const int refresh_Time = 2000; //refresh time in ms
     refresh_Timer.start();  //starts the clock on the timer
     //backlight = 0 ;
-    TFT.set_font((unsigned char*) Arial24x23i);
-    TFT.fillrect(2, 2, 237, 317, White);
-    TFT.foreground(Blue);
-    TFT.background(White);
     wait(0.1);
-       
-    Draw_Compass_Rose(); 
-        
+     
+  // Draw_Compass_Rose(); 
+    /* Window 1 Bike Computer */
+    #define MAX_OBJECTS 10
+    UG_WINDOW window_1 ; /* Window */
+    UG_BUTTON button_1; /* Button container */
+    UG_BUTTON button_2; /* Button container */
+    UG_OBJECT obj_buff_wnd_1 [MAX_OBJECTS] ; /* Object buffer */
+    UG_WindowCreate ( &window_1 , obj_buff_wnd_1 , MAX_OBJECTS, window_1_callback);
+    UG_WindowSetTitleTextFont ( &window_1 , &FONT_8X8 ) ;
+    UG_WindowSetTitleText ( &window_1 , "Bike Computer" ) ;
+    UG_WindowSetBackColor( &window_1 , C_GRAY ) ;
+    UG_ButtonCreate (&window_1, &button_1, BTN_ID_0, 10 , 230 , 115 , 290 );
+    UG_ButtonCreate (&window_1, &button_2, BTN_ID_1, 125 , 230 , 225 , 290 );
+    UG_ButtonSetBackColor (&window_1 ,BTN_ID_0 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_1 ,BTN_ID_0 , C_WHITE ) ;
+    UG_ButtonSetBackColor (&window_1 ,BTN_ID_1 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_1 ,BTN_ID_1 , C_WHITE ) ;
+    UG_ButtonSetFont (&window_1 , BTN_ID_0 , &FONT_8X8) ;
+    UG_ButtonSetFont (&window_1 , BTN_ID_1 , &FONT_8X8) ;
+    UG_ButtonSetText (&window_1 , BTN_ID_0 , "Prev" );
+    UG_ButtonSetText (&window_1 , BTN_ID_1 , "Next" );
+    
+    /* Window 2 e-Compass */
+    UG_WINDOW window_2 ; /* Window */
+    UG_BUTTON button_3; /* Button container */
+    UG_BUTTON button_4; /* Button container */
+    UG_OBJECT obj_buff_wnd_2 [MAX_OBJECTS] ; /* Object buffer */
+    UG_WindowCreate ( &window_2 , obj_buff_wnd_2 , MAX_OBJECTS, window_2_callback);
+    UG_WindowSetTitleTextFont ( &window_2 , &FONT_8X8 ) ;
+    UG_WindowSetTitleText ( &window_2 , "e-Compass" ) ;
+    UG_WindowSetBackColor( &window_2 , C_GRAY ) ;
+    UG_ButtonCreate (&window_2, &button_3, BTN_ID_2, 10 , 230 , 115 , 290 );
+    UG_ButtonCreate (&window_2, &button_4, BTN_ID_3, 125 , 230 , 225 , 290 );
+    UG_ButtonSetBackColor (&window_2 ,BTN_ID_2 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_2 ,BTN_ID_2 , C_WHITE ) ;
+    UG_ButtonSetBackColor (&window_2 ,BTN_ID_3 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_2 ,BTN_ID_3 , C_WHITE ) ;
+    UG_ButtonSetFont (&window_2 , BTN_ID_2 , &FONT_8X8) ;
+    UG_ButtonSetFont (&window_2 , BTN_ID_3 , &FONT_8X8) ;
+    UG_ButtonSetText (&window_2 , BTN_ID_2 , "Prev" );
+    UG_ButtonSetText (&window_2 , BTN_ID_3 , "Next" );
+
+    /* Window 3 GSP */
+    UG_WINDOW window_3 ; /* Window */
+    UG_BUTTON button_5; /* Button container */
+    UG_BUTTON button_6; /* Button container */
+    UG_OBJECT obj_buff_wnd_3 [MAX_OBJECTS] ; /* Object buffer */
+    UG_WindowCreate ( &window_3 , obj_buff_wnd_3 , MAX_OBJECTS, window_3_callback);
+    UG_WindowSetTitleTextFont ( &window_3 , &FONT_8X8 ) ;
+    UG_WindowSetTitleText ( &window_3 , "GPS Waypoints" ) ;
+    UG_WindowSetBackColor( &window_3 , C_GRAY ) ;
+    UG_ButtonCreate (&window_3, &button_5, BTN_ID_4, 10 , 230 , 115 , 290 );
+    UG_ButtonCreate (&window_3, &button_6, BTN_ID_5, 125 , 230 , 225 , 290 );
+    UG_ButtonSetBackColor (&window_3 ,BTN_ID_4 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_3 ,BTN_ID_4 , C_WHITE ) ;
+    UG_ButtonSetBackColor (&window_3 ,BTN_ID_5 , C_BLUE ) ;
+    UG_ButtonSetForeColor (&window_3 ,BTN_ID_5 , C_WHITE ) ;
+    UG_ButtonSetFont (&window_3 , BTN_ID_4 , &FONT_8X8) ;
+    UG_ButtonSetFont (&window_3 , BTN_ID_5 , &FONT_8X8) ;
+    UG_ButtonSetText (&window_3 , BTN_ID_4 , "Prev" );
+    UG_ButtonSetText (&window_3 , BTN_ID_5 , "Next" );
+    
+        /* Finally , show the window */
+    //UG_WindowShow(&window_1) ;
+    //UG_WindowHide(&window_2);
+    //UG_WindowHide(&window_3);
+    
+    //UG_Update();
+
     while (1) { 
+            
+            cb1();
              
-        TFT.set_font((unsigned char*) ArialR20x20);
-        //check if we recieved a new message from GPS, if so, attempt to parse it,
+                TFT.set_font((unsigned char*) ArialR20x20);
+                TFT.foreground(White);
+                TFT.background(UG_WindowGetBackColor(&window_1));
+                //check if we recieved a new message from GPS, if so, attempt to parse it,
         if (refresh_Timer.read_ms() >= refresh_Time) {
             refresh_Timer.reset();
-                        
-            if (bmp180.init() != 0) {
-                //pc.printf("Error communicating with BMP180\n");
-            } else {
-                //pc.printf("Initialized BMP180\n");
-                bmp180.startTemperature();
-                wait(0.1);     // Wait for conversion to complete
-                float temp;
-                if(bmp180.getTemperature(&temp) != 0) {
-                    //pc.printf("Error getting temperature\n");
-                }
-                //pc.printf("Temperature is : %f", temp);
-                TFT.locate(4, 26) ;
-                TFT.printf("%.1fF", ((temp* 9.0) / 5.0 + 32));
-            }
-            int ftemp = humid.sample_ftemp();
-            int humidity = humid.sample_humid();
-            TFT.locate(140, 26) ;
-            TFT.printf("%d%%RH",humidity);
-            //pc.printf("HTU21D Temp: %d",ftemp);
-            //pc.printf("HTU21D Humidity: %d",humidity);
-    
-            if (imu.check() == 0){
-                pc.printf("Bosch BNO055 is NOT avirable!!\r\n");
-            } else {
-                //printf("Cal %d", imu.read_calib_status());
-                imu.get_calib();
-                if (imu.cal.system > 0x0){
-                    TFT.foreground(White);
-                    TFT.locate(4, 260) ;
-                    TFT.printf("No Data");
-                    TFT.foreground(Blue);
-                    imu.get_angles();
-                    TFT.locate(4, 260) ;
-                    TFT.printf("%.1f",imu.euler.yaw);
-                    //pc.printf("H %.1f",euler_angles.h);
-                    //pc.printf("R %.1f",euler_angles.r);
-                    //pc.printf("P %.1f",euler_angles.p);
+            
+                        switch ( pageid )
+                            {
+                            case PAGE1: 
+                                {
+                                    if (!pageinit) {
+                                        UG_WindowHide(&window_2);
+                                        UG_WindowHide(&window_3);
+                                        UG_WindowShow(&window_1);
+                                        UG_Update();
+                                    }
+                                    pageinit = 1;
+                                    if (bmp180.init() != 0) {
+                                        //pc.printf("Error communicating with BMP180\n");
+                                } else {
+                                        //pc.printf("Initialized BMP180\n");
+                                        bmp180.startTemperature();
+                                        wait(0.1);     // Wait for conversion to complete
+                                        float temp;
+                                        if(bmp180.getTemperature(&temp) != 0) {
+                                            //pc.printf("Error getting temperature\n");
+                                        }
+                                        TFT.locate(10, 50) ;
+                                        TFT.printf("%.1fF", ((temp* 9.0) / 5.0 + 32));
+                                }
+                                int ftemp = humid.sample_ftemp();
+                                int humidity = humid.sample_humid();
+                                TFT.locate(10, 72) ;
+                                TFT.printf("%d%%RH",humidity);
+                                if (MyGPS.dataready()) {
+                                    MyGPS.read();
+                                    TFT.locate(10, 26) ;
+                                    TFT.foreground(UG_WindowGetBackColor(&window_1));
+                                    TFT.printf("No GPS Data");
+                                    TFT.foreground(White);
+                                    TFT.locate(10, 26) ;
+                                    TFT.printf("%d:%d:%d", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
+                                    TFT.locate(100, 26) ;
+                                    TFT.printf("%d-%d-%d", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
+                                    TFT.set_font((unsigned char*) SCProSB31x55);    
+                                    TFT.locate(130, 180) ;
+                                    TFT.printf("%.1f", MyGPS.buffer.speed);
+                                    TFT.locate(10, 180) ;
+                                    TFT.printf("%.1f", MyGPS.buffer.speed); //Cadence
+                                    TFT.set_font((unsigned char*) ArialR20x20);
+                                    //TFT.locate(10, 50) ;
+                                    //double waypoint = nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon)/double(1609.344);
+                                    //TFT.printf("%.1fMI From Perry", waypoint);
+                                }
+                                else {
+                                    TFT.locate(10, 26) ;
+                                    TFT.printf("No GPS Data");
+                                    //pc.printf("NMEA has no valid data");
+                                } 
+                                break;
+                            }
+                            case PAGE2: 
+                                {
+                                    if (!pageinit) {
+                                        UG_WindowHide(&window_1);
+                                        UG_WindowHide(&window_3);
+                                        UG_WindowShow(&window_2);
+                                        UG_Update();
+                                    }
+                                    pageinit = 1;
+                                    break;
+                                }
+                                case PAGE3: 
+                                {
+                                    if (!pageinit) {
+                                        UG_WindowHide(&window_1);
+                                        UG_WindowHide(&window_2);
+                                        UG_WindowShow(&window_3);
+                                        UG_Update();
+                                    }
+                                    pageinit = 1;
+                                    break;
+                                }   
+                        }   
+                }       
+                            /*
+                                TFT.locate(140, 260) ;
+                TFT.printf("%.1fft", MyGPS.buffer.altitude/0.3048);
+                                TFT.locate(4, 280) ;
+                                int degree;
+                                int minutes;
+                                int seconds;
+                                degree = (int)abs(MyGPS.buffer.longitude);
+                minutes = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree) * 60.0);
+                seconds = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
+                TFT.printf("%d %d' %d\" %c lon", degree, minutes,seconds, MyGPS.buffer.lonc);
+                                TFT.locate(4, 300) ;
+                                TFT.locate(4, 300) ;
+                degree = (int)abs(MyGPS.buffer.latitude);
+                minutes = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree) * 60.0);
+                seconds = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
+                TFT.printf("%d %d' %d\" %c lat", degree, minutes,seconds, MyGPS.buffer.latc);
+                                 
+                  
+        
+                                //pc.printf("Dist to Perry %.4f ", nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon));
+                                
+               
+                }   
+                
+                    
+                        if (imu.chip_ready() == 0){
+                            pc.printf("Bosch BNO055 is NOT avirable!!\r\n");
+                } else {
                             
-                } else {
-                    TFT.locate(4, 260) ;
-                    TFT.printf("No Data");
-                }
-            }
-
-             float angle = int(imu.euler.yaw); // * 180/PI); // Convert radians to degrees for more a more usual result
-             // For the screen -X = up and +X = down and -Y = left and +Y = right, so does not follow coordinate conventions
-             float dx = (0.7*radius * cos((angle-90)*PI/180)) + centreX;  // calculate X position for the screen coordinates - can be confusing!
-             float dy = (0.7*radius * sin((angle-90)*PI/180)) + centreY;  // calculate Y position for the screen coordinates - can be confusing!
+                        if (imu.read_calib_status() > 0x0){
+                                TFT.foreground(White);
+                                TFT.locate(4, 260) ;
+                                TFT.printf("No Data");
+                                TFT.foreground(Blue);
+                                imu.get_Euler_Angles(&euler_angles);
+                                TFT.locate(4, 260) ;
+                                TFT.printf("%.1f @ %.1f",euler_angles.h, euler_angles.p);
+                                //pc.printf("H %d",(int)euler_angles.h);
+                                //pc.printf("R %.1f",euler_angles.r);
+                                //pc.printf("P %.1f",euler_angles.p);
+                            
+                            } else {
+                                    TFT.locate(4, 260) ;
+                                    TFT.printf("No Data");
+                            }
+                        }
+                    
+                         float angle = euler_angles.h; // Convert radians to degrees for more a more usual result
+                         // For the screen -X = up and +X = down and -Y = left and +Y = right, so does not follow coordinate conventions
+                         float dx = (radius * cos((angle-90)*PI/180)) + centreX;  // calculate X position for the screen coordinates - can be confusing!
+             float dy = (radius * sin((angle-90)*PI/180)) + centreY;  // calculate Y position for the screen coordinates - can be confusing!
              arrow(last_dx,last_dy, centreX, centreY, 2,2,White);      // Erase last arrow      
              arrow(dx,dy, centreX, centreY, 2, 2,Blue);               // Draw arrow in new position
              last_dx = dx; 
              last_dy = dy;
-                        
-            if (MyGPS.dataready()) {
-                MyGPS.read();
-                //pc.printf("NMEA has valid data");
-                //pc.printf("Sats : %d \n", MyGPS.buffer.satellites);
-                //pc.printf("%d-%d-%d\n", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
-                //pc.printf("%d:%d:%d\n", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
-                
-                TFT.foreground(White);
-                TFT.locate(4, 2) ;
-                TFT.printf("No Data");
-                TFT.foreground(Blue);
-                TFT.locate(4, 2) ;
-                TFT.printf("%d-%d-%d", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
-                TFT.locate(4, 50) ;
-                double waypoint = nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon)/double(1609.344);
-                TFT.printf("%.1fMI From Perry", waypoint);
-                TFT.locate(140, 2) ;
-                TFT.printf("%d:%d:%d", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
-                TFT.locate(140, 260) ;
-                TFT.printf("%.1fft", MyGPS.buffer.altitude/0.3048);
-                TFT.locate(4, 280) ;
-                int degree;
-                int minutes;
-                int seconds;
-                degree = (int)abs(MyGPS.buffer.longitude);
-                minutes = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree) * 60.0);
-                seconds = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
-                TFT.printf("%d %d' %d\" %c lon", degree, minutes,seconds, MyGPS.buffer.lonc);
-                TFT.locate(4, 300) ;
-                degree = (int)abs(MyGPS.buffer.latitude);
-                minutes = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree) * 60.0);
-                seconds = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
-                TFT.printf("%d %d' %d\" %c lat", degree, minutes,seconds, MyGPS.buffer.latc);
-                TFT.set_font((unsigned char*) SCProSB31x55);     
-                TFT.locate(120, 200) ;
-                TFT.printf("%.1f", MyGPS.buffer.speed);    
-                                 
-                //pc.printf("Dist to Perry %.4f ", nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon));
-                                
-            }
-            else {
-                TFT.locate(4, 2) ;
-                TFT.printf("No Data");
-                //pc.printf("NMEA has no valid data");
-            }     
-        }            
+                                                
+            
+        }
+        */              
     }  
 }
 
@@ -294,4 +441,116 @@
   TFT.printf("E");
   TFT.locate((centreX-23),(centreY-3));
   TFT.printf("W");
-}
\ No newline at end of file
+}
+
+void ili9341_pset(UG_S16 ul_x,UG_S16 ul_y, UG_COLOR ul_color)
+{
+    TFT.pixel(ul_x, ul_y, ul_color);
+}
+
+void window_1_callback( UG_MESSAGE* msg )
+{
+    if ( msg->type == MSG_TYPE_OBJECT )
+    {
+        if ( msg->id == OBJ_TYPE_BUTTON )
+        {
+            switch ( msg->sub_id )
+            {
+                case BTN_ID_0:
+                {
+                    pageid--;
+                    if (pageid < 1) {
+                            pageid = 3;
+                    }   
+                    pageinit = 0;   
+                    break;
+                }
+                case BTN_ID_1:
+                {
+                    pageid++;
+                    if (pageid > 3) {
+                            pageid = 1;
+                    }   
+                    pageinit = 0;   
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void window_2_callback( UG_MESSAGE* msg )
+{
+    if ( msg->type == MSG_TYPE_OBJECT )
+    {
+        if ( msg->id == OBJ_TYPE_BUTTON )
+        {
+            switch ( msg->sub_id )
+            {
+                case BTN_ID_2:
+                {
+                    pageid--;
+                    if (pageid < 1) {
+                            pageid = 3;
+                    }   
+                    pageinit = 0;       
+                    break;
+                }
+                case BTN_ID_3:
+                {
+                    pageid++;
+                    if (pageid > 3) {
+                            pageid = 1;
+                    }
+                    pageinit = 0;   
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void window_3_callback( UG_MESSAGE* msg )
+{
+    if ( msg->type == MSG_TYPE_OBJECT )
+    {
+        if ( msg->id == OBJ_TYPE_BUTTON )
+        {
+            switch ( msg->sub_id )
+            {
+                case BTN_ID_4:
+                {
+                    pageid--;
+                    if (pageid < 1) {
+                            pageid = 3;
+                    }   
+                    pageinit = 0;       
+                    break;
+                }
+                case BTN_ID_5:
+                {
+                    pageid++;
+                    if (pageid > 3) {
+                            pageid = 1;
+                    }
+                    pageinit = 0;   
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void cb1(void) { 
+    point p;
+    TSC.getTouch(p);
+        if (p.z > __PRESURE)
+        {
+            UG_TouchUpdate ( p.x, p.y, TOUCH_STATE_PRESSED ) ;
+        }
+        else
+        {
+            UG_TouchUpdate (-1, -1, TOUCH_STATE_RELEASED ) ;
+        }
+    UG_Update();
+}