#
# Car-Routing based on a kinematic model
#
# Depending on the vmax-parameter (target-speed)
# this can be anything from least-time routing to eco-routing
#
#
---model:btools.router.KinematicModel

---context:global

# kinematic parameters

assign vmax             = 90     # kmh
assign recup_efficiency = 0.7    # (ratio)
assign totalweight      = 1640   # kg
assign f_roll           = 232    # Newton
assign f_air            = 0.4    # 0.5*cw*A*rho
assign f_recup          = 400    # Newton
assign p_standby        = 250    # Watt

# technical parameters

assign validForCars        = true
assign pass1coefficient    = 1.3
assign turnInstructionMode = 1  # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style

---context:way   # following code refers to way-tags

assign initialcost switch route=ferry 20000 0

#
# calculate logical car access
#
assign isresidentialorliving = or highway=residential|living_street living_street=yes

assign caraccess
       switch motorcar=
              switch motor_vehicle=
                     switch vehicle=
                            switch access=
                                   switch highway=motorway|motorway_link    1
                                   switch highway=trunk|trunk_link          1
                                   switch highway=primary|primary_link      1
                                   switch highway=secondary|secondary_link  1
                                   switch highway=tertiary|tertiary_link    1
                                   switch highway=unclassified              1
                                   switch route=ferry                       1
                                   switch isresidentialorliving              1
                                   switch highway=service                   1
                                   0
                                   access=yes|permissive|designated|destination
                            vehicle=yes|designated|destination
                     motor_vehicle=yes|permissive|designated|destination
              motorcar=yes|permissive|designated|destination

assign unknowncaraccess
       switch motorcar=
              switch motor_vehicle=
                     switch vehicle=
                            access=unknown
                            vehicle=unknown
                     motor_vehicle=unknown
              motorcar=unknown

assign psvaccess
       or bus=yes|designated|urban
       or psv=yes|designated
       or hov=yes|designated
       switch motorcar=
              switch motor_vehicle=
                     switch vehicle=
                            access=psv|hov
                            vehicle=psv|hov
                     motor_vehicle=psv|hov
              motorcar=psv|hov

assign accessspeedlimit = if caraccess then 999 else 0

assign isroundabout = junction=roundabout|circular
assign implicitoneway = or isroundabout highway=motorway
assign isbadoneway = if reversedirection=yes then ( if oneway= then implicitoneway else oneway=yes|true|1 ) else oneway=-1
assign onewayspeedlimit = if isbadoneway then 0 else 999

assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link

assign maxspeed_surface =
  switch or surface= surface=paved|asphalt|concrete 999
  switch surface=paving_stones|cobblestone 30
  2

assign maxspeed_tracktype =
  switch tracktype= 999
  switch tracktype=grade1 40
  switch tracktype=grade2 5
  1

assign maxspeed_implicit =
  switch highway=motorway                  999
  switch highway=motorway_link             130
  switch highway=trunk                     250
  switch highway=trunk_link                100
  switch highway=primary|primary_link      100
  switch highway=secondary|secondary_link   90
  switch highway=tertiary|tertiary_link     80
  switch highway=unclassified               50
  switch route=ferry                        10
  switch highway=bridleway                  10
  switch isresidentialorliving              30
  switch highway=service                    30
  switch highway=track|road|path switch tracktype=grade1 30 5
  0

assign maxspeed =
  min onewayspeedlimit
  min accessspeedlimit
  switch maxspeed=50 50
  switch maxspeed=30 30
  switch maxspeed=10 10
  switch maxspeed=20 20
  switch maxspeed=40 40
  switch maxspeed=60 60
  switch maxspeed=70 70
  switch maxspeed=80 80
  switch maxspeed=90 90
  switch maxspeed=100 100
  switch maxspeed=110 110
  switch maxspeed=120 120
  switch maxspeed=130 130
  switch maxspeed=urban 50
  switch maxspeed=rural 100
  min maxspeed_implicit
  min maxspeed_surface maxspeed_tracktype

assign minspeed =
    switch highway=motorway|trunk  75 0

# way priorities used for voice hint generation

assign priorityclassifier =

  if      ( highway=motorway                  ) then  30
  else if ( highway=motorway_link             ) then  29
  else if ( highway=trunk                     ) then  28
  else if ( highway=trunk_link                ) then  27
  else if ( highway=primary                   ) then  26
  else if ( highway=primary_link              ) then  25
  else if ( highway=secondary                 ) then  24
  else if ( highway=secondary_link            ) then  23
  else if ( highway=tertiary                  ) then  22
  else if ( highway=tertiary_link             ) then  21
  else if ( highway=unclassified              ) then  20
  else if ( isresidentialorliving             ) then  6
  else if ( highway=service                   ) then  6
  else if ( highway=track                     ) then if tracktype=grade1 then 4 else 2
  else if ( highway=bridleway|road            ) then  2
  else 0

assign costfactor = if equal maxspeed 0
                      then ( if ( and equal accessspeedlimit 0 and greater onewayspeedlimit 0 and greater priorityclassifier 20 not psvaccess )
                             then switch unknowncaraccess 9997 9998
                             else 10000 )
                      else 0

# some more classifying bits used for voice hint generation...

assign isgoodoneway = if reversedirection=yes then oneway=-1
                      else if oneway= then implicitoneway else oneway=yes|true|1
assign isgoodforcars = if greater priorityclassifier 6 then true
                  else if or isresidentialorliving highway=service then true
                  else if ( and highway=track tracktype=grade1 ) then true
                  else false

# ... encoded into a bitmask

assign classifiermask add          isbadoneway
                      add multiply isgoodoneway   2
                      add multiply isroundabout   4
                      add multiply islinktype     8
                      add multiply isgoodforcars 16
                          multiply isresidentialorliving 32


---context:node  # following code refers to node tags

#
# calculate logical car access to nodes
#
assign caraccess
       switch motorcar=
              switch motor_vehicle=
                     switch vehicle=
                            switch access=
                                   not barrier=gate|bollard|lift_gate|cycle_barrier
                                   access=yes|permissive|designated|destination
                            vehicle=yes|permissive|designated|destination
                     motor_vehicle=yes|permissive|designated|destination
              motorcar=yes|permissive|designated|destination

assign initialcost =

       switch caraccess
              0
              1000000

assign maxspeed =

       if or crossing=traffic_signals highway=traffic_signals
       then
         switch greater way:priorityclassifier 24 5
         switch greater way:priorityclassifier 22 3
         switch greater way:priorityclassifier 20 1
         0
       else 999
