/* -------------------------------------------------------------------- // $HeadURL$ // -------------------------------------------------------------------- //! // -------------------------------------------------------------------- // COPYRIGHT (C) 1999: STN ATLAS ELEKTRONIK GMBH, D-28305 BREMEN // -------------------------------------------------------------------- // // HIER/ITEM : CSU: RP 5182 P 005 SRC 01104 // BRIEF DESC: Funktionalitaet Mineninterpreter // AUTHOR : Ingo Kannetzky // RELEASE : // MODIF/STAT: 22.02.00 // ORIGIN REF: // // Revision INFO: // -------------- // $Revision$ // $Date$ // $Id$ // // LANGUAGE: C++ (Compiler: XXX Version: XXX) // // PURPOSE: // -------- // Funktionalitaet Mineninterpreter // // ERROR HANDLING: // --------------- // (keine / Beschreibung) // // IMPLEMENTATION DETAILS: // ----------------------- // (keine / Beschreibung) // //! */ //------------------ revision id-code ---------------------- //------------------ includes ------------------------------ #include #include #include #include #include "zssi_wi_Minenfeld_Interpreter.h" #include "zssi_wi_Minenfeld_Generator.h" #include "logger.h" //------------------ externals (procs + vars) -------------- //------------------ constants/ defines -------------------- const int T_allein_Luecke_max = 120; // in Sekunden const int S_allein_Luecke_max = 30; // in Metern const int T_allein_max = 180; // in Sekunden, groesser als t_allein_Luecke_max! const int S_allein_max = 100; // in Metern, groesser als s_allein_Luecke_max! const int W_allein_max = 40; // in Grad 0..89 const int T_zusammen_max = 240; // in Sekunden const int S_zusammen_max = 100; // in Metern const int W_zusammen_max = 20; // in Grad 0..89 //------------------ types --------------------------------- //------------------ globals ------------------------------- extern GFS_Map_Container interne_datenbasis_Verlegedaten; extern GFS_Map_Container interne_datenbasis_Fahrspur; static NGL::INGLLogger &loggerMI() { return GuezMinelayerProcessing::getLogger("zssi_wi_Minenfeld_Interpreter"); } struct PositionMitZeit { gps_position_rt pos; time_t zeit = 0; }; //------------------ function prototypes ------------------- //f+----------------------------------------------------------------------- // copied from zssi_wi_Minen_math.cpp //f+----------------------------------------------------------------------- int Winkel_zwischen_Fahrspuren_eines_Fz(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Der Richtungssinn der Fahrspuren wird berueksichtigt so, dass // mit engegengesetztem Richtungssinn angelegte, parallele Fahrspuren den // Winkel 0 einschliessen, dagegen schliessen parallele Fahrspuren, welche // mit dem selben Richtungssinn verlegt wurden, einen Winkel von 180 Grad // ein. // Sollten die zur Berechnung des Winkels erforderlichen Werte nicht // gefunden werden, so gibt diese Funktion -1 zurueck // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { double F1x2 = -1; double F1y2 = -1; double F2x1 = -1; double F2y1 = -1; double F2x2 = -1; double F2y2 = -1; double delta_w; //Als Fahrspur 1(F1xx) wird die aeltere Fahrspur angesehen interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); const ausstattungs_id_t fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; //Es wird davon ausgegangen, dass der Iterator nun auf dem //Verlegeende-Eintrag der Fahrspur 1 steht double F1x1 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; double F1y1 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; //Nun wird der Iterator auf den zugehoerigen Verlegeanfang gesetzt while ((interne_datenbasis_Fahrspur.iter_modify(-1)) && (F1x2 == -1)) { if (interne_datenbasis_Fahrspur.getData()->intstat == 3) { F1x2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; F1y2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; } } //Iterator wieder auf den aktuellen Endeeintrag setzen interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); //Der naechste Eintrag sollte der Verlegeanfang der naechsten Fahrspur //sein if (interne_datenbasis_Fahrspur.iter_modify(+1)) { if ((interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet == fahrzeug_identitaet) && (interne_datenbasis_Fahrspur.getData()->intstat == 3)) { F2x1 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; F2y1 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; //Nun wird nach dem aktuellsten Eintrag fuer die Fahrspur 2 gesucht while ((interne_datenbasis_Fahrspur.iter_modify(+1)) && (interne_datenbasis_Fahrspur.getData()->intstat == 2)) { if (interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet == fahrzeug_identitaet) { F2x2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; F2y2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; } } } } //Iterator wieder auf den aktuellen Endeeintrag setzen interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); if (((F1x1 == -1) || (F1x2 == -1)) || ((F2x1 == -1) || (F2x2 == -1))) delta_w = -1; else { double m1, m2; if (F1x2 - F1x1 != 0) m1 = (F1y2 - F1y1) / (F1x2 - F1x1); else m1 = 100000; //um eine Fallunterscheidung zu vermeiden if (F2x2 - F2x1 != 0) m2 = (F2y2 - F2y1) / (F2x2 - F2x1); else m2 = 100000; //um eine Fallunterscheidung zu vermeiden if (m1 * m2 != -1) delta_w = atanf((m2 - m1) / (1 + (m1 * m2))); else delta_w = M_PI / 2; // rad -> grad delta_w *= 180 / M_PI; //Der Anfangspunkt der Fahrspur 2 muss am weitesten vom Beginn der //Fahrspur entfernt sein if (Punktabstand(F1x2, F1y2, F2x1, F2y1) < Punktabstand(F1x2, F1y2, F2x2, F2y2)) delta_w = 180 - delta_w; } return lrint(delta_w); }//end Winkel_zwischen_Fahrspuren_eines_Fz //------------------------------------------------------------------------- // copied from zssi_wi_Minen_math.cpp //f+----------------------------------------------------------------------- int Winkel_zwischen_Fahrspuren_mehrerer_Fz( const VERLEGEDATEN_KEY &F1_ende_key, const VERLEGEDATEN_KEY &F2_anfang_key) //------------------------------------------------------------------------- // PURPOSE: // Der Richtungssinn der Fahrspuren wird berueksichtigt so, dass // mit gleichem Richtungssinn angelegte, parallele Fahrspuren den // Winkel 0 einschliessen, dagegen schliessen parallele Fahrspuren, welche // mit entgegengesetzten Richtungssinn verlegt wurden, einen Winkel von 180 // Grad ein. // Sollten die zur Berechnung des Winkels erforderlichen Werte nicht // gefunden werden, so gibt diese Funktion -1 zurueck // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { double F1x2 = -1; double F1y2 = -1; double F2x2 = -1; double F2y2 = -1; double delta_w; //Iterator auf den aktuellen Endpunkt setzen interne_datenbasis_Fahrspur.finden_eintrag_container(F1_ende_key); //F1_fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> // daten.header.identitaet; double F1x1 = interne_datenbasis_Fahrspur.getData()->daten.gps_position.utm_ostwert; double F1y1 = interne_datenbasis_Fahrspur.getData()->daten.gps_position.utm_nordwert; //Nun wird der Iterator auf den zugehoerigen Verlegeanfang gesetzt while ((interne_datenbasis_Fahrspur.iter_modify(-1)) && (F1x2 == -1)) { if (interne_datenbasis_Fahrspur.getData()->intstat == 3) { F1x2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; F1y2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; } } //Iterator auf den Anfangspunkt der zweiten Fahrspur setzen interne_datenbasis_Fahrspur.finden_eintrag_container(F2_anfang_key); const ausstattungs_id_t F2_fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; double F2x1 = interne_datenbasis_Fahrspur.getData()->daten.gps_position.utm_ostwert; double F2y1 = interne_datenbasis_Fahrspur.getData()->daten.gps_position.utm_nordwert; //Nun wird nach dem aktuellsten Eintrag fuer die Fahrspur 2 gesucht while ((interne_datenbasis_Fahrspur.iter_modify(+1)) && (interne_datenbasis_Fahrspur.getData()->intstat == 2)) { if (interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet == F2_fahrzeug_identitaet) { F2x2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_ostwert; F2y2 = interne_datenbasis_Fahrspur.getData()-> daten.gps_position.utm_nordwert; } } if (((F1x1 == -1) || (F1x2 == -1)) || ((F2x1 == -1) || (F2x2 == -1))) delta_w = -1; else { double m1, m2; if (F1x2 - F1x1 != 0) m1 = (F1y2 - F1y1) / (F1x2 - F1x1); else m1 = 100000; //um eine Fallunterscheidung zu vermeiden if (F2x2 - F2x1 != 0) m2 = (F2y2 - F2y1) / (F2x2 - F2x1); else m2 = 100000; //um eine Fallunterscheidung zu vermeiden if (m1 * m2 != -1) delta_w = atanf((m2 - m1) / (1 + (m1 * m2))); else delta_w = M_PI / 2; // rad -> deg delta_w *= 180 / M_PI; //Der Anfangspunkt der Fahrspur 2 muss am weitesten vom Ende der //Fahrspur 1 entfernt sein if (Punktabstand(F1x1, F1y1, F2x2, F2y2) > Punktabstand(F1x1, F1y1, F2x1, F2y1)) delta_w = 180 - delta_w; } //Iterator auf den aktuellen Anfangseintrag setzen!!!!!!!! interne_datenbasis_Fahrspur.finden_eintrag_container(F2_anfang_key); return lrint(delta_w); }//end Winkel_zwischen_Fahrspuren_mehrerer_Fz //------------------------------------------------------------------------- void GuezMinelayerProcessing::ZSSI_WI_Minenfeld_Interpreter::ZSSI_WI_Erstelle_einzel_minensperre(const VERLEGEDATEN_KEY &key, const VERLEGEDATEN_INTERN &daten) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Interpretationsstatus des Eintrages // im Map-Container interne_datenbasis_Fahrspur, der unmittelbar vor dem // Verlegebeginn der aktuellen Fahrspur liegt. Ist kein solcher Eintrag // vorhanden liefert sie -1 zurueck. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = key.fz_id; const short Fz_art = 2; NGL::INGLLogger &m_logger(loggerMI()); wirkfeld_minensperre_rt telegramm; bes_wirkfeld_minensperre_rt &sperrenmodell = telegramm.beschreibung; // Minensperre = Quadrat 25x25m, 5 Minen => verlegedichte = 0.2, 1 Segment sperrenmodell.wirkbeginn.gps_zeit = daten.daten.verlegedaten.wirkbeginn.gps_zeit; sperrenmodell.wirkdauer = daten.daten.verlegedaten.wirkzeit; sperrenmodell.minentyp = daten.daten.verlegedaten.minentyp; sperrenmodell.eckpunkt.utm_nordwert = daten.daten.gps_position.utm_nordwert - 12; sperrenmodell.eckpunkt.utm_ostwert = daten.daten.gps_position.utm_ostwert - 12; sperrenmodell.wirkfeldbreite = 25; sperrenmodell.wirkfeldtiefe = 25; sperrenmodell.verlegetiefe = 25; // sperrenmodell.verlegedichte = 2; sperrenmodell.verlegedichte = lrint(0.2 * FAKTOR_VERLEGEDICHTE); sperrenmodell.minenanzahl = 5; sperrenmodell.segmente.resize(1); sperrenmodell.segmente[0].startpunkt.utm_nordwert = daten.daten.gps_position.utm_nordwert; sperrenmodell.segmente[0].startpunkt.utm_ostwert = daten.daten.gps_position.utm_ostwert - 12; sperrenmodell.segmente[0].anzahl = 5; sperrenmodell.segmente[0].drehwinkel = 0; //Kontrollausgabe INFO_LOG(m_logger) << QStringLiteral("Einspuriges Minensperrenmodell wurde erstellt. Wirkbeginn: %1 Wirkdauer:%2 Verlegetiefe:%3 Verlegedichte:%4 Minentyp:%5 Minenanzahl:%6 Segmentanzahl:%7").arg(sperrenmodell.wirkbeginn.gps_zeit).arg(sperrenmodell.wirkdauer).arg(sperrenmodell.verlegetiefe).arg(sperrenmodell.verlegedichte).arg(sperrenmodell.minentyp).arg(sperrenmodell.minenanzahl).arg(sperrenmodell.segmente.size()); for (unsigned s = 0; s < sperrenmodell.segmente.size(); s++) INFO_LOG(m_logger) << QStringLiteral("Segment[%1] Startpunkt: %2 %3 Drehwinkel:%4 Anzahl:%5").arg(s) .arg(sperrenmodell.segmente.at(s).startpunkt.utm_ostwert) .arg(sperrenmodell.segmente.at(s).startpunkt.utm_nordwert) .arg(sperrenmodell.segmente.at(s).drehwinkel) .arg(sperrenmodell.segmente.at(s).anzahl); telegramm.beschreibung.kennung = daten.daten.verlegedaten.sperren_id; telegramm.header.identitaet = fahrzeug_identitaet; emit sendeWirkfeld(telegramm, Fz_art); } // end ZSSI_WI_Erstelle_einzel_minensperre //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- void GuezMinelayerProcessing::ZSSI_WI_Minenfeld_Interpreter::ZSSI_WI_modifiziere_Verlegedaten(const VERLEGEDATEN_KEY &key, const VERLEGEDATEN_INTERN &daten) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Interpretationsstatus des Eintrages // im Map-Container interne_datenbasis_Fahrspur, der unmittelbar vor dem // Verlegebeginn der aktuellen Fahrspur liegt. Ist kein solcher Eintrag // vorhanden liefert sie -1 zurueck. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { int verlegedaten_size = interne_datenbasis_Verlegedaten.size(); bool gefunden = false; VERLEGEDATEN_INTERN *hilfs_daten = nullptr; NGL::INGLLogger &m_logger(loggerMI()); if (verlegedaten_size == 0) { ZSSI_WI_Erstelle_einzel_minensperre(key, daten); return; } interne_datenbasis_Verlegedaten.iter_reset(); interne_datenbasis_Verlegedaten.iter_modify(verlegedaten_size); while (verlegedaten_size > 0) { const VERLEGEDATEN_KEY &hilfs_key = interne_datenbasis_Verlegedaten.getKey(); if ((key.fz_id == hilfs_key.fz_id) && std::abs((int)(key.zeitpunkt.gps_zeit - hilfs_key.zeitpunkt.gps_zeit)) <= T_zusammen_max) { hilfs_daten = interne_datenbasis_Verlegedaten.getData(); if (hilfs_daten->daten.verlegedaten.anzahl_verlegter_minen != 0) { gefunden = true; break; } } interne_datenbasis_Verlegedaten.iter_modify(-1); verlegedaten_size--; } if (gefunden) { hilfs_daten->daten.verlegedaten.anzahl_verlegter_minen += daten.daten.verlegedaten.anzahl_verlegter_minen; INFO_LOG(m_logger) << QStringLiteral("Verlegeende gefunden! Anz_Minen = %1").arg(hilfs_daten->daten.verlegedaten.anzahl_verlegter_minen); } else ZSSI_WI_Erstelle_einzel_minensperre(key, daten); } // end ZSSI_WI_modifiziere_Verlegedaten //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- int Eintrag_vor_zugehoerigem_Verlegebeginn(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Interpretationsstatus des Eintrages // im Map-Container interne_datenbasis_Fahrspur, der unmittelbar vor dem // Verlegebeginn der aktuellen Fahrspur liegt. Ist kein solcher Eintrag // vorhanden liefert sie -1 zurueck. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { VERLEGEDATEN_KEY anfangspunkt_key = intern_key; // Map-Container auf aktuellen Eintrag setzen interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); const ausstattungs_id_t fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; //Suchen des vorhergehenden Eintrages des Fz mit is == 3 (Anfangspunkt) while (((interne_datenbasis_Fahrspur.iter_modify(-1)) && (interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet == fahrzeug_identitaet)) && (intern_key == anfangspunkt_key) ) { if (interne_datenbasis_Fahrspur.getData()->intstat == 3) anfangspunkt_key = interne_datenbasis_Fahrspur.getKey(); } //Iterator auf den gefundenen Anfangspunkt positionieren interne_datenbasis_Fahrspur.finden_eintrag_container(anfangspunkt_key); //Interpretationsstatus vom Vorgaenger lesen int is = 1; if ((interne_datenbasis_Fahrspur.iter_modify(-1)) && (intern_key != anfangspunkt_key)) is = interne_datenbasis_Fahrspur.getData()->intstat; return (is); } // end Eintrag_vor_zugehoerigem_Verlegebeginn //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- int Eintrag_nach_dieser_MVP(VERLEGEDATEN_KEY intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Interpretationsstatus des Eintrages // im Map-Container interne_datenbasis_Fahrspur, der unmittelbar nach // dem aktuellen Eitrag fuer dieses Fz vorliegt. Ist kein solcher // Eintrag vorhanden, liefert sie -1 zurueck. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { // Map-Container auf aktuellen Eintrag setzen interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); const ausstattungs_id_t fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; //Auslesen des nachfolgenden Eintrags fuer dieses Fz falls dieser //vorhanden ist int is = -1; if ((interne_datenbasis_Fahrspur.iter_modify(+1)) && (interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet == fahrzeug_identitaet) ) is = interne_datenbasis_Fahrspur.getData()->intstat; return (is); } // end Eintrag_nach_dieser_MVP //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- VERLEGEDATEN_KEY Key_des_zugehoerigen_Verlegebeginns(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Eintrag im Map-Container // interne_datenbasis_Fahrspur, der zu der uebergebenen Verlegeende-MVP // den zugehoerigen Verlegebeginn bildet und liefert den Key zurueck. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { VERLEGEDATEN_KEY anfangspunkt_key = intern_key; auto it = interne_datenbasis_Fahrspur.c().find(intern_key); if (it == interne_datenbasis_Fahrspur.c().end()) return anfangspunkt_key; const ausstattungs_id_t fahrzeug_identitaet = it->second.daten.header.identitaet; do { --it; //Suchen des vorhergehenden Eintrages des Fz mit is == 3 (Anfangspunkt) if (it->second.daten.header.identitaet != fahrzeug_identitaet) break; if (it->second.intstat == 3) { anfangspunkt_key = it->first; break; } } while (it != interne_datenbasis_Fahrspur.c().begin()); return anfangspunkt_key; } // end of Key_des_zugehoerigen_Verlegebeginns //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- VERLEGEDATEN_KEY Key_des_zugehoerigen_Verlegeendes(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Eintrag im Map-Container // interne_datenbasis_Fahrspur, der zu der uebergebenen Verlegeende-MVP // das zugehoerige Verlegeende bildet und liefert den Key zurueck. // Wird kein entsprechender Eintrag gefunden, wird der uebergebene Key // zurueckgeliefert. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { VERLEGEDATEN_KEY endpunkt_key = intern_key; auto it = interne_datenbasis_Fahrspur.c().find(intern_key); if (it == interne_datenbasis_Fahrspur.c().end()) return endpunkt_key; const ausstattungs_id_t fahrzeug_identitaet = it->second.daten.header.identitaet; ++it; while (it != interne_datenbasis_Fahrspur.c().end()) { if (it->second.daten.header.identitaet != fahrzeug_identitaet) break; if (it->second.intstat > 3) { endpunkt_key = it->first; break; } ++it; } return (endpunkt_key); } // end of Key_des_zugehoerigen_Verlegeendes //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static int IS_des_zugehoerigen_Verlegeendes(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt den Interpretationsstatus des Eintrags im // Map-Container interne_datenbasis_Fahrspur, der zu der uebergebenen // Verlegeanfangs-MVP das zugehoerige Verlegeende bildet und liefert // ihn zurueck. // Falls das Verlegeende noch nicht vorhanden ist, wird -1 // zurueckgegeben. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { //Suchen des nachfolgenden Eintrages des Fz mit is >3 for (auto it = interne_datenbasis_Fahrspur.c().find(intern_key) ; it != interne_datenbasis_Fahrspur.c().end(); ++it) { const FAHRSPUR_INTERN &fs = it->second; if (fs.daten.header.identitaet != intern_key.fz_id) break; if (fs.intstat <= 3) continue; return fs.intstat; } return -1; } // end of IS_des_zugehoerigen_Verlegeendes //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- VERLEGEDATEN_KEY Key_eines_Verlegebeginns_im_Zeitfenster(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Es wird sich im folgenden auf den zugehoerigen Verlegebeginn zur // uebergebenen Verlegeende-MVP bezogen. // Diese Funktion ermittelt einen Verlegebeginn-Eintrag aus dem // Map-Container interne_datenbasis_Fahrspur, der zu der (uebergebenen) // Verlegeanfangs-MVP im Zeitbereich +/- T_zusammen_max liegt und die // S_zusammen_max einhaelt sowie von einem anderen Fz stammt. // Vom gefundenen Eintrag wird der Key zurueckgeliefert, bzw. der // uebergebnene Key, wenn kein solcher Eintrag gefunden wird. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { VERLEGEDATEN_KEY anfangspunkt_key = intern_key; //Der Eintrag darf nicht vom selben Fz stammen wie der Endeeintrag interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); const ausstattungs_id_t fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; // Map-Container auf den zum uebergebenen Endeeintrag passenden Anfang // setzen interne_datenbasis_Fahrspur.finden_eintrag_container( Key_des_zugehoerigen_Verlegebeginns(intern_key)); const unsigned int zeitpunkt_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_zeit.gps_zeit; const gps_position_rt ort_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_position; // Map-Container auf den Anfang setzen interne_datenbasis_Fahrspur.iter_reset(); bool map_test = interne_datenbasis_Fahrspur.size() > 0; //Suchen des naechsten Eintrages eines anderen Fz mit is == 3 while ((map_test) && (anfangspunkt_key == intern_key)) { if (interne_datenbasis_Fahrspur.getData()->intstat == 3) { if((interne_datenbasis_Fahrspur.getData()->daten.header.identitaet != fahrzeug_identitaet) && (interne_datenbasis_Fahrspur.getData()->daten.gps_zeit.gps_zeit <= T_zusammen_max + zeitpunkt_verlegebeginn) && (interne_datenbasis_Fahrspur.getData()->daten.gps_zeit.gps_zeit > zeitpunkt_verlegebeginn - T_zusammen_max) && (Punktabstand(interne_datenbasis_Fahrspur.getData()->daten.gps_position, ort_verlegebeginn) < S_zusammen_max) && (IS_des_zugehoerigen_Verlegeendes(interne_datenbasis_Fahrspur.getKey()) != 6) && (IS_des_zugehoerigen_Verlegeendes(interne_datenbasis_Fahrspur.getKey()) != 7)) { if((Winkel_zwischen_Fahrspuren_mehrerer_Fz(intern_key,interne_datenbasis_Fahrspur.getKey()) <= W_zusammen_max) && (Winkel_zwischen_Fahrspuren_mehrerer_Fz(intern_key,interne_datenbasis_Fahrspur.getKey()) != -1)) anfangspunkt_key = interne_datenbasis_Fahrspur.getKey(); } } map_test = interne_datenbasis_Fahrspur.iter_modify(+1); } return (anfangspunkt_key); } // end of Key_eines_Verlegebeginns_im_Zeitfenster //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static VERLEGEDATEN_KEY Eine_Nachbarspur_ist_unvollstaendig( const VERLEGEDATEN_KEY &intern_key, int IS1, int IS2) //------------------------------------------------------------------------- // PURPOSE: // Es wird sich im folgenden auf den zugehoerigen Verlegebeginn zur // uebergebenen Verlegeende-MVP bezogen. // Diese Funktion ermittelt einen Verlegebeginn-Eintrag aus dem // Map-Container interne_datenbasis_Fahrspur, der zu der (uebergebenen) // Verlegeanfangs-MVP im Zeitbereich +/- T_zusammen_max liegt und die // S_zusammen_max einhaelt sowie von einem anderen Fz stammt // UND keinen zugehoerigen Verlegeendeeintrag aufweist der // Interpretationsstatus 8 oder 10 hat. // Vom gefundenen Eintrag wird der Key zurueckgeliefert, bzw. der // uebergebnene Key, wenn kein solcher Eintrag gefunden wird. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { VERLEGEDATEN_KEY langsamerer_partner_key = intern_key; //Der Eintrag darf nicht vom selben Fz stammen wie der Endeeintrag interne_datenbasis_Fahrspur.finden_eintrag_container(intern_key); const ausstattungs_id_t fahrzeug_identitaet = interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet; // Map-Container auf den zum uebergebenen Endeeintrag passenden Anfang // setzen interne_datenbasis_Fahrspur.finden_eintrag_container( Key_des_zugehoerigen_Verlegebeginns(intern_key)); const unsigned int zeitpunkt_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_zeit.gps_zeit; const gps_position_rt ort_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_position; // Map-Container auf den Anfang setzen interne_datenbasis_Fahrspur.iter_reset(); bool map_test = interne_datenbasis_Fahrspur.size() > 0; //Suchen des naechsten Eintrages eines anderen Fz mit is == 3 while ((map_test) && (langsamerer_partner_key == intern_key)) { if (interne_datenbasis_Fahrspur.getData()->intstat == 3) { if ( (interne_datenbasis_Fahrspur.getData()-> daten.header.identitaet != fahrzeug_identitaet) && (interne_datenbasis_Fahrspur.getData()-> daten.gps_zeit.gps_zeit <= T_zusammen_max + zeitpunkt_verlegebeginn) && (interne_datenbasis_Fahrspur.getData()-> daten.gps_zeit.gps_zeit > zeitpunkt_verlegebeginn - T_zusammen_max) && (Punktabstand(interne_datenbasis_Fahrspur.getData()-> daten.gps_position, ort_verlegebeginn) < S_zusammen_max) && (IS_des_zugehoerigen_Verlegeendes(interne_datenbasis_Fahrspur.getKey()) != IS1) && (IS_des_zugehoerigen_Verlegeendes(interne_datenbasis_Fahrspur.getKey()) != IS2) ) { if ((Winkel_zwischen_Fahrspuren_mehrerer_Fz( intern_key, interne_datenbasis_Fahrspur.getKey()) <= W_zusammen_max) && (Winkel_zwischen_Fahrspuren_mehrerer_Fz( intern_key, interne_datenbasis_Fahrspur.getKey()) != -1) ) langsamerer_partner_key = interne_datenbasis_Fahrspur.getKey(); } } map_test = interne_datenbasis_Fahrspur.iter_modify(+1); } return (langsamerer_partner_key); } // end of Eine_Nachbarspur_ist_unvollstaendig //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static void Gib_den_Partnern_IS11(VERLEGEDATEN_KEY intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion ermittelt alle Verlegebeginn-Eintraege aus dem // Map-Container interne_datenbasis_Fahrspur, die zur selben Minensperre // gehoeren, wie die eine MVP mit IS 11 und versieht diese ebenfalls mit // IS 11. // // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { DEBUG_LOG(loggerMI()) << "Gib_den_Partnern_IS11: " << intern_key.fz_id << "," << intern_key.zeitpunkt.gps_zeit; VERLEGEDATEN_KEY endpunkt_key_eines_partners = intern_key; for (int i = 0; i < 2; i++) { intern_key = endpunkt_key_eines_partners; // Map-Container auf den zum uebergebenen Endeeintrag passenden Anfang // setzen interne_datenbasis_Fahrspur.finden_eintrag_container( Key_des_zugehoerigen_Verlegebeginns(endpunkt_key_eines_partners)); const unsigned int zeitpunkt_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_zeit.gps_zeit; const gps_position_rt ort_verlegebeginn = interne_datenbasis_Fahrspur.getData()->daten.gps_position; // Map-Container auf den Anfang setzen interne_datenbasis_Fahrspur.iter_reset(); bool map_test = interne_datenbasis_Fahrspur.size() > 0; //Suchen des naechsten Eintrages eines anderen Fz mit is == 3 while (map_test) { if ((interne_datenbasis_Fahrspur.getData()->intstat == 3) && (IS_des_zugehoerigen_Verlegeendes(interne_datenbasis_Fahrspur.getKey()) == 10)) { if ( (interne_datenbasis_Fahrspur.getData()-> daten.gps_zeit.gps_zeit <= T_zusammen_max + zeitpunkt_verlegebeginn) && (interne_datenbasis_Fahrspur.getData()-> daten.gps_zeit.gps_zeit > zeitpunkt_verlegebeginn - T_zusammen_max) && (Punktabstand(interne_datenbasis_Fahrspur.getData()-> daten.gps_position, ort_verlegebeginn) < S_zusammen_max) && (Winkel_zwischen_Fahrspuren_mehrerer_Fz( intern_key,interne_datenbasis_Fahrspur.getKey()) <= W_zusammen_max) && (Winkel_zwischen_Fahrspuren_mehrerer_Fz( intern_key,interne_datenbasis_Fahrspur.getKey()) != -1) ) { //Der zugehoerige Verlegeende-Eintrag wird mit //Interpretationsstatus 11 versehen //Suchen des nachfolgenden Eintrages des Fz mit is ==10 while ((interne_datenbasis_Fahrspur.iter_modify(+1)) && (interne_datenbasis_Fahrspur.getData()->intstat != 10)) ; endpunkt_key_eines_partners = interne_datenbasis_Fahrspur.getKey(); interne_datenbasis_Fahrspur.getData()->intstat = 11; interne_datenbasis_Fahrspur.iter_reset(); } } map_test = interne_datenbasis_Fahrspur.iter_modify(+1); } } } // end of Gib_den_Partnern_IS11 //------------------------------------------------------------------------- static inline PositionMitZeit getPrev(std::map::const_iterator it, ausstattungs_id_t identitaet) { PositionMitZeit ret; if (it == interne_datenbasis_Fahrspur.c().begin()) return ret; --it; if (it->second.daten.header.identitaet != identitaet) return ret; ret.pos = it->second.daten.gps_position; ret.zeit = it->second.daten.gps_zeit.gps_zeit; return ret; } static inline PositionMitZeit getCurr(const std::map::const_iterator &it) { PositionMitZeit ret; ret.pos = it->second.daten.gps_position; ret.zeit = it->second.daten.gps_zeit.gps_zeit; return ret; } static inline PositionMitZeit getNext(std::map::const_iterator it, ausstattungs_id_t identitaet) { PositionMitZeit ret; if (it == interne_datenbasis_Fahrspur.c().end()) return ret; ++it; if (it == interne_datenbasis_Fahrspur.c().end() || it->second.daten.header.identitaet != identitaet) return ret; ret.pos = it->second.daten.gps_position; ret.zeit = it->second.daten.gps_zeit.gps_zeit; return ret; } //f+----------------------------------------------------------------------- static bool B1(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag eine // Minenverlegeposition(MVP) ist, die keiner Verlegespur zugeordnet // werden kann. // Diese Funktion gibt true zurueck, wenn // (Das Fz innerhalb von T_allein_Luecke_max keine nachfolgende MVP // gesendet hat ODER die nachfolgende MVP gegen S_allein_Luecke_max // verstoesst) // UND // (Die Vorgaengler-MVP gegen T_allein_Luecke_max verstoesst bzw. diese // nicht vorhanden ist ODER die Vorgaenger-MVP gegen S_allein_Luecke_max // verstoesst) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { // Map-Container auf aktuellen Eintrag setzen const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p1 = getPrev(itFs, fahrzeug_identitaet); const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); /* if( ( ( ((time(0) > zeit2 + T_allein_Luecke_max) && (zeit3 == 0)) || ((zeit3 - zeit2 > T_allein_Luecke_max) && (zeit3 != 0)) ) || (Punktabstand(ort2, ort3) > S_allein_Luecke_max) ) && ( ((zeit1 != 0) && (zeit2 - zeit1 > T_allein_Luecke_max)) || ((Punktabstand(ort2, ort1) > S_allein_Luecke_max) || (zeit1 == 0)) ) ) return (true);*/ // Keine MVP-Zuordnung wenn: // Vorgaenger: nicht vorhanden oder raeumlicher oder zeiticher Abstand zu groß // falls zutreffend Nachfolger: nicht vorhanden oder raeumlicher oder zeiticher Abstand zu groß // falls zutreffend Alter der pruefen // Pruefung auf Vorgaenger if ((p1.zeit == 0) || (Punktabstand(p2.pos, p1.pos) > S_allein_Luecke_max) || (p2.zeit - p1.zeit > T_allein_Luecke_max)) //Pruefung auf Nachfolger if ((p3.zeit == 0) || (Punktabstand(p2.pos, p3.pos) > S_allein_Luecke_max) || (p3.zeit - p2.zeit > T_allein_Luecke_max)) // Pruefung auf zu alt if (time(nullptr) > (p2.zeit + T_allein_Luecke_max)) return (true); return (false); } // end of B1 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B2(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag einer // Verlegespur zugerechnet werden kann. // Diese Funktion gibt true zurueck, wenn // (Das Fz eine Vorgaenger-MVP gesendet hat, die T_allein_Luecke_max // UND S_allein_Luecke_max einhaelt) // ODER // (Das Fz eine Nachfolge-MVP gesendet hat, die T_allein_Luecke_max // UND S_allein_Luecke_max einhaelt) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p1 = getPrev(itFs, fahrzeug_identitaet); const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( ( ((p1.zeit != 0) && (p2.zeit - p1.zeit <= T_allein_Luecke_max)) && (Punktabstand(p2.pos, p1.pos) <= S_allein_Luecke_max) ) || ( ((p3.zeit != 0) && (p3.zeit - p2.zeit <= T_allein_Luecke_max)) && (Punktabstand(p2.pos, p3.pos) <= S_allein_Luecke_max) ) ) return (true); return (false); } // end of B2 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B3(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Anfangspunkt einer Verlegespur ist. // Diese Funktion gibt true zurueck, wenn // (Das Fz keine Vorgaenger-MVP gesendet hat ODER eine Vorgaenger-MVP // gesendet hat, die gegen T_allein_Luecke_max ODER S_allein_Luecke max // verstoesst) // UND // (Das Fz eine Nachfolge-MVP gesendet hat, die T_allein_Luecke_max // UND S_allein_Luecke_max einhaelt) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p1 = getPrev(itFs, fahrzeug_identitaet); const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( ( ((p1.zeit == 0) || (p2.zeit - p1.zeit > T_allein_Luecke_max)) || (Punktabstand(p2.pos, p1.pos) > S_allein_Luecke_max) ) && ( ((p3.zeit != 0) && (p3.zeit - p2.zeit <= T_allein_Luecke_max)) && (Punktabstand(p2.pos, p3.pos) <= S_allein_Luecke_max) ) ) return (true); return (false); } // end of B3 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B4(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer Verlegespur ist. // Diese Funktion gibt true zurueck, wenn // (Das Fz innerhalb von T_allein_Luecke_max keine Nachfolger-MVP // gesendet hat ODER eine Nachfolger-MVP // gesendet hat, die gegen T_allein_Luecke_max ODER S_allein_Luecke max // verstoesst) // UND // (Das Fz eine Vorgaenger-MVP gesendet hat, die T_allein_Luecke_max // UND S_allein_Luecke_max einhaelt) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p1 = getPrev(itFs, fahrzeug_identitaet); const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( ( (p1.zeit != 0) && (p2.zeit - p1.zeit <= T_allein_Luecke_max) && (Punktabstand(p2.pos, p1.pos) <= S_allein_Luecke_max) ) && ( (((p3.zeit == 0) && (time(nullptr) > p2.zeit + T_allein_Luecke_max)) || ((p3.zeit != 0) && (p3.zeit - p2.zeit > T_allein_Luecke_max)) ) || ((p3.zeit != 0) && (Punktabstand(p2.pos, p3.pos) > S_allein_Luecke_max)) ) ) return (true); return (false); } // end of B4 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B5(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer Verlegespur ist, die nicht durch das selbe Fahrzeug zu // einer mehrspurigen Minensperre ausgebaut wird. // Diese Funktion gibt true zurueck, wenn // [(Das Fz innerhalb von T_allein_max keine Nachfolger-MVP gesendet hat // ODER eine Nachfolger-MVP gesendet hat, die gegen T_allein_max // ODER S_allein_max verstoesst) // ODER // (Die Nachfolger-MVP den Interpretationsstatus 3 hat UND W_allein_max // nicht eingehalten wird)] // UND // [(unmittelbar vor dem zugehoerigen Verlegeanfang keine MVP fuer // dieses Fz mit Interpretationsstatus 6 im Map-Container vorliegt)] // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( ((Eintrag_vor_zugehoerigem_Verlegebeginn(itFs->first) != 6) && (Eintrag_vor_zugehoerigem_Verlegebeginn(itFs->first) != 4)) && ( ((p3.zeit == 0) && (time(nullptr) > p2.zeit + T_allein_max)) || ((p3.zeit != 0) && (p3.zeit - p2.zeit > T_allein_max)) || ((p3.zeit != 0) && (Punktabstand(p2.pos, p3.pos) > S_allein_max)) || ((Eintrag_nach_dieser_MVP(itFs->first) == 3) && (Winkel_zwischen_Fahrspuren_eines_Fz(itFs->first) > W_allein_max) ) ) ) return (true); return (false); } // end of B5 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B6(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer Verlegespur ist, die durch das selbe Fahrzeug zu // einer mehrspurigen Minensperre ausgebaut wird. // Diese Funktion gibt true zurueck, wenn // (Das Fz eine Nachfolger-MVP gesendet hat, die den // Interpretationsstatus 3 hat UND T_allein_max UND // S_allein_max einhaelt) // UND // (W_allein_max zwischen den Fahrspuren eingehalten wird) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( (Winkel_zwischen_Fahrspuren_eines_Fz(itFs->first) <= W_allein_max) && (Winkel_zwischen_Fahrspuren_eines_Fz(itFs->first) != -1) && (Eintrag_nach_dieser_MVP(itFs->first) == 3) && (p3.zeit - p2.zeit <= T_allein_max) && (Punktabstand(p2.pos, p3.pos) <= S_allein_max) ) return (true); return (false); } // end of B6 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B7(std::map::const_iterator itFs) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer durch das selbe Fahrzeug mehrspurig fertig ausgebauten // Minensperre ist. // Diese Funktion gibt true zurueck, wenn // (Das Fz innerhalb von T_allein_max keine Nachfolger-MVP gesendet hat // ODER eine Nachfolger-MVP gesendet hat, die gegen T_allein_max // ODER S_allein_max verstoesst) // UND // (unmittelbar vor dem zugehoerigen Verlegeanfang eine MVP fuer dieses // Fz mit Interpretationsstatus 6 im Map-Container vorliegt) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { const ausstattungs_id_t fahrzeug_identitaet = itFs->second.daten.header.identitaet; const PositionMitZeit p2 = getCurr(itFs); const PositionMitZeit p3 = getNext(itFs, fahrzeug_identitaet); if ( (Eintrag_vor_zugehoerigem_Verlegebeginn(itFs->first) == 6) && (( ((p3.zeit == 0) && (time(nullptr) > p2.zeit + T_allein_max)) || ((p3.zeit != 0) && (p3.zeit - p2.zeit > T_allein_max)) || ((p3.zeit != 0) && (Punktabstand(p2.pos, p3.pos) > S_allein_max)) ) || ((Winkel_zwischen_Fahrspuren_eines_Fz(itFs->first) > W_allein_max) && (Eintrag_nach_dieser_MVP(itFs->first) == 3)) ) ) return (true); return (false); } // end of B7 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B8(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer Verlegespur ist, die zu einer Minensperre gehoert, // die durch mehrere Fahrzeuge ausgebaut wird. // Diese Funktion gibt true zurueck, wenn // (Der zu dieser Fahrspur gehoerende Verlegeanfang mindestens // T_zusammen_max zurueckliegt) // UND // [(Bezueglich des Verlegebeginns der aktuellen Fahrspur, ein anderes // Fz im Zeitraum +/- T_zusammen_max eine MVP mit Interpretationsstatus // 3 aufweist UND diese S_zusammen_max einhaelt) // UND // (W_zusammen_max zwischen beiden Fahrspuren eingehalten wird) // Der gesamte Map-Container wird durchsucht, bis ein solcher Eintrag // gefunden ist.] // Die Funktionalitaet in [] wird in der Funktion // Key_eines_Verlegebeginns_im_Zeitfenster_realisiert. // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { bool bRet = false; const auto itBegin = interne_datenbasis_Fahrspur.c().find(Key_des_zugehoerigen_Verlegebeginns(intern_key)); if (itBegin == interne_datenbasis_Fahrspur.c().end()) return bRet; if ((time(nullptr) > itBegin->second.daten.gps_zeit.gps_zeit + T_zusammen_max) && (Key_eines_Verlegebeginns_im_Zeitfenster(intern_key) != intern_key)) bRet = true; TRACE_LOG(loggerMI()) << "B8 check for " << intern_key.fz_id << "," << intern_key.zeitpunkt.gps_zeit << ": " << bRet; return (bRet); } // end of B8 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B9(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer Verlegespur ist, welche eine einspurige Minensperre // bildet. // Diese Funktion gibt true zurueck, wenn // (Der zu dieser Fahrspur gehoerende Verlegeanfang mindestens // T_zusammen_max zurueckliegt) // UND // (B8 nicht erfuellt wird) // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { bool bRet = false; const auto itBegin = interne_datenbasis_Fahrspur.c().find(Key_des_zugehoerigen_Verlegebeginns(intern_key)); if (itBegin == interne_datenbasis_Fahrspur.c().end()) return bRet; if ((time(nullptr) > itBegin->second.daten.gps_zeit.gps_zeit + T_zusammen_max) && (Key_eines_Verlegebeginns_im_Zeitfenster(intern_key) == intern_key)) bRet = true; TRACE_LOG(loggerMI()) << "B9 check for " << intern_key.fz_id << "," << intern_key.zeitpunkt.gps_zeit << ": " << bRet; return (bRet); } // end of B9 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B10(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer durch mehrere Fahrzeuge angelegten Minensperre ist, // von der schon mindestens zwei Fahrspuren fertig verlegt sind. // Der Interpretationsstatus 10 wurde eingefuert, um sicherzustellen, // dass alle Verlegespuren einer Minensperre erfasst werden, und nicht // der Fall eintritt, dass eine ev. 3.Verlegespur unbeachtet bleibt. // Diese Funktion gibt true zurueck, wenn // (Alle Eintraege, die fuer das Erfuellen von B8 bezueglich des // aktuellen Endpunktes in Frage kommen, bereits einen zugehoerigen // Endeeintrag mit Interpretationsstatus 8 oder 10 haben. // // // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { bool bRet = false; if (Eine_Nachbarspur_ist_unvollstaendig(intern_key, 8, 10) == intern_key) bRet = true; TRACE_LOG(loggerMI()) << "B10 check for " << intern_key.fz_id << "," << intern_key.zeitpunkt.gps_zeit << ": " << bRet; return (bRet); } // end of B10 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- static bool B11(const VERLEGEDATEN_KEY &intern_key) //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion prueft den aktuellen Eintrag des Map-Containers // interne_datenbasis_Fahrspur daraufhin, ob dieser Eintrag ein // Endpunkt einer durch mehrere Fahrzeuge angelegten Minensperre ist, // von der schon mindestens zwei Fahrspuren fertig verlegt sind. // Der Interpretationsstatus 10 wurde eingefuert, um sicherzustellen, // dass alle Verlegespuren einer Minensperre erfasst werden, und nicht // der Fall eintritt, dass eine ev. 3.Verlegespur unbeachtet bleibt. // Diese Funktion gibt true zurueck, wenn // (Alle Eintraege, die fuer das Erfuellen von B8 bezueglich des // aktuellen Endpunktes in Frage kommen, bereits einen zugehoerigen // Endeeintrag mit Interpretationsstatus 10 oder 11 haben. // // // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { bool bRet = false; if (Eine_Nachbarspur_ist_unvollstaendig(intern_key, 10, 11) == intern_key) bRet = true; TRACE_LOG(loggerMI()) << "B11 check for " << intern_key.fz_id << "," << intern_key.zeitpunkt.gps_zeit << ": " << bRet; return (bRet); } // end of B11 //------------------------------------------------------------------------- //f+----------------------------------------------------------------------- void GuezMinelayerProcessing::ZSSI_WI_Minenfeld_Interpreter::processData() //------------------------------------------------------------------------- // PURPOSE: // Diese Funktion wird in tcl_zssiwi_control zyklisch eingeplant. // Die Eintraege im internen Map-Container interne_datenbasis_Fahrspur // werden mit dem aktuellen Interpretationsstatus versehen. // Der Interpretationsstatus hat folgende Bedeutung: // 0: Diese Minenverlegeposition(MVP) wurde empfangen. // 1: Diese MVP gehoert keiner Verlegespur an und wird geloescht. // 2: Diese MVP wird einer Verlegespur zugeordnet. // 3: Diese MVP ist ein Anfangspunkt einer Verlegespur. // 4: Diese MVP ist ein Endpunkt einer Verlgegspur. // 5: Diese MVP ist ein Endpunkt einer Verlegespur, die nicht durch das // selbe Fz zu einer mehrspurigen Minensperre weiter ausgebaut wird. // 6: Die Minensperre wird ab diesem Verlegeendpunkt durch // das selbe Fz mehrspurig ausgebaut. // 7: Die MVP ist der Endpunkt einer durch ein Fz mehrspurig ausgebauten // Minensperre // 8: Die Minensperre zu der dieser Verlege-Endpunkt gehoert, wird durch // mehrere Fz ausgebaut. // 9: Diese MVP ist ein Endpunkt einer einspurigen Minensperre // 10: Diese MVP ist einer der Endpunkte einer durch meherer Fz verlegten // Minensperre, von der bereits zwei Fahrspuren komplett verlegt sind. // 11: Diese MVP ist einer der Endpunkte einer durch mehrere Fz fertig // verlegten Minensperre // // // FORMAL PARAMETERS: // (Beschreibung der Formalparameter) // // RETURN: // (Beschreibung des Returnwertes) // //f------------------------------------------------------------------------ { //Kontrollausgabe // lout << setprio(LM_INFO) // << "Funktion 'ZSSI_WI_Minen_Interpreter' aufgerufen" << endl; //Es werden alle Eintraege geloescht die nicht den //Betriebszustand VERLEGEN aufweisen auto &cont = interne_datenbasis_Fahrspur.c(); auto it = cont.begin(); while (it != cont.end()) { const FAHRSPUR_INTERN &val = it->second; if (val.daten.ss_betriebszustand != MV_VERLEGEN && val.daten.ss_betriebszustand != WMV_VERLEGEN) it = cont.erase(it); else ++it; } //Es wird entschieden, ob die die MVP keiner Verlegespur //zugeordnet werden kann. it = cont.begin(); while (it != cont.end()) { const FAHRSPUR_INTERN &val = it->second; if (val.intstat == 0 && B1(it)) { //Diese Eintraege muessen geloescht werden!! //sie wuerden intstat= 1 erhalten; it = cont.erase(it); } else ++it; } //Es wird entschieden, ob die MVP einer Verlegespur zugeordnet werden //kann. for (auto it = cont.begin(); it != cont.end(); ++it) { FAHRSPUR_INTERN &val = it->second; if (val.intstat == 0 && B2(it)) val.intstat = 2; } //Es wird entschieden, ob die zu einer Verlegespur gehoerige MVP einen //Anfangs- oder Endpunkt einer Verlegespur bildet for (auto it = cont.begin(); it != cont.end(); ++it) { FAHRSPUR_INTERN &val = it->second; if (val.intstat == 2) { if (B3(it)) val.intstat = 3; else if (B4(it)) val.intstat = 4; } } //Es wird entschieden, ob die MVP die einen Endpunkt einer Verlegespur //darstellt, zu einer Minensperre gehoert, die durch das selbe Fahrzeug //ausgebaut wird oder wurde. for (auto it = cont.begin(); it != cont.end(); ++it) { FAHRSPUR_INTERN &val = it->second; if (val.intstat == 4) { if (B5(it)) val.intstat = 5; else if (B6(it)) val.intstat = 6; else if (B7(it)) val.intstat = 7; } } //Es wird entschieden, ob die MVP die einen Endpunkt einer Verlegespur //darstellt, zu einer Minensperre gehoert, die durch mehrere Fahrzeuge //ausgebaut wird oder wurde. for (auto &c : cont) { FAHRSPUR_INTERN &val = c.second; if (val.intstat == 5) { const auto key = keyFromFahrspur(val); if (B8(key)) val.intstat = 8; else if (B9(key)) val.intstat = 9; } } //Es wird entschieden, ob die MVP einen Endpunkt einer durch mehrere //Fahrzeuge angelegten Minensperre darstellt, von der bereits zwei //Verlegespuen fertig verlegt sind. for (auto &c : cont) { FAHRSPUR_INTERN &val = c.second; if (val.intstat == 8 && B10(keyFromFahrspur(val))) val.intstat = 10; } //Es wird entschieden, ob die MVP einen Endpunkt einer durch mehrere //Fahrzeuge fertig angelegten Minensperre darstellt. for (auto &c : cont) { FAHRSPUR_INTERN &val = c.second; if (val.intstat == 10) { const auto key = keyFromFahrspur(val); if (B11(key)) { val.intstat = 11; //Der gesamte map-Container wird nun nach zugehoerigen //Verlegeendepositionen durchsucht. Das sind die, bei denen das //Erfuellen von B8 durch den aktuellen Eintrag erfolgte. //Um alle zusammengehoerigen Verlegespuren mit IS 11 versehen zu //koennen, muss der Map-Container mehrfach durchsucht werden. //Bei einem Start des Minenfeld_Generators, wird somit dafuer //gesorgt, dass maximal eine durch mehrere Fz verlegte Minensperre //(die Endpunkte tragen den Interpretationsstatus 11) im Map-Container //vorhanden ist. Gib_den_Partnern_IS11(key); break; // warum auch immer, aber noetig (vorher: goto ... ) } } } DEBUG_LOG(loggerMI()) << "------------------------------------------------"; for (const auto &c : interne_datenbasis_Fahrspur.c()) { const VERLEGEDATEN_KEY &key = c.first; const FAHRSPUR_INTERN &val = c.second; DEBUG_LOG(loggerMI()) << "key: " << key.fz_id << "," << key.zeitpunkt.gps_zeit << ", val: " << val.intstat << ", " << val.daten.header.identitaet << ", " << val.daten.gps_position.utm_ostwert << "/" << val.daten.gps_position.utm_nordwert; } m_minenfeldGenerator->processData(); } // end of ZSSI_WI_Minen_Interpreter //------------------------------------------------------------------------- GuezMinelayerProcessing::ZSSI_WI_Minenfeld_Interpreter::ZSSI_WI_Minenfeld_Interpreter(QObject *parent) : QObject(parent) , m_minenfeldGenerator(new ZSSI_WI_Minenfeld_Generator(this)) { connect(m_minenfeldGenerator, &ZSSI_WI_Minenfeld_Generator::sendeWirkfeld, this, &ZSSI_WI_Minenfeld_Interpreter::sendeWirkfeld); } GuezMinelayerProcessing::ZSSI_WI_Minenfeld_Interpreter::~ZSSI_WI_Minenfeld_Interpreter() { delete m_minenfeldGenerator; }