/**************************************************************************//**
 * @file     Font_demo.c
 * @brief    Font sample application using Font library
 *
 * SPDX-License-Identifier: Apache-2.0
 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "N9H20.h"
#include "Font_demo.h"


extern S_DEMO_FONT s_sDemo_Font;

int font_x=0, font_y=16;
UINT32 u32SkipX;


#if 1
#define dbgprintf sysprintf
#else
#define dbgprintf(...)
#endif



#if defined (__GNUC__)
char pstrDisp[26][32] __attribute__((aligned(32))) = {
#else
__align(32) char pstrDisp[26][32] = {
#endif
 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},
 {"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"},
 {"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"},
 {"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"},
 {"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"},
 {"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"},
 {"GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG"},
 {"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"},
 {"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"},
 {"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"},
 {"KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK"},
 {"LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL"},
 {"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"},
 {"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"},
 {"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"},
 {"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP"},
 {"QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ"},
 {"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"},
 {"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"},
 {"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"},
 {"UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"},
 {"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"},
 {"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"},
 {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"},
 {"YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"},
 {"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"}
 };





/**********************************/
int main()
{
    DateTime_T ltime;
    WB_UART_T uart;

    int j, i;
    UINT32 wait_ticks, no, dispno, dispcolor, u32ExtFreq, u32PllOutKHz;

    //--- Reset SIC engine to make sure it under normal status.
    outp32(REG_AHBCLK, inp32(REG_AHBCLK) | (SIC_CKE | NAND_CKE | SD_CKE));
    outp32(REG_AHBIPRST, inp32(REG_AHBIPRST) | SICRST);     // SIC engine reset is avtive
    outp32(REG_AHBIPRST, inp32(REG_AHBIPRST) & ~SICRST);    // SIC engine reset is no active. Reset completed.

	u32ExtFreq = sysGetExternalClock();
	u32PllOutKHz = sysGetPLLOutputKhz(eSYS_UPLL, u32ExtFreq);
	sysUartPort(1);
	uart.uiFreq = u32ExtFreq*1000;
	uart.uiBaudrate = 115200;
	uart.uiDataBits = WB_DATA_BITS_8;
	uart.uiStopBits = WB_STOP_BITS_1;
	uart.uiParity = WB_PARITY_NONE;
	uart.uiRxTriggerLevel = LEVEL_1_BYTE;
	sysInitializeUART(&uart);

	sysprintf("PLL out frequency %d Khz\n", u32PllOutKHz);
	sysprintf("Switch clock end\n");


    sysSetSystemClock(eSYS_UPLL, 	//E_SYS_SRC_CLK eSrcClk,
    						192000,		  //UINT32 u32PllKHz,
    						192000,		  //UINT32 u32SysKHz,
    						192000,		  //UINT32 u32CpuKHz,
    						192000/2,	  //UINT32 u32HclkKHz,
    						192000/4);    //UINT32 u32ApbKHz

    /* enable cache */
    sysDisableCache();
    sysInvalidCache();
    sysEnableCache(CACHE_WRITE_BACK);

    /* configure Timer0 for FMI library */
    sysSetTimerReferenceClock(TIMER0, 12000000);
    sysStartTimer(TIMER0, 100, PERIODIC_MODE);

    ltime.year = 2011;
    ltime.mon  = 10;
    ltime.day  = 31;
    ltime.hour = 8;
    ltime.min  = 40;
    ltime.sec  = 0;
    sysSetLocalTime(ltime);

    Draw_Init();
    font_y = g_Font_Height;
    
    i= 0;
    while (1)
    {
        no=i%26;
        dispno = i % 3;
        if (dispno == 0 )
           dispcolor = COLOR_RGB16_RED;
        else if ( dispno == 1 )
           dispcolor = COLOR_RGB16_GREEN;
        else
           dispcolor = COLOR_RGB16_BLUE;      
		DemoFont_ChangeFontColor(&s_sDemo_Font, dispcolor);
		for (j= 0;j<8; j++)
		{
			DemoFont_PaintA(&s_sDemo_Font,				
				font_x,								
				font_y+ j*g_Font_Height,						
	    		pstrDisp[no]);	
	    }	    	
		wait_ticks = sysGetTicks(TIMER0);
		while( 1 )
		{
			if((sysGetTicks(TIMER0) - wait_ticks) > 200)
				break;    	
	    }
        DemoFont_ChangeFontColor(&s_sDemo_Font, COLOR_RGB16_BLACK);
		for (j= 0;j<8; j++)
		{
			DemoFont_PaintA(&s_sDemo_Font,				
				font_x,								
				font_y+ j*g_Font_Height,						
	    		pstrDisp[no]);	
	    }	    		    
	    i++;
    }	    
}