File Management.

This commit is contained in:
Chris Giacofei 2023-02-01 16:22:33 -05:00
parent 1f30d75509
commit f838d4d0ce
38 changed files with 1100935 additions and 699 deletions

View File

@ -11,8 +11,8 @@ ifndef MONITOR_PORT
endif
endif
ESPTOOL := $(BASE_DIR)/hardware/esp8266/tools/esptool/esptool
ESPOTA := $(BASE_DIR)/hardware/esp8266/tools/espota.py
ESPTOOL := $(BASE_DIR)/util/esp8266/tools/esptool/esptool
ESPOTA := $(BASE_DIR)/util/esp8266/tools/espota.py
TARGET_DIR := $(BASE_DIR)/$(subst :,.,build/$(FQBN))
BIN_DIR := $(BASE_DIR)/bin
SRC := $(wildcard $(SKETCH_DIR)/*.ino)

2
hardware/CAD/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.stl
*.FCStd1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,75 @@
{
"parameterSets": {
"design default values": {
"BackPanelType": "Discrete",
"CaseColour": "Teal",
"EmbossPanelDecorations": "1",
"FasteningHoleDiameter": "2",
"FasteningTabThickness": "2",
"FasteningType": "Push",
"FilletRadius": "2",
"FrontPanelType": "Discrete",
"Height": "30",
"Length": "100",
"MountDia": "8",
"MountHeight": "10",
"MountHoleDia": "2.5",
"NumberOfFastenings": "2",
"PCBLength": "40",
"PCBMounts": "0",
"PCBPosX": "10",
"PCBPosY": "10",
"PCBWidth": "30",
"PanelColour": "Aqua",
"PanelTolerance": "0.9",
"PrintLayout": "0",
"Resolution": "50",
"ShowBCase": "1",
"ShowBPanel": "1",
"ShowFPanel": "1",
"ShowPCB": "0",
"ShowTCase": "0",
"VentType": "VentHoles",
"VentWidth": "1.5",
"WallThickness": "2",
"Width": "75",
"examplePanels": "0"
},
"GlycolSettings": {
"BackPanelType": "Discrete",
"CaseColour": "Teal",
"EmbossPanelDecorations": "1",
"FasteningHoleDiameter": "3",
"FasteningTabThickness": "3",
"FasteningType": "Screw",
"FilletRadius": "2",
"FrontPanelType": "Discrete",
"Height": "75",
"Length": "200",
"MountDia": "8",
"MountHeight": "10",
"MountHoleDia": "2.5",
"NumberOfFastenings": "4",
"PCBLength": "40",
"PCBMounts": "0",
"PCBPosX": "10",
"PCBPosY": "10",
"PCBWidth": "30",
"PanelColour": "Aqua",
"PanelTolerance": "0.9",
"PrintLayout": "0",
"Resolution": "50",
"ShowBCase": "1",
"ShowBPanel": "1",
"ShowFPanel": "1",
"ShowPCB": "0",
"ShowTCase": "0",
"VentType": "VentHoles",
"VentWidth": "1.5",
"WallThickness": "2",
"Width": "130",
"examplePanels": "0"
}
},
"fileFormatVersion": "1"
}

View File

@ -0,0 +1,850 @@
/*
////////////////////////////////////////////////////
See my other designs:
https://www.thingiverse.com/steeveeet/designs
////////////////////////////////////////////////////
This file is designed to be entirely customisable.
The easiest way to use this is to copy the top sections (Basic and Advanced Customisation) into a new file
and add `include <U_Box.scad>;` at the top of that file. That will bring all the functionality of this file into a new file
so that you can define the box specific value for it.
There are 3 main sections to this file:
*** Basic Customisation ***
Top section defines the variables for the box -
these are all exposed through the Customizer UI.
The last section (display settings) is used to control what is displayed
(and thus exported to STL when the time comes)
*** Advanced Customisation ***
The configuratino fo the end panels are here.
These modules define the shapes to use to cut out holes from the front and back panels,
and to add (text) decoration to the front and back panels
In the PCB mount locations you'll find an array of point constructed
from the rectangle defined by the PCB Width and Height defined in the UI.
If you wish to ovverride this (if you need more than 4 mounting points,
or they are not in a rectangle) simply construct that array in directly and the model will update
*** Implementation ***
This section contains the modules and functions that are used to actually construict the parts of the box
It's unlikely you will need to change this, though I'd be very interested if you find that you do!
////////////////////////////////////////////////////
*/
/********************************************************************
*** Basic Customisation ***
*********************************************************************/
/* [Case Settings] */
Length = 80;
Width = 60;
Height = 30;
WallThickness = 2; // [1:5]
FilletRadius = 2; // [0.1:12]
// Decorations or ventilation holes
VentType = "VentHoles"; // [None, Decorations, VentHoles:Ventilation Holes]
// Width of vent/decoration holes
VentWidth = 1.5;
/* [Fastening Options] */
// Methods of securing the closure of the box
FasteningType = "Push"; // [Screw:Screw Fit, Push:Push Fit]
// Number for fastenings along thge edge
NumberOfFastenings = 2; // [0:10]
// Thickness of the fastening tabs
FasteningTabThickness = 2; // [1:5]
// Diameter of fastener hole for screw fitting
FasteningHoleDiameter = 2; // [0.1:5]
/* [End Panels] */
BackPanelType = "IntegratedWithBase"; // [None, IntegratedWithTop:Integrated With Top, IntegratedWithBase:Integrated With Base, Discrete]
FrontPanelType = "IntegratedWithBase"; // [None, IntegratedWithTop:Integrated With Top, IntegratedWithBase:Integrated With Base, Discrete]
// Panel Text Type
EmbossPanelDecorations = 1; // [0:Demboss, 1:Emboss]
// End Panel Tolerance
PanelTolerance = 0.9;
// Use example panel decorations
examplePanels = 1; // [0:No, 1:Yes]
/* [PCB Mounts] */
// Show PCB Ghost
ShowPCB = 1; // [0:No, 1:Yes]
// Add PCB Mounts
PCBMounts = 1; // [0:No, 1:Yes]
// Back left corner X position
PCBPosX = 10;
// Back left corner Y position
PCBPosY = 10;
// PCB Length
PCBLength = 40;
// PCB Width
PCBWidth = 30;
// Mount height
MountHeight = 10;
// Mount diameter
MountDia = 8;
// Hole diameter
MountHoleDia = 2.5;
/* [Display Settings] */
// Print Layout
PrintLayout = 0; // [0:No, 1:Yes]
// Top Case
ShowTCase = 0; // [0:No, 1:Yes]
// Bottom Case
ShowBCase = 1; // [0:No, 1:Yes]
// Front panel
ShowFPanel = 1; // [0:No, 1:Yes]
// Back panel
ShowBPanel = 1; // [0:No, 1:Yes]
/* [Hidden] */
// Case color
CaseColour = "Teal";
// End Panel color
PanelColour = "Aqua";
// Fillet Smootheness
Resolution = 50; // [4:100]
/************************************************************
*** Advanced Customisation ***
************************************************************/
{
//////////////////////////////////////////
/////////// Panel Configuration //////////
//////////////////////////////////////////
module FrontPanelCutouts(){
if (examplePanels)
{
SquareHole ([10,5],[10,10],1);
CylinderHole([40,10],5);
}
}
module FrontPanelDecoration(){
if (examplePanels)
{
LText([7.5,17.5], "On/Off");
CText([40,10], 5, "12345");
}
}
module BackPanelCutouts(){
if (examplePanels)
{
SquareHole ([5,0],[10,10],1);
CylinderHole([10,10],10);
}
}
module BackPanelDecoration(){
if (examplePanels)
{
LText([17.5,5], "Power");
}
}
//////////////////////////////////////////
/////////// PCB Mount locations //////////
//////////////////////////////////////////
pcbMountLocations = [[0,0], [PCBWidth,0], [0,PCBLength], [PCBWidth,PCBLength] ];
}
/************************************************************
*** Implementation ***
************************************************************/
{
//////////////////////////////
/////////// Helpers //////////
//////////////////////////////
$fn = Resolution;
////////// CONSTANT: Thickness of end panels //////////
function PanelThickness() = WallThickness;
////////// CONSTANT: Helper to define how much space is needed for end panel ribs, depending on type //////////
function SpaceForEndPanel(type) =
type == "IntegratedWithTop" ? PanelThickness() :
type == "IntegratedWithBase" ? PanelThickness() :
type == "Discrete" ? 2*WallThickness + PanelThickness() + PanelTolerance :
0; // None
////////// CONSTANT: How much of the length of the case will be taken up by support ribs for the end panels //////////
function SpaceForEndPanels() = 2*max(SpaceForEndPanel(FrontPanelType), SpaceForEndPanel(BackPanelType));
////////// CONSTANT: Vector describing exterior dimensions of the case //////////
function CaseDims() = [Length, Width, Height];
////////// CONSTANT: The clear space before fittings for end panels //////////
function InteriorDims() = [Length - SpaceForEndPanels(), Width - 2*WallThickness, Height - 2*WallThickness];
////////// Calculated size of tabs. Default to 8mm, but reduce if a small length or height //////////
function TabDiameter() =
min(Height/2, // Don't collide with Vent Holes in reduced height boxes
min(InteriorDims().x/2, // Don't collide with other tabs in reduced length boxes
20)); // Sensible max height
//////////////////////////////////////////////////
/////////// Maths functions & Utilities //////////
//////////////////////////////////////////////////
////////// Utility to work out how many items you might fit ion a given length //////////
function numItemsAlongLength(length, itemSpacing) = ceil(length / itemSpacing);
// Helper functions to calculate the bounding box of an array of vec2s
function bbox(v) = [minimum(v), maximum(v)];
{
// Return the maximum of all the "elem"th elemtns in a vector of vectors
function minimumElem(v, elem, i = 0) =
(i < len(v) - 1) ?
min(v[i][elem], minimumElem(v, elem, i+1)) :
v[i][elem];
// Return the maximum of all the "elem"th elemtns in a vector of vectors
function maximumElem(v, elem, i = 0) =
(i < len(v) - 1) ?
max(v[i][elem], maximumElem(v, elem, i+1)) :
v[i][elem];
function minimum(v) =
[minimumElem(v, 0), minimumElem(v, 1)];
function maximum(v) =
[maximumElem(v, 0), maximumElem(v, 1)];
}
///// Operator: distribute copies of the children evenly along a vector //////////
module distribute(start, end, numItems){
vec = end-start;
length = norm(vec);
normVec = vec/length;
itemSpacing = length / (2*numItems);
// Even number of tabs
for (i=[0: 1: numItems-1])
{
tabLoc = start + (itemSpacing * (1 + 2*i)) * normVec;
translate([tabLoc.x, tabLoc.y, tabLoc.z])
{
children();
}
}
}
/////////// Generic rounded box - Aligned along the X axis //////////
module RoundBox(dims, fillet = 0, center = false){
if (fillet > 0){
// Calculate the correct offset depending on whether the cube should be offset
// Split the total height between cubeDims & cylHeight
cylHeight = dims.x/2;
// The fillet radius must (at most) be half either Y, or Z, but we cannot have cubeDims Y or Z equal to zero
cappedFillet = min(min(fillet, dims.y/2.001), dims.z/2.001);
cubeDims = [
dims.x/2,
dims.y - 2*cappedFillet,
dims.z - 2*cappedFillet,
];
offset = center ? [0,0,0] : dims/2;
translate(offset){
minkowski()
{
rotate([0, 90, 0]){
cylinder(r = cappedFillet, h = cylHeight, center = true);
}
cube(cubeDims, center = true);
}
}
} else {
cube(dims, center = center);
}
}// End of RoundBox Module
/////////// Generic hollow rounded box - Aligned along the X axis //////////
module HollowRoundBox(dims, thickness, fillet = 0, center = false){
offset = center ? [0,0,0] : dims/2;
translate(offset){
difference() {
RoundBox(dims, fillet, true);
RoundBox([dims.x * 1.1, dims.y - 2*thickness, dims.z - 2*thickness], fillet, true);
}
}
}// End of RoundBox Module
////////////////////////////////////////////////////////
////////////////////// Main Case ///////////////////////
////////////////////////////////////////////////////////
module PanelRibs(panelType, xMultiplier = 1)
{
// For discrete panels, define the ribs to hold them in place
discreteRibDims = [WallThickness, CaseDims().y - 2*WallThickness, CaseDims().z - 2*WallThickness];
// Effective thickness of the discrete panel, including tolerance
discretePanelThickness = PanelTolerance + WallThickness;
// Location for slot for discrete panels
slotLocation = CaseDims().x/2 - (discreteRibDims.x + discretePanelThickness/2);
// Offset (from slotLocation) for retaining ribs
slotOffset = (discreteRibDims.x + discretePanelThickness)/2;
// For integrated panels, the rib can be smaller
integratedRibDims = [WallThickness/2, CaseDims().y - 2*WallThickness, CaseDims().z - 2*WallThickness];
// For integrated panels, the rib can be smaller
integratedRibOffset = (WallThickness + PanelTolerance/2) + integratedRibDims.x/2;
// Front Panel
if(panelType == "Discrete")
{
// Add ribs for supporting discrete panel
translate([xMultiplier * (slotLocation + slotOffset), 0, 0]){
HollowRoundBox(discreteRibDims, WallThickness, FilletRadius, true);
}
translate([xMultiplier * (slotLocation - slotOffset), 0, 0]){
HollowRoundBox(discreteRibDims, WallThickness, FilletRadius, true);
}
}
else if(panelType == "IntegratedWithThis"){
// Add a supporting rib for the panel integrated with this half
translate([xMultiplier * (CaseDims().x/2 - WallThickness/2), 0, 0]){
HollowRoundBox([WallThickness, CaseDims().y - 2*WallThickness, CaseDims().z - 2*WallThickness], PanelTolerance/2, FilletRadius, true);
}
}
else if(panelType == "IntegratedWithOther"){
// Add a supporting rib for the panel integrated with the other half
translate([xMultiplier * (CaseDims().x/2 - integratedRibOffset), 0, 0]){
HollowRoundBox(integratedRibDims, WallThickness/2, FilletRadius, true);
}
}
}
////////////////////////////////// Case //////////////////////////////////
module Case(dims, thickness, fillet = 0, fPanelType = "None", bPanelType = "None"){
// Hull with integrated panels (where appropriate)
union(){
// Decorated hull
difference()
{
// Main hull
union() {
// Main Shell
HollowRoundBox(dims, thickness, fillet, true);
// Add ribs for supporting the end panels
PanelRibs(fPanelType, 1);
PanelRibs(bPanelType, -1);
}
// Remove the top
translate([0, 0, Height / 2]){
cube([dims.x*1.1, dims.y*1.1, dims.z], true);
}
// Add side decoration / vents
if (VentType != "None")
{
union()
{
overlap = VentWidth; //make sure that we cleanly overlap the top/bottom/side of the case
decDims = [
VentType == "VentHoles" ?
(thickness + fillet) + overlap :
thickness/2 + overlap,
VentWidth,
(dims.z / 4) + overlap
];
padding = dims.x/20; // (half) the gap between sets of vents (and between vents and end)
ventFillet = VentWidth/3;
// Coords for vents
xStart = padding;
xEnd = InteriorDims().x/2 - padding;
yPos = VentType == "VentHoles" ?
InteriorDims().y/2 + decDims.x/2 - fillet : // Calculated from the inside wall
CaseDims().y/2 - decDims.x/2 + overlap; // Calculated from the ouside wall
zPos = -0.5*(dims.z - decDims.z) - overlap;
numVents = numItemsAlongLength(xEnd-xStart, VentWidth+thickness);
distribute([xStart, yPos, zPos], [xEnd, yPos, zPos], numVents)
{
rotate([0, 0, 90])
RoundBox(decDims, ventFillet, true);
}
distribute([-xStart, yPos, zPos], [-xEnd, yPos, zPos], numVents)
{
rotate([0, 0, 90])
RoundBox(decDims, ventFillet, true);
}
distribute([xStart, -yPos, zPos], [xEnd, -yPos, zPos], numVents)
{
rotate([0, 0, 90])
RoundBox(decDims, ventFillet, true);
}
distribute([-xStart, -yPos, zPos], [-xEnd, -yPos, zPos], numVents)
{
rotate([0, 0, 90])
RoundBox(decDims, ventFillet, true);
}
}
}
}
}
}
////////////////////////////////// Fixing tabs //////////////////////////////////
module Tab(radius, thickness){
difference(){
union(){
rotate([90, 0, 0])
{
cylinder(r = radius, thickness, $fn = 6);
}
}
// Chamfer
translate([0, -radius/2, -2*radius/3]){
rotate([45, 0, 0]){
cube([2*radius, radius, radius], center=true);
}
}
// Tolerance cut
tolerance = 0.1;
tolBox = [2*radius, 2*thickness, radius];
translate([0, (thickness-tolerance), tolBox.z/2]){
cube(tolBox, center=true);
}
}
}
////////////////////////////////// Case with tabs //////////////////////////////////
module CaseWithTabs(dims, thickness, fillet = 0, fPanelType = "None", bPanelType = "None"){
cylRad = TabDiameter()/2;
holeDia = FasteningHoleDiameter;
// Calculate the number of tabs and their location based on the length of the box.
// Assume a gap of TabDiameter on each side of each tab before spawning a new tab
numItems = NumberOfFastenings;
// For push fitting, offset the registration sphere so it's not a complete hemisphere. Makes it easier to close.
// Setting this to zero will result in a complete hemisphere
sphereOffset = 0.125*holeDia;
difference(){
union(){
Case(dims, thickness, fillet, fPanelType, bPanelType);
// Tabs
distribute(
[InteriorDims().x/2, InteriorDims().y/2, 0],
[-InteriorDims().x/2, InteriorDims().y/2, 0],
numItems)
{
Tab(cylRad, FasteningTabThickness);
}
if (FasteningType == "Push"){
// Add registration spheres
distribute(
[InteriorDims().x/2, -InteriorDims().y/2 - sphereOffset, -cylRad/3],
[-InteriorDims().x/2, -InteriorDims().y/2 - sphereOffset, -cylRad/3],
numItems)
{
difference(){
sphere(d = holeDia);
// Ensure the sphere doesn't stick out of the other side of the wall!
translate([0,-(holeDia - 2.*sphereOffset)/2,0])
{
cube(holeDia, true);
}
}
}
}
}
if (FasteningType == "Push"){
// Add cutouts for registration spheres
distribute(
[InteriorDims().x/2, InteriorDims().y/2 + sphereOffset, cylRad/3],
[-InteriorDims().x/2, InteriorDims().y/2 + sphereOffset, cylRad/3],
numItems
)
{
sphere(d = holeDia);
}
}
else if (FasteningType == "Screw"){
// Screw fitting so add the case holes
distribute(
[InteriorDims().x/2, InteriorDims().y/2, cylRad/3],
[-InteriorDims().x/2, InteriorDims().y/2, cylRad/3],
numItems
)
{
rotate([90, 0, 0]){
cylinder(d = holeDia, 3.0*thickness, center=true);
}
}
distribute(
[InteriorDims().x/2, -InteriorDims().y/2, -cylRad/3],
[-InteriorDims().x/2, -InteriorDims().y/2, -cylRad/3],
numItems)
{
rotate([90, 0, 0]){
cylinder(d = holeDia, 3.0*thickness, center=true);
}
}
}
}
}
/////////////////////////////////////////////////////////
////////////////////// PCB Mounts ///////////////////////
/////////////////////////////////////////////////////////
/////////////////////// PCB Mount /////////////////////////////
module PCBMount(){
FilletRadius = 2;
color(CaseColour)
union(){
difference(){
// Main cylinder
cylinder(d = MountDia, MountHeight);
// central hole
cylinder(d = MountHoleDia, MountHeight*1.01);
// Chamfer to help centre screws
chamferRad = (MountDia-MountHoleDia)/4;
rotate_extrude(){
translate([MountHoleDia / 2, (MountHeight-chamferRad)*1.01, 0]){
difference(){
square(chamferRad);
translate([chamferRad,0,0])
circle(chamferRad, $fn=4);
}
}
}
}
// Fillet
rotate_extrude(){
translate([MountDia / 2, 0, 0]){
difference(){
square(FilletRadius);
translate([FilletRadius,FilletRadius,0])
circle(FilletRadius);
}
}
}
}
}
module PCBMounts(){
if (PCBMounts)
{
translate(-InteriorDims()/2 + [PCBPosX, PCBPosY, 0]){
if (ShowPCB)
{
// PCB Ghost
pcbGhostPadding = 5;
bbox = bbox(pcbMountLocations);
w = bbox[1][0] - bbox[0][0];
l = bbox[1][1] - bbox[0][1];
translate(-[pcbGhostPadding, pcbGhostPadding, -(MountHeight+1)]){
% square([l + 2*pcbGhostPadding, w + 2*pcbGhostPadding]);
}
}
for(footLocation = pcbMountLocations)
{
translate([footLocation.y, footLocation.x, 0])
{
PCBMount();
}
}
}
}
}
/////////////////////////////////////////////////////////
////////////////////// End Panels ///////////////////////
/////////////////////////////////////////////////////////
/////////////// Circular hole helper //////////////////////
// loc = location of centre
// d = diameter of holes
module CylinderHole(loc, d){
translate([loc.x, loc.y, -PanelThickness()*0.1]){
cylinder(d = d, PanelThickness() * 1.2, $fn = Resolution);
}
}
/////////////// Rectangular hole helper /////////////////////
// loc = location of bottom left corner
// sz = dimensions of box
// f = radius of fillet
module SquareHole(loc, sz, f){
translate([loc.x, loc.y, -PanelThickness()*0.1]){
rotate([-90, -90, 0])
{
RoundBox([PanelThickness() * 1.2, sz.x, sz.y], f);
}
}
}
/////////////// Text helper /////////////////////
// loc = location of bottom left corner
// content = text to print
// sz = size of text
// ft = font to use
module LText(loc, content, sz = min(Width,Height)/10, ft = "Arial Black"){
translate([loc.x, loc.y, PanelThickness()]){
linear_extrude(height = 1, center = true){
text(content, size = sz, font = ft);
}
}
}
/////////////// Arc Text helper /////////////////////
// loc = location of the centre of the arc
// content = text to print
// rad = radius of arc
// a0 = Start angle (default 0 - west)
// a1 = End angle (default 180 - east)
// sz = size of text
// ft = font to use
/////////////////////////////////////////////////////
module CText(loc, r, content, a0=0, a1=180, sz = min(Width,Height)/10, ft = "Arial Black"){
angleStep = (a1-a0) / (len(content)-1);
translate([loc.x, loc.y, PanelThickness()])
for (i = [0: len(content) - 1] ) {
rotate([0, 0, 90 - (i * angleStep)])
translate([0, r, 0]) {
linear_extrude(height = 1, center = true){
text(content[i], font = ft, size = sz, valign = "baseline", halign = "center");
}
}
}
}
////////////////////// End Panel //////////////////////
module Panel(){
panelDims = [PanelThickness(), InteriorDims().y - PanelTolerance, InteriorDims().z - PanelTolerance];
cutout = true;
difference(){
color(PanelColour)
RoundBox(panelDims, FilletRadius, true);
// Translate so that bottom left corner of panel is "origin" for controls
translate(-panelDims/2){
rotate([90, 0, 90]){
children(0);
}
}
if (!EmbossPanelDecorations){
color(CaseColour){
translate(-panelDims/2){
rotate([90, 0, 90]){
children(1);
}
}
}
}
}
if (EmbossPanelDecorations){
color(CaseColour){
translate(-panelDims/2){
rotate([90, 0, 90]){
children(1);
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////
////////////////////// Main Scene Build /////////////////////////////////
/////////////////////////////////////////////////////////////////////////
printLayoutPadding = 10;
// Utility function to establish whether the panel is integated with This half or the Other
function panelType(type, this, other) =
type == this ? "IntegratedWithThis" :
type == other ? "IntegratedWithOther" :
type;
// Utility to work out the offset from the edge of the case depending on panel type.
function panelOffset(type) =
type == "Discrete" ?
(WallThickness + PanelThickness()/2 + PanelTolerance/2) : // Discrete
PanelThickness()/2; // Integrated (or None, in which case the translate doesn't matter)
///////////////////////// Calculate the transforms for each part, depening on whether we're visualising or printing /////////////////////////
BaseTranslate = !PrintLayout ?
CaseDims() / 2:
CaseDims() / 2;
BaseRotate = !PrintLayout ?
[0,0,0]:
[0,0,0];
TopTranslate = !PrintLayout ?
[CaseDims().x/2, CaseDims().y/2, CaseDims().z/1.95] :
[CaseDims().x/2, CaseDims().y*1.5 + printLayoutPadding, CaseDims().z/2];
TopRotate = !PrintLayout ?
[180, 0, 0] :
[0,0,0];
FPanelTranslate = (!PrintLayout || FrontPanelType != "Discrete") ?
FrontPanelType == "IntegratedWithTop" ?
TopTranslate + [CaseDims().x/2 - panelOffset(FrontPanelType) - 0.01, 0, 0] :
BaseTranslate + [CaseDims().x/2 - panelOffset(FrontPanelType) - 0.01, 0, 0] :
[CaseDims().x + CaseDims().z/2 + printLayoutPadding, CaseDims().y/2, PanelThickness()/2];
FPanelRotate = (!PrintLayout || FrontPanelType != "Discrete") ?
FrontPanelType == "IntegratedWithTop" ?
TopRotate + [180,0,0]:
BaseRotate + [0,0,0]:
[0,-90,0];
BPanelTranslate = (!PrintLayout || BackPanelType != "Discrete") ?
BackPanelType == "IntegratedWithTop" ?
TopTranslate + [-(CaseDims().x/2 - panelOffset(BackPanelType) - 0.01), 0, 0] :
BaseTranslate + [-(CaseDims().x/2 - panelOffset(BackPanelType) - 0.01), 0, 0] :
[CaseDims().x + CaseDims().z/2 + printLayoutPadding, CaseDims().y*1.5 + printLayoutPadding, PanelThickness()/2];
BPanelRotate = (!PrintLayout || BackPanelType != "Discrete") ?
BackPanelType == "IntegratedWithTop" ?
TopRotate + [180,0,180]:
BaseRotate + [0,0,180]:
[0,-90,0];
PCBTranslate = !PrintLayout ? CaseDims() / 2 : [0,0,0];
PCBRotate = !PrintLayout ? [0,0,0]: [0,0,0];
if (ShowTCase)
{
union()
{
translate(TopTranslate){
rotate(TopRotate){
color(CaseColour){
CaseWithTabs(CaseDims(), WallThickness, FilletRadius,
fPanelType = panelType(FrontPanelType, "IntegratedWithTop", "IntegratedWithBase"),
bPanelType = panelType(BackPanelType, "IntegratedWithTop", "IntegratedWithBase"));
}
}
}
// TODO: translated (but don't rotate) the panel with the case - also works for print mode
// means we have to have the panel translation in local coords (at least not for discrete mode)
if (FrontPanelType == "IntegratedWithTop")
{
translate(FPanelTranslate) {
rotate(FPanelRotate){
Panel(){
FrontPanelCutouts();
FrontPanelDecoration();
}
}
}
}
if (BackPanelType == "IntegratedWithTop")
{
translate(BPanelTranslate) {
rotate(BPanelRotate){
Panel(){
BackPanelCutouts();
BackPanelDecoration();
}
}
}
}
}
}
if (ShowBCase) {
union()
{
translate(BaseTranslate){
rotate(BaseRotate){
color(CaseColour){
CaseWithTabs(CaseDims(), WallThickness, FilletRadius,
fPanelType = panelType(FrontPanelType, "IntegratedWithBase", "IntegratedWithTop"),
bPanelType = panelType(BackPanelType, "IntegratedWithBase", "IntegratedWithTop"));
}
PCBMounts();
}
}
if (FrontPanelType == "IntegratedWithBase")
{
translate(FPanelTranslate) {
rotate(FPanelRotate){
Panel(){
FrontPanelCutouts();
FrontPanelDecoration();
}
}
}
}
if (BackPanelType == "IntegratedWithBase")
{
translate(BPanelTranslate) {
rotate(BPanelRotate){
Panel(){
BackPanelCutouts();
BackPanelDecoration();
}
}
}
}
}
}
if (FrontPanelType == "Discrete" && ShowFPanel)
{
translate(FPanelTranslate) {
rotate(FPanelRotate){
Panel(){
FrontPanelCutouts();
FrontPanelDecoration();
}
}
}
}
if (BackPanelType == "Discrete" && ShowBPanel)
{
translate(BPanelTranslate) {
rotate(BPanelRotate){
Panel(){
BackPanelCutouts();
BackPanelDecoration();
}
}
}
}
}

Binary file not shown.

2
hardware/schematics/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
**/gerber_output
**/Glycol_Chiller-backups

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,91 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector:Screw_Terminal_01x02
#
DEF Connector:Screw_Terminal_01x02 J 0 40 Y N 1 F N
F0 "J" 0 100 50 H V C CNN
F1 "Connector:Screw_Terminal_01x02" 0 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
TerminalBlock*:*
$ENDFPLIST
DRAW
C 0 -100 25 1 1 6 N
C 0 0 25 1 1 6 N
S -50 50 50 -150 1 1 10 f
P 2 1 1 6 -21 -87 13 -120 N
P 2 1 1 6 -21 13 13 -20 N
P 2 1 1 6 -14 -80 20 -113 N
P 2 1 1 6 -14 20 20 -13 N
X Pin_1 1 -200 0 150 R 50 50 1 1 P
X Pin_2 2 -200 -100 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Relay:SANYOU_SRD_Form_C
#
DEF Relay:SANYOU_SRD_Form_C K 0 40 Y Y 1 F N
F0 "K" 450 150 50 H V L CNN
F1 "Relay:SANYOU_SRD_Form_C" 450 50 50 H V L CNN
F2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" 450 -50 50 H I L CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Relay*SPDT*SANYOU*SRD*Series*Form*C*
$ENDFPLIST
DRAW
S -400 200 400 -200 0 1 10 f
S -325 75 -75 -75 0 1 10 N
P 2 0 0 0 100 150 100 200 N
P 2 0 0 0 300 150 300 200 N
P 4 0 0 0 300 150 300 100 275 125 300 150 N
P 2 0 1 10 -300 -75 -100 75 N
P 2 0 1 0 -200 -200 -200 -75 N
P 2 0 1 0 -200 200 -200 75 N
P 2 0 1 10 -75 0 -50 0 N
P 2 0 1 10 -25 0 0 0 N
P 2 0 1 10 25 0 50 0 N
P 2 0 1 10 25 0 50 0 N
P 2 0 1 10 75 0 100 0 N
P 2 0 1 10 125 0 150 0 N
P 2 0 1 20 200 -100 125 150 N
P 2 0 1 0 200 -100 200 -200 N
P 3 0 1 0 100 100 125 125 100 150 F
X ~ 1 200 -300 100 U 50 50 1 1 P
X ~ 2 -200 -300 100 U 50 50 1 1 P
X ~ 3 100 300 100 D 50 50 1 1 P
X ~ 4 300 300 100 D 50 50 1 1 P
X ~ 5 -200 300 100 D 50 50 1 1 P
ENDDRAW
ENDDEF
#
# wemos_mini:WeMos_mini
#
DEF wemos_mini:WeMos_mini U 0 40 Y Y 1 F N
F0 "U" 0 500 60 H V C CNN
F1 "wemos_mini:WeMos_mini" 0 -500 60 H V C CNN
F2 "" 550 -700 60 H V C CNN
F3 "" 550 -700 60 H V C CNN
DRAW
S -300 450 300 -550 0 1 0 N
X 5V 1 -500 350 200 R 50 50 1 1 W
X A0 10 500 -250 200 L 50 50 1 1 B
X D0 11 500 -150 200 L 50 50 1 1 B
X D5 12 500 -50 200 L 50 50 1 1 B
X D6 13 500 50 200 L 50 50 1 1 B
X D7 14 500 150 200 L 50 50 1 1 B
X D8 15 500 250 200 L 50 50 1 1 B
X 3.3V 16 500 350 200 L 50 50 1 1 w
X GND 2 -500 250 200 R 50 50 1 1 W
X D4 3 -500 150 200 R 50 50 1 1 B
X D3 4 -500 50 200 R 50 50 1 1 B
X D2 5 -500 -50 200 R 50 50 1 1 B
X D1 6 -500 -150 200 R 50 50 1 1 B
X Rx 7 -500 -250 200 R 50 50 1 1 B
X Tx 8 -500 -350 200 R 50 50 1 1 B
X Rst 9 500 -350 200 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,3 @@
EESchema-DOCLIB Version 2.0
#
#End Doc Library

View File

@ -0,0 +1,68 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# SANYOU_SRD_Form_C-Relay
#
DEF SANYOU_SRD_Form_C-Relay K 0 40 Y Y 1 F N
F0 "K" 450 150 50 H V L CNN
F1 "SANYOU_SRD_Form_C-Relay" 450 50 50 H V L CNN
F2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" 450 -50 50 H I L CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Relay*SPDT*SANYOU*SRD*Series*Form*C*
$ENDFPLIST
DRAW
P 2 0 0 0 100 150 100 200 N
P 2 0 0 0 300 150 300 200 N
P 4 0 0 0 300 150 300 100 275 125 300 150 N
S -400 200 400 -200 0 1 10 f
S -325 75 -75 -75 0 1 10 N
P 2 0 1 10 -300 -75 -100 75 N
P 2 0 1 0 -200 -200 -200 -75 N
P 2 0 1 0 -200 200 -200 75 N
P 2 0 1 10 -75 0 -50 0 N
P 2 0 1 10 -25 0 0 0 N
P 2 0 1 10 25 0 50 0 N
P 2 0 1 10 25 0 50 0 N
P 2 0 1 10 75 0 100 0 N
P 2 0 1 10 125 0 150 0 N
P 2 0 1 20 200 -100 125 150 N
P 2 0 1 0 200 -100 200 -200 N
P 3 0 1 0 100 100 125 125 100 150 F
X ~ 1 200 -300 100 U 50 50 1 1 P
X ~ 2 -200 -300 100 U 50 50 1 1 P
X ~ 3 100 300 100 D 50 50 1 1 P
X ~ 4 300 300 100 D 50 50 1 1 P
X ~ 5 -200 300 100 D 50 50 1 1 P
ENDDRAW
ENDDEF
#
# WeMos_mini-wemos_mini
#
DEF WeMos_mini-wemos_mini U 0 40 Y Y 1 F N
F0 "U" 0 500 60 H V C CNN
F1 "WeMos_mini-wemos_mini" 0 -500 60 H V C CNN
F2 "" 550 -700 60 H V C CNN
F3 "" 550 -700 60 H V C CNN
DRAW
S -300 450 300 -550 0 1 0 N
X 5V 1 -500 350 200 R 50 50 1 1 W
X A0 10 500 -250 200 L 50 50 1 1 B
X D0 11 500 -150 200 L 50 50 1 1 B
X D5 12 500 -50 200 L 50 50 1 1 B
X D6 13 500 50 200 L 50 50 1 1 B
X D7 14 500 150 200 L 50 50 1 1 B
X D8 15 500 250 200 L 50 50 1 1 B
X 3.3V 16 500 350 200 L 50 50 1 1 w
X GND 2 -500 250 200 R 50 50 1 1 W
X D4 3 -500 150 200 R 50 50 1 1 B
X D3 4 -500 50 200 R 50 50 1 1 B
X D2 5 -500 -50 200 R 50 50 1 1 B
X D1 6 -500 -150 200 R 50 50 1 1 B
X Rx 7 -500 -250 200 R 50 50 1 1 B
X Tx 8 -500 -350 200 R 50 50 1 1 B
X Rst 9 500 -350 200 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,165 @@
EESchema Schematic File Version 4
LIBS:Glycol_Chiller-cache
EELAYER 26 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L wemos_mini:WeMos_mini U1
U 1 1 63D7C335
P 5250 2750
F 0 "U1" H 5250 2750 60 0000 C CNN
F 1 "WeMos_mini" H 5250 3387 60 0001 C CNN
F 2 "Wemos D1 Mini:D1_mini_board" H 5250 2250 60 0000 C CNN
F 3 "http://www.wemos.cc/Products/d1_mini.html" H 5250 3281 60 0001 C CNN
1 5250 2750
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K3
U 1 1 63D7C745
P 7750 1850
F 0 "K3" H 8180 1896 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 1805 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 1800 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 1850 50 0001 C CNN
1 7750 1850
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K4
U 1 1 63D7C85B
P 7750 2650
F 0 "K4" H 8180 2696 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 2605 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 2600 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 2650 50 0001 C CNN
1 7750 2650
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K5
U 1 1 63D7C8F1
P 7750 3450
F 0 "K5" H 8180 3496 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 3405 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 3400 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 3450 50 0001 C CNN
1 7750 3450
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K6
U 1 1 63D7C91B
P 7750 4250
F 0 "K6" H 8180 4296 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 4205 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 4200 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 4250 50 0001 C CNN
1 7750 4250
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K2
U 1 1 63D7CA49
P 2000 7250
F 0 "K2" V 1433 7250 50 0000 C CNN
F 1 "SANYOU_SRD_Form_C" V 1524 7250 50 0000 C CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 2450 7200 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 2000 7250 50 0001 C CNN
1 2000 7250
0 1 1 0
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K1
U 1 1 63D7CA77
P 2000 6300
F 0 "K1" V 1433 6300 50 0000 C CNN
F 1 "SANYOU_SRD_Form_C" V 1524 6300 50 0000 C CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 2450 6250 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 2000 6300 50 0001 C CNN
1 2000 6300
0 1 1 0
$EndComp
Text GLabel 4500 2500 0 50 Input ~ 0
Gnd
Text GLabel 2650 6100 2 50 Input ~ 0
Compressor_Signal
Text GLabel 2650 7050 2 50 Input ~ 0
Compressor_Signal
Wire Wire Line
2300 7050 2650 7050
Wire Wire Line
2300 6100 2650 6100
Text GLabel 1150 6100 0 50 Input ~ 0
Gnd
Text GLabel 1150 7050 0 50 Input ~ 0
Gnd
Wire Wire Line
1150 6100 1700 6100
Wire Wire Line
1150 7050 1700 7050
Text GLabel 1200 6500 0 50 Input ~ 0
120VAC
Text GLabel 1200 7450 0 50 Input ~ 0
120VAC
Wire Wire Line
1200 7450 1700 7450
Wire Wire Line
1200 6500 1700 6500
Text GLabel 4150 6650 3 50 Input ~ 0
Compressor_Power
Text GLabel 4500 2700 0 50 Input ~ 0
Compressor_Signal
Wire Wire Line
4500 2700 4750 2700
Text GLabel 4500 2400 0 50 Input ~ 0
5VDC
Wire Wire Line
4500 2400 4750 2400
Wire Wire Line
4750 2500 4500 2500
Text GLabel 4500 2800 0 50 Input ~ 0
OWC_BUS
Wire Wire Line
4750 2800 4500 2800
$Comp
L Connector:Screw_Terminal_01x02 J1
U 1 1 63D7F975
P 4600 6500
F 0 "J1" H 4680 6492 50 0000 L CNN
F 1 "Screw_Terminal_01x02" H 4680 6401 50 0000 L CNN
F 2 "" H 4600 6500 50 0001 C CNN
F 3 "~" H 4600 6500 50 0001 C CNN
1 4600 6500
1 0 0 -1
$EndComp
Wire Wire Line
3700 7550 3700 6600
Wire Wire Line
2300 7550 3700 7550
Wire Wire Line
2300 6600 3700 6600
Connection ~ 3700 6600
Wire Wire Line
4150 6650 4150 6600
Wire Wire Line
3700 6600 4150 6600
Connection ~ 4150 6600
Wire Wire Line
4150 6600 4400 6600
Text GLabel 4150 6500 0 50 Input ~ 0
120VAC
Wire Wire Line
4150 6500 4400 6500
$EndSCHEMATC

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,814 @@
(kicad_pcb (version 20171130) (host pcbnew "(5.0.0)")
(general
(thickness 1.6)
(drawings 0)
(tracks 21)
(zones 0)
(modules 8)
(nets 41)
)
(page A4)
(layers
(0 F.Cu signal)
(31 B.Cu signal)
(32 B.Adhes user)
(33 F.Adhes user)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
(45 Margin user)
(46 B.CrtYd user)
(47 F.CrtYd user)
(48 B.Fab user)
(49 F.Fab user)
)
(setup
(last_trace_width 1)
(trace_clearance 0.2)
(zone_clearance 0.508)
(zone_45_only no)
(trace_min 0.2)
(segment_width 0.2)
(edge_width 0.15)
(via_size 0.8)
(via_drill 0.4)
(via_min_size 0.4)
(via_min_drill 0.3)
(uvia_size 0.3)
(uvia_drill 0.1)
(uvias_allowed no)
(uvia_min_size 0.2)
(uvia_min_drill 0.1)
(pcb_text_width 0.3)
(pcb_text_size 1.5 1.5)
(mod_edge_width 0.15)
(mod_text_size 1 1)
(mod_text_width 0.15)
(pad_size 1.524 1.524)
(pad_drill 0.762)
(pad_to_mask_clearance 0.2)
(aux_axis_origin 0 0)
(visible_elements 7FFFFFFF)
(pcbplotparams
(layerselection 0x010fc_ffffffff)
(usegerberextensions false)
(usegerberattributes false)
(usegerberadvancedattributes false)
(creategerberjobfile false)
(excludeedgelayer true)
(linewidth 0.100000)
(plotframeref false)
(viasonmask false)
(mode 1)
(useauxorigin false)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15.000000)
(psnegative false)
(psa4output false)
(plotreference true)
(plotvalue true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 1)
(scaleselection 1)
(outputdirectory ""))
)
(net 0 "")
(net 1 Gnd)
(net 2 "Net-(K1-Pad3)")
(net 3 Compressor_Power)
(net 4 Compressor_Signal)
(net 5 120VAC)
(net 6 "Net-(K2-Pad3)")
(net 7 "Net-(K3-Pad2)")
(net 8 "Net-(K3-Pad3)")
(net 9 "Net-(K3-Pad4)")
(net 10 "Net-(K3-Pad5)")
(net 11 "Net-(K3-Pad1)")
(net 12 "Net-(K4-Pad1)")
(net 13 "Net-(K4-Pad5)")
(net 14 "Net-(K4-Pad4)")
(net 15 "Net-(K4-Pad3)")
(net 16 "Net-(K4-Pad2)")
(net 17 "Net-(K5-Pad2)")
(net 18 "Net-(K5-Pad3)")
(net 19 "Net-(K5-Pad4)")
(net 20 "Net-(K5-Pad5)")
(net 21 "Net-(K5-Pad1)")
(net 22 "Net-(K6-Pad1)")
(net 23 "Net-(K6-Pad5)")
(net 24 "Net-(K6-Pad4)")
(net 25 "Net-(K6-Pad3)")
(net 26 "Net-(K6-Pad2)")
(net 27 "Net-(U1-Pad9)")
(net 28 "Net-(U1-Pad10)")
(net 29 "Net-(U1-Pad11)")
(net 30 "Net-(U1-Pad12)")
(net 31 "Net-(U1-Pad13)")
(net 32 "Net-(U1-Pad14)")
(net 33 "Net-(U1-Pad15)")
(net 34 "Net-(U1-Pad16)")
(net 35 5VDC)
(net 36 "Net-(U1-Pad3)")
(net 37 OWC_BUS)
(net 38 "Net-(U1-Pad6)")
(net 39 "Net-(U1-Pad7)")
(net 40 "Net-(U1-Pad8)")
(net_class Default "This is the default net class."
(clearance 0.2)
(trace_width 1)
(via_dia 0.8)
(via_drill 0.4)
(uvia_dia 0.3)
(uvia_drill 0.1)
(add_net 5VDC)
(add_net Compressor_Signal)
(add_net Gnd)
(add_net "Net-(K1-Pad3)")
(add_net "Net-(K2-Pad3)")
(add_net "Net-(K3-Pad1)")
(add_net "Net-(K3-Pad2)")
(add_net "Net-(K3-Pad3)")
(add_net "Net-(K3-Pad4)")
(add_net "Net-(K3-Pad5)")
(add_net "Net-(K4-Pad1)")
(add_net "Net-(K4-Pad2)")
(add_net "Net-(K4-Pad3)")
(add_net "Net-(K4-Pad4)")
(add_net "Net-(K4-Pad5)")
(add_net "Net-(K5-Pad1)")
(add_net "Net-(K5-Pad2)")
(add_net "Net-(K5-Pad3)")
(add_net "Net-(K5-Pad4)")
(add_net "Net-(K5-Pad5)")
(add_net "Net-(K6-Pad1)")
(add_net "Net-(K6-Pad2)")
(add_net "Net-(K6-Pad3)")
(add_net "Net-(K6-Pad4)")
(add_net "Net-(K6-Pad5)")
(add_net "Net-(U1-Pad10)")
(add_net "Net-(U1-Pad11)")
(add_net "Net-(U1-Pad12)")
(add_net "Net-(U1-Pad13)")
(add_net "Net-(U1-Pad14)")
(add_net "Net-(U1-Pad15)")
(add_net "Net-(U1-Pad16)")
(add_net "Net-(U1-Pad3)")
(add_net "Net-(U1-Pad6)")
(add_net "Net-(U1-Pad7)")
(add_net "Net-(U1-Pad8)")
(add_net "Net-(U1-Pad9)")
(add_net OWC_BUS)
)
(net_class Power ""
(clearance 1.5)
(trace_width 3.75)
(via_dia 2.5)
(via_drill 1)
(uvia_dia 0.3)
(uvia_drill 0.1)
(add_net 120VAC)
(add_net Compressor_Power)
)
(module TerminalBlock:TerminalBlock_Altech_AK300-2_P5.00mm (layer F.Cu) (tedit 59FF0306) (tstamp 63F14904)
(at 43.18 86.36 180)
(descr "Altech AK300 terminal block, pitch 5.0mm, 45 degree angled, see http://www.mouser.com/ds/2/16/PCBMETRC-24178.pdf")
(tags "Altech AK300 terminal block pitch 5.0mm")
(path /63D7F975)
(fp_text reference J1 (at -1.92 -6.99 180) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Screw_Terminal_01x02 (at 2.78 7.75 180) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user %R (at 2.5 -2 180) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -2.65 -6.3) (end -2.65 6.3) (layer F.SilkS) (width 0.12))
(fp_line (start -2.65 6.3) (end 7.7 6.3) (layer F.SilkS) (width 0.12))
(fp_line (start 7.7 6.3) (end 7.7 5.35) (layer F.SilkS) (width 0.12))
(fp_line (start 7.7 5.35) (end 8.2 5.6) (layer F.SilkS) (width 0.12))
(fp_line (start 8.2 5.6) (end 8.2 3.7) (layer F.SilkS) (width 0.12))
(fp_line (start 8.2 3.7) (end 8.2 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 8.2 3.65) (end 7.7 3.9) (layer F.SilkS) (width 0.12))
(fp_line (start 7.7 3.9) (end 7.7 -1.5) (layer F.SilkS) (width 0.12))
(fp_line (start 7.7 -1.5) (end 8.2 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start 8.2 -1.2) (end 8.2 -6.3) (layer F.SilkS) (width 0.12))
(fp_line (start 8.2 -6.3) (end -2.65 -6.3) (layer F.SilkS) (width 0.12))
(fp_line (start -1.26 2.54) (end 1.28 2.54) (layer F.Fab) (width 0.1))
(fp_line (start 1.28 2.54) (end 1.28 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start -1.26 -0.25) (end 1.28 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start -1.26 2.54) (end -1.26 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 3.74 2.54) (end 6.28 2.54) (layer F.Fab) (width 0.1))
(fp_line (start 6.28 2.54) (end 6.28 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 3.74 -0.25) (end 6.28 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 3.74 2.54) (end 3.74 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -6.22) (end 7.61 -3.17) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -6.22) (end -2.58 -6.22) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -6.22) (end 8.11 -6.22) (layer F.Fab) (width 0.1))
(fp_line (start 8.11 -6.22) (end 8.11 -1.4) (layer F.Fab) (width 0.1))
(fp_line (start 8.11 -1.4) (end 7.61 -1.65) (layer F.Fab) (width 0.1))
(fp_line (start 8.11 5.46) (end 7.61 5.21) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 5.21) (end 7.61 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 8.11 3.81) (end 7.61 4.06) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 4.06) (end 7.61 5.21) (layer F.Fab) (width 0.1))
(fp_line (start 8.11 3.81) (end 8.11 5.46) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 6.22) (end 2.98 4.32) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 -0.25) (end 7.05 4.32) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 6.22) (end 7.05 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 6.22) (end 7.61 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 6.22) (end 2.04 4.32) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 6.22) (end 2.98 6.22) (layer F.Fab) (width 0.1))
(fp_line (start -2.02 -0.25) (end -2.02 4.32) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 6.22) (end -2.02 6.22) (layer F.Fab) (width 0.1))
(fp_line (start -2.02 6.22) (end 2.04 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 4.32) (end 7.05 4.32) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 4.32) (end 2.98 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 4.32) (end 7.05 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 4.32) (end -2.02 4.32) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 4.32) (end 2.04 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start -2.02 4.32) (end -2.02 6.22) (layer F.Fab) (width 0.1))
(fp_line (start 6.67 3.68) (end 6.67 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 6.67 3.68) (end 3.36 3.68) (layer F.Fab) (width 0.1))
(fp_line (start 3.36 3.68) (end 3.36 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 1.66 3.68) (end 1.66 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 1.66 3.68) (end -1.64 3.68) (layer F.Fab) (width 0.1))
(fp_line (start -1.64 3.68) (end -1.64 0.51) (layer F.Fab) (width 0.1))
(fp_line (start -1.64 0.51) (end -1.26 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 1.66 0.51) (end 1.28 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 3.36 0.51) (end 3.74 0.51) (layer F.Fab) (width 0.1))
(fp_line (start 6.67 0.51) (end 6.28 0.51) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 6.22) (end -2.58 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 -0.64) (end -2.58 -3.17) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -1.65) (end 7.61 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -0.64) (end 7.61 4.06) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 -3.17) (end 7.61 -3.17) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 -3.17) (end -2.58 -6.22) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -3.17) (end 7.61 -1.65) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 -3.43) (end 2.98 -5.97) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 -5.97) (end 7.05 -5.97) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 -5.97) (end 7.05 -3.43) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 -3.43) (end 2.98 -3.43) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 -3.43) (end 2.04 -5.97) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 -3.43) (end -2.02 -3.43) (layer F.Fab) (width 0.1))
(fp_line (start -2.02 -3.43) (end -2.02 -5.97) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 -5.97) (end -2.02 -5.97) (layer F.Fab) (width 0.1))
(fp_line (start 3.39 -4.45) (end 6.44 -5.08) (layer F.Fab) (width 0.1))
(fp_line (start 3.52 -4.32) (end 6.56 -4.95) (layer F.Fab) (width 0.1))
(fp_line (start -1.62 -4.45) (end 1.44 -5.08) (layer F.Fab) (width 0.1))
(fp_line (start -1.49 -4.32) (end 1.56 -4.95) (layer F.Fab) (width 0.1))
(fp_line (start -2.02 -0.25) (end -1.64 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 2.04 -0.25) (end 1.66 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 1.66 -0.25) (end -1.64 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start -2.58 -0.64) (end -1.64 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start -1.64 -0.64) (end 1.66 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start 1.66 -0.64) (end 3.36 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start 7.61 -0.64) (end 6.67 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start 6.67 -0.64) (end 3.36 -0.64) (layer F.Fab) (width 0.1))
(fp_line (start 7.05 -0.25) (end 6.67 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 2.98 -0.25) (end 3.36 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start 3.36 -0.25) (end 6.67 -0.25) (layer F.Fab) (width 0.1))
(fp_line (start -2.83 -6.47) (end 8.36 -6.47) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.83 -6.47) (end -2.83 6.47) (layer F.CrtYd) (width 0.05))
(fp_line (start 8.36 6.47) (end 8.36 -6.47) (layer F.CrtYd) (width 0.05))
(fp_line (start 8.36 6.47) (end -2.83 6.47) (layer F.CrtYd) (width 0.05))
(fp_arc (start 6.03 -4.59) (end 6.54 -5.05) (angle 90.5) (layer F.Fab) (width 0.1))
(fp_arc (start 5.07 -6.07) (end 6.53 -4.12) (angle 75.5) (layer F.Fab) (width 0.1))
(fp_arc (start 4.99 -3.71) (end 3.39 -5) (angle 100) (layer F.Fab) (width 0.1))
(fp_arc (start 3.87 -4.65) (end 3.58 -4.13) (angle 104.2) (layer F.Fab) (width 0.1))
(fp_arc (start 1.03 -4.59) (end 1.53 -5.05) (angle 90.5) (layer F.Fab) (width 0.1))
(fp_arc (start 0.06 -6.07) (end 1.53 -4.12) (angle 75.5) (layer F.Fab) (width 0.1))
(fp_arc (start -0.01 -3.71) (end -1.62 -5) (angle 100) (layer F.Fab) (width 0.1))
(fp_arc (start -1.13 -4.65) (end -1.42 -4.13) (angle 104.2) (layer F.Fab) (width 0.1))
(pad 1 thru_hole rect (at 0 0 180) (size 1.98 3.96) (drill 1.32) (layers *.Cu *.Mask)
(net 5 120VAC))
(pad 2 thru_hole oval (at 5 0 180) (size 1.98 3.96) (drill 1.32) (layers *.Cu *.Mask)
(net 3 Compressor_Power))
(model ${KISYS3DMOD}/TerminalBlock.3dshapes/TerminalBlock_Altech_AK300-2_P5.00mm.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module "Wemos D1 Mini:D1_mini_board" (layer F.Cu) (tedit 5766F65E) (tstamp 63E45819)
(at 102.87 104.14)
(path /63D7C335)
(fp_text reference U1 (at 1.27 18.81) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value WeMos_mini (at 1.27 -19.05) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 11.431517 13.476932) (end 10.814156 13.476932) (layer F.SilkS) (width 0.1))
(fp_line (start 11.431517 11.483738) (end 11.431517 13.476932) (layer F.SilkS) (width 0.1))
(fp_line (start 10.778878 11.483738) (end 11.431517 11.483738) (layer F.SilkS) (width 0.1))
(fp_line (start 10.796517 15.487765) (end 10.7436 9.402349) (layer F.SilkS) (width 0.1))
(fp_line (start 9.226656 15.487765) (end 10.796517 15.487765) (layer F.SilkS) (width 0.1))
(fp_line (start 8.697489 14.993876) (end 9.226656 15.487765) (layer F.SilkS) (width 0.1))
(fp_line (start 7.40985 14.993876) (end 8.697489 14.993876) (layer F.SilkS) (width 0.1))
(fp_line (start 7.40985 9.931515) (end 7.40985 14.993876) (layer F.SilkS) (width 0.1))
(fp_line (start 8.662211 9.931515) (end 7.40985 9.931515) (layer F.SilkS) (width 0.1))
(fp_line (start 9.191378 9.402349) (end 8.662211 9.931515) (layer F.SilkS) (width 0.1))
(fp_line (start 10.7436 9.402349) (end 9.191378 9.402349) (layer F.SilkS) (width 0.1))
(fp_line (start -3.17965 15.865188) (end -3.17965 10.051451) (layer F.SilkS) (width 0.1))
(fp_line (start 3.959931 15.865188) (end -3.17965 15.865188) (layer F.SilkS) (width 0.1))
(fp_line (start 3.959931 10.051451) (end 3.959931 15.865188) (layer F.SilkS) (width 0.1))
(fp_line (start -3.17965 10.051451) (end 3.959931 10.051451) (layer F.SilkS) (width 0.1))
(fp_line (start 10.83248 9.424181) (end 10.802686 16.232524) (layer F.SilkS) (width 0.1))
(fp_line (start 12.776026 8.463285) (end 10.83248 9.424181) (layer F.SilkS) (width 0.1))
(fp_line (start 12.751078 -14.091807) (end 12.776026 8.463285) (layer F.SilkS) (width 0.1))
(fp_line (start 12.635482 -14.984575) (end 12.751078 -14.091807) (layer F.SilkS) (width 0.1))
(fp_line (start 12.407122 -15.739613) (end 12.635482 -14.984575) (layer F.SilkS) (width 0.1))
(fp_line (start 12.079595 -16.37146) (end 12.407122 -15.739613) (layer F.SilkS) (width 0.1))
(fp_line (start 11.666503 -16.894658) (end 12.079595 -16.37146) (layer F.SilkS) (width 0.1))
(fp_line (start 11.181445 -17.323743) (end 11.666503 -16.894658) (layer F.SilkS) (width 0.1))
(fp_line (start 10.638018 -17.673258) (end 11.181445 -17.323743) (layer F.SilkS) (width 0.1))
(fp_line (start 10.049824 -17.957741) (end 10.638018 -17.673258) (layer F.SilkS) (width 0.1))
(fp_line (start 9.43046 -18.191734) (end 10.049824 -17.957741) (layer F.SilkS) (width 0.1))
(fp_line (start -9.607453 -18.162976) (end 9.43046 -18.191734) (layer F.SilkS) (width 0.1))
(fp_line (start -10.20525 -17.97731) (end -9.607453 -18.162976) (layer F.SilkS) (width 0.1))
(fp_line (start -10.74944 -17.730377) (end -10.20525 -17.97731) (layer F.SilkS) (width 0.1))
(fp_line (start -11.240512 -17.422741) (end -10.74944 -17.730377) (layer F.SilkS) (width 0.1))
(fp_line (start -11.678953 -17.054952) (end -11.240512 -17.422741) (layer F.SilkS) (width 0.1))
(fp_line (start -12.065253 -16.627577) (end -11.678953 -17.054952) (layer F.SilkS) (width 0.1))
(fp_line (start -12.399901 -16.141167) (end -12.065253 -16.627577) (layer F.SilkS) (width 0.1))
(fp_line (start -12.683384 -15.596286) (end -12.399901 -16.141167) (layer F.SilkS) (width 0.1))
(fp_line (start -12.916195 -14.993493) (end -12.683384 -15.596286) (layer F.SilkS) (width 0.1))
(fp_line (start -12.930193 16.176658) (end -12.916195 -14.993493) (layer F.SilkS) (width 0.1))
(fp_line (start -3.849397 16.202736) (end -12.930193 16.176658) (layer F.SilkS) (width 0.1))
(fp_line (start -3.851373 15.000483) (end -3.849397 16.202736) (layer F.SilkS) (width 0.1))
(fp_line (start 4.979849 14.993795) (end -3.851373 15.000483) (layer F.SilkS) (width 0.1))
(fp_line (start 5.00618 16.277228) (end 4.979849 14.993795) (layer F.SilkS) (width 0.1))
(fp_line (start 10.817472 16.277228) (end 5.00618 16.277228) (layer F.SilkS) (width 0.1))
(fp_line (start -8.89 -17.78) (end -8.89 5.08) (layer B.SilkS) (width 0.15))
(fp_line (start 8.89 -17.78) (end -8.89 -17.78) (layer B.SilkS) (width 0.15))
(fp_line (start 8.89 5.08) (end 8.89 -17.78) (layer B.SilkS) (width 0.15))
(fp_line (start -8.89 5.08) (end 8.89 5.08) (layer B.SilkS) (width 0.15))
(fp_line (start 6.35 3.81) (end -6.35 3.81) (layer B.SilkS) (width 0.15))
(fp_line (start 6.35 -10.16) (end 6.35 3.81) (layer B.SilkS) (width 0.15))
(fp_line (start -6.35 -10.16) (end 6.35 -10.16) (layer B.SilkS) (width 0.15))
(fp_line (start -6.35 3.81) (end -6.35 -10.16) (layer B.SilkS) (width 0.15))
(fp_text user WeMos (at 0 -15.24) (layer F.SilkS)
(effects (font (size 3 3) (thickness 0.15)))
)
(pad 9 thru_hole circle (at 11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 27 "Net-(U1-Pad9)"))
(pad 10 thru_hole circle (at 11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 28 "Net-(U1-Pad10)"))
(pad 11 thru_hole circle (at 11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 29 "Net-(U1-Pad11)"))
(pad 12 thru_hole circle (at 11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 30 "Net-(U1-Pad12)"))
(pad 13 thru_hole circle (at 11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 31 "Net-(U1-Pad13)"))
(pad 14 thru_hole circle (at 11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 32 "Net-(U1-Pad14)"))
(pad 15 thru_hole circle (at 11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 33 "Net-(U1-Pad15)"))
(pad 16 thru_hole circle (at 11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 34 "Net-(U1-Pad16)"))
(pad 1 thru_hole circle (at -11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 35 5VDC))
(pad 2 thru_hole circle (at -11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 Gnd))
(pad 3 thru_hole circle (at -11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 36 "Net-(U1-Pad3)"))
(pad 4 thru_hole circle (at -11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 4 Compressor_Signal))
(pad 5 thru_hole circle (at -11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 37 OWC_BUS))
(pad 6 thru_hole circle (at -11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 38 "Net-(U1-Pad6)"))
(pad 7 thru_hole circle (at -11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 39 "Net-(U1-Pad7)"))
(pad 8 thru_hole circle (at -11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 40 "Net-(U1-Pad8)"))
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E45189)
(at 201.93 88.5)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7C91B)
(fp_text reference K6 (at 8.1 9.2) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_text user %R (at 7.1 0.025) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user 1 (at 0 -2.3) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(pad 1 thru_hole circle (at 0 0 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 22 "Net-(K6-Pad1)"))
(pad 5 thru_hole circle (at 1.95 -5.95 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 23 "Net-(K6-Pad5)"))
(pad 4 thru_hole circle (at 14.2 -6 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 24 "Net-(K6-Pad4)"))
(pad 3 thru_hole circle (at 14.15 6.05 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 25 "Net-(K6-Pad3)"))
(pad 2 thru_hole circle (at 1.95 6.05 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 26 "Net-(K6-Pad2)"))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E45160)
(at 179.66 88.5)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7C8F1)
(fp_text reference K5 (at 8.1 9.2) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_text user 1 (at 0 -2.3) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user %R (at 7.1 0.025) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(pad 2 thru_hole circle (at 1.95 6.05 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 17 "Net-(K5-Pad2)"))
(pad 3 thru_hole circle (at 14.15 6.05 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 18 "Net-(K5-Pad3)"))
(pad 4 thru_hole circle (at 14.2 -6 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 19 "Net-(K5-Pad4)"))
(pad 5 thru_hole circle (at 1.95 -5.95 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 20 "Net-(K5-Pad5)"))
(pad 1 thru_hole circle (at 0 0 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 21 "Net-(K5-Pad1)"))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E45137)
(at 157.25 88.55)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7C85B)
(fp_text reference K4 (at 8.1 9.2) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_text user %R (at 7.1 0.025) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user 1 (at 0 -2.3) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(pad 1 thru_hole circle (at 0 0 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 12 "Net-(K4-Pad1)"))
(pad 5 thru_hole circle (at 1.95 -5.95 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 13 "Net-(K4-Pad5)"))
(pad 4 thru_hole circle (at 14.2 -6 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 14 "Net-(K4-Pad4)"))
(pad 3 thru_hole circle (at 14.15 6.05 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 15 "Net-(K4-Pad3)"))
(pad 2 thru_hole circle (at 1.95 6.05 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 16 "Net-(K4-Pad2)"))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E4510E)
(at 134.62 88.55)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7C745)
(fp_text reference K3 (at 8.1 9.2) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_text user 1 (at 0 -2.3) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user %R (at 7.1 0.025) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(pad 2 thru_hole circle (at 1.95 6.05 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 7 "Net-(K3-Pad2)"))
(pad 3 thru_hole circle (at 14.15 6.05 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 8 "Net-(K3-Pad3)"))
(pad 4 thru_hole circle (at 14.2 -6 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 9 "Net-(K3-Pad4)"))
(pad 5 thru_hole circle (at 1.95 -5.95 90) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 10 "Net-(K3-Pad5)"))
(pad 1 thru_hole circle (at 0 0 90) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 11 "Net-(K3-Pad1)"))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E450E5)
(at 43.48 142.42 90)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7CA49)
(fp_text reference K2 (at 8.1 9.2 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_text user %R (at 7.1 0.025 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user 1 (at 0 -2.3 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(pad 1 thru_hole circle (at 0 0 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 5 120VAC))
(pad 5 thru_hole circle (at 1.95 -5.95 180) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 4 Compressor_Signal))
(pad 4 thru_hole circle (at 14.2 -6 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 3 Compressor_Power))
(pad 3 thru_hole circle (at 14.15 6.05 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 6 "Net-(K2-Pad3)"))
(pad 2 thru_hole circle (at 1.95 6.05 180) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 1 Gnd))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(module Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C (layer F.Cu) (tedit 58FA3148) (tstamp 63E450BC)
(at 43.485001 118.11 90)
(descr "relay Sanyou SRD series Form C http://www.sanyourelay.ca/public/products/pdf/SRD.pdf")
(tags "relay Sanyu SRD form C")
(path /63D7CA77)
(fp_text reference K1 (at 8.1 9.2 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value SANYOU_SRD_Form_C (at 8 -9.6 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.4 1.2) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end -1.4 -1.2) (layer F.SilkS) (width 0.12))
(fp_line (start -1.4 -7.8) (end 18.4 -7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 -7.8) (end 18.4 7.8) (layer F.SilkS) (width 0.12))
(fp_line (start 18.4 7.8) (end -1.4 7.8) (layer F.SilkS) (width 0.12))
(fp_text user 1 (at 0 -2.3 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.3 -7.7) (end 18.3 -7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 -7.7) (end 18.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start 18.3 7.7) (end -1.3 7.7) (layer F.Fab) (width 0.12))
(fp_line (start -1.3 7.7) (end -1.3 -7.7) (layer F.Fab) (width 0.12))
(fp_text user %R (at 7.1 0.025 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 18.55 -7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end -1.55 -7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.55 -7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.55 7.95) (end 18.55 7.95) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.15 4.2) (end 14.15 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 14.15 -4.2) (end 14.15 -1.7) (layer F.SilkS) (width 0.12))
(fp_line (start 3.55 6.05) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 1.85 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 3.55 -5.95) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 10.95 0.05) (layer F.SilkS) (width 0.12))
(fp_line (start 10.95 0.05) (end 15.55 -2.45) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 3.65) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 9.45 0.05) (end 9.45 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 2.65 0.05) (end 2.65 3.65) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 -5.95) (end 6.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 6.05 1.85) (end 6.05 6.05) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 1.85) (end 4.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 4.05 -1.75) (end 8.05 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 -1.75) (end 8.05 1.85) (layer F.SilkS) (width 0.12))
(fp_line (start 8.05 1.85) (end 4.05 1.85) (layer F.SilkS) (width 0.12))
(pad 2 thru_hole circle (at 1.95 6.05 180) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 1 Gnd))
(pad 3 thru_hole circle (at 14.15 6.05 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 2 "Net-(K1-Pad3)"))
(pad 4 thru_hole circle (at 14.2 -6 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 3 Compressor_Power))
(pad 5 thru_hole circle (at 1.95 -5.95 180) (size 2.5 2.5) (drill 1) (layers *.Cu *.Mask)
(net 4 Compressor_Signal))
(pad 1 thru_hole circle (at 0 0 180) (size 3 3) (drill 1.3) (layers *.Cu *.Mask)
(net 5 120VAC))
(model ${KISYS3DMOD}/Relay_THT.3dshapes/Relay_SPDT_SANYOU_SRD_Series_Form_C.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
(segment (start 56.475001 109.22) (end 49.535001 116.16) (width 1) (layer F.Cu) (net 1))
(segment (start 91.44 109.22) (end 56.475001 109.22) (width 1) (layer F.Cu) (net 1))
(segment (start 38.18 103.215001) (end 37.485001 103.91) (width 3.75) (layer F.Cu) (net 3))
(segment (start 38.18 86.36) (end 38.18 103.215001) (width 3.75) (layer F.Cu) (net 3))
(segment (start 35.980001 126.720001) (end 37.48 128.22) (width 3.75) (layer F.Cu) (net 3))
(segment (start 32.91 123.65) (end 35.980001 126.720001) (width 3.75) (layer F.Cu) (net 3))
(segment (start 32.91 108.485001) (end 32.91 123.65) (width 3.75) (layer F.Cu) (net 3))
(segment (start 37.485001 103.91) (end 32.91 108.485001) (width 3.75) (layer F.Cu) (net 3))
(segment (start 36.280001 139.220001) (end 37.53 140.47) (width 1) (layer B.Cu) (net 4))
(segment (start 33.979999 136.919999) (end 36.280001 139.220001) (width 1) (layer B.Cu) (net 4))
(segment (start 37.535001 117.927766) (end 33.979999 121.482768) (width 1) (layer B.Cu) (net 4))
(segment (start 33.979999 121.482768) (end 33.979999 136.919999) (width 1) (layer B.Cu) (net 4))
(segment (start 37.535001 116.16) (end 37.535001 117.927766) (width 1) (layer B.Cu) (net 4))
(segment (start 37.535001 116.16) (end 44.475001 109.22) (width 1) (layer B.Cu) (net 4))
(segment (start 44.475001 109.22) (end 81.28 109.22) (width 1) (layer B.Cu) (net 4))
(segment (start 86.36 104.14) (end 91.44 104.14) (width 1) (layer B.Cu) (net 4))
(segment (start 81.28 109.22) (end 86.36 104.14) (width 1) (layer B.Cu) (net 4))
(segment (start 43.18 117.804999) (end 43.485001 118.11) (width 3.75) (layer F.Cu) (net 5))
(segment (start 43.18 86.36) (end 43.18 117.804999) (width 3.75) (layer F.Cu) (net 5))
(segment (start 43.485001 142.414999) (end 43.48 142.42) (width 3.75) (layer F.Cu) (net 5))
(segment (start 43.485001 118.11) (end 43.485001 142.414999) (width 3.75) (layer F.Cu) (net 5))
)

