// Built with BFTC Rev. 1.0.0, mer 20 agosto 2014 11:09:24

 

/*

    Copyright 2014 Digital Technology Art SRL

    This file is part of Blackfin Toolchain (BFTC) project.

 

    BFTC is free software: you can redistribute it and/or modify

    it under the terms of the GNU General Public License as published by

    the Free Software Foundation, either version 3 of the License, or

    (at your option) any later version.

 

    BFTC is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

    GNU General Public License for more details.

 

    You should have received a copy of the GNU General Public License

    along with Nome-Programma.  If not, see <http://www.gnu.org/licenses/>.

*/

 

#include "main.h"

 

#include <stdlib.h>

 

unsigned randx(unsigned val)

{

    return Get_TimerCounter(TIMER_0) * 0x1961957 + val;

}

 

gCOL const colorIndex[16] ={TFT_BLACK,

                            TFT_NAVY,

                            TFT_DARK_GREEN,

                            TFT_DARK_CYAN,

                            TFT_MAROON,

                            TFT_PURPLE,

                            TFT_OLIVE,

                            TFT_LIGHT_GRAY,

                            TFT_DARK_GRAY,

                            TFT_BLUE,

                            TFT_GREEN,

                            TFT_CYAN,

                            TFT_RED,

                            TFT_MAGENTA,

                            TFT_YELLOW,

                            TFT_WHITE

};

 

void TFT_ColorTest()

{

    unsigned int    i,j;

    Set_TFThome();

 

    // Draw vertical stripes

    for(i = 0; i < 320; i++)

    {

        for(j = 0; j < 240; j++)

        {

            if(i > 279)         Set_TFTdata16(TFT_BLACK);

            else if(i > 239)    Set_TFTdata16(TFT_BLUE);

            else if(i > 199)    Set_TFTdata16(TFT_GREEN);

            else if(i > 159)    Set_TFTdata16(TFT_CYAN);

            else if(i > 119)    Set_TFTdata16(TFT_RED);

            else if(i > 79)     Set_TFTdata16(TFT_MAGENTA);

            else if(i > 39)     Set_TFTdata16(TFT_YELLOW);

            else                Set_TFTdata16(TFT_WHITE);

        }

    }

}

 

void CLineDemo()

{

    gInt x0, y0;

    gInt x1, y1;

    gInt color;  

    gInt no;

    const gInt CENTER_X = 160;

    const gInt CENTER_Y = 120;

    Set_TFThome();  // Set display window to maximum size

    for(no = 0; no < 5000; no++)

    {

        x0 = randx(x0) % 320;

        y0 = randx(y0) % 160;

        color = no % 16;

        x1 = 2 * CENTER_X - x0;

        y1 = 2 * CENTER_Y - y0;

        gxLine(x0, y0, x1, y1, colorIndex[color]);

    }

    gxClear(TFT_BLACK);

}

 

void CRectangleFilledDemo()

{

    gInt x0, y0;

    gInt x1, y1;

    gInt color;

    gInt no;

     

    for(no = 0; no < 500; no++)

    {

        x0 = randx(x0) % 160;

        y0 = randx(y0) % 120;

        color = no % 16;

        x1 = x0 + randx(x1) % 160;

        y1 = y0 + randx(y1) % 120;

        gxRectFilled(x0, y0, x1, y1, colorIndex[color]);

    }

    gxClear(TFT_BLACK);

}

 

void CRectangleDemo()

{

    gInt x0, y0;

    gInt x1, y1;

    gInt color;

    gInt no;

     

    for(no = 0; no < 5000; no++)

    {

        x0 = randx(x0) % 160;

        y0 = randx(y0) % 120;

        color = no % 16;

        x1 = x0 + randx(x1) % 160;

        y1 = y0 + randx(y1) % 120;

        gxRect(x0, y0, x1, y1, colorIndex[color]);

    }

    gxClear(TFT_BLACK);

}

 

void CCircleDemo()

