Outdoor Propagation

Detailed Description

This is an example of how to directly carry outdoor propagation. The full example is distributed with the installation.
#include <stdio.h>
#include <string>
#include <iostream>

#include "outdoor_propagation.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;
	WinProp_ParaMain    GeneralParameters;
	WinProp_Antenna     Antenna;
	WinProp_Callback    Callback;
	WinProp_Result      Resultmatrix;
	WinProp_RayMatrix   RayMatrix;
	WinProp_Propagation_Results OutputResults;

	char* my_opb_database = API_DATA_FOLDER "outdoor/City"; // name of .opb database without extensions 

	/* ------------------------ Initialisation of parameters ----------------------*/
	WinProp_Structure_Init_ParameterMain(&GeneralParameters);
	WinProp_Structure_Init_Antenna(&Antenna);
	WinProp_Structure_Init_Result(&Resultmatrix);
	WinProp_Structure_Init_RayMatrix(&RayMatrix);
	WinProp_Structure_Init_Propagation_Results(&OutputResults);

	/*---------------- Definition of scenario -------------------------------------*/
	/* Definition of general parameters. */
	GeneralParameters.ScenarioMode = SCENARIOMODE_URBAN; // Urban prediction
	GeneralParameters.PredictionModelUrban = PREDMODEL_UDP; // Use Dominant Path Model

	/* Definition of prediction area. */
	GeneralParameters.UrbanLowerLeftX = 100.0;
	GeneralParameters.UrbanLowerLeftY = 100.0;
	GeneralParameters.UrbanUpperRightX = 2200.0;
	GeneralParameters.UrbanUpperRightY = 3200.0;

	/* Copy coordinates to prediction area of second model (not yet used) */
	GeneralParameters.RuralLowerLeftX = GeneralParameters.UrbanLowerLeftX;
	GeneralParameters.RuralLowerLeftY = GeneralParameters.UrbanLowerLeftY;
	GeneralParameters.RuralUpperRightX = GeneralParameters.UrbanUpperRightX;
	GeneralParameters.RuralUpperRightY = GeneralParameters.UrbanUpperRightY;

	double PredictionHeight = 1.5;

	/* Size of matrix with results. */
	GeneralParameters.Resolution = 10.0;                     // Resolution in meter
	GeneralParameters.NrLayers = 1;                          // Number of prediction heights
	GeneralParameters.PredictionHeights = &PredictionHeight; // Prediction height in meter

	/* Building vector data and topography. */
	GeneralParameters.BuildingsMode = BUILDINGSMODE_UDP; // load a .opb database (urban+topo)
	sprintf(GeneralParameters.BuildingsName, "%s", my_opb_database); // Vector database in WinProp format (contains topography)

	/*--------------------------- Definition of antenna ---------------------------*/
	/* Position and configuration. */
	Antenna.Id = 1;
	Antenna.Longitude_X = 1100.0;
	Antenna.Latitude_Y = 2100.0;
	Antenna.Height = 20.0;
	Antenna.Power = 43.0; // Power in dBm
	Antenna.Frequency = 1800.0; // Frequency in MHz
	Antenna.Name = "Antenna 1";

	/* Definition of outputs to be computed and written in WinProp format. */
	GeneralParameters.OutputResults = &OutputResults;
	OutputResults.ResultPath = API_DATA_FOLDER "output/OutdoorArea_Output"; // Output data directory 
	OutputResults.FieldStrength = 1;
	OutputResults.PathLoss = 1;
	OutputResults.StatusLOS = 1;
	OutputResults.RayFilePropPaths = 1;
	OutputResults.StrFilePropPaths = 1;

	/*-------------------------- Callbacks ----------------------------------------*/
	Callback.Percentage = CallbackProgress;
	Callback.Message = CallbackMessage;
	Callback.Error = CallbackError;

	/*----------------------- Compute outdoor prediction --------------------------*/
	Error = OutdoorPlugIn_ComputePrediction(&Antenna, &GeneralParameters, NULL, NULL, NULL, NULL, &Callback, &Resultmatrix, &RayMatrix, NULL);
	
	/*----------------------- Do something with results ---------------------------*/
	if (Error == 0) {
		char* Filename = API_DATA_FOLDER "output/Results.txt";
		write_ascii(Resultmatrix, Filename);
	}
	else {
		/* Error during prediction. Print error message. */
		CallbackError(GeneralParameters.ErrorMessageMain, Error);
	}

	/*----------------------------- Free memory -----------------------------------*/
	WinProp_FreeResult(&Resultmatrix);
	WinProp_FreeRayMatrix(&RayMatrix);
	
	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);
}

void write_ascii(WinProp_Result Resultmatrix, char* Filename) {
	FILE* OutputFile = fopen(Filename,"w");
	if (OutputFile)
	{
		/* Loop all pixels. */
		for (int x = 0; x < Resultmatrix.Columns; x++)
		{
			for (int y = 0; y < Resultmatrix.Lines; y++)
			{
				/* Compute real coordinates. */
				double Coordinate_X = Resultmatrix.LowerLeftX + ((double)x + 0.5) * Resultmatrix.Resolution;
				double Coordinate_Y = Resultmatrix.LowerLeftY + ((double)y + 0.5) * Resultmatrix.Resolution;

				/* Check if pixel was computed or not */
				if (Resultmatrix.Matrix[0][x][y] > -1000)
					fprintf(OutputFile, "%.2f\t%.2f\t%.2f\n", Coordinate_X, Coordinate_Y, Resultmatrix.Matrix[0][x][y]);
			}
		}

		/* Close file. */
		fclose(OutputFile);
	}
	else
		printf("\nCould not open the File: %s for writing.\n",Filename);
}