diff --git a/stubs/Jetson.GPIO/@tests/stubtest_allowlist.txt b/stubs/Jetson.GPIO/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000..fffd609ed --- /dev/null +++ b/stubs/Jetson.GPIO/@tests/stubtest_allowlist.txt @@ -0,0 +1,10 @@ +# The high level module can only be imported on a Jetson SBC + +Jetson.GPIO +# error: Jetson.GPIO failed to import. RuntimeError: The current user does not have permissions set to access the library functionalites. Please configure permissions or use the root user to run this. It is also possible that /dev/gpiochip0 does not exist. Please check if that file is present. + +Jetson.GPIO.gpio +# error: Jetson.GPIO.gpio failed to import. RuntimeError: The current user does not have permissions set to access the library functionalites. Please configure permissions or use the root user to run this. It is also possible that /dev/gpiochip0 does not exist. Please check if that file is present. + +# This builtin error doesn't need to be re-exported +Jetson.GPIO.gpio_event.InterruptedError diff --git a/stubs/Jetson.GPIO/Jetson/GPIO/__init__.pyi b/stubs/Jetson.GPIO/Jetson/GPIO/__init__.pyi new file mode 100644 index 000000000..9c7fe6b35 --- /dev/null +++ b/stubs/Jetson.GPIO/Jetson/GPIO/__init__.pyi @@ -0,0 +1,3 @@ +from .gpio import * + +VERSION: str = ... diff --git a/stubs/Jetson.GPIO/Jetson/GPIO/gpio.pyi b/stubs/Jetson.GPIO/Jetson/GPIO/gpio.pyi new file mode 100644 index 000000000..6a00a2b5a --- /dev/null +++ b/stubs/Jetson.GPIO/Jetson/GPIO/gpio.pyi @@ -0,0 +1,63 @@ +from collections.abc import Callable, Sequence +from typing import Final, Literal + +BOARD: Final = 10 +BCM: Final = 11 +TEGRA_SOC: Final = 1000 +CVM: Final = 1001 + +PUD_OFF: Final = 20 +PUD_DOWN: Final = 21 +PUD_UP: Final = 22 + +HIGH: Final = 1 +LOW: Final = 0 + +RISING: Final = 31 +FALLING: Final = 32 +BOTH: Final = 33 + +UNKNOWN: Final = -1 +OUT: Final = 0 +IN: Final = 1 +HARD_PWM: Final = 43 + +model = ... +JETSON_INFO = ... +RPI_INFO = ... + +def setwarnings(state: bool) -> None: ... +def setmode(mode: Literal[10, 11, 1000, 1001]) -> None: ... +def getmode() -> Literal[10, 11, 1000, 1001]: ... +def setup( + channels: int | Sequence[int], + direction: Literal[0, 1], + pull_up_down: Literal[20, 21, 22] = ..., + initial: Literal[0, 1] = ..., + consumer: str = ..., +) -> None: ... +def cleanup(channel: int | Sequence[int] | None = ...) -> None: ... +def input(channel: int) -> Literal[0, 1]: ... +def output(channels: int | Sequence[int], values: Literal[0, 1]) -> None: ... +def add_event_detect( + channel: int, + edge: Literal[31, 32, 33], + callback: Callable[[int], None] | None = ..., + bouncetime: int | None = ..., + polltime: float = ..., +) -> None: ... +def remove_event_detect(channel: int, timeout: float = ...) -> None: ... +def event_detected(channel: int) -> bool: ... +def add_event_callback(channel: int, callback: Callable[[int], None]) -> None: ... +def wait_for_edge( + channel: int, edge: Literal[31, 32, 33], bouncetime: int | None = ..., timeout: float | None = ... +) -> int | None: ... +def gpio_function(channel: int) -> Literal[-1, 0, 1]: ... + +class PWM: + def __init__(self, channel: int, frequency_hz: float) -> None: ... + def __del__(self) -> None: ... + def start(self, duty_cycle_percent: float) -> None: ... + def ChangeFrequency(self, frequency_hz: float) -> None: ... + def ChangeDutyCycle(self, duty_cycle_percent: float) -> None: ... + def stop(self) -> None: ... diff --git a/stubs/Jetson.GPIO/Jetson/GPIO/gpio_cdev.pyi b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_cdev.pyi new file mode 100644 index 000000000..463fc462e --- /dev/null +++ b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_cdev.pyi @@ -0,0 +1,72 @@ +import ctypes +from typing import Final, Literal + +from .gpio_pin_data import ChannelInfo + +GPIO_HIGH: Final = 1 + +GPIOHANDLE_REQUEST_INPUT: Final = 0x1 +GPIOHANDLE_REQUEST_OUTPUT: Final = 0x2 + +GPIOEVENT_REQUEST_RISING_EDGE: Final = 0x1 +GPIOEVENT_REQUEST_FALLING_EDGE: Final = 0x2 +GPIOEVENT_REQUEST_BOTH_EDGES: Final = 0x3 + +GPIO_GET_CHIPINFO_IOCTL: Final = 0x8044B401 +GPIO_GET_LINEINFO_IOCTL: Final = 0xC048B402 +GPIO_GET_LINEHANDLE_IOCTL: Final = 0xC16CB403 +GPIOHANDLE_GET_LINE_VALUES_IOCTL: Final = 0xC040B408 +GPIOHANDLE_SET_LINE_VALUES_IOCTL: Final = 0xC040B409 +GPIO_GET_LINEEVENT_IOCTL: Final = 0xC030B404 + +class gpiochip_info(ctypes.Structure): + name: str + label: str + lines: int + +class gpiohandle_request(ctypes.Structure): + lineoffsets: list[int] + flags: int + default_values: list[int] + consumer_label: str + lines: int + fd: int + +class gpiohandle_data(ctypes.Structure): + values: list[int] + +class gpioline_info(ctypes.Structure): + line_offset: int + flags: int + name: str + consumer: str + +class gpioline_info_changed(ctypes.Structure): + line_info: gpioline_info + timestamp: int + event_type: int + padding: list[int] + +class gpioevent_request(ctypes.Structure): + lineoffset: int + handleflags: int + eventflags: int + consumer_label: str + fd: int + +class gpioevent_data(ctypes.Structure): + timestamp: int + id: int + +class GPIOError(IOError): ... + +def chip_open(gpio_chip: str) -> int: ... +def chip_check_info(label: str, gpio_device: str) -> int | None: ... +def chip_open_by_label(label: str) -> int: ... +def close_chip(chip_fd: int) -> None: ... +def open_line(ch_info: ChannelInfo, request: int) -> None: ... +def close_line(line_handle: int) -> None: ... +def request_handle(line_offset: int, direction: Literal[0, 1], initial: Literal[0, 1], consumer: str) -> gpiohandle_request: ... +def request_event(line_offset: int, edge: int, consumer: str) -> gpioevent_request: ... +def get_value(line_handle: int) -> int: ... +def set_value(line_handle: int, value: int) -> None: ... diff --git a/stubs/Jetson.GPIO/Jetson/GPIO/gpio_event.pyi b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_event.pyi new file mode 100644 index 000000000..1f456f9c2 --- /dev/null +++ b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_event.pyi @@ -0,0 +1,17 @@ +from collections.abc import Callable +from typing import Any, Final, Literal + +NO_EDGE: Final = 0 +RISING_EDGE: Final = 1 +FALLING_EDGE: Final = 2 +BOTH_EDGE: Final = 3 + +def add_edge_detect( + chip_fd: int, chip_name: str, channel: int, request: int, bouncetime: int, poll_time: float +) -> Literal[1, 2, 0]: ... +def remove_edge_detect(chip_name: str, channel: int, timeout: float = ...) -> None: ... +def add_edge_callback(chip_name: str, channel: int, callback: Callable[[int], None]) -> None: ... +def edge_event_detected(chip_name: str, channel: int) -> bool: ... +def gpio_event_added(chip_name: str, channel: int) -> Any: ... +def blocking_wait_for_edge(chip_fd: int, chip_name: str, channel: int, request: int, bouncetime: int, timeout: float) -> int: ... +def event_cleanup(chip_name: str, channel: int) -> None: ... diff --git a/stubs/Jetson.GPIO/Jetson/GPIO/gpio_pin_data.pyi b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_pin_data.pyi new file mode 100644 index 000000000..e46b4cf90 --- /dev/null +++ b/stubs/Jetson.GPIO/Jetson/GPIO/gpio_pin_data.pyi @@ -0,0 +1,58 @@ +from collections.abc import Sequence +from typing import Any, Final + +CLARA_AGX_XAVIER: Final = "CLARA_AGX_XAVIER" +JETSON_NX: Final = "JETSON_NX" +JETSON_XAVIER: Final = "JETSON_XAVIER" +JETSON_TX2: Final = "JETSON_TX2" +JETSON_TX1: Final = "JETSON_TX1" +JETSON_NANO: Final = "JETSON_NANO" +JETSON_TX2_NX: Final = "JETSON_TX2_NX" +JETSON_ORIN: Final = "JETSON_ORIN" +JETSON_ORIN_NX: Final = "JETSON_ORIN_NX" +JETSON_ORIN_NANO: Final = "JETSON_ORIN_NANO" + +JETSON_MODELS: list[str] = ... + +JETSON_ORIN_NX_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_jetson_orins_nx: Sequence[str] = ... +compats_jetson_orins_nano: Sequence[str] = ... + +JETSON_ORIN_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_jetson_orins: Sequence[str] = ... + +CLARA_AGX_XAVIER_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_clara_agx_xavier: Sequence[str] = ... + +JETSON_NX_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_nx: Sequence[str] = ... + +JETSON_XAVIER_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_xavier: Sequence[str] = ... + +JETSON_TX2_NX_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_tx2_nx: Sequence[str] = ... + +JETSON_TX2_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_tx2: Sequence[str] = ... + +JETSON_TX1_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_tx1: Sequence[str] = ... + +JETSON_NANO_PIN_DEFS: list[tuple[int, str, str, int, int, str, str, str | None, int | None]] = ... +compats_nano: Sequence[str] = ... + +jetson_gpio_data: dict[str, tuple[list[tuple[int, str, str, int, int, str, str, str | None, int | None]], dict[str, Any]]] = ... + +class ChannelInfo: + def __init__( + self, channel: int, line_offset: int, gpio_name: str, gpio_chip: str, pwm_chip_dir: str, pwm_id: int + ) -> None: ... + +ids_warned: bool = ... + +def find_pmgr_board(prefix: str) -> str | None: ... +def warn_if_not_carrier_board(*carrier_boards: str) -> None: ... +def get_compatibles(compatible_path: str) -> list[str]: ... +def get_model() -> str: ... +def get_data() -> tuple[str, Any, dict[str, dict[Any, ChannelInfo]]]: ... diff --git a/stubs/Jetson.GPIO/Jetson/__init__.pyi b/stubs/Jetson.GPIO/Jetson/__init__.pyi new file mode 100644 index 000000000..e69de29bb diff --git a/stubs/Jetson.GPIO/METADATA.toml b/stubs/Jetson.GPIO/METADATA.toml new file mode 100644 index 000000000..10e85f158 --- /dev/null +++ b/stubs/Jetson.GPIO/METADATA.toml @@ -0,0 +1,2 @@ +version = "2.1.*" +upstream_repository = "https://github.com/NVIDIA/jetson-gpio"