
/* ------------------ */
/* - Include Files. - */
/* ------------------ */

#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <math.h>
#include "mlMouse.h"
#include "log.h"
#include "main.h"

static FILE	*fp[2];
static char	*names[] = {"anglesAndAccels", "misc"};
static char	*months[] = 
    {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};


/**********************************************************************/
/*                                                                    */
/* Function Name: logOpen					      */
/*                                                                    */
/*   Description: Open all Data logs				      */
/*                                                                    */
/*    Parameters:                                                     */
/*                                                                    */
/*       Returns:                                                     */
/*                                                                    */
/**********************************************************************/
int logOpen(void)
{
    int    i;
    time_t now;
    struct tm *tmnow;
    char   nameBuf[128];

    time(&now);
    tmnow = localtime(&now);

    for (i = 0; i < 2; i++)
    {
	sprintf(nameBuf, "%s.%4d%s%02d-%02d%02d%02d.txt",
		names[i], tmnow->tm_year+1900, months[tmnow->tm_mon],
		tmnow->tm_mday, tmnow->tm_hour, tmnow->tm_min,
		tmnow->tm_sec);

	if ((fp[i] = fopen(nameBuf, "w")) == NULL)
	    return(ML_ERROR);
    }

    fprintf(fp[LOG_ANGLES_ACCEL],
	    "Sample      Phi       Theta       Psi         X          Y          Z       Xworld     YWorld     ZWorld     Quat[0]    Quat[1]    Quat[2]    Quat[3]\r\n");

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logClose                                            */
/*                                                                    */
/*   Description: Data log file close                                 */
/*                                                                    */
/*    Parameters:                                                     */
/*                                                                    */
/*       Returns:                                                     */
/*                                                                    */
/**********************************************************************/
void logClose(void)
{
    int   i;

    for (i = 0; i < 6; i++)
	if (fp[i] != NULL)
	{
	    fclose(fp[i]);
	    fp[i] = NULL;
	}
}

/**********************************************************************/
/*                                                                    */
/* Function Name: logAnglesAndAccel				      */
/*                                                                    */
/* Description: Log the received Angles and acceleration packet	      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int  logAnglesAndAccel(AngleAccelPacket *aaData)
{

    fprintf(fp[LOG_ANGLES_ACCEL],
	    "%6hu %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f\r\n",
	    aaData->pktCount,
	    aaData->rcvdEuler[0], aaData->rcvdEuler[1], aaData->rcvdEuler[2],
	    aaData->rcvdAccel[0], aaData->rcvdAccel[1], aaData->rcvdAccel[2],
	    aaData->rcvdAccelWorld[0], aaData->rcvdAccelWorld[1],
	    aaData->rcvdAccelWorld[2],
	    aaData->rcvdQuat[0],aaData->rcvdQuat[1],
	    aaData->rcvdQuat[2],aaData->rcvdQuat[3]);

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logQuat					      */
/*                                                                    */
/* Description: Log the received Quaternion Packet		      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logQuat(tQuatPacket *quatP)
{
//    fprintf(fp[LOG_QUAT], "%.5f %.5f %.5f %.5f %u\r\n",
//	    quatP->quat[0], quatP->quat[1], quatP->quat[2],
//	    quatP->quat[3], quatP->packetCnt);
    
    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logAccel					      */
/*                                                                    */
/* Description: Log the received Acceleration Packet		      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logAccel(tQuatPacket *quatP)
{
//    fprintf(fp[LOG_ACCEL], "%.5f %.5f %.5f %u\r\n",
//	    quatP->rcvdAccel[0], quatP->rcvdAccel[1],
//	    quatP->rcvdAccel[2], quatP->packetCnt);

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logAccelLocal					      */
/*                                                                    */
/* Description: Log the received Acceleration Packet		      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logAccelLocal(tQuatPacket *quatP)
{
//    fprintf(fp[LOG_ACCEL_LOCAL], "%.5f %.5f %.5f %u\r\n",
//	    quatP->rcvdAccelLocal[0], quatP->rcvdAccelLocal[1],
//	    quatP->rcvdAccelLocal[2], quatP->packetCnt);

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logEuler					      */
/*                                                                    */
/* Description: Log the received Euler angle Packet		      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logEuler(tQuatPacket *quatP)
{
//    fprintf(fp[LOG_EULER], "%11.5f %11.5f %11.5f %3u\r\n",
//	    quatP->rcvdEuler[0], quatP->rcvdEuler[1],
//	    quatP->rcvdEuler[2], quatP->packetCnt);

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logEulerFromQuat				      */
/*                                                                    */
/* Description: Log the Euler Angles computed from the Quaternion Packet*/
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logEulerFromQuat(tQuatPacket *quatP)
{
//    fprintf(fp[LOG_EULER_FROM_QUAT], "%11.5f %11.5f %11.5f %u\r\n",
//	    quatP->angle[0] * R2D, quatP->angle[1] * R2D,
//	    quatP->angle[2] * R2D, quatP->packetCnt);

    return(ML_SUCCESS);
}


/**********************************************************************/
/*                                                                    */
/* Function Name: logMisc					      */
/*                                                                    */
/* Description: Log misc packet types				      */
/*                                                                    */
/* Parameters:                                                        */
/*                                                                    */
/* Returns:                                                           */
/*                                                                    */
/**********************************************************************/
int logMisc(unsigned char *pkt, int len)
{
    int   i;

    for (i = 0; i < len; i++)
	if (isprint(pkt[i]))
	    fprintf(fp[LOG_MISC], "%c", pkt[i]);
	else
	    fprintf(fp[LOG_MISC], "\\%03u", pkt[i]);

    fprintf(fp[LOG_MISC], "\r\n");

    return(ML_SUCCESS);
}
