import numpy as np

class Conversions:
  MPH_TO_KPH = 1.609344
  KPH_TO_MPH = 1. / MPH_TO_KPH
  MS_TO_KPH = 3.6
  KPH_TO_MS = 1. / MS_TO_KPH
  MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH
  MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS
  MS_TO_KNOTS = 1.9438
  KNOTS_TO_MS = 1. / MS_TO_KNOTS
  DEG_TO_RAD = np.pi/180.
  RAD_TO_DEG = 1. / DEG_TO_RAD

  # Car decode decimal minutes into decimal degrees, can work with numpy arrays as input
  @staticmethod
  def dm2d(dm):
    degs = np.round(dm/100.)
    mins = dm - degs*100.
    return degs + mins/60.


# Car button codes
class CruiseButtons:
  RES_ACCEL   = 4
  DECEL_SET   = 3
  CANCEL      = 2
  MAIN        = 1


# Image params for color cam on acura, calibrated on pre las vegas drive (2016-05-21)
class ImageParams:
  def __init__(self):
    self.SX_R  = 160  # top left corner pixel shift of the visual region considered by the model
    self.SY_R  = 180  # top left corner pixel shift of the visual region considered by the model
    self.VPX_R = 319  # vanishing point reference, as calibrated in Vegas drive 
    self.VPY_R = 201  # vanishing point reference, as calibrated in Vegas drive 
    self.X     = 320  # pixel length of image for model
    self.Y     = 160  # pixel length of image for model
    self.SX  = self.SX_R   # current visual region with shift
    self.SY  = self.SY_R   # current visual region with shift
    self.VPX = self.VPX_R  # current vanishing point with shift
    self.VPY = self.VPY_R  # current vanishing point with shift
  def shift(self, shift):
    def to_int(fl):
      return int(round(fl))
    # shift comes from calibration and says how much to shift the viual region 
    self.SX  = self.SX_R + to_int(shift[0])   # current visual region with shift
    self.SY  = self.SY_R + to_int(shift[1])   # current visual region with shift
    self.VPX = self.VPX_R + to_int(shift[0])  # current vanishing point with shift
    self.VPY = self.VPY_R + to_int(shift[1])  # current vanishing point with shift

class UIParams:
  lidar_x, lidar_y, lidar_zoom = 384, 960, 6
  lidar_car_x, lidar_car_y = lidar_x/2., lidar_y/1.1
  car_hwidth = 1.7272/2 * lidar_zoom
  car_front = 2.6924 * lidar_zoom
  car_back  = 1.8796 * lidar_zoom
  car_color = 110

