blob: edb22b57bf91482dd0c5eff546d873bf4cad0343 [file] [log] [blame]
// main.c - simulation main driver
#include "stream.h"
#include "sim.h"
#include "direction.h"
#include "vehicle.h"
#include "roadlet.h"
#include "check_functions.h"
#include "intersection.h"
#include <cstdlib>
#if defined(__XS1B__)
#include "xcoretestsuite.h"
#endif
// connect r1->d1 to r2->d2
void connect(roadlet *r1, direction d1,
roadlet *r2, direction d2,
roadlet* (*r1_to_r2_filter_function)(roadlet *, vehicle *, direction))
{
//cout << "connecting " << *r1 << " " << *r2 << '\n';
r1->set_neighbor(d1, r2);
r2->set_neighbor(d2, r1);
r1->set_move_filter_function(d1, r1_to_r2_filter_function);
}
int main()
{
car c("fred");
roadlet *r1, *r2;
roadlet *r3, *r4;
char *buff;
int i;
srandom(5);
// build a two lane one direction road
r1 = new roadlet ("R start");
r3 = new roadlet ("L start");
connect(r1, W, r3, E, return_null); // there but can't move to
c.set_location(r1); // a car
r1->arrive(&c);
for(i=0; i<10; i++)
{
buff = (char *)malloc(4);
sprintf(buff, "R%d", i);
r2 = new roadlet(buff);
buff = (char *)malloc(4);
sprintf(buff, "L%d", i);
r4 = new roadlet(buff);
connect(r1, N, r2, S, &::is_empty);
connect(r3, N, r4, S, &::is_empty);
connect(r1, NW, r4, SE, &lane_switch_ok);
connect(r3, NE, r2, SW, &lane_switch_ok);
connect(r2, W, r4, E, return_null); // can't more sideways
r1 = r2;
r3 = r4;
}
car b2("blocker 2");
b2.set_location(r1); // a car
r1->arrive(&b2);
cout << b2 << '\n';
intersection_4x4 i1("intersection ");
i1.connectSin(r3, r1);
broken_light l(3,1,4,1);
for(i = 0; i < 100000; i++)
{
//cout << l << "\n";
l.tick();
}
for(i=0; i< 100000; i++)
{
i1.get_light()->tick();
}
r1 = new roadlet ("East Road R ");
r3 = new roadlet ("East Road L ");
connect(r1, N, r3, S, return_null); // there but can't move to
car b("blocker");
b.set_location(r1); // a car
r1->arrive(&b);
cout << b << '\n';
i1.connectEout(r3, r1);
for(i=0; i< 100000; i++)
{
//cout << '\n' << i << ' ' << c << '\n';
c.tick();
}
//cout << i << ' ' << c << '\n';
}