// test1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>
#include <commctrl.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include "McStarMX31.h"
#include "cspi_1.h"
#include "gpio.h"
#include "gpioRegisters.h"

using namespace std;

CFGDATA	configData;

void CreateFilename(TCHAR fileName[80], int fileType)
{
	TCHAR	cTemp[10],
			wcTemp[100];
	__time64_t t64Time;
	struct tm timeNow;
	static int	dirCount = 0,
				filesInDir = 0;
    
	_time64( &t64Time );
	if( (_localtime64_s(&timeNow, &t64Time)) !=0)
	{
		// process error
	}

	if(filesInDir == configData.filesPerDirectory)
	{
		dirCount = dirCount + 1;
		filesInDir = 0;
	}

	switch( fileType)
	{
		case 0:	//USB file
			wcscpy(fileName, (TEXT("\\Hard Disk\\McStar\\Data")));
			wcscat(fileName, _itow(dirCount, wcTemp, 10)); 
			wcscat(fileName, (TEXT("\\")));
			CreateDirectory(fileName, NULL);
			filesInDir = filesInDir + 1;
			break;  
		case 1:	//Flash File
			wcscpy(fileName, (TEXT("\\Storage Card\\McStar\\Data")));
			wcscat(fileName, _itow(dirCount, wcTemp, 10)); 
			wcscat(fileName, (TEXT("\\")));
			CreateDirectory(fileName, NULL);
			filesInDir = filesInDir + 1;
			break;  
		case 2:	//Log File
			wcscpy(fileName, (TEXT("\\Storage Card\\McStar\\LogFiles\\log")));
			break;
	}

	wsprintf(cTemp,L"%03d-",timeNow.tm_year);
	wcscat(fileName, cTemp);
	wsprintf(cTemp,L"%03d-",timeNow.tm_yday);
	wcscat(fileName, cTemp);
	wsprintf(cTemp,L"%02d-",timeNow.tm_hour);
	wcscat(fileName, cTemp);
	wsprintf(cTemp,L"%02d-",timeNow.tm_min);
	wcscat(fileName, cTemp);
	wsprintf(cTemp,L"%02d",timeNow.tm_sec);
	wcscat(fileName, cTemp);

	if( fileType == 2 )
		wcscat(fileName, L".txt");

	return;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char	cTemp[200];
	int		USBWriteCount,
			numWritten,
			fileCount;
	unsigned int*	pData = 0;
	DWORD	time1, time2, dwTemp;
	char	fileName[100];
	FILE	*outFile;

/*	GetSystemTime(&sysTime);
	sysTime.wYear = 2008;
	sysTime.wMonth = 11;
	sysTime.wDay = 0;
	SetSystemTime(&sysTime);
*/
	WriteLog(1, 1, 1, "McSTAR iMX31 Acoustic Receiver Data Acq program");
	sprintf(cTemp, "Built %s %s\n\n",__DATE__,__TIME__);
	WriteLog(1, 1, 1, cTemp);

	Sleep(1000);  //wait for USB disk(s) to enumerate

//	Set division between program and object memory to maximize program/data memory data space
	CheckMemory( "Before SetSystem ...");
//	SetSystemMemoryDivision( 0x0400 );
	CheckMemory( "After SetSystem...");
	pData = new unsigned int[configData.numSamples];
	CheckMemory( "After allocating pData...");

	ReadConfig( configData );

	Polled_CSPI_1::InitializeMasterMode();
	GPIO::InitializeGPIO();
	Polled_CSPI_1::Enable();
	Polled_CSPI_1::DisableLoopback();

	for(USBWriteCount=0; USBWriteCount<configData.USBWrites; USBWriteCount++)
	{
		for(fileCount=0; fileCount<configData.numFlashFiles; fileCount++)
		{
		//	if( (killFile = fopen("\\Storage Card\\McSTAR\\killMcSTAR", "r")) != NULL)
		//		exit(-1);

			GPIO::SetGPIO(gpio1::GPIO0);
			time1 = GetTickCount();
			sprintf(cTemp, "Starting Sample Acq = %d samples", configData.numSamples);
	//		WriteLog(1,1,1, cTemp);
			Polled_CSPI_1::GetNSamples( pData, configData.numSamples );
			sprintf(cTemp, "Acq Done   Acquire Time = %d mSec", dwTemp);	
	//		WriteLog(1,1,1, cTemp);
			GPIO::ClearGPIO(gpio1::GPIO0);
			time2 = GetTickCount();
			dwTemp = time2 - time1;
		}
		time1 = GetTickCount();
		//WriteToUSBDisk(pData, configData.numSamples, fileName);
		strcpy(fileName, "\\Hard Disk\\McStar\\Data\\file");
		strcat(fileName, _itoa(USBWriteCount, cTemp, 10));
		outFile = fopen( fileName, "ab");
		numWritten = fwrite(pData, sizeof(int), configData.numSamples, outFile);
		fclose(outFile);

		Sleep(2000);
		time2 = GetTickCount();
		dwTemp = time2 - time1;
		sprintf(cTemp, "Wrote USB file %40s number %d of %d  write time = %d\n", fileName, USBWriteCount+1, configData.USBWrites, dwTemp);	
//		WriteLog(1,1,1, cTemp);
	}

//GM	Seems like we need to do this somewhere
//	VirtualFree((PVOID)virtualAddress,0,MEM_RELEASE);

	delete [] pData;
//	SetSystemMemoryDivision( 0x1CBF );
//	CheckMemory( "After resetting system memory before exiting McStarMX31...");

	return 0;
}


