68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
# This file is part of the faebryk project
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import logging
|
|
from enum import Enum, StrEnum
|
|
from pathlib import Path
|
|
|
|
import faebryk.library._F as F
|
|
from faebryk.core.module import Module
|
|
from faebryk.libs.iso_metric_screw_thread import Iso262_MetricScrewThreadSizes
|
|
from faebryk.libs.library import L
|
|
from faebryk.libs.part_lifecycle import PartLifecycle
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MountingHole(Module):
|
|
class PadType(StrEnum):
|
|
NoPad = ""
|
|
Pad = "Pad"
|
|
Pad_TopBottom = "Pad_TopBottom"
|
|
Pad_TopOnly = "Pad_TopOnly"
|
|
Pad_Via = "Pad_Via"
|
|
|
|
# We currently only have footprints for these sizes
|
|
class SupportedMetricScrewSizes(Enum):
|
|
M2 = Iso262_MetricScrewThreadSizes.M2.value
|
|
M2_5 = Iso262_MetricScrewThreadSizes.M2_5.value
|
|
M3 = Iso262_MetricScrewThreadSizes.M3.value
|
|
M4 = Iso262_MetricScrewThreadSizes.M4.value
|
|
M5 = Iso262_MetricScrewThreadSizes.M5.value
|
|
M6 = Iso262_MetricScrewThreadSizes.M6.value
|
|
M8 = Iso262_MetricScrewThreadSizes.M8.value
|
|
|
|
contact: F.Electrical
|
|
|
|
attach_to_footprint: F.can_attach_to_footprint_symmetrically
|
|
designator_prefix = L.f_field(F.has_designator_prefix)(
|
|
F.has_designator_prefix.Prefix.H
|
|
)
|
|
|
|
def footprint_name(self) -> str:
|
|
# e.g. MountingHole_2.7mm_M2.5_Pad_TopOnly
|
|
size_metric = self._metric_screw_size
|
|
size_mm = f"{size_metric.value}mm"
|
|
padtype_name = self._pad_type.value
|
|
if padtype_name:
|
|
padtype_name = f"_{padtype_name}"
|
|
|
|
return f"MountingHole_{size_mm}_{size_metric.name}{padtype_name}"
|
|
|
|
def __init__(self, metric_screw_size: SupportedMetricScrewSizes, pad_type: PadType):
|
|
super().__init__()
|
|
self._metric_screw_size = metric_screw_size
|
|
self._pad_type = pad_type
|
|
|
|
def __preinit__(self):
|
|
fp_name = self.footprint_name()
|
|
fp_lib_name = "MountingHole"
|
|
fp_dir = Path(__file__).parent / "footprints" / fp_lib_name
|
|
fp_path = fp_dir / f"{fp_name}.kicad_mod"
|
|
|
|
fp = F.KicadFootprint.from_path(fp_path, lib_name=fp_lib_name)
|
|
self.get_trait(F.can_attach_to_footprint).attach(fp)
|
|
|
|
lifecycle = PartLifecycle.singleton()
|
|
lifecycle.library._insert_fp_lib(fp_lib_name, fp_dir)
|