// 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 <stdio.h>
#include <stdlib.h>
#include <math.h>

volatile GPIO_REGS		*GpioRegPtr = NULL;
volatile SSP_REGS		*SspRegPtr  = NULL;
volatile CLKMAN_REGS	*v_pClkRegs	= NULL;


void CreateFilename( char fileName[80], BOOL Flash )
{
	// routine to create a file name

	char	cTemp[10];

	__time64_t t64Time;
    
	struct tm timeNow;
    
	_time64( &t64Time );
	if( (_localtime64_s(&timeNow, &t64Time)) !=0)
	{
		// process error
	}
	
	if(Flash == TRUE)
		strcpy(fileName, "\\Storage Card\\McStar\\Data\\");
	else
		strcpy(fileName, "\\Hard Disk\\McStar\\Data\\");

	_itoa(timeNow.tm_year, cTemp, 10);
	strcat(cTemp, "-");
	strcat(fileName, cTemp);
	_itoa(timeNow.tm_yday, cTemp, 10);
	strcat(cTemp, "-");
	strcat(fileName, cTemp);
	_itoa(timeNow.tm_hour, cTemp, 10);
	strcat(cTemp, "-");
	strcat(fileName, cTemp);
	_itoa(timeNow.tm_min, cTemp, 10);
	strcat(cTemp, "-");
	strcat(fileName, cTemp);
	_itoa(timeNow.tm_sec, cTemp, 10);
	strcat(fileName, cTemp);

	return;
}

double iToDW( int iValue )
{
	double dResult;
	double LSB; //= 2.980232594e-7;
	double Vref;
	
	Vref = (double)2.5;
	LSB = Vref / (pow(2.0, 23.0) - 1.0);

	if( (iValue & 0x00800000) != 0)
	{
		iValue = ~iValue;
		iValue = iValue & 0x00FFFFFF;
		dResult = -1.0 * ((double)(iValue + 0x00000001)) * LSB;
	} else
		dResult = double(iValue) * LSB;

	return dResult;
}


int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	int				fileCount,
					numWritten;
	unsigned int*	pData = 0;
	CFGDATA			configData;
	DWORD			time1, time2, dwTemp;
	wchar_t			cBuf[100];
    MEMORYSTATUS   memInfo;

	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"  720020-11693 built %s %s\n\n",TEXT(__DATE__),TEXT(__TIME__))); 

	ReadConfig( configData );
//	SetPowerState( LOW_POWER );
	MapRegisters();
	InitPSP();

	pData = new unsigned int[configData.numSamples];

   // Program memory.
    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(fileCount=0; fileCount<configData.numFiles; fileCount++)
	{
		RETAILMSG(1, (TEXT("Starting Sample Acq = %d samples\n"),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 USB Write ... ")));
		time1 = GetTickCount();
		numWritten = WriteToUSBDisk( pData, configData.numSamples );
		time2 = GetTickCount();
		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));
	}

	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;
}

