/**
 * Modelos y variables según la especificación SFF-8200.
 *
 * @author  Joaquín Fernández
 * @url     https://gitlab.com/joaquinfq/openscad/blob/master/Modules/Models/SFF/8200.scad
 * @license CC-BY-NC-4.0
 *
 * @see     SFF-8200 2.5" Form Factor Drives
 */
//----------------------------------------------------------
use <../../Box/tray.scad>
use <../box.scad>
//----------------------------------------------------------
/**
 * Devuelve las especificaciones de las medidas según SFF-8200.
 *
 * @param {Float}   tolerance Tolerancia a usar para ajustar las medidas.
 * @param {Integer} type      Tipo de unidad (0: pequeña, 1: mediana, 2: grande).
 *
 * @return {Float[]}
 */
function sff8200(tolerance = 0, type = 0) = [
      3.00, // Diámetro del tornillo
     (
         type == 0 
            ? 19.05 
            : type == 1 
                ? 17.00 
                : type == 2
                    ? 15.00 
                    : type == 3
                        ? 12.70 
                        : type == 4
                            ? 10.50 
                            : type == 5
                                ? 9.50 
                                : type == 6
                                    ? 8.47
                                    : type == 7
                                        ? 7.00
                                        : 5.00
    ) + tolerance,
      0.00,
      0.50,
     69.85 + tolerance,
      0.25,
    100.45 + tolerance,
     undef,
     undef,
     undef,
    100.20 + tolerance,     // #10
    100.50 + tolerance,
    110.20 + tolerance,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,                 // #20
     undef,
     undef,
      3.00 + tolerance / 2,
     34.93,
     38.10,
     undef,
      0.50,
      4.07 + tolerance / 2,
     61.72,
     34.93,                 // #30
     38.10,
     undef,
      0.50,
     undef,
     undef,
     undef,
      8.00,
      3.00,
     undef,
     undef,                 // #40
      2.50,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,
     undef,
     14.00 + tolerance / 2, // #50
     90.60 + tolerance / 2,
     14.00 + tolerance / 2,
     90.60 + tolerance / 2
];
//----------------------------------------------------------
/**
 * Dibuja un modelo de una unidad de 3.5" según la especificación SFF-8200.
 *
 * Este modelo permite extraer el volumen posteriormente para crear una ranura
 * como las usadas en las cajas de PCs.
 *
 * @param {Float}   length    Longitud de la unidad a generar.
 * @param {Float}   thickness Grosor del bloque donde se insertará el modelo.
 * @param {Float}   screw     Diámetro del tornillo a usar.
 * @param {Float}   slot      Longitud de la ranura donde se insertarán los tornillos.
 * @param {Float}   tolerance Valor a usar para ajustar las medidas estándar.
 * @param {Integer} type      Tipo de unidad (0: pequeña, 1: mediana, 2: grande).
 */
module sff8200Model(length = 0, thickness = 5, screw = 0, slot = 15, tolerance = 0.3, type = 0)
{
    _A = sff8200(tolerance, type);
    modelBox(
        _A[4],
        _A[1],
        length ? length : _A[6],
        thickness,
        screw ? screw : _A[0],
        slot,
        [
            [ _A[23], _A[6] - _A[52] ],
            [ _A[23], _A[6] - _A[53] ]
        ],
        [
            [ _A[28],         _A[6] - _A[50] ],
            [ _A[28],         _A[6] - _A[51] ],
            [ _A[4] - _A[28], _A[6] - _A[50] ],
            [ _A[4] - _A[28], _A[6] - _A[51] ]
        ]
    );
}
//----------------------------------------------------------
/**
 * Dibuja una bandeja que puede insertarse en una ranura donde va una unidad de 3.5".
 *
 * @param {Float}   length    Longitud de la unidad a generar.
 * @param {Float}   thickness Grosor del bloque donde se insertará el modelo.
 * @param {Float}   screw     Diámetro del tornillo a usar.
 * @param {Float}   slot      Longitud de la ranura donde se insertarán los tornillos.
 * @param {Float}   tolerance Valor a usar para ajustar las medidas estándar.
 * @param {Boolean} sides     Lados a eliminar de la bandeja.
 * @param {Integer} type      Define la altura según el tipo de unidad (0: más grande, 8: más pequeña).
 */
module sff8200Tray(length = 0, thickness = 5, screw = 0, slot = 15, tolerance = 0.3, sides = [ "a", "t" ], type = 0)
{
    _A = sff8200(tolerance, type);
    boxTray(_A[4], _A[1], length ? length : _A[6], thickness, sides)
    {
        sff8200Model(length, thickness, screw  ? screw : _A[0], slot, tolerance, type);
    }
}
//sff8200Tray();