#include "base.h"

uint8_t MyBuffer[4096] ={0};

// #define USE_USB_HS
extern osSemaphoreId_t elog_dma_lockHandle;
int _write(int fd, char *ch, int len)
{
    if (osOK == osSemaphoreAcquire(elog_dma_lockHandle, osWaitForever))
    {
// #ifdef LOG_MENU_485
//         log_menu_send_enable();
// #endif
        HAL_UART_Transmit_DMA(&huart1, (uint8_t *)ch, len);
    }
    return len;
}

uint8_t test_send_buf[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
uint8_t test_send_buf_2[6] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04};
uint8_t test_rcv_buf[14] = {0};
uint8_t test_rcv_buf_2[13] = {0};


void MY_INIT( )
{
    // SDRAM_Init();
    // HAL_Delay(100);
    // SDRAM_Test();
}

static void Default_Task_Init()
{
 
    log_i(" GCC Version ->  %d ",__GNUC__);
    // log_i(" GCC SDRAM_BANK_ADDR ->  %d\n",SDRAM_BANK_ADDR);
    // my_eeprom.init();
    // // uint8_t a[2] = { 0xFF, 0xFF };
    // // Eeprom_Transmit( eeprom,  &a,  2 );

    // // osDelay(5);

    // // Eeprom_Begin_Rcv( eeprom, test_rcv_buf, 1);
    // // osDelay(5);

	// //初始化SDRAM模块 
    // extern MY_SDRAM_TypeDef my_sdram;
    my_sdram.init();
    // SDRAM_Init();
    if (my_sdram.test(32)){
    // if (SDRAM_Test(32)){
        log_i( "SDRAM 32 Bytes Test OK ...");        
    }else{
        log_i( "SDRAM 32 Bytes Test Faiure ...");        
    }


    uint8_t *ex_buf;
    ex_buf=mymalloc(SRAMEX,512);	//申请一个扇区的缓存
    if  (ex_buf != NULL)
        log_i("Malloc  SRAMEX, Test  ->>> PASS ! ...");
    myfree(SRAMEX,ex_buf);
    if  (ex_buf == NULL)
        log_i("Malloc  Free OK ...");

    my_nand.init();
	while(FTL_Init())	//检测NAND FLASH,并初始化FTL
	{
		log_w("NAND Error!");
		HAL_Delay(500);				 
		log_w("Please Check");
		HAL_Delay(500);				 
	}

    // my_nand.init();
    log_i("NAND ID : %08X   " ,  my_nand.id   );
	log_i("NAND Size : %dMB " ,  (my_nand.block_totalnum/1024)*(my_nand.page_mainsize/1024)*my_nand.block_pagenum);	//显示NAND容量  
    log_i("NAND   total Block Num: %d , page bytes  %d , good block %d , valid sector Num: %d " ,  
              my_nand.block_totalnum , my_nand.page_mainsize, my_nand.good_blocknum,my_nand.valid_blocknum  );

    if(my_nand.id==MT29F16G08ABABA)         //NAND为MT29F16G08ABABA
    {
        log_i("NAND Type : MT29F16G08ABABA   16GB"  );
    }
    else if(my_nand.id==W29N01GVSIAA)       //NAND为W29N01GVSIAA
    {
        log_i("NAND Type : W29N01GVSIAA    1GB"  );
    }else if (my_nand.id==W29N01HVSINA)     //NAND为 W29N01HVSINA
    {
        log_i("NAND Type : W29N01HVSINA  512MB"  );
    }
    else
    {
        log_e("NAND Type  : Error"  );
    }
    // uint8_t *nand_sector0_buf;
    // nand_sector0_buf = malloc(512);	
	// FTL_ReadSectors(nand_sector0_buf,2,NAND_ECC_SECTOR_SIZE,1);//预先读取扇区0到备份区域,防止乱写导致文件系统损坏.

    spiflash_init();
    log_i("SPI FLASH  Type : %02X ", g_spiflash_type);

 


    // UI_Port();

    // 初始化触摸屏/
    // GTP_Init_Panel();

// Disable_NAND_CS();

// //     /* LCD 端口初始化 */ 
    LCD_Init( );
    log_i("   LTDC id %04X *** " , my_ltdc.id);
    log_i("   Layer Addrr  %08X %08X " , my_lcd.layeraddr[0],my_lcd.layeraddr[1]);
    log_i("   Layer hsw  vsw  %d %d " , my_ltdc.hsw,my_ltdc.vsw);

    DMA2D_Fill(  (uint32_t) my_lcd.layeraddr[0], 480, 272, 0, DMA2D_ARGB8888,  LCD_COLOR_ORANGE );
    DMA2D_Fill(  (uint32_t) my_lcd.layeraddr[1], 480, 272, 0, DMA2D_ARGB8888,  LCD_COLOR_GREEN );
    // // DMA2D_MemCopy(DMA2D_ARGB8888, my_lcd.layeraddr[1], my_lcd.layeraddr[0],
    // //         480,272,0,0);
    // LTDC_Select_Layer(0);
    LCD_DrawLine(100,100,200,200);
    // // LCD_Fill(100,100,300,250, LCD_COLOR_GREEN);

    LCD_DisplayStringLine( 1, (uint8_t* )"LTDC TEST" );
    LCD_DisplayStringLine_EN_CH( 2,   (uint8_t* )"中");


    // GTP_Init_Panel();
    // log_i( "touch ic version  %s", tp_dev.ic_version);
    // DrawChar( 20, 20, &("LTDC TEST") );
    // LCD_DisplayNumber( 2, 789,10 );
    // LCD_DisplayNumber( 3, 666.99,10 );



//     LCD_SetTransparency(0, 255);

//     // LTDC_Clear(LCD_COLOR_GREEN);
// LTDC_FillBuffer(0, LCD_FB_START_ADDRESS, 480, 272, 0, LCD_COLOR_GREEN);
// LTDC_FillBuffer(1, LCD_FB_START_ADDRESS+(LCD_GetXSize()*LCD_GetYSize()*4), 480, 272, 0, LCD_COLOR_GREEN);
    // LTDC_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex);
    // // /* 选择LCD第一层 */
    // LCD_SelectLayer(0);

    // // /* 第一层清屏，显示全黑 */ 
    // LCD_Clear(LCD_COLOR_BLACK);  

    // // /* 选择LCD第二层 */
    // LCD_SelectLayer(1);

    // // /* 第二层清屏，显示全黑 */ 
    // LCD_Clear(LCD_COLOR_TRANSPARENT);

    // // // /* 配置第一和第二层的透明度,最小值为0，最大值为255*/
    // LCD_SetTransparency(0, 255);
    // LCD_SetTransparency(1, 0);
    // log_i("lcd set layer Clear... ok...... ");

    // // /* 选择LCD第一层 */
    // LCD_SelectLayer(0);
	// // /* 清屏，显示全黑 */
	// LCD_Clear(LCD_COLOR_GRAY);	
	// // /*设置字体颜色及字体的背景颜色(此处的背景不是指LCD的背景层！注意区分)*/
	// LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
	// // /*选择字体*/
	// LCD_SetFont(&LCD_DEFAULT_FONT);


	// LCD_DisplayStringLine(1,(uint8_t* )"BH 5.0 inch LCD para: 正");
	// LCD_DisplayStringLine(2,(uint8_t* )"Image resolution:800x480 px");
	// LCD_DisplayStringLine(3,(uint8_t* )"Touch pad:5 point touch supported");
	// LCD_DisplayStringLine(4,(uint8_t* )"Use STM32-LTDC directed driver,");
	// LCD_DisplayStringLine(5,(uint8_t* )"no need extern driver,RGB888,24bits data bus");
	// LCD_DisplayStringLine(6,(uint8_t* )"Touch pad use IIC to communicate");

    // Palette_Init(); // 有中文字符,还得解决


// Enable_NAND_CS();

    // my_led.init();
    // my_led.port( 200);
 
    // led_set_state(LED_SEQ_0, LED_STATE_FLICKER_SLOW);
    // led_set_state(LED_COLOR_GREEN, LED_STATE_FLICKER_SLOW);

    RTOS_Port();
    osTimerStart( measureTimerHandle, 3000 );

    // SD_Test();
    // test_Port();

    // MX_USB_DEVICE_Init();
 
}
void StartDefaultTask(void *argument)
{

    // uart6_power_enable();

    Init_Logger();
    log_i(" *** System is initiating *** ");

    Default_Task_Init();

    // MX_USB_DEVICE_Init();  /* USB 初始化需要写在任务中 */

    for (;;)
    {
        osDelay(1000 );
    }
}



