151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Enable calling our lua profile code directly from the lua command line,
 | |
| -- which makes it easier to debug.
 | |
| -- We simulate the normal C++ environment by defining the required globals and functions.
 | |
| 
 | |
| -- Usage:
 | |
| -- > cd profiles
 | |
| -- > lua5.1 debug.lua
 | |
| 
 | |
| 
 | |
| -- for more convenient printing of tables
 | |
| local pprint = require('lib/pprint')
 | |
| 
 | |
| -- globals that are normally set from C++
 | |
| 
 | |
| -- profiles code modifies this table
 | |
| properties = {}
 | |
| 
 | |
| -- should match values defined in include/extractor/guidance/road_classification.hpp
 | |
| road_priority_class = {
 | |
|   motorway = 0,
 | |
|   trunk = 2,
 | |
|   primary = 4,
 | |
|   secondary = 6,
 | |
|   tertiary = 8,
 | |
|   main_residential = 10,
 | |
|   side_residential = 11,
 | |
|   link_road = 14,
 | |
|   bike_path = 16,
 | |
|   foot_path = 18,
 | |
|   connectivity = 31,
 | |
| }
 | |
| 
 | |
| -- should match values defined in include/extractor/travel_mode.hpp
 | |
| mode = {
 | |
|   inaccessible = 0,
 | |
|   driving = 1,
 | |
|   cycling = 2,
 | |
|   walking = 3,
 | |
|   ferry = 4,
 | |
|   train = 5,
 | |
|   pushing_bike = 6,
 | |
| }
 | |
| 
 | |
| -- input tags, normally extracted from OSM data
 | |
| local way = {
 | |
|   highway = 'primary',
 | |
|   name = 'Main Street',
 | |
|   --access = 'no'
 | |
|   ["access:forward"] = 'no'
 | |
|   --width = '3',
 | |
|   --maxspeed = '30',
 | |
|   --['maxspeed:advisory'] = '25',
 | |
|   --oneway = '-1',
 | |
|   --service = 'alley',
 | |
|   --['oneway:bicycle'] = 'yes',
 | |
|   --junction = 'roundabout',
 | |
|   --['name:pronunciation'] = 'fuerloong',
 | |
|   --route = 'ferry',
 | |
|   --duration = '00:01:00',
 | |
|   --hov = 'designated',
 | |
|   --hov:lanes:forward"] = 'designated',
 | |
| 
 | |
|   --destination = 'Berlin',
 | |
|   --["destination:ref"] = 'Nuremberg',
 | |
|   --["destination:ref:forward"] = 'Hamburg;Dresden',
 | |
| }
 | |
| -- tag function normally provided via C++
 | |
| function way:get_value_by_key(k)
 | |
|   if not self['_debug'] then
 | |
|     self['_debug'] = {
 | |
|       _counts = {}
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   if self['_debug']['_total'] then
 | |
|     self['_debug']['_total'] = self['_debug']['_total'] + 1
 | |
|   else
 | |
|     self['_debug']['_total'] = 1
 | |
|   end
 | |
| 
 | |
|   if self['_debug']['_counts'][k] then
 | |
|     self['_debug']['_counts'][k] = self['_debug']['_counts'][k] + 1
 | |
|   else
 | |
|     self['_debug']['_counts'][k] = 1
 | |
|   end
 | |
|   
 | |
|   return self[k]
 | |
| end
 | |
| 
 | |
| -- Mock C++ helper functions which are called from LUA.
 | |
| -- FIXME
 | |
| -- Debugging LUA code that uses these will not work correctly
 | |
| -- unless we reimplement themethods in LUA.
 | |
| 
 | |
| function durationIsValid(str)
 | |
|   return true
 | |
| end
 | |
| 
 | |
| function parseDuration(str)
 | |
|   return 1
 | |
| end
 | |
| 
 | |
| function canonicalizeStringList(str)
 | |
|   return str
 | |
| end
 | |
|  
 | |
| -- helpers for sorting associative array
 | |
| function get_keys_sorted_by_value(tbl, sortFunction)
 | |
|   local keys = {}
 | |
|   for key in pairs(tbl) do
 | |
|     table.insert(keys, key)
 | |
|   end
 | |
| 
 | |
|   table.sort(keys, function(a, b)
 | |
|     return sortFunction(tbl[a], tbl[b])
 | |
|   end)
 | |
| 
 | |
|   return keys
 | |
| end
 | |
| 
 | |
| -- helper for printing sorted array
 | |
| function print_sorted(sorted,associative)
 | |
|   for _, key in ipairs(sorted) do
 | |
|     print(associative[key], key)
 | |
|   end
 | |
| end
 | |
| 
 | |
| -- start state of result table, normally set form C++
 | |
| local result = {
 | |
|   road_classification = {},
 | |
|   forward_speed = -1,
 | |
|   backward_speed = -1,
 | |
| }
 | |
| 
 | |
| -- the profile we want to debug
 | |
| require("car")
 | |
| 
 | |
| -- call the way function
 | |
| way_function(way,result)
 | |
| 
 | |
| -- and print the output
 | |
| pprint(way)
 | |
| print("=>")
 | |
| pprint(result)
 | |
| print("\n")
 | |
| print("Tag fetches:")
 | |
| sorted_counts = get_keys_sorted_by_value(way._debug._counts, function(a, b) return a > b end)
 | |
| print_sorted(sorted_counts, way._debug._counts)
 | |
| 
 | |
| print(way._debug._total, 'total')
 |