import * as VScript from "http://172.16.0.12/bladerunner_sdk/vscript@2.5.2/deno/release/mod.ts";
import * as VAPI from "./mod.ts";
export const lift = {
  ClockQuality: (
    _raw: [VAPI.PTP.ClockClass, VAPI.PTP.ClockAccuracy, number],
    _socket: VScript.VSocket,
  ): ClockQuality => {
    return {
      clock_class: _raw[0],
      clock_accuracy: _raw[1],
      offset_scaled_log_variance: _raw[2],
    };
  },
  PortIdentity: (
    _raw: [Array<number>, number],
    _socket: VScript.VSocket,
  ): PortIdentity => {
    return {
      clock_identity: _raw[0],
      port_number: _raw[1],
    };
  },
  Traits: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new Traits(_raw),
} as const;
export const lower = {
  ClockQuality: (
    _x: {
      clock_class: VAPI.PTP.ClockClass;
      clock_accuracy: VAPI.PTP.ClockAccuracy;
      offset_scaled_log_variance: VAPI.Primitives.Unsigned16;
    },
    _socket: VScript.VSocket,
  ): [VAPI.PTP.ClockClass, VAPI.PTP.ClockAccuracy, number] => [
    _x.clock_class,
    _x.clock_accuracy,
    _x.offset_scaled_log_variance,
  ],
  PortIdentity: (
    _x: {
      /**
      ClockIdentity as defined by the PTP standard, stored in big-endian
      order.
    */
      clock_identity: VAPI.PTP.ClockIdentity;
      port_number: VAPI.Primitives.Unsigned16;
    },
    _socket: VScript.VSocket,
  ): [Array<number>, number] => [_x.clock_identity, _x.port_number],
  Traits: (_x: Traits) => _x.raw.kwl,
} as const;
export type ClockAccuracy =
  | "Reserved"
  | "AccurateToWithin25ns"
  | "AccurateToWithin100ns"
  | "AccurateToWithin250ns"
  | "AccurateToWithin1000ns"
  | "AccurateToWithin2500ns"
  | "AccurateToWithin10us"
  | "AccurateToWithin25us"
  | "AccurateToWithin100us"
  | "AccurateToWithin250us"
  | "AccurateToWithin1000us"
  | "AccurateToWithin2500us"
  | "AccurateToWithin10ms"
  | "AccurateToWithin25ms"
  | "AccurateToWithin100ms"
  | "AccurateToWithin250ms"
  | "AccurateToWithin1s"
  | "AccurateToWithin10s"
  | "AccuracyBelow10s"
  | "ProfileSpecific"
  | "Unknown";
export type ClockClass =
  | "Reserved"
  | "SynchronizedToPrimary"
  | "WasSynchronizedToPrimaryNowInHoldOver"
  | "SynchronizedToAppSpecific"
  | "WasSynchronizedToAppSpecificNowInHoldOver"
  | "WasSynchronizedToPrimaryDegradAlternativeA"
  | "WasSynchronizedToAppSpecificDegradAlternativeA"
  | "ProfileSpecific"
  | "WasSynchronizedToPrimaryDegradAlternativeB"
  | "WasSynchronizedToAppSpecificDegradAlternativeB"
  | "Default"
  | "ReservedForV1Compatibility"
  | "SlaveOnly";
