New BASE release 4 Fork

Dependencies:   mbed QEI DmTftLibrary

Committer:
lex9296
Date:
Thu Feb 10 13:46:17 2022 +0000
Revision:
26:bfca0c471a87
Parent:
24:9f96fd6764d2
Last Commitment of LA0005 Fork

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mverdy 20:626b92b70bf7 1 /*
mverdy 20:626b92b70bf7 2 ______ _
mverdy 20:626b92b70bf7 3 / _____) _ | |
mverdy 20:626b92b70bf7 4 ( (____ _____ ____ _| |_ _____ ____| |__
mverdy 20:626b92b70bf7 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
mverdy 20:626b92b70bf7 6 _____) ) ____| | | || |_| ____( (___| | | |
mverdy 20:626b92b70bf7 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mverdy 20:626b92b70bf7 8 (C)2016 Semtech
mverdy 20:626b92b70bf7 9
mverdy 20:626b92b70bf7 10 Description: Display driver implementation
mverdy 20:626b92b70bf7 11
mverdy 20:626b92b70bf7 12 Maintainer: Gregory Cristian & Gilbert Menth
mverdy 20:626b92b70bf7 13 */
mverdy 20:626b92b70bf7 14
mverdy 20:626b92b70bf7 15 #include "mbed.h"
mverdy 20:626b92b70bf7 16 #include "Eeprom.h"
mverdy 20:626b92b70bf7 17 #include "DisplayDriver.h"
mverdy 20:626b92b70bf7 18 #include "DmTftIli9341.h"
mverdy 20:626b92b70bf7 19 #include "DmTouch.h"
mverdy 20:626b92b70bf7 20 #include "DmTouchCalibration.h"
mverdy 20:626b92b70bf7 21
mverdy 20:626b92b70bf7 22
mverdy 20:626b92b70bf7 23 //If DISPLAY_INVERT is defined as 1 then the display will be inverted from its native orientation
mverdy 20:626b92b70bf7 24 #define DISPLAY_INVERT 1
mverdy 20:626b92b70bf7 25
mverdy 20:626b92b70bf7 26 #define MAX_GO_STRING 30
mverdy 20:626b92b70bf7 27 #define SPACE_ASCII 0x20
mverdy 20:626b92b70bf7 28 #define FONT_WIDTH 8
mverdy 20:626b92b70bf7 29
mverdy 20:626b92b70bf7 30 // DmTftIli9341( PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk )
mverdy 20:626b92b70bf7 31 // DM_TFT28_105
mverdy 20:626b92b70bf7 32 DmTftIli9341 Tft( D10, D9, D11, D12, D13 );
mverdy 20:626b92b70bf7 33 DmTouch Touch( DmTouch::DM_TFT28_105, D9, D11, D12 );
mverdy 20:626b92b70bf7 34 DmTouchCalibration Calibration = DmTouchCalibration( &Tft, &Touch );
mverdy 20:626b92b70bf7 35
mverdy 20:626b92b70bf7 36 /*
mverdy 20:626b92b70bf7 37 * Used only to define pull-up on the CS lines
mverdy 20:626b92b70bf7 38 */
mverdy 20:626b92b70bf7 39 DigitalInOut CsTouch( D4, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 40 DigitalInOut CsDisplay( D10, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 41 DigitalInOut CsSDCard( D8, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 42 DigitalInOut CsFlash( D6, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 43
mverdy 20:626b92b70bf7 44 MenuSettings_t MenuSettings;
mverdy 20:626b92b70bf7 45 char GoTmpString[MAX_GO_STRING];
mverdy 20:626b92b70bf7 46
mverdy 20:626b92b70bf7 47
mverdy 20:626b92b70bf7 48 static int BmpWidth;
mverdy 20:626b92b70bf7 49 static int BmpHeight;
mverdy 20:626b92b70bf7 50 static uint8_t BmpImageoffset;
mverdy 20:626b92b70bf7 51
mverdy 20:626b92b70bf7 52 static bool BmpReadHeader( uint8_t *thisBmp );
mverdy 20:626b92b70bf7 53 static uint16_t Read16( uint8_t *src );
mverdy 20:626b92b70bf7 54 static uint32_t Read32( uint8_t *src );
mverdy 20:626b92b70bf7 55 static void DrawBmpFromFlash( uint8_t *thisBmp, int x, int y );
mverdy 20:626b92b70bf7 56
mverdy 20:626b92b70bf7 57
mverdy 20:626b92b70bf7 58 void DisplayDriverInit( void )
mverdy 20:626b92b70bf7 59 {
mverdy 20:626b92b70bf7 60 Tft.init( );
mverdy 20:626b92b70bf7 61 Touch.init( );
mverdy 20:626b92b70bf7 62
mverdy 20:626b92b70bf7 63 DisplayDriverCalibrate( );
mverdy 20:626b92b70bf7 64 Tft.clearScreen( );
mverdy 20:626b92b70bf7 65
mverdy 20:626b92b70bf7 66 for( uint8_t i = 0; i < MAX_GO_STRING; i++) GoTmpString[i] = SPACE_ASCII;
mverdy 20:626b92b70bf7 67 }
mverdy 20:626b92b70bf7 68
mverdy 20:626b92b70bf7 69 // Calibrates the touch screen
mverdy 20:626b92b70bf7 70 void DisplayDriverCalibrate( void )
mverdy 20:626b92b70bf7 71 {
mverdy 20:626b92b70bf7 72 uint16_t x, y = 0;
mverdy 20:626b92b70bf7 73 bool touched = false;
mverdy 20:626b92b70bf7 74
mverdy 20:626b92b70bf7 75 if( Eeprom.EepromData.MenuSettings.ScreenCalibrated == false )
mverdy 20:626b92b70bf7 76 {
mverdy 20:626b92b70bf7 77 Tft.drawString( 5, 5, "Press and hold on cross" );
mverdy 20:626b92b70bf7 78 Tft.drawString( 5, 25, "until it turns green. " );
mverdy 20:626b92b70bf7 79
mverdy 20:626b92b70bf7 80 Point displayRefPoint[5];
mverdy 20:626b92b70bf7 81 Point touchRefPoint[5];
mverdy 20:626b92b70bf7 82
mverdy 20:626b92b70bf7 83 if( Calibration.getTouchReferencePoints( displayRefPoint, touchRefPoint,\
mverdy 20:626b92b70bf7 84 Tft.width( ), Tft.height( ) ) )
mverdy 20:626b92b70bf7 85 {
mverdy 20:626b92b70bf7 86 CalibrationMatrix calibrationMatrix = \
mverdy 20:626b92b70bf7 87 Calibration.calculateCalibrationMatrix( displayRefPoint, \
mverdy 20:626b92b70bf7 88 touchRefPoint );
mverdy 20:626b92b70bf7 89
mverdy 20:626b92b70bf7 90 Touch.setCalibrationMatrix( calibrationMatrix );
mverdy 20:626b92b70bf7 91 Tft.clearScreen( );
mverdy 20:626b92b70bf7 92 Eeprom.EepromData.MenuSettings.Calibration.a = calibrationMatrix.a;
mverdy 20:626b92b70bf7 93 Eeprom.EepromData.MenuSettings.Calibration.b = calibrationMatrix.b;
mverdy 20:626b92b70bf7 94 Eeprom.EepromData.MenuSettings.Calibration.c = calibrationMatrix.c;
mverdy 20:626b92b70bf7 95 Eeprom.EepromData.MenuSettings.Calibration.d = calibrationMatrix.d;
mverdy 20:626b92b70bf7 96 Eeprom.EepromData.MenuSettings.Calibration.e = calibrationMatrix.e;
mverdy 20:626b92b70bf7 97 Eeprom.EepromData.MenuSettings.Calibration.f = calibrationMatrix.f;
mverdy 20:626b92b70bf7 98 Eeprom.EepromData.MenuSettings.ScreenCalibrated = true;
mverdy 20:626b92b70bf7 99 EepromSaveSettings( SCREEN_DATA );
mverdy 20:626b92b70bf7 100 }
mverdy 20:626b92b70bf7 101 else
mverdy 20:626b92b70bf7 102 {
mverdy 20:626b92b70bf7 103 Tft.clearScreen( );
mverdy 20:626b92b70bf7 104 Tft.drawString( 5, 5, "Calibration failed" );
mverdy 20:626b92b70bf7 105 Tft.drawString( 5, 25, "Please try again." );
lex9296 24:9f96fd6764d2 106 // delay( 2000 );
lex9296 24:9f96fd6764d2 107 wait(2000);
lex9296 24:9f96fd6764d2 108
mverdy 20:626b92b70bf7 109 Tft.clearScreen( );
mverdy 20:626b92b70bf7 110 return;
mverdy 20:626b92b70bf7 111 }
mverdy 20:626b92b70bf7 112 }
mverdy 20:626b92b70bf7 113 else
mverdy 20:626b92b70bf7 114 {
mverdy 20:626b92b70bf7 115 Touch.setCalibrationMatrix( Eeprom.EepromData.MenuSettings.Calibration );
mverdy 20:626b92b70bf7 116 Tft.clearScreen( );
mverdy 20:626b92b70bf7 117 }
mverdy 20:626b92b70bf7 118
mverdy 20:626b92b70bf7 119 if( Touch.isTouched( ) )
mverdy 20:626b92b70bf7 120 {
mverdy 20:626b92b70bf7 121 Touch.readTouchData( x, y, touched );
mverdy 20:626b92b70bf7 122 Calibration.drawCalibPoint( x, y );
mverdy 20:626b92b70bf7 123 }
mverdy 20:626b92b70bf7 124 }
mverdy 20:626b92b70bf7 125
mverdy 20:626b92b70bf7 126 GraphObjectStatus_t GraphObjectDraw( GraphObject_t* goObject, uint8_t* source, \
mverdy 20:626b92b70bf7 127 bool doFill, bool activeTouch)
mverdy 20:626b92b70bf7 128 {
mverdy 20:626b92b70bf7 129 GraphObjectStatus_t status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 130 uint8_t maxChar;
mverdy 20:626b92b70bf7 131
mverdy 20:626b92b70bf7 132 if( goObject == NULL )
mverdy 20:626b92b70bf7 133 {
mverdy 20:626b92b70bf7 134 return GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 135 }
mverdy 20:626b92b70bf7 136 if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
mverdy 20:626b92b70bf7 137 {
mverdy 20:626b92b70bf7 138 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 139 }
mverdy 20:626b92b70bf7 140 if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
mverdy 20:626b92b70bf7 141 {
mverdy 20:626b92b70bf7 142 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 143 }
mverdy 20:626b92b70bf7 144 switch( goObject->Type )
mverdy 20:626b92b70bf7 145 {
mverdy 20:626b92b70bf7 146 case GO_TEXT:
mverdy 20:626b92b70bf7 147 if( source == NULL )
mverdy 20:626b92b70bf7 148 {
mverdy 20:626b92b70bf7 149 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 150 }
mverdy 20:626b92b70bf7 151 else
mverdy 20:626b92b70bf7 152 {
mverdy 20:626b92b70bf7 153 uint8_t i = 0;
mverdy 20:626b92b70bf7 154 uint8_t j = 0;
mverdy 20:626b92b70bf7 155 // max character in the object string
mverdy 20:626b92b70bf7 156 maxChar = goObject->Width / FONT_WIDTH;
mverdy 20:626b92b70bf7 157 Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
mverdy 20:626b92b70bf7 158 for( i = 0; i < maxChar; i++)
mverdy 20:626b92b70bf7 159 {
mverdy 20:626b92b70bf7 160 if( *source != 0 )
mverdy 20:626b92b70bf7 161 {
mverdy 20:626b92b70bf7 162 Tft.drawChar( goObject->Xpos + j, goObject->Ypos, \
mverdy 20:626b92b70bf7 163 ( char )*( source++ ), false );
mverdy 20:626b92b70bf7 164 j += FONT_WIDTH;
mverdy 20:626b92b70bf7 165 }
mverdy 20:626b92b70bf7 166 else
mverdy 20:626b92b70bf7 167 {
mverdy 20:626b92b70bf7 168 Tft.drawChar( goObject->Xpos + ( FONT_WIDTH * i ), \
mverdy 20:626b92b70bf7 169 goObject->Ypos, SPACE_ASCII, false);
mverdy 20:626b92b70bf7 170 }
mverdy 20:626b92b70bf7 171 }
mverdy 20:626b92b70bf7 172 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 173 }
mverdy 20:626b92b70bf7 174 break;
mverdy 20:626b92b70bf7 175
mverdy 20:626b92b70bf7 176 case GO_RECTANGLE:
mverdy 20:626b92b70bf7 177 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 178 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 179 goObject->Height - 1, goObject->FrontColor );
mverdy 20:626b92b70bf7 180 if( doFill )
mverdy 20:626b92b70bf7 181 {
mverdy 20:626b92b70bf7 182 Tft.fillRectangle( goObject->Xpos + 1, goObject->Ypos + 1, \
mverdy 20:626b92b70bf7 183 goObject->Xpos + goObject->Width - 2, \
mverdy 20:626b92b70bf7 184 goObject->Ypos + goObject->Height - 2, \
mverdy 20:626b92b70bf7 185 goObject->FillColor );
mverdy 20:626b92b70bf7 186 }
mverdy 20:626b92b70bf7 187 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 188 break;
mverdy 20:626b92b70bf7 189
mverdy 20:626b92b70bf7 190 case GO_CIRCLE:
mverdy 20:626b92b70bf7 191 Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 192 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 193 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 194 goObject->FrontColor );
mverdy 20:626b92b70bf7 195 if( doFill )
mverdy 20:626b92b70bf7 196 {
mverdy 20:626b92b70bf7 197 Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 198 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 199 ( goObject->Height / 2 ) - 1 : ( goObject->Width / 2 ) - 1, \
mverdy 20:626b92b70bf7 200 goObject->FillColor );
mverdy 20:626b92b70bf7 201 }
mverdy 20:626b92b70bf7 202 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 203 break;
mverdy 20:626b92b70bf7 204
mverdy 20:626b92b70bf7 205 case GO_TRIANGLE:
mverdy 20:626b92b70bf7 206 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 207 break;
mverdy 20:626b92b70bf7 208
mverdy 20:626b92b70bf7 209 case GO_IMAGE:
mverdy 20:626b92b70bf7 210 if( source == NULL )
mverdy 20:626b92b70bf7 211 {
mverdy 20:626b92b70bf7 212 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 213 }
mverdy 20:626b92b70bf7 214 else
mverdy 20:626b92b70bf7 215 {
mverdy 20:626b92b70bf7 216 if( BmpReadHeader( goObject->Source ) )
mverdy 20:626b92b70bf7 217 {
mverdy 20:626b92b70bf7 218 DrawBmpFromFlash( goObject->Source, goObject->Xpos, \
mverdy 20:626b92b70bf7 219 goObject->Ypos );
mverdy 20:626b92b70bf7 220 }
mverdy 20:626b92b70bf7 221 else
mverdy 20:626b92b70bf7 222 {
mverdy 20:626b92b70bf7 223 // draw a red rectangle with a line through, to show error
mverdy 20:626b92b70bf7 224 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 225 goObject->Xpos + goObject->Width - 1, \
mverdy 20:626b92b70bf7 226 goObject->Ypos + goObject->Height - 1, \
mverdy 20:626b92b70bf7 227 OBJECT_ERROR );
mverdy 20:626b92b70bf7 228 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 229 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 230 goObject->Height - 1, OBJECT_ERROR );
mverdy 20:626b92b70bf7 231 }
mverdy 20:626b92b70bf7 232 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 233 }
mverdy 20:626b92b70bf7 234 break;
mverdy 20:626b92b70bf7 235
mverdy 20:626b92b70bf7 236 case GO_LINE:
mverdy 20:626b92b70bf7 237 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 238 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 239 goObject->Height - 1, goObject->FrontColor );
mverdy 20:626b92b70bf7 240 break;
mverdy 20:626b92b70bf7 241
mverdy 20:626b92b70bf7 242 default:
mverdy 20:626b92b70bf7 243 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 244 }
mverdy 20:626b92b70bf7 245 return status;
mverdy 20:626b92b70bf7 246 }
mverdy 20:626b92b70bf7 247
mverdy 20:626b92b70bf7 248 GraphObjectStatus_t GraphObjectClear( GraphObject_t* goObject, bool doFill )
mverdy 20:626b92b70bf7 249 {
mverdy 20:626b92b70bf7 250 GraphObjectStatus_t status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 251 uint8_t maxChar;
mverdy 20:626b92b70bf7 252
mverdy 20:626b92b70bf7 253 if( goObject == NULL )
mverdy 20:626b92b70bf7 254 {
mverdy 20:626b92b70bf7 255 return GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 256 }
mverdy 20:626b92b70bf7 257 if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
mverdy 20:626b92b70bf7 258 {
mverdy 20:626b92b70bf7 259 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 260 }
mverdy 20:626b92b70bf7 261 if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
mverdy 20:626b92b70bf7 262 {
mverdy 20:626b92b70bf7 263 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 264 }
mverdy 20:626b92b70bf7 265 switch( goObject->Type )
mverdy 20:626b92b70bf7 266 {
mverdy 20:626b92b70bf7 267 case GO_TEXT:
mverdy 20:626b92b70bf7 268 // max character in the object string
mverdy 20:626b92b70bf7 269 maxChar = goObject->Width / FONT_WIDTH;
mverdy 20:626b92b70bf7 270 GoTmpString[maxChar] = NULL;
mverdy 20:626b92b70bf7 271 Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
mverdy 20:626b92b70bf7 272 Tft.drawString( goObject->Xpos, goObject->Ypos, GoTmpString );
mverdy 20:626b92b70bf7 273 GoTmpString[maxChar] = SPACE_ASCII;
mverdy 20:626b92b70bf7 274 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 275 break;
mverdy 20:626b92b70bf7 276
mverdy 20:626b92b70bf7 277 case GO_RECTANGLE:
mverdy 20:626b92b70bf7 278 case GO_IMAGE:
mverdy 20:626b92b70bf7 279 if( doFill )
mverdy 20:626b92b70bf7 280 {
mverdy 20:626b92b70bf7 281 Tft.fillRectangle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 282 goObject->Xpos + goObject->Width - 1, \
mverdy 20:626b92b70bf7 283 goObject->Ypos + goObject->Height - 1, \
mverdy 20:626b92b70bf7 284 goObject->BackColor );
mverdy 20:626b92b70bf7 285 }
mverdy 20:626b92b70bf7 286 else
mverdy 20:626b92b70bf7 287 {
mverdy 20:626b92b70bf7 288 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 289 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 290 goObject->Height - 1, goObject->BackColor );
mverdy 20:626b92b70bf7 291 }
mverdy 20:626b92b70bf7 292 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 293 break;
mverdy 20:626b92b70bf7 294
mverdy 20:626b92b70bf7 295 case GO_CIRCLE:
mverdy 20:626b92b70bf7 296 if( doFill )
mverdy 20:626b92b70bf7 297 {
mverdy 20:626b92b70bf7 298 Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 299 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 300 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 301 goObject->BackColor );
mverdy 20:626b92b70bf7 302 }
mverdy 20:626b92b70bf7 303 else
mverdy 20:626b92b70bf7 304 {
mverdy 20:626b92b70bf7 305 Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 306 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 307 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 308 goObject->BackColor );
mverdy 20:626b92b70bf7 309 }
mverdy 20:626b92b70bf7 310 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 311 break;
mverdy 20:626b92b70bf7 312
mverdy 20:626b92b70bf7 313 case GO_TRIANGLE:
mverdy 20:626b92b70bf7 314 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 315 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 316 break;
mverdy 20:626b92b70bf7 317
mverdy 20:626b92b70bf7 318 case GO_LINE:
mverdy 20:626b92b70bf7 319 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 320 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 321 goObject->Height - 1, goObject->BackColor );
mverdy 20:626b92b70bf7 322 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 323 break;
mverdy 20:626b92b70bf7 324
mverdy 20:626b92b70bf7 325 default:
mverdy 20:626b92b70bf7 326 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 327 }
mverdy 20:626b92b70bf7 328 return status;
mverdy 20:626b92b70bf7 329 }
mverdy 20:626b92b70bf7 330
mverdy 20:626b92b70bf7 331 void DisplayDriverDrawLogo( uint8_t *thisBmp, uint8_t xPos, uint8_t yPos )
mverdy 20:626b92b70bf7 332 {
mverdy 20:626b92b70bf7 333 if( BmpReadHeader( thisBmp ) )
mverdy 20:626b92b70bf7 334 {
mverdy 20:626b92b70bf7 335 DrawBmpFromFlash( thisBmp, xPos, yPos );
mverdy 20:626b92b70bf7 336 }
mverdy 20:626b92b70bf7 337 }
mverdy 20:626b92b70bf7 338
lex9296 21:ab8027016a2c 339 void TouchedXYT (uint16_t* x, uint16_t* y, bool* t) {
lex9296 21:ab8027016a2c 340 uint16_t ui16_x;
lex9296 21:ab8027016a2c 341 uint16_t ui16_y;
lex9296 21:ab8027016a2c 342 bool b_t;
lex9296 21:ab8027016a2c 343 Touch.readTouchData (ui16_x,
lex9296 21:ab8027016a2c 344 ui16_y,
lex9296 21:ab8027016a2c 345 b_t);
lex9296 21:ab8027016a2c 346
lex9296 21:ab8027016a2c 347 *x = ui16_x;
lex9296 21:ab8027016a2c 348 *y = ui16_y;
lex9296 21:ab8027016a2c 349 *t = b_t;
lex9296 21:ab8027016a2c 350 }
lex9296 21:ab8027016a2c 351
mverdy 20:626b92b70bf7 352 GraphObjectStatus_t GraphObjectTouched( GraphObject_t* objects, \
mverdy 20:626b92b70bf7 353 uint8_t objectsCount, \
mverdy 20:626b92b70bf7 354 uint8_t* touchedObject)
mverdy 20:626b92b70bf7 355 {
mverdy 20:626b92b70bf7 356 uint8_t objScan;
mverdy 20:626b92b70bf7 357 uint16_t x, y = 0;
mverdy 20:626b92b70bf7 358 bool touched = false;
mverdy 20:626b92b70bf7 359 GraphObjectStatus_t status = GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 360
mverdy 20:626b92b70bf7 361 if( Touch.isTouched( ) )
mverdy 20:626b92b70bf7 362 {
mverdy 20:626b92b70bf7 363 Touch.readTouchData( x, y, touched );
mverdy 20:626b92b70bf7 364
mverdy 20:626b92b70bf7 365 if( touched == true )
mverdy 20:626b92b70bf7 366 {
mverdy 20:626b92b70bf7 367 for( objScan = 0; objScan < objectsCount; objScan++)
mverdy 20:626b92b70bf7 368 {
mverdy 20:626b92b70bf7 369 if( objects[objScan].TouchActive == true )
mverdy 20:626b92b70bf7 370 {
mverdy 20:626b92b70bf7 371 if( ( y >= objects[objScan].Ypos ) && ( y <= ( objects[objScan].Ypos + objects[objScan].Height - 1 ) ) )
mverdy 20:626b92b70bf7 372 {
mverdy 20:626b92b70bf7 373 if( ( x >= objects[objScan].Xpos ) && ( x <= ( objects[objScan].Xpos + objects[objScan].Width - 1 ) ) )
mverdy 20:626b92b70bf7 374 {
mverdy 20:626b92b70bf7 375 *touchedObject = objects[objScan].Id;
mverdy 20:626b92b70bf7 376 status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 377 break; // return the first object match and no scan of other following objects
mverdy 20:626b92b70bf7 378 }
mverdy 20:626b92b70bf7 379 }
mverdy 20:626b92b70bf7 380 }
mverdy 20:626b92b70bf7 381 }
mverdy 20:626b92b70bf7 382 }
mverdy 20:626b92b70bf7 383 }
mverdy 20:626b92b70bf7 384
mverdy 20:626b92b70bf7 385 return status;
mverdy 20:626b92b70bf7 386 }
mverdy 20:626b92b70bf7 387
mverdy 20:626b92b70bf7 388 static bool BmpReadHeader( uint8_t *thisBmp )
mverdy 20:626b92b70bf7 389 {
mverdy 20:626b92b70bf7 390 uint16_t pos = 0;
mverdy 20:626b92b70bf7 391
mverdy 20:626b92b70bf7 392 Read16( thisBmp );
mverdy 20:626b92b70bf7 393 if( Read16( thisBmp ) != 0x4D42 )
mverdy 20:626b92b70bf7 394 { // read magic byte
mverdy 20:626b92b70bf7 395 return false;
mverdy 20:626b92b70bf7 396 }
mverdy 20:626b92b70bf7 397 pos += 2;
mverdy 20:626b92b70bf7 398
mverdy 20:626b92b70bf7 399 // read file size
mverdy 20:626b92b70bf7 400 pos += 4;
mverdy 20:626b92b70bf7 401 pos += 4; // Skip creator bytes
mverdy 20:626b92b70bf7 402 BmpImageoffset = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 403 pos += 4;
mverdy 20:626b92b70bf7 404 // read DIB header
mverdy 20:626b92b70bf7 405 pos +=4;
mverdy 20:626b92b70bf7 406 BmpWidth = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 407 pos += 4;
mverdy 20:626b92b70bf7 408 BmpHeight = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 409 pos += 4;
mverdy 20:626b92b70bf7 410 if( Read16( thisBmp + pos ) != 1 )
mverdy 20:626b92b70bf7 411 {
mverdy 20:626b92b70bf7 412 // number of color planes must be 1
mverdy 20:626b92b70bf7 413 return false;
mverdy 20:626b92b70bf7 414 }
mverdy 20:626b92b70bf7 415 pos += 2;
mverdy 20:626b92b70bf7 416 pos += 2;
mverdy 20:626b92b70bf7 417 if( Read16( thisBmp + pos ) != 0 )
mverdy 20:626b92b70bf7 418 {
mverdy 20:626b92b70bf7 419 return false; // compression not supported!
mverdy 20:626b92b70bf7 420 }
mverdy 20:626b92b70bf7 421 pos += 2; // Should really be 2??
mverdy 20:626b92b70bf7 422 return true;
mverdy 20:626b92b70bf7 423 }
mverdy 20:626b92b70bf7 424
mverdy 20:626b92b70bf7 425 // LITTLE ENDIAN!
mverdy 20:626b92b70bf7 426 static uint16_t Read16( uint8_t *src )
mverdy 20:626b92b70bf7 427 {
mverdy 20:626b92b70bf7 428 uint16_t d;
mverdy 20:626b92b70bf7 429 uint8_t b;
mverdy 20:626b92b70bf7 430 b = *src;
mverdy 20:626b92b70bf7 431 d = *( src + 1 );
mverdy 20:626b92b70bf7 432 d <<= 8;
mverdy 20:626b92b70bf7 433 d |= b;
mverdy 20:626b92b70bf7 434 return d;
mverdy 20:626b92b70bf7 435 }
mverdy 20:626b92b70bf7 436
mverdy 20:626b92b70bf7 437 // LITTLE ENDIAN!
mverdy 20:626b92b70bf7 438 static uint32_t Read32( uint8_t *src )
mverdy 20:626b92b70bf7 439 {
mverdy 20:626b92b70bf7 440 uint32_t d;
mverdy 20:626b92b70bf7 441 uint16_t b;
mverdy 20:626b92b70bf7 442
mverdy 20:626b92b70bf7 443 b = Read16( src );
mverdy 20:626b92b70bf7 444 d = Read16( src + 2 );
mverdy 20:626b92b70bf7 445 d <<= 16;
mverdy 20:626b92b70bf7 446 d |= b;
mverdy 20:626b92b70bf7 447 return d;
mverdy 20:626b92b70bf7 448 }
mverdy 20:626b92b70bf7 449
mverdy 20:626b92b70bf7 450 static void DrawBmpFromFlash( uint8_t *thisBmp, int xPos, int yPos )
mverdy 20:626b92b70bf7 451 {
mverdy 20:626b92b70bf7 452 uint16_t pos = BmpImageoffset;
mverdy 20:626b92b70bf7 453 uint16_t p; // pixel
mverdy 20:626b92b70bf7 454 uint8_t g;
mverdy 20:626b92b70bf7 455 uint8_t b;
mverdy 20:626b92b70bf7 456 int i, j; // line, column
mverdy 20:626b92b70bf7 457
mverdy 20:626b92b70bf7 458 for( i = BmpHeight; i > 0; i-- )
mverdy 20:626b92b70bf7 459 {
mverdy 20:626b92b70bf7 460 for( j = 0; j < BmpWidth; j++ )
mverdy 20:626b92b70bf7 461 {
mverdy 20:626b92b70bf7 462 b = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 463 g = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 464 p = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 465
mverdy 20:626b92b70bf7 466 p >>= 3;
mverdy 20:626b92b70bf7 467 p <<= 6;
mverdy 20:626b92b70bf7 468
mverdy 20:626b92b70bf7 469 g >>= 2;
mverdy 20:626b92b70bf7 470 p |= g;
mverdy 20:626b92b70bf7 471 p <<= 5;
mverdy 20:626b92b70bf7 472
mverdy 20:626b92b70bf7 473 b >>= 3;
mverdy 20:626b92b70bf7 474 p |= b;
mverdy 20:626b92b70bf7 475
mverdy 20:626b92b70bf7 476 // write out the 16 bits of color
mverdy 20:626b92b70bf7 477 Tft.setPixel( j + xPos, i + yPos, p );
mverdy 20:626b92b70bf7 478 }
mverdy 20:626b92b70bf7 479 pos += 1;
mverdy 20:626b92b70bf7 480 }
mverdy 20:626b92b70bf7 481 }
mverdy 20:626b92b70bf7 482