/*
globals
int		fileListNum;
bool	powerDownUSB;
HANDLE	g_hCopyFileThread = 0;   
CFGDATA	configData;
TCHAR	fileList[2][1000][100];




locals to main
	int				fileCount,
					numWritten,
					USBWriteCount,
					ADSIOError,
					PU_USBFileNum;
	unsigned int*	pData = 0;
	uint			temperature;
	float			totalAcqTime,
					flashFileTime,
					sampleAcqTime;
	char			cTemp[200], cTemp2[200], cTemp3[200];
	DWORD			time1, time2, dwTemp;
	TCHAR			fileName[100],
					destFile[200];
	HWND			hWnd;
	FILE			*killFile;


	fileListNum = 0;
	for(USBWriteCount=0; USBWriteCount<configData.USBWrites; USBWriteCount++)
	{
		for(fileCount=0; fileCount<configData.numFlashFiles; fileCount++)
		{
			if( (killFile = fopen("\\FlashFX Disk\\McSTAR\\killMcSTAR", "r")) != NULL)
				exit(-1);

			sprintf(cTemp, "Starting Sample Acq = %d samples",configData.numSamples);
			WriteLog(1,1,1, cTemp);
			time1 = GetTickCount();
//			dwReadSSP( pData, configData.numSamples );
//			ReadSSPWriteCF( pData, configData.numSamples, fileName);
			wcscpy(fileList[fileListNum][fileCount], fileName);
			time2 = GetTickCount();
			dwTemp = time2 - time1;
			sprintf(cTemp, "Acq Done   Acquire Time = %d mSec", dwTemp);	
//			WriteLog(1,1,1, cTemp);
/*
			WriteLog(1,1,1, "Starting Flash Disk Write ");	
			time1 = GetTickCount();
			numWritten = WriteToFlash( pData, configData.numSamples, fileName );
			time2 = GetTickCount();
			wcscpy(fileList[fileCount], fileName);
			dwTemp = time2 - time1;

			wcstombs(cTemp2, fileList[fileCount], 80);
			sprintf(cTemp, "Wrote %d samples to %s; File Number = %d of %d  Write Time = %d mSec", \
				numWritten, cTemp2, fileCount + 1, configData.numFlashFiles, dwTemp);
			WriteLog(1,1,1, cTemp);
*			if(fileCount == PU_USBFileNum)
				SR_GPIOBit(107, 1);
		}

		if(1 == 0)
		{
			if (g_hCopyFileThread) 
			{
				while( (WaitForSingleObject(g_hCopyFileThread, 0x01000L) != 0x00000000L))
					WriteLog(1,1,1, "CopyFileThread didn't complete in time");
			}
			g_hCopyFileThread = CreateThread (NULL, 0, copyFileThread, (PVOID)fileListNum, 0, NULL);
			if(fileListNum == 0)
				fileListNum = 1;
			else 
				fileListNum = 0;
		}
		else
		{
//			MoveFileCF2USB( (PVOID)fileListNum );
		}
	}
		


	delete [] pData;
	VirtualFree((PVOID)v_pClkRegs,0,MEM_RELEASE);
	VirtualFree((PVOID)SspRegPtr,0,MEM_RELEASE);
	VirtualFree((PVOID)GpioRegPtr,0,MEM_RELEASE);

//	SetPowerState( HIGH_POWER );


*/