/**
  ClockIdentity as defined by the PTP standard, stored in big-endian order.
*/
export type ClockIdentity = Array<number>;
export interface ClockQuality {
  clock_class: VAPI.PTP.ClockClass;
  clock_accuracy: VAPI.PTP.ClockAccuracy;
  offset_scaled_log_variance: VAPI.Primitives.Unsigned16;
}
/**
  Most clock control units continuously adjust their target's operating
  frequency until the time and/or frequency offset between source and target
  matches a user-defined value. These units require no data beyond frame
  rate, source type, frequency offset and offset.
  
  However, other clock operations implicitly guarantee synchronicity by
  rigidly linking their target's operating frequency to the source frequency.
  This implicit link may be broken when the timing source changes
  discontinuously. For example, an uncalibrated PTP clock may perform
  arbitrarily large offset and/or frequency jumps, yet after reachieving
  calibration will again report its offset to the internal PTP reference
  frame as 0.0 ± 0.0. To signal such 'timing shocks' to consumers, every
  timing source performing discontinuous changes in a way that breaks
  implicit synchronicity has to increase its continuity_index (with
  wraparound behaviour in the unlikely case of overflow).
*/
export type ContinuityIndex = number;
export type Domain = number;
export interface PortIdentity {
  /**
    ClockIdentity as defined by the PTP standard, stored in big-endian order.
  */
  clock_identity: VAPI.PTP.ClockIdentity;
  port_number: VAPI.Primitives.Unsigned16;
}
export type SourceType =
  | "AtomicClock"
  | "GPS"
  | "TerrestrialRadio"
  | "PTP"
  | "NTP"
  | "HandSet"
  | "Other"
  | "InternalOscillator"
  | "ProfileSpecific"
  | "Reserved";
