/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : RealTimeClock.cc                                              */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <stdio.h>
#include "RealTimeClock.h"

RealTimeClock::RealTimeClock()
{
  resetMissionTime();
}


RealTimeClock::~RealTimeClock()
{
}

void RealTimeClock::resetMissionTime( void )
{
  clock_gettime(CLOCK_REALTIME, &_missionStartTime);
}

void RealTimeClock::missionTime(struct timespec *current_time)
{
  struct timespec currentTime;
  struct timespec missionTime;

  clock_gettime(CLOCK_REALTIME, &currentTime);

  missionTime.tv_sec  = currentTime.tv_sec  - _missionStartTime.tv_sec;
  missionTime.tv_nsec = currentTime.tv_nsec - _missionStartTime.tv_nsec;

  if ( currentTime.tv_nsec < _missionStartTime.tv_nsec)
  {	
    missionTime.tv_sec--;
    missionTime.tv_nsec += 1000000000;
  }
}

void RealTimeClock::missionTime(char *timestr)
{
  struct timespec time;

  missionTime(&time);
  formatTime(&time, timestr);
}


void RealTimeClock::missionStartTime(struct timespec *missionStartTime)
{
  missionStartTime->tv_sec  = _missionStartTime.tv_sec;
  missionStartTime->tv_nsec = _missionStartTime.tv_nsec;
}

void RealTimeClock::missionStartTime(char *timestr)
{
  formatTime(&_missionStartTime, timestr);
}


void RealTimeClock::gmt(struct timespec *currentTime)
{
  clock_gettime(CLOCK_REALTIME, currentTime);
}

void RealTimeClock::gmt(char *timeStr)
{
  struct timespec currentTime;

  clock_gettime(CLOCK_REALTIME, &currentTime);
  formatTime(&currentTime, timeStr);
}

void RealTimeClock::formatTime(struct timespec *currentTime, char *timestr)
{
  size_t len;
  time_t timer;
  struct tm tmTime;

  timer = currentTime->tv_sec;
  _gmtime(&timer, &tmTime);
  len = strftime(timestr, 32, "%d %h %Y %T", &tmTime);

  sprintf(timestr + len, ".%3d", currentTime->tv_nsec / 1000000);
}


