// McStar.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "MapIO.hpp"
#include "gpio.h"
#include "ssp.h"
#include "clk.h"
#include "resource.h"
#include "McStar.h"
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "SIOFunc.h"

HANDLE g_hCopyFileThread = 0;    

DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TFS, LARGE_INTEGER TBT, LARGE_INTEGER SS, LARGE_INTEGER SBT, DWORD SN, DWORD CBR, HANDLE HSF, HANDLE HDF, LPVOID Data);

static 	TCHAR			fileList[100][80];
static 	CFGDATA			configData;

volatile GPIO_REGS		*GpioRegPtr = NULL;
volatile SSP_REGS		*SspRegPtr  = NULL;
volatile CLKMAN_REGS	*v_pClkRegs	= NULL;

DWORD WINAPI copyFileThread (PVOID pArg) 
{
	int		i, j;
	TCHAR	destFile[160];

	for(i=0; i<configData.numFiles; i++)
	{
		wcscpy(destFile, (TEXT("\\Hard Disk")));
		for(j=0; j<(int)wcslen(fileList[i]); j++)
			destFile[j+10] = fileList[i][j+13];
		
		CopyFileEx(fileList[i], destFile, (LPPROGRESS_ROUTINE)CopyProgressRoutine, NULL, NULL, NULL);	
		DEBUGMSG(1, (_T("File name = %s \n"), fileList[i]));
	}

	return 0;
}

DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TFS, LARGE_INTEGER TBT, LARGE_INTEGER SS, LARGE_INTEGER SBT, DWORD SN, DWORD CBR, HANDLE HSF, HANDLE HDF, LPVOID Data)
{
	DEBUGMSG(1, (_T("Progress Routine bytes transferred %d \n"), TBT));
	return PROGRESS_CONTINUE;
}

int DeleteOldFiles( VOID )
{
	WIN32_FIND_DATA fd;
	HANDLE			hFind;
	int				numFiles;
	DWORD			time1, time2, dwTemp;
	wchar_t			cBuf[100];

	numFiles = 0;

	RETAILMSG(1, (TEXT("Deleting old CF files \n")));
	time1 = GetTickCount();
	hFind = FindFirstFile(TEXT ("\\Storage Card\\McSTAR\\Data\\*.*"), &fd);
	if(hFind != INVALID_HANDLE_VALUE )
	{
		do
		{
			wcscpy(cBuf,(TEXT ("\\Storage Card\\McSTAR\\Data\\")));
			wcscat(cBuf, fd.cFileName);
			RETAILMSG(1, (TEXT("Deleting CF file: %s \n"), cBuf));
			DeleteFile(cBuf);
			numFiles = numFiles + 1;
		} while(FindNextFile(hFind, &fd));
	}
	time2 = GetTickCount();
	dwTemp = time2 - time1;
	RETAILMSG(1, (TEXT("Delete Done   Time = %d mSec\n\n"), dwTemp));

	return numFiles;
}


int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	int				fileCount,
					sampleCount,
					numWritten,
					USBWriteCount,
					sampleTOCount;
	unsigned int*	pData = 0;
	uint			temperature;
	DWORD			time1, time2, dwTemp;
    MEMORYSTATUS	memInfo;
	TCHAR			fileName[80];
	FILE			*outFile;
			

	printf("Prototype McSTAR Acoustic Receiver Data Acq program\n");
	printf("Built %s %s\n\n",__DATE__,__TIME__); 
	RETAILMSG (1,(TEXT("\rPrototype Monterey Canyon Sediment Transport Acoutic Receiver Data Acq program\n")));
	RETAILMSG (TRUE, (L"  built %s %s\n\n",TEXT(__DATE__),TEXT(__TIME__))); 

	ReadConfig( configData );
//	SetPowerState( LOW_POWER );
	MapRegisters();
	InitPSP();

