/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.32                          *
*        Compiled Oct  8 2015, 11:59:02                              *
*        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END

#include "main.h"
#include "DIALOG.h"
#include "stdio.h"
#include "core_cm7.h"
/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x01)
#define ID_BUTTON_1 (GUI_ID_USER + 0x02)
#define ID_BUTTON_2 (GUI_ID_USER + 0x03)

// USER START (Optionally insert additional defines)
// USER END

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

// USER START (Optionally insert additional static data)
int selected_isfolder=0,usb_mode=0,usb_count=0;
char usb_pathname[150],usb_folder[11];
extern int exist_frame,sd[2000],io;
char g1[3][111];
extern char pathname[122],usb_str[4000],printer_str[4000],fc[2000][11],g[2000][111];
extern unsigned char namenode[11],namelif[111];
extern WM_HWIN handle_exist_frame;
extern FATFS SDFatFs,USBDISK_FatFs;  /* File system object for SD card logical drive */
extern FIL MyFile1,MyFile2;     /* File object */
extern char SDPath[4],USBDISK_Drive[4]; /* SD card logical drive path */
extern uint32_t byteswritten, bytesread;
extern FRESULT fr,fr1,fr2,fr3,fr4,fr5,fr6,fr7,fr8,fr9,fr10,fr11,fr12,fr15,fr16,fm,fr_link;     /* Return value */
extern DIR dj;         /* Directory search object */
extern FILINFO fno;    /* File information */
extern char lfn[_MAX_LFN + 1];
FRESULT unmount,mount,unlink,link,make_folder;
WM_HWIN  hItem_USB;
static osMessageQId           USBEvent = 0;
static osThreadId             USBThreadId = 0;
// USER END
/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 125, 41, 230, 190, 0, 0x64, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 18, 15, 184, 40, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 18, 70, 184, 40, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_2, 61, 122, 100, 40, 0, 0x0, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