{

    gInt    x0, y0;

    gInt    radius;

    gInt    color;

    gInt    no;

     

    for(no = 0; no < 2000; no++)

    {

        x0 = randx(x0) % 240;

        y0 = randx(y0) % 320;

        color = no % 16;

        radius = randx(radius) % 100;

        gxCircle(x0, y0, radius, colorIndex[color]);

    }

    gxClear(TFT_BLACK);

}

 

void TextDemo()

{

    char    buf[32];

    int     i;

    gxClear(TFT_BLACK);

    for(i = 0; i < 200; i++)

    {

        sprintf(buf, "COUNT = %04d", i);

        gxFontColorSize(TFT_YELLOW, TFT_BLACK, 1, 1);

        gxPutString(5, 10, buf);

        gxFontColorSize(TFT_BLACK, TFT_YELLOW, 1, 1);

        gxPutString(85, 10, buf);

        gxFontColorSize(TFT_BLUE, TFT_WHITE, 1, 1);

        gxPutString(165, 10, buf);

        gxFontColorSize(TFT_BLACK, TFT_GREEN, 1, 1);

        gxPutString(245, 10, buf);

       

        gxFontColorSize(TFT_YELLOW, TFT_BLACK, 1, 1);

        gxPutString(5, 20, buf);

        gxFontColorSize(TFT_BLACK, TFT_YELLOW, 1, 1);

        gxPutString(85, 20, buf);

        gxFontColorSize(TFT_BLUE, TFT_WHITE, 1, 1);

        gxPutString(165, 20, buf);

        gxFontColorSize(TFT_BLACK, TFT_GREEN, 1, 1);

        gxPutString(245, 20, buf);

    }

    gxClear(TFT_BLACK);

}

 

void TextDemoVarSize()

{

    char    buf[32];

    int     i, xs, ys;

    for(ys = 1; ys < 5; ys++)

        for(xs = 1; xs < 5; xs++)

        {

            gxClear(TFT_BLACK);

            gxFontColorSize(TFT_WHITE, TFT_BLACK, 1, 1);

            sprintf(buf, "X SIZE = %d, Y SIZE = %d", xs, ys);

            gxPutString(10, 10, buf);

            gxFontColorSize(TFT_GREEN, TFT_BLACK, xs, ys);

            for(i = 0; i < 100; i++)

            {

                sprintf(buf, "COUNT = %04d", i);

                gxPutString(10, 150, buf);

            }

        }

    gxClear(TFT_BLACK);

}

 

void Title()

{

    char    buf[32];

    int     i, n;

    int     size = 27;

    sprintf(buf, "... DEMO TFT Sharkduino ...");

    gxClear(TFT_BLACK);

    gxFontColorSize(TFT_WHITE, TFT_BLACK, 4, 4);

    for(n = 0; n < size; n++)

    {

        i = size - n - 1;

        gxPutString(10, 120, &buf[i]);

        DelayUs(150000);

    }

   

    for(n = 0; n < size; n++)

    {

        // Shift by one

        for(i = 1; i < size; i++)

            buf[size - i] = buf[size - i - 1];

        buf[0] = ' ';

        gxPutString(10, 120, buf);

        DelayUs(150000);

    }

}

 

int main(void)

{

    Set_PLL(16, 4);         // CORE: 25MHz * 16 = 400MHz, SCLK: 400MHz / 4 = 100MHz

    Set_Port();             // Set the port according to project set

    Set_Uart0(115200);      // printf is redirected to UART0

   

    Set_TimerCounter(TIMER_0);

    Set_TimerEnable(TIMER_0, true);

   

    Set_SPI(SPI_PP);

    Set_ExpansionPort(0xF0);

    Set_TFTlightPower(true);

    Set_TFTlight(15);

    Set_SPI(SPI_TFT);

    Set_TFTinit();

 

    while(1)            // Main loop

    {

        Title();

        TFT_ColorTest();

        CRectangleFilledDemo();

        CLineDemo();

        CRectangleDemo();

        CCircleDemo();

        TextDemo();

        TextDemoVarSize();

    }

    return 0;

}