void measureTimer_Callback(void *argument)
{
    log_i("measureTimer ........................... ");
}


void measureTask(void *argument)
{

    for (;;)
    { 
        // log_i("measure task .... ");
        osDelay(2000); 
    }
}

void USART1_IRQHandler(void)
{
    if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != RESET)
    {
        osSemaphoreRelease(elog_dma_lockHandle);
        huart1.gState = HAL_UART_STATE_READY;
        __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC);
    }
    HAL_UART_IRQHandler(&huart1);
}



void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

    // if (huart->Instance == huart3.Instance)
    // {
    //     log_i("....huart3 rx callback....  " );
    //     // Oscar_Rcv_Cplt_Callback(  oscar );
    //     // Viper_Rcv_Cplt_Callback( viper );
    //     // Sample_Rcv_Cplt_Callback(  sample  );
    //     __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE);
    // }
}


// void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
// {

//   if (huart->Instance == huart3.Instance)
//   {
//     /* 拷贝数据 到菜单 */
//     log_i("huart3   idle -> ****** HAL_UARTEx_RxEventCallback ");
//     __HAL_UART_CLEAR_IDLEFLAG(&huart3);
//   }
// }

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{


//   if (huart->Instance == huart3.Instance)
//   {
//     // max3160_485_receive_mode();
//     // huart3.gState = HAL_UART_STATE_READY;
//     __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
//   }

}