// USER START (Optionally insert additional static code)
static void USB_Thread(void const * argument);
void os_project(void);
void check_sdcard(void);
/***********************************/
void create_usb_mainfolder(void)
{
	int i=0,counter=0;
	char usb_folder1[11];
	strncpy(usb_pathname,"",150);
	strncpy(usb_pathname,"1:M1410TPU_",11);
	strncpy(usb_folder1,usb_folder,strlen(usb_folder));
	while(usb_folder1[i])
	{
		if(usb_folder1[i] == '/')
			usb_folder1[i] = '-';
		i++;
	}
//	  f_mount(0, SDPath, 1);
//		FATFS_UnLinkDriver(SDPath);	
	  strncat(usb_pathname,usb_folder1,strlen(usb_folder1));
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);
		osDelay(1);   										
		fr9=FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);			
		fr10=f_mount(&USBDISK_FatFs,USBDISK_Drive,  0);
		osDelay(2);
    make_folder=f_mkdir(usb_pathname);
	  counter=0;
	  while(make_folder == FR_DISK_ERR && counter < 5)
		{
			f_mount(0,USBDISK_Drive, 1);
			FATFS_UnLinkDriver(USBDISK_Drive);
			osDelay(1);
			fr9=FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);
			fr10=f_mount(&USBDISK_FatFs,USBDISK_Drive, 0);
			osDelay(2);
			make_folder=f_mkdir(usb_pathname);
			counter++;
		}
	  osDelay(2);
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);
//		osDelay(2);
//		FATFS_LinkDriver(&SD_Driver, SDPath);
//    f_mount(&SDFatFs, (TCHAR const*)SDPath , 0);		
}
/********************************************/
void create_usb_subfolder(char foldername[11])
{
    int counter=0;
//	  f_mount(0, SDPath, 1);
//		FATFS_UnLinkDriver(SDPath);	
	  strncpy(usb_pathname+21,"",129);
	  strncat(usb_pathname,"/",1);
	  strncat(usb_pathname,foldername,strlen(foldername));
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);
		osDelay(1);   										
		FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);			
		f_mount(&USBDISK_FatFs,USBDISK_Drive,  0);
		osDelay(1);
    fr2=f_mkdir(usb_pathname);
		counter=0;
	  while(fr2 == FR_DISK_ERR && counter < 5)
		{
			f_mount(0,USBDISK_Drive, 1);
			FATFS_UnLinkDriver(USBDISK_Drive);
			osDelay(1);
			fr9=FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);
			fr10=f_mount(&USBDISK_FatFs,USBDISK_Drive, 0);
			osDelay(2);
			fr2=f_mkdir(usb_pathname);
			counter++;
		}
	  osDelay(1);
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);	
//		osDelay(2);
//		FATFS_LinkDriver(&SD_Driver, SDPath);
//    f_mount(&SDFatFs, (TCHAR const*)SDPath , 0);		
}
/*******************************************************/
void create_usb_file(char filename[111])
{
	int fat_counter=0,fat_counter1=0;
//	  f_mount(0, SDPath, 1);
//		FATFS_UnLinkDriver(SDPath);	
	  strncpy(usb_pathname+32,"",118);
	  strncat(usb_pathname,"/",1);
	  strncat(usb_pathname,filename,strlen(filename));
    strncat(usb_pathname,".xls",4);
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);
		osDelay(2);   										
		FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);			
		f_mount(&USBDISK_FatFs,USBDISK_Drive,  0);
		osDelay(2);
		fr3=f_open(&MyFile2, usb_pathname,  FA_CREATE_ALWAYS | FA_WRITE);
		fat_counter=0;
		while(fr3 != FR_OK && fr3 != FR_EXIST && fat_counter < 50)
		{
			fat_counter++;
			f_mount(0, USBDISK_Drive, 1);	
			FATFS_UnLinkDriver(USBDISK_Drive);
			osDelay(2);   										
			FATFS_LinkDriver(&USBH_Driver, USBDISK_Drive);			
			f_mount(&USBDISK_FatFs,USBDISK_Drive,  0);
			osDelay(2);			
			fr3=f_open(&MyFile2, usb_pathname, FA_CREATE_ALWAYS | FA_WRITE);
		}
    if(fr3 == FR_OK || fr3 == FR_EXIST)
		{			
			osDelay(1);
			fr4=f_write(&MyFile2, usb_str, sizeof(usb_str), &byteswritten);
					fat_counter=0;
			    while(fr4 != FR_OK && fat_counter < 50)
					{
						fat_counter++;
						if(fr4 == FR_DISK_ERR)
						{
							fr5=f_unlink(usb_pathname);
							fat_counter1=0;
							while(fr5 != FR_OK && fat_counter1 < 20)
							{
								fat_counter1++;
								osDelay(2);
								fr5=f_unlink(usb_pathname);
							}
							if(fr5 == FR_OK)
							{
								fr6=f_open(&MyFile2, usb_pathname, FA_CREATE_ALWAYS | FA_WRITE);
								fat_counter1=0;
								while(fr6 != FR_OK && fr6 != FR_EXIST && fat_counter1 < 20)
								{
									fat_counter1++;
									osDelay(2);
									fr6=f_open(&MyFile2, usb_pathname, FA_CREATE_ALWAYS | FA_WRITE);
								}
							}							
						}
						osDelay(2);
						fr4=f_write(&MyFile2, usb_str, sizeof(usb_str), &byteswritten);
					}			
			osDelay(1);
			f_close(&MyFile2);
		}			
		f_mount(0, USBDISK_Drive, 1);	
		FATFS_UnLinkDriver(USBDISK_Drive);	
//		osDelay(2);
//		FATFS_LinkDriver(&SD_Driver, SDPath);
//    f_mount(&SDFatFs, (TCHAR const*)SDPath , 0);		
}
/********************************************/
void read_selectedfolder(char foldername[11])
{
	int fat_counter=0,step,j=0;
					unmount=f_mount(0, SDPath, 1);
					unlink=FATFS_UnLinkDriver(SDPath);	
					osDelay(3);
					link=FATFS_LinkDriver(&SD_Driver, SDPath);//fr_link
					osDelay(2);					
			   mount=f_mount(&SDFatFs, (TCHAR const*)SDPath , 0);
				 for(step=0;step<1;step++)
				 {				 
						 fr5 = f_findfirst(&dj, &fno, (TCHAR const*)foldername, "*");
					   fat_counter=0;
						 while(fr5!= FR_OK && fat_counter < 50)
						 {
							  fat_counter++;
							  osDelay(2);
								fr5 = f_findfirst(&dj, &fno, (TCHAR const*)foldername, "*");
						 }
						 fr6 = FR_OK;
						  sd[0]=0;
							while (fr6 == FR_OK && fno.fname[0]) 
							{							
								sprintf(g[j],"%s",fno.fname);
								fr6 = f_findnext(&dj, &fno);
								j++;
								sd[0]++;
							}

							fr12=f_closedir(&dj);
							fat_counter=0;
							while(fr12!= FR_OK && fat_counter < 50)
							{
								 fat_counter++;
								 osDelay(2);
								 fr12=f_closedir(&dj);
							}					
				 }
}

