$fn=30;
top_r = 5;

wall = 3;
bottom = 5;

height = 200;
width = 70;

top_box_height = 59+6;
top_box_depth = 27;
top_box_position = 175;

lock_box_height = 27+6;
lock_box_depth = 45;
lock_box_position = 50;

key_inner_diameter = 40;
key_outer_diameter = 57;
key_depth = 2;
key_position = 111;

handle_inner_diameter = 40;
handle_outer_diameter = 52;
handle_depth = 2;
handle_position = 0;

lock_diameter = 10;
lock_position = 50;

cable_lock_cutout_diameter = 13;
cable_lock_width = 10;
cable_lock_heigh = 2;
cable_lock_pos_1 = key_position;
cable_lock_pos_2 = top_box_position - 18;

cable_motor_cutout_diameter = 10;
cable_motor_width = 5;
cable_motor_heigh = 2;
cable_motor_pos_1 = lock_position;
cable_motor_pos_2 = top_box_position- 20;

m3_nut_hole_height = 3.2;
m3_nut_hole_width = 5.8;

light_guide_diameter = 2.5+0.2;

pcb_distance_width = 5;
pcb_distance_z = 4;
pcb_distance_hole = 2;

servo_width = 40;
servo_height = 20;
servo_depth = 10;
servo_wall = 2;
servo_hole = 2.5;
servo_hole_cc_x = 47.26;
servo_hole_cc_y = 10.17;

screw_cutout_width = 8;
screw_cutout_cc = 45;