static void Hardware_Init(void)
{
    /*中断优先级分组*/
    /*硬件初始化1*/
    /* ......*/
    /*硬件初始化n*/
}
 
void Soft_Reboot()
{
    __set_FAULTMASK(1);//关闭总中断
    NVIC_SystemReset();//请求单片机重启
}




 


 
//     FATFS fs;                                                    /* FatFs文件系统对象 */
//     FIL fnew;                                                    /* 文件对象 */
//     FRESULT res_flash;                                           /* 文件操作结果 */
//     UINT fnum;                                                   /* 文件成功读写数量 */
//     BYTE ReadBuffer[1024]={0};                                   /* 读缓冲区 */
//     BYTE WriteBuffer[] = "这是一个测试程序\r\n";

// //  /* 挂载外部flash */
//     res_flash = f_mount( &fs,"1:",1);
//     // log_i(" mount res  %08X \r\n",NAND_ReadID());
//     log_i(" mount res  %d \r\n", res_flash);

// //     /* 如果没有文件系统就格式化创建创建文件系统 */
//     if(res_flash == FR_NO_FILESYSTEM)
//     {
//         log_i("fmount no file system");
//         /* 格式化 */
//         res_flash=f_mkfs("1:",FM_ANY,0,MyBuffer,_MIN_SS); // FM_ANY 不能为0
//         if(res_flash == FR_OK)
//         {
//             log_i(" mkfs  format ok ! " );
//             // 格式化后，先取消挂载 /
//             res_flash = f_mount(NULL,"1:",1);
//             // 重新挂载    
//             res_flash = f_mount(&fs,"1:",1);
//             log_i("fmount OK..   %d", res_flash);
//         }
//         else
//         {
//             log_i(" format failure .... %d ",res_flash);
//         }
//     }
//     else if(res_flash != FR_OK)
//     {
//         // 红灯常亮  
//         log_i("fmount failure");
//     }

//     /* 打开文件，如果没有文件就创建 */
//     res_flash = f_open(&fnew, "1:FatFs.txt", FA_CREATE_ALWAYS | FA_WRITE );
//     log_i(" f_open  %d \r\n",res_flash);
//     if ( res_flash == FR_OK )
//     {
//         /* 将指定存储区内容写入到文件内 */
//         res_flash = f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);
//         log_i(" f_write  %d \r\n",res_flash);
//         if(res_flash == FR_OK)
//         {
//             /* 蓝灯亮 */
//             log_i("write file success ... ");
//         }
//         else
//         {
//             /* 不再读写，关闭文件 */
//             f_close(&fnew);
//             /* 红灯常亮 */
//             log_i("write file failure");
//         }
//         /* 不再读写，关闭文件 */
//         f_close(&fnew);
//     }
//     else
//     {
//         log_i("write file failure ..... ");
//     }