export type TimeScale = "PTP" | "Arbitrary";
export type Traceability = "NotTraceable" | "FrequencyTraceable" | "Traceable";
export class Traits implements VScript.Referenceable<"PTP::Data::Traits"> {
  readonly type_identifier = "PTP::Data::Traits" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  get domain(): VScript.rKeyword<
    VScript.VSocket,
    null | number,
    null | VAPI.PTP.Domain,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | number,
      null | VAPI.PTP.Domain,
      VAPI.PTP.Traits
    >(this, "domain" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get alternate_master(): VScript.rKeyword<
    VScript.VSocket,
    null | boolean,
    null | boolean,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | boolean,
      null | boolean,
      VAPI.PTP.Traits
    >(this, "alternate_master" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get leap61(): VScript.rKeyword<
    VScript.VSocket,
    null | boolean,
    null | boolean,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | boolean,
      null | boolean,
      VAPI.PTP.Traits
    >(this, "leap61" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get leap59(): VScript.rKeyword<
    VScript.VSocket,
    null | boolean,
    null | boolean,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | boolean,
      null | boolean,
      VAPI.PTP.Traits
    >(this, "leap59" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get ptp_timescale(): VScript.rKeyword<
    VScript.VSocket,
    null | VAPI.PTP.TimeScale,
    null | VAPI.PTP.TimeScale,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | VAPI.PTP.TimeScale,
      null | VAPI.PTP.TimeScale,
      VAPI.PTP.Traits
    >(this, "ptp_timescale" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get traceability(): VScript.rKeyword<
    VScript.VSocket,
    VAPI.PTP.Traceability,
    VAPI.PTP.Traceability,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      VAPI.PTP.Traceability,
      VAPI.PTP.Traceability,
      VAPI.PTP.Traits
    >(this, "traceability" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get utc_offset_seconds(): VScript.rKeyword<
    VScript.VSocket,
    null | number,
    null | VAPI.Primitives.Signed8,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | number,
      null | VAPI.Primitives.Signed8,
      VAPI.PTP.Traits
    >(this, "utc_offset_seconds" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get source_type(): VScript.rKeyword<
    VScript.VSocket,
    VAPI.PTP.SourceType,
    VAPI.PTP.SourceType,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      VAPI.PTP.SourceType,
      VAPI.PTP.SourceType,
      VAPI.PTP.Traits
    >(this, "source_type" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get port_identity(): VScript.rKeyword<
    VScript.VSocket,
    [Array<number>, number],
    VAPI.PTP.PortIdentity,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      [Array<number>, number],
      VAPI.PTP.PortIdentity,
      VAPI.PTP.Traits
    >(this, "port_identity" as VScript.SysName, {
      lift: VAPI.PTP.lift.PortIdentity,
      lower: VAPI.PTP.lower.PortIdentity,
    });
  }
  get grandmaster_priority_1(): VScript.rKeyword<
    VScript.VSocket,
    null | number,
    null | VAPI.Primitives.Unsigned8,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | number,
      null | VAPI.Primitives.Unsigned8,
      VAPI.PTP.Traits
    >(this, "grandmaster_priority_1" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get grandmaster_clock_quality(): VScript.rKeyword<
    VScript.VSocket,
    [VAPI.PTP.ClockClass, VAPI.PTP.ClockAccuracy, number],
    VAPI.PTP.ClockQuality,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      [VAPI.PTP.ClockClass, VAPI.PTP.ClockAccuracy, number],
      VAPI.PTP.ClockQuality,
      VAPI.PTP.Traits
    >(this, "grandmaster_clock_quality" as VScript.SysName, {
      lift: VAPI.PTP.lift.ClockQuality,
      lower: VAPI.PTP.lower.ClockQuality,
    });
  }
  get grandmaster_priority_2(): VScript.rKeyword<
    VScript.VSocket,
    null | number,
    null | VAPI.Primitives.Unsigned8,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      null | number,
      null | VAPI.Primitives.Unsigned8,
      VAPI.PTP.Traits
    >(this, "grandmaster_priority_2" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }

  /**
    ClockIdentity as defined by the PTP standard, stored in big-endian order.
  */
  get grandmaster_identity(): VScript.rKeyword<
    VScript.VSocket,
    Array<number>,
    VAPI.PTP.ClockIdentity,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      Array<number>,
      VAPI.PTP.ClockIdentity,
      VAPI.PTP.Traits
    >(this, "grandmaster_identity" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get steps_removed(): VScript.rKeyword<
    VScript.VSocket,
    number,
    VAPI.Primitives.Unsigned16,
    VAPI.PTP.Traits
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      number,
      VAPI.Primitives.Unsigned16,
      VAPI.PTP.Traits
    >(this, "steps_removed" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
}
export const Enums = {
  Traceability: [
    "NotTraceable",
    "FrequencyTraceable",
    "Traceable",
  ] as Traceability[],
  TimeScale: ["PTP", "Arbitrary"] as TimeScale[],
  SourceType: [
    "AtomicClock",
    "GPS",
    "TerrestrialRadio",
    "PTP",
    "NTP",
    "HandSet",
    "Other",
    "InternalOscillator",
    "ProfileSpecific",
    "Reserved",
  ] as SourceType[],
  ClockClass: [
    "Reserved",
    "SynchronizedToPrimary",
    "WasSynchronizedToPrimaryNowInHoldOver",
    "SynchronizedToAppSpecific",
    "WasSynchronizedToAppSpecificNowInHoldOver",
    "WasSynchronizedToPrimaryDegradAlternativeA",
    "WasSynchronizedToAppSpecificDegradAlternativeA",
    "ProfileSpecific",
    "WasSynchronizedToPrimaryDegradAlternativeB",
    "WasSynchronizedToAppSpecificDegradAlternativeB",
    "Default",
    "ReservedForV1Compatibility",
    "SlaveOnly",
  ] as ClockClass[],
  ClockAccuracy: [
    "Reserved",
    "AccurateToWithin25ns",
    "AccurateToWithin100ns",
    "AccurateToWithin250ns",
    "AccurateToWithin1000ns",
    "AccurateToWithin2500ns",
    "AccurateToWithin10us",
    "AccurateToWithin25us",
    "AccurateToWithin100us",
    "AccurateToWithin250us",
    "AccurateToWithin1000us",
    "AccurateToWithin2500us",
    "AccurateToWithin10ms",
    "AccurateToWithin25ms",
    "AccurateToWithin100ms",
    "AccurateToWithin250ms",
    "AccurateToWithin1s",
    "AccurateToWithin10s",
    "AccuracyBelow10s",
    "ProfileSpecific",
    "Unknown",
  ] as ClockAccuracy[],
} as const;
