Detailed Description
This is an example of how to use the WinProp API for indoor propagation in point mode. The full example is distributed with the installation.
#include <stdio.h>
#include <string>
#include <iostream>
#include "indoor_propagation_points.h"
#ifndef API_DATA_FOLDER
#define API_DATA_FOLDER "../../api/winprop/data/"
#endif // !API_DATA_FOLDER
int main(int argc, char** argv)
{
const int NrPoints = 3;
int Error = 0, ProjectHandle = 0;
WinProp_Scenario WinPropScenario;
WinProp_Callback WinPropCallback;
WinProp_Receiver WinPropReceiver[NrPoints];
WinProp_Antenna WinPropAntenna;
WinProp_Pattern WinPropPattern;
WinProp_Additional WinPropMore;
WinProp_Propagation_Results OutputResults;
WinProp_Structure_Init_Scenario(&WinPropScenario);
WinProp_Structure_Init_Callback(&WinPropCallback);
WinProp_Structure_Init_Antenna(&WinPropAntenna);
WinProp_Structure_Init_Pattern(&WinPropPattern);
WinProp_Structure_Init_Additional(&WinPropMore);
WinProp_Structure_Init_Propagation_Results(&OutputResults);
for (int loop = 0; loop < NrPoints; loop++)
{
WinProp_Structure_Init_Receiver(&WinPropReceiver[loop]);
}
WinPropScenario.Scenario = WINPROP_SCENARIO_INDOOR;
sprintf(WinPropScenario.VectorDatabase, "%s", API_DATA_FOLDER "../data/indoor/IndoorVectordatabase.idb");
WinPropCallback.Percentage = CallbackProgress;
WinPropCallback.Message = CallbackMessage;
WinPropCallback.Error = CallbackError;
Error = WinProp_Open(&ProjectHandle, &WinPropScenario, &WinPropCallback);
if (Error == 0) {
WinPropReceiver[0].Location.x = 45.0;
WinPropReceiver[0].Location.y = 12.0;
WinPropReceiver[0].Location.z = 0.5;
WinPropReceiver[1].Location.x = 70.0;
WinPropReceiver[1].Location.y = -2.0;
WinPropReceiver[1].Location.z = 1.5;
WinPropReceiver[2].Location.x = 60.0;
WinPropReceiver[2].Location.y = 2.0;
WinPropReceiver[2].Location.z = 2.5;
WinPropPattern.Mode = PATTERN_MODE_FILE;
sprintf(WinPropPattern.Filename, "%s", API_DATA_FOLDER "antennas/Antenna.apb");
WinPropAntenna.Enabled = ANTENNA_ENABLED;
WinPropAntenna.Id = 1;
WinPropAntenna.SiteId = 1;
WinPropAntenna.Longitude_X = 60.25;
WinPropAntenna.Latitude_Y = 6.25;
WinPropAntenna.Height = 2.0;
WinPropAntenna.Model = WINPROP_MODEL_SRT;
WinPropAntenna.DataType = PROP_RESULT_POWER;
WinPropAntenna.Power = 10.0;
WinPropAntenna.Frequency = 1800.0;
WinPropAntenna.Pattern = &WinPropPattern;
WinPropAntenna.Azimuth = 270.0;
WinPropAntenna.Downtilt = 1.0;
sprintf(WinPropAntenna.Name, "%s", "my_antenna_name");
WinPropMore.OutputResults = &OutputResults;
sprintf(OutputResults.ResultPath, "%s", API_DATA_FOLDER "output/indoor_propagation_points/IndoorPoints_Output");
OutputResults.FieldStrength = 1;
OutputResults.PathLoss = 1;
OutputResults.Delay = 1;
OutputResults.DelaySpread = 1;
OutputResults.AngularSpreadMS = 1;
OutputResults.AngularSpreadBS = 1;
OutputResults.AngularMeans = 1;
OutputResults.StatusLOS = 1;
OutputResults.RayFilePropPaths = 1;
OutputResults.StrFilePropPaths = 1;
WinPropMore.ResultFiltering = 1;
WinProp_ResultPointsList* PowerResult = nullptr;
Error = WinProp_Predict_Points(
ProjectHandle, &WinPropAntenna, WinPropReceiver, NrPoints, nullptr, &WinPropMore, &PowerResult, nullptr, nullptr);
if (Error == 0)
{
char PowerOutputFile[200];
sprintf(PowerOutputFile, API_DATA_FOLDER "output/indoor_propagation_points/%s_Power.txt", WinPropAntenna.Name);
write_ascii(PowerResult, PowerOutputFile);
}
WinProp_Structure_Free_ResultPointsList(PowerResult);
}
WinProp_Close(ProjectHandle);
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 << "): ";
#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";
#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(const WinProp_ResultPointsList * Resultmatrix, const char* Filename)
{
FILE* OutputFile = fopen(Filename,"w");
if (OutputFile)
{
for (int p = 0; p < Resultmatrix->NrResultPoints; p++)
{
double result = Resultmatrix->ResultPoints[p].ResultValue;
double Coordinate_X = Resultmatrix->ResultPoints[p].Location.x;
double Coordinate_Y = Resultmatrix->ResultPoints[p].Location.y;
double Coordinate_Z = Resultmatrix->ResultPoints[p].Location.z;
fprintf(OutputFile, "%.2f\t%.2f\t%.2f\t%.2f\n", Coordinate_X, Coordinate_Y, Coordinate_Z, result);
}
fclose(OutputFile);
}
else
printf("\nCould not open the File: %s for writing.\n",Filename);
}