};
-int angle_factor=10;
+int angle_factor=4;
int connected_pref=-10;
int nostop_pref=10;
}
static int
-tracking_angle_delta(int a1, int a2, int dir)
+tracking_angle_delta(int vehicle_angle, int street_angle, int dir)
{
- if (! dir)
- return tracking_angle_abs_diff(a1, a2, 180);
- else
- return tracking_angle_abs_diff(a1, a2, 360);
+ int full=180;
+ int ret;
+ if (dir) {
+ full=360;
+ if (dir < 0)
+ street_angle=(street_angle+180)%360;
+ }
+ ret=tracking_angle_abs_diff(vehicle_angle, street_angle, full);
+
+ return ret*ret;
}
static int
tr->curr_line=NULL;
while (t) {
struct street_data *sd=t->street;
+ int dir;
+ switch(sd->limit & 3) {
+ case 0:
+ dir=0;
+ break;
+ case 1:
+ dir=1;
+ break;
+ case 2:
+ dir=-1;
+ break;
+ case 3:
+ t=t->next;
+ continue;
+ }
for (i = 0; i < sd->count-1 ; i++) {
dbg(2, "%d: (0x%x,0x%x)-(0x%x,0x%x)\n", i, sd->c[i].x, sd->c[i].y, sd->c[i+1].x, sd->c[i+1].y);
value=transform_distance_line_sq(&sd->c[i], &sd->c[i+1], c, &lpnt);
if (value < INT_MAX/2)
- value += tracking_angle_delta(angle, t->angle[i], 0)*angle_factor;
+ value += tracking_angle_delta(angle, t->angle[i], dir)*angle_factor;
if (tracking_is_connected(tr->curr, &sd->c[i]))
value += connected_pref;
if (lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y)
int y __attribute__ ((packed));
unsigned char speed;
unsigned char dir;
- } pos;
+ } pos __attribute__ ((packed)) ;
} u;
} __attribute__ ((packed)) ;
int size;
dbg(2,"enter this=%p",this);
- size=recv(this->fd, &pkt, sizeof(pkt), 0);
+ size=recv(this->fd, &pkt, 15, 0);
if (pkt.magic == this->magic) {
dbg(3,"magic 0x%x size=%d\n", pkt.magic, size);
this->current_pos.x=pkt.u.pos.x;
pkt.u.pos.y=pos->y;
pkt.u.pos.speed=speed;
pkt.u.pos.dir=dir;
- sendto(this->fd, &pkt, sizeof(pkt), 0, (struct sockaddr *)&this->rem, sizeof(this->rem));
+ sendto(this->fd, &pkt, 15, 0, (struct sockaddr *)&this->rem, sizeof(this->rem));
this->current_pos=child->current_pos;
this->speed=child->speed;
this->dir=child->dir;