| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -11,33 +11,18 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "selfdrive/ui/qt/maps/map_helpers.h" | 
					 | 
					 | 
					 | 
					#include "selfdrive/ui/qt/maps/map_helpers.h" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const float DEFAULT_ZOOM = 13.5; // Don't go below 13 or features will start to disappear
 | 
					 | 
					 | 
					 | 
					const float DEFAULT_ZOOM = 13.5; // Don't go below 13 or features will start to disappear
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const int RENDER_HEIGHT = 512, RENDER_WIDTH = 512; | 
					 | 
					 | 
					 | 
					const int HEIGHT = 512, WIDTH = 512; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const int HEIGHT = 256, WIDTH = 256; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const int NUM_VIPC_BUFFERS = 4; | 
					 | 
					 | 
					 | 
					const int NUM_VIPC_BUFFERS = 4; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const int EARTH_CIRCUMFERENCE_METERS = 40075000; | 
					 | 
					 | 
					 | 
					const int EARTH_CIRCUMFERENCE_METERS = 40075000; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const int PIXELS_PER_TILE = 256; | 
					 | 
					 | 
					 | 
					const int PIXELS_PER_TILE = 256; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					float get_meters_per_pixel(float lat, float zoom) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float num_tiles = pow(2, zoom+1); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float meters_per_tile = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / num_tiles; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return meters_per_tile / PIXELS_PER_TILE; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					float get_zoom_level_for_scale(float lat, float meters_per_pixel) { | 
					 | 
					 | 
					 | 
					float get_zoom_level_for_scale(float lat, float meters_per_pixel) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE; | 
					 | 
					 | 
					 | 
					  float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float num_tiles = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / meters_per_tile; | 
					 | 
					 | 
					 | 
					  float num_tiles = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / meters_per_tile; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return log2(num_tiles) - 1; | 
					 | 
					 | 
					 | 
					  return log2(num_tiles) - 1; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void downsample(uint8_t *src, uint8_t *dst) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for (int r = 0; r < HEIGHT; r++) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (int c = 0; c < WIDTH; c++) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      dst[r*WIDTH + c] = src[(r*2*RENDER_WIDTH + c*2) * 3]; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_settings(settings) { | 
					 | 
					 | 
					 | 
					MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_settings(settings) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QSurfaceFormat fmt; | 
					 | 
					 | 
					 | 
					  QSurfaceFormat fmt; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -59,7 +44,7 @@ MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_set | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  gl_functions->initializeOpenGLFunctions(); | 
					 | 
					 | 
					 | 
					  gl_functions->initializeOpenGLFunctions(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  QOpenGLFramebufferObjectFormat fbo_format; | 
					 | 
					 | 
					 | 
					  QOpenGLFramebufferObjectFormat fbo_format; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  fbo.reset(new QOpenGLFramebufferObject(RENDER_WIDTH, RENDER_HEIGHT, fbo_format)); | 
					 | 
					 | 
					 | 
					  fbo.reset(new QOpenGLFramebufferObject(WIDTH, HEIGHT, fbo_format)); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  std::string style = util::read_file(STYLE_PATH); | 
					 | 
					 | 
					 | 
					  std::string style = util::read_file(STYLE_PATH); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  m_map.reset(new QMapboxGL(nullptr, m_settings, fbo->size(), 1)); | 
					 | 
					 | 
					 | 
					  m_map.reset(new QMapboxGL(nullptr, m_settings, fbo->size(), 1)); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -69,7 +54,7 @@ MapRenderer::MapRenderer(const QMapboxGLSettings &settings, bool online) : m_set | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  m_map->resize(fbo->size()); | 
					 | 
					 | 
					 | 
					  m_map->resize(fbo->size()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  m_map->setFramebufferObject(fbo->handle(), fbo->size()); | 
					 | 
					 | 
					 | 
					  m_map->setFramebufferObject(fbo->handle(), fbo->size()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  gl_functions->glViewport(0, 0, RENDER_WIDTH, RENDER_HEIGHT); | 
					 | 
					 | 
					 | 
					  gl_functions->glViewport(0, 0, WIDTH, HEIGHT); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (online) { | 
					 | 
					 | 
					 | 
					  if (online) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    vipc_server.reset(new VisionIpcServer("navd")); | 
					 | 
					 | 
					 | 
					    vipc_server.reset(new VisionIpcServer("navd")); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -114,9 +99,9 @@ void MapRenderer::updatePosition(QMapbox::Coordinate position, float bearing) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return; | 
					 | 
					 | 
					 | 
					    return; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Choose a zoom level that matches the scale of zoom level 13 at latitude 80deg
 | 
					 | 
					 | 
					 | 
					  // Choose a scale that ensures above 13 zoom level up to and above 75deg of lat
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float scale_lat80 = get_meters_per_pixel(80, 13); | 
					 | 
					 | 
					 | 
					  float meters_per_pixel = 2; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float zoom = get_zoom_level_for_scale(position.first, scale_lat80); | 
					 | 
					 | 
					 | 
					  float zoom = get_zoom_level_for_scale(position.first, meters_per_pixel); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  m_map->setCoordinate(position); | 
					 | 
					 | 
					 | 
					  m_map->setCoordinate(position); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  m_map->setBearing(bearing); | 
					 | 
					 | 
					 | 
					  m_map->setBearing(bearing); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -150,13 +135,15 @@ void MapRenderer::sendVipc() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .timestamp_eof = ts, | 
					 | 
					 | 
					 | 
					    .timestamp_eof = ts, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }; | 
					 | 
					 | 
					 | 
					  }; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  assert(cap.sizeInBytes() >= buf->len*4); | 
					 | 
					 | 
					 | 
					  assert(cap.sizeInBytes() >= buf->len); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint8_t* dst = (uint8_t*)buf->addr; | 
					 | 
					 | 
					 | 
					  uint8_t* dst = (uint8_t*)buf->addr; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint8_t* src = cap.bits(); | 
					 | 
					 | 
					 | 
					  uint8_t* src = cap.bits(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // 2x downsample + rgb to grayscale
 | 
					 | 
					 | 
					 | 
					  // RGB to greyscale
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  memset(dst, 128, buf->len); | 
					 | 
					 | 
					 | 
					  memset(dst, 128, buf->len); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  downsample(src, dst); | 
					 | 
					 | 
					 | 
					  for (int i = 0; i < WIDTH * HEIGHT; i++) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    dst[i] = src[i * 3]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  vipc_server->send(buf, &extra); | 
					 | 
					 | 
					 | 
					  vipc_server->send(buf, &extra); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -187,8 +174,10 @@ uint8_t* MapRenderer::getImage() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint8_t* src = cap.bits(); | 
					 | 
					 | 
					 | 
					  uint8_t* src = cap.bits(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint8_t* dst = new uint8_t[WIDTH * HEIGHT]; | 
					 | 
					 | 
					 | 
					  uint8_t* dst = new uint8_t[WIDTH * HEIGHT]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // 2x downsample + rgb to grayscale
 | 
					 | 
					 | 
					 | 
					  // RGB to greyscale
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  downsample(src, dst); | 
					 | 
					 | 
					 | 
					  for (int i = 0; i < WIDTH * HEIGHT; i++) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    dst[i] = src[i * 3]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return dst; | 
					 | 
					 | 
					 | 
					  return dst; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |