/*! @file Main.c

  @brief   app main
  @author  Hendrik Schutter
  @version V1.0
  @date    14.11.2020

This file contains the main app function and init.
*/

#include "audio.h"
#include "Board_DAC.h"
#include "Welcome.h"

//25x25 Dot Qr Code, 25bits per line (x)
uint32_t au32QrCode[25] =
{
    0x1FC897F,
    0x105BE41,
    0x174E55D,
    0x175A85D,
    0x174555D,
    0x1054B41,
    0x1FD557F,
    0x1400,
    0x1F7DBAA,
    0xF08422,
    0x15B31B,
    0x48E1C1,
    0xEFA8D7,
    0x15BDCAA,
    0x12703FB,
    0x1589271,
    0x1161DF4,
    0x1C918,
    0x1FDB557,
    0x1042118,
    0x175E3F7,
    0x1759A5F,
    0x1758D0D,
    0x1055BB9,
    0x1FDD43F
};

static void vMainInitApp(void);
static void vPrintQr(void);

/**
 * @fn int main (void)
 * @brief app entry point
 * @param void
 * @return int
 * @author hendrik schutter
 * @date 14.11.2020
 */
int main (void)
{
    vMainInitApp(); //init app
    vPrintQr();	//print Qr

    while(1) {
        //calculate important things (Artificial neural network)
    }
}

/**
 * @fn void vMainInitApp(void)
 * @brief initialize app
 * @param void
 * @return void
 * @author hendrik schutter
 * @date 14.11.2020
 */
static void vMainInitApp(void)
{
    // Init audio pin
    DAC_Initialize();

    // Init GLCD
    GLCD_Initialize ();
    GLCD_SetForegroundColor (GLCD_COLOR_BLACK);
    GLCD_SetBackgroundColor (GLCD_COLOR_WHITE);
    GLCD_ClearScreen ();
    GLCD_SetFont(&GLCD_Font_16x24); // declared as extern in externals.h
    GLCD_DrawString (4*GLCD_Font_16x24.width, 5,"fckaf.de/BXm");

    // Init LED
    LED_Initialize();

    vStartAudio();
    vPrintQr();

    while (1)
    {
    }
}

/**
 * @fn static void vPrintQr(void)
 * @brief print Qr code  from array
 * @param void
 * @return void
 * @author hendrik schutter
 * @date 14.11.2020
 */
static void vPrintQr(void) {

    uint8_t u8DotSize = 8U;
    uint8_t u8Yoffset = 30U;
    uint8_t u8Xoffset = 60U;

    for(uint8_t y = 0; y < 25; y++) {
        for(int8_t x = 0; x < 25; x++) {
            if(au32QrCode[y] & (1 << x))
            {
                //print dots u8DotSize X u8DotSize
                for(uint8_t u8DotLine = 0; u8DotLine < u8DotSize; u8DotLine++)
                {
                    //print horizontal line, swap left to right
                    GLCD_DrawHLine (-(x-24)*u8DotSize+u8Xoffset, y*u8DotSize+u8DotLine+u8Yoffset, u8DotSize);
                }
            }
        }
    }
}


