//------------------------------------------------------------------------------
// <copyright file="TelemetryReport.cpp" company="LiquidRobotics">
//
// Copyright (c) 2014 Liquid Robotics, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// This software is associated with a release.  Liquid Robotics makes no
// representation that the design, interfaces or component distribution will
// remain unchanged in future releases.
//
// </copyright>
//
// <summary>
//   Implementation of TelemetryReport, an entity class that holds formatted or
//   partially-formatted binary streams used for telemetry.
// </summary>
//
// <owner>Mike Cookson</owner>
//------------------------------------------------------------------------------

#include "TelemetryReport.h"
#include "LqrSMACUptime.h"
#include <cmath>

using namespace LiquidRobotics::SMACFramework;

namespace LiquidRobotics {
namespace PayloadInterface {

TelemetryReport::TelemetryReport()
: numSamples(0)
, lastUpdateTime(0)
{
}

void TelemetryReport::AddSample(const ByteArray& value)
{
	lastUpdateTime = GetSystemUpTimeSeconds();

	if (value.size())
	{
		++numSamples;
		samples.insert(samples.end(), value.begin(), value.end());
	}
}

void TelemetryReport::Clear()
{
	numSamples = 0;
	header.clear();
	samples.clear();
}

time_t TelemetryReport::GetDwellTime() const
{
	time_t result = 0;

	if (numSamples)
		result = (time_t) floor(GetSystemUpTimeSeconds()-lastUpdateTime);

	return result;
}

ByteArray::Ptr TelemetryReport::GetFormattedMessage() const
{
	ByteArray::Ptr result;
	result.reset(new ByteArray);

	result->insert(result->end(), header.begin(), header.end());
	result->insert(result->end(), samples.begin(), samples.end());

	return result;
}

const ByteArray& TelemetryReport::GetHeader() const
{
	return header;
}

uint16_t TelemetryReport::GetNumSamples() const
{
	return numSamples;
}

const ByteArray& TelemetryReport::GetSamples() const
{
	return samples;
}

void TelemetryReport::SetHeader(const ByteArray& newValue)
{
	lastUpdateTime = GetSystemUpTimeSeconds();
	header.assign(newValue.begin(), newValue.end());
}

}
}
