Time-variant Indoor Propagation

Detailed Description

This is an example of how to use the WinProp API for time-variant indoor propagation. The full example is distributed with the installation.
#include <stdio.h>
#include <string>
#include <iostream>

#include "indoor_propagation_timevariant.h"

#ifndef API_DATA_FOLDER
#define API_DATA_FOLDER "../../api/winprop/data/"
#endif // !API_DATA_FOLDER

int main(int argc, char** argv)
{
	int                 Error = 0, ProjectHandle = 0;
	WinProp_Scenario    WinPropScenario;
	WinProp_Callback    WinPropCallback;
	WinProp_Area        WinPropArea;
	WinProp_Antenna     WinPropAntenna;
	WinProp_Dynamic_Antenna *WinPropDynAntenna;
	WinProp_Result      *PowerResult = NULL, *DelayResult = NULL, *LosResult = NULL;
	WinProp_RayMatrix   *RayMatrix = NULL;
	WinProp_Pattern     WinPropPattern;
	WinProp_Additional  WinPropMore;
	WinProp_Propagation_Results OutputResults;
	double              PredictionHeight = 1.5;
	

	/* ------------------ Initialization of structures --------------------------- */
    WinProp_Structure_Init_Scenario(&WinPropScenario);
    WinProp_Structure_Init_Callback(&WinPropCallback);
	WinProp_Structure_Init_Area(&WinPropArea);
	WinProp_Structure_Init_Antenna(&WinPropAntenna);
	WinProp_Structure_Init_Pattern(&WinPropPattern);
	WinProp_Structure_Init_Additional(&WinPropMore);
	WinProp_Structure_Init_Propagation_Results(&OutputResults);

	/* ---------- Load indoor vector database and initialise scenario ------------ */
	/* Assign database name. */
    WinPropScenario.Scenario = WINPROP_SCENARIO_INDOOR;
    char VectorDatabase[500];
    sprintf(VectorDatabase, "%s", API_DATA_FOLDER "../data/indoor/TestSimpleMovingBox.idb");
    WinPropScenario.VectorDatabase = VectorDatabase;
	/* Define callback functions. */
	WinPropCallback.Percentage = CallbackProgress;
	WinPropCallback.Message = CallbackMessage;
	WinPropCallback.Error = CallbackError;


	/* ------------------------- Set up prediction ------------------------------- */
	if (Error == 0)
	{
		/* Definition of prediction area and resolution. */
		WinPropArea.LowerLeftX = 0;
		WinPropArea.LowerLeftY = 0;
		WinPropArea.UpperRightX = 50;
		WinPropArea.UpperRightY = 30.0;
		WinPropArea.Resolution = 1.0; // Resolution 1.0 meter
		WinPropArea.NrHeights = 1; // Number of prediction heights
		WinPropArea.Heights = &PredictionHeight; // Prediction height 1.5 meter

		/* Definition of antenna pattern. */
        WinPropPattern.Mode = PATTERN_MODE_FILE; // Load pattern from file
        char PatternFileName[500];
        sprintf(PatternFileName, "%s", API_DATA_FOLDER "antennas/Antenna.apb");
        WinPropPattern.Filename = PatternFileName; // Pattern file (including extension)

		/* Defintion of antenna properties. */
		WinPropAntenna.Enabled = 1;
		WinPropAntenna.Id = 1;
		WinPropAntenna.SiteId = 1;
		WinPropAntenna.Longitude_X = 5.0;
		WinPropAntenna.Latitude_Y = 5.0;
		WinPropAntenna.Height = 2.5; // Antenna height 2.0 meter
		WinPropAntenna.Model = WINPROP_MODEL_COST231; // Use the COST MW
		WinPropAntenna.DataType = PROP_RESULT_POWER; // Compute received power
		WinPropAntenna.Power = 10.0; // Power in dBm
		WinPropAntenna.Frequency = 1800.0; // Frequency 1800 MHz
		WinPropAntenna.Pattern = &WinPropPattern; // Use pattern defined above
		WinPropAntenna.Azimuth = 270.0; // Antenna points in western direction
		WinPropAntenna.Downtilt = 1.0; // Downtilt of 1 degree

        char AntennaName[500];
        sprintf(AntennaName, "%s", "my_antenna_name");
        WinPropAntenna.Name = AntennaName; // name of the antenna

		/* Definition of outputs to be computed and written in WinProp format. */
		WinPropMore.OutputResults = &OutputResults;
		OutputResults.FieldStrength = 1;
		OutputResults.PathLoss = 1;
		OutputResults.RayFilePropPaths = 1;
		OutputResults.StrFilePropPaths = 1;

		/* Further parameters: With filtering. */
		WinPropMore.ResultFiltering = 1;

		double timeInstances[3] = { 0., .5, 1. };
		/* Call the WinProp API to open a project and load the vector database. */
		Error = WinProp_Open(&ProjectHandle, &WinPropScenario, &WinPropCallback);

		// Set time instance and output folder
		WinPropMore.TimeInstances = timeInstances;
		WinPropMore.NbrTimeInstances = 3;
		OutputResults.ResultPath = API_DATA_FOLDER "output/Indoor_TimeVariant_All_TimeSteps";

		// Definition of dynamic sets for a moving Tx antenna. Alternative is to define the ID of group
		// where Tx antenna is mounted using GroupIDMounted of WinPropAntenna.
		WinPropDynAntenna = (WinProp_Dynamic_Antenna*)malloc(sizeof(WinProp_Dynamic_Antenna) * 3);
		if (WinPropDynAntenna != nullptr)
		{
			WinPropDynAntenna[0].Location = { 5.0f, 5.0f, 2.5f };
			WinPropDynAntenna[0].MovingDir = { 1.0f, 0.0f, 0.0f };
			WinPropDynAntenna[0].Azimuth = 0.f;
			WinPropDynAntenna[0].Downtilt = 0.f;
			WinPropDynAntenna[0].Roll = 0.f;
			WinPropDynAntenna[0].TimeStep = 0.f;
			WinPropDynAntenna[0].Velocity = 10.f;

			WinPropDynAntenna[1].Location = { 10.0f, 5.0f, 2.5f };
			WinPropDynAntenna[1].MovingDir = { 1.0f, 1.0f, 0.0f };
			WinPropDynAntenna[1].Azimuth = 0.f;
			WinPropDynAntenna[1].Downtilt = 0.f;
			WinPropDynAntenna[1].Roll = 0.f;
			WinPropDynAntenna[1].TimeStep = 0.5f;
			WinPropDynAntenna[1].Velocity = 10.f;

			WinPropDynAntenna[2].Location = { 10.0f, 10.0f, 2.5f };
			WinPropDynAntenna[2].MovingDir = { 0.0f, 1.0f, 0.0f };
			WinPropDynAntenna[2].Azimuth = 0.f;
			WinPropDynAntenna[2].Downtilt = 0.f;
			WinPropDynAntenna[2].Roll = 0.f;
			WinPropDynAntenna[2].TimeStep = 1.f;
			WinPropDynAntenna[2].Velocity = 10.f;

			WinPropAntenna.NrTimeVariantSets = 3;
			WinPropAntenna.TimeVariantSets = WinPropDynAntenna;
		}

		/* ----- Start prediction (including loop over all time instances) ------ */
		Error = WinProp_Predict(
			ProjectHandle,
			&WinPropAntenna,
			&WinPropArea,
			nullptr,
			0,
			nullptr,
			&WinPropMore,
			&PowerResult,
			&DelayResult,
			&LosResult,
			&RayMatrix,
			nullptr,
			nullptr,
			nullptr);

		WinProp_Close(ProjectHandle);

		// Free allocated memory
		if (WinPropDynAntenna != nullptr)
			free(WinPropDynAntenna);
	}

	
	return 0;
}

int _STD_CALL CallbackMessage(const char * Text)
{
	if (Text == nullptr)
		return 0;

	std::cout << "\n" << Text;

	return(0);
}

int _STD_CALL CallbackError(const char * Text, int Error)
{
	if (Text == nullptr)
		return 0;

	std::cout << "\n";

#ifdef __LINUX
	std::cout << "\033[31m" << "Error (" << Error << "): "; // highlight error in red color
#else
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
	std::cout << "Error (" << Error << "): ";
#endif // __LINUX
	std::cout << Text;

#ifdef __LINUX
	std::cout << "\033[0m"; // highlight error in red color
#else
	SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif // __LINUX

	return 0;
}

int _STD_CALL CallbackProgress(int value, const char* text)
{
	char Line[200];

	sprintf(Line, "\n%d%% %s", value, text);
	std::cout << Line;

	return(0);
}