vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CarControlUnit.h
Go to the documentation of this file.
1 #ifndef CAR_CONTROL_UNIT
2 #define CAR_CONTROL_UNIT
3 
4 #include <vrecko/Ability.h>
5 #include <osg/Matrix>
6 #include "CCUStructs.h"
7 #include "CarState.h"
8 #include "CarEnvirons.h"
9 
10 namespace CarSim {
12  public:
14  // tento konstruktor bude slouzit k nastaveni generovanych aut
15  CarControlUnit(const unsigned int startRoad,const unsigned int stopRoad,
16  const bool startDirection,const bool stopDirection,
17  const float startEdge,const float stopEdge,
18  const float startOffset,const float stopOffset,
19  const float recVelOnFstJunc,const unsigned int fstJuncTurn,
20  Ability *const pRoadsState,Ability *const pCEU,const std::vector<unsigned int> *const pPath);
22 
23  void preInitialize(void);
24  void update(void);
25 
26  bool loadXMLParameters(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *pParametersNode);
27  protected:
29  // I. jestlize neni auto odsunuto (pozna se to z params.carNextJuncRel), bude zde
30  // cas, po ktery auto stoji pred (tesne) bodem stopBeforeJunc a ceka az
31  // dostane povoleni jet krizovatkou; jestlize se ten cas nepocita, bude obsahovat -1.0,
32  // jinak hodnotu >=0.0;
33  // II. jestlize auto bylo na hrane odsunuto a
34  // a) bylo odsunuto nejdriv (1. ze vsech aut, ktere jsou nyni
35  // odsunuty na hrane), bude zde cas, ktery uplynul od posledniho pokusu dostat
36  // se z kraje vozovky zpatky do ni nebo od doby, kdy se auto stalo prvnim (nejdrive)
37  // odsunutym autem na hrane
38  // b) nebylo odsunuto nejdriv, bude obsahovat hodnotu -1.0
39  // III. ve zbylych pripadech -1.0
40  float timeWaiting;
41 
42  // rika, zda bylo auto nastaveno rucne (false) nebo vygenerovano (true)
43  const bool gen;
44 
45  // jestlize je true, nastala chyba v inicializaci, takze se odregistruje
46  // aktualizovani CCU
48  // rika, zda byla provedena inicializace v metode update()
49  bool initBool;
50 
51  // z XML souboru se vyextrahuje silnice (id pro Road - ulozi se
52  // v promenne startRoad) pres uzel StartRoad a jeji smer (true - "forward"
53  // nebo false - "backward" - ulozi se v promenne startDirection) pres uzel startDirection,
54  // ktere uruji hranu, na ktere auto zacina;
55  unsigned int startRoad;
57  // obdobne je tomu s stopRoad a stopDirection, ktere urcuji,
58  // na ktere hrane auto zastavuje
59  unsigned int stopRoad;
61 
62  // doporucena rychlost na pristi krizovatce od RoadsState (ulozi se zde,
63  // aby se v kazdem snimku nemusela pocitat znovu v RoadsState);
64  // jestlize je < 0, neobsahuje aktualni data
66 
67  // ukazatel na abilitu RoadsState
69 
70  // cas zjisteny v minulem snimku
71  osg::Timer_t lastTick;
72 
73  /*// slouzi ke zjisteni prumerneho poctu aktualizaci jednotky
74  // CCU 1. generovaneho auta za sekundu v 1. minute
75  bool isFPSmeasured;
76  float totalTime;
77  unsigned int count;*/
78 
79  // rika, zda auto bude na pristi krizovatce zatacet doleva nebo doprava
80  unsigned int nextJuncTurn;
81 
82  // metody, ktere provedou inicializaci v ramci metody update()
83  // (slouzi jen pro negenerovana auta)
84  void init();
86  // metoda, ktera zkontroluje vstupni XML parametry
88  // metoda, ktera urci pres RoadsState nejkratsi cestu pro auto
89  void computeShortestPath();
90  // metoda, ktera vypocita optimalni rychlost prujezdu 1. kriz. v ceste
92  // metoda urci, jakym smerem (viz nextJuncTurn) se auto vyda na prvni
93  // krizovatce
95 
96  // metoda, ktera ukonci aktualizovani auta, u Removera prihlasi toto auto
97  void quitAfterError();
98 
99  // vrati pocet sekund, ktere ubehly od posledniho updatu
100  float getTimeFromLastUpdate();
101 
102  // metoda nastavi blinkry pres jednotku CEU podle nextJuncTurn,
103  // pokud jeste nejsou ve spravnem stavu
104  // (jestlize auto zataci doleva, zapne se levy blinkr, pokud jeste neni zapnuty;
105  // jestlize doprava, tak pravy blinkr (pokud neni zapnuty) a jestlize auto jede rovne,
106  // vypnou se blikry (pokud jeste nejsou vypnute));
107  // aktualni stav blinkru urcuje druhy parametr blinkLightState;
108  // jestlize je parametr isEmergency true, nenastavuji se blinkry podle
109  // nextJuncTurn, ale jestli jeste vsechny neblikaji, tak zacnou;
110  void setBlinkers(Ability *const pCEU,const unsigned int blinkLightState,
111  const bool isEmergency);
112 
113  };
114 
115  // tato metoda vypocita vzdalenost, po kterou musi auto brzdit, aby
116  // se jeho aktualni rychlost snizila na pozadovanou rychlost
117  // (jestlize je pozadovana rychlost vetsi nez aktualni, vrati se 0.0);
118  // parametry:
119  // carVel - aktualni rychlost auta
120  // desiredVel - pozadovana rychlost
121  // carDecel - zpomaleni, kterym bude auto brzdit
122  // hillAcc - prirustek zrychleni diky naklonu vozovky
123  // (pred krizovatkou budou zatim vsechna auta brzdit se zpomalenim AVERAGE_CAR_DEC;
124  // maximalni zpomaleni bude vyuzito v budoucnu pri krizovych situacich)
125  float getBrakeDist(const float carVel,const float desiredVel,
126  const float carDecel,const float hillAcc);
127 }
128 
129 #endif
130 
131 
132