1st Fork

Dependencies:   mbed QEI DmTftLibrary

Revision:
19:45d0ce0f0677
Parent:
18:22796c3be774
Child:
20:626b92b70bf7
--- a/Display/DisplayDriver.cpp	Fri Aug 24 08:01:53 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,466 +0,0 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: Display driver implementation
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
-#include "mbed.h"
-#include "Eeprom.h"
-#include "DisplayDriver.h"
-#include "DmTftIli9341.h"
-#include "DmTouch.h"
-#include "DmTouchCalibration.h"
-
-
-//If DISPLAY_INVERT is defined as 1 then the display will be inverted from its native orientation
-#define DISPLAY_INVERT      1
-
-#define MAX_GO_STRING       30
-#define SPACE_ASCII         0x20
-#define FONT_WIDTH          8
-
-// DmTftIli9341( PinName cs, PinName dc, PinName mosi, PinName miso, PinName clk )
-// DM_TFT28_105
-DmTftIli9341 Tft( D10, D9, D11, D12, D13 );
-DmTouch Touch( DmTouch::DM_TFT28_105, D9, D11, D12 );
-DmTouchCalibration Calibration = DmTouchCalibration( &Tft, &Touch );
-
-/* 
- * Used only to define pull-up on the CS lines
- */
-DigitalInOut CsTouch( D4, PIN_OUTPUT, PullUp, 1 );
-DigitalInOut CsDisplay( D10, PIN_OUTPUT, PullUp, 1 );
-DigitalInOut CsSDCard( D8, PIN_OUTPUT, PullUp, 1 );
-DigitalInOut CsFlash( D6, PIN_OUTPUT, PullUp, 1 );
-
-MenuSettings_t MenuSettings;
-char GoTmpString[MAX_GO_STRING];
-
-
-static int BmpWidth;
-static int BmpHeight;
-static uint8_t BmpImageoffset;
-
-static bool BmpReadHeader( uint8_t *thisBmp );
-static uint16_t Read16( uint8_t *src );
-static uint32_t Read32( uint8_t *src );
-static void DrawBmpFromFlash( uint8_t *thisBmp, int x, int y );
-
-
-void DisplayDriverInit( void )
-{
-    Tft.init( );
-    Touch.init( );
-
-    DisplayDriverCalibrate( );
-    Tft.clearScreen( );
-
-    for( uint8_t i = 0; i < MAX_GO_STRING; i++) GoTmpString[i] = SPACE_ASCII;
-}
-
-// Calibrates the touch screen
-void DisplayDriverCalibrate( void )
-{
-    uint16_t x, y = 0;
-    bool touched = false;
-
-    if( Eeprom.EepromData.MenuSettings.ScreenCalibrated == false )
-    {
-        Tft.drawString( 5, 5, "Press and hold on cross" );
-        Tft.drawString( 5, 25, "until it turns green. " );
-
-        Point displayRefPoint[5];
-        Point touchRefPoint[5];
-
-        if( Calibration.getTouchReferencePoints( displayRefPoint, touchRefPoint,\
-            Tft.width( ), Tft.height( ) ) )
-        {
-            CalibrationMatrix calibrationMatrix = \
-                Calibration.calculateCalibrationMatrix( displayRefPoint, \
-                                                        touchRefPoint );
-
-            Touch.setCalibrationMatrix( calibrationMatrix );
-            Tft.clearScreen( );
-            Eeprom.EepromData.MenuSettings.Calibration.a = calibrationMatrix.a;
-            Eeprom.EepromData.MenuSettings.Calibration.b = calibrationMatrix.b;
-            Eeprom.EepromData.MenuSettings.Calibration.c = calibrationMatrix.c;
-            Eeprom.EepromData.MenuSettings.Calibration.d = calibrationMatrix.d;
-            Eeprom.EepromData.MenuSettings.Calibration.e = calibrationMatrix.e;
-            Eeprom.EepromData.MenuSettings.Calibration.f = calibrationMatrix.f;
-            Eeprom.EepromData.MenuSettings.ScreenCalibrated = true;
-            EepromSaveSettings( SCREEN_DATA );
-        }
-        else
-        {
-            Tft.clearScreen( );
-            Tft.drawString( 5, 5, "Calibration failed" );
-            Tft.drawString( 5, 25, "Please try again." );
-            delay( 2000 );
-            Tft.clearScreen( );
-            return;
-        }
-    }
-    else
-    {
-        Touch.setCalibrationMatrix( Eeprom.EepromData.MenuSettings.Calibration );
-        Tft.clearScreen( );
-    }
-
-    if( Touch.isTouched( ) )
-    {
-        Touch.readTouchData( x, y, touched );
-        Calibration.drawCalibPoint( x, y );
-    }
-}
-
-GraphObjectStatus_t GraphObjectDraw( GraphObject_t* goObject, uint8_t* source, \
-                                     bool doFill, bool activeTouch)
-{
-    GraphObjectStatus_t status = GO_STATUS_NOERR;
-    uint8_t maxChar;
-
-    if( goObject == NULL )
-    {
-        return GO_STATUS_BAD_ARG;
-    }
-    if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
-    {
-        return GO_STATUS_BAD_COORD;
-    }
-    if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
-    {
-        return GO_STATUS_BAD_COORD;
-    }
-    switch( goObject->Type )
-    {
-        case GO_TEXT:
-            if( source == NULL )
-            {
-                status = GO_STATUS_BAD_ARG;
-            }
-            else
-            {
-                uint8_t i = 0;
-                uint8_t j = 0;
-                // max character in the object string
-                maxChar = goObject->Width / FONT_WIDTH;
-                Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
-                for( i = 0; i < maxChar; i++)
-                {
-                    if( *source != 0 )
-                    {
-                        Tft.drawChar( goObject->Xpos + j, goObject->Ypos, \
-                                      ( char )*( source++ ), false );
-                        j += FONT_WIDTH;
-                    }
-                    else
-                    {
-                        Tft.drawChar( goObject->Xpos + ( FONT_WIDTH * i ), \
-                                      goObject->Ypos, SPACE_ASCII, false);
-                    }
-                }
-                goObject->TouchActive = activeTouch;
-            }
-            break;
-
-        case GO_RECTANGLE:
-            Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
-                               goObject->Width - 1, goObject->Ypos + \
-                               goObject->Height - 1, goObject->FrontColor );
-            if( doFill )
-            {
-                Tft.fillRectangle( goObject->Xpos + 1, goObject->Ypos + 1, \
-                                   goObject->Xpos + goObject->Width - 2, \
-                                   goObject->Ypos + goObject->Height - 2, \
-                                   goObject->FillColor );
-            }
-            goObject->TouchActive = activeTouch;
-            break;
-
-        case GO_CIRCLE:
-            Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
-                            ( goObject->Height < goObject->Width ) ? \
-                              ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
-                            goObject->FrontColor );
-            if( doFill )
-            {
-                Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
-                                ( goObject->Height < goObject->Width ) ? \
-                                  ( goObject->Height / 2 ) - 1 : ( goObject->Width / 2 ) - 1, \
-                                goObject->FillColor );
-            }
-            goObject->TouchActive = activeTouch;
-            break;
-
-        case GO_TRIANGLE:
-            status = GO_STATUS_BAD_ARG;
-            break;
-
-        case GO_IMAGE:
-            if( source == NULL )
-            {
-                status = GO_STATUS_BAD_ARG;
-            }
-            else
-            {
-                if( BmpReadHeader( goObject->Source ) )
-                {
-                    DrawBmpFromFlash( goObject->Source, goObject->Xpos, \
-                                      goObject->Ypos );
-                }
-                else
-                {
-                    // draw a red rectangle with a line through, to show error
-                    Tft.drawRectangle( goObject->Xpos, goObject->Ypos, \
-                                       goObject->Xpos + goObject->Width - 1, \
-                                       goObject->Ypos + goObject->Height - 1, \
-                                       OBJECT_ERROR );
-                    Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
-                                  goObject->Width - 1, goObject->Ypos + \
-                                  goObject->Height - 1, OBJECT_ERROR );
-                }
-                goObject->TouchActive = activeTouch;
-            }
-            break;
-
-        case GO_LINE:
-            Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
-                                  goObject->Width - 1, goObject->Ypos + \
-                                  goObject->Height - 1, goObject->FrontColor );
-            break;
-
-        default:
-            status = GO_STATUS_BAD_ARG;
-    }
-    return status;
-}
-
-GraphObjectStatus_t GraphObjectClear( GraphObject_t* goObject, bool doFill )
-{
-    GraphObjectStatus_t status = GO_STATUS_NOERR;
-    uint8_t maxChar;
-
-    if( goObject == NULL )
-    {
-        return GO_STATUS_BAD_ARG;
-    }
-    if( goObject->Xpos + goObject->Width > SCREEN_WIDTH )
-    {
-        return GO_STATUS_BAD_COORD;
-    }
-    if( goObject->Ypos + goObject->Height > SCREEN_HEIGHT )
-    {
-        return GO_STATUS_BAD_COORD;
-    }
-    switch( goObject->Type )
-    {
-        case GO_TEXT:
-            // max character in the object string
-            maxChar = goObject->Width / FONT_WIDTH;
-            GoTmpString[maxChar] = NULL;
-            Tft.setTextColor( goObject->BackColor, goObject->FrontColor );
-            Tft.drawString( goObject->Xpos, goObject->Ypos, GoTmpString );
-            GoTmpString[maxChar] = SPACE_ASCII;
-            goObject->TouchActive = false;
-            break;
-
-        case GO_RECTANGLE:
-        case GO_IMAGE:
-            if( doFill )
-            {
-                Tft.fillRectangle( goObject->Xpos, goObject->Ypos, \
-                                   goObject->Xpos + goObject->Width - 1, \
-                                   goObject->Ypos + goObject->Height - 1, \
-                                   goObject->BackColor );
-            }
-            else
-            {
-                Tft.drawRectangle( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
-                                   goObject->Width - 1, goObject->Ypos + \
-                                   goObject->Height - 1, goObject->BackColor );
-            }
-            goObject->TouchActive = false;
-            break;
-
-        case GO_CIRCLE:
-            if( doFill )
-            {
-                Tft.fillCircle( goObject->Xpos, goObject->Ypos, \
-                                ( goObject->Height < goObject->Width ) ? \
-                                  ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
-                                goObject->BackColor );
-            }
-            else
-            {
-                Tft.drawCircle( goObject->Xpos, goObject->Ypos, \
-                                ( goObject->Height < goObject->Width ) ? \
-                                  ( goObject->Height / 2 ) : ( goObject->Width / 2 ), \
-                                goObject->BackColor );
-            }
-            goObject->TouchActive = false;
-            break;
-
-        case GO_TRIANGLE:
-            status = GO_STATUS_BAD_ARG;
-            goObject->TouchActive = false;
-            break;
-
-        case GO_LINE:
-            Tft.drawLine( goObject->Xpos, goObject->Ypos, goObject->Xpos + \
-                                  goObject->Width - 1, goObject->Ypos + \
-                                  goObject->Height - 1, goObject->BackColor );
-            goObject->TouchActive = false;
-            break;
-
-        default:
-            status = GO_STATUS_BAD_ARG;
-    }
-    return status;
-}
-
-void DisplayDriverDrawLogo( uint8_t *thisBmp, uint8_t xPos, uint8_t yPos )
-{
-    if( BmpReadHeader( thisBmp ) )
-    {
-        DrawBmpFromFlash( thisBmp, xPos, yPos );
-    }
-}
-
-GraphObjectStatus_t GraphObjectTouched( GraphObject_t* objects, \
-                                        uint8_t objectsCount, \
-                                        uint8_t* touchedObject)
-{
-    uint8_t objScan;
-    uint16_t x, y = 0;
-    bool touched = false;
-    GraphObjectStatus_t status = GO_STATUS_BAD_COORD;
-
-    if( Touch.isTouched( ) )
-    {
-        Touch.readTouchData( x, y, touched );
-
-        if( touched == true )
-        {
-            for( objScan = 0; objScan < objectsCount; objScan++)
-            {
-                if( objects[objScan].TouchActive == true )
-                {
-                    if( ( y >= objects[objScan].Ypos ) && ( y <= ( objects[objScan].Ypos + objects[objScan].Height - 1 ) ) )
-                    {
-                        if( ( x >= objects[objScan].Xpos ) && ( x <= ( objects[objScan].Xpos + objects[objScan].Width - 1 ) ) )
-                        {
-                            *touchedObject = objects[objScan].Id;
-                            status = GO_STATUS_NOERR;
-                            break;      // return the first object match and no scan of other following objects
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    return status;
-}
-
-static bool BmpReadHeader( uint8_t *thisBmp )
-{
-    uint16_t pos = 0;
-
-    Read16( thisBmp );
-    if( Read16( thisBmp ) != 0x4D42 )
-    { // read magic byte
-        return false;
-    }
-    pos += 2;
-
-    // read file size
-    pos += 4;
-    pos += 4; // Skip creator bytes
-    BmpImageoffset = Read32( thisBmp + pos );
-    pos += 4;
-    // read DIB header
-    pos +=4;
-    BmpWidth = Read32( thisBmp + pos );
-    pos += 4;
-    BmpHeight = Read32( thisBmp + pos );
-    pos += 4;
-    if( Read16( thisBmp + pos ) != 1 )
-    {
-        // number of color planes must be 1
-        return false;
-    }
-    pos += 2;
-    pos += 2;
-    if( Read16( thisBmp + pos ) != 0 )
-    {
-        return false; // compression not supported!
-    }
-    pos += 2; // Should really be 2??
-    return true;
-}
-
-// LITTLE ENDIAN!
-static uint16_t Read16( uint8_t *src )
-{
-    uint16_t d;
-    uint8_t b;
-    b = *src;
-    d = *( src + 1 );
-    d <<= 8;
-    d |= b;
-    return d;
-}
-
-// LITTLE ENDIAN!
-static uint32_t Read32( uint8_t *src )
-{
-    uint32_t d;
-    uint16_t b;
-
-    b = Read16( src );
-    d = Read16( src + 2 );
-    d <<= 16;
-    d |= b;
-    return d;
-}
-
-static void DrawBmpFromFlash( uint8_t *thisBmp, int xPos, int yPos )
-{
-    uint16_t pos = BmpImageoffset;
-    uint16_t p;  // pixel
-    uint8_t g;
-    uint8_t b;
-    int i, j; // line, column
-
-    for( i = BmpHeight; i > 0; i-- )
-    {
-        for( j = 0; j < BmpWidth; j++ )
-        {
-            b = *( thisBmp + pos++ );
-            g = *( thisBmp + pos++ );
-            p = *( thisBmp + pos++ );
-
-            p >>= 3;
-            p <<= 6;
-
-            g >>= 2;
-            p |= g;
-            p <<= 5;
-
-            b >>= 3;
-            p |= b;
-
-            // write out the 16 bits of color
-            Tft.setPixel( j + xPos, i + yPos, p );
-        }
-        pos += 1;
-    }
-}