//#DOC Main, program entry and main loop
#include "main.h"
#include <otRTC.h>
#include <otSerial.h>
#include <otTimer.h>
#include <otPrintfLite.h>
#include <otILI9341.h>
#include "nixie.h"
#include "nixieL.h"

otILI9341 tft;

void displayTime(const char * buf, int xp, int yp)
{
    const unsigned short    * ptr;
    for(int i = 0; i < 8; i++)
    {
        if(i == 2 || i == 5)
            xp += 10;
        else
        {
            switch(buf[i])
            {
                case '0':   if(i == 0) ptr = nixieL_10;
                            else ptr = nixieL_00;
                            break;
                case '1':   ptr = nixieL_01;
                            break;
                case '2':   ptr = nixieL_02;
                            break;
                case '3':   ptr = nixieL_03;
                            break;
                case '4':   ptr = nixieL_04;
                            break;
                case '5':   ptr = nixieL_05;
                            break;
                case '6':   ptr = nixieL_06;
                            break;
                case '7':   ptr = nixieL_07;
                            break;
                case '8':   ptr = nixieL_08;
                            break;
                case '9':   ptr = nixieL_09;
                            break;
            }
            tft.draw565Bitmap(xp, yp, ptr, 50, 78);
            xp += 50;
        }
    }
}

void displayDate(const char * buf, int xp, int yp)
{
    const unsigned short    * ptr;
    for(int i = 0; i < 10; i++)
    {
        if(i == 4 || i == 7)
            xp += 4;
        else
        {
            switch(buf[i])
            {
                case '0':   if(i == 5 || i == 8) ptr = nixie_10;
                            else ptr = nixie_00;
                            break;
                case '1':   ptr = nixie_01;
                            break;
                case '2':   ptr = nixie_02;
                            break;
                case '3':   ptr = nixie_03;
                            break;
                case '4':   ptr = nixie_04;
                            break;
                case '5':   ptr = nixie_05;
                            break;
                case '6':   ptr = nixie_06;
                            break;
                case '7':   ptr = nixie_07;
                            break;
                case '8':   ptr = nixie_08;
                            break;
                case '9':   ptr = nixie_09;
                            break;
            }
            tft.draw565Bitmap(xp, yp, ptr, 38, 59);
            xp += 38;
        }
    }
}

void setup()
{
    UartEnableSignals(UART0);
    UartSetBaud(UART0, 115200);
    setStdout(UART0); // printf output is now directed on UART0
    tft.init();
    tft.setRotation(otILI9341::IR_270);
    tft.clear();
    RtcOn();
    RtcSetDate(2020, 4, 4);
    RtcSetTime(9, 50, 0);
}

void loop()
{
    U8      h, m, s;
    int     yy, mm, dd;
    char    buf[16];
    
    while(1)
    {
        DelayMs(1000);
        RtcGetTime(&h, &m, &s);
        RtcGetDate(&yy, &mm, &dd);
        
        sprintf(buf, "%02d:%02d:%02d", h, m, s);
        displayTime(buf, 0, 34);
        printf("%s - ", buf);
        
        sprintf(buf, "%04d/%02d/%02d", yy, mm, dd);
        displayDate(buf, 0, 146);
        printf("%s\n", buf);
    }
}