module cover (){
	// Main mounting plate
	difference(){	
		union(){
			// top box
			translate([0,top_box_position,top_box_depth/2])minkowski(){
				cube([width-top_r*2, top_box_height-top_r*2, top_box_depth-1], center=true);
				cylinder(r=top_r, h=1, center=true);
			}
			// Lock/Motor box
			translate([0,lock_position,lock_box_depth/2])minkowski(){
				cube([width-top_r*2, lock_box_height-top_r*2, lock_box_depth-1], center=true);
				cylinder(r=top_r, h=1, center=true);
			}
			// Bottom plate
			translate([0,(height-(width/2)-top_r)/2,bottom/2])cube([width, height-(width/2)-top_r, bottom], center = true);
			translate([0,0,bottom/2])cylinder(r = width/2, h = bottom, center = true, $fn=100);

		}
		// Handle cutout
		translate([0,handle_position,bottom/2])cylinder(r = handle_inner_diameter/2, h = bottom, center = true, $fn=100);
		translate([0,handle_position,bottom/2+bottom/2-handle_depth/2])cylinder(r = handle_outer_diameter/2, h = handle_depth, center = true, $fn=100);
		// Key cutout	
		translate([0,key_position,bottom/2])cylinder(r = key_inner_diameter/2, h = bottom, center = true, $fn=100);
		translate([0,key_position,bottom/2+bottom/2-key_depth/2])cylinder(r = key_outer_diameter/2, h = key_depth, center = true, $fn=100);
		// lock/motor cutout	
		translate([0,lock_position,bottom/2])cylinder(r = lock_diameter/2, h = bottom, center = true, $fn=100);
		// Sensor cable cutout	
		translate([0,cable_lock_pos_2,bottom/2])cylinder(r = cable_lock_cutout_diameter/2, h = bottom, center = true, $fn=100);
		translate([0,cable_lock_pos_1+(cable_lock_pos_2-cable_lock_pos_1)/2,cable_lock_heigh/2])cube([cable_lock_width,cable_lock_pos_2-cable_lock_pos_1,cable_lock_heigh], center = true);
		// Motor cable cutout	
		translate([-25,cable_motor_pos_1,(bottom+servo_depth)/2])cylinder(r = cable_motor_cutout_diameter/2, h = bottom+servo_depth, center = true, $fn=100);
		translate([-25,cable_motor_pos_2,top_box_depth/2])cylinder(r = cable_motor_cutout_diameter/2, h = top_box_depth, center = true, $fn=100);
		translate([-25,cable_motor_pos_1+(cable_motor_pos_2-cable_motor_pos_1)/2,cable_motor_heigh/2])cube([cable_motor_width,cable_motor_pos_2-cable_motor_pos_1,cable_motor_heigh], center = true);
		// Motor cutout	
		translate([0,lock_position,(lock_box_depth+servo_depth+servo_wall)/2])cube([width-wall*2-1, lock_box_height-wall*4, lock_box_depth-servo_depth-servo_wall], center=true);
		translate([0,lock_position,lock_box_depth-wall/2])cube([width-wall*2, lock_box_height-wall*2, wall], center=true);
		translate([20-9.66-0.5,lock_position,servo_depth/2+servo_wall])cube([servo_width, servo_height, servo_depth], center=true);
		// Motor mount holes
		translate([-13.47-1.5,lock_position+servo_hole_cc_y/2,servo_depth/2+servo_wall])cylinder(r = servo_hole/2, h = servo_depth, center=true);
		translate([-13.47-1.5,lock_position-servo_hole_cc_y/2,servo_depth/2+servo_wall])cylinder(r = servo_hole/2, h = servo_depth, center=true);
		// Motor box screw cutout
		translate([screw_cutout_cc/2,lock_box_position,lock_box_depth-wall/2])cube([screw_cutout_width, lock_box_height, wall], center=true);
		translate([-screw_cutout_cc/2,lock_box_position,lock_box_depth-wall/2])cube([screw_cutout_width, lock_box_height, wall], center=true);
		translate([-screw_cutout_cc/2,lock_box_position+lock_box_height/2-wall,lock_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([screw_cutout_cc/2,lock_box_position+lock_box_height/2-wall,lock_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([-screw_cutout_cc/2,lock_box_position-lock_box_height/2+wall,lock_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([screw_cutout_cc/2,lock_box_position-lock_box_height/2+wall,lock_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		// Top box cutout	
		translate([0,top_box_position,(top_box_depth-bottom-3)/2+bottom+pcb_distance_z/2])cube([width-wall*2-1, top_box_height-wall*4, top_box_depth-bottom+3-pcb_distance_z], center=true);
		translate([0,top_box_position,top_box_depth-wall/2])cube([width-wall*2, top_box_height-wall*2, wall], center=true);
		translate([0,top_box_position,(pcb_distance_z)/2+bottom-3])cube([width-wall*2-5, top_box_height-wall*4-4, pcb_distance_z], center=true);
		// Power cutout
		translate([26,top_box_position+top_box_height/2-(wall*2+2)/2,(pcb_distance_z-1)/2+2])cube([6, wall*2+2, pcb_distance_z-1], center=true);
		// Top box screw cutout
		translate([screw_cutout_cc/2,top_box_position,top_box_depth-wall/2])cube([screw_cutout_width, top_box_height, wall], center=true);
		translate([-screw_cutout_cc/2,top_box_position,top_box_depth-wall/2])cube([screw_cutout_width, top_box_height, wall], center=true);
		translate([-screw_cutout_cc/2,top_box_position+top_box_height/2-wall,top_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([screw_cutout_cc/2,top_box_position+top_box_height/2-wall,top_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([-screw_cutout_cc/2,top_box_position-top_box_height/2+wall,top_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
		translate([screw_cutout_cc/2,top_box_position-top_box_height/2+wall,top_box_depth-wall-servo_depth/2])cylinder(r=servo_hole/2, h = servo_depth, center=true);
	}
	// PCB mounting
	translate([0,top_box_position,bottom])difference(){
		union(){
			translate([-2.54*1.5,2.54*0.5,pcb_distance_z/2-3])cylinder(r = pcb_distance_width/2, h = pcb_distance_z, center = true);
		}
		translate([-2.54*1.5,2.54*0.5,pcb_distance_z/2-3])cylinder(r = pcb_distance_hole/2, h = pcb_distance_z, center = true);
	}
}

cover();
