Merge "Draw Basic 2020 Field Spline GUI"
diff --git a/frc971/control_loops/python/constants.py b/frc971/control_loops/python/constants.py
index 7b45215..e0b4878 100644
--- a/frc971/control_loops/python/constants.py
+++ b/frc971/control_loops/python/constants.py
@@ -11,18 +11,31 @@
 args = arg_parser.parse_args()
 SCREEN_SIZE = args.size
 
-WIDTH_OF_FIELD_IN_METERS = 8.258302
-
 WIDTH_OF_ROBOT = 0.65
 LENGTH_OF_ROBOT = 0.8
 
-ROBOT_SIDE_TO_BALL_CENTER = 0.15 #Placeholder value
+ROBOT_SIDE_TO_BALL_CENTER = 0.15 # Placeholder value
 BALL_RADIUS = 0.165
-ROBOT_SIDE_TO_HATCH_PANEL = 0.1 #Placeholder value
+ROBOT_SIDE_TO_HATCH_PANEL = 0.1 # Placeholder value
 HATCH_PANEL_WIDTH = 0.4826
 
-def pxToM(p):
+FIELD = 2020
+
+if FIELD == 2019:
+    WIDTH_OF_FIELD_IN_METERS = 8.258302 # Half Field
+elif FIELD == 2020:
+    WIDTH_OF_FIELD_IN_METERS = 15.98295 # Full Field
+    LENGTH_OF_FIELD_IN_METERS = 8.21055 # Full Field
+
+def pxToM(p, length = False):
+    if(length):
+        return p * LENGTH_OF_FIELD_IN_METERS / (SCREEN_SIZE/2)
     return p * WIDTH_OF_FIELD_IN_METERS / SCREEN_SIZE
 
-def mToPx(m):
+def mToPx(m, length = False):
+    if(length):
+        return (m*(SCREEN_SIZE/2)/LENGTH_OF_FIELD_IN_METERS)
     return (m*SCREEN_SIZE/WIDTH_OF_FIELD_IN_METERS)
+
+def inToM(i):
+    return (i*0.0254)
diff --git a/frc971/control_loops/python/drawing_constants.py b/frc971/control_loops/python/drawing_constants.py
index 89979f0..a2ddf5d 100644
--- a/frc971/control_loops/python/drawing_constants.py
+++ b/frc971/control_loops/python/drawing_constants.py
@@ -3,7 +3,6 @@
 from constants import *
 import numpy as np
 
-
 def set_color(cr, color, a=1):
     if color.a == 1.0:
         cr.set_source_rgba(color.r, color.g, color.b, a)
@@ -37,6 +36,11 @@
     cr.stroke()
     set_color(cr, palette["WHITE"])
 
+def draw_circle(cr,  x, y, radius, color=palette["RED"]):
+    set_color(cr, color)
+    cr.arc(x, y, radius, 0, 2*np.pi)
+    cr.fill()
+    cr.stroke()
 
 def draw_control_points(cr, points, width=10, radius=4, color=palette["BLUE"]):
     for i in range(0, len(points)):
@@ -46,12 +50,131 @@
         cr.fill()
         set_color(cr, palette["WHITE"])
 
-
 def display_text(cr, text, widtha, heighta, widthb, heightb):
     cr.scale(widtha, -heighta)
     cr.show_text(text)
     cr.scale(widthb, -heightb)
 