static void USB_Thread(void const * argument)
{
  uint32_t numOfReadBytes, numOfWrittenBytes,file_counter=0,folder_counter=0;    
  osEvent event; 
  TaskHandle_t xTask = USBThreadId;	
  for(;;)
  {
    event = osMessageGet(USBEvent, 100 );
    
    if( event.status == osEventMessage )
    {
			if(event.value.v == 1)
			{
			  usb_mode = 1;
			  create_usb_mainfolder();
        create_usb_subfolder((char *)namenode);
        if(selected_isfolder == 0)
				{
					os_project();
					create_usb_file((char *)namelif);
				}
				else
				{
					read_selectedfolder((char *)namenode);
					for(file_counter =0 ;file_counter < sd[0] ; file_counter++)
					{
						if(strncmp(g[file_counter],"T",1) == 0 || strncmp(g[file_counter],"S",1) == 0)
						{
							sprintf(pathname,"%s/%s",namenode,g[file_counter]);
							sprintf((char *)namelif,"%s",g[file_counter]);
							os_project();
							create_usb_file(g[file_counter]);
						}							
					}
				}
			
				usb_mode = 0;
			  exist_frame=0;
			  GUI_EndDialog(hItem_USB, 0);				
			}
			else if(event.value.v == 2)
			{
			  usb_mode = 1;
			  create_usb_mainfolder();
			  check_sdcard();
			  usb_count=0;
			  for(folder_counter = 0 ; folder_counter < io ; folder_counter++)
				{
					create_usb_subfolder(fc[folder_counter]);
					read_selectedfolder(fc[folder_counter]);
					for(file_counter =0 ;file_counter < sd[0] ; file_counter++)
					{
						if(strncmp(g[file_counter],"T",1) == 0 || strncmp(g[file_counter],"S",1) == 0)
						{
							sprintf(pathname,"%s/%s",fc[folder_counter],g[file_counter]);
							sprintf((char *)namelif,"%s",g[file_counter]);
							os_project();
							create_usb_file((char *)g[file_counter]);
						}							
					}
          usb_count++;				
				}
			  usb_mode = 0;
			  exist_frame=0;
			  GUI_EndDialog(hItem_USB, 0);					
			}
    }
  }
//	osThreadSuspend(USBThreadId);
//	vTaskDelete(NULL);
	
//	vTaskSuspendAll();
//	USBThreadId = NULL;
//	vTaskDelete( xTask );
//	xTaskResumeAll();
}
// USER END

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;
	static int file_counter,folder_counter=0;
  // USER START (Optionally insert additional variables)
	  TaskHandle_t xTask;
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Framewin'
    //
	  hItem_USB = pMsg->hWin;
    hItem = pMsg->hWin;
	  handle_exist_frame = pMsg->hWin;	
    WM_MakeModal(hItem);
    FRAMEWIN_SetText(hItem, "");
    //
    // Initialization of 'Button'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
    BUTTON_SetFont(hItem, GUI_FONT_20_1);
	  if(selected_isfolder == 1)
			BUTTON_SetText(hItem, "Send Selected Folder");
		else
			BUTTON_SetText(hItem, "Send Selected File");
	  BUTTON_SetFocusable(hItem,0);
    //
    // Initialization of 'Button'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
    BUTTON_SetFont(hItem, GUI_FONT_20_1);
    BUTTON_SetText(hItem, "Send All Projects");
	  BUTTON_SetFocusable(hItem,0);
    //
    // Initialization of 'Button'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
    BUTTON_SetFont(hItem, GUI_FONT_20_1);
    BUTTON_SetText(hItem, "Cancel");
		BUTTON_SetFocusable(hItem,0);
    // USER START (Optionally insert additional code for further widget initialization)
		exist_frame=1;
		
  /* Create USB Queue */
  osMessageQDef(USB_Queue, 1, uint16_t);
  USBEvent = osMessageCreate (osMessageQ(USB_Queue), NULL);		
  /* Create USB task */
  osThreadDef(osUSB_Thread, USB_Thread, osPriorityNormal, 0, 1024);
  USBThreadId = osThreadCreate (osThread(osUSB_Thread), NULL);	
    // USER END
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
				osMessagePut ( USBEvent, 1, 0);
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_BUTTON_1: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
		    osMessagePut ( USBEvent, 2, 0);
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_BUTTON_2: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
//				 exist_frame=0;
//			   hItem = pMsg->hWin;
//			   GUI_EndDialog(hItem, 0);
			
//vTaskDelete(NULL);
			
//	xTask = USBThreadId;		
//	vTaskSuspendAll();
//	USBThreadId = NULL;
//	vTaskDelete( xTask );
//	xTaskResumeAll();		
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateFramewin
*/
WM_HWIN Frame_usb(void);
WM_HWIN Frame_usb(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

// USER START (Optionally insert additional public code)
// USER END

/*************************** End of file ****************************/
