// 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;

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				i,
					iTemp,
					recordCount,
					fileCount,
					decimal,sign;
	unsigned int*	pData = 0;
	double			dTemp,
					iSum, iMean,
					dSum, dMean;
	CFGDATA			configData;
	DWORD			time1, time2, dwTemp;
	wchar_t			cBuf[100];

	printf("\r\nPrototype Monterey Canyon Sediment Transport Acoutic Reciever Data Acq program\r\n");
	RETAILMSG (1,(TEXT("\r\nPrototype Monterey Canyon Sediment Transport Acoutic Receiver Data Acq program\r\n")));
	RETAILMSG (TRUE, (L"  720020-11693 built %s %s\r\n\n\n",TEXT(__DATE__),TEXT(__TIME__))); 

	ReadConfig( configData );
//	SetPowerState( LOW_POWER );
	MapRegisters();
	InitPSP();

	pData = new unsigned int[configData.numSamples];
	for(fileCount=0; fileCount<configData.numFiles; fileCount++)
	{
		for(recordCount=0; recordCount<configData.numRecords; recordCount++)
		{
			dwReadSSP( pData, configData.numSamples );
			WriteToFlash( pData, configData.numSamples );
			dSum = 0;
			iSum = 0;
			for(i=0; i<configData.numSamples; i++)
			{
				iTemp = *(pData + i);
				iSum = iSum + (double)iTemp;
				dTemp = iToDW( iTemp );
				dSum = dSum + dTemp;
			}
			iMean = iSum / (i + 1);
			dMean = dSum / (i + 1);
			swprintf(cBuf, TEXT("%d iTemp: %14d %8x dTemp: %14.12f \n"), recordCount, iTemp, iTemp, dTemp);
			DEBUGMSG(1,(cBuf));
		}
		if( configData.sleepPeriod > 0)
		{
			DEBUGMSG(1,(TEXT("Sleeping for %d seconds \n"), configData.sleepPeriod));
			Sleep((DWORD)configData.sleepPeriod * 1000 );
		}
//		DEBUGMSG(1,(TEXT("Writing to USB disk \n")));
//		CopyFile(TEXT("\\Storage Disk\\McStar\\Data\\*.*"), TEXT("\\Hard Disk\\McStar\\Data\\*.*"), FALSE);
	}

//	pData = new int[configData.numSamples];
//	SimData( configData.numSamples, configData.sampleRate, pData);

	WriteToUSBDisk();
	
	delete [] pData;

	VirtualFree((PVOID)v_pClkRegs,0,MEM_RELEASE);
	VirtualFree((PVOID)SspRegPtr,0,MEM_RELEASE);
	VirtualFree((PVOID)GpioRegPtr,0,MEM_RELEASE);

//	SetPowerState( HIGH_POWER );
	GoToSleep( configData.sleepPeriod);
	return 0;
}

