$fn = 50;

width = 23;
length = 119;
height = 21;

corner_radius = 2;
wall_thickness = 1.5;
post_diameter = 8;
post_height = 0;

hole_diameter = 3;

lid_height = 4;
lid_tolerance = .3;

hook_height = 1;
hook_tolerance = .5;

airslit_height = 1.75;


module posts(x, y, z, h, r){
    translate([x, y, z])
      cylinder(r = r, h = h);

    translate([-x, y, z])
      cylinder(r = r, h = h);

    translate([-x, -y, z])
      cylinder(r = r, h = h);

    translate([x, -y, z])
      cylinder(r = r, h = h);
}


union() {
    difference() {
        // box
        hull() {
            posts(
                x=(width/2 - corner_radius), 
                y=(length/2 - corner_radius),
                z=0,
                h=height,
                r=corner_radius);
        }
        
        // hollow
        hull() {
            posts(
                x=(width/2 - corner_radius - wall_thickness), 
                y=(length/2 - corner_radius - wall_thickness),
                z=wall_thickness,
                h=height,
                r=corner_radius);
        }
    
        // lip inside box
        *hull() {
            posts(
                x=(width/2 - corner_radius - lid_lip), 
                y=(length/2 - corner_radius - lid_lip),
                z=(height - lid_thickness),
                h=(lid_thickness + 1),
                r=corner_radius);
        }
    
        // ventilation slits left 1
        for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) {
            translate([(-width/2)-wall_thickness, (-length/2)+25, i])
                cube([10, length/5, airslit_height], center=true);
        }
    
        // ventilation slits left 2
        for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) {
            translate([(-width/2)-wall_thickness, (length/2)-25, i])
                cube([10, length/5, airslit_height], center=true);
        }
    
        // ventilation slits right 1
        for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) {
            translate([(width/2)-wall_thickness, (-length/2)+25, i])
                cube([10, length/5, 1.75], center=true);
        }
    
        // ventilation slits right 2
        for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) {
            translate([(width/2)-wall_thickness, (length/2)-25, i])
                cube([10, length/5, airslit_height], center=true);
        }
    
        // network connector hole 1
        translate([0, (length/2), wall_thickness+2+10])
            cube([17, 6, 20], center=true);
    
        // network connector hole 2
        translate([0, (-length/2), wall_thickness+2+10])
            cube([17, 6, 20], center=true);
    
        // sensor hole
        translate([(width/2), -7, wall_thickness+2+6])
            cube([5, 10, 7], center=true);
    
        translate([0, -9, -wall_thickness])
          cylinder(r = 5.5/2, h = 6);
    
    }

     // hooks upward facing side
     translate([-(width/2)-0.25, length/8, height-(hook_height/2)])
       cube([2.5, 7, hook_height], center=true);
     translate([-(width/2)-0.25, -length/8, height-(hook_height/2)])
       cube([2.5, 7, hook_height], center=true);

    // hooks downward facing side
    translate([(width/2)+0.25, 0, height-(hook_height/2)])
      cube([2.5, 7, hook_height], center=true);
    translate([(width/2)+0.25, length/4, height-(hook_height/2)])
      cube([2.5, 7, hook_height], center=true);
    translate([(width/2)+0.25, -length/4, height-(hook_height/2)])
      cube([2.5, 7, hook_height], center=true);

}


/* lid */
translate([0, 0, 50]) { /* match at Z=17*/
  difference() {
    union() {
        difference() {
            hull() {
                posts(
                      x=(width/2 - corner_radius + wall_thickness + lid_tolerance), 
                      y=(length/2 - corner_radius + lid_tolerance),
                      z=0,
                      h=lid_height+wall_thickness,
                      r=corner_radius);
            }

            hull() {
                posts(
                      x=(width/2 - corner_radius ), 
                      y=(length/2 - corner_radius)+5,
                      z=-(wall_thickness),
                      h=lid_height+wall_thickness,
                      r=corner_radius);
            }

            // slits for hooks (upward facing side)
            translate([-((width/2)+wall_thickness/2),
                       length/8,
                       lid_height-((hook_height+hook_tolerance)/2)])
                cube([4, 9, hook_height+hook_tolerance], center=true);
            translate([-((width/2)+wall_thickness/2),
                       -length/8,
                       lid_height-((hook_height+hook_tolerance)/2)])
                cube([4, 9, hook_height+hook_tolerance], center=true);

            // slits for hooks (downward facing side)
            translate([(width/2)+(wall_thickness/2),
                       0,
                       lid_height-((hook_height+hook_tolerance)/2)])
                cube([4, 9, hook_height+hook_tolerance], center=true);
            translate([(width/2)+(wall_thickness/2),
                       length/4,
                       lid_height-((hook_height+hook_tolerance)/2)])
                cube([4, 9, hook_height+hook_tolerance], center=true);
            translate([(width/2)+(wall_thickness/2),
                       -(length/4),
                       lid_height-((hook_height+hook_tolerance)/2)])
                cube([4, 9, hook_height+hook_tolerance], center=true);

        }
        
   
        // hooks downward facing side
        *translate([(width/2)-lid_lip, 0, 1])
            cube([2, 5, hook_thickness], center=true);
        *translate([(width/2)-lid_lip, length/4, 1])
            cube([2, 5, hook_thickness], center=true);
        *translate([(width/2)-lid_lip, -length/4, 1])
            cube([2, 5, hook_thickness], center=true);
    
      }

    // drilling holes    
    translate([0, (length/4), -wall_thickness])
      cylinder(r = hole_diameter, h = 10);

    translate([0, -(length/4), -wall_thickness])
      cylinder(r = hole_diameter, h = 10);
      
 }
}



// support posts for pcb
/*difference() {
    translate([0, length/4, wall_thickness])
        cylinder(r = post_diameter/2, h = post_height);

    translate([0, length/4, wall_thickness])
        cylinder(r = hole_diameter/2, h = post_height+3);
}


difference() {
    translate([0, -length/4, wall_thickness])
        cylinder(r = post_diameter/2, h = post_height);

    translate([0, -length/4, wall_thickness])
        cylinder(r = hole_diameter/2, h = post_height+3);
}
*/