Files
DFPlayer-carrier-board/.ato/modules/atopile/mounting-holes/MountingHole.py
2025-09-27 12:44:25 +02:00

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)