From 0c48ee726a6c6b5ca9c3dec2b473190b69170557 Mon Sep 17 00:00:00 2001 From: firleju Date: Fri, 25 Dec 2015 09:19:44 +0100 Subject: [PATCH] Changes to TSpeedPos array to prevent not clearing of. --- Driver.cpp | 88 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 0d1430b6..bf4d3b45 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -241,9 +241,12 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie // ograniczona w skrzyżowaniu (velocity z ujemną wartością) if ((iFlags & spElapsed) == 0) // jeśli nie wjechał - if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd - fVelNext = - 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto) + if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd + { + WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + trTrack->iNumDynamics + "Dist= " + fDist); + fVelNext = + 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto) + } } if (iFlags & spSwitch) // jeśli odcinek zmienny { @@ -258,12 +261,16 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) // na Mydelniczce potrafi skanować na wprost mimo pojechania na bok } // poniższe nie dotyczy trybu łączenia? - if ((iFlags & spElapsed) ? false : - trTrack->iNumDynamics > - 0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest - fDist -= 30.0, fVelNext = 0.0; // to niech stanie w zwiększonej odległości - // else if (fVelNext==0.0) //jeśli została wyzerowana - // fVelNext=trTrack->VelocityGet(); //odczyt prędkości + if ((iFlags & spElapsed) ? false : + trTrack->iNumDynamics > + 0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest + { + WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + trTrack->iNumDynamics + "Dist= "+fDist); + //fDist -= 30.0; + fVelNext = 0.0; // to niech stanie w zwiększonej odległości + // else if (fVelNext==0.0) //jeśli została wyzerowana + // fVelNext=trTrack->VelocityGet(); //odczyt prędkości + } } } } @@ -289,23 +296,23 @@ AnsiString TSpeedPos::TableText() return "Empty"; } -bool TSpeedPos::Set(TEvent *e, double d) +bool TSpeedPos::Set(TEvent *event, double dist) { // zapamiętanie zdarzenia - fDist = d; + fDist = dist; iFlags = spEnabled | spEvent; // event+istotny - evEvent = e; - vPos = e->PositionGet(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?) + evEvent = event; + vPos = event->PositionGet(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?) CommandCheck(); // sprawdzenie typu komendy w evencie i określenie prędkości return fVelNext == 0.0; // true gdy zatrzymanie, wtedy nie ma po co skanować dalej }; -void TSpeedPos::Set(TTrack *t, double d, int f) +void TSpeedPos::Set(TTrack *track, double dist, int flag) { // zapamiętanie zmiany prędkości w torze - fDist = d; // odległość do początku toru - trTrack = t; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/ + fDist = dist; // odległość do początku toru + trTrack = track; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/ if (trTrack) { - iFlags = f | (trTrack->eType == tt_Normal ? 2 : 10); // zapamiętanie kierunku wraz z typem + iFlags = flag | (trTrack->eType == tt_Normal ? 2 : 10); // zapamiętanie kierunku wraz z typem if (iFlags & spSwitch) if (trTrack->GetSwitchState() & 1) iFlags |= spSwitchStatus; @@ -406,16 +413,22 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) { // kontynuacja skanowania od ostatnio sprawdzonego toru (w ostatniej pozycji zawsze jest tor) if (sSpeedTable[iLast].iFlags & spEndOfTable) // zatkanie { // jeśli zapełniła się tabelka - if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona - return; // nic się nie da zrobić - if ((iLast + 2) % iSpeedTableSize == iFirst) // musi być jeszcze miejsce wolne na - // ewentualny event, bo tor jeszcze nie - // sprawdzony - return; // już lepiej, ale jeszcze nie tym razem + if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona + { + TablePurger(); // nic się nie da zrobić + return; + } + if ((iLast + 2) % iSpeedTableSize == iFirst) // musi być jeszcze miejsce wolne na + // ewentualny event, bo tor jeszcze nie + // sprawdzony + { + TablePurger(); + return; // już lepiej, ale jeszcze nie tym razem + } sSpeedTable[iLast].iFlags &= 0xBE; // kontynuować próby doskanowania } - //else if (VelNext == 0) - // return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać + else if (VelNext == 0) + return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać //trzeba dalej sprawdzać, gdyż przy stopinfo potrafił zgubić semafor pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor if (!pTrack) @@ -425,7 +438,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) 1.0; // flaga ustawiona, gdy Point2 toru jest bliżej fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odległość do jego Point1 fTrackLength = - sSpeedTable[iLast].iFlags & 0x60 ? 0.0 : pTrack->Length(); // nie doliczać długości gdy: + sSpeedTable[iLast].iFlags & (spElapsed | spEnd) ? 0.0 : pTrack->Length(); // nie doliczać długości gdy: // 32-minięty początek, // 64-jazda do końca toru } @@ -436,14 +449,17 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) { if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony { // jeśli tor nie był jeszcze sprawdzany - if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) != + if (pTrack) + WriteLog("TableTraceRoute: checking track " + pTrack->NameGet()); + if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) != NULL) // jeśli jest semafor na tym torze { // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie // jest korzystne if (TableNotFound(pEvent)) // jeśli nie ma if (TableAddNew()) { - if (sSpeedTable[iLast].Set(pEvent, + WriteLog("TableTraceRoute: new event found " + pEvent->asName); + if (sSpeedTable[iLast].Set(pEvent, fCurrentDistance)) // dodanie odczytu sygnału fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma // potrzeby dalej skanować @@ -471,10 +487,10 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) 15) << 28; // ostatnie 4 bity pola flag sSpeedTable[iLast].iFlags &= - ~4; // usunięcie flagi kierunku, bo może być błędna + ~spReverse; // usunięcie flagi kierunku, bo może być błędna if (sSpeedTable[iLast].iFlags < 0) sSpeedTable[iLast].iFlags |= - 4; // ustawienie flagi kierunku na podstawie wybranego segmentu + spReverse; // ustawienie flagi kierunku na podstawie wybranego segmentu if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0) fLastDir = -fLastDir; if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym @@ -490,6 +506,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) sSpeedTable[iLast].Set(pTrack, fCurrentDistance, fLastDir < 0 ? 0x85 : 0x81); // dodanie odcinka do tabelki + // 0x85 = spEnabled, spReverse, SpCurve } } fCurrentDistance += @@ -593,6 +610,7 @@ void TController::TableCheck(double fDistance) { if (sSpeedTable[i].Update(&pos, &dir, len)) { + WriteLog("TableCheck: Przestawiona zwrotnica. Kasowanie tableki."); int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize) { // kasowanie wszystkich rekordów za zmienioną zwrotnicą @@ -602,6 +620,7 @@ void TController::TableCheck(double fDistance) // WriteLog("TableCheck: Switch change. Delete from table: " + sSpeedTable[j].evEvent->asName); sSpeedTable[j].iFlags = 0; } + WriteLog("TableCheck: Kasowanie tableki OK."); TablePurger(); iLast = i; // pokazujemy gdzie jest ostatni kawałek break; // nie kontynuujemy pętli, trzeba doskanować ciąg dalszy @@ -610,7 +629,7 @@ void TController::TableCheck(double fDistance) { if (sSpeedTable[i].fDist < -fLength) // a skład wyjechał całą długością poza { // degradacja pozycji - // WriteLog( "TableCheck: Track is behind. Delete from table: " + sSpeedTable[i].trTrack->NameGet()); + WriteLog( "TableCheck: Track is behind. Delete from table: " + sSpeedTable[i].trTrack->NameGet()); sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się } else if ((sSpeedTable[i].iFlags & 0xF0000028) == @@ -619,7 +638,7 @@ void TController::TableCheck(double fDistance) { sSpeedTable[i].iFlags = 0; // to nie ma go po co trzymać (odtykacz usunie ze środka) - // WriteLog("TableCheck: Track without speed limit is under train . Delete from table: " + sSpeedTable[i].trTrack->NameGet()); + WriteLog("TableCheck: Track without speed. Delete from table: " + sSpeedTable[i].trTrack->NameGet()); } } else if (sSpeedTable[i].iFlags & spEvent) // jeśli event @@ -1214,7 +1233,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN void TController::TablePurger() { // odtykacz: usuwa mniej istotne pozycje ze środka tabelki, aby uniknąć zatkania //(np. brak ograniczenia pomiędzy zwrotnicami, usunięte sygnały, minięte odcinki łuku) - int i, j, k = iLast - iFirst; // może być 15 albo 16 pozycji, ostatniej nie ma co sprawdzać + WriteLog("TablePurger: Czyszczenie tableki."); + int i, j, k = iLast - iFirst; // może być 15 albo 16 pozycji, ostatniej nie ma co sprawdzać if (k < 0) k += iSpeedTableSize; // ilość pozycji do przeanalizowania for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize) @@ -1226,7 +1246,7 @@ void TController::TablePurger() // (0x08) for (; k > 0; --k, i = (i + 1) % iSpeedTableSize) sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie - //WriteLog("Odtykacz usuwa pozycję"); + WriteLog("Odtykacz usuwa pozycję"); iLast = (iLast - 1 + iSpeedTableSize) % iSpeedTableSize; // cofnięcie z zawinięciem return; }