View File

@ -0,0 +1,76 @@
{
"board": {
"active_layer": 37,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.33000001311302185
},
"ratsnest_display_mode": 0,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": true,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
37
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "Glycol_Chiller.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -0,0 +1,458 @@
{
"board": {
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.09999999999999999,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
},
"silk_line_width": 0.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"45_degree_only": false,
"min_clearance": 0.508
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"copper_edge_clearance": "error",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint_type_mismatch": "error",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "error",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zone_has_empty_net": "error",
"zones_intersect": "error"
},
"rules": {
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.005,
"min_clearance": 0.0,
"min_copper_edge_clearance": 0.01,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_silk_clearance": 0.0,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.049999999999999996,
"min_via_diameter": 0.39999999999999997,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"use_height_for_length_calcs": true
},
"track_widths": [
0.0
],
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false,
"zones_use_no_outline": true
},
"layer_presets": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_label_syntax": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "error",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "Glycol_Chiller.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12.0,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.5,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6.0
},
{
"bus_width": 12.0,
"clearance": 1.0,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Power",
"nets": [
"/LINE",
"/NUETRAL"
],
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 2.0,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6.0
}
],
"meta": {
"version": 2
},
"net_colors": null
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.25,
"pin_symbol_size": 0.0,
"text_offset_ratio": 0.08
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"ngspice": {
"fix_include_paths": true,
"fix_passive_vals": false,
"meta": {
"version": 0
},
"model_mode": 0,
"workbook_filename": ""
},
"page_layout_descr_file": "",
"plot_directory": "",
"spice_adjust_passive_values": false,
"spice_external_command": "spice \"%I\"",
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"7a2f98dd-63ad-41e8-946c-d415e43901ee",
""
],
[
"0df96096-2732-4099-a5fe-a9bcfde86345",
"AC Control"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,165 @@
EESchema Schematic File Version 4
LIBS:Glycol_Chiller-cache
EELAYER 26 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L wemos_mini:WeMos_mini U1
U 1 1 63D7C335
P 5250 2750
F 0 "U1" H 5250 2750 60 0000 C CNN
F 1 "WeMos_mini" H 5250 3387 60 0001 C CNN
F 2 "Wemos D1 Mini:D1_mini_board" H 5250 2250 60 0000 C CNN
F 3 "http://www.wemos.cc/Products/d1_mini.html" H 5250 3281 60 0001 C CNN
1 5250 2750
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K3
U 1 1 63D7C745
P 7750 1850
F 0 "K3" H 8180 1896 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 1805 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 1800 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 1850 50 0001 C CNN
1 7750 1850
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K4
U 1 1 63D7C85B
P 7750 2650
F 0 "K4" H 8180 2696 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 2605 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 2600 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 2650 50 0001 C CNN
1 7750 2650
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K5
U 1 1 63D7C8F1
P 7750 3450
F 0 "K5" H 8180 3496 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 3405 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 3400 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 3450 50 0001 C CNN
1 7750 3450
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K6
U 1 1 63D7C91B
P 7750 4250
F 0 "K6" H 8180 4296 50 0000 L CNN
F 1 "SANYOU_SRD_Form_C" H 8180 4205 50 0000 L CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 8200 4200 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 7750 4250 50 0001 C CNN
1 7750 4250
1 0 0 -1
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K2
U 1 1 63D7CA49
P 2000 7250
F 0 "K2" V 1433 7250 50 0000 C CNN
F 1 "SANYOU_SRD_Form_C" V 1524 7250 50 0000 C CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 2450 7200 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 2000 7250 50 0001 C CNN
1 2000 7250
0 1 1 0
$EndComp
$Comp
L Relay:SANYOU_SRD_Form_C K1
U 1 1 63D7CA77
P 2000 6300
F 0 "K1" V 1433 6300 50 0000 C CNN
F 1 "SANYOU_SRD_Form_C" V 1524 6300 50 0000 C CNN
F 2 "Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C" H 2450 6250 50 0001 L CNN
F 3 "http://www.sanyourelay.ca/public/products/pdf/SRD.pdf" H 2000 6300 50 0001 C CNN
1 2000 6300
0 1 1 0
$EndComp
Text GLabel 4500 2500 0 50 Input ~ 0
Gnd
Text GLabel 2650 6100 2 50 Input ~ 0
Compressor_Signal
Text GLabel 2650 7050 2 50 Input ~ 0
Compressor_Signal
Wire Wire Line
2300 7050 2650 7050
Wire Wire Line
2300 6100 2650 6100
Text GLabel 1150 6100 0 50 Input ~ 0
Gnd
Text GLabel 1150 7050 0 50 Input ~ 0
Gnd
Wire Wire Line
1150 6100 1700 6100
Wire Wire Line
1150 7050 1700 7050
Text GLabel 1200 6500 0 50 Input ~ 0
120VAC
Text GLabel 1200 7450 0 50 Input ~ 0
120VAC
Wire Wire Line
1200 7450 1700 7450
Wire Wire Line
1200 6500 1700 6500
Text GLabel 4150 6650 3 50 Input ~ 0
Compressor_Power
Text GLabel 4500 2700 0 50 Input ~ 0
Compressor_Signal
Wire Wire Line
4500 2700 4750 2700
Text GLabel 4500 2400 0 50 Input ~ 0
5VDC
Wire Wire Line
4500 2400 4750 2400
Wire Wire Line
4750 2500 4500 2500
Text GLabel 4500 2800 0 50 Input ~ 0
OWC_BUS
Wire Wire Line
4750 2800 4500 2800
$Comp
L Connector:Screw_Terminal_01x02 J1
U 1 1 63D7F975
P 4600 6500
F 0 "J1" H 4680 6492 50 0000 L CNN
F 1 "Screw_Terminal_01x02" H 4680 6401 50 0000 L CNN
F 2 "TerminalBlock:TerminalBlock_Altech_AK300-2_P5.00mm" H 4600 6500 50 0001 C CNN
F 3 "~" H 4600 6500 50 0001 C CNN
1 4600 6500
1 0 0 -1
$EndComp
Wire Wire Line
3700 7550 3700 6600
Wire Wire Line
2300 7550 3700 7550
Wire Wire Line
2300 6600 3700 6600
Connection ~ 3700 6600
Wire Wire Line
4150 6650 4150 6600
Wire Wire Line
3700 6600 4150 6600
Connection ~ 4150 6600
Wire Wire Line
4150 6600 4400 6600
Text GLabel 4150 6500 0 50 Input ~ 0
120VAC
Wire Wire Line
4150 6500 4400 6500
$EndSCHEMATC

View File

@ -0,0 +1,35 @@
(footprint "Acxico 5V 700mA Board Module Mini AC-DC 120V to 5V Power Supply" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 0)
(attr through_hole)
(fp_text reference "REF**" (at 0 11.938 unlocked) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 38861700-7529-47d4-b426-b1dee2c9ebe5)
)
(fp_text value "Acxico 5V 700mA Board Module Mini AC-DC 120V to 5V Power Supply" (at 0 13.438 unlocked) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 44f639b4-d508-4281-9048-c52d30b233d5)
)
(fp_text user "${REFERENCE}" (at 0 14.938 unlocked) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 10964ff5-8afd-41cc-b7aa-5c581d674b41)
)
(fp_line (start 15.9 0) (end 15.9 -3.047) (layer "F.SilkS") (width 0.12) (tstamp 16f7e83c-e54b-4d43-9917-8ed2dc95d40d))
(fp_line (start 0.635 -3.047) (end 1.413 -3.047) (layer "F.SilkS") (width 0.12) (tstamp 1d86e1cc-df91-4fda-98ae-4e5fdcaaf065))
(fp_line (start 19.202 0) (end 15.9 0) (layer "F.SilkS") (width 0.12) (tstamp 305a32f2-3952-4278-a77f-b4e0615d131f))
(fp_line (start 19.202 -3.047) (end 20.828 -3.047) (layer "F.SilkS") (width 0.12) (tstamp 33f49b6e-7e16-46f6-a314-11819d85c7fb))
(fp_line (start 24.13 0) (end 20.828 0) (layer "F.SilkS") (width 0.12) (tstamp 436481c6-ad69-4ef0-86ba-282e54335adc))
(fp_line (start 20.828 0) (end 20.828 -3.047) (layer "F.SilkS") (width 0.12) (tstamp 4aa0210c-fc99-4639-bb8d-cbffb061f9fa))
(fp_line (start 15.9 -3.047) (end 5.9 -3.047) (layer "F.SilkS") (width 0.12) (tstamp 82577de7-f334-4684-bbb1-73f7651b2f9e))
(fp_line (start 1.413 -3.047) (end 1.413 0) (layer "F.SilkS") (width 0.12) (tstamp 961dc662-6ec1-4f5b-bbe2-59456de2cc3b))
(fp_line (start 24.13 -18.155) (end 24.13 0) (layer "F.SilkS") (width 0.12) (tstamp b3d22395-7007-4fcc-8f87-330c9acc689f))
(fp_line (start 0.635 -18.155) (end 24.132 -18.155) (layer "F.SilkS") (width 0.12) (tstamp b47f4a63-5c75-4720-917d-132ffb4dc618))
(fp_line (start 5.9 0) (end 1.413 0) (layer "F.SilkS") (width 0.12) (tstamp cfa19c9d-36bc-4ae2-9af0-50e48e27ad39))
(fp_line (start 19.202 0) (end 19.202 -3.047) (layer "F.SilkS") (width 0.12) (tstamp e5071404-3930-4559-bc06-4d131dde631c))
(fp_line (start 0.635 -3.047) (end 0.635 -18.155) (layer "F.SilkS") (width 0.12) (tstamp e608f201-92bb-49a2-a16f-f8b87b00c3ca))
(fp_line (start 5.9 -3.047) (end 5.9 0) (layer "F.SilkS") (width 0.12) (tstamp fbe6ae91-7106-4046-bd23-b4a8eb9c3051))
(pad "1" thru_hole circle (at 22.5 -1.6) (size 2 2) (drill 1) (layers *.Cu *.Mask) (tstamp fa50a924-4a0b-4094-bfe6-a751f6b55f33))
(pad "2" thru_hole circle (at 17.5 -1.6) (size 2 2) (drill 1) (layers *.Cu *.Mask) (tstamp aafdeac8-f89d-4d16-bfdf-a35ccffffdee))
(pad "3" thru_hole circle (at 4.9 -1.6) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask) (tstamp f27001b3-3c53-4019-836c-0b530d091ae3))
(pad "4" thru_hole circle (at 2.4 -1.6) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask) (tstamp 343c39d3-5cb0-4af3-8988-ff7c7db131de))
)

