//void writeSystemTime(struct timespec * p)
//{
//	assert(!clock_settime(CLOCK_REALTIME, p));
//}
// Function for filling the packet structure
void ModbusClientV1::fillTheCommonPacketHeader(RSPacket::PacketStruct & p,
		int cmd)
{
	struct timespec time;
	time.tv_sec = 0x55;
	time.tv_nsec = 0x66;

	p.header.errorcode = 0;
	p.header.cmd = cmd;
	readSystemTime(&time);
	setPacketTime(p, time);
}
void TankFile::readAndValidateHeader()
{
	// Read in the header:
	fileHeader.productId      = readFourCC();
	fileHeader.tankId         = readFourCC();
	fileHeader.headerVersion  = readU32();
	fileHeader.dirsetOffset   = readU32();
	fileHeader.filesetOffset  = readU32();
	fileHeader.indexSize      = readU32();
	fileHeader.dataOffset     = readU32();
	fileHeader.productVersion = readProductVersion();
	fileHeader.minimumVersion = readProductVersion();
	fileHeader.priority       = static_cast<TankFile::Priority>(readU32());
	fileHeader.flags          = readU32();
	fileHeader.creatorId      = readFourCC();
	fileHeader.guid           = readGuid();
	fileHeader.indexCrc32     = readU32();
	fileHeader.dataCrc32      = readU32();
	fileHeader.utcBuildTime   = readSystemTime();
	readBytes(fileHeader.copyrightText, sizeof(fileHeader.copyrightText));
	readBytes(fileHeader.buildText,     sizeof(fileHeader.buildText));
	readBytes(fileHeader.titleText,     sizeof(fileHeader.titleText));
	readBytes(fileHeader.authorText,    sizeof(fileHeader.authorText));
	fileHeader.descriptionText = readWNString();

	// Optional debug printing:
	#if SIEGE_TANK_DEBUG
	SiegeLog("====== TANK HEADER FOR FILE: \"" << fileName << "\" ======");
	SiegeLog("productId.........: " << fileHeader.productId);
	SiegeLog("tankId............: " << fileHeader.tankId);
	SiegeLog("headerVersion.....: " << versionWordToStr(fileHeader.headerVersion));
	SiegeLog("dirsetOffset......: " << toHexa(fileHeader.dirsetOffset)  << " (" << utils::formatMemoryUnit(fileHeader.dirsetOffset)  << ")");
	SiegeLog("filesetOffset.....: " << toHexa(fileHeader.filesetOffset) << " (" << utils::formatMemoryUnit(fileHeader.filesetOffset) << ")");
	SiegeLog("indexSize.........: " << utils::formatMemoryUnit(fileHeader.indexSize));
	SiegeLog("dataOffset........: " << toHexa(fileHeader.dataOffset) << " (" << utils::formatMemoryUnit(fileHeader.dataOffset) << ")");
	SiegeLog("productVersion....: " << fileHeader.productVersion);
	SiegeLog("minimumVersion....: " << fileHeader.minimumVersion);
	SiegeLog("priority..........: " << priorityToString(fileHeader.priority));
	SiegeLog("flags.............: " << fileHeader.flags);
	SiegeLog("creatorId.........: " << fileHeader.creatorId);
	SiegeLog("Guid..............: " << fileHeader.guid);
	SiegeLog("indexCrc32........: " << toHexa(fileHeader.indexCrc32));
	SiegeLog("dataCrc32.........: " << toHexa(fileHeader.dataCrc32));
	SiegeLog("utcBuildTime......: " << fileHeader.utcBuildTime);
	SiegeLog("copyrightText.....: " << toString(fileHeader.copyrightText));
	SiegeLog("buildText.........: " << toString(fileHeader.buildText));
	SiegeLog("titleText.........: " << toString(fileHeader.titleText));
	SiegeLog("authorText........: " << toString(fileHeader.authorText));
	SiegeLog("descriptionText...: " << toString(fileHeader.descriptionText));
	SiegeLog("====== END TANK HEADER ======");
	#endif // SIEGE_TANK_DEBUG

	// Fatal errors:
	if (fileHeader.productId != TankFile::ProductId)
	{
		SiegeThrow(TankFile::Error, "\"" << fileName
				<< "\": Header product id doesn't match the expected value!");
	}
	if (fileHeader.tankId != TankFile::TankId)
	{
		SiegeThrow(TankFile::Error, "\"" << fileName
				<< "\": Header Tank id doesn't match the expected value!");
	}

	// Warnings:
	if (fileHeader.creatorId != TankFile::CreatorIdGPG &&
	    fileHeader.creatorId != TankFile::CreatorIdUser)
	{
		SiegeWarn("Tank creator id is unknown: " << fileHeader.creatorId);
	}
	if (fileHeader.headerVersion != Header::ExpectedVersion)
	{
		SiegeWarn("Unknown Tank header version: " << fileHeader.headerVersion);
	}
}