/*
 * @file: 
 * @Author: Lida
 * @Date: 2022-11-30 09:43:02
 * @LastEditors: LiDa
 * @LastEditTime: 2023-09-08 09:33:05
 */

//#include "src/app_main.h"
#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();
    Delay();    
    Svc_Log_Init();
    Delay();
    // Bsp_Com_Rst_Reason();
    Svc_Log_Printf(LOG_INFO,">>>bootloader start...\r\n");
    Svc_Flash_Init();
    Svc_Bat_Init();
    App_Ota();
    Jump_App();
    while(1)
    {
        ;
    }
  return 0;
}

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();
        
    }
	// gw_u32 file_size=0xFFFFFF;
	// while(file_size--)
	// {
	// 	__NOP();
	// }
	
	// NVIC_SystemReset();    
}


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