#include "src/com/svc/svc_com.h"
#include "src/clock/svc/svc_clock.h"
#include "src/log/svc/svc_log.h"
#include "src/bat/app/app_bat.h"
#include "src/flash/svc/svc_flash.h"
#include "src/ota/app/app_ota.h"

typedef void (*pFunction)(void);
pFunction Jump_To_Application;
gw_u32 JumpAddress;
void Jump_App(void);
static void Delay(void);

int main(void)
{
    Svc_Clock_Init();
//    Svc_Log_Init();
    Delay();
//    Svc_Log_Printf(LOG_INFO, ">>>bootloader start...\r\n");
    Svc_Flash_Init();
    Svc_Bat_Init();
//    App_Ota();
    Jump_App();
    while (1)
    {
        ;
    }
}

void Jump_App(void)
{
//    __disable_irq();
//    USART_Enable(LOG_USART, DISABLE);
//    __enable_irq();
    /* Judge whether the top of stack address is legal or not */
    if (((*(__IO uint32_t *)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000)
    {
        /* Jump to user application */
        // SCB->VTOR = FLASH_START|BOOTLOADER_SIZE;
        JumpAddress = *(__IO uint32_t *)(APPLICATION_ADDRESS + 4);
        Jump_To_Application = (pFunction)JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(__IO uint32_t *)APPLICATION_ADDRESS);
        Jump_To_Application();
    }
}

static void Delay(void)
{
    gw_u16 i, j;
    for (j = 0; j < 20; j++)
    {
        for (i = 0; i < 60000; i++)
        {
            __NOP();
        }
    }
}
