Esempio n. 1
0
static void
vehicle_demo_timer(struct vehicle_priv *priv)
{
	struct coord c, c2, pos, ci;
	int slen, len, dx, dy;
	struct route *route=NULL;
	struct map *route_map=NULL;
	struct map_rect *mr=NULL;
	struct item *item=NULL;

	len = (priv->config_speed * priv->interval / 1000)/ 3.6;
	dbg(1, "###### Entering simulation loop\n");
	if (!priv->config_speed)
		return;
	if (priv->route)
		route=priv->route;
	else if (priv->navit) 
		route=navit_get_route(priv->navit);
	if (route)
		route_map=route_get_map(route);
	if (route_map)
		mr=map_rect_new(route_map, NULL);
	if (mr)
		item=map_rect_get_item(mr);
	if (item && item->type == type_route_start)
		item=map_rect_get_item(mr);
	while(item && item->type!=type_street_route)
		item=map_rect_get_item(mr);
	if (item && item_coord_get(item, &pos, 1)) {
		priv->position_set=0;
		dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y);
		dbg(1, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y);
		if (priv->last.x == pos.x && priv->last.y == pos.y) {
			dbg(1, "endless loop\n");
		}
		priv->last = pos;
		while (item && priv->config_speed) {
			if (!item_coord_get(item, &c, 1)) {
				item=map_rect_get_item(mr);
				continue;
			}
			dbg(1, "next pos=0x%x,0x%x\n", c.x, c.y);
			slen = transform_distance(projection_mg, &pos, &c);
			dbg(1, "len=%d slen=%d\n", len, slen);
			if (slen < len) {
				len -= slen;
				pos = c;
			} else {
				if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) {
					dx = c.x - pos.x;
					dy = c.y - pos.y;
					ci.x = pos.x + dx * len / slen;
					ci.y = pos.y + dy * len / slen;
					priv->direction =
					    transform_get_angle_delta(&pos, &c, 0);
					priv->speed=priv->config_speed;
				} else {
					ci.x = pos.x;
					ci.y = pos.y;
					priv->speed=0;
					dbg(0,"destination reached\n");
				}
				dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y);
				transform_to_geo(projection_mg, &ci,
						 &priv->geo);
				callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
				break;
			}
		}
	} else {
		if (priv->position_set) 
			callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
	}
	if (mr)
		map_rect_destroy(mr);
}
Esempio n. 2
0
static int
vehicle_demo_timer(struct vehicle_priv *priv)
{
	struct route_path_coord_handle *h;
	struct coord *c, *pos, ci;
	int slen, len, dx, dy;

	priv->speed = 40;
	len = priv->speed / 3.6;
	dbg(1, "###### Entering simulation loop\n");
	if (!priv->navit) {
		dbg(1, "vehicle->navit is not set. Can't simulate\n");
		return 1;
	}
	struct route *vehicle_route = navit_get_route(priv->navit);
	if (!vehicle_route) {
		dbg(1, "navit_get_route NOK\n");
		return 1;
	}

	h = route_path_coord_open(vehicle_route);
	if (!h) {
		dbg(1, "navit_path_coord_open NOK\n");
		return 1;
	}
	pos = route_path_coord_get(h);
	dbg(1, "current pos=%p\n", pos);
	if (pos) {
		dbg(1, "current pos=0x%x,0x%x\n", pos->x, pos->y);
		if (priv->last.x == pos->x && priv->last.y == pos->y) {
			dbg(1, "endless loop\n");
		}
		priv->last = *pos;
		for (;;) {
			c = route_path_coord_get(h);
			dbg(1, "next pos=%p\n", c);
			if (!c)
				break;
			dbg(1, "next pos=0x%x,0x%x\n", c->x, c->y);
			slen = transform_distance(projection_mg, pos, c);
			dbg(1, "len=%d slen=%d\n", len, slen);
			if (slen < len) {
				len -= slen;
				pos = c;
			} else {
				dx = c->x - pos->x;
				dy = c->y - pos->y;
				ci.x = pos->x + dx * len / slen;
				ci.y = pos->y + dy * len / slen;
				priv->direction =
				    transform_get_angle_delta(pos, c, 0);
				dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y);
				transform_to_geo(projection_mg, &ci,
						 &priv->geo);
				callback_list_call_0(priv->cbl);
				break;
			}
		}
	}
	return 1;
}