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; sprintf(WinPropScenario.VectorDatabase, "%s", API_DATA_FOLDER "../data/indoor/TestSimpleMovingBox.idb"); /* 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 sprintf(WinPropPattern.Filename, "%s", API_DATA_FOLDER "antennas/Antenna.apb"); // 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 sprintf(WinPropAntenna.Name, "%s", "my_antenna_name"); // 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; sprintf(OutputResults.ResultPath, "%s", 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); }