from typing import Self, TypeVar
from pyautd3.driver.datagram.modulation import Modulation
from pyautd3.driver.defined.angle import Angle, rad
from pyautd3.driver.defined.freq import Freq, Hz
from pyautd3.driver.firmware.fpga.sampling_config import SamplingConfig
from pyautd3.modulation.sampling_mode import ISamplingMode, SamplingModeExact, SamplingModeExactFloat, SamplingModeNearest
from pyautd3.native_methods.autd3capi_driver import ModulationPtr

T = TypeVar("T", int, float)

class Sine(Modulation[Sine]):
    _mode: ISamplingMode
    def __private__init__(self, mode: ISamplingMode) -> None: ...
    def __init__(self, freq: Freq[T]) -> None: ...
    def _modulation_ptr(self, ) -> ModulationPtr: ...
    def with_intensity(self, intensity: int) -> Sine: ...
    def with_offset(self, offset: int) -> Sine: ...
    def with_phase(self, phase: Angle) -> Sine: ...
    def with_clamp(self, clamp: bool) -> Sine: ...
    @classmethod
    def nearest(cls, freq: Freq[float]) -> Sine: ...
    @property
    def freq(self) -> Freq[int] | Freq[float]: ...
    @property
    def intensity(self) -> int: ...
    @property
    def offset(self) -> int: ...
    @property
    def phase(self) -> Angle: ...
    @property
    def clamp(self) -> bool: ...