//	temperature = SIOReadTemperature();
	RETAILMSG(1,(L" TestAvr: Temperature = %d \r\n", temperature));

	DeleteOldFiles();

	pData = new unsigned int[configData.numSamples];

   // Program memory information
    memInfo.dwLength = sizeof(memInfo);
    GlobalMemoryStatus(&memInfo);
    printf( "Total RAM: %d bytes\n Free: %d \nUsed: %d\nMemory Load %d percent\n\n", memInfo.dwTotalPhys, memInfo.dwAvailPhys, memInfo.dwTotalPhys-memInfo.dwAvailPhys, memInfo.dwMemoryLoad);

/*
	for(USBWriteCount=0; USBWriteCount<configData.USBWrites; USBWriteCount++)
	{
		for(fileCount=0; fileCount<configData.numFiles; fileCount++)
		{
			RETAILMSG(1, (TEXT("Starting Sample Acq = %d samples ... "),configData.numSamples));
			time1 = GetTickCount();
			dwReadSSP( pData, configData.numSamples );
			time2 = GetTickCount();
			dwTemp = time2 - time1;
			RETAILMSG(1, (TEXT("Acq Done   Acquire Time = %d mSec\n"), dwTemp));	

 			RETAILMSG(1, (TEXT("Starting Flash Disk Write ... ")));	
			time1 = GetTickCount();
			numWritten = WriteToFlash( pData, configData.numSamples, fileName );
			time2 = GetTickCount();
			wcscpy(fileList[fileCount], fileName);
			dwTemp = time2 - time1;
			RETAILMSG(1, (TEXT("Wrote %d samples to File Number = %d of %d  Write Time = %d mSec\n\n"), \
				numWritten, fileCount + 1, configData.numFiles, dwTemp));
		}
		DEBUGMSG(1, (_T("Starting File Move from CF to USB\n")));
	    g_hCopyFileThread = CreateThread (NULL, 0, copyFileThread, NULL, 0, NULL);
	}
*/

	for(USBWriteCount=0; USBWriteCount<configData.USBWrites; USBWriteCount++)
	{
		for(fileCount=0; fileCount<configData.numFiles; fileCount++)
		{
			CreateFilename( fileName, FLASHFILE );
			outFile = _wfopen( fileName, (TEXT("ab")));
			RETAILMSG(1, (TEXT("Starting Sample Acq = %d samples ... "),configData.numSamples));
			time1 = GetTickCount();
			for(sampleCount=0; sampleCount<configData.numSamples; sampleCount++)
			{
				sampleTOCount=0x3ffff;
				while((READ_REGISTER_ULONG(&SspRegPtr->SSSR) & SSSR_RNE) == 0)
				{
					if(sampleTOCount-- == 0)
						break;
				}
	
				if( sampleTOCount <= 0)
					DEBUGMSG(1,(TEXT("Read SSP timed out with RNE = 0\n")));
				else
				{	
					*pData = READ_REGISTER_ULONG(&SspRegPtr->SSDR);
					numWritten = fwrite(pData, sizeof(int), 1, outFile);
				}
			}
			wcscpy(fileList[fileCount], fileName);
			fclose(outFile);
			time2 = GetTickCount();
			dwTemp = time2 - time1;
			RETAILMSG(1, (TEXT("Acq Done   Acquire Time = %d mSec\n"), dwTemp));	
		}
		DEBUGMSG(1, (_T("Starting File Move from CF to USB\n")));
	    g_hCopyFileThread = CreateThread (NULL, 0, copyFileThread, NULL, 0, NULL);
	}

	if (g_hCopyFileThread) 
	{
		WaitForSingleObject (g_hCopyFileThread, 1000);
		CloseHandle(g_hCopyFileThread);
	}

	delete [] pData;
	VirtualFree((PVOID)v_pClkRegs,0,MEM_RELEASE);
	VirtualFree((PVOID)SspRegPtr,0,MEM_RELEASE);
	VirtualFree((PVOID)GpioRegPtr,0,MEM_RELEASE);

//	SetPowerState( HIGH_POWER );
	return 0;
}

