Source code for the SX126xDVK1xAS Dev Kit. This example code has only been tested on the Nucleo L476RG

Dependencies:   mbed DmTftLibrary SX126xLib

Committer:
mantoine
Date:
Mon Jan 07 23:02:45 2019 +0100
Revision:
3:c3ab10127815
Parent:
0:e5420f1a8a1a
Updated erroneous path to SX126xLib library.

Who changed what in which revision?

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