View File

@ -0,0 +1,76 @@
(module D1_mini_board (layer F.Cu) (tedit 5766F65E)
(fp_text reference REF** (at 1.27 18.81) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value D1_mini_board (at 1.27 -19.05) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 11.431517 13.476932) (end 10.814156 13.476932) (layer F.SilkS) (width 0.1))
(fp_line (start 11.431517 11.483738) (end 11.431517 13.476932) (layer F.SilkS) (width 0.1))
(fp_line (start 10.778878 11.483738) (end 11.431517 11.483738) (layer F.SilkS) (width 0.1))
(fp_line (start 10.796517 15.487765) (end 10.7436 9.402349) (layer F.SilkS) (width 0.1))
(fp_line (start 9.226656 15.487765) (end 10.796517 15.487765) (layer F.SilkS) (width 0.1))
(fp_line (start 8.697489 14.993876) (end 9.226656 15.487765) (layer F.SilkS) (width 0.1))
(fp_line (start 7.40985 14.993876) (end 8.697489 14.993876) (layer F.SilkS) (width 0.1))
(fp_line (start 7.40985 9.931515) (end 7.40985 14.993876) (layer F.SilkS) (width 0.1))
(fp_line (start 8.662211 9.931515) (end 7.40985 9.931515) (layer F.SilkS) (width 0.1))
(fp_line (start 9.191378 9.402349) (end 8.662211 9.931515) (layer F.SilkS) (width 0.1))
(fp_line (start 10.7436 9.402349) (end 9.191378 9.402349) (layer F.SilkS) (width 0.1))
(fp_line (start -3.17965 15.865188) (end -3.17965 10.051451) (layer F.SilkS) (width 0.1))
(fp_line (start 3.959931 15.865188) (end -3.17965 15.865188) (layer F.SilkS) (width 0.1))
(fp_line (start 3.959931 10.051451) (end 3.959931 15.865188) (layer F.SilkS) (width 0.1))
(fp_line (start -3.17965 10.051451) (end 3.959931 10.051451) (layer F.SilkS) (width 0.1))
(fp_line (start 10.83248 9.424181) (end 10.802686 16.232524) (layer F.SilkS) (width 0.1))
(fp_line (start 12.776026 8.463285) (end 10.83248 9.424181) (layer F.SilkS) (width 0.1))
(fp_line (start 12.751078 -14.091807) (end 12.776026 8.463285) (layer F.SilkS) (width 0.1))
(fp_line (start 12.635482 -14.984575) (end 12.751078 -14.091807) (layer F.SilkS) (width 0.1))
(fp_line (start 12.407122 -15.739613) (end 12.635482 -14.984575) (layer F.SilkS) (width 0.1))
(fp_line (start 12.079595 -16.37146) (end 12.407122 -15.739613) (layer F.SilkS) (width 0.1))
(fp_line (start 11.666503 -16.894658) (end 12.079595 -16.37146) (layer F.SilkS) (width 0.1))
(fp_line (start 11.181445 -17.323743) (end 11.666503 -16.894658) (layer F.SilkS) (width 0.1))
(fp_line (start 10.638018 -17.673258) (end 11.181445 -17.323743) (layer F.SilkS) (width 0.1))
(fp_line (start 10.049824 -17.957741) (end 10.638018 -17.673258) (layer F.SilkS) (width 0.1))
(fp_line (start 9.43046 -18.191734) (end 10.049824 -17.957741) (layer F.SilkS) (width 0.1))
(fp_line (start -9.607453 -18.162976) (end 9.43046 -18.191734) (layer F.SilkS) (width 0.1))
(fp_line (start -10.20525 -17.97731) (end -9.607453 -18.162976) (layer F.SilkS) (width 0.1))
(fp_line (start -10.74944 -17.730377) (end -10.20525 -17.97731) (layer F.SilkS) (width 0.1))
(fp_line (start -11.240512 -17.422741) (end -10.74944 -17.730377) (layer F.SilkS) (width 0.1))
(fp_line (start -11.678953 -17.054952) (end -11.240512 -17.422741) (layer F.SilkS) (width 0.1))
(fp_line (start -12.065253 -16.627577) (end -11.678953 -17.054952) (layer F.SilkS) (width 0.1))
(fp_line (start -12.399901 -16.141167) (end -12.065253 -16.627577) (layer F.SilkS) (width 0.1))
(fp_line (start -12.683384 -15.596286) (end -12.399901 -16.141167) (layer F.SilkS) (width 0.1))
(fp_line (start -12.916195 -14.993493) (end -12.683384 -15.596286) (layer F.SilkS) (width 0.1))
(fp_line (start -12.930193 16.176658) (end -12.916195 -14.993493) (layer F.SilkS) (width 0.1))
(fp_line (start -3.849397 16.202736) (end -12.930193 16.176658) (layer F.SilkS) (width 0.1))
(fp_line (start -3.851373 15.000483) (end -3.849397 16.202736) (layer F.SilkS) (width 0.1))
(fp_line (start 4.979849 14.993795) (end -3.851373 15.000483) (layer F.SilkS) (width 0.1))
(fp_line (start 5.00618 16.277228) (end 4.979849 14.993795) (layer F.SilkS) (width 0.1))
(fp_line (start 10.817472 16.277228) (end 5.00618 16.277228) (layer F.SilkS) (width 0.1))
(fp_line (start -8.89 -17.78) (end -8.89 5.08) (layer B.SilkS) (width 0.15))
(fp_line (start 8.89 -17.78) (end -8.89 -17.78) (layer B.SilkS) (width 0.15))
(fp_line (start 8.89 5.08) (end 8.89 -17.78) (layer B.SilkS) (width 0.15))
(fp_line (start -8.89 5.08) (end 8.89 5.08) (layer B.SilkS) (width 0.15))
(fp_line (start 6.35 3.81) (end -6.35 3.81) (layer B.SilkS) (width 0.15))
(fp_line (start 6.35 -10.16) (end 6.35 3.81) (layer B.SilkS) (width 0.15))
(fp_line (start -6.35 -10.16) (end 6.35 -10.16) (layer B.SilkS) (width 0.15))
(fp_line (start -6.35 3.81) (end -6.35 -10.16) (layer B.SilkS) (width 0.15))
(fp_text user WeMos (at 0 -15.24) (layer F.SilkS)
(effects (font (size 3 3) (thickness 0.15)))
)
(pad 9 thru_hole circle (at 11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 10 thru_hole circle (at 11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 11 thru_hole circle (at 11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 12 thru_hole circle (at 11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 13 thru_hole circle (at 11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 14 thru_hole circle (at 11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 15 thru_hole circle (at 11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 16 thru_hole circle (at 11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 1 thru_hole circle (at -11.43 7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 2 thru_hole circle (at -11.43 5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 3 thru_hole circle (at -11.43 2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 4 thru_hole circle (at -11.43 0) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 5 thru_hole circle (at -11.43 -2.54) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 6 thru_hole circle (at -11.43 -5.08) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 7 thru_hole circle (at -11.43 -7.62) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
(pad 8 thru_hole circle (at -11.43 -10.16) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask F.SilkS))
)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name "Power")(type "KiCad")(uri "${KIPRJMOD}/custom library/Power.pretty")(options "")(descr ""))
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,554 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
sodipodi:docname="PS_Outline.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="4.1524866"
inkscape:cx="308.9715"
inkscape:cy="400.48293"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><image
width="35.360771"
height="34.024723"
preserveAspectRatio="none"
style="image-rendering:optimizeQuality"
xlink:href="data:image/jpeg;base64,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
jyX/2Q==
"
id="image190"
x="64.271721"
y="86.698715" /><path
id="rect454"
style="fill:none;stroke:#000000;stroke-width:0.336533;stroke-opacity:1"
d="m 74.195501,92.660524 v 14.524296 h 0.97319 v 3.29417 h 4.71674 v -3.29417 h 10.387891 v 2.9667 h 3.107045 v -2.9667 h 1.300831 v 2.9667 h 3.397126 v -2.9667 -14.524296 z" /><g
id="g1912"
transform="translate(37.856841,-47.253979)"><circle
style="fill:none;stroke:#000000;stroke-width:0.142461;stroke-dasharray:none;stroke-opacity:1"
id="path1820"
cx="38.383472"
cy="156.20818"
r="0.42738172" /><circle
style="fill:none;stroke:#000000;stroke-width:0.142461;stroke-dasharray:none;stroke-opacity:1"
id="path1820-3"
cx="40.848434"
cy="156.18959"
r="0.42738172" /><path
style="fill:none;stroke:#000000;stroke-width:0.134498px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 38.348434,156.20818 h 2.5"
id="path1885" /></g><g
id="g1957"
transform="translate(0.00796461,-0.03982303)"><circle
style="fill:none;stroke:#000000;stroke-width:0.142461;stroke-dasharray:none;stroke-opacity:1"
id="path1820-0"
cx="91.81517"
cy="108.9449"
r="0.42738172" /><circle
style="fill:none;stroke:#000000;stroke-width:0.142461;stroke-dasharray:none;stroke-opacity:1"
id="path1820-3-7"
cx="96.280128"
cy="108.99871"
r="0.42738172" /><path
style="fill:none;stroke:#000000;stroke-width:0.180448px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 91.78013,108.99871 h 4.5"
id="path1885-0" /></g></g></svg>

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -0,0 +1,3 @@
(sym_lib_table
(lib (name "Glycol_Chiller-rescue")(type "Legacy")(uri "${KIPRJMOD}/Glycol_Chiller-rescue.lib")(options "")(descr ""))
)

View File

@ -1,583 +0,0 @@
#====================================================================================
# makeESPArduino
#
# A makefile for ESP8286 and ESP32 Arduino projects.
#
# License: LGPL 2.1
# General and full license information is available at:
# https://github.com/plerup/makeEspArduino
#
# Copyright (c) 2016-2021 Peter Lerup. All rights reserved.
#
#====================================================================================
START_TIME := $(shell date +%s)
__THIS_FILE := $(abspath $(lastword $(MAKEFILE_LIST)))
__TOOLS_DIR := $(dir $(__THIS_FILE))tools
OS ?= $(shell uname -s)
# Include possible operating system specfic settings
-include $(dir $(__THIS_FILE))/os/$(OS).mk
# Include possible global user settings
CONFIG_ROOT ?= $(if $(XDG_CONFIG_HOME),$(XDG_CONFIG_HOME),$(HOME)/.config)
-include $(CONFIG_ROOT)/makeEspArduino/config.mk
# Include possible project specific settings
-include $(firstword $(PROJ_CONF) $(dir $(SKETCH))config.mk)
# Build threads, default is using all the PC cpus
BUILD_THREADS ?= $(shell nproc)
MAKEFLAGS += -j $(BUILD_THREADS)
# Build verbosity, silent by default
ifndef VERBOSE
MAKEFLAGS += --silent
endif
# ESP chip family type
CHIP ?= esp8266
UC_CHIP := $(shell perl -e "print uc $(CHIP)")
IS_ESP32 := $(if $(filter-out esp32,$(CHIP)),,1)
# Serial flashing parameters
UPLOAD_PORT_MATCH ?= /dev/ttyU*
UPLOAD_PORT ?= $(shell ls -1tr $(UPLOAD_PORT_MATCH) 2>/dev/null | tail -1)
# Monitor definitions
MONITOR_SPEED ?= 115200
MONITOR_PORT ?= $(UPLOAD_PORT)
MONITOR_PAR ?= --rts=0 --dtr=0
MONITOR_COM ?= $(if $(NO_PY_WRAP),python3,$(PY_WRAP)) -m serial.tools.miniterm $(MONITOR_PAR) $(MONITOR_PORT) $(MONITOR_SPEED)
# OTA parameters
OTA_ADDR ?=
OTA_PORT ?= $(if $(IS_ESP32),3232,8266)
OTA_PWD ?=
OTA_ARGS = --progress --ip="$(OTA_ADDR)" --port="$(OTA_PORT)"
ifneq ($(OTA_PWD),)
OTA_ARGS += --auth="$(OTA_PWD)"
endif
# HTTP update parameters
HTTP_ADDR ?=
HTTP_URI ?= /update
HTTP_PWD ?= user
HTTP_USR ?= password
HTTP_OPT ?= --progress-bar -o /dev/null
# Output directory
BUILD_ROOT ?= $(lastword $(MAKEFILE_LIST))
BUILD_DIR ?= build
# File system and corresponding disk directories
FS_TYPE ?= spiffs
MK_FS_MATCH = mk$(shell perl -e "print lc $(FS_TYPE)")
FS_DIR ?= $(dir $(SKETCH))data
FS_RESTORE_DIR ?= $(BUILD_DIR)/file_system
# Utility functions
git_description = $(shell git -C $(1) describe --tags --always --dirty 2>/dev/null || echo Unknown)
time_string = $(shell date +$(1))
find_files = $(shell find $2 | awk '/.*\.($1)$$/')
# ESP Arduino directories
ifndef ESP_ROOT
# Location not defined, find and use possible version in the Arduino IDE installation
ARDUINO_ROOT ?= $(HOME)/.arduino15
ARDUINO_ESP_ROOT = $(ARDUINO_ROOT)/packages/$(CHIP)
ESP_ROOT := $(if $(ARDUINO_HW_ESP_ROOT),$(ARDUINO_HW_ESP_ROOT),$(lastword $(wildcard $(ARDUINO_ESP_ROOT)/hardware/$(CHIP)/*)))
ifeq ($(ESP_ROOT),)
$(error No installed version of $(CHIP) Arduino found)
endif
ARDUINO_LIBS ?= $(shell grep -o "sketchbook.path=.*" $(ARDUINO_ROOT)/preferences.txt 2>/dev/null | cut -f2- -d=)/libraries
ESP_ARDUINO_VERSION := $(notdir $(ESP_ROOT))
# Find used version of compiler and tools
COMP_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/xtensa-*/*))
MK_FS_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/$(MK_FS_MATCH)/*/$(MK_FS_MATCH)))
PYTHON3_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/python3/*))
else
# Location defined, assume that it is a git clone
ESP_ARDUINO_VERSION = $(call git_description,$(ESP_ROOT))
MK_FS_PATH := $(lastword $(wildcard $(ESP_ROOT)/tools/$(MK_FS_MATCH)/$(MK_FS_MATCH)))
PYTHON3_PATH := $(wildcard $(ESP_ROOT)/tools/python3)
endif
ESP_ROOT := $(abspath $(ESP_ROOT))
ESP_LIBS = $(ESP_ROOT)/libraries
SDK_ROOT = $(ESP_ROOT)/tools/sdk
TOOLS_ROOT = $(ESP_ROOT)/tools
# The esp8266 tools directory contains the python3 executable as well as some modules
# Use these to avoid additional python installation requirements here
PYTHON3_PATH := $(if $(PYTHON3_PATH),$(PYTHON3_PATH),$(dir $(shell which python3 2>/dev/null)))
PY_WRAP = $(PYTHON3_PATH)/python3 $(__TOOLS_DIR)/py_wrap.py $(TOOLS_ROOT)
NO_PY_WRAP ?= $(if $(IS_ESP32),1,)
# Validate the selected version of ESP Arduino
ifeq ($(wildcard $(ESP_ROOT)/cores/$(CHIP)),)
$(error $(ESP_ROOT) is not a vaild directory for $(CHIP))
endif
# Validate the file system type
ifeq ($(wildcard $(MK_FS_PATH)),)
$(error Invalid file system: "$(FS_TYPE)")
endif
# Set possible default board variant and validate
BOARD_OP = perl $(__TOOLS_DIR)/board_op.pl $(ESP_ROOT)/boards.txt "$(CPU)"
ifeq ($(BOARD),)
BOARD := $(if $(IS_ESP32),esp32,generic)
else ifeq ($(shell $(BOARD_OP) $(BOARD) check),)
$(error Invalid board: $(BOARD))
endif
# Handle esptool variants
ESPTOOL_EXT = $(if $(IS_ESP32),,.py)
ESPTOOL ?= $(if $(NO_PY_WRAP),$(ESP_ROOT)/tools/esptool/esptool$(ESPTOOL_EXT),$(PY_WRAP) esptool)
ESPTOOL_COM ?= $(ESPTOOL) --baud=$(UPLOAD_SPEED) --port $(UPLOAD_PORT) --chip $(CHIP)
ifeq ($(IS_ESP32),)
# esp8266, use esptool directly instead of via tools/upload.py in order to avoid speed restrictions currently implied there
UPLOAD_COM = $(ESPTOOL_COM) $(UPLOAD_RESET) write_flash 0x00000 $(BUILD_DIR)/$(MAIN_NAME).bin
FS_UPLOAD_COM = $(ESPTOOL_COM) $(UPLOAD_RESET) write_flash $(SPIFFS_START) $(FS_IMAGE)
endif
# Detect if the specified goal involves building or not
GOALS := $(if $(MAKECMDGOALS),$(MAKECMDGOALS),all)
BUILDING := $(if $(filter $(GOALS), monitor list_boards list_flash_defs list_lwip set_git_version install help tools_dir preproc info),,1)
# Sketch (main program) selection
ifeq ($(BUILDING),)
SKETCH = /dev/null
endif
ifdef DEMO
SKETCH := $(if $(IS_ESP32),$(ESP_LIBS)/WiFi/examples/WiFiScan/WiFiScan.ino,$(ESP_LIBS)/ESP8266WiFi/examples/WiFiScan/WiFiScan.ino)
endif
SKETCH ?= $(abspath $(wildcard *.ino *.pde))
ifeq ($(SKETCH),)
$(error No sketch specified or found. Use "DEMO=1" for testing)
endif
ifeq ($(wildcard $(SKETCH)),)
$(error Sketch $(SKETCH) not found)
endif
SRC_GIT_VERSION := $(call git_description,$(dir $(SKETCH)))
# Main output definitions
SKETCH_NAME := $(basename $(notdir $(SKETCH)))
MAIN_NAME ?= $(SKETCH_NAME)
MAIN_EXE ?= $(BUILD_DIR)/$(MAIN_NAME).bin
FS_IMAGE ?= $(BUILD_DIR)/FS.bin
# Build file extensions
OBJ_EXT = .o
DEP_EXT = .d
# Special tool definitions
OTA_TOOL ?= python $(TOOLS_ROOT)/espota.py
HTTP_TOOL ?= curl
# Core source files
CORE_DIR = $(ESP_ROOT)/cores/$(CHIP)
CORE_SRC := $(call find_files,S|c|cpp,$(CORE_DIR))
CORE_OBJ := $(patsubst %,$(BUILD_DIR)/%$(OBJ_EXT),$(notdir $(CORE_SRC)))
CORE_LIB = $(BUILD_DIR)/arduino.ar
USER_OBJ_LIB = $(BUILD_DIR)/user_obj.ar
# Find project specific source files and include directories
_LIBS = $(LIBS)
ifdef EXPAND_LIBS
_LIBS := $(call find_files,S|c|cpp,$(_LIBS))
endif
SRC_LIST = $(BUILD_DIR)/src_list.mk
FIND_SRC_CMD = $(__TOOLS_DIR)/find_src.pl
$(SRC_LIST): c $(FIND_SRC_CMD) | $(BUILD_DIR)
$(if $(BUILDING),echo "- Finding all involved files for the build ...",)
perl $(FIND_SRC_CMD) "$(EXCLUDE_DIRS)" $(SKETCH) "$(CUSTOM_LIBS)" "$(_LIBS)" $(ESP_LIBS) $(ARDUINO_LIBS) >$(SRC_LIST)
-include $(SRC_LIST)
ifeq ($(suffix $(SKETCH)),.ino)
# Use sketch copy with correct C++ extension
SKETCH_CPP = $(BUILD_DIR)/$(notdir $(SKETCH)).cpp
USER_SRC := $(subst $(SKETCH),$(SKETCH_CPP),$(USER_SRC))
endif
USER_OBJ := $(patsubst %,$(BUILD_DIR)/%$(OBJ_EXT),$(notdir $(USER_SRC)))
USER_DIRS := $(sort $(dir $(USER_SRC)))
# Use first flash definition for the board as default
FLASH_DEF ?= $(shell $(BOARD_OP) $(BOARD) first_flash)
# Same method for LwIPVariant
LWIP_VARIANT ?= $(shell $(BOARD_OP) $(BOARD) first_lwip)
# Handle possible changed state i.e. make command line parameters or changed git versions
CMD_LINE ?= $(shell tr "\0" " " </proc/$$PPID/cmdline)
CMD_LINE := $(CMD_LINE)
IGNORE_STATE ?= $(if $(BUILDING),,1)
ifeq ($(IGNORE_STATE),)
STATE_LOG := $(BUILD_DIR)/state.txt
STATE_INF := $(strip $(foreach par,$(CMD_LINE),$(if $(findstring =,$(par)),$(par),))) \
$(SRC_GIT_VERSION) $(ESP_ARDUINO_VERSION)
# Ignore port and speed changes
STATE_INF := $(patsubst UPLOAD_%,,$(STATE_INF))
PREV_STATE_INF := $(if $(wildcard $(STATE_LOG)),$(shell cat $(STATE_LOG)),$(STATE_INF))
ifneq ($(PREV_STATE_INF),$(STATE_INF))
$(info * Build state has changed, doing a full rebuild *)
$(shell rm -rf "$(BUILD_DIR)")
endif
STATE_SAVE := $(shell mkdir -p $(BUILD_DIR) ; echo '$(STATE_INF)' >$(STATE_LOG))
endif
# The actual build commands are to be extracted from the Arduino description files
ARDUINO_MK = $(BUILD_DIR)/arduino.mk
OS_NAME ?= linux
ARDUINO_DESC := $(shell find -L $(ESP_ROOT) -maxdepth 1 -name "*.txt" | sort)
$(ARDUINO_MK): $(ARDUINO_DESC) $(MAKEFILE_LIST) $(__TOOLS_DIR)/parse_arduino.pl | $(BUILD_DIR)
$(if $(BUILDING),echo "- Parsing Arduino configuration files ...",)
perl $(__TOOLS_DIR)/parse_arduino.pl '$(ESP_ROOT)' '$(ARDUINO_ESP_ROOT)' $(BOARD) '$(FLASH_DEF)' '$(OS_NAME)' '$(LWIP_VARIANT)' $(ARDUINO_EXTRA_DESC) $(ARDUINO_DESC) >$(ARDUINO_MK)
-include $(ARDUINO_MK)
# Compilation directories and path
INCLUDE_DIRS += $(CORE_DIR) $(ESP_ROOT)/variants/$(INCLUDE_VARIANT) $(BUILD_DIR)
C_INCLUDES := $(foreach dir,$(INCLUDE_DIRS) $(USER_INC_DIRS),-I$(dir))
VPATH += $(shell find $(CORE_DIR) -type d) $(USER_DIRS)
# Automatically generated build information data source file
# Makes the build date and git descriptions at the time of actual build event
# available as string constants in the program
BUILD_INFO_H = $(BUILD_DIR)/buildinfo.h
BUILD_INFO_CPP = $(BUILD_DIR)/buildinfo.c++
BUILD_INFO_OBJ = $(BUILD_INFO_CPP)$(OBJ_EXT)
BUILD_DATE = $(call time_string,"%Y-%m-%d")
BUILD_TIME = $(call time_string,"%H:%M:%S")
$(BUILD_INFO_H): | $(BUILD_DIR)
@echo "typedef struct { const char *date, *time, *src_version, *env_version; } _tBuildInfo; extern _tBuildInfo _BuildInfo;" >$@
# Use ccache if it is available and not explicitly disabled (USE_CCACHE=0)
USE_CCACHE ?= $(if $(shell which ccache 2>/dev/null),1,0)
ifeq ($(USE_CCACHE),1)
C_COM_PREFIX = ccache
CPP_COM_PREFIX = $(C_COM_PREFIX)
endif
# Generated header files
GEN_H_FILES += $(BUILD_INFO_H)
# Build output root directory
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
# Create a C++ file from the sketch
$(SKETCH_CPP): $(SKETCH)
echo "#include <Arduino.h>" >$@
cat $(abspath $<) >>$@
# Build rules for the different source file types
$(BUILD_DIR)/%.cpp$(OBJ_EXT): %.cpp $(ARDUINO_MK) | $(GEN_H_FILES)
@echo $(<F)
$(CPP_COM) $(CPP_EXTRA) $($(<F)_CFLAGS) $(abspath $<) -o $@
$(BUILD_DIR)/%.c$(OBJ_EXT): %.c $(ARDUINO_MK) | $(GEN_H_FILES)
@echo $(<F)
$(C_COM) $(C_EXTRA) $($(<F)_CFLAGS) $(abspath $<) -o $@
$(BUILD_DIR)/%.S$(OBJ_EXT): %.S $(ARDUINO_MK) | $(GEN_H_FILES)
@echo $(<F)
$(S_COM) $(S_EXTRA) $(abspath $<) -o $@
$(CORE_LIB): $(CORE_OBJ)
@echo Creating core archive
rm -f $@
$(CORE_LIB_COM) $^
$(USER_OBJ_LIB): $(USER_OBJ)
@echo Creating object archive
rm -f $@
$(LIB_COM) $@ $^
# Possible user specific additional make rules
ifdef USER_RULES
include $(USER_RULES)
endif
# Putting the object files in a libarary minimizes the memory usage in the executable
ifneq ($(NO_USER_OBJ_LIB),)
USER_OBJ_DEP = $(USER_OBJ)
else
USER_OBJ_DEP = $(USER_OBJ_LIB)
endif
# Linking the executable
$(MAIN_EXE): $(CORE_LIB) $(USER_LIBS) $(USER_OBJ_DEP)
@echo Linking $(MAIN_EXE)
$(PRELINK)
@echo " Versions: $(SRC_GIT_VERSION), $(ESP_ARDUINO_VERSION)"
@echo '#include <buildinfo.h>' >$(BUILD_INFO_CPP)
@echo '_tBuildInfo _BuildInfo = {"$(BUILD_DATE)","$(BUILD_TIME)","$(SRC_GIT_VERSION)","$(ESP_ARDUINO_VERSION)"};' >>$(BUILD_INFO_CPP)
$(CPP_COM) $(BUILD_INFO_CPP) -o $(BUILD_INFO_OBJ)
$(LD_COM) $(LD_EXTRA)
$(GEN_PART_COM)
$(OBJCOPY)
$(SIZE_COM) | perl $(__TOOLS_DIR)/mem_use.pl "$(MEM_FLASH)" "$(MEM_RAM)"
ifneq ($(LWIP_INFO),)
@printf "LwIPVariant: $(LWIP_INFO)\n"
endif
ifneq ($(FLASH_INFO),)
@printf "Flash size: $(FLASH_INFO)\n\n"
endif
@perl -e 'print "Build complete. Elapsed time: ", time()-$(START_TIME), " seconds\n\n"'
# Flashing operations
CHECK_PORT := $(if $(UPLOAD_PORT),\
@echo === Using upload port: $(UPLOAD_PORT) @ $(UPLOAD_SPEED),\
@echo "*** Upload port not found or defined" && exit 1)
upload flash: all
$(CHECK_PORT)
$(UPLOAD_COM)
ota: all
ifeq ($(OTA_ADDR),)
@echo == Error: Address of device must be specified via OTA_ADDR
exit 1
endif
$(OTA_PRE_COM)
$(OTA_TOOL) $(OTA_ARGS) --file="$(MAIN_EXE)"
http: all
ifeq ($(HTTP_ADDR),)
@echo == Error: Address of device must be specified via HTTP_ADDR
exit 1
endif
$(HTTP_TOOL) $(HTTP_OPT) -F image=@$(MAIN_EXE) --user $(HTTP_USR):$(HTTP_PWD) http://$(HTTP_ADDR)$(HTTP_URI)
@echo "\n"
$(FS_IMAGE): $(ARDUINO_MK) $(shell find $(FS_DIR)/ 2>/dev/null)
ifeq ($(SPIFFS_SIZE),)
@echo == Error: No file system specified in FLASH_DEF
exit 1
endif
@echo Generating file system image: $(FS_IMAGE)
$(MK_FS_COM)
fs: $(FS_IMAGE)
upload_fs flash_fs: $(FS_IMAGE)
$(CHECK_PORT)
$(FS_UPLOAD_COM)
ota_fs: $(FS_IMAGE)
ifeq ($(OTA_ADDR),)
@echo == Error: Address of device must be specified via OTA_ADDR
exit 1
endif
$(OTA_TOOL) $(OTA_ARGS) --spiffs --file="$(FS_IMAGE)"
run: flash
$(MONITOR_COM)
monitor:
ifeq ($(MONITOR_PORT),)
@echo "*** Monitor port not found or defined" && exit 1
endif
$(MONITOR_COM)
FLASH_FILE ?= $(BUILD_DIR)/esp_flash.bin
dump_flash:
$(CHECK_PORT)
@echo Dumping flash memory to file: $(FLASH_FILE)
$(ESPTOOL_COM) read_flash 0 $(shell perl -e 'shift =~ /(\d+)([MK])/ || die "Invalid memory size\n";$$mem_size=$$1*1024;$$mem_size*=1024 if $$2 eq "M";print $$mem_size;' $(FLASH_DEF)) $(FLASH_FILE)
dump_fs:
$(CHECK_PORT)
@echo Dumping flash file system to directory: $(FS_RESTORE_DIR)
-$(ESPTOOL_COM) read_flash $(SPIFFS_START) $(SPIFFS_SIZE) $(FS_IMAGE)
mkdir -p $(FS_RESTORE_DIR)
@echo
@echo == Files ==
$(RESTORE_FS_COM)
restore_flash:
$(CHECK_PORT)
@echo Restoring flash memory from file: $(FLASH_FILE)
$(ESPTOOL_COM) -a soft_reset write_flash 0 $(FLASH_FILE)
erase_flash:
$(CHECK_PORT)
$(ESPTOOL_COM) erase_flash
# Building library instead of executable
LIB_OUT_FILE ?= $(BUILD_DIR)/$(MAIN_NAME).a
.PHONY: lib
lib: $(LIB_OUT_FILE)
$(LIB_OUT_FILE): $(filter-out $(BUILD_DIR)/$(MAIN_NAME).cpp$(OBJ_EXT),$(USER_OBJ))
@echo Building library $(LIB_OUT_FILE)
rm -f $(LIB_OUT_FILE)
$(LIB_COM) $(LIB_OUT_FILE) $^
# Miscellaneous operations
clean:
@echo Removing all build files
rm -rf "$(BUILD_DIR)" $(FILES_TO_CLEAN)
list_boards:
$(BOARD_OP) $(BOARD) list_names
list_lib: $(SRC_LIST)
perl -e 'foreach (@ARGV) {print "$$_\n"}' "===== Include directories =====" $(USER_INC_DIRS) "===== Source files =====" $(USER_SRC)
list_flash_defs:
$(BOARD_OP) $(BOARD) list_flash
list_lwip:
$(BOARD_OP) $(BOARD) list_lwip
# Update the git version of the esp Arduino repo
set_git_version:
ifeq ($(REQ_GIT_VERSION),)
@echo == Error: Version tag must be specified via REQ_GIT_VERSION
exit 1
endif
@echo == Setting $(ESP_ROOT) to $(REQ_GIT_VERSION) ...
git -C $(ESP_ROOT) checkout -fq --recurse-submodules $(REQ_GIT_VERSION)
git -C $(ESP_ROOT) clean -fdxq -f
git -C $(ESP_ROOT) submodule update --init
git -C $(ESP_ROOT) submodule foreach -q --recursive git clean -xfd
cd $(ESP_ROOT)/tools; ./get.py -q
# Generate a Visual Studio Code configuration and launch
BIN_DIR = /usr/local/bin
_MAKE_COM = make -f $(__THIS_FILE) ESP_ROOT=$(ESP_ROOT)
ifeq ($(CHIP),esp32)
_MAKE_COM += CHIP=esp32
_SCRIPT = espmake32
else
_SCRIPT = espmake
endif
vscode: all
perl $(__TOOLS_DIR)/vscode.pl -n $(MAIN_NAME) -m "$(_MAKE_COM)" -w "$(VS_CODE_DIR)" -i "$(VSCODE_INC_EXTRA)" -p "$(VSCODE_PROJ_NAME)" $(CPP_COM)
# Create shortcut command for running this file
install:
@echo Creating command \"$(_SCRIPT)\" in $(BIN_DIR)
sudo sh -c 'echo $(_MAKE_COM) "\"\$$@\"" >$(BIN_DIR)/$(_SCRIPT)'
sudo chmod +x $(BIN_DIR)/$(_SCRIPT)
# Just return the path of the tools directory (intended to be used to find vscode.pl above from othe makefiles)
tools_dir:
@echo $(__TOOLS_DIR)
# Show ram memory usage per variable
ram_usage: $(MAIN_EXE)
$(shell find $(TOOLS_ROOT) | grep 'gcc-nm') -Clrtd --size-sort $(BUILD_DIR)/$(MAIN_NAME).elf | grep -i ' [b] '
# Show ram and flash usage per object files used in the build
OBJ_INFO_FORM ?= 0
OBJ_INFO_SORT ?= 1
obj_info: $(MAIN_EXE)
perl $(__TOOLS_DIR)/obj_info.pl "$(shell find $(TOOLS_ROOT) | grep 'elf-size$$')" "$(OBJ_INFO_FORM)" "$(OBJ_INFO_SORT)" $(BUILD_DIR)/*.o
# Analyze crash log
crash: $(MAIN_EXE)
perl $(__TOOLS_DIR)/crash_tool.pl $(ESP_ROOT) $(BUILD_DIR)/$(MAIN_NAME).elf
# Run compiler preprocessor to get full expanded source for a file
preproc:
ifeq ($(SRC_FILE),)
$(error SRC_FILE must be defined)
endif
$(CPP_COM) -E $(SRC_FILE)
# Main default rule, build the executable
.PHONY: all
all: $(BUILD_DIR) $(ARDUINO_MK) prebuild $(MAIN_EXE)
# Prebuild is currently only mandatory for esp32
USE_PREBUILD ?= $(if $(IS_ESP32),1,)
prebuild:
ifneq ($(USE_PREBUILD),)
$(PREBUILD)
endif
help: $(ARDUINO_MK)
@echo
@echo "Generic makefile for building Arduino esp8266 and esp32 projects"
@echo "This file can either be used directly or included from another makefile"
@echo ""
@echo "The following targets are available:"
@echo " all (default) Build the project application"
@echo " clean Remove all intermediate build files"
@echo " lib Build a library with all involved object files"
@echo " flash Build and and flash the project application"
@echo " flash_fs Build and and flash file system (when applicable)"
@echo " ota Build and and flash via OTA"
@echo " Params: OTA_ADDR, OTA_PORT and OTA_PWD"
@echo " ota_fs Build and and flash file system via OTA"
@echo " http Build and and flash via http (curl)"
@echo " Params: HTTP_ADDR, HTTP_URI, HTTP_PWD and HTTP_USR"
@echo " dump_flash Dump the whole board flash memory to a file"
@echo " restore_flash Restore flash memory from a previously dumped file"
@echo " dump_fs Extract all files from the flash file system"
@echo " Params: FS_DUMP_DIR"
@echo " erase_flash Erase the whole flash (use with care!)"
@echo " list_lib Show a list of used solurce files and include directories"
@echo " set_git_version Setup ESP Arduino git repo to a the tag version"
@echo " specified via REQ_GIT_VERSION"
@echo " install Create the commands \"espmake\" and \"espmake32\""
@echo " vscode Create config file for Visual Studio Code and launch"
@echo " ram_usage Show global variables RAM usage"
@echo " obj_info Show memory usage per object file"
@echo " monitor Start serial monitor on the upload port"
@echo " run Build flash and start serial monitor"
@echo " crash Analyze stack trace from a crash"
@echo " preproc Run compiler preprocessor on source file"
@echo " specified via SRC_FILE"
@echo " list_boards Show list of boards from the Arduino core"
@echo " info Show location and version of used esp Arduino"
@echo "Configurable parameters:"
@echo " SKETCH Main source file"
@echo " If not specified the first sketch in current"
@echo " directory will be used."
@echo " LIBS Use this variable to declare additional directories"
@echo " and/or files which should be included in the build"
@echo " CHIP Set to esp8266 or esp32. Default: '$(CHIP)'"
@echo " BOARD Name of the target board. Default: '$(BOARD)'"
@echo " Use 'list_boards' to get list of available ones"
@echo " FLASH_DEF Flash partitioning info. Default '$(FLASH_DEF)'"
@echo " Use 'list_flash_defs' to get list of available ones"
@echo " BUILD_DIR Directory for intermediate build files."
@echo " Default '$(BUILD_DIR)'"
@echo " BUILD_EXTRA_FLAGS Additional parameters for the compilation commands"
@echo " COMP_WARNINGS Compilation warning options. Default: $(COMP_WARNINGS)"
@echo " FS_TYPE File system type. Default: $(FS_TYPE)"
@echo " FS_DIR File system root directory"
@echo " UPLOAD_PORT Serial flashing port name. Default: '$(UPLOAD_PORT)'"
@echo " UPLOAD_SPEED Serial flashing baud rate. Default: '$(UPLOAD_SPEED)'"
@echo " MONITOR_SPEED Baud rate for the monitor. Default: '$(MONITOR_SPEED)'"
@echo " FLASH_FILE File name for dump and restore flash operations"
@echo " Default: '$(FLASH_FILE)'"
@echo " LWIP_VARIANT Use specified variant of the lwip library when applicable"
@echo " Use 'list_lwip' to get list of available ones"
@echo " Default: $(LWIP_VARIANT) ($(LWIP_INFO))"
@echo " VERBOSE Set to 1 to get full printout of the build"
@echo " BUILD_THREADS Number of parallel build threads"
@echo " Default: Maximum possible, based on number of CPUs"
@echo " USE_CCACHE Set to 0 to disable ccache when it is available"
@echo " NO_USER_OBJ_LIB Set to 1 to disable putting all object files into an archive"
@echo
# Show installation information
info:
echo == Build info
echo " CHIP: $(CHIP)"
echo " ESP_ROOT: $(ESP_ROOT)"
echo " Version: $(ESP_ARDUINO_VERSION)"
echo " Threads: $(BUILD_THREADS)"
echo " Upload port: $(UPLOAD_PORT)"
# Include all available dependencies from the previous compilation
-include $(wildcard $(BUILD_DIR)/*$(DEP_EXT))
DEFAULT_GOAL ?= all
.DEFAULT_GOAL := $(DEFAULT_GOAL)

View File

@ -1,13 +0,0 @@
#!/usr/bin/env bash
SCRIPTS_DIR=$(dirname -- $(readlink -f -- "$0"))
CWD=$(readlink -f "$SCRIPTS_DIR/..")
SRC="$CWD/src"
TEST="$CWD/test"
ARDMK="$CWD/Arduino-Makefile"
AVR_GCC="/usr/share/avr-gcc"
ARDUINO="/usr/share/arduino"
source "$SCRIPTS_DIR/install.sh"

View File

@ -1,24 +0,0 @@
#!/usr/bin/env bash
echo "Installing dependencies needed to build the sources and tests..."
ARDUINO_BASENAME="arduino-1.8.9"
ARDUINO_FILE="$ARDUINO_BASENAME-linux64.tar.xz"
ARDUINO_URL="https://downloads.arduino.cc/$ARDUINO_FILE"
echo "Downloading $ARDUINO_BASENAME from $ARDUINO_URL"
wget "$ARDUINO_URL" -O "$ARDUINO_FILE"
echo "Unzipping $ARDUINO_BASENAME"
tar xf "$ARDUINO_FILE"
echo "Installing avr-gcc to $AVR_GCC"
sudo mv "$ARDUINO_BASENAME/hardware/tools/avr" "$AVR_GCC"
echo "Install Arduino to $ARDUINO"
sudo mv "$ARDUINO_BASENAME/" "$ARDUINO"
echo "Installation of dependencies is complete, we are now going to run some tests..."
source "$SCRIPTS_DIR/runtests.sh"

View File

@ -1,77 +0,0 @@
#!/usr/bin/env bash
failures=()
successes=()
cd "$SRC"
for dir in *; do
if [ -d "${dir}" ]; then
echo "Compiling $dir..."
echo $CWD
cd $dir
cp $CWD/Makefile-CI.mk Makefile
make PROJECT_DIR=$CWD ARDUINO_DIR=$ARDUINO AVR_TOOLS_DIR=$AVR_GCC
if [[ $? -ne 0 ]]; then
failures+=("$dir")
echo "Source $dir failed"
else
successes+=("$dir")
echo "Source $dir succeeded"
fi
cd ..
fi
done
cd "$TEST"
for dir in *; do
if [ -d "${dir}" ]; then
echo "Compiling $dir..."
cd $dir
cp $CWD/Makefile-CI.mk Makefile
make PROJECT_DIR=$CWD ARDUINO_DIR=$ARDUINO AVR_TOOLS_DIR=$AVR_GCC
if [[ $? -ne 0 ]]; then
failures+=("$dir")
echo "Test $dir failed"
else
successes+=("$dir")
echo "Source $dir succeeded"
fi
cd ..
fi
done
if [[ ${#failures[@]} -ne 0 ]]; then
echo "The following builds succeeded:"
for success in "${successes[@]}"; do
echo "- Building $success succeeded"
done
echo "The following builds failed:"
for failure in "${failures[@]}"; do
echo "- Building $failure failed"
done
fi
if [[ ${#failures[@]} -eq 0 ]]; then
echo "All tests passed."
else
exit 1
fi

View File

@ -0,0 +1,343 @@
#!/usr/bin/env python3
#
# Original espota.py by Ivan Grokhotkov:
# https://gist.github.com/igrr/d35ab8446922179dc58c
#
# Modified since 2015-09-18 from Pascal Gollor (https://github.com/pgollor)
# Modified since 2015-11-09 from Hristo Gochkov (https://github.com/me-no-dev)
# Modified since 2016-01-03 from Matthew O'Gorman (https://githumb.com/mogorman)
#
# This script will push an OTA update to the ESP
# use it like: python3 espota.py -i <ESP_IP_address> -I <Host_IP_address> -p <ESP_port> -P <Host_port> [-a password] -f <sketch.bin>
# Or to upload SPIFFS image:
# python3 espota.py -i <ESP_IP_address> -I <Host_IP_address> -p <ESP_port> -P <HOST_port> [-a password] -s -f <spiffs.bin>
#
# Changes
# 2015-09-18:
# - Add option parser.
# - Add logging.
# - Send command to controller to differ between flashing and transmitting SPIFFS image.
#
# Changes
# 2015-11-09:
# - Added digest authentication
# - Enhanced error tracking and reporting
#
# Changes
# 2016-01-03:
# - Added more options to parser.
#
from __future__ import print_function
import socket
import sys
import os
import optparse
import logging
import hashlib
import random
# Commands
FLASH = 0
SPIFFS = 100
AUTH = 200
PROGRESS = False
# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
if (PROGRESS):
barLength = 60 # Modify this to change the length of the progress bar
status = ""
if isinstance(progress, int):
progress = float(progress)
if not isinstance(progress, float):
progress = 0
status = "error: progress var must be float\r\n"
if progress < 0:
progress = 0
status = "Halt...\r\n"
if progress >= 1:
progress = 1
status = "Done...\r\n"
block = int(round(barLength*progress))
text = "\rUploading: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), int(progress*100), status)
sys.stderr.write(text)
sys.stderr.flush()
else:
sys.stderr.write('.')
sys.stderr.flush()
def serve(remoteAddr, localAddr, remotePort, localPort, password, filename, command = FLASH):
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (localAddr, localPort)
logging.info('Starting on %s:%s', str(server_address[0]), str(server_address[1]))
try:
sock.bind(server_address)
sock.listen(1)
except Exception:
logging.error("Listen Failed")
return 1
# Check whether Signed Update is used.
if ( os.path.isfile(filename + '.signed') ):
filename = filename + '.signed'
file_check_msg = 'Detected Signed Update. %s will be uploaded instead.' % (filename)
sys.stderr.write(file_check_msg + '\n')
sys.stderr.flush()
logging.info(file_check_msg)
content_size = os.path.getsize(filename)
f = open(filename,'rb')
file_md5 = hashlib.md5(f.read()).hexdigest()
f.close()
logging.info('Upload size: %d', content_size)
message = '%d %d %d %s\n' % (command, localPort, content_size, file_md5)
# Wait for a connection
logging.info('Sending invitation to: %s', remoteAddr)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
remote_address = (remoteAddr, int(remotePort))
sock2.sendto(message.encode(), remote_address)
sock2.settimeout(10)
try:
data = sock2.recv(128).decode()
except Exception:
logging.error('No Answer')
sock2.close()
return 1
if (data != "OK"):
if(data.startswith('AUTH')):
nonce = data.split()[1]
cnonce_text = '%s%u%s%s' % (filename, content_size, file_md5, remoteAddr)
cnonce = hashlib.md5(cnonce_text.encode()).hexdigest()
passmd5 = hashlib.md5(password.encode()).hexdigest()
result_text = '%s:%s:%s' % (passmd5 ,nonce, cnonce)
result = hashlib.md5(result_text.encode()).hexdigest()
sys.stderr.write('Authenticating...')
sys.stderr.flush()
message = '%d %s %s\n' % (AUTH, cnonce, result)
sock2.sendto(message.encode(), remote_address)
sock2.settimeout(10)
try:
data = sock2.recv(32).decode()
except Exception:
sys.stderr.write('FAIL\n')
logging.error('No Answer to our Authentication')
sock2.close()
return 1
if (data != "OK"):
sys.stderr.write('FAIL\n')
logging.error('%s', data)
sock2.close()
sys.exit(1)
return 1
sys.stderr.write('OK\n')
else:
logging.error('Bad Answer: %s', data)
sock2.close()
return 1
sock2.close()
logging.info('Waiting for device...')
try:
sock.settimeout(10)
connection, client_address = sock.accept()
sock.settimeout(None)
connection.settimeout(None)
except Exception:
logging.error('No response from device')
sock.close()
return 1
received_ok = False
try:
f = open(filename, "rb")
if (PROGRESS):
update_progress(0)
else:
sys.stderr.write('Uploading')
sys.stderr.flush()
offset = 0
while True:
chunk = f.read(1460)
if not chunk: break
offset += len(chunk)
update_progress(offset/float(content_size))
connection.settimeout(10)
try:
connection.sendall(chunk)
if connection.recv(32).decode().find('O') >= 0:
# connection will receive only digits or 'OK'
received_ok = True
except Exception:
sys.stderr.write('\n')
logging.error('Error Uploading')
connection.close()
f.close()
sock.close()
return 1
sys.stderr.write('\n')
logging.info('Waiting for result...')
# libraries/ArduinoOTA/ArduinoOTA.cpp L311 L320
# only sends digits or 'OK'. We must not not close
# the connection before receiving the 'O' of 'OK'
try:
connection.settimeout(60)
received_ok = False
received_error = False
while not (received_ok or received_error):
reply = connection.recv(64).decode()
# Look for either the "E" in ERROR or the "O" in OK response
# Check for "E" first, since both strings contain "O"
if reply.find('E') >= 0:
sys.stderr.write('\n')
logging.error('%s', reply)
received_error = True
elif reply.find('O') >= 0:
logging.info('Result: OK')
received_ok = True
connection.close()
f.close()
sock.close()
if received_ok:
return 0
return 1
except Exception:
logging.error('No Result!')
connection.close()
f.close()
sock.close()
return 1
finally:
connection.close()
f.close()
sock.close()
return 1
# end serve
def parser(unparsed_args):
parser = optparse.OptionParser(
usage = "%prog [options]",
description = "Transmit image over the air to the esp8266 module with OTA support."
)
# destination ip and port
group = optparse.OptionGroup(parser, "Destination")
group.add_option("-i", "--ip",
dest = "esp_ip",
action = "store",
help = "ESP8266 IP Address.",
default = False
)
group.add_option("-I", "--host_ip",
dest = "host_ip",
action = "store",
help = "Host IP Address.",
default = "0.0.0.0"
)
group.add_option("-p", "--port",
dest = "esp_port",
type = "int",
help = "ESP8266 ota Port. Default 8266",
default = 8266
)
group.add_option("-P", "--host_port",
dest = "host_port",
type = "int",
help = "Host server ota Port. Default random 10000-60000",
default = random.randint(10000,60000)
)
parser.add_option_group(group)
# auth
group = optparse.OptionGroup(parser, "Authentication")
group.add_option("-a", "--auth",
dest = "auth",
help = "Set authentication password.",
action = "store",
default = ""
)
parser.add_option_group(group)
# image
group = optparse.OptionGroup(parser, "Image")
group.add_option("-f", "--file",
dest = "image",
help = "Image file.",
metavar="FILE",
default = None
)
group.add_option("-s", "--spiffs",
dest = "spiffs",
action = "store_true",
help = "Use this option to transmit a SPIFFS image and do not flash the module.",
default = False
)
parser.add_option_group(group)
# output group
group = optparse.OptionGroup(parser, "Output")
group.add_option("-d", "--debug",
dest = "debug",
help = "Show debug output. And override loglevel with debug.",
action = "store_true",
default = False
)
group.add_option("-r", "--progress",
dest = "progress",
help = "Show progress output. Does not work for ArduinoIDE",
action = "store_true",
default = False
)
parser.add_option_group(group)
(options, args) = parser.parse_args(unparsed_args)
return options
# end parser
def main(args):
# get options
options = parser(args)
# adapt log level
loglevel = logging.WARNING
if (options.debug):
loglevel = logging.DEBUG
# end if
# logging
logging.basicConfig(level = loglevel, format = '%(asctime)-8s [%(levelname)s]: %(message)s', datefmt = '%H:%M:%S')
logging.debug("Options: %s", str(options))
# check options
global PROGRESS
PROGRESS = options.progress
if (not options.esp_ip or not options.image):
logging.critical("Not enough arguments.")
return 1
# end if
command = FLASH
if (options.spiffs):
command = SPIFFS
# end if
return serve(options.esp_ip, options.host_ip, options.esp_port, options.host_port, options.auth, options.image, command)
# end main
if __name__ == '__main__':
sys.exit(main(sys.argv))
# end if

View File

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -0,0 +1,21 @@
# esptool.py
A Python-based, open-source, platform-independent utility to communicate with the ROM bootloader in Espressif chips.
[![Test esptool](https://github.com/espressif/esptool/actions/workflows/test_esptool.yml/badge.svg?branch=master)](https://github.com/espressif/esptool/actions/workflows/test_esptool.yml) [![Build esptool](https://github.com/espressif/esptool/actions/workflows/build_esptool.yml/badge.svg?branch=master)](https://github.com/espressif/esptool/actions/workflows/build_esptool.yml)
## Documentation
Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool.py -h`.
## Contribute
If you're interested in contributing to esptool.py, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
## About
esptool.py was initially created by Fredrik Ahlberg (@[themadinventor](https://github.com/themadinventor/)), and later maintained by Angus Gratton (@[projectgus](https://github.com/projectgus/)). It is now supported by Espressif Systems. It has also received improvements from many members of the community.
## License
This document and the attached source code are released as Free Software under GNU General Public License Version 2 or later. See the accompanying [LICENSE file](https://github.com/espressif/esptool/blob/master/LICENSE) for a copy.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.