+def markers(cr):
+    SHOW_MARKERS = False
+    if SHOW_MARKERS:
+        # Shield Generator Reference
+        color = palette["BLUE"]
+        yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+        # Top Left
+        draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True), 10, color)
+        # Top Right
+        draw_circle(cr, mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True), 10, color)
+        # Bottom Right
+        draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True), 10, color)
+        # Bottom Left
+        draw_circle(cr, mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True), 10, color)
+
+        # Trench Run Reference
+        color = palette["GREEN"]
+        # Bottom Trench Run
+        # Bottom Right
+        draw_circle(cr, mToPx(inToM(206.625)), yorigin, 10, color)
+        # Top Right
+        draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True), 10, color)
+        # Top Left
+        draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True), 10, color)
+        # Bottom Left
+        draw_circle(cr, mToPx(inToM(422.625)), yorigin, 10, color)
+
+        # Top Trench Run
+        # Top Right
+        draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(323.25), True), 10, color)
+        # Bottom Right
+        draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True), 10, color)
+        # Top Left
+        draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True), 10, color)
+        # Bottom Left
+        draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(323.25), True), 10, color)
+        cr.stroke()
+
+def draw_init_lines(cr):
+    yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+    set_color(cr, palette["RED"])
+    cr.move_to(mToPx(inToM(120)), yorigin)
+    cr.line_to(mToPx(inToM(120)), yorigin + mToPx(8.21055, True))
+
+    cr.move_to(mToPx(inToM(505.25)), yorigin)
+    cr.line_to(mToPx(inToM(505.25)), yorigin + mToPx(8.21055, True))
+
+    cr.stroke()
+
+def draw_trench_run(cr):
+    set_color(cr, palette["GREEN"])
+    yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+    cr.move_to(mToPx(inToM(206.625)), yorigin)
+    cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True))
+
+    cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True))
+
+    cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(422.625)), yorigin)
+
+    cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(323.25), True))
+    cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True))
+
+    cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True))
+
+    cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(323.25), True))
+
+    cr.stroke()
+
+def draw_shield_generator(cr):
+    set_color(cr, palette["BLUE"])
+    yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+
+    cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True))
+    cr.line_to(mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True))
+
+    cr.move_to(mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True))
+
+    cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True))
+    cr.line_to(mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True))
+
+    cr.move_to(mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True))
+
+    cr.stroke()
+
+def draw_control_panel(cr): # Base plates are not included
+    set_color(cr, palette["LIGHT_GREY"])
+    yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+    # Bottom Control Panel
+    # Top Line
+    cr.move_to(mToPx(inToM(225.624)), yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(285.624)), yorigin + mToPx(inToM(55.5), True))
+
+    # Left Line
+    cr.move_to(mToPx(inToM(225.624)),  yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(225.624)), yorigin)
+
+    # Right Line
+    cr.move_to(mToPx(inToM(285.624)), yorigin + mToPx(inToM(55.5), True))
+    cr.line_to(mToPx(inToM(285.624)), yorigin)
+
+    # Top Control Panel
+    # Bottom Line
+    cr.move_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(281.26), True))
+
+    # Right Line
+    cr.move_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(323.25), True))
+
+    # Left Line
+    cr.move_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(281.26), True))
+    cr.line_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(323.25), True))
+
+    cr.stroke()
 
 def draw_HAB(cr):
     # BASE Constants
@@ -307,7 +430,6 @@
                  mToPx(1.41605))
     cr.stroke()
 
-
 def draw_points(cr, p, size):
     for i in range(0, len(p)):
         draw_px_cross(cr, p[i][0], p[i][1], size,
diff --git a/frc971/control_loops/python/path_edit.py b/frc971/control_loops/python/path_edit.py
index d04089b..ddc38ac 100755
--- a/frc971/control_loops/python/path_edit.py
+++ b/frc971/control_loops/python/path_edit.py
@@ -93,9 +93,17 @@
         return self.all_controls[self.get_index_of_nearest_point()]
 
     def draw_field_elements(self, cr):
-        draw_HAB(cr)
-        draw_rockets(cr)
-        draw_cargo_ship(cr)
+        if FIELD == 2019:
+            draw_HAB(cr)
+            draw_rockets(cr)
+            draw_cargo_ship(cr)
+        elif FIELD == 2020:
+            set_color(cr, palette["BLACK"])
+            markers(cr)
+            draw_shield_generator(cr)
+            draw_trench_run(cr)
+            draw_init_lines(cr)
+            draw_control_panel(cr)
 
     def draw_robot_at_point(self, cr, i, p, spline):
         p1 = [mToPx(spline.Point(i)[0]), mToPx(spline.Point(i)[1])]
@@ -206,16 +214,16 @@
                      self.extents_y_max - self.extents_y_min)
         cr.fill()
 
-        #Drawing the switch and scale in the field
         cr.move_to(0, 50)
         cr.show_text('Press "e" to export')
         cr.show_text('Press "i" to import')
 
-        set_color(cr, palette["WHITE"])
-        cr.rectangle(0, -mToPx(8.2296 / 2.0), SCREEN_SIZE, SCREEN_SIZE)
-        cr.fill()
         set_color(cr, palette["BLACK"])
-        cr.rectangle(0, -mToPx(8.2296 / 2.0), SCREEN_SIZE, SCREEN_SIZE)
+        if FIELD == 2020:
+            cr.rectangle(0, mToPx(-7.991475), SCREEN_SIZE, SCREEN_SIZE/2)
+        else:
+            cr.rectangle(0, mToPx(-7.991475), SCREEN_SIZE, SCREEN_SIZE)
+            print(mToPx(-7.991475))
         cr.set_line_join(cairo.LINE_JOIN_ROUND)
         cr.stroke()
         self.draw_field_elements(cr)