Stabilus 322699 wDoublePID

Dependencies:   mbed QEI PID DmTftLibraryEx

Committer:
lex9296
Date:
Mon Apr 11 13:48:34 2022 +0000
Revision:
36:cab8aa44ef91
Parent:
35:0f6adc0b95b9
Double PID

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 //If DISPLAY_INVERT is defined as 1 then the display will be inverted from its native orientation
mverdy 20:626b92b70bf7 23 #define DISPLAY_INVERT 1
mverdy 20:626b92b70bf7 24
mverdy 20:626b92b70bf7 25 #define MAX_GO_STRING 30
mverdy 20:626b92b70bf7 26 #define SPACE_ASCII 0x20
mverdy 20:626b92b70bf7 27 #define FONT_WIDTH 8
mverdy 20:626b92b70bf7 28
mverdy 20:626b92b70bf7 29 // DmTftIli9341( PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk )
mverdy 20:626b92b70bf7 30 // DM_TFT28_105
mverdy 20:626b92b70bf7 31 DmTftIli9341 Tft( D10, D9, D11, D12, D13 );
lex9296 30:e45282a70a4d 32
lex9296 30:e45282a70a4d 33
mverdy 20:626b92b70bf7 34 DmTouch Touch( DmTouch::DM_TFT28_105, D9, D11, D12 );
mverdy 20:626b92b70bf7 35 DmTouchCalibration Calibration = DmTouchCalibration( &Tft, &Touch );
mverdy 20:626b92b70bf7 36
mverdy 20:626b92b70bf7 37 /*
mverdy 20:626b92b70bf7 38 * Used only to define pull-up on the CS lines
mverdy 20:626b92b70bf7 39 */
mverdy 20:626b92b70bf7 40 DigitalInOut CsTouch( D4, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 41 DigitalInOut CsDisplay( D10, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 42 DigitalInOut CsSDCard( D8, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 43 DigitalInOut CsFlash( D6, PIN_OUTPUT, PullUp, 1 );
mverdy 20:626b92b70bf7 44
mverdy 20:626b92b70bf7 45 MenuSettings_t MenuSettings;
mverdy 20:626b92b70bf7 46 char GoTmpString[MAX_GO_STRING];
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
lex9296 27:654100855f5c 58 void DisplayDriverInit (void) {
lex9296 27:654100855f5c 59 Tft.init();
lex9296 27:654100855f5c 60 Touch.init();
mverdy 20:626b92b70bf7 61
lex9296 27:654100855f5c 62 DisplayDriverCalibrate();
lex9296 27:654100855f5c 63 Tft.clearScreen();
mverdy 20:626b92b70bf7 64
lex9296 27:654100855f5c 65 for (uint8_t i = 0; i < MAX_GO_STRING; i++)
lex9296 27:654100855f5c 66 GoTmpString[i] = SPACE_ASCII;
mverdy 20:626b92b70bf7 67 }
mverdy 20:626b92b70bf7 68
mverdy 20:626b92b70bf7 69 // Calibrates the touch screen
lex9296 27:654100855f5c 70 void DisplayDriverCalibrate (void) {
mverdy 20:626b92b70bf7 71 uint16_t x, y = 0;
mverdy 20:626b92b70bf7 72 bool touched = false;
mverdy 20:626b92b70bf7 73
mverdy 20:626b92b70bf7 74 if( Eeprom.EepromData.MenuSettings.ScreenCalibrated == false )
mverdy 20:626b92b70bf7 75 {
mverdy 20:626b92b70bf7 76 Tft.drawString( 5, 5, "Press and hold on cross" );
mverdy 20:626b92b70bf7 77 Tft.drawString( 5, 25, "until it turns green. " );
mverdy 20:626b92b70bf7 78
mverdy 20:626b92b70bf7 79 Point displayRefPoint[5];
mverdy 20:626b92b70bf7 80 Point touchRefPoint[5];
mverdy 20:626b92b70bf7 81
mverdy 20:626b92b70bf7 82 if( Calibration.getTouchReferencePoints( displayRefPoint, touchRefPoint,\
mverdy 20:626b92b70bf7 83 Tft.width( ), Tft.height( ) ) )
mverdy 20:626b92b70bf7 84 {
mverdy 20:626b92b70bf7 85 CalibrationMatrix calibrationMatrix = \
mverdy 20:626b92b70bf7 86 Calibration.calculateCalibrationMatrix( displayRefPoint, \
mverdy 20:626b92b70bf7 87 touchRefPoint );
mverdy 20:626b92b70bf7 88
mverdy 20:626b92b70bf7 89 Touch.setCalibrationMatrix( calibrationMatrix );
mverdy 20:626b92b70bf7 90 Tft.clearScreen( );
mverdy 20:626b92b70bf7 91 Eeprom.EepromData.MenuSettings.Calibration.a = calibrationMatrix.a;
mverdy 20:626b92b70bf7 92 Eeprom.EepromData.MenuSettings.Calibration.b = calibrationMatrix.b;
mverdy 20:626b92b70bf7 93 Eeprom.EepromData.MenuSettings.Calibration.c = calibrationMatrix.c;
mverdy 20:626b92b70bf7 94 Eeprom.EepromData.MenuSettings.Calibration.d = calibrationMatrix.d;
mverdy 20:626b92b70bf7 95 Eeprom.EepromData.MenuSettings.Calibration.e = calibrationMatrix.e;
mverdy 20:626b92b70bf7 96 Eeprom.EepromData.MenuSettings.Calibration.f = calibrationMatrix.f;
mverdy 20:626b92b70bf7 97 Eeprom.EepromData.MenuSettings.ScreenCalibrated = true;
mverdy 20:626b92b70bf7 98 EepromSaveSettings( SCREEN_DATA );
mverdy 20:626b92b70bf7 99 }
mverdy 20:626b92b70bf7 100 else
mverdy 20:626b92b70bf7 101 {
mverdy 20:626b92b70bf7 102 Tft.clearScreen( );
mverdy 20:626b92b70bf7 103 Tft.drawString( 5, 5, "Calibration failed" );
mverdy 20:626b92b70bf7 104 Tft.drawString( 5, 25, "Please try again." );
lex9296 27:654100855f5c 105 delay( 2000 );
lex9296 24:9f96fd6764d2 106
mverdy 20:626b92b70bf7 107 Tft.clearScreen( );
mverdy 20:626b92b70bf7 108 return;
mverdy 20:626b92b70bf7 109 }
mverdy 20:626b92b70bf7 110 }
mverdy 20:626b92b70bf7 111 else
mverdy 20:626b92b70bf7 112 {
mverdy 20:626b92b70bf7 113 Touch.setCalibrationMatrix( Eeprom.EepromData.MenuSettings.Calibration );
mverdy 20:626b92b70bf7 114 Tft.clearScreen( );
mverdy 20:626b92b70bf7 115 }
mverdy 20:626b92b70bf7 116
mverdy 20:626b92b70bf7 117 if( Touch.isTouched( ) )
mverdy 20:626b92b70bf7 118 {
mverdy 20:626b92b70bf7 119 Touch.readTouchData( x, y, touched );
mverdy 20:626b92b70bf7 120 Calibration.drawCalibPoint( x, y );
mverdy 20:626b92b70bf7 121 }
mverdy 20:626b92b70bf7 122 }
mverdy 20:626b92b70bf7 123
mverdy 20:626b92b70bf7 124 GraphObjectStatus_t GraphObjectDraw( GraphObject_t* goObject, uint8_t* source, \
mverdy 20:626b92b70bf7 125 bool doFill, bool activeTouch)
mverdy 20:626b92b70bf7 126 {
mverdy 20:626b92b70bf7 127 GraphObjectStatus_t status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 128 uint8_t maxChar;
mverdy 20:626b92b70bf7 129
mverdy 20:626b92b70bf7 130 if( goObject == NULL )
mverdy 20:626b92b70bf7 131 {
mverdy 20:626b92b70bf7 132 return GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 133 }
mverdy 20:626b92b70bf7 134 if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
mverdy 20:626b92b70bf7 135 {
mverdy 20:626b92b70bf7 136 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 137 }
mverdy 20:626b92b70bf7 138 if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
mverdy 20:626b92b70bf7 139 {
mverdy 20:626b92b70bf7 140 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 141 }
mverdy 20:626b92b70bf7 142 switch( goObject->Type )
mverdy 20:626b92b70bf7 143 {
mverdy 20:626b92b70bf7 144 case GO_TEXT:
mverdy 20:626b92b70bf7 145 if( source == NULL )
mverdy 20:626b92b70bf7 146 {
mverdy 20:626b92b70bf7 147 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 148 }
mverdy 20:626b92b70bf7 149 else
mverdy 20:626b92b70bf7 150 {
mverdy 20:626b92b70bf7 151 uint8_t i = 0;
mverdy 20:626b92b70bf7 152 uint8_t j = 0;
mverdy 20:626b92b70bf7 153 // max character in the object string
mverdy 20:626b92b70bf7 154 maxChar = goObject->Width / FONT_WIDTH;
mverdy 20:626b92b70bf7 155 Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
mverdy 20:626b92b70bf7 156 for( i = 0; i < maxChar; i++)
mverdy 20:626b92b70bf7 157 {
mverdy 20:626b92b70bf7 158 if( *source != 0 )
mverdy 20:626b92b70bf7 159 {
mverdy 20:626b92b70bf7 160 Tft.drawChar( goObject->Xpos + j, goObject->Ypos, \
mverdy 20:626b92b70bf7 161 ( char )*( source++ ), false );
mverdy 20:626b92b70bf7 162 j += FONT_WIDTH;
mverdy 20:626b92b70bf7 163 }
mverdy 20:626b92b70bf7 164 else
mverdy 20:626b92b70bf7 165 {
mverdy 20:626b92b70bf7 166 Tft.drawChar( goObject->Xpos + ( FONT_WIDTH * i ), \
mverdy 20:626b92b70bf7 167 goObject->Ypos, SPACE_ASCII, false);
mverdy 20:626b92b70bf7 168 }
mverdy 20:626b92b70bf7 169 }
mverdy 20:626b92b70bf7 170 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 171 }
mverdy 20:626b92b70bf7 172 break;
mverdy 20:626b92b70bf7 173
mverdy 20:626b92b70bf7 174 case GO_RECTANGLE:
mverdy 20:626b92b70bf7 175 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 176 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 177 goObject->Height - 1, goObject->FrontColor );
mverdy 20:626b92b70bf7 178 if( doFill )
mverdy 20:626b92b70bf7 179 {
mverdy 20:626b92b70bf7 180 Tft.fillRectangle( goObject->Xpos + 1, goObject->Ypos + 1, \
mverdy 20:626b92b70bf7 181 goObject->Xpos + goObject->Width - 2, \
mverdy 20:626b92b70bf7 182 goObject->Ypos + goObject->Height - 2, \
mverdy 20:626b92b70bf7 183 goObject->FillColor );
mverdy 20:626b92b70bf7 184 }
mverdy 20:626b92b70bf7 185 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 186 break;
mverdy 20:626b92b70bf7 187
mverdy 20:626b92b70bf7 188 case GO_CIRCLE:
mverdy 20:626b92b70bf7 189 Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 190 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 191 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 192 goObject->FrontColor );
mverdy 20:626b92b70bf7 193 if( doFill )
mverdy 20:626b92b70bf7 194 {
mverdy 20:626b92b70bf7 195 Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 196 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 197 ( goObject->Height / 2 ) - 1 : ( goObject->Width / 2 ) - 1, \
mverdy 20:626b92b70bf7 198 goObject->FillColor );
mverdy 20:626b92b70bf7 199 }
mverdy 20:626b92b70bf7 200 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 201 break;
mverdy 20:626b92b70bf7 202
mverdy 20:626b92b70bf7 203 case GO_TRIANGLE:
mverdy 20:626b92b70bf7 204 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 205 break;
mverdy 20:626b92b70bf7 206
mverdy 20:626b92b70bf7 207 case GO_IMAGE:
mverdy 20:626b92b70bf7 208 if( source == NULL )
mverdy 20:626b92b70bf7 209 {
mverdy 20:626b92b70bf7 210 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 211 }
mverdy 20:626b92b70bf7 212 else
mverdy 20:626b92b70bf7 213 {
mverdy 20:626b92b70bf7 214 if( BmpReadHeader( goObject->Source ) )
mverdy 20:626b92b70bf7 215 {
mverdy 20:626b92b70bf7 216 DrawBmpFromFlash( goObject->Source, goObject->Xpos, \
mverdy 20:626b92b70bf7 217 goObject->Ypos );
mverdy 20:626b92b70bf7 218 }
mverdy 20:626b92b70bf7 219 else
mverdy 20:626b92b70bf7 220 {
mverdy 20:626b92b70bf7 221 // draw a red rectangle with a line through, to show error
mverdy 20:626b92b70bf7 222 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 223 goObject->Xpos + goObject->Width - 1, \
mverdy 20:626b92b70bf7 224 goObject->Ypos + goObject->Height - 1, \
mverdy 20:626b92b70bf7 225 OBJECT_ERROR );
mverdy 20:626b92b70bf7 226 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 227 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 228 goObject->Height - 1, OBJECT_ERROR );
mverdy 20:626b92b70bf7 229 }
mverdy 20:626b92b70bf7 230 goObject->TouchActive = activeTouch;
mverdy 20:626b92b70bf7 231 }
mverdy 20:626b92b70bf7 232 break;
mverdy 20:626b92b70bf7 233
mverdy 20:626b92b70bf7 234 case GO_LINE:
mverdy 20:626b92b70bf7 235 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 236 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 237 goObject->Height - 1, goObject->FrontColor );
mverdy 20:626b92b70bf7 238 break;
mverdy 20:626b92b70bf7 239
mverdy 20:626b92b70bf7 240 default:
mverdy 20:626b92b70bf7 241 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 242 }
mverdy 20:626b92b70bf7 243 return status;
mverdy 20:626b92b70bf7 244 }
mverdy 20:626b92b70bf7 245
mverdy 20:626b92b70bf7 246 GraphObjectStatus_t GraphObjectClear( GraphObject_t* goObject, bool doFill )
mverdy 20:626b92b70bf7 247 {
mverdy 20:626b92b70bf7 248 GraphObjectStatus_t status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 249 uint8_t maxChar;
mverdy 20:626b92b70bf7 250
mverdy 20:626b92b70bf7 251 if( goObject == NULL )
mverdy 20:626b92b70bf7 252 {
mverdy 20:626b92b70bf7 253 return GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 254 }
mverdy 20:626b92b70bf7 255 if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
mverdy 20:626b92b70bf7 256 {
mverdy 20:626b92b70bf7 257 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 258 }
mverdy 20:626b92b70bf7 259 if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
mverdy 20:626b92b70bf7 260 {
mverdy 20:626b92b70bf7 261 return GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 262 }
mverdy 20:626b92b70bf7 263 switch( goObject->Type )
mverdy 20:626b92b70bf7 264 {
mverdy 20:626b92b70bf7 265 case GO_TEXT:
mverdy 20:626b92b70bf7 266 // max character in the object string
mverdy 20:626b92b70bf7 267 maxChar = goObject->Width / FONT_WIDTH;
mverdy 20:626b92b70bf7 268 GoTmpString[maxChar] = NULL;
mverdy 20:626b92b70bf7 269 Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
mverdy 20:626b92b70bf7 270 Tft.drawString( goObject->Xpos, goObject->Ypos, GoTmpString );
mverdy 20:626b92b70bf7 271 GoTmpString[maxChar] = SPACE_ASCII;
mverdy 20:626b92b70bf7 272 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 273 break;
mverdy 20:626b92b70bf7 274
mverdy 20:626b92b70bf7 275 case GO_RECTANGLE:
mverdy 20:626b92b70bf7 276 case GO_IMAGE:
mverdy 20:626b92b70bf7 277 if( doFill )
mverdy 20:626b92b70bf7 278 {
mverdy 20:626b92b70bf7 279 Tft.fillRectangle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 280 goObject->Xpos + goObject->Width - 1, \
mverdy 20:626b92b70bf7 281 goObject->Ypos + goObject->Height - 1, \
mverdy 20:626b92b70bf7 282 goObject->BackColor );
mverdy 20:626b92b70bf7 283 }
mverdy 20:626b92b70bf7 284 else
mverdy 20:626b92b70bf7 285 {
mverdy 20:626b92b70bf7 286 Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 287 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 288 goObject->Height - 1, goObject->BackColor );
mverdy 20:626b92b70bf7 289 }
mverdy 20:626b92b70bf7 290 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 291 break;
mverdy 20:626b92b70bf7 292
mverdy 20:626b92b70bf7 293 case GO_CIRCLE:
mverdy 20:626b92b70bf7 294 if( doFill )
mverdy 20:626b92b70bf7 295 {
mverdy 20:626b92b70bf7 296 Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 297 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 298 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 299 goObject->BackColor );
mverdy 20:626b92b70bf7 300 }
mverdy 20:626b92b70bf7 301 else
mverdy 20:626b92b70bf7 302 {
mverdy 20:626b92b70bf7 303 Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
mverdy 20:626b92b70bf7 304 ( goObject->Height < goObject->Width ) ? \
mverdy 20:626b92b70bf7 305 ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
mverdy 20:626b92b70bf7 306 goObject->BackColor );
mverdy 20:626b92b70bf7 307 }
mverdy 20:626b92b70bf7 308 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 309 break;
mverdy 20:626b92b70bf7 310
mverdy 20:626b92b70bf7 311 case GO_TRIANGLE:
mverdy 20:626b92b70bf7 312 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 313 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 314 break;
mverdy 20:626b92b70bf7 315
mverdy 20:626b92b70bf7 316 case GO_LINE:
mverdy 20:626b92b70bf7 317 Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
mverdy 20:626b92b70bf7 318 goObject->Width - 1, goObject->Ypos + \
mverdy 20:626b92b70bf7 319 goObject->Height - 1, goObject->BackColor );
mverdy 20:626b92b70bf7 320 goObject->TouchActive = false;
mverdy 20:626b92b70bf7 321 break;
mverdy 20:626b92b70bf7 322
mverdy 20:626b92b70bf7 323 default:
mverdy 20:626b92b70bf7 324 status = GO_STATUS_BAD_ARG;
mverdy 20:626b92b70bf7 325 }
mverdy 20:626b92b70bf7 326 return status;
mverdy 20:626b92b70bf7 327 }
mverdy 20:626b92b70bf7 328
mverdy 20:626b92b70bf7 329 void DisplayDriverDrawLogo( uint8_t *thisBmp, uint8_t xPos, uint8_t yPos )
mverdy 20:626b92b70bf7 330 {
mverdy 20:626b92b70bf7 331 if( BmpReadHeader( thisBmp ) )
mverdy 20:626b92b70bf7 332 {
mverdy 20:626b92b70bf7 333 DrawBmpFromFlash( thisBmp, xPos, yPos );
mverdy 20:626b92b70bf7 334 }
mverdy 20:626b92b70bf7 335 }
mverdy 20:626b92b70bf7 336
lex9296 21:ab8027016a2c 337 void TouchedXYT (uint16_t* x, uint16_t* y, bool* t) {
lex9296 21:ab8027016a2c 338 uint16_t ui16_x;
lex9296 21:ab8027016a2c 339 uint16_t ui16_y;
lex9296 21:ab8027016a2c 340 bool b_t;
lex9296 21:ab8027016a2c 341 Touch.readTouchData (ui16_x,
lex9296 21:ab8027016a2c 342 ui16_y,
lex9296 21:ab8027016a2c 343 b_t);
lex9296 21:ab8027016a2c 344
lex9296 21:ab8027016a2c 345 *x = ui16_x;
lex9296 21:ab8027016a2c 346 *y = ui16_y;
lex9296 21:ab8027016a2c 347 *t = b_t;
lex9296 21:ab8027016a2c 348 }
lex9296 21:ab8027016a2c 349
mverdy 20:626b92b70bf7 350 GraphObjectStatus_t GraphObjectTouched( GraphObject_t* objects, \
mverdy 20:626b92b70bf7 351 uint8_t objectsCount, \
mverdy 20:626b92b70bf7 352 uint8_t* touchedObject)
mverdy 20:626b92b70bf7 353 {
mverdy 20:626b92b70bf7 354 uint8_t objScan;
mverdy 20:626b92b70bf7 355 uint16_t x, y = 0;
mverdy 20:626b92b70bf7 356 bool touched = false;
mverdy 20:626b92b70bf7 357 GraphObjectStatus_t status = GO_STATUS_BAD_COORD;
mverdy 20:626b92b70bf7 358
mverdy 20:626b92b70bf7 359 if( Touch.isTouched( ) )
mverdy 20:626b92b70bf7 360 {
mverdy 20:626b92b70bf7 361 Touch.readTouchData( x, y, touched );
mverdy 20:626b92b70bf7 362
mverdy 20:626b92b70bf7 363 if( touched == true )
mverdy 20:626b92b70bf7 364 {
mverdy 20:626b92b70bf7 365 for( objScan = 0; objScan < objectsCount; objScan++)
mverdy 20:626b92b70bf7 366 {
mverdy 20:626b92b70bf7 367 if( objects[objScan].TouchActive == true )
mverdy 20:626b92b70bf7 368 {
mverdy 20:626b92b70bf7 369 if( ( y >= objects[objScan].Ypos ) && ( y <= ( objects[objScan].Ypos + objects[objScan].Height - 1 ) ) )
mverdy 20:626b92b70bf7 370 {
mverdy 20:626b92b70bf7 371 if( ( x >= objects[objScan].Xpos ) && ( x <= ( objects[objScan].Xpos + objects[objScan].Width - 1 ) ) )
mverdy 20:626b92b70bf7 372 {
mverdy 20:626b92b70bf7 373 *touchedObject = objects[objScan].Id;
mverdy 20:626b92b70bf7 374 status = GO_STATUS_NOERR;
mverdy 20:626b92b70bf7 375 break; // return the first object match and no scan of other following objects
mverdy 20:626b92b70bf7 376 }
mverdy 20:626b92b70bf7 377 }
mverdy 20:626b92b70bf7 378 }
mverdy 20:626b92b70bf7 379 }
mverdy 20:626b92b70bf7 380 }
mverdy 20:626b92b70bf7 381 }
mverdy 20:626b92b70bf7 382
mverdy 20:626b92b70bf7 383 return status;
mverdy 20:626b92b70bf7 384 }
mverdy 20:626b92b70bf7 385
mverdy 20:626b92b70bf7 386 static bool BmpReadHeader( uint8_t *thisBmp )
mverdy 20:626b92b70bf7 387 {
mverdy 20:626b92b70bf7 388 uint16_t pos = 0;
mverdy 20:626b92b70bf7 389
mverdy 20:626b92b70bf7 390 Read16( thisBmp );
mverdy 20:626b92b70bf7 391 if( Read16( thisBmp ) != 0x4D42 )
mverdy 20:626b92b70bf7 392 { // read magic byte
mverdy 20:626b92b70bf7 393 return false;
mverdy 20:626b92b70bf7 394 }
mverdy 20:626b92b70bf7 395 pos += 2;
mverdy 20:626b92b70bf7 396
mverdy 20:626b92b70bf7 397 // read file size
mverdy 20:626b92b70bf7 398 pos += 4;
mverdy 20:626b92b70bf7 399 pos += 4; // Skip creator bytes
mverdy 20:626b92b70bf7 400 BmpImageoffset = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 401 pos += 4;
mverdy 20:626b92b70bf7 402 // read DIB header
mverdy 20:626b92b70bf7 403 pos +=4;
mverdy 20:626b92b70bf7 404 BmpWidth = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 405 pos += 4;
mverdy 20:626b92b70bf7 406 BmpHeight = Read32( thisBmp + pos );
mverdy 20:626b92b70bf7 407 pos += 4;
mverdy 20:626b92b70bf7 408 if( Read16( thisBmp + pos ) != 1 )
mverdy 20:626b92b70bf7 409 {
mverdy 20:626b92b70bf7 410 // number of color planes must be 1
mverdy 20:626b92b70bf7 411 return false;
mverdy 20:626b92b70bf7 412 }
mverdy 20:626b92b70bf7 413 pos += 2;
mverdy 20:626b92b70bf7 414 pos += 2;
mverdy 20:626b92b70bf7 415 if( Read16( thisBmp + pos ) != 0 )
mverdy 20:626b92b70bf7 416 {
mverdy 20:626b92b70bf7 417 return false; // compression not supported!
mverdy 20:626b92b70bf7 418 }
mverdy 20:626b92b70bf7 419 pos += 2; // Should really be 2??
mverdy 20:626b92b70bf7 420 return true;
mverdy 20:626b92b70bf7 421 }
mverdy 20:626b92b70bf7 422
mverdy 20:626b92b70bf7 423 // LITTLE ENDIAN!
mverdy 20:626b92b70bf7 424 static uint16_t Read16( uint8_t *src )
mverdy 20:626b92b70bf7 425 {
mverdy 20:626b92b70bf7 426 uint16_t d;
mverdy 20:626b92b70bf7 427 uint8_t b;
mverdy 20:626b92b70bf7 428 b = *src;
mverdy 20:626b92b70bf7 429 d = *( src + 1 );
mverdy 20:626b92b70bf7 430 d <<= 8;
mverdy 20:626b92b70bf7 431 d |= b;
mverdy 20:626b92b70bf7 432 return d;
mverdy 20:626b92b70bf7 433 }
mverdy 20:626b92b70bf7 434
mverdy 20:626b92b70bf7 435 // LITTLE ENDIAN!
mverdy 20:626b92b70bf7 436 static uint32_t Read32( uint8_t *src )
mverdy 20:626b92b70bf7 437 {
mverdy 20:626b92b70bf7 438 uint32_t d;
mverdy 20:626b92b70bf7 439 uint16_t b;
mverdy 20:626b92b70bf7 440
mverdy 20:626b92b70bf7 441 b = Read16( src );
mverdy 20:626b92b70bf7 442 d = Read16( src + 2 );
mverdy 20:626b92b70bf7 443 d <<= 16;
mverdy 20:626b92b70bf7 444 d |= b;
mverdy 20:626b92b70bf7 445 return d;
mverdy 20:626b92b70bf7 446 }
mverdy 20:626b92b70bf7 447
mverdy 20:626b92b70bf7 448 static void DrawBmpFromFlash( uint8_t *thisBmp, int xPos, int yPos )
mverdy 20:626b92b70bf7 449 {
mverdy 20:626b92b70bf7 450 uint16_t pos = BmpImageoffset;
mverdy 20:626b92b70bf7 451 uint16_t p; // pixel
mverdy 20:626b92b70bf7 452 uint8_t g;
mverdy 20:626b92b70bf7 453 uint8_t b;
mverdy 20:626b92b70bf7 454 int i, j; // line, column
mverdy 20:626b92b70bf7 455
mverdy 20:626b92b70bf7 456 for( i = BmpHeight; i > 0; i-- )
mverdy 20:626b92b70bf7 457 {
mverdy 20:626b92b70bf7 458 for( j = 0; j < BmpWidth; j++ )
mverdy 20:626b92b70bf7 459 {
mverdy 20:626b92b70bf7 460 b = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 461 g = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 462 p = *( thisBmp + pos++ );
mverdy 20:626b92b70bf7 463
mverdy 20:626b92b70bf7 464 p >>= 3;
mverdy 20:626b92b70bf7 465 p <<= 6;
mverdy 20:626b92b70bf7 466
mverdy 20:626b92b70bf7 467 g >>= 2;
mverdy 20:626b92b70bf7 468 p |= g;
mverdy 20:626b92b70bf7 469 p <<= 5;
mverdy 20:626b92b70bf7 470
mverdy 20:626b92b70bf7 471 b >>= 3;
mverdy 20:626b92b70bf7 472 p |= b;
mverdy 20:626b92b70bf7 473
mverdy 20:626b92b70bf7 474 // write out the 16 bits of color
mverdy 20:626b92b70bf7 475 Tft.setPixel( j + xPos, i + yPos, p );
mverdy 20:626b92b70bf7 476 }
mverdy 20:626b92b70bf7 477 pos += 1;
mverdy 20:626b92b70bf7 478 }
mverdy 20:626b92b70bf7 479 }
mverdy 20:626b92b70bf7 480
lex9296 27:654100855f5c 481 void LCM_ClearScreen (uint16_t color) {
lex9296 27:654100855f5c 482 Tft.clearScreen (color);
lex9296 27:654100855f5c 483 }
lex9296 27:654100855f5c 484
lex9296 27:654100855f5c 485 void LCM_DrawString (uint16_t x, uint16_t y, const char *p) {
lex9296 27:654100855f5c 486 Tft.drawString (x, y, (char *)p);
lex9296 27:654100855f5c 487 }
lex9296 27:654100855f5c 488
lex9296 27:654100855f5c 489 void LCM_SetTextColor (uint16_t background, uint16_t foreground) {
lex9296 27:654100855f5c 490 Tft.setTextColor (background, foreground);
lex9296 27:654100855f5c 491 }
lex9296 27:654100855f5c 492
lex9296 30:e45282a70a4d 493 void LCM_SetPixel (uint16_t ui_X, uint16_t ui_Y, uint16_t ui16_Color) {
lex9296 30:e45282a70a4d 494 Tft.setPixel (ui_X, ui_Y, ui16_Color);
lex9296 30:e45282a70a4d 495 }
lex9296 30:e45282a70a4d 496
lex9296 30:e45282a70a4d 497 void LCM_DrawLine (uint16_t ui_X0, uint16_t ui_Y0, uint16_t ui_X1, uint16_t ui_Y1, uint16_t ui16_Color) {
lex9296 30:e45282a70a4d 498 Tft.drawLine (ui_X0, ui_Y0, ui_X1, ui_Y1, ui16_Color);
lex9296 30:e45282a70a4d 499 }
lex9296 30:e45282a70a4d 500
lex9296 30:e45282a70a4d 501 DmTftBase & getDmTft(){
lex9296 30:e45282a70a4d 502 return Tft;
lex9296 30:e45282a70a4d 503 }
lex9296 30:e45282a70a4d 504
lex9296 27:654100855f5c 505 // LA: Color RGB Component(s)
lex9296 27:654100855f5c 506 // ======================
lex9296 27:654100855f5c 507 //
lex9296 27:654100855f5c 508 // RED 0000 1000 0000 0000 min 0x0800 02048
lex9296 27:654100855f5c 509 // 1111 1000 0000 0000 max 0xf800 63488
lex9296 27:654100855f5c 510 //
lex9296 27:654100855f5c 511 // GREEN 0000 0000 0010 0000 min 0x0020 00032 Real
lex9296 27:654100855f5c 512 // 0000 0111 1110 0000 max 0x07e0 02016
lex9296 27:654100855f5c 513 //
lex9296 27:654100855f5c 514 // GREEN 0000 0000 0100 0000 min 0x0040 00064 This
lex9296 27:654100855f5c 515 // 0000 0111 1100 0000 max 0x07c0 01984
lex9296 27:654100855f5c 516 //
lex9296 27:654100855f5c 517 // BLUE 0000 0000 0000 0001 min 0x0001 00001
lex9296 27:654100855f5c 518 // 0000 0000 0001 1111 max 0x001f 00031
lex9296 27:654100855f5c 519 //
lex9296 27:654100855f5c 520 // La componente ROSSA ha 5 bit di escursione (0.. 31),
lex9296 27:654100855f5c 521 // La componente VERDE ha 6 bit di escursione (0.. 63), Normalmente
lex9296 27:654100855f5c 522 // La componente VERDE ha 5 bit di escursione (0.. 31), In qst applicazione
lex9296 27:654100855f5c 523 // La componente BLU ha 5 bit di escursione (0.. 31),
lex9296 27:654100855f5c 524 //
lex9296 27:654100855f5c 525 // Le componenti RGB di "Color" sono quindi scritte negli appropriati registri come segue:
lex9296 27:654100855f5c 526 //
lex9296 27:654100855f5c 527 // writeReg(RED, (Color & 0xf800) >> 11);
lex9296 27:654100855f5c 528 // writeReg(GREEN, (Color & 0x07e0) >> 5);
lex9296 27:654100855f5c 529 // writeReg(BLUE, (Color & 0x001f));
lex9296 27:654100855f5c 530 //
lex9296 27:654100855f5c 531 uint16_t Scale2RGBColor (uint16_t R, uint16_t G, uint16_t B) {
lex9296 27:654100855f5c 532
lex9296 27:654100855f5c 533 R = ((R& 0x1f)<< 11)& 0xf800;
lex9296 27:654100855f5c 534 G = ((G& 0x1f)<< 6)& 0x07c0;
lex9296 27:654100855f5c 535 B &= 0x001f;
lex9296 27:654100855f5c 536 //
lex9296 27:654100855f5c 537 return (R+ G+ B);
lex9296 27:654100855f5c 538 }
lex9296 27:654100855f5c 539
lex9296 30:e45282a70a4d 540 extern float af_PlotSamples[240];
lex9296 30:e45282a70a4d 541 extern uint16_t aui16_PlotSamples[240];
lex9296 30:e45282a70a4d 542 extern uint16_t aui16_PlotClears_Lo[240];
lex9296 30:e45282a70a4d 543 extern uint16_t aui16_PlotClears_Hi[240];
lex9296 30:e45282a70a4d 544
lex9296 33:f77aa3ecf87d 545 void LCM_PlotScope (uint16_t ui16_Background, uint16_t ui16_Foreground) {
lex9296 30:e45282a70a4d 546 uint16_t ui16_Index000;
lex9296 30:e45282a70a4d 547
lex9296 30:e45282a70a4d 548 // LA: Scope Bar Plot, Theory of Operation
lex9296 30:e45282a70a4d 549 // ===================================
lex9296 30:e45282a70a4d 550 //
lex9296 30:e45282a70a4d 551 // Any pixel of the Horizontal Scope Line will be plot, thus, I can play with VERTICAL lines only instead of Point2Point Lines.
lex9296 30:e45282a70a4d 552 // Any Vertical Line will start from where the previous plot ended, The Vertical Length is the difference among the Plots
lex9296 30:e45282a70a4d 553 //
lex9296 30:e45282a70a4d 554 // In order to clear the previous plot, 2 arrays have been created.
lex9296 30:e45282a70a4d 555 // There, it is possible to hold the components of any line that has been previously written on any Vertical
lex9296 30:e45282a70a4d 556 // Before writing a new vertical, Simply clear the previous.
lex9296 30:e45282a70a4d 557 //
lex9296 30:e45282a70a4d 558 for (ui16_Index000 = 1; ui16_Index000 < 240; ui16_Index000++) {
lex9296 30:e45282a70a4d 559
lex9296 30:e45282a70a4d 560 // LA: Clear Previous Plot by means of the Hi/Lo Array(s)
lex9296 30:e45282a70a4d 561 //
lex9296 32:1be3d79ff4db 562 Tft.drawVerticalLineEx (ui16_Index000, 300 - aui16_PlotClears_Hi[ui16_Index000], (int16_t) aui16_PlotClears_Hi[ui16_Index000]- aui16_PlotClears_Lo[ui16_Index000], ui16_Background);
lex9296 30:e45282a70a4d 563
lex9296 30:e45282a70a4d 564 // LA: Then PLOT the New
lex9296 30:e45282a70a4d 565 //
lex9296 30:e45282a70a4d 566 aui16_PlotClears_Hi[ui16_Index000] = (uint16_t) (af_PlotSamples[ui16_Index000]* 100);
lex9296 30:e45282a70a4d 567 aui16_PlotClears_Lo[ui16_Index000] = (uint16_t) (af_PlotSamples[ui16_Index000- 1]* 100);
lex9296 30:e45282a70a4d 568 //
lex9296 32:1be3d79ff4db 569 Tft.drawVerticalLineEx (ui16_Index000, 300 - aui16_PlotClears_Hi[ui16_Index000], (int16_t) aui16_PlotClears_Hi[ui16_Index000]- aui16_PlotClears_Lo[ui16_Index000], ui16_Foreground);
lex9296 30:e45282a70a4d 570 }
lex9296 30:e45282a70a4d 571 }
lex9296 33:f77aa3ecf87d 572
lex9296 34:0522cebfe489 573 //extern const int64_t ci64_TargetPOS = 3096; //
lex9296 34:0522cebfe489 574 extern int64_t ci64_TargetPOS;
lex9296 33:f77aa3ecf87d 575
lex9296 33:f77aa3ecf87d 576 extern int32_t ai32_POS2VelGraph[4000];
lex9296 33:f77aa3ecf87d 577 extern uint16_t aui16_PlotPOS2VelSamples[240];
lex9296 33:f77aa3ecf87d 578 extern uint16_t aui16_PlotPOS2VelClears_Lo[240];
lex9296 33:f77aa3ecf87d 579 extern uint16_t aui16_PlotPOS2VelClears_Hi[240];
lex9296 33:f77aa3ecf87d 580
lex9296 33:f77aa3ecf87d 581 extern int32_t ai32_POS2AccGraph[4000];
lex9296 33:f77aa3ecf87d 582 extern int32_t ai32_POS2JrkGraph[4000];
lex9296 33:f77aa3ecf87d 583
lex9296 33:f77aa3ecf87d 584 void LCM_PlotSpeed (uint16_t ui16_Background, uint16_t ui16_Foreground) {
lex9296 33:f77aa3ecf87d 585 uint16_t ui16_Index000;
lex9296 33:f77aa3ecf87d 586
lex9296 33:f77aa3ecf87d 587 for (ui16_Index000 = 1; ui16_Index000 < 240; ui16_Index000++) {
lex9296 33:f77aa3ecf87d 588
lex9296 33:f77aa3ecf87d 589 // LA: Clear Previous Plot by means of the Hi/Lo Array(s)
lex9296 33:f77aa3ecf87d 590 //
lex9296 34:0522cebfe489 591 Tft.drawVerticalLineEx (ui16_Index000, 175 - aui16_PlotPOS2VelClears_Hi[ui16_Index000], (int16_t) aui16_PlotPOS2VelClears_Hi[ui16_Index000]- aui16_PlotPOS2VelClears_Lo[ui16_Index000], ui16_Background);
lex9296 33:f77aa3ecf87d 592
lex9296 33:f77aa3ecf87d 593 // LA: Then PLOT the New
lex9296 33:f77aa3ecf87d 594 //
lex9296 36:cab8aa44ef91 595 aui16_PlotPOS2VelClears_Hi[ui16_Index000] = (uint16_t) (ai32_POS2VelGraph[(ui16_Index000* ci64_TargetPOS)/ 240]* 2);
lex9296 36:cab8aa44ef91 596 aui16_PlotPOS2VelClears_Lo[ui16_Index000] = (uint16_t) (ai32_POS2VelGraph[((ui16_Index000* ci64_TargetPOS)/ 240)- 1]* 2);
lex9296 33:f77aa3ecf87d 597 //
lex9296 34:0522cebfe489 598 Tft.drawVerticalLineEx (ui16_Index000, 175 - aui16_PlotPOS2VelClears_Hi[ui16_Index000], (int16_t) aui16_PlotPOS2VelClears_Hi[ui16_Index000]- aui16_PlotPOS2VelClears_Lo[ui16_Index000], ui16_Foreground);
lex9296 33:f77aa3ecf87d 599 }
lex9296 33:f77aa3ecf87d 600 }