diff --git a/.gitignore b/.gitignore index 01eb8a521c..6ff7c7909b 100644 --- a/.gitignore +++ b/.gitignore @@ -336,3 +336,4 @@ ASALocalRun/ # Ignore Mac DS_Store files .DS_Store +/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1-backups diff --git a/src/Iot.Device.Bindings/CompatibilitySuppressions.xml b/src/Iot.Device.Bindings/CompatibilitySuppressions.xml index fa60bbdc88..bd888108bf 100644 --- a/src/Iot.Device.Bindings/CompatibilitySuppressions.xml +++ b/src/Iot.Device.Bindings/CompatibilitySuppressions.xml @@ -127,6 +127,13 @@ lib/net6.0/Iot.Device.Bindings.dll true + + CP0002 + M:Iot.Device.Nmea0183.Sentences.WaterSpeedAndAngle.#ctor(UnitsNet.Angle,UnitsNet.Angle,UnitsNet.Speed) + lib/net6.0/Iot.Device.Bindings.dll + lib/net6.0/Iot.Device.Bindings.dll + true + CP0002 M:Iot.Device.Ssd13xx.Ssd1306.#ctor(System.Device.I2c.I2cDevice) @@ -267,6 +274,13 @@ lib/netstandard2.0/Iot.Device.Bindings.dll true + + CP0002 + M:Iot.Device.Nmea0183.Sentences.WaterSpeedAndAngle.#ctor(UnitsNet.Angle,UnitsNet.Angle,UnitsNet.Speed) + lib/netstandard2.0/Iot.Device.Bindings.dll + lib/netstandard2.0/Iot.Device.Bindings.dll + true + CP0002 M:Iot.Device.Ssd13xx.Ssd1306.#ctor(System.Device.I2c.I2cDevice) diff --git a/src/devices/Nmea0183/Nmea0183.sln b/src/devices/Nmea0183/Nmea0183.sln index 8f26c24003..511dd20c10 100644 --- a/src/devices/Nmea0183/Nmea0183.sln +++ b/src/devices/Nmea0183/Nmea0183.sln @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common", "..\Common\Common. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleParser", "samples\SimpleParser\SimpleParser.csproj", "{C66E7575-9ECA-4329-A145-1DCADE028DDC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seatalk1", "..\Seatalk1\Seatalk1.csproj", "{4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -83,6 +85,18 @@ Global {C66E7575-9ECA-4329-A145-1DCADE028DDC}.Windows-Debug|Any CPU.Build.0 = Debug|Any CPU {C66E7575-9ECA-4329-A145-1DCADE028DDC}.Windows-Release|Any CPU.ActiveCfg = Release|Any CPU {C66E7575-9ECA-4329-A145-1DCADE028DDC}.Windows-Release|Any CPU.Build.0 = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Linux-Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Linux-Debug|Any CPU.Build.0 = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Linux-Release|Any CPU.ActiveCfg = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Linux-Release|Any CPU.Build.0 = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Release|Any CPU.Build.0 = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Windows-Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Windows-Debug|Any CPU.Build.0 = Debug|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Windows-Release|Any CPU.ActiveCfg = Release|Any CPU + {4C6A3828-5AC7-42AD-BE8A-111DF1D46C8E}.Windows-Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/devices/Nmea0183/Sentences/AutopilotStatus.cs b/src/devices/Nmea0183/Sentences/AutopilotStatus.cs new file mode 100644 index 0000000000..7e327932b9 --- /dev/null +++ b/src/devices/Nmea0183/Sentences/AutopilotStatus.cs @@ -0,0 +1,67 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Nmea0183.Sentences +{ + /// + /// The current state of the autopilot + /// + public enum AutopilotStatus + { + /// + /// The autopilot controller is offline or not present + /// + Offline, + + /// + /// The autopilot is in standby mode (= manual steering is active) + /// + Standby, + + /// + /// The autopilot is in auto mode. For most controllers, this means "desired heading" mode. + /// + Auto, + + /// + /// The autopilot is in desired track mode (following a planned route) + /// + Track, + + /// + /// The autopilot is in Wind mode (keeping the relative wind angle constant) + /// + Wind, + + /// + /// The autopilot is in track mode, but inactive + /// + InactiveTrack, + + /// + /// The autopilot is in wind mode, but inactive + /// + InactiveWind, + + /// + /// The autopilot is in calibration mode + /// + Calibration, + + /// + /// Direct rudder control mode + /// + RudderControl, + + /// + /// The state is unknown + /// + Undefined, + } +} diff --git a/src/devices/Nmea0183/Sentences/HeadingAndTrackControl.cs b/src/devices/Nmea0183/Sentences/HeadingAndTrackControl.cs new file mode 100644 index 0000000000..f8f8fc3878 --- /dev/null +++ b/src/devices/Nmea0183/Sentences/HeadingAndTrackControl.cs @@ -0,0 +1,284 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnitsNet; + +namespace Iot.Device.Nmea0183.Sentences +{ + /// + /// HTC sequence. This is used to control an attached auto-pilot. + /// Documentation of this sentence is very poor, and one has to dig deep + /// to find information about it. + /// Since the actual encoding might be autopilot-dependent, this message outputs all values in raw format. + /// + /// + /// This class is preliminary and pending verification. + /// + public class HeadingAndTrackControl : NmeaSentence + { + /// + /// This sentence's id + /// + public static SentenceId Id => new SentenceId("HTC"); + private static bool Matches(SentenceId sentence) => Id == sentence; + private static bool Matches(TalkerSentence sentence) => Matches(sentence.Id); + + /// + /// Initialize a new instance of this type. + /// See the individual properties for further explanation to the parameters. + /// + /// Status of Autopilot (see ) + /// Commanded rudder angle + /// Rudder direction + /// Turn mode + /// Rudder limit + /// Off-Heading limit + /// Desired turn radius + /// Desired rate of turn + /// Desired heading + /// Desired off-track limit + /// Commanded track direction + /// Heading uses true angles + public HeadingAndTrackControl(string status, Angle? commandedRudderAngle, string commandedRudderDirection, string turnMode, + Angle? rudderLimit, Angle? offHeadingLimit, Length? turnRadius, RotationalSpeed? rateOfTurn, Angle? desiredHeading, Length? offTrackLimit, Angle? commandedTrack, bool headingIsTrue) + : base(OwnTalkerId, Id, DateTimeOffset.UtcNow) + { + Valid = true; + Status = status; + DesiredHeading = desiredHeading; + CommandedRudderAngle = commandedRudderAngle; + HeadingIsTrue = headingIsTrue; + CommandedRudderDirection = commandedRudderDirection; + TurnMode = turnMode; + RudderLimit = rudderLimit; + OffHeadingLimit = offHeadingLimit; + TurnRadius = turnRadius; + RateOfTurn = rateOfTurn; + OffTrackLimit = offTrackLimit; + CommandedTrack = commandedTrack; + } + + /// + /// Internal constructor + /// + public HeadingAndTrackControl(TalkerSentence sentence, DateTimeOffset time) + : this(sentence.TalkerId, Matches(sentence) ? sentence.Fields : throw new ArgumentException($"SentenceId does not match expected id '{Id}'"), time) + { + } + + /// + /// Parsing constructor. + /// + public HeadingAndTrackControl(TalkerId talkerId, IEnumerable fields, DateTimeOffset time) + : base(talkerId, Id, time) + { + IEnumerator field = fields.GetEnumerator(); + + string manualOverride = ReadString(field); + CommandedRudderAngle = AsAngle(ReadValue(field)); + CommandedRudderDirection = ReadString(field); + + string autoPilotMode = ReadString(field); + TurnMode = ReadString(field); + RudderLimit = AsAngle(ReadValue(field)); + OffHeadingLimit = AsAngle(ReadValue(field)); + TurnRadius = AsLength(ReadValue(field)); + double? turnRate = ReadValue(field); + RateOfTurn = turnRate.HasValue ? RotationalSpeed.FromDegreesPerSecond(turnRate.Value) : null; + DesiredHeading = AsAngle(ReadValue(field)); + OffTrackLimit = AsLength(ReadValue(field)); + CommandedTrack = AsAngle(ReadValue(field)); + string headingReference = ReadString(field); + + // If override is active ("A"), then we treat this as standby + if (manualOverride == "A") + { + Status = "A"; + Valid = true; + } + else + { + // It appears that on the NMEA2000 side, various proprietary messages are also used to control the autopilot, + // hence this is missing some states, such as Wind mode. + Status = autoPilotMode; + Valid = true; + } + + HeadingIsTrue = headingReference == "T"; + } + + /// + /// Autopilot status. Known values: + /// M = Manual + /// S = Stand-alone heading control + /// H = Heading control with external source + /// T = Track control + /// R = Direct rudder control + /// Anything else = ??? + /// + public string Status { get; private set; } + + /// + /// Heading to steer. + /// + public Angle? DesiredHeading { get; private set; } + + /// + /// Angle for directly controlling the rudder. Unsigned. (See ) + /// + public Angle? CommandedRudderAngle { get; private set; } + + /// + /// True if all angles are true, otherwise false. + /// + public bool HeadingIsTrue { get; private set; } + + /// + /// Commanded rudder direction "L" or "R" for port/starboard. + /// + public string CommandedRudderDirection { get; private set; } + + /// + /// Turn mode (probably only valid for very expensive autopilots) + /// Known values: + /// R = Radius controlled + /// T = Turn rate controlled + /// N = Neither + /// + public string TurnMode { get; private set; } + + /// + /// Maximum rudder angle + /// + public Angle? RudderLimit { get; private set; } + + /// + /// Maximum off-heading limit (in heading control mode) + /// + public Angle? OffHeadingLimit { get; private set; } + + /// + /// Desired turn Radius (when is "R") + /// + public Length? TurnRadius { get; private set; } + + /// + /// Desired turn rate (when is "T") + /// Base unit is degrees/second + /// + public RotationalSpeed? RateOfTurn { get; private set; } + + /// + /// Off-track warning limit, unsigned. + /// + public Length? OffTrackLimit { get; private set; } + + /// + /// Commanded track + /// + public Angle? CommandedTrack { get; private set; } + + /// + public override bool ReplacesOlderInstance => true; + + /// + public override string ToNmeaParameterList() + { + if (!Valid) + { + return string.Empty; + } + + StringBuilder b = new StringBuilder(); + b.Append(Status == "M" ? "A," : "V,"); + b.Append(FromAngle(CommandedRudderAngle)); + b.Append(CommandedRudderDirection + ","); + b.Append(Status + ","); + b.Append(TurnMode + ","); + b.Append(FromAngle(RudderLimit)); + b.Append(FromAngle(OffHeadingLimit)); + b.Append(FromLength(TurnRadius)); + if (RateOfTurn.HasValue) + { + b.Append(RateOfTurn.Value.DegreesPerSecond.ToString("F1", CultureInfo.InvariantCulture) + ","); + } + else + { + b.Append(','); + } + + b.Append(FromAngle(DesiredHeading)); + b.Append(FromLength(OffTrackLimit)); + b.Append(FromAngle(CommandedTrack)); + b.Append(HeadingIsTrue ? "T" : "M"); + + return b.ToString(); + } + + /// + public override string ToReadableContent() + { + return $"Mode: {Status}, CommandedTrack: {CommandedTrack}, TurnMode: {TurnMode}"; + } + + /// + /// Get a nullable double field as angle + /// + /// Input angle + /// An angle or null, if the input is null + protected static Angle? AsAngle(double? value) + { + if (value.HasValue) + { + return Angle.FromDegrees(value.Value); + } + + return null; + } + + /// + /// Translate as nullable angle to a value in degrees with one digit + /// + /// Angle to translate + /// The translated angle or just a comma + protected static string FromAngle(Angle? angle) + { + if (!angle.HasValue) + { + return ","; + } + else + { + return angle.Value.Degrees.ToString("F1", CultureInfo.InvariantCulture) + ","; + } + } + + private static Length? AsLength(double? value) + { + if (value.HasValue) + { + return Length.FromNauticalMiles(value.Value); + } + + return null; + } + + private static string FromLength(Length? length) + { + if (length.HasValue == false) + { + return ","; + } + else + { + return length.Value.NauticalMiles.ToString("F1", CultureInfo.InvariantCulture) + ","; + } + } + } +} diff --git a/src/devices/Nmea0183/Sentences/HeadingAndTrackControlStatus.cs b/src/devices/Nmea0183/Sentences/HeadingAndTrackControlStatus.cs new file mode 100644 index 0000000000..868f9bb90b --- /dev/null +++ b/src/devices/Nmea0183/Sentences/HeadingAndTrackControlStatus.cs @@ -0,0 +1,114 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnitsNet; + +namespace Iot.Device.Nmea0183.Sentences +{ + /// + /// This is the status reply from the autopilot. It is similar to the HTC message with 4 extra fields. + /// + public class HeadingAndTrackControlStatus : HeadingAndTrackControl + { + /// + /// This sentence's id + /// + public static new SentenceId Id => new SentenceId("HTD"); + + private static bool Matches(SentenceId sentence) => Id == sentence; + + private static bool Matches(TalkerSentence sentence) => Matches(sentence.Id); + + /// + /// Initialize a new instance of this type. + /// See the individual properties for further explanation to the parameters. + /// + /// Status of Autopilot + /// Commanded rudder angle + /// Rudder direction + /// Turn mode + /// Rudder limit + /// Off-Heading limit + /// Desired turn radius + /// Desired rate of turn + /// Desired heading + /// Desired off-track limit + /// Commanded track direction + /// Heading uses true angles + /// True if rudder limit is exceeded + /// True if the heading is out of limits + /// True if the track limits are exceeded + /// Heading from the Autopilot's onw heading sensor + public HeadingAndTrackControlStatus(string status, Angle? commandedRudderAngle, string commandedRudderDirection, string turnMode, + Angle? rudderLimit, Angle? offHeadingLimit, Length? turnRadius, RotationalSpeed? rateOfTurn, Angle? desiredHeading, + Length? offTrackLimit, Angle? commandedTrack, bool headingIsTrue, + bool rudderLimitExceeded, bool headingLimitExceeded, bool trackLimitExceeded, Angle? actualHeading) + : base(status, commandedRudderAngle, commandedRudderDirection, turnMode, rudderLimit, offHeadingLimit, turnRadius, + rateOfTurn, desiredHeading, offTrackLimit, commandedTrack, headingIsTrue) + { + RudderLimitExceeded = rudderLimitExceeded; + HeadingLimitExceeded = headingLimitExceeded; + TrackLimitExceeded = trackLimitExceeded; + ActualHeading = actualHeading; + } + + /// + /// Internal constructor + /// + public HeadingAndTrackControlStatus(TalkerSentence sentence, DateTimeOffset time) + : base(sentence, time) + { + } + + /// + /// Decoding constructor + /// + public HeadingAndTrackControlStatus(TalkerId talkerId, IEnumerable fields, DateTimeOffset time) + : base(talkerId, fields, time) + { + IEnumerator field = fields.GetEnumerator(); + for (int i = 0; i < 13; i++) + { + field.MoveNext(); + } + + RudderLimitExceeded = ReadString(field) == "V"; + HeadingLimitExceeded = ReadString(field) == "V"; + TrackLimitExceeded = ReadString(field) == "V"; + ActualHeading = AsAngle(ReadValue(field)); + } + + /// + /// True if the rudder limit is exceeded + /// + public bool RudderLimitExceeded { get; } + + /// + /// True if the heading limit is exceeded + /// + public bool HeadingLimitExceeded { get; } + + /// + /// True if the track limit is exceeded + /// + public bool TrackLimitExceeded { get; } + + /// + /// The actual heading, from the Autopilot's own heading sensor + /// + public Angle? ActualHeading { get; } + + /// + public override string ToNmeaParameterList() + { + string ret = base.ToNmeaParameterList(); + var angleString = FromAngle(ActualHeading).Replace(",", string.Empty); // the last comma is not needed + return ret + FormattableString.Invariant($",{(RudderLimitExceeded ? "V" : "A")},{(HeadingLimitExceeded ? "V" : "A")},{(TrackLimitExceeded ? "V" : "A")},{angleString}"); + } + } +} diff --git a/src/devices/Nmea0183/Sentences/NmeaSentence.cs b/src/devices/Nmea0183/Sentences/NmeaSentence.cs index 086335dc5b..5bac28e4eb 100644 --- a/src/devices/Nmea0183/Sentences/NmeaSentence.cs +++ b/src/devices/Nmea0183/Sentences/NmeaSentence.cs @@ -205,7 +205,7 @@ protected string ReadString(IEnumerator field) return string.Empty; } - return field.Current; + return field.Current ?? string.Empty; } /// diff --git a/src/devices/Nmea0183/Sentences/RudderSensorAngle.cs b/src/devices/Nmea0183/Sentences/RudderSensorAngle.cs new file mode 100644 index 0000000000..07ab2e4fa0 --- /dev/null +++ b/src/devices/Nmea0183/Sentences/RudderSensorAngle.cs @@ -0,0 +1,130 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using UnitsNet; + +namespace Iot.Device.Nmea0183.Sentences +{ + /// + /// Rudder angle from rudder angle sensor (if fitted) + /// + public class RudderSensorAngle : NmeaSentence + { + /// + /// This sentence ID "RSA" + /// + public static SentenceId Id => new SentenceId("RSA"); + private static bool Matches(SentenceId sentence) => Id == sentence; + private static bool Matches(TalkerSentence sentence) => Matches(sentence.Id); + + /// + /// Constructs a new RSA sentence + /// + /// Starboard or single rudder angle (0 = centered) + /// Port rudder angle, if fitted + public RudderSensorAngle(Angle starboard, Angle? port) + : base(OwnTalkerId, Id, DateTimeOffset.UtcNow) + { + Starboard = starboard; + Port = port; + Valid = true; + } + + /// + /// Internal constructor + /// + public RudderSensorAngle(TalkerSentence sentence, DateTimeOffset time) + : this(sentence.TalkerId, Matches(sentence) ? sentence.Fields : throw new ArgumentException($"SentenceId does not match expected id '{Id}'"), time) + { + } + + /// + /// Date and time message (ZDA). This should not normally need the last time as argument, because it defines it. + /// + public RudderSensorAngle(TalkerId talkerId, IEnumerable fields, DateTimeOffset time) + : base(talkerId, Id, time) + { + IEnumerator field = fields.GetEnumerator(); + + double? starboard = ReadValue(field); + string valid = ReadString(field); + if (starboard.HasValue && valid == "A") + { + Starboard = Angle.FromDegrees(starboard.Value); + Valid = true; // The message is only valid if there's at least a stb sensor. + } + + double? port = ReadValue(field); + valid = ReadString(field); + if (port.HasValue && valid == "A") + { + Port = Angle.FromDegrees(port.Value); + } + } + + /// + /// This is true for this message type + /// + public override bool ReplacesOlderInstance => true; + + /// + /// Starboard or single rudder angle 0 = center, negative for turning to port. A negative rudder angle will thus reduce the heading. + /// + public Angle Starboard + { + get; + private set; + } + + /// + /// Port rudder angle. Null if not fitted (most boats will only have one rudder sensor, if at all) + /// + public Angle? Port + { + get; + private set; + } + + /// + /// Presents this message as output + /// + public override string ToNmeaParameterList() + { + if (Valid) + { + StringBuilder sb = new StringBuilder(); + sb.Append(Starboard.ToString("F1", CultureInfo.InvariantCulture) + ",A,"); + if (Port.HasValue) + { + sb.Append(Port.Value.ToString("F1", CultureInfo.InvariantCulture) + ",A"); + } + else + { + sb.Append(",V"); + } + + return sb.ToString(); + } + + return string.Empty; + } + + /// + public override string ToReadableContent() + { + if (Valid) + { + return $"Rudder Angle: {Starboard.Normalize(false).Degrees:F1}°"; + } + + return "No rudder sensor"; + } + } +} diff --git a/src/devices/Nmea0183/Sentences/SeatalkNmeaMessage.cs b/src/devices/Nmea0183/Sentences/SeatalkNmeaMessage.cs new file mode 100644 index 0000000000..36bb1517d7 --- /dev/null +++ b/src/devices/Nmea0183/Sentences/SeatalkNmeaMessage.cs @@ -0,0 +1,102 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnitsNet; + +namespace Iot.Device.Nmea0183.Sentences +{ + /// + /// This message wraps a Seatalk1 binary message into an NMEA0183 message + /// This is supported by some OpenCPN plugins, such as "Raymarine Autopilot" + /// The message is always sent with the identifier $STALK + /// + public class SeatalkNmeaMessage : NmeaSentence + { + /// + /// This sentence ID "ALK" + /// + public static SentenceId Id => new SentenceId("ALK"); + private static bool Matches(SentenceId sentence) => Id == sentence; + private static bool Matches(TalkerSentence sentence) => Matches(sentence.Id); + + /// + /// Constructs a new MWV sentence + /// + public SeatalkNmeaMessage(byte[] datagram) + : base(Nmea0183.TalkerId.Seatalk, Id, DateTimeOffset.UtcNow) + { + Datagram = datagram; + } + + /// + /// Internal constructor + /// + public SeatalkNmeaMessage(TalkerSentence sentence, DateTimeOffset time) + : this(sentence.TalkerId, Matches(sentence) ? sentence.Fields : throw new ArgumentException($"SentenceId does not match expected id '{Id}'"), time) + { + } + + /// + /// Standard decoding constructor + /// + public SeatalkNmeaMessage(TalkerId talkerId, IEnumerable fields, DateTimeOffset time) + : base(talkerId, Id, time) + { + List datagram = new List(20); + foreach (var field in fields) + { + if (byte.TryParse(field, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out byte b)) + { + datagram.Add(b); + } + else + { + throw new FormatException($"Invalid value in $TALK sequence: {field} is not a valid hex number"); + } + } + + Datagram = datagram.ToArray(); + Valid = true; + } + + /// + /// Directly create a message from a datagram + /// + /// Datagram, byte array + /// The current time + public SeatalkNmeaMessage(byte[] datagram, DateTimeOffset time) + : base(TalkerId.Seatalk, Id, time) + { + Datagram = datagram; + Valid = true; + } + + /// + /// This message type can embed various messages, some of them are not repeating (e.g. Keypresses) + /// + public override bool ReplacesOlderInstance => false; + + /// + public override string ToNmeaParameterList() + { + return string.Join(",", Datagram.Select(x => x.ToString("X2", CultureInfo.InvariantCulture))); + } + + /// + public override string ToReadableContent() + { + return $"$STALK," + string.Join(",", Datagram.Select(x => x.ToString("X2", CultureInfo.InvariantCulture))); + } + + /// + /// The Seatalk1 raw Datagram (up to 18 bytes) + /// + public byte[] Datagram { get; private set; } + } +} diff --git a/src/devices/Nmea0183/Sentences/WaterSpeedAndAngle.cs b/src/devices/Nmea0183/Sentences/WaterSpeedAndAngle.cs index a0ebb1541e..9a3bb1f10b 100644 --- a/src/devices/Nmea0183/Sentences/WaterSpeedAndAngle.cs +++ b/src/devices/Nmea0183/Sentences/WaterSpeedAndAngle.cs @@ -25,7 +25,7 @@ public class WaterSpeedAndAngle : NmeaSentence /// /// Constructs a new MWV sentence /// - public WaterSpeedAndAngle(Angle headingTrue, Angle headingMagnetic, Speed speed) + public WaterSpeedAndAngle(Angle? headingTrue, Angle? headingMagnetic, Speed speed) : base(OwnTalkerId, Id, DateTimeOffset.UtcNow) { Speed = speed; diff --git a/src/devices/Nmea0183/TalkerId.cs b/src/devices/Nmea0183/TalkerId.cs index 4180c8322b..ed276f1083 100644 --- a/src/devices/Nmea0183/TalkerId.cs +++ b/src/devices/Nmea0183/TalkerId.cs @@ -303,5 +303,10 @@ public bool Equals(TalkerId other) /// Filter placeholder for any talker id /// public static TalkerId Any => new TalkerId('*', ' '); + + /// + /// Seatalk messages wrapped up as NMEA data should always be prefixed $STALK + /// + public static TalkerId Seatalk => new TalkerId('S', 'T'); } } diff --git a/src/devices/Nmea0183/TalkerSentence.cs b/src/devices/Nmea0183/TalkerSentence.cs index dd1d029f31..698d25394a 100644 --- a/src/devices/Nmea0183/TalkerSentence.cs +++ b/src/devices/Nmea0183/TalkerSentence.cs @@ -47,6 +47,9 @@ public class TalkerSentence knownSentences[SatellitesInView.Id] = (sentence, time) => new SatellitesInView(sentence, time); knownSentences[WindDirectionWithRespectToNorth.Id] = (sentence, time) => new WindDirectionWithRespectToNorth(sentence, time); + knownSentences[HeadingAndTrackControl.Id] = (sentence, time) => new HeadingAndTrackControl(sentence, time); + knownSentences[SeatalkNmeaMessage.Id] = (sentence, time) => new SeatalkNmeaMessage(sentence, time); + knownSentences[RudderSensorAngle.Id] = (sentence, time) => new RudderSensorAngle(sentence, time); knownSentences[ProprietaryMessage.Id] = (sentence, time) => { var specificMessageId = sentence.Fields.FirstOrDefault(); diff --git a/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.cs b/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.cs index b74d77cdb1..b9fc9ff75d 100644 --- a/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.cs +++ b/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.cs @@ -3,15 +3,19 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Net; using System.Linq; using System.Net.Sockets; using System.Threading; +using Iot.Device; using Iot.Device.Common; using Iot.Device.Nmea0183; using Iot.Device.Nmea0183.Sentences; +using Iot.Device.Seatalk1; using UnitsNet; +using CommandLine; namespace Nmea.Simulator { @@ -23,11 +27,14 @@ internal class Simulator private SimulatorData _activeData; private NmeaTcpServer? _tcpServer; private NmeaUdpServer? _udpServer; + private SeatalkToNmeaConverter? _seatalkInterface; + private Random _random; public Simulator() { _activeData = new SimulatorData(); ReplayFiles = new List(); + _random = new Random(); } private List ReplayFiles @@ -35,27 +42,43 @@ private List ReplayFiles get; } - public static void Main(string[] args) + public static int Main(string[] args) { Console.WriteLine("Simple GNSS simulator"); Console.WriteLine("Usage: NmeaSimulator [options]"); - Console.WriteLine("Options are:"); - Console.WriteLine("--replay files Plays back the given NMEA log file in real time (only with shifted timestamps). Wildcards supported."); - Console.WriteLine(); + var parser = new Parser(x => + { + x.AutoHelp = true; + x.AutoVersion = true; + x.CaseInsensitiveEnumValues = true; + x.ParsingCulture = CultureInfo.InvariantCulture; + x.CaseSensitive = false; + x.HelpWriter = Console.Out; + }); + + var parsed = parser.ParseArguments(args); + if (parsed.Errors.Any()) + { + Console.WriteLine("Error in command line"); + return 1; + } + var sim = new Simulator(); - if (args.Length >= 2 && args[0] == "--replay") + if (!string.IsNullOrWhiteSpace(parsed.Value.ReplayFiles)) { - var wildCards = args[1]; + var wildCards = parsed.Value.ReplayFiles; FileInfo fi = new FileInfo(wildCards); string path = fi.DirectoryName ?? string.Empty; sim.ReplayFiles.AddRange(Directory.GetFiles(path, fi.Name)); } - sim.StartServer(); + sim.StartServer(parsed.Value.SeatalkInterface); + + return 0; } - private void StartServer() + private void StartServer(string seatalk) { _tcpServer = null; _udpServer = null; @@ -85,6 +108,16 @@ private void StartServer() _udpServer.StartDecode(); _udpServer.OnNewSequence += OnNewSequenceFromServer; + // Also optionally directly connect to the Seatalk1 bus. + // For simplicity, this example is not using a MessageRouter. + if (!string.IsNullOrWhiteSpace(seatalk)) + { + _seatalkInterface = new SeatalkToNmeaConverter("Seatalk1", seatalk); + _seatalkInterface.OnNewSequence += SeatalkNewSequence; + _seatalkInterface.SentencesToTranslate.Add(SentenceId.Any); + _seatalkInterface.StartDecode(); + } + Console.WriteLine("Waiting for connections. Press x to quit"); while (true) { @@ -106,6 +139,8 @@ private void StartServer() } finally { + _seatalkInterface?.StopDecode(); + _seatalkInterface?.Dispose(); _tcpServer?.StopDecode(); _udpServer?.StopDecode(); if (_simulatorThread != null) @@ -119,6 +154,11 @@ private void StartServer() } } + private void SeatalkNewSequence(NmeaSinkAndSource source, NmeaSentence sentence) + { + SendSentence(sentence); + } + // We're not really expecting input here. private void OnNewSequenceFromServer(NmeaSinkAndSource source, NmeaSentence sentence) { @@ -126,6 +166,11 @@ private void OnNewSequenceFromServer(NmeaSinkAndSource source, NmeaSentence sent { Console.WriteLine($"Received message: {sentence.ToReadableContent()} from {source.InterfaceName}"); } + + if (_seatalkInterface != null) + { + _seatalkInterface.SendSentence(source, sentence); + } } private void SendNewData() @@ -135,7 +180,7 @@ private void SendNewData() var data = _activeData; RecommendedMinimumNavigationInformation rmc = new RecommendedMinimumNavigationInformation(DateTimeOffset.UtcNow, NavigationStatus.Valid, data.Position, - data.Speed, data.Course, null); + data.SpeedOverGround, data.Course, null); SendSentence(rmc); GlobalPositioningSystemFixData gga = new GlobalPositioningSystemFixData( @@ -145,6 +190,19 @@ private void SendNewData() TimeDate zda = new TimeDate(DateTimeOffset.UtcNow); SendSentence(zda); + + WindSpeedAndAngle mwv = new WindSpeedAndAngle(data.WindDirectionRelative, data.WindSpeedRelative, true); + SendSentence(mwv); + + WaterSpeedAndAngle vhw = new WaterSpeedAndAngle(null, null, data.SpeedTroughWater); + SendSentence(vhw); + + // Test Seatalk message (understood by some OpenCPN plugins) + ////RawSentence sentence = new RawSentence(new TalkerId('S', 'T'), new SentenceId("ALK"), new string[] + ////{ + //// "84", "86", "26", "97", "02", "00", "00", "00", "08" + ////}, DateTimeOffset.UtcNow); + ////SendSentence(sentence); } catch (IOException x) { @@ -154,9 +212,9 @@ private void SendNewData() private void SendSentence(NmeaSentence sentence) { + Console.WriteLine($"Sending {sentence.ToReadableContent()}"); if (_tcpServer != null) { - Console.WriteLine($"Sending {sentence.ToReadableContent()}"); _tcpServer.SendSentence(sentence); } @@ -164,6 +222,11 @@ private void SendSentence(NmeaSentence sentence) { _udpServer.SendSentence(sentence); } + + if (_seatalkInterface != null) + { + _seatalkInterface.SendSentence(sentence); + } } private void MainSimulator() @@ -171,8 +234,13 @@ private void MainSimulator() while (!_terminate) { var newData = _activeData.Clone(); - GeographicPosition newPosition = GreatCircle.CalcCoords(newData.Position, _activeData.Course, - _activeData.Speed * UpdateRate); + newData.SpeedOverGround = UnitMath.Clamp(newData.SpeedOverGround + Speed.FromKnots(_random.NextDouble() - 0.5), Speed.Zero, Speed.FromKnots(12)); + newData.SpeedTroughWater = UnitMath.Clamp(newData.SpeedOverGround + Speed.FromKnots(1.5), Speed.Zero, Speed.FromKnots(10.0)); + newData.WindSpeedRelative = UnitMath.Clamp(newData.WindSpeedRelative + Speed.FromKnots(_random.NextDouble() - 0.5), Speed.Zero, Speed.FromKnots(65)); + newData.WindDirectionRelative = newData.WindDirectionRelative + Angle.FromDegrees(_random.NextDouble() * 2.0); + newData.WindDirectionRelative = newData.WindDirectionRelative.Normalize(true); + GeographicPosition newPosition = GreatCircle.CalcCoords(newData.Position, newData.Course, + newData.SpeedOverGround * UpdateRate); newData.Position = newPosition; _activeData = newData; diff --git a/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.csproj b/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.csproj index 6058abc43b..cc55cef8f5 100644 --- a/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.csproj +++ b/src/devices/Nmea0183/samples/NmeaSimulator/NmeaSimulator.csproj @@ -6,8 +6,13 @@ Nmea.Simulator + + + + + diff --git a/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorArguments.cs b/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorArguments.cs new file mode 100644 index 0000000000..e628762962 --- /dev/null +++ b/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorArguments.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using CommandLine; + +namespace Nmea.Simulator +{ + internal class SimulatorArguments + { + public SimulatorArguments() + { + ReplayFiles = string.Empty; + SeatalkInterface = string.Empty; + } + + [Option("replay", HelpText = "Plays back the given NMEA log file in real time (only with shifted timestamps). Wildcards supported")] + public string ReplayFiles + { + get; + set; + } + + [Option("seatalk", HelpText = "Seatalk1 interface to connect to (for testing converters or autopilots)")] + public string SeatalkInterface + { + get; + set; + } + } +} diff --git a/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorData.cs b/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorData.cs index 421d1450fc..78106de6f7 100644 --- a/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorData.cs +++ b/src/devices/Nmea0183/samples/NmeaSimulator/SimulatorData.cs @@ -14,11 +14,18 @@ internal class SimulatorData : ICloneable { public SimulatorData() { - Position = new GeographicPosition(47.45, 9.59, 451.2); + Position = new GeographicPosition(47.49, 9.50, 451.2); Course = Angle.FromDegrees(350); - Speed = Speed.FromKnots(4.8); + SpeedOverGround = Speed.FromKnots(4.8); + WindSpeedRelative = Speed.FromKnots(10.2); + WindDirectionRelative = Angle.FromDegrees(-10.0); + SpeedTroughWater = Speed.FromKnots(5.2); } + public Angle WindDirectionRelative { get; set; } + + public Speed WindSpeedRelative { get; set; } + public GeographicPosition Position { get; @@ -31,12 +38,14 @@ public Angle Course set; } - public Speed Speed + public Speed SpeedOverGround { get; set; } + public Speed SpeedTroughWater { get; set; } + object ICloneable.Clone() { return MemberwiseClone(); diff --git a/src/devices/Nmea0183/tests/SentenceTests.cs b/src/devices/Nmea0183/tests/SentenceTests.cs index 8cc6099f9c..4072d73678 100644 --- a/src/devices/Nmea0183/tests/SentenceTests.cs +++ b/src/devices/Nmea0183/tests/SentenceTests.cs @@ -495,6 +495,30 @@ public void DontCrashOnTheseInvalidSentences(string sentence) } } + [Fact] + public void HtcEncode() + { + var hdt = new HeadingAndTrackControl("M", null, "L", "N", null, null, null, null, null, null, null, true); + var msg = hdt.ToNmeaParameterList(); + Assert.Equal("A,,L,M,N,,,,,,,,T", msg); + + hdt = new HeadingAndTrackControl("H", Angle.FromDegrees(10.21), "L", "N", null, null, Length.FromNauticalMiles(22.29), null, null, null, Angle.FromDegrees(2), false); + msg = hdt.ToNmeaParameterList(); + Assert.Equal("V,10.2,L,H,N,,,22.3,,,,2.0,M", msg); + } + + [Fact] + public void StalkEncode() + { + var talk = new SeatalkNmeaMessage(new byte[] + { + 0x9c, 00, 01 + }); + + var msg = talk.ToNmeaParameterList(); + Assert.Equal("9C,00,01", msg); + } + [Theory] [InlineData("$GPRMC,211730.997,A,3511.28000,S,13823.26000,E,7.000,229.000,190120,,*19")] [InlineData("$GPRMC,115613.000,A,4729.49750,N,00930.39830,E,1.600,36.200,240520,1.900,E,D*34")] @@ -523,6 +547,7 @@ public void DontCrashOnTheseInvalidSentences(string sentence) [InlineData("$ECMDA,30.12,I,1.020,B,18.5,C,,C,38.7,,4.2,C,,T,,M,,N,,M*37")] [InlineData("$YDGSV,5,1,18,19,29,257,45,22,30,102,45,04,76,143,44,06,47,295,42*73")] [InlineData("!AIVDM,1,1,,B,ENk`sR9`92ah97PR9h0W1T@1@@@=MTpS<7GFP00003vP000,2*4B")] + [InlineData("$STALK,84,86,26,97,02,00,00,00,08*6F")] public void SentenceRoundTrip(string input) { var inSentence = TalkerSentence.FromSentenceString(input, out var error); @@ -574,6 +599,7 @@ public void SentenceRoundTrip(string input) [InlineData("$HCHDG,30.9,,,1.9,E")] [InlineData("$YDVHW,,T,,M,3.1,N,5.7,K,*64")] [InlineData("$YDMWD,336.8,T,333.8,M,21.6,N,11.1,M*58")] + [InlineData("$APRSA,12.2,A,,V")] public void CanParseAllTheseMessages(string input) { var inSentence = TalkerSentence.FromSentenceString(input, out var error); @@ -603,6 +629,10 @@ public void CanParseAllTheseMessages(string input) [InlineData("$YDVHW,,T,,M,3.1,N,5.7,K,")] [InlineData("$YDGSV,5,1,18,19,29,257,45,22,30,102,45,04,76,143,44,06,47,295,42")] [InlineData("$YDMWD,336.8,T,333.8,M,21.6,N,11.1,M")] + [InlineData("$APHTC,V,10.0,L,R,N,12.3,13.4,2.0,1.0,15.1,0.5,16.2,T")] + [InlineData("$APHTD,V,10.0,L,R,N,12.0,13.5,2.0,1.0,15.1,0.5,16.2,T,V,A,V,123.2")] + [InlineData("$STALK,84,86,26,97,02,00,00,00,08")] + [InlineData("$STALK,9C,01,12,00")] public void SentenceRoundTripIsUnaffectedByCulture(string input) { // de-DE has "," as decimal separator. Big trouble if using CurrentCulture for any parsing or formatting here @@ -639,6 +669,7 @@ public void SentenceRoundTripIsUnaffectedByCulture(string input) [InlineData("$YDVHW,,T,,M,3.1,N,5.7,K,")] [InlineData("$YDGSV,5,1,18,19,29,257,45,22,30,102,45,04,76,143,44,06,47,295,42")] [InlineData("$YDMWD,336.8,T,333.8,M,21.6,N,11.1,M")] + [InlineData("$APHTD,V,10.0,L,R,N,12,13,2.5,1.0,15.1,0.5,16.2,M")] public void TwoWaysOfGettingSentenceAreEqual(string input) { // de-DE has "," as decimal separator. Big trouble if using CurrentCulture for any parsing or formatting here diff --git a/src/devices/Seatalk1/AutoPilotRemoteController.cs b/src/devices/Seatalk1/AutoPilotRemoteController.cs new file mode 100644 index 0000000000..f6ad1ad39e --- /dev/null +++ b/src/devices/Seatalk1/AutoPilotRemoteController.cs @@ -0,0 +1,641 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Iot.Device.Common; +using Iot.Device.Nmea0183.Sentences; +using Iot.Device.Seatalk1.Messages; +using Microsoft.Extensions.Logging; +using UnitsNet; + +namespace Iot.Device.Seatalk1 +{ + /// + /// Remote controller for an autopilot connected via Seatalk1. To get an instance of this class, call . + /// + /// + /// Type is not disposable, to prevent accidental disposal by clients. They don't get ownership of the instance. + /// + public class AutoPilotRemoteController : MarshalByRefObject + { + private const double AngleEpsilon = 1.1; // The protocol can only give angles in whole degrees + private static readonly TimeSpan MaximumTimeout = TimeSpan.FromSeconds(6); + private readonly SeatalkInterface _parentInterface; + private readonly object _lock = new object(); + private readonly ILogger _logger; + private ConcurrentDictionary _calibrationParameters; + + private DateTime _lastUpdateTime = new DateTime(0); + private bool _buttonOnApPressed = false; + + /// + /// Internal constructor, used by the owning instance of + /// + /// The owner + internal AutoPilotRemoteController(SeatalkInterface parentInterface) + { + _logger = this.GetCurrentClassLogger(); + _calibrationParameters = new(); + _parentInterface = parentInterface ?? throw new ArgumentNullException(nameof(parentInterface)); + _parentInterface.MessageReceived += AutopilotMessageInterpretation; + RudderAngleAvailable = false; + Status = AutopilotStatus.Offline; + Alarms = AutopilotAlarms.None; + DeadbandMode = DeadbandMode.Automatic; + DefaultTimeout = TimeSpan.FromSeconds(3); + } + + /// + /// Current value of the heading sensor internal to the autopilot (if present). + /// When the autopilot controller has such a sensor, this value is always available, however it is + /// useless on tiler pilots such as ST2000 in standby mode, because that one needs to be removed from the tiller for manual steering and thus + /// will read random values. + /// + public Angle? AutopilotHeading { get; private set; } + + /// + /// Desired heading of the autopilot. + /// This value is only valid when the autopilot is active (not standby) + /// + public Angle? AutopilotDesiredHeading { get; private set; } + + /// + /// Current rudder angle. Positive for turning to starboard. + /// This value is only available when a rudder position sensor is fitted. + /// + public Angle? RudderAngle { get; private set; } + + /// + /// True when the rudder angle is valid. This stays false when either no rudder sensor is fitted or the reported values are apparently wrong. + /// + public bool RudderAngleAvailable { get; private set; } + + /// + /// Current status of the autopilot + /// + public AutopilotStatus Status { get; private set; } + + /// + /// Active autopilot alarms + /// + public AutopilotAlarms Alarms { get; private set; } + + /// + /// Current deadband mode. The value is only meaningful in auto mode + /// + public DeadbandMode DeadbandMode { get; private set; } + + /// + /// Type of autopilot controller. Known values: 05 for 150G type, 08 for most other types + /// + public int AutopilotType { get; private set; } + + /// + /// Timeout for changing the status + /// + public TimeSpan DefaultTimeout { get; set; } + + /// + /// Current turning direction of the boat. Depending on the type, this may be derived from heading changes and therefore not really reliable. + /// + public TurnDirection TurnDirection { get; private set; } + + /// + /// True if the autopilot is active + /// + public bool IsOperating => Status is AutopilotStatus.Auto or AutopilotStatus.Track or AutopilotStatus.Wind; + + /// + /// True if the autopilot is in Standby + /// + public bool IsStandby => Status is AutopilotStatus.Standby or AutopilotStatus.InactiveTrack or AutopilotStatus.InactiveWind; + + /// + /// Warning flags from the course computer + /// + public CourseComputerWarnings CourseComputerStatus { get; private set; } + + /// + /// This event is fired when keys on the controller are pressed. + /// + public event Action? AutopilotKeysPressed; + + private void AutopilotMessageInterpretation(SeatalkMessage obj) + { + lock (_lock) + { + if (obj is CompassHeadingAutopilotCourse ch) + { + // Only update this when we see an autopilot message, otherwise we declare the autopilot as online + // if all we see is the echo of some of the repeating messages we send out. + _lastUpdateTime = DateTime.UtcNow; + Status = ch.AutopilotStatus; + AutopilotHeading = ch.CompassHeading; + AutopilotDesiredHeading = !IsStandby ? ch.AutoPilotCourse : null; + AutopilotType = ch.AutoPilotType; + TurnDirection = ch.TurnDirection; + if (!RudderAngleAvailable) + { + RudderAngleAvailable = !ch.RudderPosition.Equals(Angle.Zero, Angle.FromDegrees(0.5)); + } + + if (RudderAngleAvailable) + { + RudderAngle = ch.RudderPosition; + } + else + { + RudderAngle = null; + } + + Alarms = ch.Alarms; + } + else if (obj is CompassHeadingAndRudderPosition rb) + { + AutopilotHeading = rb.CompassHeading; + TurnDirection = rb.TurnDirection; + if (!RudderAngleAvailable) + { + RudderAngleAvailable = !rb.RudderPosition.Equals(Angle.Zero, Angle.FromDegrees(0.5)); + } + + if (RudderAngleAvailable) + { + RudderAngle = rb.RudderPosition; + } + else + { + RudderAngle = null; + } + } + else if (obj is DeadbandSetting dbs) + { + DeadbandMode = dbs.Mode; + } + else if (obj is Keystroke keystroke) + { + if (keystroke.Source != 1) + { + _buttonOnApPressed = true; + } + + AutopilotKeysPressed?.Invoke(keystroke); + } + else if (obj is AutopilotCalibrationParameterMessage calibParam) + { + _logger.LogInformation($"Received calibration value for {calibParam.Parameter}. Current {calibParam.CurrentSetting} Min {calibParam.MinValue} Max {calibParam.MaxValue}"); + _calibrationParameters.AddOrUpdate(calibParam.Parameter, x => calibParam, (a, b) => calibParam); + } + else if (obj is CourseComputerStatus status) + { + _logger.LogWarning($"Course computer has warnings: {status.Warnings}"); + CourseComputerStatus = status.Warnings; + } + + if (IsStandby || Status == AutopilotStatus.Offline) + { + DeadbandMode = DeadbandMode.Automatic; // Resets automatically when going to standby (the message is not sent periodically) + CourseComputerStatus = CourseComputerWarnings.None; + } + } + } + + /// + /// Change the autopilot status. + /// + /// The new desired status + /// When changing to track mode, confirm a turn in this direction. + /// True if the desired mode was reached, false if not. Reasons that this could fail are: Operation cancelled by user + /// (user pressed standby while remote control was trying to switch to auto); No data available for change to wind or track mode + /// + /// should initially be set to null. When requesting a change to track mode, it will return a value + /// indicating the required direction change to return to the track. Then call the method again with that value to confirm the change. + /// + public bool SetStatus(AutopilotStatus status, ref TurnDirection? directionConfirmation) + { + return SetStatus(status, DefaultTimeout, ref directionConfirmation); + } + + /// + /// Returns the currently known parameter values. + /// Note: The values can currently only be read out by manually entering the calibration mode once. + /// + /// A list of parameter values + public List GetCalibrationParameters() + { + return _calibrationParameters.Values.ToList(); + } + + /// + /// Attempts to set the Autopilot to the given state. + /// + /// The status to set + /// How long to try. For safety reasons (see remark) the maximum value is limited + /// If entering track mode (==), confirm a turn + /// in the given direction. If left null, will return the required direction for the turn. The method has then to be called again with the parameter set + /// True on success, false if the change didn't succeed within the timeout. Also returns false if a change to track mode wasn't confirmed yet. + /// + /// Don't be tempted to attempt to set the mode to Auto with a large timeout, as this could + /// override the user's desire to disable the Autopilot and is therefore VERY DANGEROUS! + /// + public bool SetStatus(AutopilotStatus newStatus, TimeSpan timeout, ref TurnDirection? directionConfirmation) + { + if (Status == newStatus && CourseComputerStatus == 0) + { + return true; // nothing to do + } + + if (Status == AutopilotStatus.Offline) + { + return false; + } + + AutopilotButtons buttonToPress = newStatus switch + { + AutopilotStatus.Auto => AutopilotButtons.Auto, + AutopilotStatus.Standby => AutopilotButtons.StandBy, + AutopilotStatus.Track => AutopilotButtons.PlusTen | AutopilotButtons.MinusTen, + AutopilotStatus.Wind => AutopilotButtons.Auto | AutopilotButtons.StandBy, + _ => throw new ArgumentException($"Status {newStatus} is not valid", nameof(newStatus)), + }; + + // For setting wind or track modes, we need to first set auto mode. + // Setting wind mode without auto works (and is returned as status 0x4), but has no visible effect. + if (newStatus == AutopilotStatus.Wind || newStatus == AutopilotStatus.Track) + { + if (!SendMessageAndVerifyStatus(new Keystroke(AutopilotButtons.Auto, 1), timeout, () => Status is AutopilotStatus.Auto or AutopilotStatus.Wind or AutopilotStatus.Track)) + { + return false; + } + } + + bool ret = SendMessageAndVerifyStatus(new Keystroke(buttonToPress, 1), timeout, () => (Status == newStatus) || ((newStatus == AutopilotStatus.Standby) && IsStandby)); + + if (ret && newStatus == AutopilotStatus.Track) + { + // Wait until the AP reports a course computer warning - and then just confirm it. + Stopwatch sw = Stopwatch.StartNew(); + // This needs a longer timeout, since it can take several seconds for the confirmation to appear + while (sw.Elapsed < TimeSpan.FromSeconds(5)) + { + if ((CourseComputerStatus & CourseComputerWarnings.DriveFailure) != 0) + { + TurnDirection directionRequired = + (CourseComputerStatus & CourseComputerWarnings.CourseChangeToPort) == CourseComputerWarnings.CourseChangeToPort ? TurnDirection.Port : TurnDirection.Starboard; + if (directionConfirmation == null) + { + directionConfirmation = directionRequired; + return false; + } + + if (directionRequired == directionConfirmation && + SendMessageAndVerifyStatus(new Keystroke(0x28, 1), timeout, + () => Status == AutopilotStatus.Track)) + { + CourseComputerStatus = 0; // Apparently, the clearance of this warning is not sent + break; + } + } + + Thread.Sleep(150); + } + + ret = Status == AutopilotStatus.Track && CourseComputerStatus == CourseComputerWarnings.None; + } + + return ret; + } + + /// + /// Change deadband mode + /// + /// The new mode + /// True if the value was set, false otherwise. This method fails if the autopilot is in standby mode + public bool SetDeadbandMode(DeadbandMode mode) + { + if (Status == AutopilotStatus.Offline || IsStandby) + { + // The Deadband mode can only be set in auto mode + return false; + } + + if (mode != DeadbandMode.Automatic && mode != DeadbandMode.Minimal) + { + throw new ArgumentException("Invalid Deadband mode", nameof(mode)); + } + + if (mode == DeadbandMode) + { + return true; + } + + Keystroke ks; + // If we are in automatic (default) mode, we need to send 0x0a to enter minimal deadband mode, + // but if we already are in minimal deadband mode, we need to send 0x09 to leave. + if (DeadbandMode == DeadbandMode.Automatic) + { + ks = new Keystroke(0x0A); + } + else + { + ks = new Keystroke(0x09); + } + + return SendMessageAndVerifyStatus(ks, DefaultTimeout, () => DeadbandMode == mode); + } + + /// + /// Turns to the desired heading + /// + /// New desired heading + /// Desired turn direction. Pass null for taking the default (shorter) turn. + /// True on success, false otherwise + /// This operation can take a significant time + public bool TurnTo(Angle degrees, TurnDirection? direction) + { + return TurnTo(degrees, direction, CancellationToken.None); + } + + /// + /// Same as , except in async mode + /// + /// New desired heading + /// Desired turn direction + /// Cancellation token + /// True on success, false otherwise + public Task TurnToAsync(Angle degrees, TurnDirection? direction, CancellationToken token) + { + return Task.Factory.StartNew(() => TurnTo(degrees, direction, token)); + } + + /// + /// Turn by a certain value + /// + /// Degrees to turn, unsigned + /// Direction to turn + /// Cancellation token + /// True on success, false otherwise + public Task TurnByAsync(Angle degrees, TurnDirection direction, CancellationToken token) + { + return Task.Factory.StartNew(() => TurnBy(degrees, direction, token)); + } + + /// + /// Turns to the desired heading + /// + /// New desired heading + /// Desired turn direction. Pass null for taking the default (shorter) turn. + /// Cancellation token + /// True on success, false otherwise + /// This operation can take a significant time + public bool TurnTo(Angle degrees, TurnDirection? direction, CancellationToken token) + { + degrees = degrees.Normalize(true); + + var currentHeading1 = AutopilotDesiredHeading; + if (!IsOperating || !currentHeading1.HasValue) + { + return false; + } + + var currentDesiredHeading = currentHeading1.Value; + + if (!direction.HasValue) + { + Angle diff = AngleExtensions.Difference(currentDesiredHeading, degrees); + if (diff < Angle.Zero) + { + direction = TurnDirection.Starboard; + } + else + { + direction = TurnDirection.Port; + } + } + + _logger.LogInformation($"New desired heading: {degrees}"); + + while (!AnglesAreClose(currentDesiredHeading, degrees)) + { + // Should also work if diff is small, but we intend to go the other way (make a full 360) + Angle diff = AngleExtensions.Difference(currentDesiredHeading, degrees); + if (diff.Abs() > Angle.FromDegrees(10)) + { + SendMessage(new Keystroke(direction == TurnDirection.Starboard ? AutopilotButtons.PlusTen : AutopilotButtons.MinusTen)); + } + else + { + SendMessage(new Keystroke(direction == TurnDirection.Starboard ? AutopilotButtons.PlusOne : AutopilotButtons.MinusOne)); + } + + token.WaitHandle.WaitOne(TimeSpan.FromSeconds(2)); + + if (token.IsCancellationRequested) + { + _logger.LogWarning("Turning cancelled because operation was externally aborted"); + break; + } + + if (!IsOperating) + { + _logger.LogWarning($"Turning cancelled because Autopilot is no longer in the correct state. Current State {Status}"); + break; + } + + currentHeading1 = AutopilotDesiredHeading; + if (currentHeading1.HasValue == false) + { + break; + } + + currentDesiredHeading = currentHeading1.Value; + } + + bool ret = currentHeading1.HasValue && AnglesAreClose(currentHeading1.Value, degrees); + if (ret) + { + _logger.LogInformation($"Reached new desired course {currentHeading1.GetValueOrDefault()}"); + } + else + { + _logger.LogWarning($"TurnTo terminated prematurely, desired new heading not reached"); + } + + return ret; + } + + internal bool AnglesAreClose(Angle angle1, Angle angle2) + { + if (angle1.Equals(angle2, Angle.FromDegrees(AngleEpsilon))) + { + return true; + } + + if (angle1 >= Angle.FromDegrees(359) && angle2 <= Angle.FromDegrees(1)) + { + return true; + } + + if (angle2 >= Angle.FromDegrees(359) && angle1 <= Angle.FromDegrees(1)) + { + return true; + } + + return false; + } + + /// + /// Turn by a certain value + /// + /// Degrees to turn, unsigned + /// Direction to turn + /// Cancellation token + /// True on success, false otherwise + public bool TurnBy(Angle degrees, TurnDirection direction, CancellationToken token) + { + if (degrees < Angle.Zero) + { + throw new ArgumentOutOfRangeException(nameof(degrees), "Turn amount must be positive. User the direction argument instead of a sign"); + } + + var currentHeading1 = AutopilotDesiredHeading; + if (!IsOperating || !currentHeading1.HasValue) + { + return false; + } + + Angle target = direction == TurnDirection.Starboard ? currentHeading1.Value + degrees : currentHeading1.Value - degrees; + target = target.Normalize(true); + return TurnTo(target, direction, token); + } + + private bool SendMessage(SeatalkMessage message) + { + return _parentInterface.SendMessage(message); + } + + private bool SendMessageAndVerifyStatus(SeatalkMessage message, TimeSpan timeout, Func successCondition) + { + if (timeout > MaximumTimeout) + { + throw new ArgumentOutOfRangeException(nameof(timeout), $"The maximum timeout is {MaximumTimeout}, see remarks in documentation"); + } + + _buttonOnApPressed = false; + Stopwatch sw = Stopwatch.StartNew(); + while (sw.Elapsed < timeout) + { + // If a button on the AP was pressed, abort immediately, as that one must always have precedence. + if (_buttonOnApPressed) + { + return successCondition(); + } + + if (successCondition()) + { + return true; + } + + _parentInterface.SendMessage(message); + Thread.Sleep(137); // Some random number + } + + return successCondition(); + } + + internal void UpdateStatus() + { + lock (_lock) + { + if (_lastUpdateTime + TimeSpan.FromSeconds(5) < DateTime.UtcNow) + { + // The autopilot hasn't sent anything for 5 seconds. Assume it's offline + if (Status != AutopilotStatus.Offline) // don't repeat message + { + _logger.LogWarning("Autopilot connection timed out. Assuming it's offline"); + } + + Status = AutopilotStatus.Offline; + DeadbandMode = DeadbandMode.Automatic; + RudderAngle = null; + AutopilotDesiredHeading = null; + AutopilotHeading = null; + CourseComputerStatus = CourseComputerWarnings.None; + } + } + } + + /* Unfortunately, the exact sequence to remotely enter calibration mode appears to be different for each type of remote control and autopilot + I have not found out how it works for the ST2000+. I also have not found out how to read out parameter values without entering calibration mode + public bool ReadCalibrationValues() + { + if (Status != AutopilotStatus.Standby) + { + return false; + } + + _calibrationParameters.Clear(); + + Keystroke ks; + + Thread.Sleep(100); + ks = new Keystroke(0x42); + SendMessage(ks); + Thread.Sleep(200); + ks = new Keystroke(0x68); + SendMessage(ks); + Thread.Sleep(500); + ks = new Keystroke(0x84); + SendMessage(ks); + Thread.Sleep(500); + + ks = new Keystroke(0x04); + SendMessage(ks); + + ks = new Keystroke(AutopilotButtons.MinusOne | AutopilotButtons.PlusOne); + SendMessage(ks); + + Stopwatch sw = Stopwatch.StartNew(); + int currentEntries = _calibrationParameters.Count; + while (sw.ElapsedMilliseconds < 3500) + { + ks = new Keystroke(AutopilotButtons.Auto); + SendMessage(ks); + _parentInterface.SendDatagram(new byte[] + { + 0x92, 1, 1 + }); + Thread.Sleep(1500); + if (currentEntries != _calibrationParameters.Count) + { + currentEntries = _calibrationParameters.Count; + sw.Restart(); + } + } + + ks = new Keystroke(AutopilotButtons.StandBy); + SendMessage(ks); + return true; + }*/ + + /// + /// Returns a textual representation of the current AP status + /// + /// + public override string ToString() + { + string hdg = AutopilotHeading.HasValue ? AutopilotHeading.Value.ToString() : "N/A"; + string desiredHdg = AutopilotDesiredHeading.HasValue ? AutopilotDesiredHeading.Value.ToString() : "N/A"; + string rudderAngle = RudderAngleAvailable ? RudderAngle.GetValueOrDefault().ToString() : "N/A"; + string ret = $"MODE:{Status}; HDG:{hdg}; DES:{desiredHdg}; RUD:{rudderAngle}; DB:{DeadbandMode}; ALRT:{Alarms}; TD:{TurnDirection}"; + return ret; + } + } +} diff --git a/src/devices/Seatalk1/Messages/ApparentWindAngle.cs b/src/devices/Seatalk1/Messages/ApparentWindAngle.cs new file mode 100644 index 0000000000..e52c0adfc2 --- /dev/null +++ b/src/devices/Seatalk1/Messages/ApparentWindAngle.cs @@ -0,0 +1,88 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using UnitsNet; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Apparent wind angle, as provided by the wind instrument in the masthead of a sailboat. + /// + public record ApparentWindAngle : SeatalkMessage + { + private readonly Angle _apparentAngle; + + /// + /// Create a default instance + /// + public ApparentWindAngle() + { + ApparentAngle = Angle.Zero; + } + + /// + /// Create a new instance + /// + /// Apparent wind angle (positive for wind from starboard) + public ApparentWindAngle(Angle apparentAngle) + { + ApparentAngle = apparentAngle; + } + + /// + public override byte CommandByte => 0x10; + + /// + public override byte ExpectedLength => 0x4; + + /// + /// Apparent wind angle, relative to bow. 0 means wind comes directly from ahead. + /// Positive for right of bow (wind from starboard) + /// + public Angle ApparentAngle + { + get + { + return _apparentAngle; + } + init + { + value = value.Normalize(false); + _apparentAngle = value; + } + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + uint angle10u = Convert.ToUInt32(data[2] << 8 | data[3]); + if ((angle10u & 0x8000) != 0) + { + angle10u |= 0xFFFF0000; + } + + int angle10 = unchecked((int)angle10u); + Angle angle = Angle.FromDegrees(angle10 / 2.0); + return new ApparentWindAngle() + { + ApparentAngle = angle, + }; + } + + /// + public override byte[] CreateDatagram() + { + short angle10 = (short)Math.Round(ApparentAngle.Degrees * 2); + return new byte[] + { + CommandByte, (byte)(ExpectedLength - 3), (byte)(angle10 >> 8), (byte)(angle10 & 0xFF) + }; + } + } +} diff --git a/src/devices/Seatalk1/Messages/ApparentWindSpeed.cs b/src/devices/Seatalk1/Messages/ApparentWindSpeed.cs new file mode 100644 index 0000000000..d286dee1fb --- /dev/null +++ b/src/devices/Seatalk1/Messages/ApparentWindSpeed.cs @@ -0,0 +1,97 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using UnitsNet; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// This message provides the apparent wind speed as measured by the wind instrument on the masthead of a sailboat. + /// + public record ApparentWindSpeed : SeatalkMessage + { + private readonly Speed _apparentSpeed; + + /// + /// Create a new instance + /// + public ApparentWindSpeed() + { + ApparentSpeed = Speed.FromKnots(0); // Default unit is knots + } + + /// + /// Create a new instance + /// + /// Apparent wind speed (default unit is knots) + public ApparentWindSpeed(Speed apparentSpeed) + { + ApparentSpeed = apparentSpeed; + } + + /// + public override byte CommandByte => 0x11; + + /// + public override byte ExpectedLength => 0x4; + + /// + /// Apparent wind angle, relative to bow. + /// Positive for right of bow (wind from starboard) + /// + public Speed ApparentSpeed + { + get + { + return _apparentSpeed; + } + init + { + if (value < Speed.Zero) + { + throw new ArgumentException("Speed cannot be negative"); + } + + _apparentSpeed = value; + } + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + Speed spd = Speed.Zero; + if ((data[2] & 0x80) == 0x80) // Speed is given in m/s + { + spd = Speed.FromMetersPerSecond((data[2] & 0x7F) + (data[3] / 10.0)); + } + else // Speed is in knots + { + spd = Speed.FromKnots((data[2] & 0x7F) + (data[3] / 10.0)); + } + + return this with + { + ApparentSpeed = spd + }; + } + + /// + public override byte[] CreateDatagram() + { + double rounded = Math.Round(ApparentSpeed.Knots, 1); + byte byte1 = (byte)rounded; + double remainder = Math.Round(Math.Abs(rounded - Math.Round(rounded)), 1); + byte byte2 = (byte)(remainder * 10.0); + return new byte[] + { + CommandByte, (byte)(ExpectedLength - 3), byte1, byte2 + }; + } + } +} diff --git a/src/devices/Seatalk1/Messages/AutopilotAlarms.cs b/src/devices/Seatalk1/Messages/AutopilotAlarms.cs new file mode 100644 index 0000000000..08185d461b --- /dev/null +++ b/src/devices/Seatalk1/Messages/AutopilotAlarms.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Autopilot alarm flags + /// + [Flags] + public enum AutopilotAlarms + { + /// + /// No alarm + /// + None = 0, + + /// + /// The track offset is too large + /// + OffCourse = 4, + + /// + /// There was a wind shift (when in auto-wind mode) + /// This alarm is generated when in auto-wind mode and the true wind direction shifts by a certain amount (20° by default). + /// To continue, safety must be re-evaluated, as the course over ground is changing, too. + /// + WindShift = 8, + } +} diff --git a/src/devices/Seatalk1/Messages/AutopilotButtons.cs b/src/devices/Seatalk1/Messages/AutopilotButtons.cs new file mode 100644 index 0000000000..838e4f76bb --- /dev/null +++ b/src/devices/Seatalk1/Messages/AutopilotButtons.cs @@ -0,0 +1,64 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// The buttons of the auto-pilot controller (more or less standardized between manufacturers). + /// Note that for many functions, multiple buttons must be pressed simultaneously, therefore this is a flag enum. + /// + [Flags] + public enum AutopilotButtons + { + /// + /// No button was pressed + /// + None = 0, + + /// + /// The -1 button was pressed + /// + MinusOne = 1, + + /// + /// The -10 button was pressed + /// + MinusTen = 2, + + /// + /// The +1 button was pressed + /// + PlusOne = 4, + + /// + /// The +10 button was pressed + /// + PlusTen = 8, + + /// + /// The Auto button was pressed + /// + Auto = 16, + + /// + /// The Standby button was pressed + /// + StandBy = 32, + + /// + /// The Disp button was pressed (not always present) + /// + Disp = 128, + + /// + /// The button(s) where pressed longer + /// + LongPress = 256, + } +} diff --git a/src/devices/Seatalk1/Messages/AutopilotCalibrationParameter.cs b/src/devices/Seatalk1/Messages/AutopilotCalibrationParameter.cs new file mode 100644 index 0000000000..54edbf6817 --- /dev/null +++ b/src/devices/Seatalk1/Messages/AutopilotCalibrationParameter.cs @@ -0,0 +1,127 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Set of autopilot calibration parameters + /// + public enum AutopilotCalibrationParameter + { + /// + /// Invalid setting + /// + None = 0, + + /// + /// Rudder gain value + /// + RudderGain = 1, + + /// + /// Counter rudder setting + /// + CounterRudder = 2, + + /// + /// Rudder limit in degrees + /// + RudderLimit = 3, + + /// + /// Turn rate limit (degrees/second) + /// + TurnRateLimit = 4, + + /// + /// Default speed (used if the autopilot doesn't get any speed messages) + /// + Speed = 5, + + /// + /// Off-course limit in nautical miles + /// + OffCourseLimit = 6, + + /// + /// Auto-trim setting + /// + AutoTrim = 7, + + /// + /// Power steer + /// + PowerSteer = 9, + + /// + /// Drive type + /// + DriveType = 0xa, + + /// + /// Rudder damping + /// + RudderDamping = 0xb, + + /// + /// Fixed variation, if cannot be derived from other messages + /// + Variation = 0xc, + + /// + /// Auto adapt value (0=Off, 1=North, 2=South) + /// + AutoAdapt = 0xd, + + /// + /// Auto-adapt latitude (if the value of AutoAdapt is not 0) + /// + AutoAdaptLatitude = 0xe, + + /// + /// Auto-rlease + /// + AutoRelease = 0xf, + + /// + /// Rudder alignment + /// + RudderAlignment = 0x10, + + /// + /// Wind trim (Wind response) + /// + WindTrim = 0x11, + + /// + /// Response (?) + /// + Response = 0x12, + + /// + /// Boat type. 1 = Displacement, 2 = Semi-displacement, 3 = planing, 4 = stern, 5 = work, 6 = sail + /// + BoatType = 0x13, + + /// + /// Calibration lock + /// + CalLock = 0x15, + + /// + /// Tack angle (Default: 100°) + /// + AutoTackAngle = 0x1d, + + /// + /// This value is sent (with current=min=max=0, while calibration mode is being entered) + /// + EnteringCalibration = 0x50, + } +} diff --git a/src/devices/Seatalk1/Messages/AutopilotCalibrationParameterMessage.cs b/src/devices/Seatalk1/Messages/AutopilotCalibrationParameterMessage.cs new file mode 100644 index 0000000000..d6db21ef35 --- /dev/null +++ b/src/devices/Seatalk1/Messages/AutopilotCalibrationParameterMessage.cs @@ -0,0 +1,88 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Message generated when autopilot is in calibration mode. + /// + public record AutopilotCalibrationParameterMessage : SeatalkMessage + { + /// + public override byte CommandByte => 0x88; + + /// + public override byte ExpectedLength => 0x06; + + /// + /// The parameter in this message. Defines the meaning of the other fields. + /// + public AutopilotCalibrationParameter Parameter + { + get; + init; + } + + /// + /// The value of the parameter + /// + public int CurrentSetting + { + get; + init; + } + + /// + /// Minimum allowed value for the setting + /// + public int MinValue + { + get; + init; + } + + /// + /// Maximum allowed value for the setting + /// + public int MaxValue + { + get; + init; + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + int param = data[2]; + int value = Convert.ToInt32(data[3]); + int max = Convert.ToInt32(data[4]); + int min = Convert.ToInt32(data[5]); + return new AutopilotCalibrationParameterMessage() + { + Parameter = (AutopilotCalibrationParameter)param, + CurrentSetting = value, + MinValue = min, + MaxValue = max, + }; + } + + /// + public override byte[] CreateDatagram() + { + byte[] data = new byte[ExpectedLength]; + data[0] = CommandByte; + data[1] = (byte)(ExpectedLength - 3); + data[2] = (byte)Parameter; + data[3] = (byte)CurrentSetting; + data[4] = (byte)MaxValue; + data[5] = (byte)MinValue; + return data; + } + } +} diff --git a/src/devices/Seatalk1/Messages/CompassHeadingAndRudderPosition.cs b/src/devices/Seatalk1/Messages/CompassHeadingAndRudderPosition.cs new file mode 100644 index 0000000000..58baaef515 --- /dev/null +++ b/src/devices/Seatalk1/Messages/CompassHeadingAndRudderPosition.cs @@ -0,0 +1,119 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using UnitsNet; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Compass heading and rudder position message from autopilot + /// + public record CompassHeadingAndRudderPosition : SeatalkMessage + { + /// + public override byte CommandByte => 0x9c; + + /// + public override byte ExpectedLength => 4; + + /// + /// Compass heading from the autopilot's internal sensor + /// + public Angle CompassHeading + { + get; + init; + } + + /// + /// Rudder position. The autopilot may consistently report 0 here if no such sensor is fitted. + /// + public Angle RudderPosition + { + get; + init; + } + + /// + /// Direction the boat is currently turning + /// + public TurnDirection TurnDirection + { + get; + init; + } + + /// + /// 84 U6 VW XY 0Z 0M RR SS TT Compass heading Autopilot course + /// + /// Input data + /// A message of this type + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + VerifyPacket(data); + + uint u = ((uint)data[1]) >> 4; + uint vw = data[2]; + long heading = (u & 0x3) * 90 + (vw & 0x3F) * 2 + ((u & 0x4) == 0x4 ? 1 : 0); + Angle headingA = Angle.FromDegrees(heading); + + Messages.TurnDirection td = (u & 0x8) == 0x8 ? TurnDirection.Starboard : TurnDirection.Port; + sbyte rudder = (sbyte)data[3]; + + return new CompassHeadingAndRudderPosition() + { + CompassHeading = headingA, + RudderPosition = Angle.FromDegrees(rudder), + TurnDirection = td, + }; + } + + /// + public override byte[] CreateDatagram() + { + byte[] data = new byte[4]; + data[0] = CommandByte; + int heading = (int)Math.Round(CompassHeading.Normalize(true).Degrees); + int u = 0; + if (heading >= 270) + { + u = 3; + heading -= 270; + } + else if (heading >= 180) + { + u = 2; + heading -= 180; + } + else if (heading >= 90) + { + u = 1; + heading -= 90; + } + + if (TurnDirection == TurnDirection.Starboard) + { + u |= 0x8; + } + + if (heading % 2 == 1) + { + u |= 0x4; + } + + sbyte rudder = Convert.ToSByte(RudderPosition.Degrees); + + data[1] = (byte)(u << 4 | (ExpectedLength - 3)); + data[2] = (byte)((heading >> 1) & 0xff); + data[3] = (byte)rudder; + + return data; + } + } +} diff --git a/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourse.cs b/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourse.cs new file mode 100644 index 0000000000..e2372164a0 --- /dev/null +++ b/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourse.cs @@ -0,0 +1,235 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using Iot.Device.Nmea0183.Sentences; +using Microsoft.Extensions.Logging; +using UnitsNet; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Compass heading and current autopilot course and parameters. This message contains the same fields as , + /// plus some more. + /// + public record CompassHeadingAutopilotCourse : SeatalkMessage + { + /// + public override byte CommandByte => 0x84; + + /// + public override byte ExpectedLength => 0x9; + + /// + /// Heading of the internal sensor of the autopilot. + /// + public Angle CompassHeading { get; init; } + + /// + /// Autopilot type, not really relevant + /// + public byte AutoPilotType { get; init; } + + /// + /// Autopilot target course. Often not available when not in auto mode + /// + public Angle AutoPilotCourse { get; init; } + + /// + /// Rudder position. Positive when turning to starboard + /// + public Angle RudderPosition { get; init; } + + /// + /// Current autopilot status + /// + public AutopilotStatus AutopilotStatus { get; init; } = AutopilotStatus.Standby; + + /// + /// Active alarms + /// + public AutopilotAlarms Alarms { get; init; } + + /// + /// Turn direction. Not really reliable when no Rudder sensor is fitted. + /// + public TurnDirection TurnDirection { get; init; } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + VerifyPacket(data); + + uint u = ((uint)data[1]) >> 4; + uint vw = data[2]; + long heading = (u & 0x3) * 90 + (vw & 0x3F) * 2 + ((u & 0x4) == 0x4 ? 1 : 0); + Angle headingA = Angle.FromDegrees(heading); + + Messages.TurnDirection td = (u & 0x8) == 0x8 ? TurnDirection.Starboard : TurnDirection.Port; + + double desiredCourse = ((vw >> 6) * 90) + (data[3] / 2.0); + + AutopilotStatus status = GetAutopilotStatus(data[4]); + + if (status == AutopilotStatus.Undefined) + { + Logger.LogWarning($"Unknown autopilot status byte {data[4]}"); + } + + sbyte rudder = (sbyte)data[6]; + + AutopilotAlarms alarms = AutopilotAlarms.None; + byte almByte = data[5]; + if ((almByte & 0x4) == 0x4) + { + alarms |= AutopilotAlarms.OffCourse; + } + + if ((almByte & 0x8) == 0x8) + { + alarms |= AutopilotAlarms.WindShift; + } + + return this with + { + CompassHeading = headingA, + AutoPilotType = data[8], + AutoPilotCourse = Angle.FromDegrees(desiredCourse), + AutopilotStatus = status, + RudderPosition = Angle.FromDegrees(rudder), + Alarms = alarms, + TurnDirection = td, + }; + } + + /// + public override byte[] CreateDatagram() + { + byte[] data = new byte[ExpectedLength]; + data[0] = CommandByte; + int heading = (int)Math.Round(CompassHeading.Normalize(true).Degrees); + int u = 0; + if (heading >= 270) + { + u = 3; + heading -= 270; + } + else if (heading >= 180) + { + u = 2; + heading -= 180; + } + else if (heading >= 90) + { + u = 1; + heading -= 90; + } + + if (TurnDirection == TurnDirection.Starboard) + { + u |= 0x8; + } + + if (heading % 2 == 1) + { + u |= 0x4; + } + + sbyte rudder = Convert.ToSByte(RudderPosition.Degrees); + + data[1] = (byte)(u << 4 | (ExpectedLength - 3)); + data[2] = (byte)((heading >> 1) & 0x3f); + + byte almByte = 0; + if ((Alarms & AutopilotAlarms.OffCourse) == AutopilotAlarms.OffCourse) + { + almByte |= 4; + } + + if ((Alarms & AutopilotAlarms.WindShift) == AutopilotAlarms.WindShift) + { + almByte |= 8; + } + + int vw = 0; + double desiredCourse = AutoPilotCourse.Normalize(true).Degrees; + if (desiredCourse >= 270) + { + vw = 0xC0; + desiredCourse -= 270; + } + else if (desiredCourse >= 180) + { + vw = 0x80; + desiredCourse -= 180; + } + else if (desiredCourse >= 90) + { + vw = 0x40; + desiredCourse -= 90; + } + + int xy = (int)Math.Round(desiredCourse * 2); + + data[2] |= (byte)vw; + data[3] |= (byte)xy; + data[4] = GetAutopilotStatusByte(AutopilotStatus); + data[5] = almByte; + data[6] = (byte)rudder; + data[7] = 0; + data[8] = AutoPilotType; + + return data; + } + + private AutopilotStatus GetAutopilotStatus(byte z) + { + switch (z) + { + case 0: + return AutopilotStatus.Standby; + case 2: + return AutopilotStatus.Auto; + case 4: // Wind mode may be on its own and together with the auto flag + return AutopilotStatus.InactiveWind; + case 6: + return AutopilotStatus.Wind; + case 8: + return AutopilotStatus.InactiveTrack; + case 0x0a: + return AutopilotStatus.Track; + case 0x10: + return AutopilotStatus.Calibration; + default: + return AutopilotStatus.Undefined; + } + } + + private byte GetAutopilotStatusByte(AutopilotStatus status) + { + return AutopilotStatus switch + { + AutopilotStatus.Standby => 0, + AutopilotStatus.Auto => 2, + AutopilotStatus.Track => 10, + AutopilotStatus.Wind => 6, + AutopilotStatus.Calibration => 16, + AutopilotStatus.InactiveTrack => 8, + AutopilotStatus.InactiveWind => 4, + _ => 0, + }; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + // Add some additional tests to make sure the message is not messed up + return base.MatchesMessageType(data) && GetAutopilotStatus(data[4]) != AutopilotStatus.Undefined && (data[5] & 0xF0) == 0 && (data[8] & 0xF0) == 0; + } + } +} diff --git a/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourseAlt.cs b/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourseAlt.cs new file mode 100644 index 0000000000..2ceddb2277 --- /dev/null +++ b/src/devices/Seatalk1/Messages/CompassHeadingAutopilotCourseAlt.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// This message is sometimes sent instead of when the pilot is somehow busy + /// It seems we don't really need to distinguish. + /// + public record CompassHeadingAutopilotCourseAlt : CompassHeadingAutopilotCourse + { + /// + public override byte CommandByte => 0x95; + } +} diff --git a/src/devices/Seatalk1/Messages/CourseComputerStatus.cs b/src/devices/Seatalk1/Messages/CourseComputerStatus.cs new file mode 100644 index 0000000000..0433b90233 --- /dev/null +++ b/src/devices/Seatalk1/Messages/CourseComputerStatus.cs @@ -0,0 +1,58 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Course computer status. Various autopilots may use this message for different purposes. + /// + public record CourseComputerStatus : SeatalkMessage + { + /// + public override byte CommandByte => 0x83; + + /// + public override byte ExpectedLength => 0x0a; // this message has 10 bytes, despite only 3 used. + + /// + /// Active warnings + /// + public CourseComputerWarnings Warnings + { + get; + init; + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + Logger.LogInformation($"Course computer warning msg: {string.Join("-", data.Select(x => x.ToString("X2")))}"); + return this with + { + Warnings = (CourseComputerWarnings)data[2], + }; + } + + /// + public override byte[] CreateDatagram() + { + return new byte[] + { + CommandByte, (byte)(ExpectedLength - 3), (byte)Warnings, 0, 0, 0, 0, 0, 0, 0 + }; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + return base.MatchesMessageType(data) && data[3] == 0; + } + } +} diff --git a/src/devices/Seatalk1/Messages/CourseComputerWarnings.cs b/src/devices/Seatalk1/Messages/CourseComputerWarnings.cs new file mode 100644 index 0000000000..54115f3d76 --- /dev/null +++ b/src/devices/Seatalk1/Messages/CourseComputerWarnings.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Course computer warnings + /// + [Flags] + public enum CourseComputerWarnings + { + /// + /// No warnings (some APs apparently set this explicitly, others never reset the value) + /// + None = 0, + + /// + /// There was an autopilot drive error + /// + DriveReleaseFailure = 1, + + /// + /// The drive is not working (or: The command needs confirmation, e.g. after attempting to enter track mode) + /// + DriveFailure = 2, + + /// + /// Together with DriveFailure, this indicates that a turn to port is required. If it's not set, a course change to starboard is required. + /// + CourseChangeToPort = 4, + } +} diff --git a/src/devices/Seatalk1/Messages/DeadbandMode.cs b/src/devices/Seatalk1/Messages/DeadbandMode.cs new file mode 100644 index 0000000000..306e6652d7 --- /dev/null +++ b/src/devices/Seatalk1/Messages/DeadbandMode.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Deadband mode setting. + /// This value configures whether the AP should try to filter boat movements from waves as good as possible, and save power by + /// minimizing the amount of rudder commands. + /// If it is set to minimal, the AP tries to minimize off-track limits + /// + public enum DeadbandMode + { + /// + /// Value not available or unknown + /// + None = 0, + + /// + /// Automatic deadband mode (default) + /// + Automatic, + + /// + /// Minimize off-track limits, possibly increasing the number of rudder commands. + /// + Minimal, + } +} diff --git a/src/devices/Seatalk1/Messages/DeadbandSetting.cs b/src/devices/Seatalk1/Messages/DeadbandSetting.cs new file mode 100644 index 0000000000..c04e6f086e --- /dev/null +++ b/src/devices/Seatalk1/Messages/DeadbandSetting.cs @@ -0,0 +1,80 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Sent by the auto pilot when the automatic deadband mode is changed. + /// If set to "Automatic" (the default) the Autopilot tries to compensate for the effect of waves and reduces the + /// rudder movement to a minimum. If set to "Minimum", the Autopilot tries to minimize the off-track error, at the + /// expense of additional movements and thus higher power consumption. The latter is particularly useful when navigating + /// on narrow waterways. + /// + /// + /// To change the setting, send the respective keycodes (0x09 or 0x0a) instead of a message with the desired new value. + /// + public record DeadbandSetting : SeatalkMessage + { + /// + public override byte CommandByte => 0x87; + + /// + public override byte ExpectedLength => 0x03; + + /// + /// The new mode + /// + public DeadbandMode Mode { get; init; } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + VerifyPacket(data); + DeadbandMode mode = DeadbandMode.None; + if (data[2] == 1) + { + mode = DeadbandMode.Automatic; + } + else if (data[2] == 2) + { + mode = DeadbandMode.Minimal; + } + + return new DeadbandSetting() + { + Mode = mode, + }; + } + + /// + /// Creates a Deadband status change message. + /// + /// The datagram + public override byte[] CreateDatagram() + { + byte mode = Mode switch + { + DeadbandMode.Automatic => 1, + DeadbandMode.Minimal => 2, + _ => 0, + }; + + return new byte[] + { + CommandByte, (byte)(ExpectedLength - 3), mode + }; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + return base.MatchesMessageType(data) && data[1] == 0x0; + } + } +} diff --git a/src/devices/Seatalk1/Messages/DisplayBacklightLevel.cs b/src/devices/Seatalk1/Messages/DisplayBacklightLevel.cs new file mode 100644 index 0000000000..ed8e5a028a --- /dev/null +++ b/src/devices/Seatalk1/Messages/DisplayBacklightLevel.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Backlight level setting. Some devices may only support on or off. + /// + public enum DisplayBacklightLevel + { + /// + /// Backlight off + /// + Off = 0, + + /// + /// Backlight level 1 + /// + Level1 = 4, + + /// + /// Backlight level 2 + /// + Level2 = 8, + + /// + /// Backlight level 3 + /// + Level3 = 0xC, + } +} diff --git a/src/devices/Seatalk1/Messages/Keystroke.cs b/src/devices/Seatalk1/Messages/Keystroke.cs new file mode 100644 index 0000000000..968790875b --- /dev/null +++ b/src/devices/Seatalk1/Messages/Keystroke.cs @@ -0,0 +1,217 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Keypress messages from/to the autopilot + /// + public record Keystroke : SeatalkMessage + { + private static readonly Dictionary s_codeToButtonMap; + private static readonly Dictionary s_buttonToCodeMap; + + static Keystroke() + { + s_codeToButtonMap = new Dictionary() + { + { 0x00, AutopilotButtons.None }, + { 0x01, AutopilotButtons.Auto }, + { 0x02, AutopilotButtons.StandBy }, + { 0x03, AutopilotButtons.MinusTen | AutopilotButtons.PlusTen }, + { 0x04, AutopilotButtons.Disp }, + { 0x05, AutopilotButtons.MinusOne }, + { 0x06, AutopilotButtons.MinusTen }, + { 0x07, AutopilotButtons.PlusOne }, + { 0x08, AutopilotButtons.PlusTen }, + // These two are only sent in auto mode when +1 and -1 are pressed. + // Whether 0x0A or ox09 is used is possibly indicating whether in deadband mode or not (exact course hold mode). + // In standby mode, this keypress toggles the display illumination, but does not send out the keystroke command. + { 0x0A, AutopilotButtons.PlusOne | AutopilotButtons.MinusOne }, + { 0x09, AutopilotButtons.PlusOne | AutopilotButtons.MinusOne }, + { 0x20, AutopilotButtons.PlusOne | AutopilotButtons.MinusOne }, + { 0x21, AutopilotButtons.MinusOne | AutopilotButtons.MinusTen }, + { 0x22, AutopilotButtons.PlusOne | AutopilotButtons.PlusTen }, + { 0x23, AutopilotButtons.StandBy | AutopilotButtons.Auto }, + { 0x28, AutopilotButtons.PlusTen | AutopilotButtons.MinusTen }, + { 0x30, AutopilotButtons.MinusOne | AutopilotButtons.PlusTen }, + { 0x31, AutopilotButtons.MinusTen | AutopilotButtons.PlusOne }, + { 0x41, AutopilotButtons.Auto | AutopilotButtons.LongPress }, + { 0x42, AutopilotButtons.StandBy | AutopilotButtons.LongPress }, + { 0x63, AutopilotButtons.Auto | AutopilotButtons.LongPress | AutopilotButtons.StandBy }, + + // This one can mean: Return to previous track, but is also sent when Standby is pressed for more than 5 seconds (entering calibration) + // In the later case, it comes after 0x42 + { 0x68, AutopilotButtons.PlusTen | AutopilotButtons.MinusTen | AutopilotButtons.LongPress }, + }; + + s_buttonToCodeMap = new Dictionary(); + foreach (var e in s_codeToButtonMap) + { + // The above list is not perfectly reversible (see 0x0A and 0x09) therefore use TryAdd + s_buttonToCodeMap.TryAdd(e.Value, e.Key); + } + } + + /// + /// Empty constructor + /// + public Keystroke() + { + KeyCode = 0; + Source = 0; + } + + /// + /// Create a button command + /// + /// Button combination to press + /// Whether the message is from (0) or to (1) the autopilot + /// When sending a keystroke command to the AP, make sure the source is 1, otherwise it is filtered by the sender, + /// because the source is the only to way to distinguish own messages from remote messages on the bus. + public Keystroke(AutopilotButtons buttonsToPress, int source = 1) + { + Source = source; + + if (s_buttonToCodeMap.TryGetValue(buttonsToPress, out int code)) + { + KeyCode = code; + } + else + { + throw new ArgumentException($"The button combination {buttonsToPress} is not a valid button combination"); + } + } + + /// + /// Send a keystroke message, directly with the bytecode + /// + /// Bytecode of the message + /// Source of the command + public Keystroke(byte keyCode, int source = 1) + { + Source = source; + KeyCode = keyCode; + } + + /// + /// The command byte for keypresses is 0x86 + /// + public override byte CommandByte => 0x86; + + /// + /// This message is always 4 bytes long + /// + public override byte ExpectedLength => 0x04; + + /// + /// Keypress source. This is 0 for ST1000+ or ST2000+, 2 for ST4000 or ST600R, and 1 for remote controllers. + /// So when we send a keypress command to the autopilot, we need to set it to 1 + /// + public int Source + { + get; + init; + } + + /// + /// The buttons that where pressed. Note that not all keycodes are valid and autopilots/remote controllers translate some keycodes differently. (e.g. + /// some remote controllers have a "track" button, while others use a dual-button combination for this) + /// + public AutopilotButtons ButtonsPressed + { + get + { + return GetButtons(KeyCode); + } + } + + /// + /// The keycode. + /// + public int KeyCode + { + get; + init; + } + + /// + /// The format of the message is + /// 86 X1 YY yy, where X is the sender (1 = Remote control, 0 = Autopilot unit) + /// and YY is the keycode. yy is the binary inverse of YY. + /// + /// The input data + /// A message + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + VerifyPacket(data); + + int source = data[1] >> 4; + + // Just as a verification step + GetButtons(data[2]); + + return new Keystroke() + { + Source = source, KeyCode = data[2] + }; + } + + /// + public override byte[] CreateDatagram() + { + byte inverseCode = (byte)~KeyCode; + int attributeByte = ExpectedLength - 3 | (Source << 4); + return new byte[] + { + CommandByte, (byte)attributeByte, (byte)KeyCode, inverseCode + }; + } + + private AutopilotButtons GetButtons(int keyCode) + { + if (s_codeToButtonMap.TryGetValue(keyCode, out var result)) + { + return result; + } + + Logger.LogWarning($"Unknown keycode 0x{keyCode:X2} in command"); + return AutopilotButtons.None; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + // Byte 4 must be the binary inverse of byte 3 + if (data.Count < 4) + { + return false; + } + + byte yy = data[2]; + byte yy2 = data[3]; + if ((~yy2 & 0xFF) != yy) + { + return false; + } + + return base.MatchesMessageType(data); + } + + /// + protected override bool PrintMembers(StringBuilder stringBuilder) + { + base.PrintMembers(stringBuilder); + stringBuilder.Append($", Source = {Source}, KeyCode = 0x{KeyCode:X2}, Buttons = {GetButtons(KeyCode)}"); + return true; + } + } +} diff --git a/src/devices/Seatalk1/Messages/NavigationToWaypoint.cs b/src/devices/Seatalk1/Messages/NavigationToWaypoint.cs new file mode 100644 index 0000000000..1972e7e780 --- /dev/null +++ b/src/devices/Seatalk1/Messages/NavigationToWaypoint.cs @@ -0,0 +1,235 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnitsNet; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Navigation-to-waypoint message from a navigation computer + /// + public record NavigationToWaypoint : SeatalkMessage + { + /// + /// Default constructor + /// + public NavigationToWaypoint() + { + } + + /// + /// Construct a new instance + /// + /// Cross track error. Positive if right of desired track + /// Bearing to destination + /// The bearing is true, false if it is magnetic + /// Distance to destination + public NavigationToWaypoint(Length? crossTrackError, Angle? bearingToDestination, bool bearingIsTrue, Length? distanceToDestination) + { + CrossTrackError = crossTrackError; + BearingToDestination = bearingToDestination; + BearingIsTrue = bearingIsTrue; + DistanceToDestination = distanceToDestination; + } + + /// + public override byte CommandByte => 0x85; + + /// + public override byte ExpectedLength => 0x9; + + /// + /// Cross track error. Positive if right of track + /// + public Length? CrossTrackError + { + get; + init; + } + + /// + /// Bearing to destination waypoint. + /// + public Angle? BearingToDestination + { + get; + init; + } + + /// + /// The bearing value is true (means: It is relative to true north) + /// + public bool BearingIsTrue + { + get; + init; + } + + /// + /// Distance to destination + /// + public Length? DistanceToDestination + { + get; + init; + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + byte flags = data[6]; + int vvv = ((data[1] & 0xF0) >> 4) | (data[2] << 4); + Length? crossTrackDistance = Length.FromNauticalMiles(vvv / 100.0); + if ((data[6] & 0x40) == 0x40) + { + crossTrackDistance = -crossTrackDistance; + } + + if ((flags & 1) == 0) + { + crossTrackDistance = null; + } + + bool bearingIsTrue = (data[3] & 0x8) == 0x8; + int u = data[3] & 0x3; + + int remainder = (data[4] & 0xF) << 4; + remainder |= (data[3] & 0xF0) >> 4; + + Angle? bearingToDestination = Angle.FromDegrees((u * 90) + (remainder / 2.0)); + + if ((flags & 2) == 0) + { + bearingToDestination = null; + } + + int dist = data[5] << 4; + dist |= (data[4] >> 4); + + Length? distance; + if ((flags & 4) == 0) + { + distance = null; + } + else if ((data[6] & 0x10) == 0x10) + { + distance = Length.FromNauticalMiles(dist / 100.0); + } + else + { + distance = Length.FromNauticalMiles(dist / 10.0); + } + + return new NavigationToWaypoint() + { + BearingIsTrue = bearingIsTrue, + BearingToDestination = bearingToDestination, + CrossTrackError = crossTrackDistance, + DistanceToDestination = distance, + }; + } + + /// + public override byte[] CreateDatagram() + { + // 85 X6 XX VU ZW ZZ YF 00 yf + byte flags = 0; + byte[] data = new byte[9]; + data[0] = CommandByte; + data[1] = (byte)(ExpectedLength - 3); + if (CrossTrackError.HasValue) + { + double nmTimes100 = CrossTrackError.Value.NauticalMiles * 100.0; + int v = (int)Math.Round(Math.Abs(nmTimes100)); + if (v > 0xfff) + { + v = 0xfff; + } + + data[1] = (byte)((v & 0x00f) << 4 | 0x6); // This is the attr byte + data[2] = (byte)(v >> 4); + if (nmTimes100 < 0) // Xtrack error negative -> Steer right to correct + { + data[6] |= 0x40; // this is indicated on y bit 2 + } + + flags |= 1; + if (Math.Abs(CrossTrackError.Value.NauticalMiles) >= 0.3) + { + flags |= 8; + } + } + + if (BearingToDestination.HasValue) + { + double angle = BearingToDestination.Value.Degrees; + int u = 0; + if (angle >= 270) + { + u = 3; + angle -= 270; + } + else if (angle >= 180) + { + u = 2; + angle -= 180; + } + else if (angle >= 90) + { + u = 1; + angle -= 90; + } + + int lowerPart = (int)Math.Round(angle * 2); + + data[3] |= (byte)u; + if (BearingIsTrue) + { + data[3] |= 0x8; + } + + data[3] |= (byte)(lowerPart << 4); // V, lower nibble of remainder + data[4] |= (byte)((lowerPart >> 4) & 0xF); // upper nibble of remainder (upper nibble of this byte is used in DistanceToDestination) + flags |= 2; + } + + if (DistanceToDestination.HasValue) + { + double distanceNm = DistanceToDestination.Value.NauticalMiles; + if (distanceNm <= 9.9) + { + int decoding = (int)Math.Round(distanceNm * 100.0); + data[4] |= (byte)((decoding & 0x00F) << 4); + data[5] = (byte)(((decoding & 0xFF0) >> 4)); + data[6] |= 0x10; // Set scale bit Y + } + else + { + int decoding = (int)Math.Round(distanceNm * 10.0); + data[4] |= (byte)((decoding & 0x00F) << 4); + data[5] = (byte)(((decoding & 0xFF0) >> 4)); + // Bit in Y is not set + } + + flags |= 4; + } + + data[6] |= flags; + data[7] = 0; + data[8] = (byte)(~data[6]); + + return data; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + return base.MatchesMessageType(data) && data[6] == (byte)(~data[8]); + } + } +} diff --git a/src/devices/Seatalk1/Messages/SeatalkMessage.cs b/src/devices/Seatalk1/Messages/SeatalkMessage.cs new file mode 100644 index 0000000000..a0cb6b1be3 --- /dev/null +++ b/src/devices/Seatalk1/Messages/SeatalkMessage.cs @@ -0,0 +1,159 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Common; +using Microsoft.Extensions.Logging; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Base class for seatalk messages + /// + public abstract record SeatalkMessage + { + /// + /// Default constructor + /// + protected SeatalkMessage() + { + Logger = this.GetCurrentClassLogger(); + } + + /// + /// The command byte for this message + /// + public abstract byte CommandByte + { + get; + } + + /// + /// The expected total length of this message type (lower nibble of the ATTR byte + 3) + /// + public abstract byte ExpectedLength + { + get; + } + + /// + /// Logger instance, to report possible issues + /// + [IgnoreDataMember] + protected ILogger Logger { get; } + + /// + /// Creates a new message from this template. + /// This function creates a new instance of the current type with the data fields updated according to the data parameter. + /// + /// The sliced input data + /// A typed instance + /// The datagram does not match this type + /// + /// Before calling this method, should be used to verify the types match without creating an exception. + /// + public abstract SeatalkMessage CreateNewMessage(IReadOnlyList data); + + /// + /// Creates a datagram (byte array) from a message + /// + /// The bytes to send + public abstract byte[] CreateDatagram(); + + /// + /// This checks the precondition for a valid input packet. + /// Normally, derived classes do not need to override this, it's sufficient to override to add any per-message verifications. + /// + /// The sliced data + /// Data was null + /// The data does not match this instance + protected virtual void VerifyPacket(IReadOnlyList data) + { + if (data == null) + { + throw new ArgumentNullException(nameof(data)); + } + + if (data.Count != ExpectedLength) + { + throw new InvalidOperationException($"Cannot decode data to {GetType()}- invalid data length."); + } + + if (data[0] != CommandByte) + { + throw new InvalidOperationException($"Command byte for {GetType()} was expected to be {CommandByte:X2} but was {data[0]:X2}"); + } + + if ((data[1] & 0xF) != (ExpectedLength - 3)) + { + throw new InvalidOperationException($"Length nibble for {GetType()} was expected to be {ExpectedLength}, but was {data[1] & 0xF}"); + } + + if (!MatchesMessageType(data)) + { + throw new InvalidOperationException($"A custom package verification failed"); + } + } + + /// + /// Compares this instance against another one + /// + /// Other instance + /// True or false + public virtual bool Equals(SeatalkMessage? other) + { + // This method is overriden, because we don't want to compare the logger + if (ReferenceEquals(other, null)) + { + return false; + } + + return ExpectedLength == other.ExpectedLength && CommandByte == other.CommandByte; + } + + /// + /// Standard hash code implementation + /// + /// A hash code + public override int GetHashCode() + { + return CommandByte << 8 | ExpectedLength; + } + + /// + /// Checks whether the data could be a packet of the current type. Unlike the above, this does not throw exceptions, but only returns true or false. + /// + /// The input sequence + /// True if the input is likely a complete and valid packet of the current type, false otherwise. + /// The input is null + public virtual bool MatchesMessageType(IReadOnlyList data) + { + if (data == null) + { + throw new ArgumentNullException(nameof(data)); + } + + if (data.Count != ExpectedLength) + { + return false; + } + + if (data[0] != CommandByte) + { + return false; + } + + if ((data[1] & 0xF) != (ExpectedLength - 3)) + { + return false; + } + + return true; + } + } +} diff --git a/src/devices/Seatalk1/Messages/SetLampIntensity.cs b/src/devices/Seatalk1/Messages/SetLampIntensity.cs new file mode 100644 index 0000000000..e543f5ba21 --- /dev/null +++ b/src/devices/Seatalk1/Messages/SetLampIntensity.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Set lamp intensity message. This message can be used to instruct all devices on the bus to adjust their background light. + /// This message is only sent once from a controlling device. + /// + public record SetLampIntensity : SeatalkMessage + { + private readonly DisplayBacklightLevel _intensity; + + /// + /// Default constructor + /// + public SetLampIntensity() + { + Intensity = DisplayBacklightLevel.Off; + } + + /// + /// Create a new instance + /// + /// New brightness setting + public SetLampIntensity(DisplayBacklightLevel intensity) + { + Intensity = intensity; + } + + /// + public override byte CommandByte => 0x30; + + /// + public override byte ExpectedLength => 0x3; + + /// + /// The new intensity. + /// + public DisplayBacklightLevel Intensity + { + get + { + return _intensity; + } + init + { + if (!Enum.IsDefined(typeof(DisplayBacklightLevel), value)) + { + throw new ArgumentOutOfRangeException(nameof(value), "The display backlight value setting is unknown"); + } + + _intensity = value; + } + } + + /// + public override SeatalkMessage CreateNewMessage(IReadOnlyList data) + { + int newIntensity = data[2] & 0xF; + + return new SetLampIntensity() + { + Intensity = (DisplayBacklightLevel)newIntensity, + }; + } + + /// + public override byte[] CreateDatagram() + { + return new byte[] + { + CommandByte, (byte)(ExpectedLength - 3), (byte)Intensity + }; + } + + /// + public override bool MatchesMessageType(IReadOnlyList data) + { + return base.MatchesMessageType(data) && data[2] is 0 or 0x4 or 0x8 or 0xC; + } + } +} diff --git a/src/devices/Seatalk1/Messages/TurnDirection.cs b/src/devices/Seatalk1/Messages/TurnDirection.cs new file mode 100644 index 0000000000..979a77c2ff --- /dev/null +++ b/src/devices/Seatalk1/Messages/TurnDirection.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Iot.Device.Seatalk1.Messages +{ + /// + /// Turn direction, for Autopilot operation + /// + public enum TurnDirection + { + /// + /// Turn or turning to port (left) + /// + Port = 0, + + /// + /// Turn or turning to starboard (right) + /// + Starboard = 1, + } +} diff --git a/src/devices/Seatalk1/README.md b/src/devices/Seatalk1/README.md new file mode 100644 index 0000000000..047718c44c --- /dev/null +++ b/src/devices/Seatalk1/README.md @@ -0,0 +1,72 @@ +# Seatalk 1 Interface + +## Summary + +Seatalk, also called Seatalk1, is a bus protocol used by the marine equipment company Raymarine. It is used as a protocol to connect various devices on a boat, such as depth sounders, anemometers (wind sensors), autopilots and displays. The protocol is the successor of NMEA-0183, providing the main benefit of being able to connect various devices to a single bus, without the need of complex star networks and bridges as it was required for NMEA-0183. + +Data transfer uses a slow transmission rate of 4800 Baud, but this makes the bus quite stable with respect to interference. Collisions do occur, but as most messages are repeated at least every second, lost messages are typically negligible. + +Seatalk has been superseeded by NMEA-2000, but some older devices are still only available with NMEA-0183 or Seatalk. Interfaces to convert between the various standards are available from different vendors. + +> Note: Seatalk is often called Seatalk1, to distinguish it from SeatalkNG (Seatalk "Next Generation"). The latter is a branded version of NMEA-2000. NMEA-2000 and SeatalkNG are binary and electrically compatible, but use different plugs and sockets. + +## Binding Notes + +The binding provides the message definitions for various Seatalk messages. Using the proper interface (see below), it supports receiving and transmitting Seatalk messages. The binding is primarily intended to control older autopilots, such as the Raymarine ST1000+ and ST2000+. Not all known sentence types are supported, but the binding allows registering of further messages. + +A bi-directional Seatalk to NMEA-0183 message converter is also included. + +Example: (for full source, see example directory) + +```csharp +_seatalk = new SeatalkInterface("/dev/ttyAMA2"); // Or some other serial interface +_seatalk.MessageReceived += ParserOnNewMessageDecoded; +_seatalk.StartDecode(); +var ctrl = _seatalk.GetAutopilotRemoteController(); + +if (ctrl.SetStatus(AutopilotStatus.Auto, ref directionConfirmation)) +{ + Console.WriteLine("Autopilot set to AUTO mode"); +} +else +{ + Console.WriteLine("Setting AUTO mode FAILED!"); +} + +await Task.Delay(500); + +NavigationToWaypoint wp = new NavigationToWaypoint() +{ + BearingToDestination = Angle.FromDegrees(10), + CrossTrackError = Length.FromNauticalMiles(-0.11), + DistanceToDestination = Length.FromNauticalMiles(51.3), +}; + +_seatalk.SendMessage(wp); + +private void ParserOnNewMessageDecoded(SeatalkMessage obj) +{ + if (obj is Keystroke keystroke) + { + Console.WriteLine(); + Console.WriteLine($"Pressed key(s): {keystroke}"); + } +} + +``` + +## Physical interface + +The physical bus uses a kind of UART protocol, but since it uses a single wire both for sending and receiving, additional electronics are required to connect the bus to an UART (RS-232) interface. Protocol converters are available on the market. The following scheme shows a schematic that allows connecting a Seatalk network to a Raspberry Pi. The seatalk cable is connected to J3. The grey wire from the bus goes to GND, the yellow wire is the data wire and the red wire is +12V. In this schematic, connecting the 12V wire is optional as long as there's at least one other device on the bus that provides the necessary pull-up. The wiring shows a connection to TXD2/RXD2 (ttyAMA2 on linux), as this interface is easier to configure than the default one on GPIO14/15, as long as it's enabled in `boot/config.txt` with `dtoverlay=uart2`. + +![Seatalk-to-TTL-Uart](SeatalkInterface.png) + +When connecting to a default RS-232 interface (e.g. using an USB-to-RS-232 converter), the inverting stages Q2 on RXD and Q5 on TXD should be skipped. Powering the entire wiring via 12V should work with some minor adjustments, such as changing R9 to 470Ω to avoid destroying D1. + +## References + +Many tanks to Thomas Knauf for his extensive Seatalk protocol analysis. See [here](http://www.thomasknauf.de/seatalk.htm) + +OpenCPN Seatalk Support [here](https://opencpn.org/wiki/dokuwiki/doku.php?id=opencpn:supplementary_software:seatalk). + +The OpenCPN plugin "Raymarine Autopilot" can send the required keypress sentences for remote-controlling an autopilot, but needs an NMEA-0183 to Seatalk1 bridge, which can be built using this binding. diff --git a/src/devices/Seatalk1/Seatalk1.csproj b/src/devices/Seatalk1/Seatalk1.csproj new file mode 100644 index 0000000000..3d0adbedd7 --- /dev/null +++ b/src/devices/Seatalk1/Seatalk1.csproj @@ -0,0 +1,46 @@ + + + + $(DefaultBindingTfms) + + false + 9 + Iot.Device.Seatalk1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_Parameter1>$(AssemblyName).Tests + + + + + + diff --git a/src/devices/Seatalk1/Seatalk1.sln b/src/devices/Seatalk1/Seatalk1.sln new file mode 100644 index 0000000000..657f84cab2 --- /dev/null +++ b/src/devices/Seatalk1/Seatalk1.sln @@ -0,0 +1,98 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.33808.371 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seatalk1", "Seatalk1.csproj", "{B82C190A-642B-465B-BD3F-DB56FFF22253}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{03107CFF-FE00-467D-9B38-C00F7E12A7FE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seatalk1.Tests", "tests\Seatalk1.Tests.csproj", "{2B0F5D91-F38B-427D-84DB-5656D9661E1C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{6A4DE7B1-03F3-4EE0-BF73-A0BAEF88BA2B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seatalk1.Samples", "samples\Seatalk1.Samples.csproj", "{3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common", "..\Common\Common.csproj", "{A53E6BD4-A723-4B86-BC19-3B56D539D0B0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Nmea0183", "..\Nmea0183\Nmea0183.csproj", "{4715C6A2-09E1-4ECD-962C-7875D124EEA8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|x64.ActiveCfg = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|x64.Build.0 = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|x86.ActiveCfg = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Debug|x86.Build.0 = Debug|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|Any CPU.Build.0 = Release|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|x64.ActiveCfg = Release|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|x64.Build.0 = Release|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|x86.ActiveCfg = Release|Any CPU + {B82C190A-642B-465B-BD3F-DB56FFF22253}.Release|x86.Build.0 = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|x64.ActiveCfg = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|x64.Build.0 = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Debug|x86.Build.0 = Debug|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|Any CPU.Build.0 = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|x64.ActiveCfg = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|x64.Build.0 = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|x86.ActiveCfg = Release|Any CPU + {2B0F5D91-F38B-427D-84DB-5656D9661E1C}.Release|x86.Build.0 = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|x64.Build.0 = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Debug|x86.Build.0 = Debug|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|Any CPU.Build.0 = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|x64.ActiveCfg = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|x64.Build.0 = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|x86.ActiveCfg = Release|Any CPU + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF}.Release|x86.Build.0 = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|x64.ActiveCfg = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|x64.Build.0 = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Debug|x86.Build.0 = Debug|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|Any CPU.Build.0 = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|x64.ActiveCfg = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|x64.Build.0 = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|x86.ActiveCfg = Release|Any CPU + {A53E6BD4-A723-4B86-BC19-3B56D539D0B0}.Release|x86.Build.0 = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|x64.ActiveCfg = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|x64.Build.0 = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Debug|x86.Build.0 = Debug|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|Any CPU.Build.0 = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|x64.ActiveCfg = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|x64.Build.0 = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|x86.ActiveCfg = Release|Any CPU + {4715C6A2-09E1-4ECD-962C-7875D124EEA8}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2B0F5D91-F38B-427D-84DB-5656D9661E1C} = {03107CFF-FE00-467D-9B38-C00F7E12A7FE} + {3CFA13D6-1D29-4C87-B0C1-01A6901A50EF} = {6A4DE7B1-03F3-4EE0-BF73-A0BAEF88BA2B} + EndGlobalSection +EndGlobal diff --git a/src/devices/Seatalk1/Seatalk1Parser.cs b/src/devices/Seatalk1/Seatalk1Parser.cs new file mode 100644 index 0000000000..10a0eb8104 --- /dev/null +++ b/src/devices/Seatalk1/Seatalk1Parser.cs @@ -0,0 +1,265 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Device.Gpio; +using System.Device.I2c; +using System.Device.Spi; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading; +using Iot.Device.Common; +using Iot.Device.Seatalk1.Messages; +using Microsoft.Extensions.Logging; +using UnitsNet; + +namespace Iot.Device.Seatalk1 +{ + /// + /// Decodes a Seatalk1 Message stream + /// + public sealed class Seatalk1Parser : IDisposable + { + private readonly Stream _inputStream; + private readonly BinaryReader _reader; + private readonly object _lock; + private readonly List _buffer; + private readonly ILogger _logger; + + private Thread? _parserThread; + private CancellationTokenSource? _cancellationTokenSource; + private bool _disposed; + + private List _messageFactories; + + /// + /// Initializes a new instance of the class. + /// + /// The input stream. Must be non-null and readable + public Seatalk1Parser(Stream inputStream) + { + _lock = new object(); + _buffer = new List(20); + _disposed = false; + _logger = this.GetCurrentClassLogger(); + _inputStream = inputStream ?? throw new ArgumentNullException(nameof(inputStream)); + if (!inputStream.CanRead) + { + throw new ArgumentException("Input stream is not readable"); + } + + _reader = new BinaryReader(inputStream, Encoding.UTF8); + _messageFactories = new List() + { + new CompassHeadingAndRudderPosition(), + new CompassHeadingAutopilotCourse(), + new CompassHeadingAutopilotCourseAlt(), + new Keystroke(), + new DeadbandSetting(), + new SetLampIntensity(), + new AutopilotCalibrationParameterMessage(), + new ApparentWindAngle(), + new ApparentWindSpeed(), + new NavigationToWaypoint(), + new CourseComputerStatus(), + }; + + MaxMessageLength = _messageFactories.Select(x => x.ExpectedLength).Max(); + if (MaxMessageLength > 18) + { + throw new InvalidOperationException("At least one message reports an expected length > 18 bytes. This is illegal"); + } + } + + /// + /// The maximum length of all known messages (used to detect when the parser lost sync) + /// + private int MaxMessageLength { get; set; } + + /// + /// True if the input buffer is currently empty + /// + public bool IsBufferEmpty => _buffer.Count == 0; + + /// + /// This event is fired when a new message was decoded + /// + public event Action? NewMessageDecoded; + + /// + /// List of known messages + /// + internal List MessageTypes => _messageFactories; + + /// + /// Register a new message type + /// + /// An instance of the new message type + /// The definition of the message seems incorrect + public void RegisterMessageType(SeatalkMessage message) + { + if (message.ExpectedLength > 18) + { + throw new ArgumentException("The maximum length of a message is 18 bytes", nameof(message)); + } + + _messageFactories.Add(message); + MaxMessageLength = _messageFactories.Select(x => x.ExpectedLength).Max(); + } + + /// + /// Starts the thread to decode packets + /// + /// The parser is already running + /// The parser has already been disposed. The parser cannot currently be restarted. + public void StartDecode() + { + lock (_lock) + { + if (_parserThread != null && _parserThread.IsAlive) + { + throw new InvalidOperationException("Parser thread already started"); + } + + if (_disposed) + { + throw new ObjectDisposedException(nameof(Seatalk1Parser), "The parser has already been disposed, please reopen the source stream"); + } + + _cancellationTokenSource = new CancellationTokenSource(); + _parserThread = new Thread(Parser); + _parserThread.Name = $"Seatalk1 Parser"; + _parserThread.Start(); + } + } + + /// + /// Terminates the decoding thread. + /// + public void StopDecode() + { + _cancellationTokenSource?.Cancel(); + + lock (_lock) + { + _reader.Close(); + _inputStream.Close(); + } + + _parserThread?.Join(); + } + + private void Parser() + { + _logger.LogInformation("Seatalk1 decoder started"); + if (_cancellationTokenSource == null) + { + return; + } + + bool isInSync = true; + while (!_cancellationTokenSource.IsCancellationRequested) + { + try + { + while (true) + { + byte nextByte = _reader.ReadByte(); + _buffer.Add(nextByte); + tryAgainWithoutFirstByte: + var msg = GetTypeOfNextMessage(_buffer, out int messageLength); + if (msg == null && !isInSync) + { + // In this case, we also need to check whether a substring of _buffer is a valid message (but still starting at index 0) + // This is because we have only chopped the first byte from an invalid message, but the remaining (up to 17) bytes may now + // form a valid message, but with a different length + for (int len = 3; len < _buffer.Count; len++) + { + msg = GetTypeOfNextMessage(_buffer.GetRange(0, len), out messageLength); + if (msg != null) + { + break; + } + } + } + + if (msg == null) + { + if (messageLength == 0) + { + continue; + } + else + { + var bytesFound = BitConverter.ToString(_buffer.ToArray()); + _logger.LogWarning($"Seatalk parser sync lost. Buffer contents: {bytesFound}, trying to resync"); + _buffer.RemoveAt(0); + // We removed the first byte from the sequence, we need to try again before we add the next byte + isInSync = false; + goto tryAgainWithoutFirstByte; + } + } + + NewMessageDecoded?.Invoke(msg); + _buffer.RemoveRange(0, messageLength); + if (_buffer.Count == 0) + { + isInSync = true; + } + } + } + catch (Exception x) when (x is EndOfStreamException || x is IOException || x is ObjectDisposedException) + { + // Ignore + _logger.LogError(x, $"Seatalk Parser error: {x.Message}"); + } + + Thread.Sleep(50); + } + } + + /// + /// Returns the length of the message in the input buffer + /// + /// The data to decode + /// The number of bytes in the next message. Returns 0 if not enough data, -1 if sync lost (to many bytes, but no valid sentence) + /// An instance that can be used as factory for the next message or null if nothing can be decoded. + internal SeatalkMessage? GetTypeOfNextMessage(IReadOnlyList buffer, out int bytesInMessage) + { + // The minimum message length is 3 bytes + if (buffer.Count < 3) + { + bytesInMessage = 0; + return null; + } + + // The maximum length is 0xF + 3 = 18 or the maximum message length we know about + if (buffer.Count > MaxMessageLength) + { + bytesInMessage = -1; + return null; + } + + foreach (var t in _messageFactories) + { + if (t.MatchesMessageType(buffer)) + { + bytesInMessage = t.ExpectedLength; + return t.CreateNewMessage(buffer); + } + } + + bytesInMessage = 0; + return null; + } + + /// + public void Dispose() + { + StopDecode(); + } + } +} diff --git a/src/devices/Seatalk1/SeatalkInterface.cs b/src/devices/Seatalk1/SeatalkInterface.cs new file mode 100644 index 0000000000..bbe7e19007 --- /dev/null +++ b/src/devices/Seatalk1/SeatalkInterface.cs @@ -0,0 +1,298 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Iot.Device.Seatalk1.Messages; + +namespace Iot.Device.Seatalk1 +{ + /// + /// Seatalk interface handler. + /// This class is the main handler for talking over a seatalk network. + /// Only when also working with NMEA-0183, the should be used instead. + /// + public class SeatalkInterface : MarshalByRefObject, IDisposable + { + private const Parity DefaultParity = Parity.Even; + private readonly SerialPort _port; + private readonly Seatalk1Parser _parser; + private readonly Thread _watchDog; + private readonly CancellationTokenSource _cancellation; + private readonly AutoPilotRemoteController _autopilotController; + private readonly object _lock; + private bool _disposed; + + /// + /// This event is fired with every received message + /// + public event Action? MessageReceived; + + /// + /// Creates a new instance of the SeatalkInterface, that provides high-level functions on a seatalk bus + /// + /// The Uart name that connects to the bus, e.g. /dev/ttyAMA2 or COM5 + /// The uart string is null + /// The port could not be opened + /// The port could not be accessed. Maybe it is already open by another application? + /// + /// Unlike other classes that communicate over a serial port, this object requires to own the serial port itself, as it needs to + /// set it up in a special way and change the communication parameters during operation. + /// + public SeatalkInterface(string uart) + : this() + { + if (uart == null) + { + throw new ArgumentNullException(nameof(uart)); + } + + _port = new SerialPort(uart); + _port.BaudRate = 4800; + _port.Parity = DefaultParity; // Can be anything but none, but "Mark" or "Space" won't have the desired effect on linux, causing garbage to be sent + _port.StopBits = StopBits.One; + _port.DataBits = 8; + _port.Open(); + + _parser = new Seatalk1Parser(_port.BaseStream); + _parser.NewMessageDecoded += OnNewMessage; + } + + /// + /// This constructor is for mocking only! + /// + protected SeatalkInterface() + { + _lock = new object(); + _port = null!; + _parser = null!; + _autopilotController = new AutoPilotRemoteController(this); + _cancellation = new CancellationTokenSource(); + _watchDog = new Thread(WatchDogStarter); + _disposed = false; + } + + /// + /// Provides access to the internal parser + /// + public Seatalk1Parser Parser => _parser; + + /// + /// Starts listening on the port + /// + public void StartDecode() + { + _parser.StartDecode(); + _watchDog.Start(); + } + + private static int BitCount(int b) + { + int count = 0; + while (b != 0) + { + count++; + b &= (b - 1); // walking through all the bits which are set to one + } + + return count; + } + + /// + /// This calculates the correct parity for each byte in the datagram. + /// + /// The datagram to send (first byte is the command byte, remainder are the arguments) + /// A list of bytes with parity information + /// + /// We need to send the first byte (the command byte) with a parity of "mark" (=1), all the remaining bytes with a parity of "space" (=0), + /// but since Linux doesn't seem to properly support Mark or Space parity settings (on the raspberry pi, that setting results in no parity bit to be sent) + /// we cheat and count what the parity bit should be and use even or odd to achieve the desired result. + /// + internal static List<(byte B, Parity P, int Index)> CalculateParityForEachByte(byte[] data) + { + bool isCommandByte = true; + List<(byte, Parity, int)> ret = new(); + for (int i = 0; i < data.Length; i++) + { + byte b = data[i]; + bool isEven = BitCount(b) % 2 == 0; + Parity parityToSend; + if (isEven) + { + if (isCommandByte) + { + // command byte so far is even, we need the parity bit to be 1, so use odd parity + // (because the parity setting "odd" means that the data bits including the parity bit count to odd) + parityToSend = Parity.Odd; + } + else + { + parityToSend = Parity.Even; + } + } + else + { + if (isCommandByte) + { + parityToSend = Parity.Even; + } + else + { + parityToSend = Parity.Odd; + } + } + + ret.Add((data[i], parityToSend, i)); + isCommandByte = false; + } + + return ret; + } + + /// + /// Periodic watchdog tasks + /// + private void WatchDogStarter() + { + while (!_cancellation.IsCancellationRequested) + { + WatchDog(); + Thread.Sleep(1000); + } + } + + /// + /// Watchdog function. Called at regular intervals for some housekeeping. The + /// default implementation checks for lost connections with the autopilot. + /// + protected virtual void WatchDog() + { + _autopilotController.UpdateStatus(); + } + + internal void OnNewMessage(SeatalkMessage obj) + { + MessageReceived?.Invoke(obj); + } + + /// + /// Synchronously send a datagram. This is a low-level function, prefer instead. + /// + /// The datagram + /// + /// True on success, false otherwise. May fail e.g. if the bus is busy all the time. + /// Todo: This doesn't do any checks for collisions just yet. + /// + public virtual bool SendDatagram(byte[] data) + { + // First calculate the required parity setting for each byte. + var dataWithParity = CalculateParityForEachByte(data); + + // Only start sending if the buffer is empty. This should hopefully avoid to many collisions + while (!_parser.IsBufferEmpty) + { + // Sending a message takes 1 - 2ms, so wait a bit (knowing that this sleep isn't precise) + Thread.Sleep(1); + } + + // Only one thread at a time, please! + lock (_lock) + { + foreach (var e in dataWithParity) + { + // The many flushes here appear to be necessary to make sure the parity correctly applies to the next byte we send (and only to the next) + if (_port.Parity != e.P) + { + _port.BaseStream.Flush(); + _port.Parity = e.P; + _port.BaseStream.Flush(); + } + + _port.Write(data, e.Index, 1); + } + + _port.BaseStream.Flush(); + _port.Parity = DefaultParity; + } + + return true; + } + + /// + /// Synchronously send the given message + /// + /// The message to send + /// Transmission of Seatalk messages can be very slow and include considerable delays. Also, there's no guarantee the + /// message is successfully transmitted or received anywhere. + public virtual bool SendMessage(SeatalkMessage message) + { + byte[] bytes = message.CreateDatagram(); + return SendDatagram(bytes); + } + + /// + /// Synchronously send the given message + /// + /// The message to send + /// Transmission of Seatalk messages can be very slow and include considerable delays. Also, there's no guarantee the + /// message is successfully transmitted or received anywhere. + public Task SendMessageAsync(SeatalkMessage message) + { + return Task.Factory.StartNew(() => SendMessage(message)); + } + + /// + /// Get an interface to the Autopilot remote controller. + /// + /// An interface to monitor and control an Autopilot connected via Seatalk1 + public AutoPilotRemoteController GetAutopilotRemoteController() => _autopilotController; + + /// + /// Configures the display backlight of all devices connected to the bus, as far as this is supported + /// (e.g. the ST2000 autopilot only supports on or off) + /// + /// The new backlight level + public void SetLampIntensity(DisplayBacklightLevel intensity) + { + var msg = new SetLampIntensity(intensity); + SendMessage(msg); + } + + /// + /// Default dispose method + /// + /// Always true + protected virtual void Dispose(bool disposing) + { + if (_disposed) + { + return; + } + + if (disposing) + { + _cancellation.Cancel(); + _parser.StopDecode(); + _parser.Dispose(); + _port.Close(); + _port.Dispose(); + _watchDog.Join(); + _cancellation.Dispose(); + _disposed = true; + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/devices/Seatalk1/SeatalkInterface.png b/src/devices/Seatalk1/SeatalkInterface.png new file mode 100644 index 0000000000..68e0227486 Binary files /dev/null and b/src/devices/Seatalk1/SeatalkInterface.png differ diff --git a/src/devices/Seatalk1/SeatalkToNmeaConverter.cs b/src/devices/Seatalk1/SeatalkToNmeaConverter.cs new file mode 100644 index 0000000000..a7ad728676 --- /dev/null +++ b/src/devices/Seatalk1/SeatalkToNmeaConverter.cs @@ -0,0 +1,174 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using Iot.Device.Common; +using Iot.Device.Nmea0183; +using Iot.Device.Nmea0183.Sentences; +using Iot.Device.Seatalk1.Messages; +using Microsoft.Extensions.Logging; +using UnitsNet; + +namespace Iot.Device.Seatalk1 +{ + /// + /// Seatalk to NMEA-0183 converter. + /// This subclasses and hence can be included in a , which will make + /// the Seatalk interface look very similar to an NMEA-0183 interface. + /// This class embeds the , so no extra instance is required if this class is used. The class supports translation + /// of directly wrapped seatalk messages (that start with $STALK) as well as a set of navigation messages (see ) + /// + public class SeatalkToNmeaConverter : NmeaSinkAndSource + { + private readonly List _sentencesToTranslate; + private SeatalkInterface _seatalkInterface; + private bool _isDisposed; + private ILogger _logger; + + /// + /// Construct an instance of this class. + /// + /// Interface name, for message routing. Can be an arbitrary string. + /// Interface to connect to. e.g. "/dev/ttyAMA2" + public SeatalkToNmeaConverter(string interfaceName, string portName) + : base(interfaceName) + { + _sentencesToTranslate = new(); + _logger = this.GetCurrentClassLogger(); + _seatalkInterface = new SeatalkInterface(portName); + _seatalkInterface.MessageReceived += SeatalkMessageReceived; + _isDisposed = false; + } + + /// + /// List of sentences to translate between Seatalk and NMEA. + /// + /// + /// The following sentences are currently supported: + /// HTD (Seatalk->Nmea) + /// RSA (Seatalk->Nmea) + /// MWV (Nmea->Seatalk) + /// RMB (Nmea->Seatalk) + /// + public List SentencesToTranslate => _sentencesToTranslate; + + private void SeatalkMessageReceived(SeatalkMessage stalk) + { + var nmeaMsg = new SeatalkNmeaMessage(stalk.CreateDatagram(), DateTimeOffset.UtcNow); + _logger.LogDebug($"Received Seatalk message: {stalk}"); + DispatchSentenceEvents(nmeaMsg); + + // Translations Seatalk->Nmea + if (stalk is CompassHeadingAutopilotCourse apStatus) + { + if (SentencesToTranslate.Contains(HeadingAndTrackControlStatus.Id) || SentencesToTranslate.Contains(SentenceId.Any)) + { + string status = apStatus.AutopilotStatus switch + { + AutopilotStatus.Standby => "M", + AutopilotStatus.Auto => "S", + AutopilotStatus.Track => "T", + AutopilotStatus.Wind => "W", // This one is just guess + _ => "M", + }; + var htd = new HeadingAndTrackControlStatus(status, apStatus.RudderPosition.Abs(), apStatus.RudderPosition > Angle.Zero ? "R" : "L", "N", + null, null, null, null, apStatus.AutoPilotCourse, null, apStatus.AutoPilotCourse, false, false, false, apStatus.Alarms != 0, apStatus.CompassHeading); + DispatchSentenceEvents(htd); + } + + if (SentencesToTranslate.Contains(RudderSensorAngle.Id) || SentencesToTranslate.Contains(SentenceId.Any)) + { + var angle = apStatus.RudderPosition; + var rsa = new RudderSensorAngle(angle, null); + DispatchSentenceEvents(rsa); + } + } + } + + /// + /// Start receiving data + /// + /// The instance has already been disposed + public override void StartDecode() + { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(SeatalkToNmeaConverter)); + } + + _seatalkInterface.StartDecode(); + } + + /// + /// Send a sentence through the Seatalk port. This ignores unknown or disabled sentences. + /// + /// The source + /// The sentence to send + /// + /// This sends out a message when it is valid and it is a $STALK message and this instance is not the source. Or when the + /// message is valid and one of the supported messages to send as specified in . + /// + public override void SendSentence(NmeaSinkAndSource source, NmeaSentence sentence) + { + if (sentence.Valid == false) + { + return; + } + + if (sentence.SentenceId == SeatalkNmeaMessage.Id) + { + // Since we get all commands we send out back on this interface, we must make sure we're not bouncing those again + if (sentence is SeatalkNmeaMessage msg && source != this) + { + var data = msg.Datagram; + _seatalkInterface.SendDatagram(data); + } + } + + if (DoTranslate(sentence, out WindSpeedAndAngle? mwv) && mwv != null) + { + ApparentWindAngle awa = new ApparentWindAngle() + { + ApparentAngle = mwv.Angle + }; + _seatalkInterface.SendMessage(awa); + + ApparentWindSpeed aws = new ApparentWindSpeed() + { + ApparentSpeed = mwv.Speed, + }; + _seatalkInterface.SendMessage(aws); + } + + if (DoTranslate(sentence, out RecommendedMinimumNavToDestination? rmb) && rmb != null) + { + // RMB should always report true bearing. + NavigationToWaypoint nwp = new NavigationToWaypoint(rmb.CrossTrackError, rmb.BearingToWayPoint, true, rmb.DistanceToWayPoint); + _seatalkInterface.SendMessage(nwp); + } + } + + private bool DoTranslate(NmeaSentence sentence, out T? convertedSentence) + where T : NmeaSentence + { + if (sentence is T converted && (SentencesToTranslate.Contains(sentence.SentenceId) || SentencesToTranslate.Contains(SentenceId.Any))) + { + convertedSentence = converted; + return true; + } + + convertedSentence = default(T); + return false; + } + + /// + /// Terminate the parsing + /// + public override void StopDecode() + { + _seatalkInterface.Dispose(); + _isDisposed = true; + } + } +} diff --git a/src/devices/Seatalk1/samples/README.md b/src/devices/Seatalk1/samples/README.md new file mode 100644 index 0000000000..c7e16de82f --- /dev/null +++ b/src/devices/Seatalk1/samples/README.md @@ -0,0 +1,3 @@ +# TODO: This needs to be determined + +Help Wanted Please diff --git a/src/devices/Seatalk1/samples/Seatalk1.Samples.cs b/src/devices/Seatalk1/samples/Seatalk1.Samples.cs new file mode 100644 index 0000000000..17f81dfba6 --- /dev/null +++ b/src/devices/Seatalk1/samples/Seatalk1.Samples.cs @@ -0,0 +1,236 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Device.Gpio; +using System.Device.I2c; +using System.Device.Spi; +using System.Threading; +using System.IO.Ports; +using System.Threading.Tasks; +using Iot.Device.Common; +using Iot.Device.Nmea0183.Sentences; +using Iot.Device.Seatalk1; +using Iot.Device.Seatalk1.Messages; +using Microsoft.Extensions.Logging; +using UnitsNet; + +namespace Seatalk1Sample +{ + internal class Program + { + private SeatalkInterface? _seatalk; + + internal static int Main(string[] args) + { + Console.WriteLine("Hello Seatalk1 Sample!"); + + if (args.Length == 0) + { + Console.WriteLine("Error: Port not specified"); + return 1; + } + + var p = new Program(); + p.Run(args); + return 0; + } + + public async void Run(string[] args) + { + LogDispatcher.LoggerFactory = new SimpleConsoleLoggerFactory(LogLevel.Trace); + + _seatalk = new SeatalkInterface(args[0]); + + _seatalk.MessageReceived += ParserOnNewMessageDecoded; + + _seatalk.StartDecode(); + + var ctrl = _seatalk.GetAutopilotRemoteController(); + + WriteCurrentState(); + + Angle windAngle = Angle.Zero; + + TurnDirection? directionConfirmation = null; + + while (true) + { + if (Console.KeyAvailable) + { + var key = Console.ReadKey(true); + if (key.Key == ConsoleKey.Escape) + { + break; + } + + Keystroke ks = new Keystroke(); + switch (key.Key) + { + case ConsoleKey.A: + ks = new Keystroke(AutopilotButtons.MinusOne); + break; + case ConsoleKey.D: + ks = new Keystroke(AutopilotButtons.PlusOne); + break; + case ConsoleKey.Q: + ks = new Keystroke(AutopilotButtons.MinusTen); + break; + case ConsoleKey.E: + ks = new Keystroke(AutopilotButtons.PlusTen); + break; + case ConsoleKey.W: + { + if (ctrl.SetStatus(AutopilotStatus.Auto, ref directionConfirmation)) + { + Console.WriteLine("Autopilot set to AUTO mode"); + } + else + { + Console.WriteLine("Setting AUTO mode FAILED!"); + } + + break; + } + + case ConsoleKey.X: + { + // This is expected to fail if the AP has no wind data + if (ctrl.SetStatus(AutopilotStatus.Wind, ref directionConfirmation)) + { + Console.WriteLine("Autopilot set to WIND mode"); + } + else + { + Console.WriteLine("Setting WIND mode FAILED!"); + } + + break; + } + + case ConsoleKey.U: + { + await ctrl.TurnByAsync(Angle.FromDegrees(90), TurnDirection.Starboard, CancellationToken.None); + + break; + } + + case ConsoleKey.Z: + { + await ctrl.TurnByAsync(Angle.FromDegrees(90), TurnDirection.Port, CancellationToken.None); + + break; + } + + case ConsoleKey.K: + if (ctrl.DeadbandMode == DeadbandMode.Automatic) + { + ctrl.SetDeadbandMode(DeadbandMode.Minimal); + } + else + { + ctrl.SetDeadbandMode(DeadbandMode.Automatic); + } + + break; + + case ConsoleKey.T: + { + // This is expected to fail if the AP has no wind data + if (ctrl.SetStatus(AutopilotStatus.Track, ref directionConfirmation)) + { + Console.WriteLine("Autopilot set to TRACK mode"); + directionConfirmation = null; + } + else + { + Console.WriteLine("Setting TRACK mode incomplete!"); + if (directionConfirmation == TurnDirection.Port) + { + Console.WriteLine("Press T again to confirm a turn to Port"); + } + else + { + Console.WriteLine("Press T again to confirm a turn to Starboard"); + } + } + + break; + } + + case ConsoleKey.S: + directionConfirmation = null; + if (ctrl.SetStatus(AutopilotStatus.Standby, ref directionConfirmation)) + { + Console.WriteLine("Autopilot set to STANDBY mode"); + } + + break; + case ConsoleKey.L: + if (key.Modifiers == ConsoleModifiers.Shift) + { + _seatalk.SetLampIntensity(DisplayBacklightLevel.Off); + } + else + { + _seatalk.SetLampIntensity(DisplayBacklightLevel.Level3); + } + + break; + + } + + if (ks.ButtonsPressed != AutopilotButtons.None) + { + _seatalk.SendMessage(ks); + } + } + + await Task.Delay(500); + + NavigationToWaypoint wp = new NavigationToWaypoint() + { + BearingToDestination = Angle.FromDegrees(10), + CrossTrackError = Length.FromNauticalMiles(-0.11), + DistanceToDestination = Length.FromNauticalMiles(51.3), + }; + + _seatalk.SendMessage(wp); + + windAngle = windAngle + Angle.FromDegrees(1.5); + // SendRandomWindAngle(windAngle); + WriteCurrentState(); + } + + _seatalk.Dispose(); + _seatalk = null; + + Console.WriteLine("Program is terminating"); + } + + private void SendRandomWindAngle(Angle angle) + { + var windMsg = new ApparentWindAngle(angle); + _seatalk?.SendMessage(windMsg); + } + + private void WriteCurrentState() + { + var ctrl = _seatalk?.GetAutopilotRemoteController(); + if (ctrl != null) + { + Console.Write("\r"); + Console.Write(ctrl.ToString()); + } + } + + private void ParserOnNewMessageDecoded(SeatalkMessage obj) + { + if (obj is Keystroke keystroke) + { + Console.WriteLine(); + Console.WriteLine($"Pressed key(s): {keystroke}"); + } + } + } +} diff --git a/src/devices/Seatalk1/samples/Seatalk1.Samples.csproj b/src/devices/Seatalk1/samples/Seatalk1.Samples.csproj new file mode 100644 index 0000000000..a6066e17da --- /dev/null +++ b/src/devices/Seatalk1/samples/Seatalk1.Samples.csproj @@ -0,0 +1,16 @@ + + + + Exe + $(DefaultSampleTfms) + + + + + + + + + + + diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/BC547_and_BC557.lib b/src/devices/Seatalk1/schematics/SeaTalk1/BC547_and_BC557.lib new file mode 100644 index 0000000000..d085164072 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/BC547_and_BC557.lib @@ -0,0 +1,26 @@ +*Models for bc547a and similar transistors + +.model bc547a NPN BF=400 NE=1.3 ISE=10.3F IKF=50M IS=10F VAF=80 ikr=12m ++ BR=9.5 NC=2 VAR=10 RB=280 RE=1 RC=40 VJE=0.48 tr=0.3u tf=0.5n ++ cje=12p vje=0.48 mje=0.5 cjc=6p vjc=0.7 ++ mjc=0.33 isc=47p kf=2f + +.model bc547b NPN BF=500 NE=1.3 ISE=9.72F IKF=80M IS=20F VAF=50 ikr=12m ++ BR=10 NC=2 VAR=10 RB=280 RE=1 RC=40 VJE=.48 tr=.3u tf=.5n ++cje=12p vje=.48 mje=.5 cjc=6p vjc=.7 mjc=.33 isc=47p kf=2f + +.model bc547c NPN BF=730 NE=1.4 ISE=29.5F IKF=80M IS=60F VAF=25 ikr=12m ++ BR=10 NC=2 VAR=10 RB=280 RE=1 RC=40 VJE=.48 tr=.3u tf=.5n ++cje=12p vje=.48 mje=.5 cjc=6p vjc=.7 mjc=.33 isc=47.6p kf=2f + +.model BC557a PNP BF=190 NE=1.5 ISE=12F IKF=90M IS=10F VAF=50 ikr=12m ++ nc=2 br=4 var=10 rb=280 re=1 rc=40 vje=.48 tf=.5n tr=.3u ++cje=12p vje=.48 mje=.5 cjc=6p vjc=.7 mjc=.33 isc=47.6p kf=2f + +.model BC557b PNP BF=335 NE=1.5 ISE=7.35F IKF=82M IS=10F VAF=40 ikr=12m ++ nc=2 br=4 var=10 rb=280 re=1 rc=40 vje=.48 tf=.5n tr=.3u ++cje=12p vje=.48 mje=.5 cjc=6p vjc=.7 mjc=.33 isc=47.6p kf=2f + +.model BC557c PNP BF=490 NE=1.5 ISE=12.4F IKF=78M IS=60F VAF=36 ikr=12m ++ nc=2 br=4 var=10 rb=280 re=1 rc=40 vje=.48 tf=.5n tr=.3u ++cje=12p vje=.48 mje=.5 cjc=6p vjc=.7 mjc=.33 isc=47.6p kf=2f diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/Leds.lib b/src/devices/Seatalk1/schematics/SeaTalk1/Leds.lib new file mode 100644 index 0000000000..9b2a9a6ad7 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/Leds.lib @@ -0,0 +1,3 @@ +.model DLED_Sim D (IS=1a RS=3.3 N=1.8) + +.model DLED_Nichia D (IS=2.5939E-13 N=4.0113 RS=0.24229 IKF=0 EG=3 XTI=25) diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.csv b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.csv new file mode 100644 index 0000000000..1d11e8554e --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.csv @@ -0,0 +1,13 @@ +"#","Reference","Qty","Value","Footprint","DNP" +"1","C1","1","150u","Capacitor_THT:CP_Radial_D12.5mm_P7.50mm","" +"2","D1","1","blue","LED_THT:LED_D3.0mm_Horizontal_O3.81mm_Z6.0mm","" +"3","J1","1","Raspberry_Pi_2_3","Connector_PinSocket_2.54mm:PinSocket_2x20_P2.54mm_Vertical","" +"4","J3","1","Conn_01x03_Pin","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","" +"5","Q1","1","BC557","Package_TO_SOT_THT:TO-92_Inline","" +"6","Q2, Q3, Q4, Q5, Q6","5","BC547","Package_TO_SOT_THT:TO-92_Inline","" +"7","R1, R7","2","22k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" +"8","R2, R3, R8, R14","4","2.2k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" +"9","R4, R5, R6","3","4.7k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" +"10","R9","1","100","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" +"11","R10","1","1.5k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" +"12","R12, R13, R15","3","10k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","" diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pcb b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pcb new file mode 100644 index 0000000000..919ba8de97 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pcb @@ -0,0 +1,6773 @@ +(kicad_pcb (version 20221018) (generator pcbnew) + + (general + (thickness 1.6) + ) + + (paper "A4") + (title_block + (title "Seatalk1-Raspi Interface") + (date "2024-01-03") + (rev "1") + ) + + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + ) + + (setup + (stackup + (layer "F.SilkS" (type "Top Silk Screen")) + (layer "F.Paste" (type "Top Solder Paste")) + (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01)) + (layer "F.Cu" (type "copper") (thickness 0.035)) + (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) + (layer "B.Cu" (type "copper") (thickness 0.035)) + (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01)) + (layer "B.Paste" (type "Bottom Solder Paste")) + (layer "B.SilkS" (type "Bottom Silk Screen")) + (copper_finish "None") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros false) + (usegerberextensions false) + (usegerberattributes true) + (usegerberadvancedattributes true) + (creategerberjobfile true) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (dxfpolygonmode true) + (dxfimperialunits true) + (dxfusepcbnewfont true) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (sketchpadsonfab false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(Q2-B)") + (net 3 "Net-(D1-K)") + (net 4 "Net-(D1-A)") + (net 5 "VCC_3.3") + (net 6 "VCC_5.0") + (net 7 "unconnected-(J1-SDA{slash}GPIO2-Pad3)") + (net 8 "unconnected-(J1-SCL{slash}GPIO3-Pad5)") + (net 9 "GND") + (net 10 "unconnected-(J1-GCLK0{slash}GPIO4-Pad7)") + (net 11 "TXD") + (net 12 "unconnected-(J1-GPIO14{slash}TXD-Pad8)") + (net 13 "unconnected-(J1-GPIO17-Pad11)") + (net 14 "unconnected-(J1-GPIO18{slash}PWM0-Pad12)") + (net 15 "unconnected-(J1-GPIO27-Pad13)") + (net 16 "unconnected-(J1-GPIO22-Pad15)") + (net 17 "unconnected-(J1-GPIO23-Pad16)") + (net 18 "unconnected-(J1-GPIO24-Pad18)") + (net 19 "unconnected-(J1-MOSI0{slash}GPIO10-Pad19)") + (net 20 "unconnected-(J1-MISO0{slash}GPIO9-Pad21)") + (net 21 "unconnected-(J1-GPIO25-Pad22)") + (net 22 "unconnected-(J1-SCLK0{slash}GPIO11-Pad23)") + (net 23 "unconnected-(J1-~{CE0}{slash}GPIO8-Pad24)") + (net 24 "unconnected-(J1-~{CE1}{slash}GPIO7-Pad26)") + (net 25 "unconnected-(J1-GPIO15{slash}RXD-Pad10)") + (net 26 "Net-(J1-ID_SC{slash}GPIO1)") + (net 27 "unconnected-(J1-GCLK1{slash}GPIO5-Pad29)") + (net 28 "unconnected-(J1-GCLK2{slash}GPIO6-Pad31)") + (net 29 "unconnected-(J1-PWM0{slash}GPIO12-Pad32)") + (net 30 "unconnected-(J1-PWM1{slash}GPIO13-Pad33)") + (net 31 "unconnected-(J1-GPIO19{slash}MISO1-Pad35)") + (net 32 "unconnected-(J1-GPIO16-Pad36)") + (net 33 "unconnected-(J1-GPIO26-Pad37)") + (net 34 "unconnected-(J1-GPIO20{slash}MOSI1-Pad38)") + (net 35 "unconnected-(J1-GPIO21{slash}SCLK1-Pad40)") + (net 36 "SEATALK") + (net 37 "Net-(J3-Pin_3)") + (net 38 "Net-(Q1-C)") + (net 39 "Net-(Q1-B)") + (net 40 "Net-(Q4-B)") + (net 41 "Net-(Q5-C)") + (net 42 "Net-(Q5-B)") + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 143a716d-6648-4d65-9154-fb626eeef15e) + (at 87 66) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/4f117a73-66ee-4224-8fe8-71a32870a260") + (attr through_hole) + (fp_text reference "R6" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp df30d407-10fc-4865-9529-3c57fcf75ccb) + ) + (fp_text value "4.7k" (at 8 -2.5) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a43b9c0f-d826-4ec4-894e-737d4f2cb7d3) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp b96df36c-6861-4e6d-a588-ea3f3cc72b6a) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 658d4661-3ba9-4556-9488-1880fe83bd80)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 59bb453e-1c08-4404-8324-c244dba71003)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4ba5ae23-e2ef-4a6c-aa41-f38097a799e3)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 678a0e4d-1472-4b59-8362-5403f42a51f5)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f761f3cb-049e-425f-b071-af2973ad67c7)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 416bb320-9fb0-48b8-9bcb-01170a38a0ce)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3f8e4a6e-f3c9-43fb-a8b8-0fef9fffbdae)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp d338923c-36de-4b53-a8d6-68071084701f)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp a8ed4ea9-0e86-42de-b55f-413972beb4af)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c6986d1d-1a7c-4aa5-b044-0629a8c4c7bd)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d1500a86-34bd-4fe2-a738-de62666094fe)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 82e15b48-0cd0-4a5a-a1cd-32ce77d1728e)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 0ea4c932-4090-49c9-8fa0-f89d2e397529)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a24d208b-5fdf-46ae-bf7f-585391db123d)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp cd795676-bd34-43b7-81ea-342530587815)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 136850c4-c28e-49aa-8bde-e54bbeaf07cb)) + (pad "1" thru_hole circle (at 0 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 1 "Net-(C1-Pad1)") (pintype "passive") (tstamp c8b618bd-cd4e-461c-97ab-8a4aa783dce5)) + (pad "2" thru_hole oval (at 10.16 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pintype "passive") (tstamp 13fd7acb-dba0-41b1-90d9-c06ab66880e7)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp 1f42dcc5-eeaa-4e46-b2ae-97adbb29e215) + (at 117.96 60) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "NPN") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "bc547b") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92") + (property "ki_keywords" "NPN Transistor") + (path "/9fb6ea96-3606-4642-89c7-d6759aecd3a2") + (attr through_hole) + (fp_text reference "Q2" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 66d312a6-4601-4ca2-b42e-2b4a1bf91fee) + ) + (fp_text value "BC547" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6e837be2-9026-4534-8b37-de54e9c50939) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 466143c4-0306-430b-9421-41f839349327) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d1ffc7a8-6030-4c39-a136-fbd214514997)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 50c625e0-7977-4bdd-be2a-013ef50afdc7)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 563000a5-7b9c-498b-a21e-72933aa8e5b5)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp cdf42ae7-59fb-4a6c-9038-c3b0bc565b78)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b752108e-36b7-4f34-b199-6b11d5c0d498)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c14ecd52-a16b-4a13-936a-a0708a903cbb)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 6679d865-fef7-4ced-ac8c-6a9d74ffef62)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 8c78d38a-68e4-47b7-8304-1a14b0fe5409)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp caa5b353-95dc-4588-b285-ea207c7061fb)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f1966e35-ff93-4ef8-b0a1-627c07ebf593)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 26 "Net-(J1-ID_SC{slash}GPIO1)") (pinfunction "C") (pintype "passive") (tstamp 886df849-4ba5-4146-9eda-70c6ec222944)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 2 "Net-(Q2-B)") (pinfunction "B") (pintype "input") (tstamp b7810ae4-9e2a-440d-9be8-8b5e7738d046)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "E") (pintype "passive") (tstamp 0d63f7b5-d5c7-4847-88cc-b282a427a401)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "LED_THT:LED_D3.0mm_Horizontal_O3.81mm_Z6.0mm" (layer "F.Cu") + (tstamp 25808193-2af6-4752-970c-26256f1fa393) + (at 115.75 93.9) + (descr "LED, diameter 3.0mm z-position of LED center 2.0mm, 2 pins, diameter 3.0mm z-position of LED center 2.0mm, 2 pins, diameter 3.0mm z-position of LED center 2.0mm, 2 pins, diameter 3.0mm z-position of LED center 6.0mm, 2 pins, diameter 3.0mm z-position of LED center 6.0mm, 2 pins") + (tags "LED diameter 3.0mm z-position of LED center 2.0mm 2 pins diameter 3.0mm z-position of LED center 2.0mm 2 pins diameter 3.0mm z-position of LED center 2.0mm 2 pins diameter 3.0mm z-position of LED center 6.0mm 2 pins diameter 3.0mm z-position of LED center 6.0mm 2 pins") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "D") + (property "Sim.Library" "Leds.lib") + (property "Sim.Name" "DLED_Nichia") + (property "Sim.Params" "is=259390a") + (property "Sim.Pins" "1=K 2=A") + (property "ki_description" "Light emitting diode") + (property "ki_keywords" "LED diode") + (path "/88a72208-5af9-4097-94e1-8cb31aaadfea") + (attr through_hole) + (fp_text reference "D1" (at 1.27 -1.96) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ed011d75-c95f-4703-87d4-4d2cc0e064f8) + ) + (fp_text value "blue" (at 1.27 10.17) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8c3ad186-092d-40b5-a9ba-69a2a942b952) + ) + (fp_line (start -0.29 3.75) (end -0.29 7.61) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d57cb4e6-a45e-402c-89d9-f8dfb2108037)) + (fp_line (start -0.29 3.75) (end 2.83 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a878550b-ccee-416a-83e5-47469396e6fb)) + (fp_line (start 0 1.08) (end 0 1.08) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d3cc7ec9-2e84-4fed-a99e-424ce01300f7)) + (fp_line (start 0 1.08) (end 0 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9c4e3636-5ac8-4ad1-8941-d9d2c22dbdd4)) + (fp_line (start 0 3.75) (end 0 1.08) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e79c7d6d-8fb5-449b-bbf2-14e0777be246)) + (fp_line (start 0 3.75) (end 0 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f47b1f53-bf2d-4909-8006-e40c8f503f79)) + (fp_line (start 2.54 1.08) (end 2.54 1.08) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fed21792-e0bd-43c0-aa26-412aae97718f)) + (fp_line (start 2.54 1.08) (end 2.54 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 930c20cd-a7bf-4bd3-bd96-67fd20e18112)) + (fp_line (start 2.54 3.75) (end 2.54 1.08) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fe241723-e90c-48c7-a065-281bdf1b4bbd)) + (fp_line (start 2.54 3.75) (end 2.54 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c486d7e4-9598-47b2-a082-b64e8a9f9359)) + (fp_line (start 2.83 3.75) (end 2.83 7.61) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3d1adbb6-f7e9-4a18-ba47-bab71aeb634d)) + (fp_line (start 2.83 3.75) (end 3.23 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d8bdd4bb-cc3e-41be-833a-dbf8a97d6a02)) + (fp_line (start 2.83 4.87) (end 2.83 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 205b5bf0-2246-4288-a8b9-69e1382f351f)) + (fp_line (start 3.23 3.75) (end 3.23 4.87) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3906c52c-350f-4415-9d84-4bab78aef20a)) + (fp_line (start 3.23 4.87) (end 2.83 4.87) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ff3e0986-2e7f-400d-9368-6abd44161984)) + (fp_arc (start 2.83 7.61) (mid 1.27 9.17) (end -0.29 7.61) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2388aa19-8e87-485d-9a46-788f6b96da9d)) + (fp_line (start -1.25 -1.25) (end -1.25 9.45) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 98c2473b-692d-49c2-bdf2-e9a6f4e4e343)) + (fp_line (start -1.25 9.45) (end 3.75 9.45) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp e1494dfa-b0c8-4ebd-98e6-036fb30ffa96)) + (fp_line (start 3.75 -1.25) (end -1.25 -1.25) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8c4602fe-071d-4eb0-96ce-a18faa4ac34b)) + (fp_line (start 3.75 9.45) (end 3.75 -1.25) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp a8947a4d-dd09-4078-b30a-dacd3164a15e)) + (fp_line (start -0.23 3.81) (end -0.23 7.61) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 724f9769-fa89-43d1-9ee6-b8d9bbe6f464)) + (fp_line (start -0.23 3.81) (end 2.77 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1f24f019-aedf-45d8-8088-f64f2fe614e4)) + (fp_line (start 0 0) (end 0 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 83ca193a-6519-493e-b492-6d394ca85c62)) + (fp_line (start 0 0) (end 0 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 72b245a0-bca3-4e1a-ae08-3d5255208d3c)) + (fp_line (start 0 3.81) (end 0 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp c0eca2e3-995d-4b6a-a1a4-491471ccf6a9)) + (fp_line (start 0 3.81) (end 0 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 41577bb3-ca45-40b9-ae75-cb19f65a2557)) + (fp_line (start 2.54 0) (end 2.54 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 928ef726-01da-4cf4-9e63-502e32f73db2)) + (fp_line (start 2.54 0) (end 2.54 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7bc3cbec-7a1e-4ebb-92fd-0894d890a8ec)) + (fp_line (start 2.54 3.81) (end 2.54 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 89fb0f74-fc82-4645-879f-bc57093d973e)) + (fp_line (start 2.54 3.81) (end 2.54 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 120343bb-08f7-4ade-9f3a-80a7d757a563)) + (fp_line (start 2.77 3.81) (end 2.77 7.61) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 031bdd11-783e-41c5-91af-286dc21aff84)) + (fp_line (start 2.77 3.81) (end 3.17 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6d835b2f-d596-41a2-b234-94623c382ae7)) + (fp_line (start 2.77 4.81) (end 2.77 3.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 52648d6c-0bf3-41ec-8996-8c75763f676e)) + (fp_line (start 3.17 3.81) (end 3.17 4.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1a29b7b9-03aa-4ad8-88c0-8073d7e9143d)) + (fp_line (start 3.17 4.81) (end 2.77 4.81) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f215b54a-e268-4cb1-883f-a0e53b3997a7)) + (fp_arc (start 2.77 7.61) (mid 1.27 9.11) (end -0.23 7.61) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 02437eff-3ebc-4d38-a406-d8d49792b90d)) + (pad "1" thru_hole rect (at 0 0) (size 1.8 1.8) (drill 0.9) (layers "*.Cu" "*.Mask") + (net 3 "Net-(D1-K)") (pinfunction "K") (pintype "passive") (tstamp 38d1529c-1927-40bb-8b71-b3cb495c564e)) + (pad "2" thru_hole circle (at 2.54 0) (size 1.8 1.8) (drill 0.9) (layers "*.Cu" "*.Mask") + (net 4 "Net-(D1-A)") (pinfunction "A") (pintype "passive") (tstamp 34bcf44b-3cdb-4640-96ae-73b5c0e836c4)) + (model "${KICAD6_3DMODEL_DIR}/LED_THT.3dshapes/LED_D3.0mm_Horizontal_O3.81mm_Z6.0mm.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 265f818b-0fe1-4d04-b25c-6ae6c26e89a3) + (at 107 73 -90) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/8b0fd059-b19f-4565-852a-74e3223bfaf1") + (attr through_hole) + (fp_text reference "R14" (at 5.08 2 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 22237083-6bce-412a-8fb3-6230e8932fc1) + ) + (fp_text value "2.2k" (at 5 -2 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 88876ffb-ef3a-4ea5-a2b6-f4c4d441e893) + ) + (fp_text user "${REFERENCE}" (at 5.08 0 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8e21ccc6-f740-4852-b114-0fe86e0e6b6e) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7b4586d3-a172-4c74-9a6e-82d8e9f8025f)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6667a83d-5221-45d7-8117-78c93a7f6305)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ab7d5819-51de-44e1-8094-84c2f547db52)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7d329e51-08f4-46a6-9aba-1fb4f39138e8)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 48565339-0824-41b1-afbd-4e96964dde10)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c05e8143-d5f5-4e80-859f-030a89048944)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7d7f05e4-c1a4-4f12-b49b-9659ec65eb6d)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 0840d53f-f617-43d4-9985-06309079b0b0)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp cafca424-b953-409a-a127-696ecb311f0c)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 60608954-3544-4d9a-a340-138c90ed598c)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e78bbb23-b21e-4b10-9bf9-b6b0bcb850f3)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a9510824-f628-462d-9cc1-68511dfab7be)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3befaf80-5650-4ff0-a70d-21404e44a12f)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 40021d1c-0136-4431-b26c-9db89f88b6f2)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7fd07db6-2ce4-4a40-9ad7-d7aa825d5657)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 49fe7696-67bc-4960-9154-df27dce643bc)) + (pad "1" thru_hole circle (at 0 0 270) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 40 "Net-(Q4-B)") (pintype "passive") (tstamp a5dcf8c0-219b-47d1-a73f-f15846313e79)) + (pad "2" thru_hole oval (at 10.16 0 270) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pintype "passive") (tstamp f6f17030-352a-4300-8470-5d847a453d80)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 29a518ee-ac44-4f07-bdf9-97bec75d2e31) + (at 113.08 51 180) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/0512ba43-5f13-4592-bd94-7ec2752829fa") + (attr through_hole) + (fp_text reference "R3" (at 5.08 2.5) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 933d0e2b-644e-429f-99bc-13b75f07731e) + ) + (fp_text value "2.2k" (at 3.58 -2.5) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp e854f44e-9902-4e4f-820d-fcafb9412abb) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8374d805-ed07-4997-9df3-69d0bfe184f0) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 201c5d91-0381-46e4-bb8a-db78c72b1433)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c3e85da9-48a3-4341-8c8a-ddc03353235a)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 366ba58f-ad04-465f-8cbb-43295bcbf387)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4df76923-a19d-45bf-9cca-64846a009095)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 08b601ef-b072-4011-adb6-4c32bf806e43)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c718c598-9cea-45e7-a21d-681e78d8a686)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c7df78b4-1cf5-465d-a169-c89c08feb0ef)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 43164011-5727-4cd2-a920-25f95f2fed74)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5e1c57f0-c2c7-4a07-800a-d13834139cb3)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b3fca45b-a15e-48de-83c9-f5f3b4e07cbd)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a2457a68-3280-4095-b8a7-d39ed77620fd)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e9f18d43-1703-4f1f-833f-60c3aa5b06f4)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2a9d1197-170d-4480-8282-798228413339)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b8deda03-0063-408b-8b9e-927af94e8b8f)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7d6632ca-7209-4eed-8165-b89691a1e012)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7731558a-b5a1-444d-af80-490bbaef261a)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 38 "Net-(Q1-C)") (pintype "passive") (tstamp 5dbb4394-f483-4dc2-8fc3-d3cb979d898d)) + (pad "2" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 1 "Net-(C1-Pad1)") (pintype "passive") (tstamp 4e560953-458a-4e81-96d5-a5b8c5da9b6c)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Capacitor_THT:CP_Radial_D12.5mm_P7.50mm" (layer "F.Cu") + (tstamp 340a6af9-097e-4004-b71a-d4160aee262b) + (at 101.5 60) + (descr "CP, Radial series, Radial, pin pitch=7.50mm, , diameter=12.5mm, Electrolytic Capacitor") + (tags "CP Radial series Radial pin pitch 7.50mm diameter 12.5mm Electrolytic Capacitor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "C") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Polarized capacitor") + (property "ki_keywords" "cap capacitor") + (path "/ff3cc76a-1a65-43c7-a10c-c52bf541e8be") + (attr through_hole) + (fp_text reference "C1" (at -1 -6) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 4aabcb66-83c2-4552-bbe8-46e03c295130) + ) + (fp_text value "150u" (at 3.75 7.5) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 777ebd91-5d66-46a7-bd34-221264991f8a) + ) + (fp_text user "${REFERENCE}" (at 3.75 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ee637a7e-42f8-4cd4-a1b0-7c49797e19d3) + ) + (fp_line (start -3.067082 -3.575) (end -1.817082 -3.575) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 82767668-99c5-481e-9234-70372e810e75)) + (fp_line (start -2.442082 -4.2) (end -2.442082 -2.95) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5ab7ec9f-bee5-46bc-93af-2f9449587fc1)) + (fp_line (start 3.75 -6.33) (end 3.75 6.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 956a9046-c259-4e05-a9ce-cced9afee24f)) + (fp_line (start 3.79 -6.33) (end 3.79 6.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c2fe83fe-c8c7-4fb9-b4b7-7b775661aade)) + (fp_line (start 3.83 -6.33) (end 3.83 6.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d2b37e33-fb2f-4be2-9df6-03a5fb70c04a)) + (fp_line (start 3.87 -6.329) (end 3.87 6.329) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7ef88d01-05cc-47a1-b4e3-a9d7a641e7df)) + (fp_line (start 3.91 -6.328) (end 3.91 6.328) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2cca9b5c-0af8-49c8-916a-a5ae5f223e66)) + (fp_line (start 3.95 -6.327) (end 3.95 6.327) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f9720154-61ea-4d2c-bae9-a57975584f07)) + (fp_line (start 3.99 -6.326) (end 3.99 6.326) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 76427781-0c85-4cf2-a074-1df8ed4162b4)) + (fp_line (start 4.03 -6.324) (end 4.03 6.324) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp be156fdb-44c3-45ef-8d88-5fa13e220797)) + (fp_line (start 4.07 -6.322) (end 4.07 6.322) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1fc6340e-a0c4-45b8-b291-fec71ab1b8c6)) + (fp_line (start 4.11 -6.32) (end 4.11 6.32) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3e4aeee0-7514-4db1-8655-05d41d6aa4ac)) + (fp_line (start 4.15 -6.318) (end 4.15 6.318) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1d4155e4-f2a2-4685-8baa-cb005f604180)) + (fp_line (start 4.19 -6.315) (end 4.19 6.315) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 03ba4508-1551-4d44-a170-0c466a1d9c58)) + (fp_line (start 4.23 -6.312) (end 4.23 6.312) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 82b3abe6-b904-409c-9622-c07c44a5f9e7)) + (fp_line (start 4.27 -6.309) (end 4.27 6.309) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 53f96142-c2d8-44b8-8072-c2c53a6e1fe7)) + (fp_line (start 4.31 -6.306) (end 4.31 6.306) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 18cca3af-c824-4e5e-a536-f83ed9d4c812)) + (fp_line (start 4.35 -6.302) (end 4.35 6.302) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0af26ac1-e24f-4cf8-96ca-2d3e4e348573)) + (fp_line (start 4.39 -6.298) (end 4.39 6.298) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9d32ece2-ea9f-4d7f-b872-719652b39682)) + (fp_line (start 4.43 -6.294) (end 4.43 6.294) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7e319ea5-6a76-408f-933d-849bc7fd87f5)) + (fp_line (start 4.471 -6.29) (end 4.471 6.29) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cb71da61-b6e9-4e62-871d-fb895f2ab243)) + (fp_line (start 4.511 -6.285) (end 4.511 6.285) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 90727ac6-87a0-48d7-9515-73ac5115809c)) + (fp_line (start 4.551 -6.28) (end 4.551 6.28) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c34e18e6-4924-4151-a997-923494cc77f2)) + (fp_line (start 4.591 -6.275) (end 4.591 6.275) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ef49d27c-5358-4e02-bdf4-b1d0c1f80199)) + (fp_line (start 4.631 -6.269) (end 4.631 6.269) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 355d343f-1da2-4e06-bcfe-e07a4ae47a92)) + (fp_line (start 4.671 -6.264) (end 4.671 6.264) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 54015540-4e55-43c0-8198-1c202b035af5)) + (fp_line (start 4.711 -6.258) (end 4.711 6.258) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1cc117df-9e88-4269-b98f-33dd07aed1f3)) + (fp_line (start 4.751 -6.252) (end 4.751 6.252) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5025e6d2-a7f9-417d-8dd4-793044cc87a7)) + (fp_line (start 4.791 -6.245) (end 4.791 6.245) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4b1dd6c4-159c-4743-b416-84dcee5304d5)) + (fp_line (start 4.831 -6.238) (end 4.831 6.238) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7f35451d-3112-4b68-ab56-26d695812557)) + (fp_line (start 4.871 -6.231) (end 4.871 6.231) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 73a0c15c-a250-4147-9aad-b75f5fefc033)) + (fp_line (start 4.911 -6.224) (end 4.911 6.224) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 78a343b7-9791-4523-bd9e-aea1839efce5)) + (fp_line (start 4.951 -6.216) (end 4.951 6.216) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1e83bad8-9133-4721-838f-dade80b0e36a)) + (fp_line (start 4.991 -6.209) (end 4.991 6.209) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 90cf4bf4-a4c1-4a7e-a780-f79055ef7f09)) + (fp_line (start 5.031 -6.201) (end 5.031 6.201) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5032015c-94df-4ce0-859d-0b9f675b1582)) + (fp_line (start 5.071 -6.192) (end 5.071 6.192) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a73554f1-06ff-4959-901c-66cca1603d3f)) + (fp_line (start 5.111 -6.184) (end 5.111 6.184) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp da823442-07a2-46ab-a34e-ad74d7067cac)) + (fp_line (start 5.151 -6.175) (end 5.151 6.175) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e76b1f11-90e1-4980-a44a-68cb54fa987b)) + (fp_line (start 5.191 -6.166) (end 5.191 6.166) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6693baf4-2466-44c1-b039-ce2dfc23bb0c)) + (fp_line (start 5.231 -6.156) (end 5.231 6.156) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f98eb426-0405-4bbd-bfbe-4d5c59ea04be)) + (fp_line (start 5.271 -6.146) (end 5.271 6.146) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6a32bcb9-c699-4a55-97ca-19de102f3f80)) + (fp_line (start 5.311 -6.137) (end 5.311 6.137) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ce974244-d287-4f7a-b171-4c11211e22f1)) + (fp_line (start 5.351 -6.126) (end 5.351 6.126) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bd1f2b8e-cfb0-4d5b-91af-ad888a549758)) + (fp_line (start 5.391 -6.116) (end 5.391 6.116) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 94c7c67d-7184-4f3f-813a-d6793e640b68)) + (fp_line (start 5.431 -6.105) (end 5.431 6.105) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0a9d4480-07a4-4a89-aa76-1df9367be0c6)) + (fp_line (start 5.471 -6.094) (end 5.471 6.094) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e6ba13fa-4910-4fec-a577-a378e34c6e07)) + (fp_line (start 5.511 -6.083) (end 5.511 6.083) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp aee6769c-2fc1-43d9-b54d-8522bfcd27b9)) + (fp_line (start 5.551 -6.071) (end 5.551 6.071) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8d58e4ce-c6e0-4933-9a99-82592d251598)) + (fp_line (start 5.591 -6.059) (end 5.591 6.059) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp eb8f47a2-90b4-44f6-9613-6738755e46f7)) + (fp_line (start 5.631 -6.047) (end 5.631 6.047) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9b4e9350-622e-41f0-ad71-2350d63e1a31)) + (fp_line (start 5.671 -6.034) (end 5.671 6.034) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 28c62b1d-7b38-4e1f-a219-6deda3b1ea95)) + (fp_line (start 5.711 -6.021) (end 5.711 6.021) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e57e4557-11da-48e5-a068-b01ed44ad230)) + (fp_line (start 5.751 -6.008) (end 5.751 6.008) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1c7383b9-dc57-4e20-abc0-b71c09361b40)) + (fp_line (start 5.791 -5.995) (end 5.791 5.995) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4ea2886f-eae0-4d9b-a369-a2e388779261)) + (fp_line (start 5.831 -5.981) (end 5.831 5.981) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4c8634ef-13b2-4789-b3df-6604e6ad1502)) + (fp_line (start 5.871 -5.967) (end 5.871 5.967) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0f421a4c-399e-490c-b1da-ed4d10e29cc9)) + (fp_line (start 5.911 -5.953) (end 5.911 5.953) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4de9e80a-98ea-4c4b-8bda-928a1be1f0a9)) + (fp_line (start 5.951 -5.939) (end 5.951 5.939) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp edd155ba-cf4f-47ba-93fe-55959fe5067b)) + (fp_line (start 5.991 -5.924) (end 5.991 5.924) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5212892c-894d-4eca-a43a-750b44e4e6f0)) + (fp_line (start 6.031 -5.908) (end 6.031 5.908) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b2a044d6-06d8-475a-8ba1-ff3e9bea8109)) + (fp_line (start 6.071 -5.893) (end 6.071 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4844b30d-aeb8-4264-873b-3004e39f56f9)) + (fp_line (start 6.071 1.44) (end 6.071 5.893) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0b53c68a-8174-4937-949d-2ef3e48e7f83)) + (fp_line (start 6.111 -5.877) (end 6.111 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 480d3029-f1ad-4ec0-afe7-c5ee480888c1)) + (fp_line (start 6.111 1.44) (end 6.111 5.877) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4f88ee6f-4d98-4d60-b72b-227aa98382cc)) + (fp_line (start 6.151 -5.861) (end 6.151 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 078f5d28-3004-4f83-9c9c-e9b878174492)) + (fp_line (start 6.151 1.44) (end 6.151 5.861) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 87b6d09f-48a9-42e9-ab38-1587f961295c)) + (fp_line (start 6.191 -5.845) (end 6.191 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1f3cefa0-0a88-4b31-90bb-a31cdd10ff32)) + (fp_line (start 6.191 1.44) (end 6.191 5.845) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 56d7419a-8aa8-4555-9825-5e584e48ec10)) + (fp_line (start 6.231 -5.828) (end 6.231 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1906fe27-36b4-4bcf-a57c-2d09e4724d79)) + (fp_line (start 6.231 1.44) (end 6.231 5.828) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 904af904-99b2-4d44-96aa-dbd0f226865c)) + (fp_line (start 6.271 -5.811) (end 6.271 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c11ab026-dce2-41c7-a15b-7edc77be366f)) + (fp_line (start 6.271 1.44) (end 6.271 5.811) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8c6b479d-14fa-4c98-a8f8-4c3afd3c3885)) + (fp_line (start 6.311 -5.793) (end 6.311 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 551b5b1c-b099-4e62-a418-00eb4a315a84)) + (fp_line (start 6.311 1.44) (end 6.311 5.793) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 10b60402-967b-4c0d-899e-64f708e8b6e5)) + (fp_line (start 6.351 -5.776) (end 6.351 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6efb8833-9f14-43c0-960c-2672026fba57)) + (fp_line (start 6.351 1.44) (end 6.351 5.776) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 934be11b-e1ea-435d-a001-0585d4e3c095)) + (fp_line (start 6.391 -5.758) (end 6.391 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 345d33a7-e2dd-46b5-b255-42e5725a79dd)) + (fp_line (start 6.391 1.44) (end 6.391 5.758) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 199d1996-0d55-48e8-8599-343f04e9dba9)) + (fp_line (start 6.431 -5.739) (end 6.431 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6fa94890-cf51-441c-80e2-bc4233e85608)) + (fp_line (start 6.431 1.44) (end 6.431 5.739) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6745b3af-45c7-45e1-ad98-41abd6a70ec3)) + (fp_line (start 6.471 -5.721) (end 6.471 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5f25046c-c5fc-4d07-8438-b2003c5804ea)) + (fp_line (start 6.471 1.44) (end 6.471 5.721) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bde99e9a-d945-4fa5-a023-510746c134df)) + (fp_line (start 6.511 -5.702) (end 6.511 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0d770d69-f2e4-404f-967d-e3a6fcd3059e)) + (fp_line (start 6.511 1.44) (end 6.511 5.702) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5a1c2a19-3fb3-42de-8024-668b2ced7250)) + (fp_line (start 6.551 -5.682) (end 6.551 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ad75d76f-1631-437f-9adc-7b7006d2a98a)) + (fp_line (start 6.551 1.44) (end 6.551 5.682) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 027b37e3-4bba-4402-80a1-bf1c49c63a93)) + (fp_line (start 6.591 -5.662) (end 6.591 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2b38e9fa-37e1-4bcb-8ffe-a5899705eace)) + (fp_line (start 6.591 1.44) (end 6.591 5.662) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5060c437-34a7-4f6c-a047-f452dfcb297d)) + (fp_line (start 6.631 -5.642) (end 6.631 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 62a74be7-17d7-4e39-be6a-6dcfe472fac0)) + (fp_line (start 6.631 1.44) (end 6.631 5.642) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7175e32d-06db-4e4f-a24f-1eb760970b52)) + (fp_line (start 6.671 -5.622) (end 6.671 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a9efdfd1-70ea-44c2-a2d4-d6bfffe730a0)) + (fp_line (start 6.671 1.44) (end 6.671 5.622) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 03ddf994-b175-4542-a8fd-3bd33792395e)) + (fp_line (start 6.711 -5.601) (end 6.711 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9f78d4fd-3b48-40a6-96f7-5a034da882c4)) + (fp_line (start 6.711 1.44) (end 6.711 5.601) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2fdc8188-7247-45c9-8c53-ba0e2e375634)) + (fp_line (start 6.751 -5.58) (end 6.751 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bf62727c-7aad-4e7f-bab1-3f2caea08a39)) + (fp_line (start 6.751 1.44) (end 6.751 5.58) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 18d6b958-8b39-41a6-8eb3-5e32651315dd)) + (fp_line (start 6.791 -5.558) (end 6.791 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c49141e5-173f-4e55-ab6c-0553413ecb71)) + (fp_line (start 6.791 1.44) (end 6.791 5.558) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f8594f0a-4a5c-4fca-86ec-d51b42e80427)) + (fp_line (start 6.831 -5.536) (end 6.831 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a97e9bb1-c6a4-415f-b18e-9cb6e1c5a6c6)) + (fp_line (start 6.831 1.44) (end 6.831 5.536) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a99ea0a3-251c-486c-9a15-7af9ae182522)) + (fp_line (start 6.871 -5.514) (end 6.871 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6c154e06-75d3-480c-b204-e72046dd8ee6)) + (fp_line (start 6.871 1.44) (end 6.871 5.514) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9be698bd-7223-48ba-ab7e-f5e3e4f8f035)) + (fp_line (start 6.911 -5.491) (end 6.911 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5dcc2bc7-9faa-425b-9891-4e70e05ff939)) + (fp_line (start 6.911 1.44) (end 6.911 5.491) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7615ce13-c2fb-4e67-97e8-c1e5b5691dc8)) + (fp_line (start 6.951 -5.468) (end 6.951 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 716e16a8-2c88-4e3e-878c-f60954e63717)) + (fp_line (start 6.951 1.44) (end 6.951 5.468) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2ae6ba25-3caa-438d-816e-00b6969cc402)) + (fp_line (start 6.991 -5.445) (end 6.991 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c37ee0bf-bfb9-4f6e-bc5e-4d82264936c4)) + (fp_line (start 6.991 1.44) (end 6.991 5.445) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e32cfc4a-92a4-48a4-9328-85b25fae1a3b)) + (fp_line (start 7.031 -5.421) (end 7.031 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6921743e-d92c-4718-b6ab-adabb50e15d6)) + (fp_line (start 7.031 1.44) (end 7.031 5.421) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2f9bf25c-6d80-4e23-9c0d-ca3db7f51b63)) + (fp_line (start 7.071 -5.397) (end 7.071 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f0e3cb57-f777-49f1-9bec-0da75807591d)) + (fp_line (start 7.071 1.44) (end 7.071 5.397) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 57410fa0-41aa-40fc-b4d5-0c696b696c43)) + (fp_line (start 7.111 -5.372) (end 7.111 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 48455bc3-27a6-4768-836a-99ed916b9afe)) + (fp_line (start 7.111 1.44) (end 7.111 5.372) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 156f04d7-dc30-44f8-8bbe-85d2f01f372d)) + (fp_line (start 7.151 -5.347) (end 7.151 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cf97ba62-20d2-4a2b-9b46-3547b6245d59)) + (fp_line (start 7.151 1.44) (end 7.151 5.347) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f3d440c0-d7bf-4f5f-b3a1-6e710bc03781)) + (fp_line (start 7.191 -5.322) (end 7.191 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3c805520-f4dc-45df-adcd-53e353a03f44)) + (fp_line (start 7.191 1.44) (end 7.191 5.322) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1963c1dd-054c-4865-b195-2f7a3837b3a5)) + (fp_line (start 7.231 -5.296) (end 7.231 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 56a7c36d-a100-47fd-86db-bc4addefb1a7)) + (fp_line (start 7.231 1.44) (end 7.231 5.296) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b2f260a3-d87a-42ba-b654-270c94fdf48b)) + (fp_line (start 7.271 -5.27) (end 7.271 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fa87bbd3-a47a-4acd-9465-5f396bb40952)) + (fp_line (start 7.271 1.44) (end 7.271 5.27) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4cf80c3d-6371-4ec9-bc23-4c73fa920bbc)) + (fp_line (start 7.311 -5.243) (end 7.311 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 69943be2-c60a-489a-a115-3583427c7027)) + (fp_line (start 7.311 1.44) (end 7.311 5.243) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e2ac8259-2779-42ba-8528-bcf293dd9ed9)) + (fp_line (start 7.351 -5.216) (end 7.351 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 26aaccab-aecc-4bd6-beac-8da341681a10)) + (fp_line (start 7.351 1.44) (end 7.351 5.216) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c5a4aef9-0d1e-44d2-a5a6-1f228db9cc16)) + (fp_line (start 7.391 -5.188) (end 7.391 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0599e333-2fcc-41c7-891c-511c567b35a4)) + (fp_line (start 7.391 1.44) (end 7.391 5.188) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 90599bf2-0cfd-4bbf-aa2b-ce86badc86d2)) + (fp_line (start 7.431 -5.16) (end 7.431 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 757b861c-4d25-4649-9172-84557ff8519d)) + (fp_line (start 7.431 1.44) (end 7.431 5.16) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5be68334-2b5e-4c63-9505-e0c3bdc280e2)) + (fp_line (start 7.471 -5.131) (end 7.471 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0c6141ed-ac6f-4bea-8cf9-a3f720009e5b)) + (fp_line (start 7.471 1.44) (end 7.471 5.131) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a00e8ae2-3da8-428a-868a-23f1ae58d113)) + (fp_line (start 7.511 -5.102) (end 7.511 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6c232b7d-cecb-4735-9493-7726564634c1)) + (fp_line (start 7.511 1.44) (end 7.511 5.102) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 99e832f3-865d-49ac-9e96-0834818cc069)) + (fp_line (start 7.551 -5.073) (end 7.551 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e238ec29-4830-4830-a887-84cd80adcc56)) + (fp_line (start 7.551 1.44) (end 7.551 5.073) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7e1495f3-7f7c-4209-a930-37d8cde99da6)) + (fp_line (start 7.591 -5.043) (end 7.591 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5254b827-5e9c-4a3c-a2f4-53615acb58da)) + (fp_line (start 7.591 1.44) (end 7.591 5.043) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 84737cb7-4502-42bb-93c5-d731f8deb367)) + (fp_line (start 7.631 -5.012) (end 7.631 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b058bfcf-82a8-461e-8f7c-a44bbc40ecf6)) + (fp_line (start 7.631 1.44) (end 7.631 5.012) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ba373796-20a1-4b8d-b3bd-59a084024c39)) + (fp_line (start 7.671 -4.982) (end 7.671 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9d14c0ef-6fdb-4d94-b590-95e79c57d052)) + (fp_line (start 7.671 1.44) (end 7.671 4.982) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6be18706-531e-4069-9d72-c240b7fdca4a)) + (fp_line (start 7.711 -4.95) (end 7.711 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cd930011-c757-4998-a2e9-1cc0f09cde1a)) + (fp_line (start 7.711 1.44) (end 7.711 4.95) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cc7a480b-1c36-4a75-a7c0-4d294776fa87)) + (fp_line (start 7.751 -4.918) (end 7.751 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c7f3debb-97c2-496d-8a5f-b13a18637ddc)) + (fp_line (start 7.751 1.44) (end 7.751 4.918) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 79714fe3-b670-4e07-a6b0-6f32e0f6a19e)) + (fp_line (start 7.791 -4.885) (end 7.791 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 469a7546-6d71-42c4-8b34-f738c83dbc5d)) + (fp_line (start 7.791 1.44) (end 7.791 4.885) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a3662e48-cd4e-4942-bdb2-1da3b4b758d7)) + (fp_line (start 7.831 -4.852) (end 7.831 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 58ceee12-5ac5-4a50-b234-4b2b86e0c4bf)) + (fp_line (start 7.831 1.44) (end 7.831 4.852) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0e676e50-997e-45b3-b333-7cfaad114b3a)) + (fp_line (start 7.871 -4.819) (end 7.871 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8995223e-97f3-43b7-b673-9df07247c83f)) + (fp_line (start 7.871 1.44) (end 7.871 4.819) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f6da67a3-0fe8-44c5-9531-a28bf7854064)) + (fp_line (start 7.911 -4.785) (end 7.911 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 46b3b17d-d03b-44ea-8afa-28345a7f092b)) + (fp_line (start 7.911 1.44) (end 7.911 4.785) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 10beb997-4fa1-45af-a933-038c07331f02)) + (fp_line (start 7.951 -4.75) (end 7.951 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 361130fe-4d9e-46e9-851c-359d8b39408f)) + (fp_line (start 7.951 1.44) (end 7.951 4.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 29b6a89a-f7cd-4bc1-a03d-eff9e3b33144)) + (fp_line (start 7.991 -4.714) (end 7.991 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 593cebd5-945f-410b-b430-39b739dfe34f)) + (fp_line (start 7.991 1.44) (end 7.991 4.714) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2ff4da54-f0c5-4b06-b0fb-0a4274f9d6dd)) + (fp_line (start 8.031 -4.678) (end 8.031 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 53c6d82c-68f5-4b7b-a033-deb16b8e26ac)) + (fp_line (start 8.031 1.44) (end 8.031 4.678) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b1a0e734-f2fa-4039-a0a4-9ffbaac429d6)) + (fp_line (start 8.071 -4.642) (end 8.071 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7d3d5a01-8270-41f0-a2d9-c5254e72997a)) + (fp_line (start 8.071 1.44) (end 8.071 4.642) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e04084c1-da3f-4998-9b39-fa1d016d906d)) + (fp_line (start 8.111 -4.605) (end 8.111 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d156eb07-befc-4859-aac4-10e96533aa06)) + (fp_line (start 8.111 1.44) (end 8.111 4.605) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 74fdecee-844d-4168-8e54-7bd2a142a078)) + (fp_line (start 8.151 -4.567) (end 8.151 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ce502cd7-7b51-487e-9870-2bfffbe76f48)) + (fp_line (start 8.151 1.44) (end 8.151 4.567) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7b8a0ed3-7b5a-4491-91d5-cfebe9ffc902)) + (fp_line (start 8.191 -4.528) (end 8.191 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 46e50693-cea1-4599-8dc5-491bbbd10fc5)) + (fp_line (start 8.191 1.44) (end 8.191 4.528) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cd64f394-e7c8-45ae-b20d-a8cf790f5d9e)) + (fp_line (start 8.231 -4.489) (end 8.231 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 01864512-53e8-4bb8-b17b-c299b1f5d8ea)) + (fp_line (start 8.231 1.44) (end 8.231 4.489) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ed5c1719-cc21-4c89-ac17-aa557ad82ca1)) + (fp_line (start 8.271 -4.449) (end 8.271 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ee2c6cae-c2ee-41a9-b27e-62828a45245c)) + (fp_line (start 8.271 1.44) (end 8.271 4.449) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7f961c9f-074f-4b19-9507-15029d30640c)) + (fp_line (start 8.311 -4.408) (end 8.311 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 32749002-9360-4157-bfac-4158e8782516)) + (fp_line (start 8.311 1.44) (end 8.311 4.408) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0795647e-19c7-4395-b485-87eaa296cb80)) + (fp_line (start 8.351 -4.367) (end 8.351 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp beb35982-1f6a-46e1-971a-5ebcf0dd3e6a)) + (fp_line (start 8.351 1.44) (end 8.351 4.367) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3bc0ba5c-0b11-4b9a-8696-0f4a457c1c2a)) + (fp_line (start 8.391 -4.325) (end 8.391 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 461e505f-ee10-4fd4-96bd-619bcfb2d5da)) + (fp_line (start 8.391 1.44) (end 8.391 4.325) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5bab45a4-79c3-44cd-b2a0-bc426e043eda)) + (fp_line (start 8.431 -4.282) (end 8.431 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 38e730bd-c70a-45ce-bfa7-87adfa52edca)) + (fp_line (start 8.431 1.44) (end 8.431 4.282) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d4c8d1fb-0ea1-4639-8bb8-fe06b28ec2e5)) + (fp_line (start 8.471 -4.238) (end 8.471 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9e012fc6-588a-43f3-b100-624626128e48)) + (fp_line (start 8.471 1.44) (end 8.471 4.238) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 04b9318b-79c0-4170-b6cc-2bec097092b1)) + (fp_line (start 8.511 -4.194) (end 8.511 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 97598b87-96fd-4be2-9784-036a394a4b9a)) + (fp_line (start 8.511 1.44) (end 8.511 4.194) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 450aecba-6b09-47cc-8ad7-dcb3aaa0b069)) + (fp_line (start 8.551 -4.148) (end 8.551 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 621a4e3c-4263-4e54-afa0-bba112c8cdeb)) + (fp_line (start 8.551 1.44) (end 8.551 4.148) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d2af1c98-ebf4-4532-9f5b-2a0df8bac69a)) + (fp_line (start 8.591 -4.102) (end 8.591 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2cddf167-7e6e-4b41-af88-a8375e38aaf9)) + (fp_line (start 8.591 1.44) (end 8.591 4.102) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 92531af7-f789-4365-bea7-4ca813e43bc1)) + (fp_line (start 8.631 -4.055) (end 8.631 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ad065f14-77b0-4046-a713-d4fa17a7cc64)) + (fp_line (start 8.631 1.44) (end 8.631 4.055) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3d3216df-594f-4a6e-81b8-89e29aaff1c0)) + (fp_line (start 8.671 -4.007) (end 8.671 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fa9538a8-2f79-41e1-8edc-9a90401b1d41)) + (fp_line (start 8.671 1.44) (end 8.671 4.007) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8310b711-8011-45dd-8a58-dbe51cace58e)) + (fp_line (start 8.711 -3.957) (end 8.711 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b9423b3a-c98b-4412-aa47-8f4cbb616e83)) + (fp_line (start 8.711 1.44) (end 8.711 3.957) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 774b78e8-7b3a-4b02-9040-7e5b48e33acf)) + (fp_line (start 8.751 -3.907) (end 8.751 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4d1cd6db-e27e-4436-ac93-97ea743fd416)) + (fp_line (start 8.751 1.44) (end 8.751 3.907) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp aaa3d9aa-3153-4b47-8614-143dff504a69)) + (fp_line (start 8.791 -3.856) (end 8.791 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp aebf617a-f5d3-4c90-afa9-f3a139c3b706)) + (fp_line (start 8.791 1.44) (end 8.791 3.856) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9797ee0d-4f4d-4bbf-a245-4bffdb2fed95)) + (fp_line (start 8.831 -3.804) (end 8.831 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b15f90ca-bb50-41ba-a9e7-ae22b7e905eb)) + (fp_line (start 8.831 1.44) (end 8.831 3.804) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e019de8c-d3b6-4cec-9364-521fab1a52dc)) + (fp_line (start 8.871 -3.75) (end 8.871 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 11c53d4d-3b39-4501-accb-c9eb9f84f1b1)) + (fp_line (start 8.871 1.44) (end 8.871 3.75) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp faa34a20-01e4-48cc-b7ea-e1d2ff307cd9)) + (fp_line (start 8.911 -3.696) (end 8.911 -1.44) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b327bb16-2f41-4102-a5d9-7aca05c8010d)) + (fp_line (start 8.911 1.44) (end 8.911 3.696) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f87be323-4662-4c55-8875-7e7d8eb2ef75)) + (fp_line (start 8.951 -3.64) (end 8.951 3.64) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4bb7711d-636f-4da0-89df-4909a2c0c5f0)) + (fp_line (start 8.991 -3.583) (end 8.991 3.583) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b3a66edf-3893-4390-9451-94d7c78cdae2)) + (fp_line (start 9.031 -3.524) (end 9.031 3.524) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5ba68b32-9801-4c2d-8012-621e86c504e7)) + (fp_line (start 9.071 -3.464) (end 9.071 3.464) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 36fb0ebd-dba5-4008-9ab9-627171bad6c5)) + (fp_line (start 9.111 -3.402) (end 9.111 3.402) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 34299e2b-3ddd-4dae-be5b-4b45234e4648)) + (fp_line (start 9.151 -3.339) (end 9.151 3.339) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3ab3b210-58c8-4894-b3ea-52e962f8f403)) + (fp_line (start 9.191 -3.275) (end 9.191 3.275) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9c245da5-6621-40b8-a475-41662c347865)) + (fp_line (start 9.231 -3.208) (end 9.231 3.208) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b9b1ca0a-3579-45b6-b0f9-3c392d038874)) + (fp_line (start 9.271 -3.14) (end 9.271 3.14) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ae70239b-7ef7-43d1-9998-23d2956a4cc3)) + (fp_line (start 9.311 -3.069) (end 9.311 3.069) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 106da3da-39f7-4114-8fde-1b4c0d9aad94)) + (fp_line (start 9.351 -2.996) (end 9.351 2.996) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a6b9a2ca-f8f0-4a74-b5b5-809d58672af6)) + (fp_line (start 9.391 -2.921) (end 9.391 2.921) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 025e23ff-c2a6-423b-b05b-fe5ea2d6cb33)) + (fp_line (start 9.431 -2.844) (end 9.431 2.844) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c14fb6bd-05f5-4fce-acf5-0fe794507859)) + (fp_line (start 9.471 -2.764) (end 9.471 2.764) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 429e73db-c941-4911-8dee-4dd5992007df)) + (fp_line (start 9.511 -2.681) (end 9.511 2.681) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 73b3129d-ef67-47c7-be5b-95b8b632ad88)) + (fp_line (start 9.551 -2.594) (end 9.551 2.594) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1609e0c5-b9bd-46fe-9e68-76111b1af24b)) + (fp_line (start 9.591 -2.504) (end 9.591 2.504) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 17fd6223-601c-414e-956f-f7ede26e57a2)) + (fp_line (start 9.631 -2.41) (end 9.631 2.41) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d9b23496-d4c2-4bc6-bde0-8c998f548e7f)) + (fp_line (start 9.671 -2.312) (end 9.671 2.312) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 10cb4b1a-abfb-4de6-bc14-039c07c53ad8)) + (fp_line (start 9.711 -2.209) (end 9.711 2.209) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 72274783-e48a-4abb-ba5f-4df264979cf2)) + (fp_line (start 9.751 -2.1) (end 9.751 2.1) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d8985808-e9f2-4ae5-828a-07499350683b)) + (fp_line (start 9.791 -1.984) (end 9.791 1.984) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 27ed6aed-0751-4683-9bd1-4855f6d01cd2)) + (fp_line (start 9.831 -1.861) (end 9.831 1.861) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8a2b413e-b1b4-4705-889b-c967db4e7410)) + (fp_line (start 9.871 -1.728) (end 9.871 1.728) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bed9f9c6-e3fe-4ac4-b4b4-6822adc57f68)) + (fp_line (start 9.911 -1.583) (end 9.911 1.583) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d4f9fac4-efde-4dc7-a668-72054280cd91)) + (fp_line (start 9.951 -1.422) (end 9.951 1.422) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 54cc8828-fb2a-4cb3-ab3b-9c77525ff28d)) + (fp_line (start 9.991 -1.241) (end 9.991 1.241) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ae890cfc-3a8e-4a92-9025-778eab9cf335)) + (fp_line (start 10.031 -1.028) (end 10.031 1.028) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1dccff06-9e7d-46c6-a179-044fb009d8db)) + (fp_line (start 10.071 -0.757) (end 10.071 0.757) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 753465a9-98bf-4a4d-a6f8-00b98dfacef1)) + (fp_line (start 10.111 -0.317) (end 10.111 0.317) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp dc5baac1-efbd-4766-a7fc-dc8ef58f5767)) + (fp_circle (center 3.75 0) (end 10.12 0) + (stroke (width 0.12) (type solid)) (fill none) (layer "F.SilkS") (tstamp f24b1ec6-35e2-4ffa-a6a7-17316978b2b8)) + (fp_circle (center 3.75 0) (end 10.25 0) + (stroke (width 0.05) (type solid)) (fill none) (layer "F.CrtYd") (tstamp 8563a1d1-1401-4208-9fbb-9e9177dcef13)) + (fp_line (start -1.616489 -2.7375) (end -0.366489 -2.7375) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 4bf37ef0-fac9-415a-8915-bf4cb38e750c)) + (fp_line (start -0.991489 -3.3625) (end -0.991489 -2.1125) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 76cf51d8-2d0b-4738-b521-5bd5c779c6ba)) + (fp_circle (center 3.75 0) (end 10 0) + (stroke (width 0.1) (type solid)) (fill none) (layer "F.Fab") (tstamp 73a0589d-5a62-44c7-975d-dab1cc2448ec)) + (pad "1" thru_hole rect (at 0 0) (size 2.4 2.4) (drill 1.2) (layers "*.Cu" "*.Mask") + (net 1 "Net-(C1-Pad1)") (pintype "passive") (tstamp fe6d4c10-4266-4dc9-9690-073bbde91ab8)) + (pad "2" thru_hole circle (at 7.5 0) (size 2.4 2.4) (drill 1.2) (layers "*.Cu" "*.Mask") + (net 2 "Net-(Q2-B)") (pintype "passive") (tstamp e3513430-3b66-4201-9984-03afb3da5a50)) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_THT.3dshapes/CP_Radial_D12.5mm_P7.50mm.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp 3f52b951-fc4e-4791-8fd1-720ca73b3c85) + (at 117.96 51) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "PNP") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "BC557b") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, PNP Small Signal Transistor, TO-92") + (property "ki_keywords" "PNP Transistor") + (path "/e18074c3-15bb-48dd-a644-780be992a99a") + (attr through_hole) + (fp_text reference "Q1" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8daae1cd-5c1f-4d05-b13e-a4a097101afe) + ) + (fp_text value "BC557" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp de84e890-b721-4014-8533-fa2ee8bf377b) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f3788bbd-e2a0-44f2-b8ac-6e9758e948e7) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 49d93faf-5dbb-436d-999a-f7b17de5fb89)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 271144a7-e566-43d9-a5ff-304d834400ab)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4279778e-1e4d-4c54-bf92-ad31ec0bc2c6)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp cd259a7a-a237-4c89-a3fb-e53ea146d34b)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5314e6f2-9b9e-48f2-9660-c6ddd54c182c)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 129c391d-28e7-409d-811b-3bcc33871d8a)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp d1f720a8-57d2-4be3-ba24-d21d6cdd6133)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp c2449067-60cb-40aa-a0a4-c8c808a1f477)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 32d1a9b4-7886-4e09-b649-3de0a25e5abe)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1677d36d-e5c2-4c7f-8746-2fc557f700d0)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 38 "Net-(Q1-C)") (pinfunction "C") (pintype "passive") (tstamp 8ddc0d4c-e4c2-4b8f-8ea9-9fa49ce6277d)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 39 "Net-(Q1-B)") (pinfunction "B") (pintype "input") (tstamp a9fd507f-cdb2-4a28-bf52-f11b855bced1)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 6 "VCC_5.0") (pinfunction "E") (pintype "passive") (tstamp e854432b-06c7-4708-888d-385ba6334c4b)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 3f7822ee-6283-474b-b37e-ff80c0af1726) + (at 104 95 90) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/a88aec3a-89e0-4123-9d67-40bd4310a5ef") + (attr through_hole) + (fp_text reference "R13" (at 5.08 -2.37 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6df07662-a7a9-4889-936b-f2402ac188fa) + ) + (fp_text value "10k" (at 5.08 2.37 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp c683178f-663f-4b0b-84d4-a160c678ec95) + ) + (fp_text user "${REFERENCE}" (at 5.08 0 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 315f5b88-bc90-4e37-945c-1d59380e0909) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ea59be9d-ceba-4205-ad13-28ebce08a816)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 47d45d52-ea16-4b56-a1bc-18c31bdb1564)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6a74ba48-02f8-4db8-b416-15c3998d2582)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7449de72-977a-48b7-8017-e513f6583083)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1432726f-f5b8-4913-8503-f6d411281d1e)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 203ffaa4-1f13-4c34-9681-26f484b4706a)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 57e83331-bdeb-4c2d-9823-08c340b07938)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 12c909e5-bb34-4918-9c90-db7df6108601)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 4430c562-e685-4580-bc43-4c2a60cae786)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp bdfd57cb-ac33-435c-b961-311af1e69fe1)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f4c9faa5-38f9-4c38-b251-603da3a85606)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3c90a8ca-1ce9-4783-9732-71fc7c772bf3)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6bfe0278-1a56-4142-9f24-07ae0f8caa00)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7193c2e1-1883-4c4d-ae93-36a80c6fcc0a)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d2c419a8-ab4f-4b56-b784-53f4a4e5eaed)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f38500a2-ceb2-4bc8-987c-b83e0d49e3d9)) + (pad "1" thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pintype "passive") (tstamp 7a99ae1f-3b52-4f2f-993d-fe39626cb96d)) + (pad "2" thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 11 "TXD") (pintype "passive") (tstamp dbbc1296-ff8b-4c8c-ba25-2770b163e47d)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 45cce9b3-3dbd-4d7c-b145-f372b61b3267) + (at 88.92 89) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/94c334ed-1cb5-4404-a652-a5f07f1cffb8") + (attr through_hole) + (fp_text reference "R15" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp acfdbeff-51ac-4fb7-a44f-d88b2a15088b) + ) + (fp_text value "10k" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 3bdfcc65-6c73-484b-852b-24e2c0d4846d) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp cde31ded-3b14-413e-b3f0-18d97e460b41) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 88e4df15-a9d3-40fd-a270-89e44ee7a879)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a4bdba37-0990-43c4-b162-3fcff9e6f722)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ccde9eb9-db6d-4323-9eaf-fb477578daa1)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b6397664-c439-499a-bffc-2022028eed3a)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bbc4086c-ef94-4492-9cc5-7d715c81effb)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c73fe885-965a-4ba1-9779-7a4318410ea0)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7e9eff28-49a4-4ee6-9772-746f87c24cbe)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp fa42a1a1-8a7b-48ae-b104-498105639677)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp a69fa8bd-d0f5-419d-999b-7791060b5512)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7017c73b-5267-40c4-84dc-19cfb60e6cfb)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 772f073e-80c2-4a2a-aaca-cfdef572bc02)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a5bd31eb-5d71-41db-8f95-4ad1f5e31e78)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b5cae3e3-95ea-453e-96de-65128cb6bf9d)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d9b64290-9540-4828-96c4-efa0469e5ac3)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 081cee40-b507-43ec-ae94-40210fe4b841)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 845e1edf-bef2-4420-9b9e-6890f4cde265)) + (pad "1" thru_hole circle (at 0 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pintype "passive") (tstamp 6eec3e49-1e98-4cce-8dd3-836ac2209b2f)) + (pad "2" thru_hole oval (at 10.16 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 41 "Net-(Q5-C)") (pintype "passive") (tstamp c9c58ef4-7a98-4424-bf3a-54206dad070a)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 845ccd1d-2298-4001-b687-cc6f145560b2) + (at 104 76 180) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/05087989-f568-4ae5-b297-c298921fe111") + (attr through_hole) + (fp_text reference "R8" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 34f80fd9-e658-4a0c-9647-e66478be4923) + ) + (fp_text value "2.2k" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp e63432aa-1f16-40b0-ac77-efd2e91ed895) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6adb4ca8-f575-4097-be7f-0d96368cee97) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 35479412-f12b-413b-9168-fb92d7801c1a)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fefbfbc6-1d8a-46d6-b2ec-1befb95d5648)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8f1ae895-0473-4eca-80d8-fd8acf8c8e78)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e2042a34-067f-4ee9-9b99-ab06b2980dda)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 245c30c6-a017-4976-b90c-f2702955af78)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bab2dd2a-5de1-4e2d-b558-5c998d4977e3)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 25a82f37-aff8-4855-bcae-a17b9a421d0c)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ace825f4-6a3b-42a7-9dbc-53734a9a7c0f)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1ea0646e-7751-4ac6-a9cb-80277b3d34ff)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 02bca96b-1387-417d-8842-38091fc34c1d)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e19401c8-422b-4d07-a14a-bf18eb908fe3)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 4dba54c4-d827-4b01-801b-91014f6de41d)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp c0472bef-d5c8-4a7b-9306-7b22258b9ae5)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6ad6fafd-4213-4212-ba98-f8c884978091)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3db05eb1-c332-4fe9-8d4c-16687436344a)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp cddcab99-f919-4652-8297-27933ff7b015)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pintype "passive") (tstamp 2a7ef9f0-87ba-4f11-880f-f85eb40e1feb)) + (pad "2" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 26 "Net-(J1-ID_SC{slash}GPIO1)") (pintype "passive") (tstamp 5a91186c-99a7-4c81-98a8-102cf0ed0200)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp 8a5f4c35-05cf-48db-b130-cef696223a71) + (at 108.46 89) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "NPN") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "bc547b") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92") + (property "ki_keywords" "NPN Transistor") + (path "/7a1d8624-75b3-40d9-8367-28b38d93d05c") + (attr through_hole) + (fp_text reference "Q5" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 36183255-0a80-4b4b-992d-adfb74936831) + ) + (fp_text value "BC547" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 77961d15-7b32-4cfe-bdf1-ce5b537e6e5b) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ef45058c-a50e-458e-93a2-b01fd70e5dc5) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 035463b4-9e74-4871-b7b2-139b5e2fe419)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 9986ea23-33af-4a6d-8e3e-ec9b1fa0bdc3)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b8726f98-8ee4-4952-b15a-1dbcf72e5c0d)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c918833e-faa8-43bb-913e-e85a9d44d117)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7a15506b-efae-410f-bb35-1a9e949d39d5)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 67190cbb-c04e-4c20-8e00-739b73d23650)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f48d99c3-bd86-47e6-8187-0eaf876d1bc1)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp dde95699-dbc6-4096-bda6-8d1f6b00785b)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 62f10716-cedb-4790-9fb8-38f24c2fea64)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2c951144-24d3-45ab-9cd0-583ea526095e)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 41 "Net-(Q5-C)") (pinfunction "C") (pintype "passive") (tstamp e45493d9-75c3-434b-b75b-9db95544055c)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 42 "Net-(Q5-B)") (pinfunction "B") (pintype "input") (tstamp c2c989ea-173b-4451-adbf-f71ac626bc5d)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "E") (pintype "passive") (tstamp da050428-f60a-40b8-8b59-2eed8db9f6dd)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 8fc225f7-a8d9-414e-a7b3-9b9a85b6279a) + (at 111 72.92 -90) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/1e712663-9f97-4762-926c-2b4ce56e9875") + (attr through_hole) + (fp_text reference "R7" (at 6.58 -2.5 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp bb8e6e05-5642-468d-9f21-21b408aadd2a) + ) + (fp_text value "22k" (at 4.08 -2.5 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ce47c9f8-9e8e-42ca-880b-7e73f4c98285) + ) + (fp_text user "${REFERENCE}" (at 5.08 0 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp dbf08de9-4d8f-403e-a8a2-a390ffd407fc) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7eea2dda-54e8-4a59-8820-9310d743f569)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7f9a0325-abbc-4bd9-89ee-f5b453307081)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a46a75ee-c28d-4cea-a181-b143d7e0ccfc)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e7367653-5e67-4311-9de3-b6594e028d51)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d953e37c-9abf-41a3-9fc7-1b1dc542b311)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 062fa0b6-b2b6-427a-bdab-dec8720c0dcc)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c93675e3-fe42-4c5e-ba4a-06e6adfc4860)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 6971d6ef-96ac-411f-8c19-9dac3b27a3a2)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 0fc472ee-0474-4244-836a-4c0a56530099)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8efc70dd-c1b0-495c-9beb-c3bc2d2295ae)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 46db18a5-79ca-4ca1-be07-8428ea21b640)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7f5f07bf-91c3-483c-bf53-30c46397d9fb)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp bb09eae9-0f5c-4d22-a624-7136fef766e4)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ea761013-3614-4f2d-b862-2854a498b856)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b2c6d1c2-42c1-4393-a2f1-0e4c59e9ff49)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ff412aaa-cecb-40c5-b6d0-15c6c08fb2d7)) + (pad "1" thru_hole circle (at 0 0 270) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 2 "Net-(Q2-B)") (pintype "passive") (tstamp 99ed30be-e172-4f42-9356-4cf818a0cccf)) + (pad "2" thru_hole oval (at 10.16 0 270) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pintype "passive") (tstamp 7e2907e8-57b3-4148-9f87-19a0fece99d0)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp 94171681-d57e-4456-9703-3178e2780bdf) + (at 117.73 81) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "NPN") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "bc547b") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92") + (property "ki_keywords" "NPN Transistor") + (path "/4e0376b7-268d-4d3c-bc7b-c625228f33d1") + (attr through_hole) + (fp_text reference "Q4" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 44ef564e-a30c-4c75-b896-8062f9fccb31) + ) + (fp_text value "BC547" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp efb7a986-9f64-44ba-9357-10cc5e45a2a5) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d22ca5f3-4e1a-4060-9171-20c8ca3246e5) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d3dc99fb-bf71-462c-bb05-0a8efa171701)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cf04c351-8635-410a-adf5-393266205ed6)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0a55f91e-f921-491b-8625-af1f3557c7e7)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c2eea5e1-6e48-4600-afe0-6c67f9bf7e80)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 09f8dfef-1cb5-4b83-b276-3fad49e031d4)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3fa7ab0e-236c-4291-bee2-db04779cfd50)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b1b08fe4-59ca-4291-9287-8be490399ab8)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 74f8f097-364b-4aee-ab32-e158a6c68efe)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp bd1d6efd-a72b-4329-9d79-453718eb2a49)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3e5d25c0-5d6a-4767-820a-a5ec2445929a)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 36 "SEATALK") (pinfunction "C") (pintype "passive") (tstamp 6363770a-0a55-4594-9fb3-2bd8d38a95f1)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 40 "Net-(Q4-B)") (pinfunction "B") (pintype "input") (tstamp daf013b7-c57d-4db9-8d81-915d7ce98053)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "E") (pintype "passive") (tstamp 71928204-83a0-4841-8d80-f8d2b462f1e0)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp 96ab9178-579a-45a4-a68c-707fb33e88ed) + (at 86.92 71) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/873fd484-3122-4533-8a3d-0b6694e5decf") + (attr through_hole) + (fp_text reference "R4" (at 5.08 -2) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 37fb503a-080f-462a-9b22-f394e88f0df4) + ) + (fp_text value "4.7k" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d7858332-0a89-43bd-843c-c4019c2ef22e) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp bedfe455-bd6f-46c0-9300-8842f1cb3ffd) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 01e02490-7388-4d67-975e-899e21b38702)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 08b523e2-c93b-49b7-b009-22ae5f12b25e)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a0832920-26df-44d4-ab46-c094438af8f9)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 85f5c5f8-5424-4ee3-98d0-83c2472d10fb)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0555e233-54a8-4542-a84f-1b642bab3557)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f25e5076-aee2-4b32-a531-fa5c611d02e9)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5c684b52-6187-401f-a1ca-bae88832c7c6)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 11258aa9-841f-415b-8190-ee003a6d5c3a)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 176a5eac-bccd-4785-9223-164eadc9abbe)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 089bbf21-c349-4415-a9c2-87bee252dd3b)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f218a2a2-5403-444d-90fd-8bb21efc0b7f)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 560d47ea-221e-4fa7-acfc-e132fac5f0ba)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1d724313-af71-4eea-81b3-cbce565a2c8a)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ee0045f3-8ff0-4f53-9e3b-2990a066c97f)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e8ec7e56-85b1-4ad2-a4c8-17a130210003)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ce7ca2e2-da3d-41df-b0a0-d25f7350d386)) + (pad "1" thru_hole circle (at 0 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 1 "Net-(C1-Pad1)") (pintype "passive") (tstamp d94bd03d-a033-4d12-98a3-695286a85a34)) + (pad "2" thru_hole oval (at 10.16 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pintype "passive") (tstamp 075bd117-6a16-454e-8d6c-359b01d22aaa)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (layer "F.Cu") + (tstamp 9b22d2a4-0ccb-47ea-90ce-737c81524990) + (at 84 90.46) + (descr "Through hole straight pin header, 1x03, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x03 2.54mm single row") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Enable" "0") + (property "ki_description" "Generic connector, single row, 01x03, script generated") + (property "ki_keywords" "connector") + (path "/8008b50a-ac2b-42d5-8e97-ecafe76dc831") + (attr through_hole) + (fp_text reference "J3" (at 0 -2.33) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a071f763-581e-4a5e-b29c-e9f54513cd45) + ) + (fp_text value "Conn_01x03_Pin" (at 2 8.04) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 5dd83252-9051-4e64-96b4-503a15b3428b) + ) + (fp_text user "${REFERENCE}" (at 0 2.54 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 475643e5-a312-40f3-880e-ed1b429bd938) + ) + (fp_line (start -1.33 -1.33) (end 0 -1.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 52671c20-b326-415c-8e1b-353a460e8484)) + (fp_line (start -1.33 0) (end -1.33 -1.33) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 119717db-aa05-4788-9a69-13bf9ed086e5)) + (fp_line (start -1.33 1.27) (end -1.33 6.41) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f8ca34b8-9d41-4a8f-a37a-f74ccaad493a)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b2915d18-a840-434b-acc1-be54e9d7da21)) + (fp_line (start -1.33 6.41) (end 1.33 6.41) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3c629c98-4613-4a64-a798-d17372fddfdc)) + (fp_line (start 1.33 1.27) (end 1.33 6.41) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 848b6358-6f8c-4478-bdcd-26ecb2ff1055)) + (fp_line (start -1.8 -1.8) (end -1.8 6.85) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ccae0eae-d25d-4041-baf4-3d1c6fdd4b4e)) + (fp_line (start -1.8 6.85) (end 1.8 6.85) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 36546f7d-730a-4c7b-b5dd-bb318fd369cf)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp e8f6740c-7f54-4da3-b870-d236da815f49)) + (fp_line (start 1.8 6.85) (end 1.8 -1.8) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 74967ab3-71cf-42b2-b356-7aeb697fa057)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 937cff26-9f73-4d1b-9abd-525818dec708)) + (fp_line (start -1.27 6.35) (end -1.27 -0.635) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 03736a22-aa2c-4a21-a887-ff7542c6e3e8)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 0ca9ebe4-9db4-48f2-afe7-d47671ed0b2c)) + (fp_line (start 1.27 -1.27) (end 1.27 6.35) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a4a8c9cd-e4d4-4113-ab60-c8bf63ff03b5)) + (fp_line (start 1.27 6.35) (end -1.27 6.35) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d202302b-a3d6-4fbe-b269-48c1ab594c86)) + (pad "1" thru_hole rect (at 0 0) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "Pin_1") (pintype "passive") (tstamp cb60773a-e9bb-44b7-93cb-ae9b0dcd5076)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 36 "SEATALK") (pinfunction "Pin_2") (pintype "passive") (tstamp 6c60ff97-7ab6-429d-b232-eafc637c7752)) + (pad "3" thru_hole oval (at 0 5.08) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 37 "Net-(J3-Pin_3)") (pinfunction "Pin_3") (pintype "passive") (tstamp 1f9dd82d-e5b9-41c3-9904-d00a230fe37e)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x03_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp ca807d53-c77b-4bee-93c1-b656c3ae712c) + (at 114.5 74.16 90) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/c3004251-8088-4827-aa14-0a4ce9cc2dcb") + (attr through_hole) + (fp_text reference "R1" (at 3 -2 90) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d2f0c015-24aa-438a-9541-9cc61ef62126) + ) + (fp_text value "22k" (at 5.08 2.37 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a129d50f-f57a-4002-963c-256e93292c48) + ) + (fp_text user "${REFERENCE}" (at 5.08 0 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f251dce7-d4af-4a97-9ae8-335df770d910) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 17689c9a-9787-4abb-8312-a43c8b895918)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 841a3b36-59b2-49b3-9286-1839d4e42b90)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4aed7759-2b42-42ac-b8f8-14afbccaee53)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 60d997b2-12e1-4497-a592-79958ce07ac8)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c2f22d5e-8fee-473c-ac04-31823111c414)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8a8181b0-54fc-48eb-9bfa-2e2584ba7654)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 19ce634a-a228-40fd-ad39-369f1bb53f04)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ec1fedd7-5df3-4ac5-8dab-4d3a63e0010e)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 38f0e664-91bf-4fc7-bd1a-bbf057d11656)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 64f3e11d-5464-4204-8da5-58525b1c95c5)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 07806d8f-f312-4b54-ab38-c722c47398b0)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 00c984c0-5619-42aa-84c2-c3ad0136745c)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 678a38f4-95c4-40cc-8116-656bc2867d59)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ed294fe9-76d2-47ae-89a7-3687c84d9183)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7ed972ca-f723-4f93-bfbf-4224d5cf6d66)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp c1d30e4c-ccd9-4bcd-9ab1-31bd6437f6a5)) + (pad "1" thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pintype "passive") (tstamp aae05436-5a92-4ac5-81d6-35647d420303)) + (pad "2" thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 40 "Net-(Q4-B)") (pintype "passive") (tstamp 54377306-d198-440c-a267-ffb6da1890ec)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp cbf39d8b-e581-487f-bb9f-5f9238d3e735) + (at 98.08 55 180) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/e7236bba-1884-40d5-b2d5-3b06582681db") + (attr through_hole) + (fp_text reference "R5" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp e58af2fa-639d-477d-ab8d-6ca61ec63873) + ) + (fp_text value "4.7k" (at 2.08 -2.5) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7de15450-5c23-4c36-b039-b102b71bc0fc) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 9f949ff3-b6b7-44fe-a379-755b38e97ef9) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e4b6dd23-fa53-4b1e-ba32-6d74bb36da13)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7e590205-ff8a-4a42-aacb-dc118e8cf381)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b22d6a2c-255f-4d6d-8009-c27fd3458084)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp efe33c1d-1076-46db-9bd9-2301f0d31cfd)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1d9e83de-cd31-427a-ade3-6fb6b2deab8b)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp af2bfda5-69e3-49d0-9b29-5aab45f26f62)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 896ee8c3-d9d0-4489-bade-5b21131a6df1)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 42f215b6-5ed0-4450-94ca-095e523caf0b)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp aec1e736-bd69-4f28-aa51-df10d996dcc9)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c130b929-0faf-4200-9693-c6f6cbc6609e)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 4f0af603-2261-42b5-9fa2-f1dc33db9ce5)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2963daf5-25bf-4642-bce5-ccce45f2221c)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d53ae629-db2a-428a-b58e-634cadb6448c)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 59446e49-4352-4d70-bf15-f6ac86165a67)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b184d40c-1e8a-4c38-a7a0-552f75f6e5c3)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 70f899cf-b17c-410e-9ab1-7def94bba7e4)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 36 "SEATALK") (pintype "passive") (tstamp 81c93291-cb6c-4014-bcc2-1bc2bf37137e)) + (pad "2" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 39 "Net-(Q1-B)") (pintype "passive") (tstamp 0001be7b-18ae-4367-a0ce-059e0485753f)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp d007f101-54a3-4c77-9bd7-a73cba8eb752) + (at 118 68.36) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "NPN") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "bc547b") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92") + (property "ki_keywords" "NPN Transistor") + (path "/aab4eea5-37eb-4106-bd44-0c724bfeaa6e") + (attr through_hole) + (fp_text reference "Q6" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp fbe91096-709f-4248-8b1b-715bef9b3e64) + ) + (fp_text value "BC547" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8436b44d-fa3f-4149-bc91-b0d6f0d80df0) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ea5c9eba-c3dc-4c5d-b5c5-84ba2ab2f0f7) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp dbbbc7f0-2115-4264-a983-50a4941d3538)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ffd17c01-59e0-4766-9483-ae72e1c79461)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 24727389-f67c-4e3b-a95f-9c41f072f4cc)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7d78f865-c263-45dd-a8a7-62faedff3746)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 2568e5ce-2d5c-4f82-a494-0ce1429aef93)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1622989f-3f4d-4a2d-ab83-22f697b5ea79)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 9f37abae-31f7-45cd-b3e0-b1654e97cb4d)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e1666e34-8f15-4528-b610-cceec949be45)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d37cd9c0-9e63-40de-9f50-65c17bc76590)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d3fd33a0-08a6-4a10-9ae8-13d8910ce6a5)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pinfunction "C") (pintype "passive") (tstamp e6ce3118-7d40-4168-b720-5b7216bca586)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 41 "Net-(Q5-C)") (pinfunction "B") (pintype "input") (tstamp b88707f2-2a0b-46ee-ad8b-822fd40ab84f)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 40 "Net-(Q4-B)") (pinfunction "E") (pintype "passive") (tstamp 254e5d7e-331b-4859-b2cf-93b498418670)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline" (layer "F.Cu") + (tstamp d1a4dee9-ad85-4d4b-bbe4-eac7c97c848b) + (at 117.73 89.36) + (descr "TO-92 leads in-line, narrow, oval pads, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "NPN") + (property "Sim.Library" "BC547_and_BC557.lib") + (property "Sim.Name" "bc547b") + (property "Sim.Params" "temp=20") + (property "Sim.Pins" "1=C 2=B 3=E") + (property "Sim.Type" "GUMMELPOON") + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92") + (property "ki_keywords" "NPN Transistor") + (path "/7762f63f-936a-4d38-a129-b66d3e12b33b") + (attr through_hole) + (fp_text reference "Q3" (at 1.27 -3.56) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d3daeabc-a004-4665-b170-8f24d16db1fd) + ) + (fp_text value "BC547" (at 1.27 2.79) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7553e285-dc17-4ff6-ace6-339930caa096) + ) + (fp_text user "${REFERENCE}" (at 1.27 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 650572d1-576e-48e5-9e7f-8db38c0a6595) + ) + (fp_line (start -0.53 1.85) (end 3.07 1.85) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3053108d-a471-406a-b9ba-a160c4d01229)) + (fp_arc (start -0.568478 1.838478) (mid -1.132087 -0.994977) (end 1.27 -2.6) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a2a29989-8a99-410e-9121-67d6001d16cb)) + (fp_arc (start 1.27 -2.6) (mid 3.672087 -0.994977) (end 3.108478 1.838478) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5d767d9a-e587-40b3-86cd-f8d09e2834b6)) + (fp_line (start -1.46 -2.73) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5c35fbec-e148-411d-a1c0-84dd1bfa5108)) + (fp_line (start -1.46 -2.73) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 76102610-4faf-4b7d-8aa3-2511c81146fd)) + (fp_line (start 4 2.01) (end -1.46 2.01) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp efd5d6ec-6642-4bee-82cd-c24259b646b0)) + (fp_line (start 4 2.01) (end 4 -2.73) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 52ece934-29e9-44d9-b7c0-ef7b2343e66e)) + (fp_line (start -0.5 1.75) (end 3 1.75) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6a4137ab-7e92-4136-bfac-0efbe0ea0974)) + (fp_arc (start -0.483625 1.753625) (mid -1.021221 -0.949055) (end 1.27 -2.48) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 73552ca8-6e51-47a9-909c-9c5b076e8e19)) + (fp_arc (start 1.27 -2.48) (mid 3.561221 -0.949055) (end 3.023625 1.753625) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f0d6c94c-4075-4d78-a8ec-752fc693a814)) + (pad "1" thru_hole rect (at 0 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 3 "Net-(D1-K)") (pinfunction "C") (pintype "passive") (tstamp 1a33ecd8-093f-461a-833f-cba740935034)) + (pad "2" thru_hole oval (at 1.27 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 2 "Net-(Q2-B)") (pinfunction "B") (pintype "input") (tstamp fee31ae6-a29c-423b-8b10-9fc0cf917f3d)) + (pad "3" thru_hole oval (at 2.54 0) (size 1.05 1.5) (drill 0.75) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "E") (pintype "passive") (tstamp db39512d-4ef4-4866-9b86-e4bc1499eb2c)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp dd9aba0a-3b67-450c-a7dc-b8136fb819d7) + (at 98 51 180) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Pins" "1=+ 2=-") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/efcaf01a-542f-4f53-800a-efe3e3979d0e") + (attr through_hole) + (fp_text reference "R2" (at 5 2) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d72b0214-4aad-4e72-a81b-b9a3de380ff5) + ) + (fp_text value "2.2k" (at 2 2) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp cad4da24-0a5f-4bb7-9f64-fc9b37045294) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 9d3c7c9f-44c1-4dc0-9d2e-790944136204) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d1e84b1c-5e68-4e83-831f-7d27a516cfbf)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c3f554ed-c65b-42aa-9a03-22d2d0468061)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 35c02950-e87b-4b07-b4fe-75f736fce361)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8e4318fc-55d3-41c0-a916-c0ef0badc9db)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 76cb7daf-4a38-41cb-9dd7-6794788db8a1)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 38650a1f-dc94-4217-846b-9939037fc45b)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 78265606-1e82-42c6-b341-ff5a1c9a4ce4)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp de625a4f-6be8-4055-8dc6-7fced765d719)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp bc18d339-84d3-4e72-85f5-83fa5519f68e)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 47f86db8-3099-4ce9-a450-af33a514d2fd)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 660f5c02-25a7-4192-babb-a177225229d6)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2af31c30-b0e6-4b29-9053-5f78b0bd5408)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7152c385-5534-4e4b-946e-42bfeae5bd23)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ca30de16-9515-447d-b8dd-59fc8b039eba)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6b88b136-479d-4a4c-9412-bb5f9bca0c9f)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 8b5dd965-7956-4e35-81fa-c3edb88367d4)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 6 "VCC_5.0") (pintype "passive") (tstamp 0cabe27b-b3ec-45c4-9037-78d2fed33197)) + (pad "2" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 39 "Net-(Q1-B)") (pintype "passive") (tstamp 8432737e-8005-434c-8366-107a432f3b9e)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp debd4bf9-e187-48f4-b5b8-54f821e675b7) + (at 102.92 99) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Device" "R") + (property "Sim.Params" "r=100") + (property "Sim.Pins" "1=+ 2=-") + (property "Sim.Type" "=") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/72ecdcab-4412-431f-ae1a-4d8a433bda34") + (attr through_hole) + (fp_text reference "R9" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1adabb0b-2f3b-4e44-a211-439fe984c34c) + ) + (fp_text value "100" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6f4d2614-be84-491c-bab5-2d4f6a044f06) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6eeaf29c-ffb0-4ce6-8578-3fb206625640) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 04052e68-808b-4b0e-8bd4-278782906382)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7757df2c-386b-42c2-96da-7bd64007fcae)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 55efcd37-6330-46f5-8e2e-51159ca94120)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp dbd18270-a9d9-4b04-b0c3-9cc94baa075d)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f78df423-7713-4c0b-b799-71f8988c0a6e)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 32e49050-5eaa-4cf2-91a1-7eb8474d38b2)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3b801b06-a4ad-4cb8-8aa5-f9c5b10ad98a)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 985b7bd0-5feb-4b79-b18e-18e57d3e996e)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp e70eedb8-6c79-426d-8142-c7b85c1e8e1b)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp e6cae90a-9a4a-4ee1-8a0f-55652d53c694)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 61042d46-1928-4348-9503-e08ee3e5695c)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 63243ee3-b640-4eec-8288-aa7ff9fe8eb2)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp da5397b2-c999-48b1-b0ab-4d9f0f834557)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6ee6c2a2-5ca8-48c2-9e89-91cd15ea9e04)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp dc3e0402-6f45-419e-8214-69f657768375)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 9f04a8db-01c1-48d5-91f1-e5c12b5b63ae)) + (pad "1" thru_hole circle (at 0 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pintype "passive") (tstamp 4594b6e2-6d08-4072-b84a-254175f3a113)) + (pad "2" thru_hole oval (at 10.16 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 4 "Net-(D1-A)") (pintype "passive") (tstamp d3a1db46-f007-4acb-93b3-a53b2620b384)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp e5a0b09f-5f1d-4dd5-97f0-ffb7f4370ea6) + (at 93.42 81.5) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/579a3129-1551-4263-8c06-93d703fd61dd") + (attr through_hole) + (fp_text reference "R10" (at 7.58 -2) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp c42c07ac-5c85-4daa-9d9d-a7d024817d5d) + ) + (fp_text value "1.5k" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp b0677b47-47a4-4e1f-8e44-362da38f6c9e) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1fbb7735-2f08-47c9-a35e-842978183958) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e1dc2511-0130-415c-a2a9-5122c7636424)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 5bb189b6-5b7f-4733-8857-ceb9d5ae6041)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ea660d08-c466-4f39-ae9f-470853c8b1da)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp acd51042-f84f-4777-95ed-cf08e95daa07)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6f70a6c0-d26d-4dbf-affd-804bb4c867e4)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2520c0f1-ade0-4bfb-a435-32c31dae3b5f)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f56e1675-50ba-48a8-ba84-97b760e876a2)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ed446b59-8a71-46c0-81ea-a1c991b3bd21)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 0f861356-1f5a-4801-9714-3b27d5c11792)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp cd93bac7-9b45-4ca1-8c1b-6073b4f7f7b6)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 9b77d67e-1c42-4405-86b6-bc64d6927477)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 84bf1246-58af-411d-9deb-6fa2a1c47f11)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 79b3c894-83e5-4758-b4f6-66b7b65193f5)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 8684cb2c-5d8e-41fb-852b-665da25b12e7)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ff42be25-4dec-455e-aede-73bb030a8964)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f7a61194-bbda-470e-a973-831ca9c8452f)) + (pad "1" thru_hole circle (at 0 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 11 "TXD") (pintype "passive") (tstamp fb6cf04f-3b77-496c-b9f5-f42a4efb1189)) + (pad "2" thru_hole oval (at 10.16 0) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 42 "Net-(Q5-B)") (pintype "passive") (tstamp 293d8404-bb2c-4a79-a7cb-8680b72cc5e0)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (layer "F.Cu") + (tstamp e7703e6d-9a49-4d76-9f0b-65a55ef858aa) + (at 99 96 180) + (descr "Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm") + (property "Remarks" "External pull-up from bus") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "ki_description" "Resistor") + (property "ki_keywords" "R res resistor") + (path "/71be8ad0-bfd2-4f59-afd6-b1bb5fcc5604") + (attr through_hole) + (fp_text reference "R12" (at 5.08 -2.37) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f9ea6408-2cce-4ff2-9411-b63169638446) + ) + (fp_text value "10k" (at 5.08 2.37) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 014f932c-954f-4dac-a637-fdb2be919266) + ) + (fp_text user "${REFERENCE}" (at 5.08 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7ff6333d-7837-4683-b9b9-36831c69bec2) + ) + (fp_line (start 1.04 0) (end 1.81 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1affa843-829b-423e-95d9-25618d982d88)) + (fp_line (start 1.81 -1.37) (end 1.81 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d8bf1cf6-9361-48bc-bd0c-c972d2199006)) + (fp_line (start 1.81 1.37) (end 8.35 1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b80e9e2f-72be-4ee6-b523-641b000a997f)) + (fp_line (start 8.35 -1.37) (end 1.81 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b7a7bd87-9853-4892-a032-efbb5d108b4d)) + (fp_line (start 8.35 1.37) (end 8.35 -1.37) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp d69065e7-c866-4dae-9811-5ad0a278902b)) + (fp_line (start 9.12 0) (end 8.35 0) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 821a318d-50c5-41ca-b6ac-8fb327d69504)) + (fp_line (start -1.05 -1.5) (end -1.05 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 6ec2a0d0-9097-4280-b5b1-961832eb4190)) + (fp_line (start -1.05 1.5) (end 11.21 1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3b6e4a2a-8ab0-42d0-bc26-1831bd9ef990)) + (fp_line (start 11.21 -1.5) (end -1.05 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 220559d4-b3d5-4dc9-9376-b1f8262337f9)) + (fp_line (start 11.21 1.5) (end 11.21 -1.5) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b59ece0b-0ecd-4f0e-99ae-12a3c26f62fc)) + (fp_line (start 0 0) (end 1.93 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6ed78fbe-bf71-4e3f-a39e-50399bc0d5ed)) + (fp_line (start 1.93 -1.25) (end 1.93 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 86b7abaf-922c-47b1-8d76-ee6b1a1eb326)) + (fp_line (start 1.93 1.25) (end 8.23 1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ef968bb6-d89a-45e6-8fa1-a988f47a66d2)) + (fp_line (start 8.23 -1.25) (end 1.93 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 86206d43-2f19-4330-8a69-1bd5174742a2)) + (fp_line (start 8.23 1.25) (end 8.23 -1.25) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e9a2518d-c96c-4b42-aa46-925156fa741f)) + (fp_line (start 10.16 0) (end 8.23 0) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp beadf34b-9923-4eb4-9d7a-425866995c3a)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 36 "SEATALK") (pintype "passive") (tstamp e5add682-4bcf-4215-a641-107af43037d0)) + (pad "2" thru_hole oval (at 10.16 0 180) (size 1.6 1.6) (drill 0.8) (layers "*.Cu" "*.Mask") + (net 37 "Net-(J3-Pin_3)") (pintype "passive") (tstamp 0b1ca68b-aa53-4a8c-8ac4-a295c8a00861)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinSocket_2.54mm:PinSocket_2x20_P2.54mm_Vertical" (layer "B.Cu") + (tstamp a553f4af-6beb-47ca-9bdf-3fe6bb347d97) + (at 130 48.5 180) + (descr "Through hole straight socket strip, 2x20, 2.54mm pitch, double cols (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 2x20 2.54mm double row") + (property "Sheetfile" "SeaTalk1.kicad_sch") + (property "Sheetname" "") + (property "Sim.Enable" "0") + (property "ki_description" "expansion header for Raspberry Pi 2 & 3") + (property "ki_keywords" "raspberrypi gpio") + (path "/58887779-90ab-4780-98be-8f57c4f8f78b") + (attr through_hole) + (fp_text reference "J1" (at -1.27 2.77) (layer "B.SilkS") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp b3f29cb6-f9aa-44cf-9081-ffcbfb4f1649) + ) + (fp_text value "Raspberry_Pi_2_3" (at -1.27 -51.03) (layer "B.Fab") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp 394f24f1-348c-4c70-bdb8-13e586c9ac2c) + ) + (fp_text user "${REFERENCE}" (at -1.27 -24.13 90) (layer "B.Fab") + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + (tstamp d9e5c979-0325-493f-be21-970ea4bbb3d3) + ) + (fp_line (start -3.87 -49.59) (end 1.33 -49.59) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp af2c957b-2870-4563-a15e-2556cb962ad6)) + (fp_line (start -3.87 1.33) (end -3.87 -49.59) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 56cffd37-418e-46ac-9c64-84b2a9514e88)) + (fp_line (start -3.87 1.33) (end -1.27 1.33) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 4b871eca-318e-4884-b570-61a572b64fb5)) + (fp_line (start -1.27 -1.27) (end 1.33 -1.27) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 05e34ae7-f1c0-4266-b9d3-0154effc34d6)) + (fp_line (start -1.27 1.33) (end -1.27 -1.27) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp d28919b0-0eae-4809-8f8a-b4941c037682)) + (fp_line (start 0 1.33) (end 1.33 1.33) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp f0d18060-ef52-437a-9710-e1a8426e9c4f)) + (fp_line (start 1.33 -1.27) (end 1.33 -49.59) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp a3c00a0a-fbac-4131-ba74-405282c73d3c)) + (fp_line (start 1.33 1.33) (end 1.33 0) + (stroke (width 0.12) (type solid)) (layer "B.SilkS") (tstamp 81c2ef95-b8b4-4960-a45c-fef4a1644163)) + (fp_line (start -4.34 -50) (end -4.34 1.8) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp f6b05721-9d46-48ea-bf32-b049b07ee567)) + (fp_line (start -4.34 1.8) (end 1.76 1.8) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp e7312949-3522-466c-af68-79a4570c97bd)) + (fp_line (start 1.76 -50) (end -4.34 -50) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 8ccd6010-dc35-4777-9bd2-c04fa8cd87e2)) + (fp_line (start 1.76 1.8) (end 1.76 -50) + (stroke (width 0.05) (type solid)) (layer "B.CrtYd") (tstamp 6735c9f7-c892-4b6f-beaa-9c0b0f726e13)) + (fp_line (start -3.81 -49.53) (end -3.81 1.27) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp c540b7a3-bc12-47a5-8dbf-f964d52a6420)) + (fp_line (start -3.81 1.27) (end 0.27 1.27) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 0a203383-1015-4339-93d2-9d9cb55c34e0)) + (fp_line (start 0.27 1.27) (end 1.27 0.27) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp e2a144ec-1dd6-4308-b1bc-e10fc86d59b5)) + (fp_line (start 1.27 -49.53) (end -3.81 -49.53) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp bf8f2e0e-bdf1-435f-844a-60daf93737b8)) + (fp_line (start 1.27 0.27) (end 1.27 -49.53) + (stroke (width 0.1) (type solid)) (layer "B.Fab") (tstamp 6ea42a77-cf85-47a6-96bd-f7d5c7a95e31)) + (pad "1" thru_hole rect (at 0 0 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pinfunction "3V3") (pintype "power_in") (tstamp 58528890-541e-41c9-8553-ae0cee08e757)) + (pad "2" thru_hole oval (at -2.54 0 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 6 "VCC_5.0") (pinfunction "5V") (pintype "power_in") (tstamp 63fb603f-9f15-4680-964a-c1be50853204)) + (pad "3" thru_hole oval (at 0 -2.54 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 7 "unconnected-(J1-SDA{slash}GPIO2-Pad3)") (pinfunction "SDA/GPIO2") (pintype "bidirectional") (tstamp eab7008b-a1ff-47fe-950e-a4ff68d84b15)) + (pad "4" thru_hole oval (at -2.54 -2.54 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 6 "VCC_5.0") (pinfunction "5V") (pintype "power_in") (tstamp 8976e579-c955-4688-817f-d3551b43996f)) + (pad "5" thru_hole oval (at 0 -5.08 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 8 "unconnected-(J1-SCL{slash}GPIO3-Pad5)") (pinfunction "SCL/GPIO3") (pintype "bidirectional") (tstamp 62a149fc-80af-4fdd-a913-2bff78125909)) + (pad "6" thru_hole oval (at -2.54 -5.08 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 01717d6d-6600-4cb3-8880-34ec125e8282)) + (pad "7" thru_hole oval (at 0 -7.62 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 10 "unconnected-(J1-GCLK0{slash}GPIO4-Pad7)") (pinfunction "GCLK0/GPIO4") (pintype "bidirectional") (tstamp f11e0c36-845c-41bf-a710-ed95038758f1)) + (pad "8" thru_hole oval (at -2.54 -7.62 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 12 "unconnected-(J1-GPIO14{slash}TXD-Pad8)") (pinfunction "GPIO14/TXD") (pintype "bidirectional") (tstamp fc31b1c5-4f3d-4ac7-a873-9fe5549d93b7)) + (pad "9" thru_hole oval (at 0 -10.16 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp a982eb2e-9f2e-4815-9fb7-ea96cb3bf5fa)) + (pad "10" thru_hole oval (at -2.54 -10.16 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 25 "unconnected-(J1-GPIO15{slash}RXD-Pad10)") (pinfunction "GPIO15/RXD") (pintype "bidirectional") (tstamp b9b673ce-eeb3-4439-bd48-4db687e008c1)) + (pad "11" thru_hole oval (at 0 -12.7 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 13 "unconnected-(J1-GPIO17-Pad11)") (pinfunction "GPIO17") (pintype "bidirectional") (tstamp 165ad222-842e-4a6e-86cc-91a0e51aaffa)) + (pad "12" thru_hole oval (at -2.54 -12.7 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 14 "unconnected-(J1-GPIO18{slash}PWM0-Pad12)") (pinfunction "GPIO18/PWM0") (pintype "bidirectional") (tstamp 209fc722-fc6c-44c5-8161-5af70e08f5a9)) + (pad "13" thru_hole oval (at 0 -15.24 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 15 "unconnected-(J1-GPIO27-Pad13)") (pinfunction "GPIO27") (pintype "bidirectional") (tstamp 23d032d4-dd1d-43f4-8d13-a79ba85ab3e6)) + (pad "14" thru_hole oval (at -2.54 -15.24 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 43c6842c-1f58-4b5a-aa64-cc798e2a154e)) + (pad "15" thru_hole oval (at 0 -17.78 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 16 "unconnected-(J1-GPIO22-Pad15)") (pinfunction "GPIO22") (pintype "bidirectional") (tstamp 38309d6e-81d3-4f76-a240-a11188452ec8)) + (pad "16" thru_hole oval (at -2.54 -17.78 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 17 "unconnected-(J1-GPIO23-Pad16)") (pinfunction "GPIO23") (pintype "bidirectional") (tstamp 03e4b113-1537-43fa-92a9-d2a8443b2b9f)) + (pad "17" thru_hole oval (at 0 -20.32 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 5 "VCC_3.3") (pinfunction "3V3") (pintype "power_in") (tstamp 654f9ba5-310c-4d5a-af0b-ff5b85712b4d)) + (pad "18" thru_hole oval (at -2.54 -20.32 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 18 "unconnected-(J1-GPIO24-Pad18)") (pinfunction "GPIO24") (pintype "bidirectional") (tstamp 86de948e-c5a2-4181-bdc8-05eb36367ff1)) + (pad "19" thru_hole oval (at 0 -22.86 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 19 "unconnected-(J1-MOSI0{slash}GPIO10-Pad19)") (pinfunction "MOSI0/GPIO10") (pintype "bidirectional") (tstamp f6edaa64-a918-4f88-9892-6c995e9575f6)) + (pad "20" thru_hole oval (at -2.54 -22.86 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 304e0b03-1cea-4d23-91a2-dc41d5ce210d)) + (pad "21" thru_hole oval (at 0 -25.4 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 20 "unconnected-(J1-MISO0{slash}GPIO9-Pad21)") (pinfunction "MISO0/GPIO9") (pintype "bidirectional") (tstamp bfdca412-cdb9-48d0-92c5-752a4e949881)) + (pad "22" thru_hole oval (at -2.54 -25.4 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 21 "unconnected-(J1-GPIO25-Pad22)") (pinfunction "GPIO25") (pintype "bidirectional") (tstamp 88589300-4c66-4f03-a5a1-6037ab7b21b6)) + (pad "23" thru_hole oval (at 0 -27.94 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 22 "unconnected-(J1-SCLK0{slash}GPIO11-Pad23)") (pinfunction "SCLK0/GPIO11") (pintype "bidirectional") (tstamp c3d969d8-71fc-450e-bc8a-582f626baa6e)) + (pad "24" thru_hole oval (at -2.54 -27.94 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 23 "unconnected-(J1-~{CE0}{slash}GPIO8-Pad24)") (pinfunction "~{CE0}/GPIO8") (pintype "bidirectional") (tstamp d14770f5-5058-4cb1-b720-1e6921d45332)) + (pad "25" thru_hole oval (at 0 -30.48 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp fd272450-5023-45eb-b42b-9ce919739f26)) + (pad "26" thru_hole oval (at -2.54 -30.48 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 24 "unconnected-(J1-~{CE1}{slash}GPIO7-Pad26)") (pinfunction "~{CE1}/GPIO7") (pintype "bidirectional") (tstamp 0eb56d41-2792-4c4e-82e3-fbbd68e1a0f2)) + (pad "27" thru_hole oval (at 0 -33.02 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 11 "TXD") (pinfunction "ID_SD/GPIO0") (pintype "bidirectional") (tstamp c880e36d-41c2-4d06-af9d-2c7617a23133)) + (pad "28" thru_hole oval (at -2.54 -33.02 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 26 "Net-(J1-ID_SC{slash}GPIO1)") (pinfunction "ID_SC/GPIO1") (pintype "bidirectional") (tstamp ec5bd783-4334-460e-9233-0365f9ba4fa1)) + (pad "29" thru_hole oval (at 0 -35.56 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 27 "unconnected-(J1-GCLK1{slash}GPIO5-Pad29)") (pinfunction "GCLK1/GPIO5") (pintype "bidirectional") (tstamp 53924c23-bf68-4cdb-af7e-3a7fc9cb34eb)) + (pad "30" thru_hole oval (at -2.54 -35.56 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 41884a76-5a3d-4fec-97a3-f190dcb4359e)) + (pad "31" thru_hole oval (at 0 -38.1 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 28 "unconnected-(J1-GCLK2{slash}GPIO6-Pad31)") (pinfunction "GCLK2/GPIO6") (pintype "bidirectional") (tstamp 5eb72e8e-9771-44a8-8bcc-b1a2670eb45b)) + (pad "32" thru_hole oval (at -2.54 -38.1 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 29 "unconnected-(J1-PWM0{slash}GPIO12-Pad32)") (pinfunction "PWM0/GPIO12") (pintype "bidirectional") (tstamp f79ea345-cd02-4c42-b9ef-5e7c3ab6c734)) + (pad "33" thru_hole oval (at 0 -40.64 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 30 "unconnected-(J1-PWM1{slash}GPIO13-Pad33)") (pinfunction "PWM1/GPIO13") (pintype "bidirectional") (tstamp ea4a1737-689c-42a6-8e2b-e05ba367f7f7)) + (pad "34" thru_hole oval (at -2.54 -40.64 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp de446f11-bb46-40f4-b427-395e6936a157)) + (pad "35" thru_hole oval (at 0 -43.18 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 31 "unconnected-(J1-GPIO19{slash}MISO1-Pad35)") (pinfunction "GPIO19/MISO1") (pintype "bidirectional") (tstamp bb0994d1-ce01-4d1b-a264-ae95e1726897)) + (pad "36" thru_hole oval (at -2.54 -43.18 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 32 "unconnected-(J1-GPIO16-Pad36)") (pinfunction "GPIO16") (pintype "bidirectional") (tstamp 8fe78bff-e254-43d6-8919-7cdd28f5a1cd)) + (pad "37" thru_hole oval (at 0 -45.72 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 33 "unconnected-(J1-GPIO26-Pad37)") (pinfunction "GPIO26") (pintype "bidirectional") (tstamp c4d72f46-e7e2-4e06-b30b-02c2ac3ed1a5)) + (pad "38" thru_hole oval (at -2.54 -45.72 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 34 "unconnected-(J1-GPIO20{slash}MOSI1-Pad38)") (pinfunction "GPIO20/MOSI1") (pintype "bidirectional") (tstamp d9eb791d-5cde-4463-8dbb-c3f781f8687a)) + (pad "39" thru_hole oval (at 0 -48.26 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 9 "GND") (pinfunction "GND") (pintype "power_in") (tstamp 73b4246b-e0cc-4a08-a483-a5aba9f67139)) + (pad "40" thru_hole oval (at -2.54 -48.26 180) (size 1.7 1.7) (drill 1) (layers "*.Cu" "*.Mask") + (net 35 "unconnected-(J1-GPIO21{slash}SCLK1-Pad40)") (pinfunction "GPIO21/SCLK1") (pintype "bidirectional") (tstamp d87de98a-8bcc-436b-8855-5fd9f42741e2)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_2x20_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_arc (start 135.87868 101.87868) (mid 135 104) (end 132.87868 104.87868) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 006b697e-cb9f-47bf-9b08-fa272db3abbc)) + (gr_line (start 117 40) (end 133 40) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 0651e6f3-a8ef-4f5b-81b7-46a9174573f4)) + (gr_line (start 117 45) (end 117 40) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 1c3a603d-274b-478b-8330-c3c77c097754)) + (gr_circle (center 82.5 101.6) (end 83.875 101.6) + (stroke (width 0.1) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 1e27e95c-9b16-4076-b6a3-91f2f93e4dfd)) + (gr_arc (start 80 43) (mid 80.87868 40.87868) (end 83 40) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 2712933c-bdf1-45f2-9125-54ad4f20f7d8)) + (gr_line (start 136 43) (end 135.87868 101.87868) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 29941149-35ba-4e98-9236-92c4a3d1b05a)) + (gr_line (start 83 40) (end 98 40) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 35eabd1e-ce48-4d1b-b4c5-f9b672087f1c)) + (gr_arc (start 133 40) (mid 135.12132 40.87868) (end 136 43) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 513ae3a3-7c34-4694-b07a-38501e038067)) + (gr_line (start 98 40) (end 98 45) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 799345f8-d4d6-43db-9095-0c8383f55faa)) + (gr_arc (start 83 105) (mid 80.87868 104.12132) (end 80 102) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 90c4a468-59f6-4d4c-a54e-29aa7b58ed59)) + (gr_line (start 80 102) (end 80 43) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp 9593da5c-79ca-4d03-8106-9b3f2f218924)) + (gr_circle (center 131.5 43.6) (end 132.875 43.6) + (stroke (width 0.1) (type default)) (fill none) (layer "Edge.Cuts") (tstamp bf777d3a-4f8c-41a4-a310-edcd8b120e56)) + (gr_circle (center 131.5 101.6) (end 132.875 101.6) + (stroke (width 0.1) (type default)) (fill none) (layer "Edge.Cuts") (tstamp e8bd6918-8800-41e6-8041-2ea427ebf530)) + (gr_line (start 132.87868 104.87868) (end 83 105) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp eb3ec9ba-383e-4c14-8005-68029166ea09)) + (gr_circle (center 82.5 43.6) (end 83.875 43.6) + (stroke (width 0.1) (type default)) (fill none) (layer "Edge.Cuts") (tstamp eff26a51-47e0-42f5-8359-64aa1452d4e7)) + (gr_line (start 98 45) (end 117 45) + (stroke (width 0.1) (type default)) (layer "Edge.Cuts") (tstamp ff024263-f8c0-49a5-9121-7b62352dc469)) + (dimension (type aligned) (layer "Cmts.User") (tstamp 6705364b-1522-4cc6-a81a-55388acff2d3) + (pts (xy 131.5 43.6) (xy 82.5 43.6)) + (height 5.1) + (gr_text "49.0000 mm" (at 107 37.35) (layer "Cmts.User") (tstamp 6705364b-1522-4cc6-a81a-55388acff2d3) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "Cmts.User") (tstamp 7442e083-5fd6-4509-a29a-b2f83c8fc427) + (pts (xy 80 43) (xy 98 43)) + (height -10) + (gr_text "18.0000 mm" (at 89 31.85) (layer "Cmts.User") (tstamp 7442e083-5fd6-4509-a29a-b2f83c8fc427) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "Cmts.User") (tstamp 7d43cf37-f314-440b-99d4-17d21e3030b1) + (pts (xy 136.25 105) (xy 136.25 40)) + (height 5.75) + (gr_text "65.0000 mm" (at 140.85 72.5 90) (layer "Cmts.User") (tstamp 7d43cf37-f314-440b-99d4-17d21e3030b1) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "Cmts.User") (tstamp 853abeed-4063-4eb0-975e-a091b30e18f8) + (pts (xy 131.5 101.6) (xy 131.5 43.6)) + (height -6.5) + (gr_text "58.0000 mm" (at 123.85 72.6 90) (layer "Cmts.User") (tstamp 853abeed-4063-4eb0-975e-a091b30e18f8) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "Cmts.User") (tstamp cf31d3d2-7034-4942-8991-bc5c07196fb2) + (pts (xy 80 100) (xy 136 100)) + (height 9) + (gr_text "56.0000 mm" (at 108 107.85) (layer "Cmts.User") (tstamp cf31d3d2-7034-4942-8991-bc5c07196fb2) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "Cmts.User") (tstamp e4441770-feb8-4a15-be6c-7a546dc5154e) + (pts (xy 131.29 72.6) (xy 131.5 43.6)) + (height 5.554449) + (gr_text "29.0008 mm" (at 135.799333 58.131894 89.58510678) (layer "Cmts.User") (tstamp e4441770-feb8-4a15-be6c-7a546dc5154e) + (effects (font (size 1 1) (thickness 0.15))) + ) + (format (prefix "") (suffix "") (units 3) (units_format 1) (precision 4)) + (style (thickness 0.1) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + + (segment (start 101.5 53.5469) (end 101.5 60) (width 0.25) (layer "F.Cu") (net 1) (tstamp 5498cbd2-490c-4ded-9057-4b680c4dc6d4)) + (segment (start 102.92 52.1269) (end 101.5 53.5469) (width 0.25) (layer "F.Cu") (net 1) (tstamp 5c8db4ff-ccd7-4772-89ab-b7583455be72)) + (segment (start 87 70.92) (end 86.92 71) (width 0.25) (layer "F.Cu") (net 1) (tstamp 9079f1d2-3351-463a-90dc-96a62278a904)) + (segment (start 102.92 51) (end 102.92 52.1269) (width 0.25) (layer "F.Cu") (net 1) (tstamp aee6a61e-2b90-4050-99f8-3a3b92abf96d)) + (segment (start 87 66) (end 87 70.92) (width 0.25) (layer "F.Cu") (net 1) (tstamp de77477d-28a3-4f04-ba6b-1663ed36a6e2)) + (segment (start 99.9731 60) (end 93.9731 66) (width 0.25) (layer "B.Cu") (net 1) (tstamp 0f385048-751d-4464-9020-17647bf03595)) + (segment (start 101.5 60) (end 99.9731 60) (width 0.25) (layer "B.Cu") (net 1) (tstamp b749be7a-f406-4e2e-bf33-01729a000cc4)) + (segment (start 93.9731 66) (end 87 66) (width 0.25) (layer "B.Cu") (net 1) (tstamp b7d6cc83-66db-4ebc-b9b7-4133a5aac753)) + (segment (start 111 72.92) (end 109 70.92) (width 0.25) (layer "F.Cu") (net 2) (tstamp 560cf3ef-ec16-4e20-af8f-0cf4da6d0f1a)) + (segment (start 109 70.92) (end 109 60) (width 0.25) (layer "F.Cu") (net 2) (tstamp 8b4ca131-d4cd-4f91-9957-4a012ad31232)) + (segment (start 111 78.6345) (end 119 86.6345) (width 0.25) (layer "F.Cu") (net 2) (tstamp 939148f2-1344-4edb-93c2-b818f6af19c3)) + (segment (start 111 72.92) (end 111 78.6345) (width 0.25) (layer "F.Cu") (net 2) (tstamp dface084-a7c1-4552-a9fc-c578d87cf143)) + (segment (start 119 86.6345) (end 119 89.36) (width 0.25) (layer "F.Cu") (net 2) (tstamp e6784f1e-56ee-421c-b920-6cff790e430b)) + (segment (start 117.298 58.9246) (end 110.076 58.9246) (width 0.25) (layer "B.Cu") (net 2) (tstamp 12bc6725-64eb-4b03-97f7-f86567c3a5cc)) + (segment (start 110.076 58.9246) (end 109 60) (width 0.25) (layer "B.Cu") (net 2) (tstamp 3a8ece8c-6813-4c79-a48f-66964f81e7a8)) + (segment (start 117.3 58.9231) (end 117.298 58.9246) (width 0.25) (layer "B.Cu") (net 2) (tstamp 80a7af35-8e8e-42aa-9631-cd74da638c01)) + (segment (start 119.23 58.9231) (end 117.3 58.9231) (width 0.25) (layer "B.Cu") (net 2) (tstamp d241275a-b868-43c5-bc1c-27e7609d6aee)) + (segment (start 119.23 60) (end 119.23 58.9231) (width 0.25) (layer "B.Cu") (net 2) (tstamp f6a71f4b-ad6c-4240-9886-f96c8e8f601b)) + (segment (start 117.73 89.36) (end 116.878 89.36) (width 0.25) (layer "F.Cu") (net 3) (tstamp 041dd159-1df9-4c88-8def-e90640f0efca)) + (segment (start 116.878 89.36) (end 115.75 90.4881) (width 0.25) (layer "F.Cu") (net 3) (tstamp b570b690-bf28-4f40-80fc-ab07d23ccec3)) + (segment (start 115.75 90.4881) (end 115.75 93.9) (width 0.25) (layer "F.Cu") (net 3) (tstamp dfc2231a-cf41-4995-9dd7-b72ed1a9efe6)) + (segment (start 114.207 99) (end 114.207 97.9831) (width 0.25) (layer "B.Cu") (net 4) (tstamp 11e0708d-dc9a-407f-b983-2fc8252db302)) + (segment (start 114.207 97.9831) (end 118.29 93.9) (width 0.25) (layer "B.Cu") (net 4) (tstamp 26fca0ae-520d-4e63-85a1-657986e0a7a0)) + (segment (start 113.08 99) (end 114.207 99) (width 0.25) (layer "B.Cu") (net 4) (tstamp 53754b24-fc5d-4322-a6ab-4f5ad48991f0)) + (segment (start 130 68.82) (end 130 67.6431) (width 0.25) (layer "F.Cu") (net 5) (tstamp 099e3480-c2db-4254-b979-a8644ef33234)) + (segment (start 104 76) (end 102 78) (width 0.25) (layer "F.Cu") (net 5) (tstamp 1d98c998-4efd-4f2f-a1dc-fab88b376e88)) + (segment (start 130 49.6769) (end 130 48.5) (width 0.25) (layer "F.Cu") (net 5) (tstamp 3cde2a39-e45d-44cb-8441-9f46b7f245fa)) + (segment (start 130 67.6431) (end 129.634 67.6431) (width 0.25) (layer "F.Cu") (net 5) (tstamp 3fb1b4c9-baf8-44f4-bc33-4017bfb718ee)) + (segment (start 102.92 96.08) (end 104 95) (width 0.25) (layer "F.Cu") (net 5) (tstamp 41f201a5-077a-4e6d-b9fa-22663816ee76)) + (segment (start 102 78) (end 102 93) (width 0.25) (layer "F.Cu") (net 5) (tstamp 8283a78f-3f69-428e-af2b-6053869b81cf)) + (segment (start 102 93) (end 104 95) (width 0.25) (layer "F.Cu") (net 5) (tstamp a41c1f06-10ae-421b-bd1e-22812137163b)) + (segment (start 129.632 49.6769) (end 130 49.6769) (width 0.25) (layer "F.Cu") (net 5) (tstamp b6929396-1906-4ece-8339-2a8d23a3a30c)) + (segment (start 128.806 50.5031) (end 129.632 49.6769) (width 0.25) (layer "F.Cu") (net 5) (tstamp e6cff794-37ee-49df-aca6-7bdd71c560c2)) + (segment (start 128.806 66.8149) (end 128.806 50.5031) (width 0.25) (layer "F.Cu") (net 5) (tstamp ea8caf41-7d10-4847-a14e-c149b2f21d20)) + (segment (start 102.92 99) (end 102.92 96.08) (width 0.25) (layer "F.Cu") (net 5) (tstamp f5d020cf-539d-4e37-aadb-4c7d74cc412a)) + (segment (start 129.634 67.6431) (end 128.806 66.8149) (width 0.25) (layer "F.Cu") (net 5) (tstamp f966c5d6-b189-4bd3-a21e-302ddc29dac2)) + (segment (start 117.998 70) (end 123.5 70) (width 0.25) (layer "B.Cu") (net 5) (tstamp 058d0766-d157-4ad5-b887-b9cd3f82af30)) + (segment (start 89 92) (end 88.92 91.92) (width 0.25) (layer "B.Cu") (net 5) (tstamp 07080396-b88f-4386-a0a6-caa87dde2efc)) + (segment (start 123.5 70) (end 124.68 68.82) (width 0.25) (layer "B.Cu") (net 5) (tstamp 15aaa9cd-cf72-4f78-bf63-fb1b152da96a)) + (segment (start 124.68 68.82) (end 130 68.82) (width 0.25) (layer "B.Cu") (net 5) (tstamp 1d18aa60-97a4-4cd9-9c4a-9b3591c8ecf8)) + (segment (start 110.78 70.8268) (end 112.175 70.8268) (width 0.25) (layer "B.Cu") (net 5) (tstamp 34962aaf-d556-419b-870f-9d2f359584c3)) + (segment (start 114.5 73.1521) (end 112.175 70.8268) (width 0.25) (layer "B.Cu") (net 5) (tstamp 4916d75d-7cef-4d73-94cc-220130c1ba41)) + (segment (start 118.102 68.82) (end 118.102 68.462) (width 0.25) (layer "B.Cu") (net 5) (tstamp 49456390-7a5c-4ef0-b596-c664471ce557)) + (segment (start 104 76) (end 105.607 76) (width 0.25) (layer "B.Cu") (net 5) (tstamp 4f02288e-70b8-4291-a74e-8f68c5cbfb41)) + (segment (start 117.46 69.4615) (end 117.998 70) (width 0.25) (layer "B.Cu") (net 5) (tstamp 6a55b72e-2d2c-4965-ab8c-af0e3768b19a)) + (segment (start 113.54 69.4615) (end 117.46 69.4615) (width 0.25) (layer "B.Cu") (net 5) (tstamp 787f6e91-649f-4d33-805e-7e971682bb1a)) + (segment (start 105.607 76) (end 110.78 70.8268) (width 0.25) (layer "B.Cu") (net 5) (tstamp 7b4231df-9e51-4196-9138-959db39c6215)) + (segment (start 112.175 70.8268) (end 113.54 69.4615) (width 0.25) (layer "B.Cu") (net 5) (tstamp 88a9065d-e433-4aaf-b8a8-aad1ec6534bd)) + (segment (start 88.92 91.92) (end 88.92 89) (width 0.25) (layer "B.Cu") (net 5) (tstamp a1fce58b-2bbd-46ad-ba51-8dbb5af9fe25)) + (segment (start 117.46 69.4615) (end 118.102 68.82) (width 0.25) (layer "B.Cu") (net 5) (tstamp a6156602-346a-4ac7-8929-d99a806a768d)) + (segment (start 118.102 68.462) (end 118 68.36) (width 0.25) (layer "B.Cu") (net 5) (tstamp c0687df2-2f5a-4fe6-ada3-453eec4099b8)) + (segment (start 114.5 74.16) (end 114.5 73.1521) (width 0.25) (layer "B.Cu") (net 5) (tstamp c4867604-f89c-41e1-9978-e4cae7f56f8e)) + (segment (start 101 92) (end 89 92) (width 0.25) (layer "B.Cu") (net 5) (tstamp d337486f-c42b-4a1e-8216-bdb945137a4e)) + (segment (start 104 95) (end 101 92) (width 0.25) (layer "B.Cu") (net 5) (tstamp df5e4fe6-87cf-4186-a757-684990fc4e81)) + (segment (start 132.54 51.04) (end 132.54 48.5) (width 0.25) (layer "F.Cu") (net 6) (tstamp b1753268-4e23-49e0-b77c-e23b30be1c32)) + (segment (start 131.363 51.4078) (end 130.66 52.1103) (width 0.25) (layer "B.Cu") (net 6) (tstamp 035c42b6-7a67-4a0d-9144-a743c0c189ab)) + (segment (start 120.676 51) (end 119.532 49.8565) (width 0.25) (layer "B.Cu") (net 6) (tstamp 0a7e3d14-78eb-4035-9d92-67baf7528850)) + (segment (start 131.363 51.04) (end 131.363 51.4078) (width 0.25) (layer "B.Cu") (net 6) (tstamp 12603f53-0a90-4a61-9918-cce20d774bfe)) + (segment (start 99.1435 49.8565) (end 98 51) (width 0.25) (layer "B.Cu") (net 6) (tstamp 49c9d42e-1d30-4cb2-b353-460e66d88911)) + (segment (start 130.66 52.1103) (end 130.66 52.1104) (width 0.25) (layer "B.Cu") (net 6) (tstamp 51690e55-b208-4091-84f8-8a75420ca860)) + (segment (start 130.66 52.1104) (end 130.461 52.31) (width 0.25) (layer "B.Cu") (net 6) (tstamp 5638f6b0-4660-437f-bb8e-c6ae59ed9f3f)) + (segment (start 126.078 51) (end 120.676 51) (width 0.25) (layer "B.Cu") (net 6) (tstamp 5f2a8586-df24-4237-9bae-357f8c9fb1d1)) + (segment (start 127.388 52.31) (end 126.078 51) (width 0.25) (layer "B.Cu") (net 6) (tstamp 8faff738-7e3c-4904-ab14-b2a981ad959f)) + (segment (start 130.66 52.1103) (end 130.54 52.2306) (width 0.25) (layer "B.Cu") (net 6) (tstamp 97d65620-99c4-4614-88b8-25338d37b24a)) + (segment (start 132.54 51.04) (end 131.363 51.04) (width 0.25) (layer "B.Cu") (net 6) (tstamp c72f8da5-1fe6-4e24-8d3b-f73274a97617)) + (segment (start 130.461 52.31) (end 127.388 52.31) (width 0.25) (layer "B.Cu") (net 6) (tstamp c94ea24a-6af7-4ba9-bb1a-f656f44a7e2a)) + (segment (start 120.5 51) (end 120.676 51) (width 0.25) (layer "B.Cu") (net 6) (tstamp d38701b0-5e36-4788-9d9c-741589dcf2e4)) + (segment (start 119.532 49.8565) (end 99.1435 49.8565) (width 0.25) (layer "B.Cu") (net 6) (tstamp db89cdd6-1624-4492-9a4e-ce78495eaed0)) + (segment (start 130 58.66) (end 130 59.2484) (width 0.25) (layer "F.Cu") (net 9) (tstamp 072a6e73-fd5c-4f0e-883e-14b28a88ee18)) + (segment (start 107 84.2914) (end 107 83.16) (width 0.25) (layer "B.Cu") (net 9) (tstamp 0de07b54-1336-486f-a1bf-6dd6cc9b8814)) + (segment (start 111 89) (end 111 83.08) (width 0.25) (layer "B.Cu") (net 9) (tstamp 16458e6e-63ce-4b4a-baf7-8b90771d092f)) + (segment (start 128.823 58.66) (end 128.504 58.3409) (width 0.25) (layer "B.Cu") (net 9) (tstamp 1e31eb01-291d-4b9f-ae95-9c9928fe02cf)) + (segment (start 128.423 96.36) (end 120.9 96.36) (width 0.25) (layer "B.Cu") (net 9) (tstamp 23df3904-ee75-4c6f-8f5e-9addc3b06356)) + (segment (start 130 58.66) (end 128.823 58.66) (width 0.25) (layer "B.Cu") (net 9) (tstamp 4f4e95f4-49f2-4820-8584-59a5449dc3f7)) + (segment (start 128.823 96.76) (end 128.423 96.36) (width 0.25) (layer "B.Cu") (net 9) (tstamp 611a1bb5-9248-42fd-83c7-8632027677cc)) + (segment (start 128.823 78.98) (end 130 78.98) (width 0.25) (layer "B.Cu") (net 9) (tstamp 70f48851-e60b-49ec-8f79-168bd8cda84f)) + (segment (start 104.291 87) (end 107 84.2914) (width 0.25) (layer "B.Cu") (net 9) (tstamp 7515a736-0bb1-4f1c-b7e2-edc896e9ae4f)) + (segment (start 130 96.76) (end 128.823 96.76) (width 0.25) (layer "B.Cu") (net 9) (tstamp 7b1dd970-e272-4ab8-86f4-1853775f1c94)) + (segment (start 87.46 87) (end 104.291 87) (width 0.25) (layer "B.Cu") (net 9) (tstamp 7d7d32c4-c260-468d-a376-da221ffa7905)) + (segment (start 128.504 58.3409) (end 121.228 58.3409) (width 0.25) (layer "B.Cu") (net 9) (tstamp 99c2680e-e095-4908-9809-3eea0b1387bb)) + (segment (start 111 83) (end 111 83.08) (width 0.25) (layer "B.Cu") (net 9) (tstamp c345cee1-3767-4b86-98ef-c670bb33d755)) + (segment (start 128.263 78.42) (end 128.823 78.98) (width 0.25) (layer "B.Cu") (net 9) (tstamp e231b4cd-02ce-460e-81ba-76e6807ae11b)) + (segment (start 121.363 78.42) (end 128.263 78.42) (width 0.25) (layer "B.Cu") (net 9) (tstamp e841e63b-e83c-4e2c-94e3-ad38ec8fbc35)) + (segment (start 84 90.46) (end 87.46 87) (width 0.25) (layer "B.Cu") (net 9) (tstamp f23648c9-4191-4678-9384-573583dfeabd)) + (segment (start 109.182 95.182) (end 121.818 95.182) (width 0.25) (layer "F.Cu") (net 11) (tstamp 52d8b18a-0fd9-42bc-b131-8bf98d018cf9)) + (segment (start 121.818 95.182) (end 128.6354 88.3646) (width 0.25) (layer "F.Cu") (net 11) (tstamp 7f8f4772-58cd-4cdc-8719-03ea9f593990)) + (segment (start 128.6354 88.3646) (end 128.6354 83.6957) (width 0.25) (layer "F.Cu") (net 11) (tstamp 8d13660c-6bb6-4865-bceb-249c51395787)) + (segment (start 104 84.84) (end 104 90) (width 0.25) (layer "F.Cu") (net 11) (tstamp 8d78deb1-ddbc-4546-9d6c-6ab8f3e28e49)) + (segment (start 129.6342 82.6969) (end 130 82.6969) (width 0.25) (layer "F.Cu") (net 11) (tstamp 94a58151-ce41-4036-96ce-db99376007e5)) + (segment (start 128.6354 83.6957) (end 129.6342 82.6969) (width 0.25) (layer "F.Cu") (net 11) (tstamp a2993b73-7dd7-485c-a4ca-695ce3bcec99)) + (segment (start 104 90) (end 109.182 95.182) (width 0.25) (layer "F.Cu") (net 11) (tstamp a48d37be-e463-4854-98fa-8e301de17caa)) + (segment (start 130 82.6969) (end 130 81.52) (width 0.25) (layer "F.Cu") (net 11) (tstamp d39949ad-ae14-4db6-99fe-7c72ab9dfebe)) + (segment (start 93.92 82) (end 93.92 81) (width 0.25) (layer "B.Cu") (net 11) (tstamp 321ce515-c543-48eb-ae92-ced308d0c51c)) + (segment (start 94.16 84.84) (end 93.42 84.1) (width 0.25) (layer "B.Cu") (net 11) (tstamp 4af5e233-c99e-482f-8f06-439a6db036d4)) + (segment (start 93.42 84.1) (end 93.42 81.5) (width 0.25) (layer "B.Cu") (net 11) (tstamp 67175e71-3c4b-47f6-b16d-02705d983bbf)) + (segment (start 104 84.84) (end 94.16 84.84) (width 0.25) (layer "B.Cu") (net 11) (tstamp b9fd3e0c-2be9-457c-a611-354af1218bee)) + (segment (start 93.92 81) (end 93.42 81.5) (width 0.25) (layer "B.Cu") (net 11) (tstamp d8463a83-e3b8-4ab6-af76-4e04595ac608)) + (segment (start 131.27 65.8108) (end 131.27 79.4389) (width 0.25) (layer "B.Cu") (net 26) (tstamp 0309c7e5-6850-4c4e-881d-483e38f3b65c)) + (segment (start 114.8665 60) (end 111.403 60) (width 0.25) (layer "B.Cu") (net 26) (tstamp 36746830-e933-4902-a36d-c4603000e8ee)) + (segment (start 111.403 60) (end 95.403 76) (width 0.25) (layer "B.Cu") (net 26) (tstamp 376545e8-a727-4796-8a97-9698ec6e4bbb)) + (segment (start 95.403 76) (end 93.84 76) (width 0.25) (layer "B.Cu") (net 26) (tstamp 45593f94-367a-45f6-ab5b-8edcf0fc6822)) + (segment (start 117.96 60) (end 114.8665 60) (width 0.25) (layer "B.Cu") (net 26) (tstamp 53a10622-f0eb-40a0-86b3-3bdd45b8738f)) + (segment (start 119.8765 65.01) (end 130.4692 65.01) (width 0.25) (layer "B.Cu") (net 26) (tstamp 7e8d22e4-ecea-4056-82c3-5399eb589862)) + (segment (start 130.4692 65.01) (end 131.27 65.8108) (width 0.25) (layer "B.Cu") (net 26) (tstamp 8ff80aef-ec85-414d-a1ec-5720455a7b87)) + (segment (start 132.54 81.52) (end 132.54 80.3431) (width 0.25) (layer "B.Cu") (net 26) (tstamp bef4b6c2-0692-4720-8b2b-2d37d2568178)) + (segment (start 114.8665 60) (end 119.8765 65.01) (width 0.25) (layer "B.Cu") (net 26) (tstamp f15af1b0-680a-46a7-970b-4211c41f82ee)) + (segment (start 131.27 79.4389) (end 132.1742 80.3431) (width 0.25) (layer "B.Cu") (net 26) (tstamp f5b6afeb-43c2-4ff0-b1d4-e7ee754758c0)) + (segment (start 132.1742 80.3431) (end 132.54 80.3431) (width 0.25) (layer "B.Cu") (net 26) (tstamp fa4a1282-9fb1-4027-8455-ef9d6ef1dbef)) + (segment (start 101 94) (end 99 96) (width 0.25) (layer "F.Cu") (net 36) (tstamp 1396e1eb-3f18-48ed-bf7c-445681cc74b5)) + (segment (start 98.08 55) (end 99.6748 56.5948) (width 0.25) (layer "F.Cu") (net 36) (tstamp 15115f24-c0b7-48b5-8b69-070281928f53)) + (segment (start 101 87) (end 101 94) (width 0.25) (layer "F.Cu") (net 36) (tstamp d18451fa-c220-44eb-ae78-97509a4d279b)) + (segment (start 99.6748 85.6748) (end 101 87) (width 0.25) (layer "F.Cu") (net 36) (tstamp dce1b756-e351-4d0c-9167-a53a12649425)) + (segment (start 99.6748 56.5948) (end 99.6748 85.6748) (width 0.25) (layer "F.Cu") (net 36) (tstamp f2a58050-4d4c-4008-a88b-c5367d1301fb)) + (segment (start 99.1973 96.1973) (end 107.303 96.1973) (width 0.25) (layer "B.Cu") (net 36) (tstamp 0d277be7-bf11-42ad-9748-77aa1a5158ee)) + (segment (start 117.73 85.77) (end 117.73 81) (width 0.25) (layer "B.Cu") (net 36) (tstamp 36bd6859-5e69-45bc-9f65-b4a76a4b4ba9)) + (segment (start 85.1769 93) (end 85.1784 93.0015) (width 0.25) (layer "B.Cu") (net 36) (tstamp 484df566-336d-4b5f-ab0d-8cdfd6451894)) + (segment (start 96.0015 93.0015) (end 99 96) (width 0.25) (layer "B.Cu") (net 36) (tstamp 75f30d3b-526e-435e-8baa-4cbd67c76684)) + (segment (start 99 96) (end 99.1973 96.1973) (width 0.25) (layer "B.Cu") (net 36) (tstamp 80b7110c-155d-45d5-8edd-34ced3e51672)) + (segment (start 85.1784 93.0015) (end 96.0015 93.0015) (width 0.25) (layer "B.Cu") (net 36) (tstamp 9799c6d4-e2d2-4928-ae63-39bd4d323a4d)) + (segment (start 84 93) (end 85.1769 93) (width 0.25) (layer "B.Cu") (net 36) (tstamp c1b15869-6dc8-4a9c-a91a-9f0df6f98a04)) + (segment (start 107.303 96.1973) (end 117.73 85.77) (width 0.25) (layer "B.Cu") (net 36) (tstamp ef643056-219a-417d-bfcd-93311160049a)) + (segment (start 88.84 96) (end 87.7131 96) (width 0.25) (layer "B.Cu") (net 37) (tstamp 84fad0ff-2996-4166-aa19-a81c56ca0730)) + (segment (start 87.7131 96) (end 87.2531 95.54) (width 0.25) (layer "B.Cu") (net 37) (tstamp 95a72369-79b4-4982-b905-18168dad7e88)) + (segment (start 87.2531 95.54) (end 84 95.54) (width 0.25) (layer "B.Cu") (net 37) (tstamp e6dc2311-9fdd-42c9-a1ed-c83399bc910a)) + (segment (start 113.08 51) (end 117.96 51) (width 0.25) (layer "B.Cu") (net 38) (tstamp 2315076a-6424-4268-9210-2b9349aaa627)) + (segment (start 87.84 51) (end 87.84 52.1269) (width 0.25) (layer "F.Cu") (net 39) (tstamp 32325514-a1ce-428c-ad09-6d0d06612c54)) + (segment (start 87.84 52.1269) (end 87.92 52.2069) (width 0.25) (layer "F.Cu") (net 39) (tstamp 9f9cb85b-020f-4cd9-bd0b-f6daebdc76de)) + (segment (start 87.92 52.2069) (end 87.92 55) (width 0.25) (layer "F.Cu") (net 39) (tstamp f3d043f2-49db-4969-b025-3101e90dc085)) + (segment (start 119.23 52.0769) (end 119.165 52.1419) (width 0.25) (layer "B.Cu") (net 39) (tstamp 0f3fedad-4133-4eb2-977c-99a45469dcff)) + (segment (start 119.165 52.1419) (end 90.1088 52.1419) (width 0.25) (layer "B.Cu") (net 39) (tstamp 17306139-5112-4828-af17-8da041fe3d28)) + (segment (start 90.1088 52.1419) (end 88.9669 51) (width 0.25) (layer "B.Cu") (net 39) (tstamp 42ae41d2-ab59-47ca-b873-492679f9c376)) + (segment (start 88.9669 51) (end 87.84 51) (width 0.25) (layer "B.Cu") (net 39) (tstamp 6beec8d2-a6c9-4ce8-9f77-55b891fbd23c)) + (segment (start 119.23 51) (end 119.23 52.0769) (width 0.25) (layer "B.Cu") (net 39) (tstamp d93d823c-b52b-4858-b166-b92b7a1f916d)) + (segment (start 120.659 68.7623) (end 120.54 68.6433) (width 0.25) (layer "F.Cu") (net 40) (tstamp 358f4d08-901e-4fbe-ac5d-6f5f66f987dd)) + (segment (start 120.54 74.96) (end 119 76.5) (width 0.25) (layer "F.Cu") (net 40) (tstamp 4546d7f3-bfb4-412c-a9f5-833da21fb079)) + (segment (start 108.343 58.4731) (end 107 59.8161) (width 0.25) (layer "F.Cu") (net 40) (tstamp 4e38bfae-5936-4fd2-82aa-343d47b8a7fe)) + (segment (start 115.627 62.8732) (end 116.798 61.7022) (width 0.25) (layer "F.Cu") (net 40) (tstamp 6a1c199e-d7ed-455d-937f-eaea7e451933)) + (segment (start 107 59.8161) (end 107 73) (width 0.25) (layer "F.Cu") (net 40) (tstamp 6b0624b3-28e5-49c4-bf7c-1cbf6c2d9b75)) + (segment (start 119 76.5) (end 119 81) (width 0.25) (layer "F.Cu") (net 40) (tstamp 787580c0-c0a0-4c65-aaf4-d49dacd95e22)) + (segment (start 120.54 68.6433) (end 120.54 68.36) (width 0.25) (layer "F.Cu") (net 40) (tstamp 83dd1d74-35ce-43a9-be11-c96dfa0d1221)) + (segment (start 113.569 58.4731) (end 108.343 58.4731) (width 0.25) (layer "F.Cu") (net 40) (tstamp 859b5e6e-2677-4ab4-8320-56b2365a1b0b)) + (segment (start 115.627 64) (end 115.627 62.8732) (width 0.25) (layer "F.Cu") (net 40) (tstamp 87f8cf12-a184-4a57-bd06-f03f38b9595f)) + (segment (start 120.659 65.5634) (end 116.798 61.7022) (width 0.25) (layer "F.Cu") (net 40) (tstamp 97677773-904a-45a3-976a-08254870ac84)) + (segment (start 120.659 68.7623) (end 120.659 71.9613) (width 0.25) (layer "F.Cu") (net 40) (tstamp a655e14a-d55b-4159-84de-1efb1e18b6d8)) + (segment (start 116.798 61.7022) (end 113.569 58.4731) (width 0.25) (layer "F.Cu") (net 40) (tstamp c1530938-c8cd-4896-a103-8091555a4920)) + (segment (start 120.54 72.0804) (end 120.54 74.96) (width 0.25) (layer "F.Cu") (net 40) (tstamp c6fbe2f1-036f-4f8c-be4f-7f6618052f54)) + (segment (start 120.659 68.7623) (end 120.659 65.5634) (width 0.25) (layer "F.Cu") (net 40) (tstamp e830e75c-e9f1-4202-a8a7-fb6a00c8eadb)) + (segment (start 120.659 71.9613) (end 120.54 72.0804) (width 0.25) (layer "F.Cu") (net 40) (tstamp eb565370-5e0b-4b40-a5da-bb80646c535f)) + (segment (start 114.5 64) (end 115.627 64) (width 0.25) (layer "F.Cu") (net 40) (tstamp fc65c88f-6d1d-41c5-bf46-69b3f878f12e)) + (segment (start 107 72.4487) (end 107 73) (width 0.25) (layer "B.Cu") (net 40) (tstamp 52a6ab16-f781-43bf-b4f8-129b2876eb28)) + (segment (start 119.27 68.36) (end 119.27 67.2831) (width 0.25) (layer "B.Cu") (net 41) (tstamp 0505d570-f5dc-494d-93f2-026cc623ca4a)) + (segment (start 119.27 67.2831) (end 111.104 67.2831) (width 0.25) (layer "B.Cu") (net 41) (tstamp 24bd6d47-6f4e-4eb9-b57d-02085ca668c4)) + (segment (start 111.104 67.2831) (end 102.824 75.5627) (width 0.25) (layer "B.Cu") (net 41) (tstamp 4514f89a-2317-4eda-ab20-c493365dbcc4)) + (segment (start 102.824 75.5627) (end 102.824 77.192) (width 0.25) (layer "B.Cu") (net 41) (tstamp 475f8150-5653-40a9-99dc-e83991cf95b1)) + (segment (start 108.46 88.1125) (end 108.46 89) (width 0.25) (layer "B.Cu") (net 41) (tstamp 4c06ad8a-5527-4ac8-ab21-a758f5538bfc)) + (segment (start 101.094 88.1125) (end 108.46 88.1125) (width 0.25) (layer "B.Cu") (net 41) (tstamp 8927fb9f-3f03-4307-931f-a18e49b908c8)) + (segment (start 102.824 77.192) (end 108.46 82.828) (width 0.25) (layer "B.Cu") (net 41) (tstamp 8a640845-080b-45b5-9082-880a850ac8a1)) + (segment (start 108.46 82.828) (end 108.46 88.1125) (width 0.25) (layer "B.Cu") (net 41) (tstamp 8f7ac55a-9151-42be-8d1b-066ba6d5b159)) + (segment (start 100.207 89) (end 101.094 88.1125) (width 0.25) (layer "B.Cu") (net 41) (tstamp bb135795-7797-46f6-a576-83905996a5d0)) + (segment (start 99.08 89) (end 100.207 89) (width 0.25) (layer "B.Cu") (net 41) (tstamp d8abfd79-84ec-49b1-82ea-95cca67077d1)) + (segment (start 104.932 83.1269) (end 104.08 83.1269) (width 0.25) (layer "F.Cu") (net 42) (tstamp 2e2cb8ff-3726-46d9-bf2a-194940002256)) + (segment (start 104.08 82.5634) (end 104.08 82) (width 0.25) (layer "F.Cu") (net 42) (tstamp 40ab708b-c617-4a2f-a221-e786f984c528)) + (segment (start 108.805 87) (end 104.932 83.1269) (width 0.25) (layer "F.Cu") (net 42) (tstamp 66fafe1e-1a86-4f2b-be54-7c75d549621d)) + (segment (start 104.08 82.5634) (end 103.58 82.0634) (width 0.25) (layer "F.Cu") (net 42) (tstamp 6b62a823-346a-4a58-842c-eb27215d1909)) + (segment (start 109.73 89) (end 109.73 87) (width 0.25) (layer "F.Cu") (net 42) (tstamp 81830828-75a0-42a6-b54e-8d4bc380c068)) + (segment (start 104.08 83.1269) (end 104.08 82.5634) (width 0.25) (layer "F.Cu") (net 42) (tstamp a2cbe440-f74a-41ab-af4f-4abb087ddc7b)) + (segment (start 109.73 87) (end 108.805 87) (width 0.25) (layer "F.Cu") (net 42) (tstamp ad3f71c9-dfb0-4177-831f-dc3fb4b3ccc9)) + (segment (start 103.58 82.0634) (end 103.58 81.5) (width 0.25) (layer "F.Cu") (net 42) (tstamp ef407493-1d26-43f8-97b2-72537c984257)) + + (zone (net 9) (net_name "GND") (layer "B.Cu") (tstamp 0439734c-1f86-4b67-9c14-36cdfe2e2799) (name "GND") (hatch edge 0.5) + (connect_pads (clearance 0.5)) + (min_thickness 0.25) (filled_areas_thickness no) + (fill yes (thermal_gap 0.5) (thermal_bridge_width 0.5)) + (polygon + (pts + (xy 82.044 47.008) + (xy 134.544 47.008) + (xy 134.5 99.5) + (xy 87 99) + (xy 87.044 84.008) + (xy 82.044 84.008) + ) + ) + (filled_polygon + (layer "B.Cu") + (pts + (xy 128.866918 47.027685) + (xy 128.912673 47.080489) + (xy 128.922617 47.149647) + (xy 128.893592 47.213203) + (xy 128.874193 47.231263) + (xy 128.792454 47.292454) + (xy 128.792453 47.292455) + (xy 128.792452 47.292456) + (xy 128.706206 47.407664) + (xy 128.706202 47.407671) + (xy 128.655908 47.542517) + (xy 128.649501 47.602116) + (xy 128.6495 47.602135) + (xy 128.6495 49.39787) + (xy 128.649501 49.397876) + (xy 128.655908 49.457483) + (xy 128.706202 49.592328) + (xy 128.706206 49.592335) + (xy 128.792452 49.707544) + (xy 128.792455 49.707547) + (xy 128.907664 49.793793) + (xy 128.907671 49.793797) + (xy 129.039081 49.84281) + (xy 129.095015 49.884681) + (xy 129.119432 49.950145) + (xy 129.10458 50.018418) + (xy 129.08343 50.046673) + (xy 128.961503 50.1686) + (xy 128.825965 50.362169) + (xy 128.825964 50.362171) + (xy 128.726098 50.576335) + (xy 128.726094 50.576344) + (xy 128.664938 50.804586) + (xy 128.664936 50.804596) + (xy 128.644341 51.039999) + (xy 128.644341 51.04) + (xy 128.664936 51.275403) + (xy 128.664938 51.275413) + (xy 128.726094 51.503655) + (xy 128.726099 51.503669) + (xy 128.728163 51.508094) + (xy 128.738656 51.577171) + (xy 128.710137 51.640955) + (xy 128.651661 51.679196) + (xy 128.615782 51.6845) + (xy 127.698452 51.6845) + (xy 127.631413 51.664815) + (xy 127.610771 51.648181) + (xy 126.578803 50.616212) + (xy 126.56898 50.60395) + (xy 126.568759 50.604134) + (xy 126.563786 50.598123) + (xy 126.540594 50.576344) + (xy 126.513364 50.550773) + (xy 126.502919 50.540328) + (xy 126.492475 50.529883) + (xy 126.486986 50.525625) + (xy 126.482561 50.521847) + (xy 126.448582 50.489938) + (xy 126.44858 50.489936) + (xy 126.448577 50.489935) + (xy 126.431029 50.480288) + (xy 126.414763 50.469604) + (xy 126.398933 50.457325) + (xy 126.356168 50.438818) + (xy 126.350922 50.436248) + (xy 126.310093 50.413803) + (xy 126.310092 50.413802) + (xy 126.290693 50.408822) + (xy 126.272281 50.402518) + (xy 126.253898 50.394562) + (xy 126.253892 50.39456) + (xy 126.207874 50.387272) + (xy 126.202152 50.386087) + (xy 126.157021 50.3745) + (xy 126.157019 50.3745) + (xy 126.136984 50.3745) + (xy 126.117586 50.372973) + (xy 126.110162 50.371797) + (xy 126.097805 50.36984) + (xy 126.097804 50.36984) + (xy 126.051416 50.374225) + (xy 126.045578 50.3745) + (xy 121.523054 50.3745) + (xy 121.456015 50.354815) + (xy 121.413696 50.308953) + (xy 121.356801 50.202511) + (xy 121.356799 50.202509) + (xy 121.356798 50.202506) + (xy 121.317824 50.155016) + (xy 121.228647 50.046352) + (xy 121.072495 49.918203) + (xy 121.072488 49.918198) + (xy 120.894345 49.822978) + (xy 120.701031 49.764337) + (xy 120.521962 49.746701) + (xy 120.5 49.744538) + (xy 120.499999 49.744538) + (xy 120.380631 49.756294) + (xy 120.311985 49.743275) + (xy 120.280816 49.720591) + (xy 120.032777 49.47266) + (xy 120.022989 49.460444) + (xy 120.02276 49.460634) + (xy 120.017789 49.454625) + (xy 119.967316 49.407228) + (xy 119.946369 49.386289) + (xy 119.943506 49.38407) + (xy 119.940943 49.382082) + (xy 119.936494 49.378283) + (xy 119.902583 49.346439) + (xy 119.902584 49.346439) + (xy 119.884949 49.336744) + (xy 119.86871 49.326079) + (xy 119.852819 49.313758) + (xy 119.810117 49.295289) + (xy 119.80486 49.292714) + (xy 119.764092 49.270303) + (xy 119.764089 49.270302) + (xy 119.744606 49.265299) + (xy 119.726231 49.25901) + (xy 119.707762 49.251023) + (xy 119.661809 49.243755) + (xy 119.656074 49.242568) + (xy 119.64075 49.238633) + (xy 119.611019 49.231) + (xy 119.611017 49.231) + (xy 119.590902 49.231) + (xy 119.571534 49.229478) + (xy 119.551669 49.226336) + (xy 119.55166 49.226336) + (xy 119.505362 49.230723) + (xy 119.49951 49.231) + (xy 99.226237 49.231) + (xy 99.21062 49.229276) + (xy 99.210593 49.229562) + (xy 99.202831 49.228827) + (xy 99.133703 49.231) + (xy 99.10415 49.231) + (xy 99.103429 49.23109) + (xy 99.097257 49.231869) + (xy 99.091445 49.232326) + (xy 99.044873 49.23379) + (xy 99.044872 49.23379) + (xy 99.025629 49.239381) + (xy 99.006579 49.243325) + (xy 98.986711 49.245834) + (xy 98.986709 49.245835) + (xy 98.943384 49.262988) + (xy 98.937857 49.26488) + (xy 98.89311 49.277881) + (xy 98.893109 49.277882) + (xy 98.875867 49.288079) + (xy 98.858399 49.296637) + (xy 98.839769 49.304013) + (xy 98.839767 49.304014) + (xy 98.802076 49.331398) + (xy 98.797194 49.334605) + (xy 98.757079 49.35833) + (xy 98.742908 49.3725) + (xy 98.728123 49.385128) + (xy 98.713963 49.395417) + (xy 98.711912 49.396907) + (xy 98.682209 49.43281) + (xy 98.678277 49.437131) + (xy 98.414821 49.700586) + (xy 98.353498 49.734071) + (xy 98.295048 49.73268) + (xy 98.226697 49.714366) + (xy 98.226693 49.714365) + (xy 98.226692 49.714365) + (xy 98.113346 49.704448) + (xy 98.000001 49.694532) + (xy 97.999998 49.694532) + (xy 97.773313 49.714364) + (xy 97.773302 49.714366) + (xy 97.553511 49.773258) + (xy 97.553502 49.773261) + (xy 97.347267 49.869431) + (xy 97.347265 49.869432) + (xy 97.160858 49.999954) + (xy 96.999954 50.160858) + (xy 96.869432 50.347265) + (xy 96.869431 50.347267) + (xy 96.773261 50.553502) + (xy 96.773258 50.553511) + (xy 96.714366 50.773302) + (xy 96.714364 50.773313) + (xy 96.694532 50.999998) + (xy 96.694532 51.000001) + (xy 96.714364 51.226686) + (xy 96.714366 51.226696) + (xy 96.750167 51.360307) + (xy 96.748504 51.430156) + (xy 96.709341 51.488019) + (xy 96.645113 51.515523) + (xy 96.630392 51.5164) + (xy 90.419253 51.5164) + (xy 90.352214 51.496715) + (xy 90.331572 51.480081) + (xy 89.467703 50.616212) + (xy 89.45788 50.60395) + (xy 89.457659 50.604134) + (xy 89.452686 50.598123) + (xy 89.429494 50.576344) + (xy 89.402264 50.550773) + (xy 89.391819 50.540328) + (xy 89.381375 50.529883) + (xy 89.375886 50.525625) + (xy 89.371461 50.521847) + (xy 89.337482 50.489938) + (xy 89.33748 50.489936) + (xy 89.337477 50.489935) + (xy 89.319929 50.480288) + (xy 89.303663 50.469604) + (xy 89.287833 50.457325) + (xy 89.245068 50.438818) + (xy 89.239822 50.436248) + (xy 89.198993 50.413803) + (xy 89.198992 50.413802) + (xy 89.179593 50.408822) + (xy 89.161181 50.402518) + (xy 89.142798 50.394562) + (xy 89.142792 50.39456) + (xy 89.096774 50.387272) + (xy 89.091052 50.386087) + (xy 89.045915 50.374499) + (xy 89.038689 50.373586) + (xy 88.974646 50.345653) + (xy 88.952659 50.321689) + (xy 88.840047 50.160861) + (xy 88.840045 50.160858) + (xy 88.679141 49.999954) + (xy 88.492734 49.869432) + (xy 88.492732 49.869431) + (xy 88.286497 49.773261) + (xy 88.286488 49.773258) + (xy 88.066697 49.714366) + (xy 88.066693 49.714365) + (xy 88.066692 49.714365) + (xy 88.066691 49.714364) + (xy 88.066686 49.714364) + (xy 87.840002 49.694532) + (xy 87.839998 49.694532) + (xy 87.613313 49.714364) + (xy 87.613302 49.714366) + (xy 87.393511 49.773258) + (xy 87.393502 49.773261) + (xy 87.187267 49.869431) + (xy 87.187265 49.869432) + (xy 87.000858 49.999954) + (xy 86.839954 50.160858) + (xy 86.709432 50.347265) + (xy 86.709431 50.347267) + (xy 86.613261 50.553502) + (xy 86.613258 50.553511) + (xy 86.554366 50.773302) + (xy 86.554364 50.773313) + (xy 86.534532 50.999998) + (xy 86.534532 51.000001) + (xy 86.554364 51.226686) + (xy 86.554366 51.226697) + (xy 86.613258 51.446488) + (xy 86.613261 51.446497) + (xy 86.709431 51.652732) + (xy 86.709432 51.652734) + (xy 86.839954 51.839141) + (xy 87.000858 52.000045) + (xy 87.000861 52.000047) + (xy 87.187266 52.130568) + (xy 87.393504 52.226739) + (xy 87.613308 52.285635) + (xy 87.77523 52.299801) + (xy 87.839998 52.305468) + (xy 87.84 52.305468) + (xy 87.840002 52.305468) + (xy 87.896673 52.300509) + (xy 88.066692 52.285635) + (xy 88.286496 52.226739) + (xy 88.492734 52.130568) + (xy 88.679139 52.000047) + (xy 88.793068 51.886117) + (xy 88.854389 51.852634) + (xy 88.924081 51.857618) + (xy 88.968428 51.886118) + (xy 89.291039 52.20873) + (xy 89.607997 52.525688) + (xy 89.617822 52.537951) + (xy 89.618043 52.537769) + (xy 89.623014 52.543778) + (xy 89.643143 52.56268) + (xy 89.673435 52.591126) + (xy 89.694329 52.61202) + (xy 89.699811 52.616273) + (xy 89.704243 52.620057) + (xy 89.738218 52.651962) + (xy 89.755776 52.661614) + (xy 89.772035 52.672295) + (xy 89.787864 52.684573) + (xy 89.830638 52.703082) + (xy 89.835856 52.705638) + (xy 89.876708 52.728097) + (xy 89.896116 52.73308) + (xy 89.914517 52.73938) + (xy 89.932904 52.747337) + (xy 89.976288 52.754208) + (xy 89.978919 52.754625) + (xy 89.984639 52.755809) + (xy 90.029781 52.7674) + (xy 90.049816 52.7674) + (xy 90.069214 52.768926) + (xy 90.088994 52.772059) + (xy 90.088995 52.77206) + (xy 90.088995 52.772059) + (xy 90.088996 52.77206) + (xy 90.135384 52.767675) + (xy 90.141222 52.7674) + (xy 119.082257 52.7674) + (xy 119.097877 52.769124) + (xy 119.097904 52.768839) + (xy 119.10566 52.769571) + (xy 119.105667 52.769573) + (xy 119.174814 52.7674) + (xy 119.20435 52.7674) + (xy 119.211228 52.76653) + (xy 119.217041 52.766072) + (xy 119.263627 52.764609) + (xy 119.282869 52.759017) + (xy 119.301912 52.755074) + (xy 119.321792 52.752564) + (xy 119.365122 52.735407) + (xy 119.370646 52.733517) + (xy 119.374396 52.732427) + (xy 119.41539 52.720518) + (xy 119.432629 52.710322) + (xy 119.450103 52.701762) + (xy 119.468729 52.694387) + (xy 119.468728 52.694387) + (xy 119.468732 52.694386) + (xy 119.506439 52.666989) + (xy 119.511305 52.663792) + (xy 119.55142 52.64007) + (xy 119.565583 52.625907) + (xy 119.580371 52.613275) + (xy 119.596587 52.601494) + (xy 119.614311 52.580067) + (xy 119.630831 52.56355) + (xy 119.631867 52.562692) + (xy 119.631877 52.562686) + (xy 119.679228 52.512262) + (xy 119.70012 52.491371) + (xy 119.704379 52.485878) + (xy 119.708152 52.481461) + (xy 119.740062 52.447482) + (xy 119.749715 52.42992) + (xy 119.760389 52.41367) + (xy 119.772673 52.397836) + (xy 119.79118 52.355067) + (xy 119.793749 52.349824) + (xy 119.816196 52.308993) + (xy 119.816197 52.308992) + (xy 119.821177 52.289591) + (xy 119.827478 52.271188) + (xy 119.835438 52.252796) + (xy 119.840335 52.221872) + (xy 119.870261 52.15874) + (xy 119.929571 52.121806) + (xy 119.999434 52.122801) + (xy 120.021255 52.131908) + (xy 120.105659 52.177023) + (xy 120.298967 52.235662) + (xy 120.5 52.255462) + (xy 120.701033 52.235662) + (xy 120.894341 52.177023) + (xy 121.072494 52.081798) + (xy 121.228647 51.953647) + (xy 121.356798 51.797494) + (xy 121.369611 51.773521) + (xy 121.413696 51.691047) + (xy 121.462658 51.641203) + (xy 121.523054 51.6255) + (xy 125.767548 51.6255) + (xy 125.834587 51.645185) + (xy 125.855229 51.661819) + (xy 126.887194 52.693784) + (xy 126.897019 52.706048) + (xy 126.89724 52.705866) + (xy 126.90221 52.711873) + (xy 126.902213 52.711876) + (xy 126.902214 52.711877) + (xy 126.952651 52.759241) + (xy 126.97353 52.78012) + (xy 126.979004 52.784366) + (xy 126.983442 52.788156) + (xy 127.017418 52.820062) + (xy 127.017422 52.820064) + (xy 127.034973 52.829713) + (xy 127.051231 52.840392) + (xy 127.067064 52.852674) + (xy 127.089015 52.862172) + (xy 127.109837 52.871183) + (xy 127.115081 52.873752) + (xy 127.155908 52.896197) + (xy 127.175312 52.901179) + (xy 127.19371 52.907478) + (xy 127.212105 52.915438) + (xy 127.258129 52.922726) + (xy 127.263832 52.923907) + (xy 127.308981 52.9355) + (xy 127.329016 52.9355) + (xy 127.348413 52.937026) + (xy 127.368196 52.94016) + (xy 127.414584 52.935775) + (xy 127.420422 52.9355) + (xy 128.615782 52.9355) + (xy 128.682821 52.955185) + (xy 128.728576 53.007989) + (xy 128.73852 53.077147) + (xy 128.728163 53.111906) + (xy 128.726099 53.11633) + (xy 128.726094 53.116344) + (xy 128.664938 53.344586) + (xy 128.664936 53.344596) + (xy 128.644341 53.579999) + (xy 128.644341 53.58) + (xy 128.664936 53.815403) + (xy 128.664938 53.815413) + (xy 128.726094 54.043655) + (xy 128.726096 54.043659) + (xy 128.726097 54.043663) + (xy 128.809155 54.221781) + (xy 128.825965 54.25783) + (xy 128.825967 54.257834) + (xy 128.934281 54.412521) + (xy 128.961501 54.451396) + (xy 128.961506 54.451402) + (xy 129.128597 54.618493) + (xy 129.128603 54.618498) + (xy 129.314158 54.748425) + (xy 129.357783 54.803002) + (xy 129.364977 54.8725) + (xy 129.333454 54.934855) + (xy 129.314158 54.951575) + (xy 129.128597 55.081505) + (xy 128.961505 55.248597) + (xy 128.825965 55.442169) + (xy 128.825964 55.442171) + (xy 128.726098 55.656335) + (xy 128.726094 55.656344) + (xy 128.664938 55.884586) + (xy 128.664936 55.884596) + (xy 128.644341 56.119999) + (xy 128.644341 56.12) + (xy 128.664936 56.355403) + (xy 128.664938 56.355413) + (xy 128.726094 56.583655) + (xy 128.726096 56.583659) + (xy 128.726097 56.583663) + (xy 128.73 56.592032) + (xy 128.825965 56.79783) + (xy 128.825967 56.797834) + (xy 128.934281 56.952521) + (xy 128.961501 56.991396) + (xy 128.961506 56.991402) + (xy 129.128597 57.158493) + (xy 129.128603 57.158498) + (xy 129.314594 57.28873) + (xy 129.358219 57.343307) + (xy 129.365413 57.412805) + (xy 129.33389 57.47516) + (xy 129.314595 57.49188) + (xy 129.128922 57.62189) + (xy 129.12892 57.621891) + (xy 128.961891 57.78892) + (xy 128.961886 57.788926) + (xy 128.8264 57.98242) + (xy 128.826399 57.982422) + (xy 128.72657 58.196507) + (xy 128.726567 58.196513) + (xy 128.669364 58.409999) + (xy 128.669364 58.41) + (xy 129.566314 58.41) + (xy 129.540507 58.450156) + (xy 129.5 58.588111) + (xy 129.5 58.731889) + (xy 129.540507 58.869844) + (xy 129.566314 58.91) + (xy 128.669364 58.91) + (xy 128.726567 59.123486) + (xy 128.72657 59.123492) + (xy 128.826399 59.337578) + (xy 128.961894 59.531082) + (xy 129.128917 59.698105) + (xy 129.314595 59.828119) + (xy 129.358219 59.882696) + (xy 129.365412 59.952195) + (xy 129.33389 60.014549) + (xy 129.314595 60.031269) + (xy 129.128594 60.161508) + (xy 128.961505 60.328597) + (xy 128.825965 60.522169) + (xy 128.825964 60.522171) + (xy 128.726098 60.736335) + (xy 128.726094 60.736344) + (xy 128.664938 60.964586) + (xy 128.664936 60.964596) + (xy 128.644341 61.199999) + (xy 128.644341 61.2) + (xy 128.664936 61.435403) + (xy 128.664938 61.435413) + (xy 128.726094 61.663655) + (xy 128.726096 61.663659) + (xy 128.726097 61.663663) + (xy 128.803135 61.82887) + (xy 128.825965 61.87783) + (xy 128.825967 61.877834) + (xy 128.934281 62.032521) + (xy 128.961501 62.071396) + (xy 128.961506 62.071402) + (xy 129.128597 62.238493) + (xy 129.128603 62.238498) + (xy 129.314158 62.368425) + (xy 129.357783 62.423002) + (xy 129.364977 62.4925) + (xy 129.333454 62.554855) + (xy 129.314158 62.571575) + (xy 129.128597 62.701505) + (xy 128.961505 62.868597) + (xy 128.825965 63.062169) + (xy 128.825964 63.062171) + (xy 128.726098 63.276335) + (xy 128.726094 63.276344) + (xy 128.664938 63.504586) + (xy 128.664936 63.504596) + (xy 128.644341 63.739999) + (xy 128.644341 63.74) + (xy 128.664936 63.975403) + (xy 128.664938 63.975413) + (xy 128.726094 64.203655) + (xy 128.726099 64.203669) + (xy 128.728163 64.208094) + (xy 128.738656 64.277171) + (xy 128.710137 64.340955) + (xy 128.651661 64.379196) + (xy 128.615782 64.3845) + (xy 120.186952 64.3845) + (xy 120.119913 64.364815) + (xy 120.099271 64.348181) + (xy 117.200557 61.449466) + (xy 117.167072 61.388143) + (xy 117.172056 61.318451) + (xy 117.213928 61.262518) + (xy 117.279392 61.238101) + (xy 117.319592 61.243882) + (xy 117.319965 61.242307) + (xy 117.327516 61.244091) + (xy 117.334444 61.244835) + (xy 117.387127 61.2505) + (xy 118.532872 61.250499) + (xy 118.592483 61.244091) + (xy 118.727331 61.193796) + (xy 118.727335 61.193792) + (xy 118.735118 61.189544) + (xy 118.736252 61.191621) + (xy 118.789715 61.171671) + (xy 118.834576 61.176694) + (xy 118.835656 61.177021) + (xy 118.835659 61.177023) + (xy 119.028967 61.235662) + (xy 119.23 61.255462) + (xy 119.431033 61.235662) + (xy 119.624341 61.177023) + (xy 119.802494 61.081798) + (xy 119.802493 61.081798) + (xy 119.807078 61.079348) + (xy 119.87548 61.065106) + (xy 119.923985 61.079348) + (xy 120.105848 61.176557) + (xy 120.25 61.220285) + (xy 120.25 60.33427) + (xy 120.250299 60.32819) + (xy 120.254629 60.28422) + (xy 120.319052 60.334363) + (xy 120.437424 60.375) + (xy 120.531073 60.375) + (xy 120.623446 60.359586) + (xy 120.733514 60.300019) + (xy 120.75 60.28211) + (xy 120.75 61.220285) + (xy 120.894153 61.176557) + (xy 121.072209 61.081384) + (xy 121.072215 61.081379) + (xy 121.228292 60.953292) + (xy 121.356379 60.797215) + (xy 121.356384 60.797209) + (xy 121.451556 60.619154) + (xy 121.51017 60.425932) + (xy 121.525 60.275357) + (xy 121.525 60.25) + (xy 120.77956 60.25) + (xy 120.818278 60.207941) + (xy 120.868551 60.09333) + (xy 120.878886 59.968605) + (xy 120.848163 59.847281) + (xy 120.784606 59.75) + (xy 121.525 59.75) + (xy 121.525 59.724642) + (xy 121.51017 59.574067) + (xy 121.451556 59.380845) + (xy 121.356384 59.20279) + (xy 121.356379 59.202784) + (xy 121.228292 59.046707) + (xy 121.072215 58.91862) + (xy 121.072209 58.918615) + (xy 120.89415 58.823441) + (xy 120.75 58.779712) + (xy 120.75 59.719382) + (xy 120.680948 59.665637) + (xy 120.562576 59.625) + (xy 120.468927 59.625) + (xy 120.376554 59.640414) + (xy 120.266486 59.699981) + (xy 120.254369 59.713142) + (xy 120.250299 59.671808) + (xy 120.25 59.665728) + (xy 120.25 58.779712) + (xy 120.105851 58.82344) + (xy 120.023091 58.867676) + (xy 119.954688 58.881917) + (xy 119.889445 58.856916) + (xy 119.848075 58.800611) + (xy 119.841617 58.773858) + (xy 119.840664 58.766308) + (xy 119.81952 58.712906) + (xy 119.818211 58.70927) + (xy 119.800467 58.654659) + (xy 119.796089 58.647761) + (xy 119.785495 58.626968) + (xy 119.782486 58.619368) + (xy 119.748736 58.572915) + (xy 119.746545 58.569692) + (xy 119.715786 58.521223) + (xy 119.709833 58.515633) + (xy 119.694398 58.498125) + (xy 119.689594 58.491513) + (xy 119.689591 58.491511) + (xy 119.689591 58.49151) + (xy 119.645361 58.45492) + (xy 119.642438 58.452343) + (xy 119.600585 58.41304) + (xy 119.600577 58.413034) + (xy 119.593415 58.409097) + (xy 119.574114 58.39598) + (xy 119.567824 58.390776) + (xy 119.515878 58.366332) + (xy 119.512417 58.364569) + (xy 119.462092 58.336903) + (xy 119.462089 58.336902) + (xy 119.462085 58.3369) + (xy 119.454174 58.334869) + (xy 119.432222 58.326966) + (xy 119.424825 58.323485) + (xy 119.424821 58.323484) + (xy 119.368444 58.31273) + (xy 119.364644 58.31188) + (xy 119.309023 58.2976) + (xy 119.309019 58.2976) + (xy 119.300847 58.2976) + (xy 119.277615 58.295404) + (xy 119.269588 58.293873) + (xy 119.269586 58.293873) + (xy 119.260633 58.294436) + (xy 119.212275 58.297478) + (xy 119.208403 58.2976) + (xy 117.338019 58.2976) + (xy 117.331181 58.297222) + (xy 117.314793 58.295404) + (xy 117.290431 58.292701) + (xy 117.290424 58.292701) + (xy 117.249632 58.298485) + (xy 117.240918 58.2991) + (xy 110.158847 58.2991) + (xy 110.143299 58.297381) + (xy 110.143271 58.29768) + (xy 110.135508 58.296943) + (xy 110.066274 58.2991) + (xy 110.03665 58.2991) + (xy 110.036646 58.2991) + (xy 110.036635 58.299101) + (xy 110.029858 58.299957) + (xy 110.024023 58.300415) + (xy 109.977545 58.301863) + (xy 109.958206 58.307476) + (xy 109.939188 58.311411) + (xy 109.936863 58.311705) + (xy 109.919211 58.313935) + (xy 109.9192 58.313938) + (xy 109.875977 58.331052) + (xy 109.870432 58.33295) + (xy 109.825774 58.34591) + (xy 109.808432 58.35616) + (xy 109.790992 58.3647) + (xy 109.772268 58.372113) + (xy 109.738678 58.396517) + (xy 109.672871 58.419995) + (xy 109.6278 58.412799) + (xy 109.627437 58.413979) + (xy 109.623007 58.412612) + (xy 109.623004 58.412611) + (xy 109.472971 58.366332) + (xy 109.379466 58.337489) + (xy 109.379462 58.337488) + (xy 109.379458 58.337487) + (xy 109.258231 58.319214) + (xy 109.12744 58.2995) + (xy 109.127435 58.2995) + (xy 108.872565 58.2995) + (xy 108.872559 58.2995) + (xy 108.715609 58.323157) + (xy 108.620542 58.337487) + (xy 108.620539 58.337488) + (xy 108.620533 58.337489) + (xy 108.376992 58.412612) + (xy 108.147373 58.52319) + (xy 108.147372 58.523191) + (xy 107.936782 58.666768) + (xy 107.749952 58.840121) + (xy 107.74995 58.840123) + (xy 107.591041 59.039388) + (xy 107.463608 59.260109) + (xy 107.370492 59.497362) + (xy 107.37049 59.497369) + (xy 107.313777 59.745845) + (xy 107.294732 59.999995) + (xy 107.294732 60.000004) + (xy 107.313777 60.254154) + (xy 107.353007 60.426033) + (xy 107.370492 60.502637) + (xy 107.463607 60.739888) + (xy 107.591041 60.960612) + (xy 107.74995 61.159877) + (xy 107.936783 61.333232) + (xy 108.147366 61.476805) + (xy 108.147371 61.476807) + (xy 108.147372 61.476808) + (xy 108.147373 61.476809) + (xy 108.269328 61.535538) + (xy 108.376992 61.587387) + (xy 108.376993 61.587387) + (xy 108.376996 61.587389) + (xy 108.603766 61.657338) + (xy 108.662025 61.695908) + (xy 108.690183 61.759853) + (xy 108.679299 61.82887) + (xy 108.654897 61.86351) + (xy 95.180228 75.338181) + (xy 95.118905 75.371666) + (xy 95.092547 75.3745) + (xy 95.054188 75.3745) + (xy 94.987149 75.354815) + (xy 94.952613 75.321623) + (xy 94.840045 75.160858) + (xy 94.679141 74.999954) + (xy 94.492734 74.869432) + (xy 94.492732 74.869431) + (xy 94.286497 74.773261) + (xy 94.286488 74.773258) + (xy 94.066697 74.714366) + (xy 94.066693 74.714365) + (xy 94.066692 74.714365) + (xy 94.066691 74.714364) + (xy 94.066686 74.714364) + (xy 93.840002 74.694532) + (xy 93.839998 74.694532) + (xy 93.613313 74.714364) + (xy 93.613302 74.714366) + (xy 93.393511 74.773258) + (xy 93.393502 74.773261) + (xy 93.187267 74.869431) + (xy 93.187265 74.869432) + (xy 93.000858 74.999954) + (xy 92.839954 75.160858) + (xy 92.709432 75.347265) + (xy 92.709431 75.347267) + (xy 92.613261 75.553502) + (xy 92.613258 75.553511) + (xy 92.554366 75.773302) + (xy 92.554364 75.773313) + (xy 92.534532 75.999998) + (xy 92.534532 76.000001) + (xy 92.554364 76.226686) + (xy 92.554366 76.226697) + (xy 92.613258 76.446488) + (xy 92.613261 76.446497) + (xy 92.709431 76.652732) + (xy 92.709432 76.652734) + (xy 92.839954 76.839141) + (xy 93.000858 77.000045) + (xy 93.000861 77.000047) + (xy 93.187266 77.130568) + (xy 93.393504 77.226739) + (xy 93.393509 77.22674) + (xy 93.393511 77.226741) + (xy 93.41075 77.23136) + (xy 93.613308 77.285635) + (xy 93.77523 77.299801) + (xy 93.839998 77.305468) + (xy 93.84 77.305468) + (xy 93.840002 77.305468) + (xy 93.896673 77.300509) + (xy 94.066692 77.285635) + (xy 94.286496 77.226739) + (xy 94.492734 77.130568) + (xy 94.679139 77.000047) + (xy 94.840047 76.839139) + (xy 94.952613 76.678377) + (xy 95.007189 76.634752) + (xy 95.054188 76.6255) + (xy 95.320257 76.6255) + (xy 95.335877 76.627224) + (xy 95.335904 76.626939) + (xy 95.34366 76.627671) + (xy 95.343667 76.627673) + (xy 95.412814 76.6255) + (xy 95.44235 76.6255) + (xy 95.449228 76.62463) + (xy 95.455041 76.624172) + (xy 95.501627 76.622709) + (xy 95.520869 76.617117) + (xy 95.539912 76.613174) + (xy 95.559792 76.610664) + (xy 95.603122 76.593507) + (xy 95.608646 76.591617) + (xy 95.612396 76.590527) + (xy 95.65339 76.578618) + (xy 95.670629 76.568422) + (xy 95.688103 76.559862) + (xy 95.706727 76.552488) + (xy 95.706727 76.552487) + (xy 95.706732 76.552486) + (xy 95.744449 76.525082) + (xy 95.749305 76.521892) + (xy 95.78942 76.49817) + (xy 95.803589 76.483999) + (xy 95.818379 76.471368) + (xy 95.834587 76.459594) + (xy 95.864299 76.423676) + (xy 95.868218 76.419371) + (xy 108.28759 64.000001) + (xy 113.194532 64.000001) + (xy 113.214364 64.226686) + (xy 113.214366 64.226697) + (xy 113.273258 64.446488) + (xy 113.273261 64.446497) + (xy 113.369431 64.652732) + (xy 113.369432 64.652734) + (xy 113.499954 64.839141) + (xy 113.660858 65.000045) + (xy 113.660861 65.000047) + (xy 113.847266 65.130568) + (xy 114.053504 65.226739) + (xy 114.273308 65.285635) + (xy 114.43523 65.299801) + (xy 114.499998 65.305468) + (xy 114.5 65.305468) + (xy 114.500002 65.305468) + (xy 114.556673 65.300509) + (xy 114.726692 65.285635) + (xy 114.946496 65.226739) + (xy 115.152734 65.130568) + (xy 115.339139 65.000047) + (xy 115.500047 64.839139) + (xy 115.630568 64.652734) + (xy 115.726739 64.446496) + (xy 115.785635 64.226692) + (xy 115.805468 64) + (xy 115.803316 63.975408) + (xy 115.798251 63.917511) + (xy 115.785635 63.773308) + (xy 115.726739 63.553504) + (xy 115.630568 63.347266) + (xy 115.500047 63.160861) + (xy 115.500045 63.160858) + (xy 115.339141 62.999954) + (xy 115.152734 62.869432) + (xy 115.152732 62.869431) + (xy 114.946497 62.773261) + (xy 114.946488 62.773258) + (xy 114.726697 62.714366) + (xy 114.726693 62.714365) + (xy 114.726692 62.714365) + (xy 114.726691 62.714364) + (xy 114.726686 62.714364) + (xy 114.500002 62.694532) + (xy 114.499998 62.694532) + (xy 114.273313 62.714364) + (xy 114.273302 62.714366) + (xy 114.053511 62.773258) + (xy 114.053502 62.773261) + (xy 113.847267 62.869431) + (xy 113.847265 62.869432) + (xy 113.660858 62.999954) + (xy 113.499954 63.160858) + (xy 113.369432 63.347265) + (xy 113.369431 63.347267) + (xy 113.273261 63.553502) + (xy 113.273258 63.553511) + (xy 113.214366 63.773302) + (xy 113.214364 63.773313) + (xy 113.194532 63.999998) + (xy 113.194532 64.000001) + (xy 108.28759 64.000001) + (xy 111.625772 60.661819) + (xy 111.687095 60.628334) + (xy 111.713453 60.6255) + (xy 114.556048 60.6255) + (xy 114.623087 60.645185) + (xy 114.643729 60.661819) + (xy 119.375697 65.393788) + (xy 119.385522 65.406051) + (xy 119.385743 65.405869) + (xy 119.390714 65.411878) + (xy 119.416717 65.436295) + (xy 119.441135 65.459226) + (xy 119.462029 65.48012) + (xy 119.467511 65.484373) + (xy 119.471943 65.488157) + (xy 119.505918 65.520062) + (xy 119.523476 65.529714) + (xy 119.539733 65.540393) + (xy 119.555564 65.552673) + (xy 119.575237 65.561186) + (xy 119.598333 65.571182) + (xy 119.603577 65.57375) + (xy 119.644408 65.596197) + (xy 119.657023 65.599435) + (xy 119.663805 65.601177) + (xy 119.682219 65.607481) + (xy 119.700604 65.615438) + (xy 119.746657 65.622732) + (xy 119.752326 65.623906) + (xy 119.797481 65.6355) + (xy 119.817516 65.6355) + (xy 119.836913 65.637026) + (xy 119.856696 65.64016) + (xy 119.903084 65.635775) + (xy 119.908922 65.6355) + (xy 128.615782 65.6355) + (xy 128.682821 65.655185) + (xy 128.728576 65.707989) + (xy 128.73852 65.777147) + (xy 128.728163 65.811906) + (xy 128.726099 65.81633) + (xy 128.726094 65.816344) + (xy 128.664938 66.044586) + (xy 128.664936 66.044596) + (xy 128.644341 66.279999) + (xy 128.644341 66.28) + (xy 128.664936 66.515403) + (xy 128.664938 66.515413) + (xy 128.726094 66.743655) + (xy 128.726096 66.743659) + (xy 128.726097 66.743663) + (xy 128.812844 66.929692) + (xy 128.825965 66.95783) + (xy 128.825967 66.957834) + (xy 128.961501 67.151395) + (xy 128.961506 67.151402) + (xy 129.128597 67.318493) + (xy 129.128603 67.318498) + (xy 129.314158 67.448425) + (xy 129.357783 67.503002) + (xy 129.364977 67.5725) + (xy 129.333454 67.634855) + (xy 129.314158 67.651575) + (xy 129.128597 67.781505) + (xy 128.961505 67.948597) + (xy 128.826348 68.141623) + (xy 128.771771 68.185248) + (xy 128.724773 68.1945) + (xy 124.762743 68.1945) + (xy 124.747122 68.192775) + (xy 124.747096 68.193061) + (xy 124.739334 68.192327) + (xy 124.739333 68.192327) + (xy 124.670186 68.1945) + (xy 124.640649 68.1945) + (xy 124.633766 68.195369) + (xy 124.627949 68.195826) + (xy 124.581373 68.19729) + (xy 124.562129 68.202881) + (xy 124.543079 68.206825) + (xy 124.523211 68.209334) + (xy 124.479884 68.226488) + (xy 124.474358 68.228379) + (xy 124.429614 68.241379) + (xy 124.42961 68.241381) + (xy 124.412366 68.251579) + (xy 124.394905 68.260133) + (xy 124.376274 68.26751) + (xy 124.376262 68.267517) + (xy 124.33857 68.294902) + (xy 124.333687 68.298109) + (xy 124.29358 68.321829) + (xy 124.279414 68.335995) + (xy 124.264624 68.348627) + (xy 124.248414 68.360404) + (xy 124.248411 68.360407) + (xy 124.21871 68.396309) + (xy 124.214777 68.400631) + (xy 123.277228 69.338181) + (xy 123.215905 69.371666) + (xy 123.189547 69.3745) + (xy 121.480882 69.3745) + (xy 121.413843 69.354815) + (xy 121.368088 69.302011) + (xy 121.358144 69.232853) + (xy 121.385029 69.171835) + (xy 121.396797 69.157495) + (xy 121.396801 69.157488) + (xy 121.492021 68.979345) + (xy 121.492021 68.979344) + (xy 121.492023 68.979341) + (xy 121.550662 68.786033) + (xy 121.5655 68.63538) + (xy 121.5655 68.08462) + (xy 121.550662 67.933967) + (xy 121.492023 67.740659) + (xy 121.492021 67.740656) + (xy 121.492021 67.740654) + (xy 121.396801 67.562511) + (xy 121.396799 67.562509) + (xy 121.396798 67.562506) + (xy 121.347965 67.503002) + (xy 121.268647 67.406352) + (xy 121.112495 67.278203) + (xy 121.112488 67.278198) + (xy 120.934345 67.182978) + (xy 120.741031 67.124337) + (xy 120.54 67.104538) + (xy 120.338968 67.124337) + (xy 120.145655 67.182978) + (xy 120.063024 67.227145) + (xy 119.994621 67.241386) + (xy 119.929378 67.216385) + (xy 119.888008 67.16008) + (xy 119.88155 67.133326) + (xy 119.880664 67.126308) + (xy 119.85952 67.072906) + (xy 119.858211 67.06927) + (xy 119.840467 67.014659) + (xy 119.836089 67.007761) + (xy 119.825495 66.986968) + (xy 119.822486 66.979368) + (xy 119.788736 66.932915) + (xy 119.786545 66.929692) + (xy 119.755785 66.881222) + (xy 119.749834 66.875634) + (xy 119.734398 66.858125) + (xy 119.729594 66.851513) + (xy 119.729591 66.851511) + (xy 119.729591 66.85151) + (xy 119.685361 66.81492) + (xy 119.682438 66.812343) + (xy 119.640585 66.77304) + (xy 119.640577 66.773034) + (xy 119.633415 66.769097) + (xy 119.614114 66.75598) + (xy 119.607824 66.750776) + (xy 119.555878 66.726332) + (xy 119.552417 66.724569) + (xy 119.502092 66.696903) + (xy 119.502089 66.696902) + (xy 119.502085 66.6969) + (xy 119.494174 66.694869) + (xy 119.472222 66.686966) + (xy 119.464825 66.683485) + (xy 119.464821 66.683484) + (xy 119.408444 66.67273) + (xy 119.404644 66.67188) + (xy 119.349023 66.6576) + (xy 119.349019 66.6576) + (xy 119.340847 66.6576) + (xy 119.317615 66.655404) + (xy 119.309588 66.653873) + (xy 119.309586 66.653873) + (xy 119.300633 66.654436) + (xy 119.252275 66.657478) + (xy 119.248403 66.6576) + (xy 111.18675 66.6576) + (xy 111.17114 66.655876) + (xy 111.171113 66.656163) + (xy 111.163349 66.655428) + (xy 111.098093 66.657478) + (xy 111.094208 66.6576) + (xy 111.064639 66.6576) + (xy 111.057764 66.658469) + (xy 111.051944 66.658926) + (xy 111.005387 66.660389) + (xy 111.005385 66.660389) + (xy 110.98614 66.665979) + (xy 110.967103 66.669921) + (xy 110.947217 66.672434) + (xy 110.947211 66.672435) + (xy 110.947208 66.672436) + (xy 110.932202 66.678377) + (xy 110.903879 66.68959) + (xy 110.898352 66.691482) + (xy 110.853624 66.704476) + (xy 110.853618 66.704479) + (xy 110.836367 66.71468) + (xy 110.818907 66.723233) + (xy 110.80027 66.730612) + (xy 110.762574 66.757998) + (xy 110.757692 66.761205) + (xy 110.717589 66.784922) + (xy 110.703413 66.799096) + (xy 110.688634 66.811719) + (xy 110.672412 66.823506) + (xy 110.642713 66.859406) + (xy 110.63878 66.863727) + (xy 110.197019 67.305468) + (xy 102.440214 75.061896) + (xy 102.427944 75.071729) + (xy 102.428126 75.071948) + (xy 102.422121 75.076914) + (xy 102.374773 75.127334) + (xy 102.353884 75.148223) + (xy 102.349624 75.153714) + (xy 102.345838 75.158146) + (xy 102.313939 75.192115) + (xy 102.313938 75.192116) + (xy 102.304289 75.209668) + (xy 102.293608 75.225927) + (xy 102.281335 75.241747) + (xy 102.281334 75.241751) + (xy 102.262822 75.284525) + (xy 102.260253 75.289769) + (xy 102.237803 75.330607) + (xy 102.237803 75.330608) + (xy 102.232821 75.350008) + (xy 102.226521 75.368408) + (xy 102.218567 75.386787) + (xy 102.218567 75.38679) + (xy 102.211272 75.43283) + (xy 102.210091 75.438533) + (xy 102.1985 75.483678) + (xy 102.1985 75.503701) + (xy 102.196973 75.523102) + (xy 102.193839 75.542879) + (xy 102.198225 75.589275) + (xy 102.1985 75.595112) + (xy 102.1985 77.109255) + (xy 102.196775 77.124872) + (xy 102.197061 77.124899) + (xy 102.196326 77.132665) + (xy 102.1985 77.201814) + (xy 102.1985 77.231343) + (xy 102.198501 77.23136) + (xy 102.199368 77.238231) + (xy 102.199826 77.24405) + (xy 102.20129 77.290624) + (xy 102.201291 77.290627) + (xy 102.20688 77.309867) + (xy 102.210824 77.328911) + (xy 102.213336 77.348791) + (xy 102.23049 77.392119) + (xy 102.232382 77.397647) + (xy 102.245382 77.44239) + (xy 102.247808 77.446493) + (xy 102.25558 77.459634) + (xy 102.264136 77.4771) + (xy 102.271514 77.495732) + (xy 102.280293 77.507816) + (xy 102.298898 77.533423) + (xy 102.302106 77.538307) + (xy 102.325827 77.578416) + (xy 102.325833 77.578424) + (xy 102.33999 77.59258) + (xy 102.352628 77.607376) + (xy 102.364405 77.623586) + (xy 102.364406 77.623587) + (xy 102.400309 77.653288) + (xy 102.40462 77.65721) + (xy 104.462342 79.714932) + (xy 106.515384 81.767974) + (xy 106.548869 81.829297) + (xy 106.543885 81.898989) + (xy 106.502013 81.954922) + (xy 106.480108 81.968037) + (xy 106.347517 82.029865) + (xy 106.161179 82.160342) + (xy 106.000342 82.321179) + (xy 105.869865 82.507517) + (xy 105.773734 82.713673) + (xy 105.77373 82.713682) + (xy 105.721127 82.909999) + (xy 105.721128 82.91) + (xy 106.684314 82.91) + (xy 106.672359 82.921955) + (xy 106.614835 83.034852) + (xy 106.595014 83.16) + (xy 106.614835 83.285148) + (xy 106.672359 83.398045) + (xy 106.684314 83.41) + (xy 105.721128 83.41) + (xy 105.77373 83.606317) + (xy 105.773734 83.606326) + (xy 105.869865 83.812482) + (xy 106.000342 83.99882) + (xy 106.161179 84.159657) + (xy 106.347517 84.290134) + (xy 106.553673 84.386265) + (xy 106.553682 84.386269) + (xy 106.749999 84.438872) + (xy 106.75 84.438871) + (xy 106.75 83.475686) + (xy 106.761955 83.487641) + (xy 106.874852 83.545165) + (xy 106.968519 83.56) + (xy 107.031481 83.56) + (xy 107.125148 83.545165) + (xy 107.238045 83.487641) + (xy 107.25 83.475686) + (xy 107.25 84.438872) + (xy 107.446317 84.386269) + (xy 107.446326 84.386265) + (xy 107.657389 84.287846) + (xy 107.658411 84.290039) + (xy 107.716349 84.275958) + (xy 107.782385 84.298783) + (xy 107.825598 84.353686) + (xy 107.8345 84.39982) + (xy 107.8345 87.363) + (xy 107.814815 87.430039) + (xy 107.762011 87.475794) + (xy 107.7105 87.487) + (xy 101.176634 87.487) + (xy 101.160947 87.48527) + (xy 101.160922 87.485543) + (xy 101.153156 87.484811) + (xy 101.084098 87.487) + (xy 101.05465 87.487) + (xy 101.054647 87.487) + (xy 101.054635 87.487001) + (xy 101.047668 87.487881) + (xy 101.041867 87.488337) + (xy 100.995197 87.489817) + (xy 100.976061 87.495383) + (xy 100.95698 87.499337) + (xy 100.94691 87.50061) + (xy 100.937207 87.501836) + (xy 100.893782 87.519028) + (xy 100.888273 87.520915) + (xy 100.843447 87.533952) + (xy 100.843446 87.533953) + (xy 100.826291 87.544104) + (xy 100.808798 87.552676) + (xy 100.790273 87.560011) + (xy 100.790266 87.560015) + (xy 100.752487 87.587461) + (xy 100.747621 87.590659) + (xy 100.70744 87.614437) + (xy 100.707439 87.614438) + (xy 100.693351 87.628534) + (xy 100.678536 87.641191) + (xy 100.662413 87.652905) + (xy 100.632645 87.688886) + (xy 100.628726 87.693195) + (xy 100.208378 88.11378) + (xy 100.147064 88.147283) + (xy 100.077371 88.142318) + (xy 100.032992 88.113806) + (xy 99.919139 87.999953) + (xy 99.919138 87.999952) + (xy 99.919137 87.999951) + (xy 99.732734 87.869432) + (xy 99.732732 87.869431) + (xy 99.526497 87.773261) + (xy 99.526488 87.773258) + (xy 99.306697 87.714366) + (xy 99.306693 87.714365) + (xy 99.306692 87.714365) + (xy 99.306691 87.714364) + (xy 99.306686 87.714364) + (xy 99.080002 87.694532) + (xy 99.079998 87.694532) + (xy 98.853313 87.714364) + (xy 98.853302 87.714366) + (xy 98.633511 87.773258) + (xy 98.633502 87.773261) + (xy 98.427267 87.869431) + (xy 98.427265 87.869432) + (xy 98.240858 87.999954) + (xy 98.079954 88.160858) + (xy 97.949432 88.347265) + (xy 97.949431 88.347267) + (xy 97.853261 88.553502) + (xy 97.853258 88.553511) + (xy 97.794366 88.773302) + (xy 97.794364 88.773313) + (xy 97.774532 88.999998) + (xy 97.774532 89.000001) + (xy 97.794364 89.226686) + (xy 97.794366 89.226697) + (xy 97.853258 89.446488) + (xy 97.853261 89.446497) + (xy 97.949431 89.652732) + (xy 97.949432 89.652734) + (xy 98.079954 89.839141) + (xy 98.240858 90.000045) + (xy 98.240861 90.000047) + (xy 98.427266 90.130568) + (xy 98.633504 90.226739) + (xy 98.633509 90.22674) + (xy 98.633511 90.226741) + (xy 98.666805 90.235662) + (xy 98.853308 90.285635) + (xy 99.01523 90.299801) + (xy 99.079998 90.305468) + (xy 99.08 90.305468) + (xy 99.080002 90.305468) + (xy 99.136673 90.300509) + (xy 99.306692 90.285635) + (xy 99.526496 90.226739) + (xy 99.732734 90.130568) + (xy 99.919139 90.000047) + (xy 100.080047 89.839139) + (xy 100.194323 89.675933) + (xy 100.248898 89.63231) + (xy 100.291971 89.62312) + (xy 100.305803 89.622682) + (xy 100.324939 89.617116) + (xy 100.344024 89.61316) + (xy 100.363792 89.610664) + (xy 100.407222 89.593467) + (xy 100.412712 89.591587) + (xy 100.457553 89.578547) + (xy 100.474706 89.568395) + (xy 100.492196 89.559824) + (xy 100.510732 89.552486) + (xy 100.548521 89.525029) + (xy 100.553375 89.521841) + (xy 100.56879 89.512719) + (xy 100.593561 89.498061) + (xy 100.60765 89.483962) + (xy 100.622465 89.471306) + (xy 100.638587 89.459594) + (xy 100.668352 89.423612) + (xy 100.672256 89.41932) + (xy 101.316871 88.774342) + (xy 101.378185 88.740841) + (xy 101.404577 88.738) + (xy 107.3105 88.738) + (xy 107.377539 88.757685) + (xy 107.423294 88.810489) + (xy 107.4345 88.862) + (xy 107.4345 89.79787) + (xy 107.434501 89.797876) + (xy 107.440908 89.857483) + (xy 107.491202 89.992328) + (xy 107.491206 89.992335) + (xy 107.577452 90.107544) + (xy 107.577455 90.107547) + (xy 107.692664 90.193793) + (xy 107.692671 90.193797) + (xy 107.827517 90.244091) + (xy 107.827516 90.244091) + (xy 107.834444 90.244835) + (xy 107.887127 90.2505) + (xy 109.032872 90.250499) + (xy 109.092483 90.244091) + (xy 109.227331 90.193796) + (xy 109.227335 90.193792) + (xy 109.235118 90.189544) + (xy 109.236252 90.191621) + (xy 109.289715 90.171671) + (xy 109.334576 90.176694) + (xy 109.335656 90.177021) + (xy 109.335659 90.177023) + (xy 109.528967 90.235662) + (xy 109.73 90.255462) + (xy 109.931033 90.235662) + (xy 110.124341 90.177023) + (xy 110.142739 90.167189) + (xy 110.307078 90.079348) + (xy 110.37548 90.065106) + (xy 110.423985 90.079348) + (xy 110.605848 90.176557) + (xy 110.75 90.220285) + (xy 110.75 89.33427) + (xy 110.750299 89.32819) + (xy 110.754629 89.28422) + (xy 110.819052 89.334363) + (xy 110.937424 89.375) + (xy 111.031073 89.375) + (xy 111.123446 89.359586) + (xy 111.233514 89.300019) + (xy 111.25 89.28211) + (xy 111.25 90.220285) + (xy 111.394153 90.176557) + (xy 111.572209 90.081384) + (xy 111.572215 90.081379) + (xy 111.728292 89.953292) + (xy 111.856379 89.797215) + (xy 111.856384 89.797209) + (xy 111.951556 89.619154) + (xy 112.01017 89.425932) + (xy 112.025 89.275357) + (xy 112.025 89.25) + (xy 111.27956 89.25) + (xy 111.318278 89.207941) + (xy 111.368551 89.09333) + (xy 111.378886 88.968605) + (xy 111.348163 88.847281) + (xy 111.284606 88.75) + (xy 112.025 88.75) + (xy 112.025 88.724642) + (xy 112.01017 88.574067) + (xy 111.951556 88.380845) + (xy 111.856384 88.20279) + (xy 111.856379 88.202784) + (xy 111.728292 88.046707) + (xy 111.572215 87.91862) + (xy 111.572209 87.918615) + (xy 111.39415 87.823441) + (xy 111.25 87.779712) + (xy 111.25 88.719382) + (xy 111.180948 88.665637) + (xy 111.062576 88.625) + (xy 110.968927 88.625) + (xy 110.876554 88.640414) + (xy 110.766486 88.699981) + (xy 110.754369 88.713142) + (xy 110.750299 88.671808) + (xy 110.75 88.665728) + (xy 110.75 87.779712) + (xy 110.605849 87.823441) + (xy 110.423983 87.920651) + (xy 110.35558 87.934893) + (xy 110.307077 87.920651) + (xy 110.124345 87.822978) + (xy 109.931031 87.764337) + (xy 109.73 87.744538) + (xy 109.528968 87.764337) + (xy 109.390959 87.806202) + (xy 109.335659 87.822977) + (xy 109.335658 87.822977) + (xy 109.334575 87.823306) + (xy 109.264708 87.823929) + (xy 109.235618 87.809529) + (xy 109.235114 87.810454) + (xy 109.227328 87.806202) + (xy 109.166167 87.783391) + (xy 109.110233 87.74152) + (xy 109.085816 87.676056) + (xy 109.0855 87.667209) + (xy 109.0855 82.910742) + (xy 109.087224 82.895122) + (xy 109.086939 82.895095) + (xy 109.087673 82.887333) + (xy 109.085872 82.829999) + (xy 109.721127 82.829999) + (xy 109.721128 82.83) + (xy 110.684314 82.83) + (xy 110.672359 82.841955) + (xy 110.614835 82.954852) + (xy 110.595014 83.08) + (xy 110.614835 83.205148) + (xy 110.672359 83.318045) + (xy 110.684314 83.33) + (xy 109.721128 83.33) + (xy 109.77373 83.526317) + (xy 109.773734 83.526326) + (xy 109.869865 83.732482) + (xy 110.000342 83.91882) + (xy 110.161179 84.079657) + (xy 110.347517 84.210134) + (xy 110.553673 84.306265) + (xy 110.553682 84.306269) + (xy 110.749999 84.358872) + (xy 110.75 84.358871) + (xy 110.75 83.395686) + (xy 110.761955 83.407641) + (xy 110.874852 83.465165) + (xy 110.968519 83.48) + (xy 111.031481 83.48) + (xy 111.125148 83.465165) + (xy 111.238045 83.407641) + (xy 111.25 83.395686) + (xy 111.25 84.358872) + (xy 111.446317 84.306269) + (xy 111.446326 84.306265) + (xy 111.652482 84.210134) + (xy 111.83882 84.079657) + (xy 111.999657 83.91882) + (xy 112.130134 83.732482) + (xy 112.226265 83.526326) + (xy 112.226269 83.526317) + (xy 112.278872 83.33) + (xy 111.315686 83.33) + (xy 111.327641 83.318045) + (xy 111.385165 83.205148) + (xy 111.404986 83.08) + (xy 111.385165 82.954852) + (xy 111.327641 82.841955) + (xy 111.315686 82.83) + (xy 112.278872 82.83) + (xy 112.278872 82.829999) + (xy 112.226269 82.633682) + (xy 112.226265 82.633673) + (xy 112.130134 82.427517) + (xy 111.999657 82.241179) + (xy 111.83882 82.080342) + (xy 111.652482 81.949865) + (xy 111.446328 81.853734) + (xy 111.25 81.801127) + (xy 111.25 82.764314) + (xy 111.238045 82.752359) + (xy 111.125148 82.694835) + (xy 111.031481 82.68) + (xy 110.968519 82.68) + (xy 110.874852 82.694835) + (xy 110.761955 82.752359) + (xy 110.75 82.764314) + (xy 110.75 81.801127) + (xy 110.553671 81.853734) + (xy 110.347517 81.949865) + (xy 110.161179 82.080342) + (xy 110.000342 82.241179) + (xy 109.869865 82.427517) + (xy 109.773734 82.633673) + (xy 109.77373 82.633682) + (xy 109.721127 82.829999) + (xy 109.085872 82.829999) + (xy 109.0855 82.818172) + (xy 109.0855 82.788656) + (xy 109.0855 82.78865) + (xy 109.084631 82.781779) + (xy 109.084173 82.775952) + (xy 109.083917 82.767804) + (xy 109.08271 82.729373) + (xy 109.077119 82.71013) + (xy 109.073173 82.691078) + (xy 109.070664 82.671208) + (xy 109.053504 82.627867) + (xy 109.051624 82.622379) + (xy 109.038618 82.57761) + (xy 109.028422 82.56037) + (xy 109.019861 82.542894) + (xy 109.012487 82.52427) + (xy 109.012486 82.524268) + (xy 108.985079 82.486545) + (xy 108.981888 82.481686) + (xy 108.958172 82.441583) + (xy 108.958165 82.441574) + (xy 108.944006 82.427415) + (xy 108.931368 82.412619) + (xy 108.919594 82.396413) + (xy 108.913535 82.391401) + (xy 108.883688 82.366709) + (xy 108.879376 82.362786) + (xy 104.024407 77.507816) + (xy 103.990922 77.446493) + (xy 103.995906 77.376801) + (xy 104.037778 77.320868) + (xy 104.10128 77.296607) + (xy 104.226692 77.285635) + (xy 104.446496 77.226739) + (xy 104.652734 77.130568) + (xy 104.839139 77.000047) + (xy 105.000047 76.839139) + (xy 105.112613 76.678377) + (xy 105.167189 76.634752) + (xy 105.214188 76.6255) + (xy 105.524265 76.6255) + (xy 105.539887 76.627224) + (xy 105.539914 76.62694) + (xy 105.547672 76.627672) + (xy 105.54768 76.627674) + (xy 105.616817 76.6255) + (xy 105.64635 76.6255) + (xy 105.653229 76.62463) + (xy 105.659052 76.624171) + (xy 105.705639 76.622707) + (xy 105.724871 76.617118) + (xy 105.743916 76.613174) + (xy 105.763792 76.610664) + (xy 105.795522 76.5981) + (xy 105.807127 76.593506) + (xy 105.812643 76.591616) + (xy 105.857401 76.578613) + (xy 105.874636 76.568419) + (xy 105.892106 76.55986) + (xy 105.910732 76.552486) + (xy 105.948437 76.52509) + (xy 105.953302 76.521894) + (xy 105.99343 76.498163) + (xy 106.007595 76.483996) + (xy 106.022388 76.471362) + (xy 106.038587 76.459594) + (xy 106.068295 76.423681) + (xy 106.072207 76.419381) + (xy 109.496597 72.994858) + (xy 109.557918 72.961374) + (xy 109.627609 72.966357) + (xy 109.683544 73.008228) + (xy 109.707806 73.071731) + (xy 109.714364 73.146687) + (xy 109.714366 73.146697) + (xy 109.773258 73.366488) + (xy 109.773261 73.366497) + (xy 109.869431 73.572732) + (xy 109.869432 73.572734) + (xy 109.999954 73.759141) + (xy 110.160858 73.920045) + (xy 110.160861 73.920047) + (xy 110.347266 74.050568) + (xy 110.553504 74.146739) + (xy 110.553509 74.14674) + (xy 110.553511 74.146741) + (xy 110.602995 74.16) + (xy 110.773308 74.205635) + (xy 110.93523 74.219801) + (xy 110.999998 74.225468) + (xy 111 74.225468) + (xy 111.000002 74.225468) + (xy 111.056673 74.220509) + (xy 111.226692 74.205635) + (xy 111.446496 74.146739) + (xy 111.652734 74.050568) + (xy 111.839139 73.920047) + (xy 112.000047 73.759139) + (xy 112.130568 73.572734) + (xy 112.226739 73.366496) + (xy 112.285635 73.146692) + (xy 112.305468 72.92) + (xy 112.285635 72.693308) + (xy 112.226739 72.473504) + (xy 112.130568 72.267266) + (xy 112.000047 72.080861) + (xy 112.000045 72.080858) + (xy 111.839141 71.919954) + (xy 111.652734 71.789432) + (xy 111.652732 71.789431) + (xy 111.57072 71.751188) + (xy 111.446496 71.693261) + (xy 111.446493 71.69326) + (xy 111.445282 71.692819) + (xy 111.444823 71.692481) + (xy 111.441589 71.690973) + (xy 111.441892 71.690322) + (xy 111.389021 71.651388) + (xy 111.36409 71.586118) + (xy 111.378405 71.51773) + (xy 111.427421 71.467938) + (xy 111.487701 71.4523) + (xy 111.864518 71.4523) + (xy 111.931557 71.471985) + (xy 111.952205 71.488624) + (xy 113.554417 73.091043) + (xy 113.587898 73.152369) + (xy 113.582909 73.22206) + (xy 113.554413 73.266399) + (xy 113.499952 73.320861) + (xy 113.369432 73.507265) + (xy 113.369431 73.507267) + (xy 113.273261 73.713502) + (xy 113.273258 73.713511) + (xy 113.214366 73.933302) + (xy 113.214364 73.933313) + (xy 113.194532 74.159998) + (xy 113.194532 74.160001) + (xy 113.214364 74.386686) + (xy 113.214366 74.386697) + (xy 113.273258 74.606488) + (xy 113.273261 74.606497) + (xy 113.369431 74.812732) + (xy 113.369432 74.812734) + (xy 113.499954 74.999141) + (xy 113.660858 75.160045) + (xy 113.675075 75.17) + (xy 113.847266 75.290568) + (xy 114.053504 75.386739) + (xy 114.273308 75.445635) + (xy 114.43523 75.459801) + (xy 114.499998 75.465468) + (xy 114.5 75.465468) + (xy 114.500002 75.465468) + (xy 114.556673 75.460509) + (xy 114.726692 75.445635) + (xy 114.946496 75.386739) + (xy 115.152734 75.290568) + (xy 115.339139 75.160047) + (xy 115.500047 74.999139) + (xy 115.630568 74.812734) + (xy 115.726739 74.606496) + (xy 115.785635 74.386692) + (xy 115.805468 74.16) + (xy 115.803316 74.135408) + (xy 115.791474 74.000047) + (xy 115.785635 73.933308) + (xy 115.726739 73.713504) + (xy 115.630568 73.507266) + (xy 115.500047 73.320861) + (xy 115.500045 73.320858) + (xy 115.339141 73.159954) + (xy 115.213144 73.071731) + (xy 115.152734 73.029432) + (xy 115.152732 73.029431) + (xy 115.148299 73.026327) + (xy 115.148992 73.025337) + (xy 115.104884 72.979066) + (xy 115.09982 72.96792) + (xy 115.093517 72.952001) + (xy 115.091623 72.946467) + (xy 115.08751 72.932309) + (xy 115.078634 72.901748) + (xy 115.068426 72.884484) + (xy 115.059869 72.867015) + (xy 115.052487 72.848369) + (xy 115.02511 72.810688) + (xy 115.021899 72.8058) + (xy 114.998195 72.765712) + (xy 114.984016 72.751532) + (xy 114.971381 72.736737) + (xy 114.959596 72.720515) + (xy 114.947395 72.710422) + (xy 114.92371 72.690828) + (xy 114.919385 72.686893) + (xy 113.147172 70.91445) + (xy 113.113692 70.853126) + (xy 113.118681 70.783435) + (xy 113.147167 70.739106) + (xy 113.762811 70.123328) + (xy 113.824131 70.089837) + (xy 113.850502 70.087) + (xy 117.149343 70.087) + (xy 117.216382 70.106685) + (xy 117.237065 70.12336) + (xy 117.497144 70.383681) + (xy 117.507038 70.396036) + (xy 117.507242 70.395868) + (xy 117.512212 70.401876) + (xy 117.562524 70.449123) + (xy 117.572986 70.459594) + (xy 117.583311 70.469928) + (xy 117.588924 70.474286) + (xy 117.593332 70.478052) + (xy 117.604561 70.488597) + (xy 117.627416 70.510061) + (xy 117.627421 70.510064) + (xy 117.644813 70.519625) + (xy 117.66112 70.530342) + (xy 117.676812 70.542525) + (xy 117.689723 70.548119) + (xy 117.719719 70.561116) + (xy 117.724942 70.563676) + (xy 117.75212 70.578617) + (xy 117.765908 70.586197) + (xy 117.785142 70.591135) + (xy 117.803603 70.597461) + (xy 117.821818 70.605354) + (xy 117.82182 70.605354) + (xy 117.821824 70.605356) + (xy 117.868008 70.612692) + (xy 117.873685 70.613869) + (xy 117.918981 70.6255) + (xy 117.938841 70.6255) + (xy 117.958295 70.627035) + (xy 117.977904 70.630151) + (xy 118.013547 70.626798) + (xy 118.02445 70.625773) + (xy 118.03026 70.6255) + (xy 123.417257 70.6255) + (xy 123.432877 70.627224) + (xy 123.432904 70.626939) + (xy 123.44066 70.627671) + (xy 123.440667 70.627673) + (xy 123.509814 70.6255) + (xy 123.53935 70.6255) + (xy 123.546228 70.62463) + (xy 123.552041 70.624172) + (xy 123.598627 70.622709) + (xy 123.617869 70.617117) + (xy 123.636912 70.613174) + (xy 123.656792 70.610664) + (xy 123.700122 70.593507) + (xy 123.705646 70.591617) + (xy 123.709396 70.590527) + (xy 123.75039 70.578618) + (xy 123.767629 70.568422) + (xy 123.785103 70.559862) + (xy 123.803727 70.552488) + (xy 123.803727 70.552487) + (xy 123.803732 70.552486) + (xy 123.841449 70.525082) + (xy 123.846305 70.521892) + (xy 123.88642 70.49817) + (xy 123.900589 70.483999) + (xy 123.915379 70.471368) + (xy 123.931587 70.459594) + (xy 123.961299 70.423676) + (xy 123.965212 70.419376) + (xy 124.902772 69.481819) + (xy 124.964095 69.448334) + (xy 124.990453 69.4455) + (xy 128.724773 69.4455) + (xy 128.791812 69.465185) + (xy 128.826348 69.498377) + (xy 128.961501 69.691396) + (xy 128.961506 69.691402) + (xy 129.128597 69.858493) + (xy 129.128603 69.858498) + (xy 129.314158 69.988425) + (xy 129.357783 70.043002) + (xy 129.364977 70.1125) + (xy 129.333454 70.174855) + (xy 129.314158 70.191575) + (xy 129.128597 70.321505) + (xy 128.961505 70.488597) + (xy 128.825965 70.682169) + (xy 128.825964 70.682171) + (xy 128.726098 70.896335) + (xy 128.726094 70.896344) + (xy 128.664938 71.124586) + (xy 128.664936 71.124596) + (xy 128.644341 71.359999) + (xy 128.644341 71.36) + (xy 128.664936 71.595403) + (xy 128.664938 71.595413) + (xy 128.726094 71.823655) + (xy 128.726096 71.823659) + (xy 128.726097 71.823663) + (xy 128.825847 72.037578) + (xy 128.825965 72.03783) + (xy 128.825967 72.037834) + (xy 128.961501 72.231395) + (xy 128.961506 72.231402) + (xy 129.128597 72.398493) + (xy 129.128603 72.398498) + (xy 129.314158 72.528425) + (xy 129.357783 72.583002) + (xy 129.364977 72.6525) + (xy 129.333454 72.714855) + (xy 129.314158 72.731575) + (xy 129.128597 72.861505) + (xy 128.961505 73.028597) + (xy 128.825965 73.222169) + (xy 128.825964 73.222171) + (xy 128.726098 73.436335) + (xy 128.726094 73.436344) + (xy 128.664938 73.664586) + (xy 128.664936 73.664596) + (xy 128.644341 73.899999) + (xy 128.644341 73.9) + (xy 128.664936 74.135403) + (xy 128.664938 74.135413) + (xy 128.726094 74.363655) + (xy 128.726096 74.363659) + (xy 128.726097 74.363663) + (xy 128.736833 74.386686) + (xy 128.825965 74.57783) + (xy 128.825967 74.577834) + (xy 128.961501 74.771395) + (xy 128.961506 74.771402) + (xy 129.128597 74.938493) + (xy 129.128603 74.938498) + (xy 129.314158 75.068425) + (xy 129.357783 75.123002) + (xy 129.364977 75.1925) + (xy 129.333454 75.254855) + (xy 129.314158 75.271575) + (xy 129.128597 75.401505) + (xy 128.961505 75.568597) + (xy 128.825965 75.762169) + (xy 128.825964 75.762171) + (xy 128.726098 75.976335) + (xy 128.726094 75.976344) + (xy 128.664938 76.204586) + (xy 128.664936 76.204596) + (xy 128.644341 76.439999) + (xy 128.644341 76.44) + (xy 128.664936 76.675403) + (xy 128.664938 76.675413) + (xy 128.726094 76.903655) + (xy 128.726096 76.903659) + (xy 128.726097 76.903663) + (xy 128.771041 77.000045) + (xy 128.825965 77.11783) + (xy 128.825967 77.117834) + (xy 128.910271 77.238231) + (xy 128.943463 77.285635) + (xy 128.961501 77.311395) + (xy 128.961506 77.311402) + (xy 129.128597 77.478493) + (xy 129.128603 77.478498) + (xy 129.314594 77.60873) + (xy 129.358219 77.663307) + (xy 129.365413 77.732805) + (xy 129.33389 77.79516) + (xy 129.314595 77.81188) + (xy 129.128922 77.94189) + (xy 129.12892 77.941891) + (xy 128.961891 78.10892) + (xy 128.961886 78.108926) + (xy 128.8264 78.30242) + (xy 128.826399 78.302422) + (xy 128.72657 78.516507) + (xy 128.726567 78.516513) + (xy 128.669364 78.729999) + (xy 128.669364 78.73) + (xy 129.566314 78.73) + (xy 129.540507 78.770156) + (xy 129.5 78.908111) + (xy 129.5 79.051889) + (xy 129.540507 79.189844) + (xy 129.566314 79.23) + (xy 128.669364 79.23) + (xy 128.726567 79.443486) + (xy 128.72657 79.443492) + (xy 128.826399 79.657578) + (xy 128.961894 79.851082) + (xy 129.128917 80.018105) + (xy 129.314595 80.148119) + (xy 129.358219 80.202696) + (xy 129.365412 80.272195) + (xy 129.33389 80.334549) + (xy 129.314595 80.351269) + (xy 129.128594 80.481508) + (xy 128.961505 80.648597) + (xy 128.825965 80.842169) + (xy 128.825964 80.842171) + (xy 128.726098 81.056335) + (xy 128.726094 81.056344) + (xy 128.664938 81.284586) + (xy 128.664936 81.284596) + (xy 128.644341 81.519999) + (xy 128.644341 81.52) + (xy 128.664936 81.755403) + (xy 128.664938 81.755413) + (xy 128.726094 81.983655) + (xy 128.726096 81.983659) + (xy 128.726097 81.983663) + (xy 128.804936 82.152733) + (xy 128.825965 82.19783) + (xy 128.825967 82.197834) + (xy 128.912335 82.321179) + (xy 128.961501 82.391396) + (xy 128.961506 82.391402) + (xy 129.128597 82.558493) + (xy 129.128603 82.558498) + (xy 129.314158 82.688425) + (xy 129.357783 82.743002) + (xy 129.364977 82.8125) + (xy 129.333454 82.874855) + (xy 129.314158 82.891575) + (xy 129.128597 83.021505) + (xy 128.961505 83.188597) + (xy 128.825965 83.382169) + (xy 128.825964 83.382171) + (xy 128.726098 83.596335) + (xy 128.726094 83.596344) + (xy 128.664938 83.824586) + (xy 128.664936 83.824596) + (xy 128.644341 84.059999) + (xy 128.644341 84.06) + (xy 128.664936 84.295403) + (xy 128.664938 84.295413) + (xy 128.726094 84.523655) + (xy 128.726096 84.523659) + (xy 128.726097 84.523663) + (xy 128.809155 84.701781) + (xy 128.825965 84.73783) + (xy 128.825967 84.737834) + (xy 128.897504 84.839998) + (xy 128.961501 84.931396) + (xy 128.961506 84.931402) + (xy 129.128597 85.098493) + (xy 129.128603 85.098498) + (xy 129.314158 85.228425) + (xy 129.357783 85.283002) + (xy 129.364977 85.3525) + (xy 129.333454 85.414855) + (xy 129.314158 85.431575) + (xy 129.128597 85.561505) + (xy 128.961505 85.728597) + (xy 128.825965 85.922169) + (xy 128.825964 85.922171) + (xy 128.726098 86.136335) + (xy 128.726094 86.136344) + (xy 128.664938 86.364586) + (xy 128.664936 86.364596) + (xy 128.644341 86.599999) + (xy 128.644341 86.6) + (xy 128.664936 86.835403) + (xy 128.664938 86.835413) + (xy 128.726094 87.063655) + (xy 128.726096 87.063659) + (xy 128.726097 87.063663) + (xy 128.73 87.072032) + (xy 128.825965 87.27783) + (xy 128.825967 87.277834) + (xy 128.932543 87.430039) + (xy 128.961501 87.471396) + (xy 128.961506 87.471402) + (xy 129.128597 87.638493) + (xy 129.128603 87.638498) + (xy 129.314158 87.768425) + (xy 129.357783 87.823002) + (xy 129.364977 87.8925) + (xy 129.333454 87.954855) + (xy 129.314158 87.971575) + (xy 129.128597 88.101505) + (xy 128.961505 88.268597) + (xy 128.825965 88.462169) + (xy 128.825964 88.462171) + (xy 128.726098 88.676335) + (xy 128.726094 88.676344) + (xy 128.664938 88.904586) + (xy 128.664936 88.904596) + (xy 128.644341 89.139999) + (xy 128.644341 89.14) + (xy 128.664936 89.375403) + (xy 128.664938 89.375413) + (xy 128.726094 89.603655) + (xy 128.726096 89.603659) + (xy 128.726097 89.603663) + (xy 128.816658 89.797872) + (xy 128.825965 89.81783) + (xy 128.825967 89.817834) + (xy 128.85373 89.857483) + (xy 128.961501 90.011396) + (xy 128.961506 90.011402) + (xy 129.128597 90.178493) + (xy 129.128603 90.178498) + (xy 129.314158 90.308425) + (xy 129.357783 90.363002) + (xy 129.364977 90.4325) + (xy 129.333454 90.494855) + (xy 129.314158 90.511575) + (xy 129.128597 90.641505) + (xy 128.961505 90.808597) + (xy 128.825965 91.002169) + (xy 128.825964 91.002171) + (xy 128.726098 91.216335) + (xy 128.726094 91.216344) + (xy 128.664938 91.444586) + (xy 128.664936 91.444596) + (xy 128.644341 91.679999) + (xy 128.644341 91.68) + (xy 128.664936 91.915403) + (xy 128.664938 91.915413) + (xy 128.726094 92.143655) + (xy 128.726096 92.143659) + (xy 128.726097 92.143663) + (xy 128.754724 92.205053) + (xy 128.825965 92.35783) + (xy 128.825967 92.357834) + (xy 128.925163 92.4995) + (xy 128.961501 92.551396) + (xy 128.961506 92.551402) + (xy 129.128597 92.718493) + (xy 129.128603 92.718498) + (xy 129.314158 92.848425) + (xy 129.357783 92.903002) + (xy 129.364977 92.9725) + (xy 129.333454 93.034855) + (xy 129.314158 93.051575) + (xy 129.128597 93.181505) + (xy 128.961505 93.348597) + (xy 128.825965 93.542169) + (xy 128.825964 93.542171) + (xy 128.726098 93.756335) + (xy 128.726094 93.756344) + (xy 128.664938 93.984586) + (xy 128.664936 93.984596) + (xy 128.644341 94.219999) + (xy 128.644341 94.22) + (xy 128.664936 94.455403) + (xy 128.664938 94.455413) + (xy 128.726094 94.683655) + (xy 128.726096 94.683659) + (xy 128.726097 94.683663) + (xy 128.799936 94.842011) + (xy 128.825965 94.89783) + (xy 128.825967 94.897834) + (xy 128.897505 95) + (xy 128.961505 95.091401) + (xy 129.128599 95.258495) + (xy 129.29211 95.372987) + (xy 129.314594 95.38873) + (xy 129.358219 95.443307) + (xy 129.365413 95.512805) + (xy 129.33389 95.57516) + (xy 129.314595 95.59188) + (xy 129.128922 95.72189) + (xy 129.12892 95.721891) + (xy 128.961891 95.88892) + (xy 128.961886 95.888926) + (xy 128.8264 96.08242) + (xy 128.826399 96.082422) + (xy 128.72657 96.296507) + (xy 128.726567 96.296513) + (xy 128.669364 96.509999) + (xy 128.669364 96.51) + (xy 129.566314 96.51) + (xy 129.540507 96.550156) + (xy 129.5 96.688111) + (xy 129.5 96.831889) + (xy 129.540507 96.969844) + (xy 129.566314 97.01) + (xy 128.669364 97.01) + (xy 128.726567 97.223486) + (xy 128.72657 97.223492) + (xy 128.826399 97.437578) + (xy 128.961894 97.631082) + (xy 129.128917 97.798105) + (xy 129.322421 97.9336) + (xy 129.536507 98.033429) + (xy 129.536516 98.033433) + (xy 129.75 98.090634) + (xy 129.75 97.195501) + (xy 129.857685 97.24468) + (xy 129.964237 97.26) + (xy 130.035763 97.26) + (xy 130.142315 97.24468) + (xy 130.25 97.195501) + (xy 130.25 98.090633) + (xy 130.463483 98.033433) + (xy 130.463492 98.033429) + (xy 130.677578 97.9336) + (xy 130.871082 97.798105) + (xy 131.038105 97.631082) + (xy 131.168119 97.445405) + (xy 131.222696 97.401781) + (xy 131.292195 97.394588) + (xy 131.354549 97.42611) + (xy 131.371269 97.445405) + (xy 131.501505 97.631401) + (xy 131.668599 97.798495) + (xy 131.765384 97.866265) + (xy 131.862165 97.934032) + (xy 131.862167 97.934033) + (xy 131.86217 97.934035) + (xy 132.076337 98.033903) + (xy 132.304592 98.095063) + (xy 132.492918 98.111539) + (xy 132.539999 98.115659) + (xy 132.54 98.115659) + (xy 132.540001 98.115659) + (xy 132.579234 98.112226) + (xy 132.775408 98.095063) + (xy 133.003663 98.033903) + (xy 133.21783 97.934035) + (xy 133.411401 97.798495) + (xy 133.578495 97.631401) + (xy 133.714035 97.43783) + (xy 133.813903 97.223663) + (xy 133.875063 96.995408) + (xy 133.895659 96.76) + (xy 133.875063 96.524592) + (xy 133.813903 96.296337) + (xy 133.714035 96.082171) + (xy 133.708731 96.074595) + (xy 133.578494 95.888597) + (xy 133.411402 95.721506) + (xy 133.411396 95.721501) + (xy 133.225842 95.591575) + (xy 133.182217 95.536998) + (xy 133.175023 95.4675) + (xy 133.206546 95.405145) + (xy 133.225842 95.388425) + (xy 133.248026 95.372891) + (xy 133.411401 95.258495) + (xy 133.578495 95.091401) + (xy 133.714035 94.89783) + (xy 133.813903 94.683663) + (xy 133.875063 94.455408) + (xy 133.895659 94.22) + (xy 133.875063 93.984592) + (xy 133.813903 93.756337) + (xy 133.714035 93.542171) + (xy 133.708425 93.534158) + (xy 133.578494 93.348597) + (xy 133.411402 93.181506) + (xy 133.411396 93.181501) + (xy 133.225842 93.051575) + (xy 133.182217 92.996998) + (xy 133.175023 92.9275) + (xy 133.206546 92.865145) + (xy 133.225842 92.848425) + (xy 133.329478 92.775858) + (xy 133.411401 92.718495) + (xy 133.578495 92.551401) + (xy 133.714035 92.35783) + (xy 133.813903 92.143663) + (xy 133.875063 91.915408) + (xy 133.895659 91.68) + (xy 133.875063 91.444592) + (xy 133.813903 91.216337) + (xy 133.714035 91.002171) + (xy 133.708425 90.994158) + (xy 133.578494 90.808597) + (xy 133.411402 90.641506) + (xy 133.411401 90.641505) + (xy 133.225405 90.511269) + (xy 133.181781 90.456692) + (xy 133.174588 90.387193) + (xy 133.20611 90.324839) + (xy 133.225405 90.308119) + (xy 133.411082 90.178105) + (xy 133.578105 90.011082) + (xy 133.7136 89.817578) + (xy 133.813429 89.603492) + (xy 133.813432 89.603486) + (xy 133.870636 89.39) + (xy 132.973686 89.39) + (xy 132.999493 89.349844) + (xy 133.04 89.211889) + (xy 133.04 89.068111) + (xy 132.999493 88.930156) + (xy 132.973686 88.89) + (xy 133.870636 88.89) + (xy 133.870635 88.889999) + (xy 133.813432 88.676513) + (xy 133.813429 88.676507) + (xy 133.7136 88.462422) + (xy 133.713599 88.46242) + (xy 133.578113 88.268926) + (xy 133.578108 88.26892) + (xy 133.411078 88.10189) + (xy 133.225405 87.971879) + (xy 133.18178 87.917302) + (xy 133.174588 87.847804) + (xy 133.20611 87.785449) + (xy 133.225406 87.76873) + (xy 133.225842 87.768425) + (xy 133.411401 87.638495) + (xy 133.578495 87.471401) + (xy 133.714035 87.27783) + (xy 133.813903 87.063663) + (xy 133.875063 86.835408) + (xy 133.895659 86.6) + (xy 133.875063 86.364592) + (xy 133.815041 86.140584) + (xy 133.813905 86.136344) + (xy 133.813904 86.136343) + (xy 133.813903 86.136337) + (xy 133.714035 85.922171) + (xy 133.708425 85.914158) + (xy 133.578494 85.728597) + (xy 133.411402 85.561506) + (xy 133.411401 85.561505) + (xy 133.225405 85.431269) + (xy 133.181781 85.376692) + (xy 133.174588 85.307193) + (xy 133.20611 85.244839) + (xy 133.225405 85.228119) + (xy 133.411082 85.098105) + (xy 133.578105 84.931082) + (xy 133.7136 84.737578) + (xy 133.813429 84.523492) + (xy 133.813432 84.523486) + (xy 133.870636 84.31) + (xy 132.973686 84.31) + (xy 132.999493 84.269844) + (xy 133.04 84.131889) + (xy 133.04 83.988111) + (xy 132.999493 83.850156) + (xy 132.973686 83.81) + (xy 133.870636 83.81) + (xy 133.870635 83.809999) + (xy 133.813432 83.596513) + (xy 133.813429 83.596507) + (xy 133.7136 83.382422) + (xy 133.713599 83.38242) + (xy 133.578113 83.188926) + (xy 133.578108 83.18892) + (xy 133.411078 83.02189) + (xy 133.225405 82.891879) + (xy 133.18178 82.837302) + (xy 133.174588 82.767804) + (xy 133.20611 82.705449) + (xy 133.225406 82.68873) + (xy 133.25617 82.667189) + (xy 133.411401 82.558495) + (xy 133.578495 82.391401) + (xy 133.714035 82.19783) + (xy 133.813903 81.983663) + (xy 133.875063 81.755408) + (xy 133.895659 81.52) + (xy 133.875063 81.284592) + (xy 133.813903 81.056337) + (xy 133.714035 80.842171) + (xy 133.708425 80.834158) + (xy 133.578494 80.648597) + (xy 133.411402 80.481506) + (xy 133.411401 80.481505) + (xy 133.301609 80.404628) + (xy 133.225839 80.351573) + (xy 133.182216 80.296997) + (xy 133.175023 80.227498) + (xy 133.206545 80.165144) + (xy 133.225831 80.148432) + (xy 133.411401 80.018495) + (xy 133.578495 79.851401) + (xy 133.714035 79.65783) + (xy 133.813903 79.443663) + (xy 133.875063 79.215408) + (xy 133.895659 78.98) + (xy 133.875063 78.744592) + (xy 133.813903 78.516337) + (xy 133.714035 78.302171) + (xy 133.578495 78.108599) + (xy 133.578494 78.108597) + (xy 133.411402 77.941506) + (xy 133.411396 77.941501) + (xy 133.225842 77.811575) + (xy 133.182217 77.756998) + (xy 133.175023 77.6875) + (xy 133.206546 77.625145) + (xy 133.225842 77.608425) + (xy 133.268699 77.578416) + (xy 133.411401 77.478495) + (xy 133.578495 77.311401) + (xy 133.714035 77.11783) + (xy 133.813903 76.903663) + (xy 133.875063 76.675408) + (xy 133.895659 76.44) + (xy 133.894232 76.423695) + (xy 133.876997 76.226697) + (xy 133.875063 76.204592) + (xy 133.813903 75.976337) + (xy 133.714035 75.762171) + (xy 133.595012 75.592187) + (xy 133.578494 75.568597) + (xy 133.411402 75.401506) + (xy 133.411396 75.401501) + (xy 133.225842 75.271575) + (xy 133.182217 75.216998) + (xy 133.175023 75.1475) + (xy 133.206546 75.085145) + (xy 133.225842 75.068425) + (xy 133.248026 75.052891) + (xy 133.411401 74.938495) + (xy 133.578495 74.771401) + (xy 133.714035 74.57783) + (xy 133.813903 74.363663) + (xy 133.875063 74.135408) + (xy 133.895659 73.9) + (xy 133.875063 73.664592) + (xy 133.813903 73.436337) + (xy 133.714035 73.222171) + (xy 133.713958 73.22206) + (xy 133.578494 73.028597) + (xy 133.411402 72.861506) + (xy 133.411401 72.861505) + (xy 133.225405 72.731269) + (xy 133.181781 72.676692) + (xy 133.174588 72.607193) + (xy 133.20611 72.544839) + (xy 133.225405 72.528119) + (xy 133.411082 72.398105) + (xy 133.578105 72.231082) + (xy 133.7136 72.037578) + (xy 133.813429 71.823492) + (xy 133.813432 71.823486) + (xy 133.870636 71.61) + (xy 132.973686 71.61) + (xy 132.999493 71.569844) + (xy 133.04 71.431889) + (xy 133.04 71.288111) + (xy 132.999493 71.150156) + (xy 132.973686 71.11) + (xy 133.870636 71.11) + (xy 133.870635 71.109999) + (xy 133.813432 70.896513) + (xy 133.813429 70.896507) + (xy 133.7136 70.682422) + (xy 133.713599 70.68242) + (xy 133.578113 70.488926) + (xy 133.578108 70.48892) + (xy 133.411078 70.32189) + (xy 133.225405 70.191879) + (xy 133.18178 70.137302) + (xy 133.174588 70.067804) + (xy 133.20611 70.005449) + (xy 133.225406 69.98873) + (xy 133.225842 69.988425) + (xy 133.411401 69.858495) + (xy 133.578495 69.691401) + (xy 133.714035 69.49783) + (xy 133.813903 69.283663) + (xy 133.875063 69.055408) + (xy 133.895659 68.82) + (xy 133.875063 68.584592) + (xy 133.813903 68.356337) + (xy 133.714035 68.142171) + (xy 133.713652 68.141623) + (xy 133.578494 67.948597) + (xy 133.411402 67.781506) + (xy 133.411396 67.781501) + (xy 133.225842 67.651575) + (xy 133.182217 67.596998) + (xy 133.175023 67.5275) + (xy 133.206546 67.465145) + (xy 133.225842 67.448425) + (xy 133.285928 67.406352) + (xy 133.411401 67.318495) + (xy 133.578495 67.151401) + (xy 133.714035 66.95783) + (xy 133.813903 66.743663) + (xy 133.875063 66.515408) + (xy 133.895659 66.28) + (xy 133.875063 66.044592) + (xy 133.813903 65.816337) + (xy 133.714035 65.602171) + (xy 133.692337 65.571182) + (xy 133.578494 65.408597) + (xy 133.411402 65.241506) + (xy 133.411401 65.241505) + (xy 133.225405 65.111269) + (xy 133.181781 65.056692) + (xy 133.174588 64.987193) + (xy 133.20611 64.924839) + (xy 133.225405 64.908119) + (xy 133.411082 64.778105) + (xy 133.578105 64.611082) + (xy 133.7136 64.417578) + (xy 133.813429 64.203492) + (xy 133.813432 64.203486) + (xy 133.870636 63.99) + (xy 132.973686 63.99) + (xy 132.999493 63.949844) + (xy 133.04 63.811889) + (xy 133.04 63.668111) + (xy 132.999493 63.530156) + (xy 132.973686 63.49) + (xy 133.870636 63.49) + (xy 133.870635 63.489999) + (xy 133.813432 63.276513) + (xy 133.813429 63.276507) + (xy 133.7136 63.062422) + (xy 133.713599 63.06242) + (xy 133.578113 62.868926) + (xy 133.578108 62.86892) + (xy 133.411078 62.70189) + (xy 133.225405 62.571879) + (xy 133.18178 62.517302) + (xy 133.174588 62.447804) + (xy 133.20611 62.385449) + (xy 133.225406 62.36873) + (xy 133.225842 62.368425) + (xy 133.411401 62.238495) + (xy 133.578495 62.071401) + (xy 133.714035 61.87783) + (xy 133.813903 61.663663) + (xy 133.875063 61.435408) + (xy 133.895659 61.2) + (xy 133.89318 61.171671) + (xy 133.883252 61.058189) + (xy 133.875063 60.964592) + (xy 133.828626 60.791285) + (xy 133.813905 60.736344) + (xy 133.813904 60.736343) + (xy 133.813903 60.736337) + (xy 133.714035 60.522171) + (xy 133.708425 60.514158) + (xy 133.578494 60.328597) + (xy 133.411402 60.161506) + (xy 133.411396 60.161501) + (xy 133.225842 60.031575) + (xy 133.182217 59.976998) + (xy 133.175023 59.9075) + (xy 133.206546 59.845145) + (xy 133.225842 59.828425) + (xy 133.374089 59.724621) + (xy 133.411401 59.698495) + (xy 133.578495 59.531401) + (xy 133.714035 59.33783) + (xy 133.813903 59.123663) + (xy 133.875063 58.895408) + (xy 133.895659 58.66) + (xy 133.893722 58.637866) + (xy 133.886706 58.557669) + (xy 133.875063 58.424592) + (xy 133.813903 58.196337) + (xy 133.714035 57.982171) + (xy 133.708731 57.974595) + (xy 133.578494 57.788597) + (xy 133.411402 57.621506) + (xy 133.411396 57.621501) + (xy 133.225842 57.491575) + (xy 133.182217 57.436998) + (xy 133.175023 57.3675) + (xy 133.206546 57.305145) + (xy 133.225842 57.288425) + (xy 133.248026 57.272891) + (xy 133.411401 57.158495) + (xy 133.578495 56.991401) + (xy 133.714035 56.79783) + (xy 133.813903 56.583663) + (xy 133.875063 56.355408) + (xy 133.895659 56.12) + (xy 133.875063 55.884592) + (xy 133.813903 55.656337) + (xy 133.714035 55.442171) + (xy 133.708425 55.434158) + (xy 133.578494 55.248597) + (xy 133.411402 55.081506) + (xy 133.411401 55.081505) + (xy 133.225405 54.951269) + (xy 133.181781 54.896692) + (xy 133.174588 54.827193) + (xy 133.20611 54.764839) + (xy 133.225405 54.748119) + (xy 133.411082 54.618105) + (xy 133.578105 54.451082) + (xy 133.7136 54.257578) + (xy 133.813429 54.043492) + (xy 133.813432 54.043486) + (xy 133.870636 53.83) + (xy 132.973686 53.83) + (xy 132.999493 53.789844) + (xy 133.04 53.651889) + (xy 133.04 53.508111) + (xy 132.999493 53.370156) + (xy 132.973686 53.33) + (xy 133.870636 53.33) + (xy 133.870635 53.329999) + (xy 133.813432 53.116513) + (xy 133.813429 53.116507) + (xy 133.7136 52.902422) + (xy 133.713599 52.90242) + (xy 133.578113 52.708926) + (xy 133.578108 52.70892) + (xy 133.411078 52.54189) + (xy 133.225405 52.411879) + (xy 133.18178 52.357302) + (xy 133.174588 52.287804) + (xy 133.20611 52.225449) + (xy 133.225406 52.20873) + (xy 133.232331 52.203881) + (xy 133.411401 52.078495) + (xy 133.578495 51.911401) + (xy 133.714035 51.71783) + (xy 133.813903 51.503663) + (xy 133.875063 51.275408) + (xy 133.895659 51.04) + (xy 133.875063 50.804592) + (xy 133.821302 50.60395) + (xy 133.813905 50.576344) + (xy 133.813904 50.576343) + (xy 133.813903 50.576337) + (xy 133.714035 50.362171) + (xy 133.708885 50.354815) + (xy 133.578494 50.168597) + (xy 133.411402 50.001506) + (xy 133.411396 50.001501) + (xy 133.225842 49.871575) + (xy 133.182217 49.816998) + (xy 133.175023 49.7475) + (xy 133.206546 49.685145) + (xy 133.225842 49.668425) + (xy 133.248026 49.652891) + (xy 133.411401 49.538495) + (xy 133.578495 49.371401) + (xy 133.714035 49.17783) + (xy 133.813903 48.963663) + (xy 133.875063 48.735408) + (xy 133.895659 48.5) + (xy 133.875063 48.264592) + (xy 133.813903 48.036337) + (xy 133.714035 47.822171) + (xy 133.578495 47.628599) + (xy 133.578494 47.628597) + (xy 133.411402 47.461506) + (xy 133.411395 47.461501) + (xy 133.217834 47.325967) + (xy 133.21783 47.325965) + (xy 133.042875 47.244382) + (xy 132.990436 47.19821) + (xy 132.971284 47.131016) + (xy 132.9915 47.064135) + (xy 133.044665 47.0188) + (xy 133.09528 47.008) + (xy 134.419896 47.008) + (xy 134.486935 47.027685) + (xy 134.53269 47.080489) + (xy 134.543896 47.132104) + (xy 134.500104 99.374793) + (xy 134.480363 99.441816) + (xy 134.427521 99.487527) + (xy 134.374799 99.498682) + (xy 132.599604 99.479995) + (xy 132.546065 99.467214) + (xy 132.411017 99.400615) + (xy 132.411007 99.400611) + (xy 132.116156 99.300523) + (xy 132.116136 99.300518) + (xy 131.81074 99.23977) + (xy 131.810731 99.239769) + (xy 131.81073 99.239769) + (xy 131.5 99.219403) + (xy 131.18927 99.239769) + (xy 131.189269 99.239769) + (xy 131.189259 99.23977) + (xy 130.883863 99.300518) + (xy 130.883843 99.300523) + (xy 130.588992 99.400611) + (xy 130.588988 99.400613) + (xy 130.499949 99.444522) + (xy 130.443801 99.457302) + (xy 114.936266 99.294065) + (xy 114.869437 99.273676) + (xy 114.824241 99.220393) + (xy 114.815026 99.151134) + (xy 114.815767 99.14684) + (xy 114.817377 99.138401) + (xy 114.81821 99.13467) + (xy 114.8325 99.079019) + (xy 114.8325 99.070844) + (xy 114.834697 99.047606) + (xy 114.836227 99.039588) + (xy 114.832621 98.982275) + (xy 114.8325 98.978403) + (xy 114.8325 98.293547) + (xy 114.852185 98.226508) + (xy 114.868818 98.205867) + (xy 115.367057 97.707616) + (xy 117.791495 95.283117) + (xy 117.852817 95.249632) + (xy 117.919441 95.253517) + (xy 117.945018 95.262298) + (xy 118.059485 95.281399) + (xy 118.173951 95.3005) + (xy 118.173952 95.3005) + (xy 118.406048 95.3005) + (xy 118.406049 95.3005) + (xy 118.634981 95.262298) + (xy 118.854503 95.186936) + (xy 119.058626 95.07647) + (xy 119.241784 94.933913) + (xy 119.398979 94.763153) + (xy 119.525924 94.568849) + (xy 119.619157 94.3563) + (xy 119.676134 94.131305) + (xy 119.676135 94.131297) + (xy 119.6953 93.900006) + (xy 119.6953 93.899993) + (xy 119.676135 93.668702) + (xy 119.676133 93.668691) + (xy 119.619157 93.443699) + (xy 119.525924 93.231151) + (xy 119.398983 93.036852) + (xy 119.39898 93.036849) + (xy 119.398979 93.036847) + (xy 119.241784 92.866087) + (xy 119.241779 92.866083) + (xy 119.241777 92.866081) + (xy 119.058634 92.723535) + (xy 119.058628 92.723531) + (xy 118.854504 92.613064) + (xy 118.854495 92.613061) + (xy 118.634984 92.537702) + (xy 118.44445 92.505908) + (xy 118.406049 92.4995) + (xy 118.173951 92.4995) + (xy 118.13555 92.505908) + (xy 117.945015 92.537702) + (xy 117.725504 92.613061) + (xy 117.725495 92.613064) + (xy 117.521371 92.723531) + (xy 117.521365 92.723535) + (xy 117.338222 92.866081) + (xy 117.338218 92.866085) + (xy 117.329866 92.875158) + (xy 117.269979 92.911148) + (xy 117.200141 92.909047) + (xy 117.142525 92.869522) + (xy 117.122455 92.834507) + (xy 117.093797 92.757671) + (xy 117.093793 92.757664) + (xy 117.007547 92.642455) + (xy 117.007544 92.642452) + (xy 116.892335 92.556206) + (xy 116.892328 92.556202) + (xy 116.757482 92.505908) + (xy 116.757483 92.505908) + (xy 116.697883 92.499501) + (xy 116.697881 92.4995) + (xy 116.697873 92.4995) + (xy 116.697864 92.4995) + (xy 114.802129 92.4995) + (xy 114.802123 92.499501) + (xy 114.742516 92.505908) + (xy 114.607671 92.556202) + (xy 114.607664 92.556206) + (xy 114.492455 92.642452) + (xy 114.492452 92.642455) + (xy 114.406206 92.757664) + (xy 114.406202 92.757671) + (xy 114.355908 92.892517) + (xy 114.349501 92.952116) + (xy 114.3495 92.952135) + (xy 114.3495 94.84787) + (xy 114.349501 94.847876) + (xy 114.355908 94.907483) + (xy 114.406202 95.042328) + (xy 114.406206 95.042335) + (xy 114.492452 95.157544) + (xy 114.492455 95.157547) + (xy 114.607664 95.243793) + (xy 114.607671 95.243797) + (xy 114.742517 95.294091) + (xy 114.742516 95.294091) + (xy 114.749444 95.294835) + (xy 114.802127 95.3005) + (xy 115.705597 95.300499) + (xy 115.772636 95.320183) + (xy 115.818391 95.372987) + (xy 115.828335 95.442146) + (xy 115.79931 95.505702) + (xy 115.793279 95.512179) + (xy 113.823206 97.482299) + (xy 113.810949 97.492123) + (xy 113.811131 97.492343) + (xy 113.805122 97.497313) + (xy 113.773879 97.530584) + (xy 113.757766 97.547743) + (xy 113.74732 97.558189) + (xy 113.736873 97.568636) + (xy 113.736866 97.568644) + (xy 113.732617 97.57412) + (xy 113.72883 97.578554) + (xy 113.696939 97.612515) + (xy 113.687283 97.63008) + (xy 113.676605 97.646336) + (xy 113.664322 97.662171) + (xy 113.649432 97.696581) + (xy 113.604741 97.750289) + (xy 113.538109 97.771309) + (xy 113.503538 97.767109) + (xy 113.306697 97.714366) + (xy 113.306693 97.714365) + (xy 113.306692 97.714365) + (xy 113.306691 97.714364) + (xy 113.306686 97.714364) + (xy 113.080002 97.694532) + (xy 113.079998 97.694532) + (xy 112.853313 97.714364) + (xy 112.853302 97.714366) + (xy 112.633511 97.773258) + (xy 112.633502 97.773261) + (xy 112.427267 97.869431) + (xy 112.427265 97.869432) + (xy 112.240858 97.999954) + (xy 112.079954 98.160858) + (xy 111.949432 98.347265) + (xy 111.949431 98.347267) + (xy 111.853261 98.553502) + (xy 111.853258 98.553511) + (xy 111.794366 98.773302) + (xy 111.794364 98.773313) + (xy 111.774532 98.999998) + (xy 111.774532 99.000002) + (xy 111.785449 99.124785) + (xy 111.771682 99.193285) + (xy 111.723067 99.243468) + (xy 111.660616 99.259585) + (xy 104.343512 99.182562) + (xy 104.276683 99.162173) + (xy 104.231487 99.10889) + (xy 104.221289 99.047762) + (xy 104.225468 99) + (xy 104.223797 98.980906) + (xy 104.205635 98.773313) + (xy 104.205635 98.773308) + (xy 104.146739 98.553504) + (xy 104.050568 98.347266) + (xy 103.920047 98.160861) + (xy 103.920045 98.160858) + (xy 103.759141 97.999954) + (xy 103.572734 97.869432) + (xy 103.572732 97.869431) + (xy 103.366497 97.773261) + (xy 103.366488 97.773258) + (xy 103.146697 97.714366) + (xy 103.146693 97.714365) + (xy 103.146692 97.714365) + (xy 103.146691 97.714364) + (xy 103.146686 97.714364) + (xy 102.920002 97.694532) + (xy 102.919998 97.694532) + (xy 102.693313 97.714364) + (xy 102.693302 97.714366) + (xy 102.473511 97.773258) + (xy 102.473502 97.773261) + (xy 102.267267 97.869431) + (xy 102.267265 97.869432) + (xy 102.080858 97.999954) + (xy 101.919954 98.160858) + (xy 101.789432 98.347265) + (xy 101.789431 98.347267) + (xy 101.693261 98.553502) + (xy 101.693258 98.553511) + (xy 101.634366 98.773302) + (xy 101.634364 98.773313) + (xy 101.614532 98.999998) + (xy 101.614532 99.000006) + (xy 101.616083 99.017741) + (xy 101.602315 99.086241) + (xy 101.553698 99.136422) + (xy 101.49125 99.152538) + (xy 87.123055 99.001295) + (xy 87.056226 98.980906) + (xy 87.01103 98.927623) + (xy 87.000361 98.876938) + (xy 87.00131 98.553502) + (xy 87.007395 96.480095) + (xy 87.027276 96.413117) + (xy 87.080214 96.367517) + (xy 87.149401 96.357776) + (xy 87.212871 96.386988) + (xy 87.22694 96.401424) + (xy 87.22731 96.401871) + (xy 87.227314 96.401877) + (xy 87.256412 96.429202) + (xy 87.277736 96.449227) + (xy 87.298623 96.470115) + (xy 87.298627 96.470118) + (xy 87.298629 96.47012) + (xy 87.304111 96.474373) + (xy 87.308543 96.478157) + (xy 87.342518 96.510062) + (xy 87.360076 96.519714) + (xy 87.376335 96.530395) + (xy 87.392164 96.542673) + (xy 87.434938 96.561182) + (xy 87.440156 96.563738) + (xy 87.481008 96.586197) + (xy 87.500416 96.59118) + (xy 87.518817 96.59748) + (xy 87.537204 96.605437) + (xy 87.580588 96.612308) + (xy 87.583219 96.612725) + (xy 87.588939 96.613909) + (xy 87.634081 96.6255) + (xy 87.634088 96.6255) + (xy 87.641309 96.626413) + (xy 87.705352 96.654346) + (xy 87.727341 96.678312) + (xy 87.839953 96.83914) + (xy 88.000858 97.000045) + (xy 88.000861 97.000047) + (xy 88.187266 97.130568) + (xy 88.393504 97.226739) + (xy 88.613308 97.285635) + (xy 88.77523 97.299801) + (xy 88.839998 97.305468) + (xy 88.84 97.305468) + (xy 88.840002 97.305468) + (xy 88.896673 97.300509) + (xy 89.066692 97.285635) + (xy 89.286496 97.226739) + (xy 89.492734 97.130568) + (xy 89.679139 97.000047) + (xy 89.840047 96.839139) + (xy 89.970568 96.652734) + (xy 90.066739 96.446496) + (xy 90.125635 96.226692) + (xy 90.145468 96) + (xy 90.125635 95.773308) + (xy 90.077022 95.59188) + (xy 90.066741 95.553511) + (xy 90.066738 95.553502) + (xy 90.058334 95.53548) + (xy 89.970568 95.347266) + (xy 89.840047 95.160861) + (xy 89.840045 95.160858) + (xy 89.679141 94.999954) + (xy 89.492734 94.869432) + (xy 89.492732 94.869431) + (xy 89.286497 94.773261) + (xy 89.286488 94.773258) + (xy 89.066697 94.714366) + (xy 89.066693 94.714365) + (xy 89.066692 94.714365) + (xy 89.066691 94.714364) + (xy 89.066686 94.714364) + (xy 88.840002 94.694532) + (xy 88.839998 94.694532) + (xy 88.613313 94.714364) + (xy 88.613302 94.714366) + (xy 88.393511 94.773258) + (xy 88.393502 94.773261) + (xy 88.187267 94.869431) + (xy 88.187265 94.869432) + (xy 88.000862 94.999951) + (xy 87.887702 95.113111) + (xy 87.826379 95.146595) + (xy 87.756687 95.141611) + (xy 87.715137 95.115821) + (xy 87.712251 95.113111) + (xy 87.688464 95.090773) + (xy 87.674028 95.076337) + (xy 87.667575 95.069883) + (xy 87.662086 95.065625) + (xy 87.657661 95.061847) + (xy 87.623682 95.029938) + (xy 87.62368 95.029936) + (xy 87.623677 95.029935) + (xy 87.606129 95.020288) + (xy 87.589863 95.009604) + (xy 87.577482 95) + (xy 87.574036 94.997327) + (xy 87.574035 94.997326) + (xy 87.574033 94.997325) + (xy 87.531268 94.978818) + (xy 87.526022 94.976248) + (xy 87.485193 94.953803) + (xy 87.485192 94.953802) + (xy 87.465793 94.948822) + (xy 87.447381 94.942518) + (xy 87.428998 94.934562) + (xy 87.428992 94.93456) + (xy 87.382974 94.927272) + (xy 87.377252 94.926087) + (xy 87.332121 94.9145) + (xy 87.332119 94.9145) + (xy 87.312084 94.9145) + (xy 87.292686 94.912973) + (xy 87.285262 94.911797) + (xy 87.272905 94.90984) + (xy 87.272904 94.90984) + (xy 87.226516 94.914225) + (xy 87.220678 94.9145) + (xy 87.136355 94.9145) + (xy 87.069316 94.894815) + (xy 87.023561 94.842011) + (xy 87.012356 94.790136) + (xy 87.014289 94.131297) + (xy 87.015406 93.750634) + (xy 87.035287 93.683655) + (xy 87.088225 93.638055) + (xy 87.139405 93.627) + (xy 95.691048 93.627) + (xy 95.758087 93.646685) + (xy 95.778729 93.663319) + (xy 97.700586 95.585177) + (xy 97.734071 95.6465) + (xy 97.73268 95.704949) + (xy 97.714367 95.773296) + (xy 97.714364 95.773313) + (xy 97.694532 95.999999) + (xy 97.694532 96.000001) + (xy 97.714364 96.226686) + (xy 97.714366 96.226697) + (xy 97.773258 96.446488) + (xy 97.773261 96.446497) + (xy 97.869431 96.652732) + (xy 97.869432 96.652734) + (xy 97.999954 96.839141) + (xy 98.160858 97.000045) + (xy 98.160861 97.000047) + (xy 98.347266 97.130568) + (xy 98.553504 97.226739) + (xy 98.773308 97.285635) + (xy 98.93523 97.299801) + (xy 98.999998 97.305468) + (xy 99 97.305468) + (xy 99.000002 97.305468) + (xy 99.056673 97.300509) + (xy 99.226692 97.285635) + (xy 99.446496 97.226739) + (xy 99.652734 97.130568) + (xy 99.839139 97.000047) + (xy 99.980068 96.859117) + (xy 100.041389 96.825634) + (xy 100.067748 96.8228) + (xy 107.220264 96.8228) + (xy 107.235881 96.824524) + (xy 107.235908 96.824239) + (xy 107.243669 96.824971) + (xy 107.243676 96.824973) + (xy 107.312809 96.8228) + (xy 107.34235 96.8228) + (xy 107.349234 96.821929) + (xy 107.355063 96.821471) + (xy 107.364799 96.821165) + (xy 107.401636 96.820008) + (xy 107.401638 96.820007) + (xy 107.40164 96.820007) + (xy 107.420869 96.81442) + (xy 107.439923 96.810473) + (xy 107.459792 96.807964) + (xy 107.503129 96.790804) + (xy 107.508647 96.788915) + (xy 107.553398 96.775914) + (xy 107.570637 96.765718) + (xy 107.588099 96.757163) + (xy 107.606732 96.749786) + (xy 107.644434 96.722391) + (xy 107.649303 96.719193) + (xy 107.689428 96.695465) + (xy 107.703594 96.681298) + (xy 107.718388 96.668664) + (xy 107.734583 96.656897) + (xy 107.734585 96.656896) + (xy 107.734587 96.656894) + (xy 107.76429 96.620987) + (xy 107.768215 96.616675) + (xy 108.885547 95.499311) + (xy 114.226833 90.15787) + (xy 116.7045 90.15787) + (xy 116.704501 90.157876) + (xy 116.710908 90.217483) + (xy 116.761202 90.352328) + (xy 116.761206 90.352335) + (xy 116.847452 90.467544) + (xy 116.847455 90.467547) + (xy 116.962664 90.553793) + (xy 116.962671 90.553797) + (xy 117.097517 90.604091) + (xy 117.097516 90.604091) + (xy 117.104444 90.604835) + (xy 117.157127 90.6105) + (xy 118.302872 90.610499) + (xy 118.362483 90.604091) + (xy 118.497331 90.553796) + (xy 118.497335 90.553792) + (xy 118.505118 90.549544) + (xy 118.506252 90.551621) + (xy 118.559715 90.531671) + (xy 118.604576 90.536694) + (xy 118.605656 90.537021) + (xy 118.605659 90.537023) + (xy 118.798967 90.595662) + (xy 119 90.615462) + (xy 119.201033 90.595662) + (xy 119.394341 90.537023) + (xy 119.441951 90.511575) + (xy 119.577078 90.439348) + (xy 119.64548 90.425106) + (xy 119.693985 90.439348) + (xy 119.875848 90.536557) + (xy 120.02 90.580285) + (xy 120.02 89.69427) + (xy 120.020299 89.68819) + (xy 120.024629 89.64422) + (xy 120.089052 89.694363) + (xy 120.207424 89.735) + (xy 120.301073 89.735) + (xy 120.393446 89.719586) + (xy 120.503514 89.660019) + (xy 120.52 89.64211) + (xy 120.52 90.580285) + (xy 120.664153 90.536557) + (xy 120.842209 90.441384) + (xy 120.842215 90.441379) + (xy 120.998292 90.313292) + (xy 121.126379 90.157215) + (xy 121.126384 90.157209) + (xy 121.221556 89.979154) + (xy 121.28017 89.785932) + (xy 121.295 89.635357) + (xy 121.295 89.61) + (xy 120.54956 89.61) + (xy 120.588278 89.567941) + (xy 120.638551 89.45333) + (xy 120.648886 89.328605) + (xy 120.618163 89.207281) + (xy 120.554606 89.11) + (xy 121.295 89.11) + (xy 121.295 89.084642) + (xy 121.28017 88.934067) + (xy 121.221556 88.740845) + (xy 121.126384 88.56279) + (xy 121.126379 88.562784) + (xy 120.998292 88.406707) + (xy 120.842215 88.27862) + (xy 120.842209 88.278615) + (xy 120.66415 88.183441) + (xy 120.52 88.139712) + (xy 120.52 89.079382) + (xy 120.450948 89.025637) + (xy 120.332576 88.985) + (xy 120.238927 88.985) + (xy 120.146554 89.000414) + (xy 120.036486 89.059981) + (xy 120.024369 89.073142) + (xy 120.020299 89.031808) + (xy 120.02 89.025728) + (xy 120.02 88.139712) + (xy 119.875849 88.183441) + (xy 119.693983 88.280651) + (xy 119.62558 88.294893) + (xy 119.577077 88.280651) + (xy 119.394345 88.182978) + (xy 119.201031 88.124337) + (xy 119 88.104538) + (xy 118.798968 88.124337) + (xy 118.678566 88.160861) + (xy 118.605659 88.182977) + (xy 118.605658 88.182977) + (xy 118.604575 88.183306) + (xy 118.534708 88.183929) + (xy 118.505618 88.169529) + (xy 118.505114 88.170454) + (xy 118.497328 88.166202) + (xy 118.362482 88.115908) + (xy 118.362483 88.115908) + (xy 118.302883 88.109501) + (xy 118.302881 88.1095) + (xy 118.302873 88.1095) + (xy 118.302864 88.1095) + (xy 117.157129 88.1095) + (xy 117.157123 88.109501) + (xy 117.097516 88.115908) + (xy 116.962671 88.166202) + (xy 116.962664 88.166206) + (xy 116.847455 88.252452) + (xy 116.847452 88.252455) + (xy 116.761206 88.367664) + (xy 116.761202 88.367671) + (xy 116.710908 88.502517) + (xy 116.704501 88.562116) + (xy 116.7045 88.562135) + (xy 116.7045 90.15787) + (xy 114.226833 90.15787) + (xy 118.113795 86.270795) + (xy 118.126051 86.26098) + (xy 118.125867 86.260757) + (xy 118.13187 86.255789) + (xy 118.131877 86.255786) + (xy 118.179232 86.205358) + (xy 118.200126 86.184464) + (xy 118.204379 86.178979) + (xy 118.208163 86.174548) + (xy 118.240062 86.140582) + (xy 118.249718 86.123015) + (xy 118.260395 86.106762) + (xy 118.272678 86.090928) + (xy 118.29119 86.048145) + (xy 118.293738 86.042943) + (xy 118.316197 86.002092) + (xy 118.321181 85.982676) + (xy 118.327484 85.964271) + (xy 118.33544 85.945886) + (xy 118.33544 85.945884) + (xy 118.337409 85.933454) + (xy 118.342726 85.899869) + (xy 118.343911 85.89415) + (xy 118.3555 85.849019) + (xy 118.3555 85.828979) + (xy 118.357026 85.809583) + (xy 118.36016 85.789795) + (xy 118.355775 85.743408) + (xy 118.3555 85.73757) + (xy 118.3555 82.33279) + (xy 118.375185 82.265751) + (xy 118.427989 82.219996) + (xy 118.43615 82.216614) + (xy 118.497331 82.193796) + (xy 118.497335 82.193792) + (xy 118.505118 82.189544) + (xy 118.506252 82.191621) + (xy 118.559715 82.171671) + (xy 118.604576 82.176694) + (xy 118.605656 82.177021) + (xy 118.605659 82.177023) + (xy 118.798967 82.235662) + (xy 119 82.255462) + (xy 119.201033 82.235662) + (xy 119.394341 82.177023) + (xy 119.4355 82.155023) + (xy 119.577078 82.079348) + (xy 119.64548 82.065106) + (xy 119.693985 82.079348) + (xy 119.875848 82.176557) + (xy 120.02 82.220285) + (xy 120.02 81.33427) + (xy 120.020299 81.32819) + (xy 120.024629 81.28422) + (xy 120.089052 81.334363) + (xy 120.207424 81.375) + (xy 120.301073 81.375) + (xy 120.393446 81.359586) + (xy 120.503514 81.300019) + (xy 120.52 81.28211) + (xy 120.52 82.220285) + (xy 120.664153 82.176557) + (xy 120.842209 82.081384) + (xy 120.842215 82.081379) + (xy 120.998292 81.953292) + (xy 121.126379 81.797215) + (xy 121.126384 81.797209) + (xy 121.221556 81.619154) + (xy 121.28017 81.425932) + (xy 121.295 81.275357) + (xy 121.295 81.25) + (xy 120.54956 81.25) + (xy 120.588278 81.207941) + (xy 120.638551 81.09333) + (xy 120.648886 80.968605) + (xy 120.618163 80.847281) + (xy 120.554606 80.75) + (xy 121.295 80.75) + (xy 121.295 80.724642) + (xy 121.28017 80.574067) + (xy 121.221556 80.380845) + (xy 121.126384 80.20279) + (xy 121.126379 80.202784) + (xy 120.998292 80.046707) + (xy 120.842215 79.91862) + (xy 120.842209 79.918615) + (xy 120.66415 79.823441) + (xy 120.52 79.779712) + (xy 120.52 80.719382) + (xy 120.450948 80.665637) + (xy 120.332576 80.625) + (xy 120.238927 80.625) + (xy 120.146554 80.640414) + (xy 120.036486 80.699981) + (xy 120.024369 80.713142) + (xy 120.020299 80.671808) + (xy 120.02 80.665728) + (xy 120.02 79.779712) + (xy 119.875849 79.823441) + (xy 119.693983 79.920651) + (xy 119.62558 79.934893) + (xy 119.577077 79.920651) + (xy 119.394345 79.822978) + (xy 119.201031 79.764337) + (xy 119 79.744538) + (xy 118.798968 79.764337) + (xy 118.660959 79.806202) + (xy 118.605659 79.822977) + (xy 118.605658 79.822977) + (xy 118.604575 79.823306) + (xy 118.534708 79.823929) + (xy 118.505618 79.809529) + (xy 118.505114 79.810454) + (xy 118.497328 79.806202) + (xy 118.362482 79.755908) + (xy 118.362483 79.755908) + (xy 118.302883 79.749501) + (xy 118.302881 79.7495) + (xy 118.302873 79.7495) + (xy 118.302864 79.7495) + (xy 117.157129 79.7495) + (xy 117.157123 79.749501) + (xy 117.097516 79.755908) + (xy 116.962671 79.806202) + (xy 116.962664 79.806206) + (xy 116.847455 79.892452) + (xy 116.847452 79.892455) + (xy 116.761206 80.007664) + (xy 116.761202 80.007671) + (xy 116.710908 80.142517) + (xy 116.704501 80.202116) + (xy 116.7045 80.202135) + (xy 116.7045 81.79787) + (xy 116.704501 81.797876) + (xy 116.710908 81.857483) + (xy 116.761202 81.992328) + (xy 116.761206 81.992335) + (xy 116.847452 82.107544) + (xy 116.847455 82.107547) + (xy 116.962664 82.193793) + (xy 116.962666 82.193794) + (xy 116.962669 82.193796) + (xy 117.023833 82.216608) + (xy 117.079766 82.258478) + (xy 117.104184 82.323942) + (xy 117.1045 82.33279) + (xy 117.1045 85.459551) + (xy 117.084815 85.52659) + (xy 117.068183 85.547231) + (xy 112.655542 89.96) + (xy 107.199993 95.415707) + (xy 107.080223 95.53548) + (xy 107.0189 95.568966) + (xy 106.99254 95.5718) + (xy 105.354764 95.5718) + (xy 105.287725 95.552115) + (xy 105.24197 95.499311) + (xy 105.232026 95.430153) + (xy 105.234989 95.415707) + (xy 105.265858 95.3005) + (xy 105.285635 95.226692) + (xy 105.303693 95.020288) + (xy 105.305468 95.000001) + (xy 105.305468 94.999998) + (xy 105.294045 94.869431) + (xy 105.285635 94.773308) + (xy 105.226739 94.553504) + (xy 105.130568 94.347266) + (xy 105.032839 94.207693) + (xy 105.000045 94.160858) + (xy 104.839141 93.999954) + (xy 104.652734 93.869432) + (xy 104.652732 93.869431) + (xy 104.446497 93.773261) + (xy 104.446488 93.773258) + (xy 104.226697 93.714366) + (xy 104.226693 93.714365) + (xy 104.226692 93.714365) + (xy 104.226691 93.714364) + (xy 104.226686 93.714364) + (xy 104.000002 93.694532) + (xy 103.999999 93.694532) + (xy 103.773313 93.714364) + (xy 103.773296 93.714367) + (xy 103.704949 93.73268) + (xy 103.635099 93.731016) + (xy 103.585177 93.700586) + (xy 101.500803 91.616212) + (xy 101.49098 91.60395) + (xy 101.490759 91.604134) + (xy 101.485786 91.598123) + (xy 101.435364 91.550773) + (xy 101.424919 91.540328) + (xy 101.414475 91.529883) + (xy 101.408986 91.525625) + (xy 101.404561 91.521847) + (xy 101.370582 91.489938) + (xy 101.37058 91.489936) + (xy 101.370577 91.489935) + (xy 101.353029 91.480288) + (xy 101.336763 91.469604) + (xy 101.320933 91.457325) + (xy 101.278168 91.438818) + (xy 101.272922 91.436248) + (xy 101.232093 91.413803) + (xy 101.232092 91.413802) + (xy 101.212693 91.408822) + (xy 101.194281 91.402518) + (xy 101.175898 91.394562) + (xy 101.175892 91.39456) + (xy 101.129874 91.387272) + (xy 101.124152 91.386087) + (xy 101.079021 91.3745) + (xy 101.079019 91.3745) + (xy 101.058984 91.3745) + (xy 101.039586 91.372973) + (xy 101.032162 91.371797) + (xy 101.019805 91.36984) + (xy 101.019804 91.36984) + (xy 100.973416 91.374225) + (xy 100.967578 91.3745) + (xy 89.6695 91.3745) + (xy 89.602461 91.354815) + (xy 89.556706 91.302011) + (xy 89.5455 91.2505) + (xy 89.5455 90.214188) + (xy 89.565185 90.147149) + (xy 89.598377 90.112613) + (xy 89.666224 90.065106) + (xy 89.759139 90.000047) + (xy 89.920047 89.839139) + (xy 90.050568 89.652734) + (xy 90.146739 89.446496) + (xy 90.205635 89.226692) + (xy 90.225468 89) + (xy 90.205635 88.773308) + (xy 90.146739 88.553504) + (xy 90.050568 88.347266) + (xy 89.920047 88.160861) + (xy 89.920045 88.160858) + (xy 89.759141 87.999954) + (xy 89.572734 87.869432) + (xy 89.572732 87.869431) + (xy 89.366497 87.773261) + (xy 89.366488 87.773258) + (xy 89.146697 87.714366) + (xy 89.146693 87.714365) + (xy 89.146692 87.714365) + (xy 89.146691 87.714364) + (xy 89.146686 87.714364) + (xy 88.920002 87.694532) + (xy 88.919998 87.694532) + (xy 88.693313 87.714364) + (xy 88.693302 87.714366) + (xy 88.473511 87.773258) + (xy 88.473502 87.773261) + (xy 88.267267 87.869431) + (xy 88.267265 87.869432) + (xy 88.080858 87.999954) + (xy 87.919954 88.160858) + (xy 87.789432 88.347265) + (xy 87.789431 88.347267) + (xy 87.693261 88.553502) + (xy 87.693258 88.553511) + (xy 87.634366 88.773302) + (xy 87.634364 88.773313) + (xy 87.614532 88.999998) + (xy 87.614532 89.000001) + (xy 87.634364 89.226686) + (xy 87.634366 89.226697) + (xy 87.693258 89.446488) + (xy 87.693261 89.446497) + (xy 87.789431 89.652732) + (xy 87.789432 89.652734) + (xy 87.919954 89.839141) + (xy 88.080858 90.000045) + (xy 88.241623 90.112613) + (xy 88.285248 90.167189) + (xy 88.2945 90.214188) + (xy 88.2945 91.837255) + (xy 88.292775 91.852872) + (xy 88.293061 91.852899) + (xy 88.292326 91.860665) + (xy 88.2945 91.929814) + (xy 88.2945 91.959343) + (xy 88.294501 91.95936) + (xy 88.295368 91.966231) + (xy 88.295826 91.97205) + (xy 88.29729 92.018624) + (xy 88.297291 92.018627) + (xy 88.30288 92.037867) + (xy 88.306824 92.056911) + (xy 88.309336 92.076791) + (xy 88.32649 92.120119) + (xy 88.328382 92.125647) + (xy 88.341381 92.170388) + (xy 88.35158 92.187634) + (xy 88.360117 92.205052) + (xy 88.360612 92.206301) + (xy 88.367021 92.275874) + (xy 88.334798 92.337869) + (xy 88.274172 92.372602) + (xy 88.245341 92.376) + (xy 87.143805 92.376) + (xy 87.076766 92.356315) + (xy 87.031011 92.303511) + (xy 87.019806 92.251636) + (xy 87.044001 84.008) + (xy 87.044 84.008) + (xy 82.168 84.008) + (xy 82.100961 83.988315) + (xy 82.055206 83.935511) + (xy 82.044 83.884) + (xy 82.044 81.500001) + (xy 92.114532 81.500001) + (xy 92.134364 81.726686) + (xy 92.134366 81.726697) + (xy 92.193258 81.946488) + (xy 92.193261 81.946497) + (xy 92.289431 82.152732) + (xy 92.289432 82.152734) + (xy 92.419954 82.339141) + (xy 92.580858 82.500045) + (xy 92.741623 82.612613) + (xy 92.785248 82.667189) + (xy 92.7945 82.714188) + (xy 92.7945 84.017255) + (xy 92.792775 84.032872) + (xy 92.793061 84.032899) + (xy 92.792326 84.040665) + (xy 92.7945 84.109814) + (xy 92.7945 84.139343) + (xy 92.794501 84.13936) + (xy 92.795368 84.146231) + (xy 92.795826 84.15205) + (xy 92.79729 84.198624) + (xy 92.797291 84.198627) + (xy 92.80288 84.217867) + (xy 92.806824 84.236911) + (xy 92.809336 84.256791) + (xy 92.82649 84.300119) + (xy 92.828382 84.305647) + (xy 92.841382 84.35039) + (xy 92.846397 84.358871) + (xy 92.85158 84.367634) + (xy 92.860136 84.3851) + (xy 92.863464 84.393504) + (xy 92.867514 84.403732) + (xy 92.894898 84.441423) + (xy 92.898106 84.446307) + (xy 92.921827 84.486416) + (xy 92.921833 84.486424) + (xy 92.93599 84.50058) + (xy 92.948628 84.515376) + (xy 92.960405 84.531586) + (xy 92.960406 84.531587) + (xy 92.996309 84.561288) + (xy 93.00062 84.56521) + (xy 93.502095 85.066686) + (xy 93.659197 85.223788) + (xy 93.669022 85.236051) + (xy 93.669243 85.235869) + (xy 93.674214 85.241878) + (xy 93.69877 85.264937) + (xy 93.724635 85.289226) + (xy 93.745529 85.31012) + (xy 93.751011 85.314373) + (xy 93.755443 85.318157) + (xy 93.789418 85.350062) + (xy 93.806976 85.359714) + (xy 93.823233 85.370393) + (xy 93.839064 85.382673) + (xy 93.858737 85.391186) + (xy 93.881833 85.401182) + (xy 93.887077 85.40375) + (xy 93.927908 85.426197) + (xy 93.940523 85.429435) + (xy 93.947305 85.431177) + (xy 93.965719 85.437481) + (xy 93.984104 85.445438) + (xy 94.030157 85.452732) + (xy 94.035826 85.453906) + (xy 94.080981 85.4655) + (xy 94.101016 85.4655) + (xy 94.120413 85.467026) + (xy 94.140196 85.47016) + (xy 94.186584 85.465775) + (xy 94.192422 85.4655) + (xy 102.785812 85.4655) + (xy 102.852851 85.485185) + (xy 102.887387 85.518377) + (xy 102.999954 85.679141) + (xy 103.160858 85.840045) + (xy 103.173674 85.849019) + (xy 103.347266 85.970568) + (xy 103.553504 86.066739) + (xy 103.773308 86.125635) + (xy 103.93523 86.139801) + (xy 103.999998 86.145468) + (xy 104 86.145468) + (xy 104.000002 86.145468) + (xy 104.056673 86.140509) + (xy 104.226692 86.125635) + (xy 104.446496 86.066739) + (xy 104.652734 85.970568) + (xy 104.839139 85.840047) + (xy 105.000047 85.679139) + (xy 105.130568 85.492734) + (xy 105.226739 85.286496) + (xy 105.285635 85.066692) + (xy 105.305468 84.84) + (xy 105.285635 84.613308) + (xy 105.226739 84.393504) + (xy 105.130568 84.187266) + (xy 105.000047 84.000861) + (xy 105.000045 84.000858) + (xy 104.839141 83.839954) + (xy 104.652734 83.709432) + (xy 104.652732 83.709431) + (xy 104.446497 83.613261) + (xy 104.446488 83.613258) + (xy 104.226697 83.554366) + (xy 104.226693 83.554365) + (xy 104.226692 83.554365) + (xy 104.226691 83.554364) + (xy 104.226686 83.554364) + (xy 104.000002 83.534532) + (xy 103.999998 83.534532) + (xy 103.773313 83.554364) + (xy 103.773302 83.554366) + (xy 103.553511 83.613258) + (xy 103.553502 83.613261) + (xy 103.347267 83.709431) + (xy 103.347265 83.709432) + (xy 103.160858 83.839954) + (xy 102.999954 84.000858) + (xy 102.887387 84.161623) + (xy 102.832811 84.205248) + (xy 102.785812 84.2145) + (xy 94.470452 84.2145) + (xy 94.403413 84.194815) + (xy 94.382771 84.178181) + (xy 94.081819 83.877228) + (xy 94.048334 83.815905) + (xy 94.0455 83.789547) + (xy 94.0455 82.714187) + (xy 94.065185 82.647148) + (xy 94.098379 82.612611) + (xy 94.117527 82.599204) + (xy 94.150328 82.58285) + (xy 94.188441 82.570467) + (xy 94.321877 82.485786) + (xy 94.430062 82.370582) + (xy 94.506197 82.232092) + (xy 94.507074 82.228673) + (xy 94.525605 82.188383) + (xy 94.550568 82.152734) + (xy 94.646739 81.946496) + (xy 94.705635 81.726692) + (xy 94.725468 81.500001) + (xy 102.274532 81.500001) + (xy 102.294364 81.726686) + (xy 102.294366 81.726697) + (xy 102.353258 81.946488) + (xy 102.353261 81.946497) + (xy 102.449431 82.152732) + (xy 102.449432 82.152734) + (xy 102.579954 82.339141) + (xy 102.740858 82.500045) + (xy 102.740861 82.500047) + (xy 102.927266 82.630568) + (xy 103.133504 82.726739) + (xy 103.133509 82.72674) + (xy 103.133511 82.726741) + (xy 103.143334 82.729373) + (xy 103.353308 82.785635) + (xy 103.51523 82.799801) + (xy 103.579998 82.805468) + (xy 103.58 82.805468) + (xy 103.580002 82.805468) + (xy 103.636673 82.800509) + (xy 103.806692 82.785635) + (xy 104.026496 82.726739) + (xy 104.232734 82.630568) + (xy 104.419139 82.500047) + (xy 104.580047 82.339139) + (xy 104.710568 82.152734) + (xy 104.806739 81.946496) + (xy 104.865635 81.726692) + (xy 104.885468 81.5) + (xy 104.865635 81.273308) + (xy 104.806739 81.053504) + (xy 104.710568 80.847266) + (xy 104.580047 80.660861) + (xy 104.580045 80.660858) + (xy 104.419141 80.499954) + (xy 104.232734 80.369432) + (xy 104.232732 80.369431) + (xy 104.026497 80.273261) + (xy 104.026488 80.273258) + (xy 103.806697 80.214366) + (xy 103.806693 80.214365) + (xy 103.806692 80.214365) + (xy 103.806691 80.214364) + (xy 103.806686 80.214364) + (xy 103.580002 80.194532) + (xy 103.579998 80.194532) + (xy 103.353313 80.214364) + (xy 103.353302 80.214366) + (xy 103.133511 80.273258) + (xy 103.133502 80.273261) + (xy 102.927267 80.369431) + (xy 102.927265 80.369432) + (xy 102.740858 80.499954) + (xy 102.579954 80.660858) + (xy 102.449432 80.847265) + (xy 102.449431 80.847267) + (xy 102.353261 81.053502) + (xy 102.353258 81.053511) + (xy 102.294366 81.273302) + (xy 102.294364 81.273313) + (xy 102.274532 81.499998) + (xy 102.274532 81.500001) + (xy 94.725468 81.500001) + (xy 94.725468 81.5) + (xy 94.705635 81.273308) + (xy 94.646739 81.053504) + (xy 94.550568 80.847266) + (xy 94.517337 80.799807) + (xy 94.502247 80.770696) + (xy 94.481754 80.713772) + (xy 94.481751 80.713767) + (xy 94.478208 80.706812) + (xy 94.478464 80.706681) + (xy 94.476497 80.702966) + (xy 94.476244 80.703106) + (xy 94.472489 80.696276) + (xy 94.472486 80.696268) + (xy 94.431819 80.640295) + (xy 94.392924 80.583062) + (xy 94.392923 80.583061) + (xy 94.387763 80.577208) + (xy 94.387977 80.577018) + (xy 94.38514 80.5739) + (xy 94.384932 80.574097) + (xy 94.379596 80.568414) + (xy 94.326289 80.524316) + (xy 94.274383 80.478553) + (xy 94.267928 80.474167) + (xy 94.268088 80.473931) + (xy 94.264562 80.471615) + (xy 94.26441 80.471855) + (xy 94.257825 80.467676) + (xy 94.195222 80.438217) + (xy 94.126616 80.403261) + (xy 94.126653 80.403187) + (xy 94.104655 80.391783) + (xy 94.103657 80.391084) + (xy 94.072734 80.369432) + (xy 94.033784 80.351269) + (xy 93.866497 80.273261) + (xy 93.866488 80.273258) + (xy 93.646697 80.214366) + (xy 93.646693 80.214365) + (xy 93.646692 80.214365) + (xy 93.646691 80.214364) + (xy 93.646686 80.214364) + (xy 93.420002 80.194532) + (xy 93.419998 80.194532) + (xy 93.193313 80.214364) + (xy 93.193302 80.214366) + (xy 92.973511 80.273258) + (xy 92.973502 80.273261) + (xy 92.767267 80.369431) + (xy 92.767265 80.369432) + (xy 92.580858 80.499954) + (xy 92.419954 80.660858) + (xy 92.289432 80.847265) + (xy 92.289431 80.847267) + (xy 92.193261 81.053502) + (xy 92.193258 81.053511) + (xy 92.134366 81.273302) + (xy 92.134364 81.273313) + (xy 92.114532 81.499998) + (xy 92.114532 81.500001) + (xy 82.044 81.500001) + (xy 82.044 71.000001) + (xy 85.614532 71.000001) + (xy 85.634364 71.226686) + (xy 85.634366 71.226697) + (xy 85.693258 71.446488) + (xy 85.693261 71.446497) + (xy 85.789431 71.652732) + (xy 85.789432 71.652734) + (xy 85.919954 71.839141) + (xy 86.080858 72.000045) + (xy 86.080861 72.000047) + (xy 86.267266 72.130568) + (xy 86.473504 72.226739) + (xy 86.473509 72.22674) + (xy 86.473511 72.226741) + (xy 86.526415 72.240916) + (xy 86.693308 72.285635) + (xy 86.85523 72.299801) + (xy 86.919998 72.305468) + (xy 86.92 72.305468) + (xy 86.920002 72.305468) + (xy 86.976673 72.300509) + (xy 87.146692 72.285635) + (xy 87.366496 72.226739) + (xy 87.572734 72.130568) + (xy 87.759139 72.000047) + (xy 87.920047 71.839139) + (xy 88.050568 71.652734) + (xy 88.146739 71.446496) + (xy 88.205635 71.226692) + (xy 88.225468 71) + (xy 88.205635 70.773308) + (xy 88.199389 70.749999) + (xy 95.801127 70.749999) + (xy 95.801128 70.75) + (xy 96.764314 70.75) + (xy 96.752359 70.761955) + (xy 96.694835 70.874852) + (xy 96.675014 71) + (xy 96.694835 71.125148) + (xy 96.752359 71.238045) + (xy 96.764314 71.25) + (xy 95.801128 71.25) + (xy 95.85373 71.446317) + (xy 95.853734 71.446326) + (xy 95.949865 71.652482) + (xy 96.080342 71.83882) + (xy 96.241179 71.999657) + (xy 96.427517 72.130134) + (xy 96.633673 72.226265) + (xy 96.633682 72.226269) + (xy 96.829999 72.278872) + (xy 96.83 72.278871) + (xy 96.83 71.315686) + (xy 96.841955 71.327641) + (xy 96.954852 71.385165) + (xy 97.048519 71.4) + (xy 97.111481 71.4) + (xy 97.205148 71.385165) + (xy 97.318045 71.327641) + (xy 97.33 71.315686) + (xy 97.33 72.278872) + (xy 97.526317 72.226269) + (xy 97.526326 72.226265) + (xy 97.732482 72.130134) + (xy 97.91882 71.999657) + (xy 98.079657 71.83882) + (xy 98.210134 71.652482) + (xy 98.306265 71.446326) + (xy 98.306269 71.446317) + (xy 98.358872 71.25) + (xy 97.395686 71.25) + (xy 97.407641 71.238045) + (xy 97.465165 71.125148) + (xy 97.484986 71) + (xy 97.465165 70.874852) + (xy 97.407641 70.761955) + (xy 97.395686 70.75) + (xy 98.358872 70.75) + (xy 98.358872 70.749999) + (xy 98.306269 70.553682) + (xy 98.306265 70.553673) + (xy 98.210134 70.347517) + (xy 98.079657 70.161179) + (xy 97.91882 70.000342) + (xy 97.732482 69.869865) + (xy 97.526328 69.773734) + (xy 97.33 69.721127) + (xy 97.33 70.684314) + (xy 97.318045 70.672359) + (xy 97.205148 70.614835) + (xy 97.111481 70.6) + (xy 97.048519 70.6) + (xy 96.954852 70.614835) + (xy 96.841955 70.672359) + (xy 96.83 70.684314) + (xy 96.83 69.721127) + (xy 96.633671 69.773734) + (xy 96.427517 69.869865) + (xy 96.241179 70.000342) + (xy 96.080342 70.161179) + (xy 95.949865 70.347517) + (xy 95.853734 70.553673) + (xy 95.85373 70.553682) + (xy 95.801127 70.749999) + (xy 88.199389 70.749999) + (xy 88.146739 70.553504) + (xy 88.050568 70.347266) + (xy 87.920047 70.160861) + (xy 87.920045 70.160858) + (xy 87.759141 69.999954) + (xy 87.572734 69.869432) + (xy 87.572732 69.869431) + (xy 87.366497 69.773261) + (xy 87.366488 69.773258) + (xy 87.146697 69.714366) + (xy 87.146693 69.714365) + (xy 87.146692 69.714365) + (xy 87.146691 69.714364) + (xy 87.146686 69.714364) + (xy 86.920002 69.694532) + (xy 86.919998 69.694532) + (xy 86.693313 69.714364) + (xy 86.693302 69.714366) + (xy 86.473511 69.773258) + (xy 86.473502 69.773261) + (xy 86.267267 69.869431) + (xy 86.267265 69.869432) + (xy 86.080858 69.999954) + (xy 85.919954 70.160858) + (xy 85.789432 70.347265) + (xy 85.789431 70.347267) + (xy 85.693261 70.553502) + (xy 85.693258 70.553511) + (xy 85.634366 70.773302) + (xy 85.634364 70.773313) + (xy 85.614532 70.999998) + (xy 85.614532 71.000001) + (xy 82.044 71.000001) + (xy 82.044 66.000001) + (xy 85.694532 66.000001) + (xy 85.714364 66.226686) + (xy 85.714366 66.226697) + (xy 85.773258 66.446488) + (xy 85.773261 66.446497) + (xy 85.869431 66.652732) + (xy 85.869432 66.652734) + (xy 85.999954 66.839141) + (xy 86.160858 67.000045) + (xy 86.181729 67.014659) + (xy 86.347266 67.130568) + (xy 86.553504 67.226739) + (xy 86.773308 67.285635) + (xy 86.93523 67.299801) + (xy 86.999998 67.305468) + (xy 87 67.305468) + (xy 87.000002 67.305468) + (xy 87.056673 67.300509) + (xy 87.226692 67.285635) + (xy 87.446496 67.226739) + (xy 87.652734 67.130568) + (xy 87.839139 67.000047) + (xy 88.000047 66.839139) + (xy 88.094336 66.704479) + (xy 88.112613 66.678377) + (xy 88.167189 66.634752) + (xy 88.214188 66.6255) + (xy 93.890357 66.6255) + (xy 93.905977 66.627224) + (xy 93.906004 66.626939) + (xy 93.91376 66.627671) + (xy 93.913767 66.627673) + (xy 93.982914 66.6255) + (xy 94.01245 66.6255) + (xy 94.019328 66.62463) + (xy 94.025141 66.624172) + (xy 94.071727 66.622709) + (xy 94.090969 66.617117) + (xy 94.110012 66.613174) + (xy 94.129892 66.610664) + (xy 94.173222 66.593507) + (xy 94.178746 66.591617) + (xy 94.182496 66.590527) + (xy 94.22349 66.578618) + (xy 94.240729 66.568422) + (xy 94.258203 66.559862) + (xy 94.276827 66.552488) + (xy 94.276827 66.552487) + (xy 94.276832 66.552486) + (xy 94.314549 66.525082) + (xy 94.319405 66.521892) + (xy 94.35952 66.49817) + (xy 94.373689 66.483999) + (xy 94.388479 66.471368) + (xy 94.404687 66.459594) + (xy 94.434399 66.423676) + (xy 94.438312 66.419376) + (xy 95.107689 65.749999) + (xy 95.881127 65.749999) + (xy 95.881128 65.75) + (xy 96.844314 65.75) + (xy 96.832359 65.761955) + (xy 96.774835 65.874852) + (xy 96.755014 66) + (xy 96.774835 66.125148) + (xy 96.832359 66.238045) + (xy 96.844314 66.25) + (xy 95.881128 66.25) + (xy 95.93373 66.446317) + (xy 95.933734 66.446326) + (xy 96.029865 66.652482) + (xy 96.160342 66.83882) + (xy 96.321179 66.999657) + (xy 96.507517 67.130134) + (xy 96.713673 67.226265) + (xy 96.713682 67.226269) + (xy 96.909999 67.278872) + (xy 96.91 67.278871) + (xy 96.91 66.315686) + (xy 96.921955 66.327641) + (xy 97.034852 66.385165) + (xy 97.128519 66.4) + (xy 97.191481 66.4) + (xy 97.285148 66.385165) + (xy 97.398045 66.327641) + (xy 97.41 66.315686) + (xy 97.41 67.278872) + (xy 97.606317 67.226269) + (xy 97.606326 67.226265) + (xy 97.812482 67.130134) + (xy 97.99882 66.999657) + (xy 98.159657 66.83882) + (xy 98.290134 66.652482) + (xy 98.386265 66.446326) + (xy 98.386269 66.446317) + (xy 98.438872 66.25) + (xy 97.475686 66.25) + (xy 97.487641 66.238045) + (xy 97.545165 66.125148) + (xy 97.564986 66) + (xy 97.545165 65.874852) + (xy 97.487641 65.761955) + (xy 97.475686 65.75) + (xy 98.438872 65.75) + (xy 98.438872 65.749999) + (xy 98.386269 65.553682) + (xy 98.386265 65.553673) + (xy 98.290134 65.347517) + (xy 98.159657 65.161179) + (xy 97.99882 65.000342) + (xy 97.812482 64.869865) + (xy 97.606328 64.773734) + (xy 97.41 64.721127) + (xy 97.41 65.684314) + (xy 97.398045 65.672359) + (xy 97.285148 65.614835) + (xy 97.191481 65.6) + (xy 97.128519 65.6) + (xy 97.034852 65.614835) + (xy 96.921955 65.672359) + (xy 96.91 65.684314) + (xy 96.91 64.721127) + (xy 96.713671 64.773734) + (xy 96.507517 64.869865) + (xy 96.321179 65.000342) + (xy 96.160342 65.161179) + (xy 96.029865 65.347517) + (xy 95.933734 65.553673) + (xy 95.93373 65.553682) + (xy 95.881127 65.749999) + (xy 95.107689 65.749999) + (xy 99.600012 61.257676) + (xy 99.661333 61.224193) + (xy 99.731025 61.229177) + (xy 99.786958 61.271049) + (xy 99.803873 61.302026) + (xy 99.856202 61.442328) + (xy 99.856206 61.442335) + (xy 99.942452 61.557544) + (xy 99.942455 61.557547) + (xy 100.057664 61.643793) + (xy 100.057671 61.643797) + (xy 100.192517 61.694091) + (xy 100.192516 61.694091) + (xy 100.199444 61.694835) + (xy 100.252127 61.7005) + (xy 102.747872 61.700499) + (xy 102.807483 61.694091) + (xy 102.942331 61.643796) + (xy 103.057546 61.557546) + (xy 103.143796 61.442331) + (xy 103.194091 61.307483) + (xy 103.2005 61.247873) + (xy 103.200499 58.752128) + (xy 103.194091 58.692517) + (xy 103.184487 58.666768) + (xy 103.143797 58.557671) + (xy 103.143793 58.557664) + (xy 103.057547 58.442455) + (xy 103.057544 58.442452) + (xy 102.942335 58.356206) + (xy 102.942328 58.356202) + (xy 102.807482 58.305908) + (xy 102.807483 58.305908) + (xy 102.747883 58.299501) + (xy 102.747881 58.2995) + (xy 102.747873 58.2995) + (xy 102.747864 58.2995) + (xy 100.252129 58.2995) + (xy 100.252123 58.299501) + (xy 100.192516 58.305908) + (xy 100.057671 58.356202) + (xy 100.057664 58.356206) + (xy 99.942455 58.442452) + (xy 99.942452 58.442455) + (xy 99.856206 58.557664) + (xy 99.856202 58.557671) + (xy 99.805908 58.692517) + (xy 99.799501 58.752116) + (xy 99.799501 58.752123) + (xy 99.7995 58.752135) + (xy 99.7995 59.3067) + (xy 99.779815 59.373739) + (xy 99.729418 59.417407) + (xy 99.729422 59.417413) + (xy 99.729392 59.41743) + (xy 99.727011 59.419494) + (xy 99.724746 59.420502) + (xy 99.722704 59.421385) + (xy 99.705465 59.43158) + (xy 99.687998 59.440137) + (xy 99.669369 59.447512) + (xy 99.669367 59.447513) + (xy 99.631664 59.474906) + (xy 99.626782 59.478112) + (xy 99.58668 59.501828) + (xy 99.572508 59.516) + (xy 99.557723 59.528628) + (xy 99.541512 59.540407) + (xy 99.511809 59.57631) + (xy 99.507876 59.580631) + (xy 96.614606 62.473903) + (xy 93.750328 65.338181) + (xy 93.689005 65.371666) + (xy 93.662647 65.3745) + (xy 88.214188 65.3745) + (xy 88.147149 65.354815) + (xy 88.112613 65.321623) + (xy 88.000045 65.160858) + (xy 87.839141 64.999954) + (xy 87.652734 64.869432) + (xy 87.652732 64.869431) + (xy 87.446497 64.773261) + (xy 87.446488 64.773258) + (xy 87.226697 64.714366) + (xy 87.226693 64.714365) + (xy 87.226692 64.714365) + (xy 87.226691 64.714364) + (xy 87.226686 64.714364) + (xy 87.000002 64.694532) + (xy 86.999998 64.694532) + (xy 86.773313 64.714364) + (xy 86.773302 64.714366) + (xy 86.553511 64.773258) + (xy 86.553502 64.773261) + (xy 86.347267 64.869431) + (xy 86.347265 64.869432) + (xy 86.160858 64.999954) + (xy 85.999954 65.160858) + (xy 85.869432 65.347265) + (xy 85.869431 65.347267) + (xy 85.773261 65.553502) + (xy 85.773258 65.553511) + (xy 85.714366 65.773302) + (xy 85.714364 65.773313) + (xy 85.694532 65.999998) + (xy 85.694532 66.000001) + (xy 82.044 66.000001) + (xy 82.044 55.000001) + (xy 86.614532 55.000001) + (xy 86.634364 55.226686) + (xy 86.634366 55.226697) + (xy 86.693258 55.446488) + (xy 86.693261 55.446497) + (xy 86.789431 55.652732) + (xy 86.789432 55.652734) + (xy 86.919954 55.839141) + (xy 87.080858 56.000045) + (xy 87.080861 56.000047) + (xy 87.267266 56.130568) + (xy 87.473504 56.226739) + (xy 87.693308 56.285635) + (xy 87.85523 56.299801) + (xy 87.919998 56.305468) + (xy 87.92 56.305468) + (xy 87.920002 56.305468) + (xy 87.976673 56.300509) + (xy 88.146692 56.285635) + (xy 88.366496 56.226739) + (xy 88.572734 56.130568) + (xy 88.759139 56.000047) + (xy 88.920047 55.839139) + (xy 89.050568 55.652734) + (xy 89.146739 55.446496) + (xy 89.205635 55.226692) + (xy 89.225468 55.000001) + (xy 96.774532 55.000001) + (xy 96.794364 55.226686) + (xy 96.794366 55.226697) + (xy 96.853258 55.446488) + (xy 96.853261 55.446497) + (xy 96.949431 55.652732) + (xy 96.949432 55.652734) + (xy 97.079954 55.839141) + (xy 97.240858 56.000045) + (xy 97.240861 56.000047) + (xy 97.427266 56.130568) + (xy 97.633504 56.226739) + (xy 97.853308 56.285635) + (xy 98.01523 56.299801) + (xy 98.079998 56.305468) + (xy 98.08 56.305468) + (xy 98.080002 56.305468) + (xy 98.136673 56.300509) + (xy 98.306692 56.285635) + (xy 98.526496 56.226739) + (xy 98.732734 56.130568) + (xy 98.919139 56.000047) + (xy 99.080047 55.839139) + (xy 99.210568 55.652734) + (xy 99.306739 55.446496) + (xy 99.365635 55.226692) + (xy 99.385468 55) + (xy 99.365635 54.773308) + (xy 99.306739 54.553504) + (xy 99.210568 54.347266) + (xy 99.080047 54.160861) + (xy 99.080045 54.160858) + (xy 98.919141 53.999954) + (xy 98.732734 53.869432) + (xy 98.732732 53.869431) + (xy 98.526497 53.773261) + (xy 98.526488 53.773258) + (xy 98.306697 53.714366) + (xy 98.306693 53.714365) + (xy 98.306692 53.714365) + (xy 98.306691 53.714364) + (xy 98.306686 53.714364) + (xy 98.080002 53.694532) + (xy 98.079998 53.694532) + (xy 97.853313 53.714364) + (xy 97.853302 53.714366) + (xy 97.633511 53.773258) + (xy 97.633502 53.773261) + (xy 97.427267 53.869431) + (xy 97.427265 53.869432) + (xy 97.240858 53.999954) + (xy 97.079954 54.160858) + (xy 96.949432 54.347265) + (xy 96.949431 54.347267) + (xy 96.853261 54.553502) + (xy 96.853258 54.553511) + (xy 96.794366 54.773302) + (xy 96.794364 54.773313) + (xy 96.774532 54.999998) + (xy 96.774532 55.000001) + (xy 89.225468 55.000001) + (xy 89.225468 55) + (xy 89.205635 54.773308) + (xy 89.146739 54.553504) + (xy 89.050568 54.347266) + (xy 88.920047 54.160861) + (xy 88.920045 54.160858) + (xy 88.759141 53.999954) + (xy 88.572734 53.869432) + (xy 88.572732 53.869431) + (xy 88.366497 53.773261) + (xy 88.366488 53.773258) + (xy 88.146697 53.714366) + (xy 88.146693 53.714365) + (xy 88.146692 53.714365) + (xy 88.146691 53.714364) + (xy 88.146686 53.714364) + (xy 87.920002 53.694532) + (xy 87.919998 53.694532) + (xy 87.693313 53.714364) + (xy 87.693302 53.714366) + (xy 87.473511 53.773258) + (xy 87.473502 53.773261) + (xy 87.267267 53.869431) + (xy 87.267265 53.869432) + (xy 87.080858 53.999954) + (xy 86.919954 54.160858) + (xy 86.789432 54.347265) + (xy 86.789431 54.347267) + (xy 86.693261 54.553502) + (xy 86.693258 54.553511) + (xy 86.634366 54.773302) + (xy 86.634364 54.773313) + (xy 86.614532 54.999998) + (xy 86.614532 55.000001) + (xy 82.044 55.000001) + (xy 82.044 47.132) + (xy 82.063685 47.064961) + (xy 82.116489 47.019206) + (xy 82.168 47.008) + (xy 128.799879 47.008) + ) + ) + ) +) diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_prl b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_prl new file mode 100644 index 0000000000..d8a0e67e44 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_prl @@ -0,0 +1,77 @@ +{ + "board": { + "active_layer": 31, + "active_layer_preset": "All Layers", + "auto_track_width": false, + "hidden_netclasses": [], + "hidden_nets": [], + "high_contrast_mode": 0, + "net_color_mode": 1, + "opacity": { + "images": 0.6, + "pads": 1.0, + "tracks": 0.800000011920929, + "vias": 1.0, + "zones": 0.6 + }, + "selection_filter": { + "dimensions": true, + "footprints": true, + "graphics": true, + "keepouts": true, + "lockedItems": false, + "otherItems": true, + "pads": true, + "text": true, + "tracks": true, + "vias": true, + "zones": true + }, + "visible_items": [ + 0, + 1, + 2, + 3, + 4, + 5, + 8, + 9, + 10, + 11, + 12, + 13, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 32, + 33, + 34, + 35, + 36, + 39, + 40 + ], + "visible_layers": "fffffff_ffffffff", + "zone_display_mode": 0 + }, + "meta": { + "filename": "SeaTalk1.kicad_prl", + "version": 3 + }, + "project": { + "files": [] + } +} diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pro b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pro new file mode 100644 index 0000000000..7a3969c3d3 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_pro @@ -0,0 +1,491 @@ +{ + "board": { + "3dviewports": [], + "design_settings": { + "defaults": { + "board_outline_line_width": 0.09999999999999999, + "copper_line_width": 0.19999999999999998, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.049999999999999996, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": false, + "text_position": 0, + "units_format": 1 + }, + "fab_line_width": 0.09999999999999999, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.15, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.762, + "height": 1.524, + "width": 1.524 + }, + "silk_line_width": 0.15, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.15, + "silk_text_upright": false, + "zones": { + "min_clearance": 0.5 + } + }, + "diff_pair_dimensions": [], + "drc_exclusions": [ + "starved_thermal|132540000|53580000|0439734c-1f86-4b67-9c14-36cdfe2e2799|01717d6d-6600-4cb3-8880-34ec125e8282|B.Cu", + "starved_thermal|132540000|63740000|0439734c-1f86-4b67-9c14-36cdfe2e2799|43c6842c-1f58-4b5a-aa64-cc798e2a154e|B.Cu", + "starved_thermal|132540000|71360000|0439734c-1f86-4b67-9c14-36cdfe2e2799|304e0b03-1cea-4d23-91a2-dc41d5ce210d|B.Cu", + "starved_thermal|132540000|84060000|0439734c-1f86-4b67-9c14-36cdfe2e2799|41884a76-5a3d-4fec-97a3-f190dcb4359e|B.Cu", + "starved_thermal|132540000|89140000|0439734c-1f86-4b67-9c14-36cdfe2e2799|de446f11-bb46-40f4-b427-395e6936a157|B.Cu" + ], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_type_mismatch": "ignore", + "hole_clearance": "error", + "hole_near_hole": "error", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "warning", + "lib_footprint_mismatch": "warning", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "warning", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_dangling": "warning", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "max_error": 0.005, + "min_clearance": 0.19999999999999998, + "min_connection": 0.19999999999999998, + "min_copper_edge_clearance": 1.0, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.19999999999999998, + "min_microvia_drill": 0.09999999999999999, + "min_resolved_spokes": 2, + "min_silk_clearance": 0.0, + "min_text_height": 0.7999999999999999, + "min_text_thickness": 0.08, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.19999999999999998, + "min_via_annular_width": 0.09999999999999999, + "min_via_diameter": 0.5, + "solder_mask_clearance": 0.0, + "solder_mask_min_width": 0.0, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 5, + "td_on_pad_in_zone": false, + "td_onpadsmd": true, + "td_onroundshapesonly": false, + "td_ontrackend": false, + "td_onviapad": true + } + ], + "teardrop_parameters": [ + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [], + "via_dimensions": [], + "zones_allow_external_fillets": false + }, + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "warning", + "pin_not_driven": "error", + "pin_to_pin": "error", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "simulation_model_issue": "warning", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "SeaTalk1.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.25, + "via_diameter": 0.8, + "via_drill": 0.4, + "wire_width": 6 + } + ], + "meta": { + "version": 3 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [] + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "specctra_dsn": "", + "step": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "ngspice": { + "fix_include_paths": true, + "meta": { + "version": 0 + }, + "model_mode": 1, + "workbook_filename": "SeaTalk1.wbk" + }, + "page_layout_descr_file": "", + "plot_directory": "", + "spice_current_sheet_as_root": false, + "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_voltages": false, + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "fef6b826-4a15-4295-9e8e-e163f69cffe7", + "" + ] + ], + "text_variables": {} +} diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_sch b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_sch new file mode 100644 index 0000000000..e90bbd5825 --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.kicad_sch @@ -0,0 +1,2762 @@ +(kicad_sch (version 20230121) (generator eeschema) + + (uuid fef6b826-4a15-4295-9e8e-e163f69cffe7) + + (paper "A4") + + (title_block + (title "Seatalk1 Interface") + (date "2023-12-27") + (rev "1") + (comment 1 "This schematic is available under the MIT license") + ) + + (lib_symbols + (symbol "Connector:Conn_01x03_Pin" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (at 0 5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x03_Pin" (at 0 -5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_locked" "" (at 0 0 0) + (effects (font (size 1.27 1.27))) + ) + (property "ki_keywords" "connector" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, single row, 01x03, script generated" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_01x03_Pin_1_1" + (polyline + (pts + (xy 1.27 -2.54) + (xy 0.8636 -2.54) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 0) + (xy 0.8636 0) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 2.54) + (xy 0.8636 2.54) + ) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 0.8636 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 0.127) (end 0 -0.127) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (rectangle (start 0.8636 2.667) (end 0 2.413) + (stroke (width 0.1524) (type default)) + (fill (type outline)) + ) + (pin passive line (at 5.08 2.54 180) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 0 180) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -2.54 180) (length 3.81) + (name "Pin_3" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector:Raspberry_Pi_2_3" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) + (property "Reference" "J" (at -17.78 31.75 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + ) + (property "Value" "Raspberry_Pi_2_3" (at 10.16 -31.75 0) + (effects (font (size 1.27 1.27)) (justify left top)) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "raspberrypi gpio" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "expansion header for Raspberry Pi 2 & 3" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "PinHeader*2x20*P2.54mm*Vertical* PinSocket*2x20*P2.54mm*Vertical*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Raspberry_Pi_2_3_0_1" + (rectangle (start -17.78 30.48) (end 17.78 -30.48) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + ) + (symbol "Raspberry_Pi_2_3_1_1" + (rectangle (start -16.891 -17.526) (end -17.78 -18.034) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 -14.986) (end -17.78 -15.494) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 -12.446) (end -17.78 -12.954) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 -9.906) (end -17.78 -10.414) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 -7.366) (end -17.78 -7.874) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 -4.826) (end -17.78 -5.334) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 0.254) (end -17.78 -0.254) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 2.794) (end -17.78 2.286) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 5.334) (end -17.78 4.826) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 10.414) (end -17.78 9.906) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 12.954) (end -17.78 12.446) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 15.494) (end -17.78 14.986) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 20.574) (end -17.78 20.066) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -16.891 23.114) (end -17.78 22.606) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -10.414 -29.591) (end -9.906 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -7.874 -29.591) (end -7.366 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -5.334 -29.591) (end -4.826 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -5.334 30.48) (end -4.826 29.591) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -2.794 -29.591) (end -2.286 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -2.794 30.48) (end -2.286 29.591) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start -0.254 -29.591) (end 0.254 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 2.286 -29.591) (end 2.794 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 2.286 30.48) (end 2.794 29.591) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 4.826 -29.591) (end 5.334 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 4.826 30.48) (end 5.334 29.591) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 7.366 -29.591) (end 7.874 -30.48) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -20.066) (end 16.891 -20.574) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -17.526) (end 16.891 -18.034) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -12.446) (end 16.891 -12.954) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -9.906) (end 16.891 -10.414) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -7.366) (end 16.891 -7.874) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -4.826) (end 16.891 -5.334) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 -2.286) (end 16.891 -2.794) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 2.794) (end 16.891 2.286) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 5.334) (end 16.891 4.826) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 7.874) (end 16.891 7.366) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 12.954) (end 16.891 12.446) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 15.494) (end 16.891 14.986) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 20.574) (end 16.891 20.066) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 17.78 23.114) (end 16.891 22.606) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (pin power_in line (at 2.54 33.02 270) (length 2.54) + (name "3V3" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 20.32 0) (length 2.54) + (name "GPIO15/RXD" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 12.7 0) (length 2.54) + (name "GPIO17" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 10.16 0) (length 2.54) + (name "GPIO18/PWM0" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -17.78 0) (length 2.54) + (name "GPIO27" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -5.08 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -5.08 0) (length 2.54) + (name "GPIO22" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -7.62 0) (length 2.54) + (name "GPIO23" (effects (font (size 1.27 1.27)))) + (number "16" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 5.08 33.02 270) (length 2.54) + (name "3V3" (effects (font (size 1.27 1.27)))) + (number "17" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -10.16 0) (length 2.54) + (name "GPIO24" (effects (font (size 1.27 1.27)))) + (number "18" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -10.16 180) (length 2.54) + (name "MOSI0/GPIO10" (effects (font (size 1.27 1.27)))) + (number "19" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -5.08 33.02 270) (length 2.54) + (name "5V" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -2.54 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "20" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -7.62 180) (length 2.54) + (name "MISO0/GPIO9" (effects (font (size 1.27 1.27)))) + (number "21" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -12.7 0) (length 2.54) + (name "GPIO25" (effects (font (size 1.27 1.27)))) + (number "22" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -12.7 180) (length 2.54) + (name "SCLK0/GPIO11" (effects (font (size 1.27 1.27)))) + (number "23" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -5.08 180) (length 2.54) + (name "~{CE0}/GPIO8" (effects (font (size 1.27 1.27)))) + (number "24" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 0 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "25" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -2.54 180) (length 2.54) + (name "~{CE1}/GPIO7" (effects (font (size 1.27 1.27)))) + (number "26" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 22.86 180) (length 2.54) + (name "ID_SD/GPIO0" (effects (font (size 1.27 1.27)))) + (number "27" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 20.32 180) (length 2.54) + (name "ID_SC/GPIO1" (effects (font (size 1.27 1.27)))) + (number "28" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 5.08 180) (length 2.54) + (name "GCLK1/GPIO5" (effects (font (size 1.27 1.27)))) + (number "29" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 15.24 180) (length 2.54) + (name "SDA/GPIO2" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 2.54 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "30" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 2.54 180) (length 2.54) + (name "GCLK2/GPIO6" (effects (font (size 1.27 1.27)))) + (number "31" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -17.78 180) (length 2.54) + (name "PWM0/GPIO12" (effects (font (size 1.27 1.27)))) + (number "32" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 -20.32 180) (length 2.54) + (name "PWM1/GPIO13" (effects (font (size 1.27 1.27)))) + (number "33" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 5.08 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "34" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 5.08 0) (length 2.54) + (name "GPIO19/MISO1" (effects (font (size 1.27 1.27)))) + (number "35" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 15.24 0) (length 2.54) + (name "GPIO16" (effects (font (size 1.27 1.27)))) + (number "36" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 -15.24 0) (length 2.54) + (name "GPIO26" (effects (font (size 1.27 1.27)))) + (number "37" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 2.54 0) (length 2.54) + (name "GPIO20/MOSI1" (effects (font (size 1.27 1.27)))) + (number "38" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 7.62 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "39" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -2.54 33.02 270) (length 2.54) + (name "5V" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 0 0) (length 2.54) + (name "GPIO21/SCLK1" (effects (font (size 1.27 1.27)))) + (number "40" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 12.7 180) (length 2.54) + (name "SCL/GPIO3" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -10.16 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 20.32 7.62 180) (length 2.54) + (name "GCLK0/GPIO4" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -20.32 22.86 0) (length 2.54) + (name "GPIO14/TXD" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -7.62 -33.02 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:C_Polarized" (pin_numbers hide) (pin_names (offset 0.254)) (in_bom yes) (on_board yes) + (property "Reference" "C" (at 0.635 2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "C_Polarized" (at 0.635 -2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 0.9652 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "cap capacitor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Polarized capacitor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "CP_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "C_Polarized_0_1" + (rectangle (start -2.286 0.508) (end 2.286 1.016) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.778 2.286) + (xy -0.762 2.286) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.27 2.794) + (xy -1.27 1.778) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (rectangle (start 2.286 -0.508) (end -2.286 -1.016) + (stroke (width 0) (type default)) + (fill (type outline)) + ) + ) + (symbol "C_Polarized_1_1" + (pin passive line (at 0 3.81 270) (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:LED" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "D" (at 0 2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "LED" (at 0 -2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "LED diode" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Light emitting diode" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "LED_0_1" + (polyline + (pts + (xy -1.27 -1.27) + (xy -1.27 1.27) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.27 0) + (xy 1.27 0) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -1.27) + (xy 1.27 1.27) + (xy -1.27 0) + (xy 1.27 -1.27) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -3.048 -0.762) + (xy -4.572 -2.286) + (xy -3.81 -2.286) + (xy -4.572 -2.286) + (xy -4.572 -1.524) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.778 -0.762) + (xy -3.302 -2.286) + (xy -2.54 -2.286) + (xy -3.302 -2.286) + (xy -3.302 -1.524) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "LED_1_1" + (pin passive line (at -3.81 0 0) (length 2.54) + (name "K" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 3.81 0 180) (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "R" (at 2.032 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "R" (at 0 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at -1.778 0 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "R res resistor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Resistor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "R_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "R_0_1" + (rectangle (start -1.016 -2.54) (end 1.016 2.54) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + ) + (symbol "R_1_1" + (pin passive line (at 0 3.81 270) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Simulation_SPICE:0" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#GND" (at 0 -2.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "0" (at 0 -1.778 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "simulation" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "0V reference potential for simulation" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "0_0_1" + (polyline + (pts + (xy -1.27 0) + (xy 0 -1.27) + (xy 1.27 0) + (xy -1.27 0) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "0_1_1" + (pin power_in line (at 0 0 0) (length 0) hide + (name "0" (effects (font (size 1.016 1.016)))) + (number "1" (effects (font (size 1.016 1.016)))) + ) + ) + ) + (symbol "Simulation_SPICE:VDC" (pin_numbers hide) (pin_names (offset 0.0254)) (in_bom yes) (on_board yes) + (property "Reference" "V" (at 2.54 2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1" (at 2.54 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "DC" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "simulation" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Voltage source, DC" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "VDC_0_0" + (polyline + (pts + (xy -1.27 0.254) + (xy 1.27 0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -0.762 -0.254) + (xy -1.27 -0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.254 -0.254) + (xy -0.254 -0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -0.254) + (xy 0.762 -0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (text "+" (at 0 1.905 0) + (effects (font (size 1.27 1.27))) + ) + ) + (symbol "VDC_0_1" + (circle (center 0 0) (radius 2.54) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + ) + (symbol "VDC_1_1" + (pin passive line (at 0 5.08 270) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -5.08 90) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Simulation_SPICE:VPULSE" (pin_numbers hide) (pin_names (offset 0.0254)) (in_bom yes) (on_board yes) + (property "Reference" "V" (at 2.54 2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "VPULSE" (at 2.54 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "PULSE" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Params" "y1=0 y2=1 td=2n tr=2n tf=2n tw=50n per=100n" (at 2.54 -2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "ki_keywords" "simulation" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Voltage source, pulse" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "VPULSE_0_0" + (polyline + (pts + (xy -2.032 -0.762) + (xy -1.397 -0.762) + (xy -1.143 0.762) + (xy -0.127 0.762) + (xy 0.127 -0.762) + (xy 1.143 -0.762) + (xy 1.397 0.762) + (xy 2.032 0.762) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (text "+" (at 0 1.905 0) + (effects (font (size 1.27 1.27))) + ) + ) + (symbol "VPULSE_0_1" + (circle (center 0 0) (radius 2.54) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + ) + (symbol "VPULSE_1_1" + (pin passive line (at 0 5.08 270) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -5.08 90) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Transistor_BJT:BC547" (pin_names (offset 0) hide) (in_bom yes) (on_board yes) + (property "Reference" "Q" (at 5.08 1.905 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 5.08 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 5.08 -1.905 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "NPN Transistor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?92*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "BC547_0_1" + (polyline + (pts + (xy 0 0) + (xy 0.635 0) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 0.635) + (xy 2.54 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 -0.635) + (xy 2.54 -2.54) + (xy 2.54 -2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 1.905) + (xy 0.635 -1.905) + (xy 0.635 -1.905) + ) + (stroke (width 0.508) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -1.778) + (xy 1.778 -1.27) + (xy 2.286 -2.286) + (xy 1.27 -1.778) + (xy 1.27 -1.778) + ) + (stroke (width 0) (type default)) + (fill (type outline)) + ) + (circle (center 1.27 0) (radius 2.8194) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + ) + (symbol "BC547_1_1" + (pin passive line (at 2.54 5.08 270) (length 2.54) + (name "C" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -5.08 0 0) (length 5.08) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 -5.08 90) (length 2.54) + (name "E" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Transistor_BJT:BC557" (pin_names (offset 0) hide) (in_bom yes) (on_board yes) + (property "Reference" "Q" (at 5.08 1.905 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC557" (at 5.08 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 5.08 -1.905 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC556BTA-D.pdf" (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "PNP Transistor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "0.1A Ic, 45V Vce, PNP Small Signal Transistor, TO-92" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?92*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "BC557_0_1" + (polyline + (pts + (xy 0.635 0.635) + (xy 2.54 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 -0.635) + (xy 2.54 -2.54) + (xy 2.54 -2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 1.905) + (xy 0.635 -1.905) + (xy 0.635 -1.905) + ) + (stroke (width 0.508) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.286 -1.778) + (xy 1.778 -2.286) + (xy 1.27 -1.27) + (xy 2.286 -1.778) + (xy 2.286 -1.778) + ) + (stroke (width 0) (type default)) + (fill (type outline)) + ) + (circle (center 1.27 0) (radius 2.8194) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + ) + (symbol "BC557_1_1" + (pin passive line (at 2.54 5.08 270) (length 2.54) + (name "C" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -5.08 0 0) (length 5.715) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 -5.08 90) (length 2.54) + (name "E" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + ) + + (junction (at 124.46 71.12) (diameter 0) (color 0 0 0 0) + (uuid 028aff48-ca27-466e-9422-74624f32b8cd) + ) + (junction (at 241.3 91.44) (diameter 0) (color 0 0 0 0) + (uuid 1bd6faf5-4bcf-4469-a296-cc4f8440ffc6) + ) + (junction (at 129.54 100.33) (diameter 0) (color 0 0 0 0) + (uuid 1d5b8504-e375-4cd5-8629-f63c0589cfe0) + ) + (junction (at 148.59 19.05) (diameter 0) (color 0 0 0 0) + (uuid 1edc3883-1a25-415d-a670-4f9ec9685d65) + ) + (junction (at 228.6 91.44) (diameter 0) (color 0 0 0 0) + (uuid 2add554f-bc83-4d86-bf9c-de1d81a86847) + ) + (junction (at 236.22 161.29) (diameter 0) (color 0 0 0 0) + (uuid 2c3a7927-41d0-47b5-bc63-3a1da5f562c0) + ) + (junction (at 241.3 19.05) (diameter 0) (color 0 0 0 0) + (uuid 333af6be-105f-445a-8f3e-7e986caf4e58) + ) + (junction (at 168.91 100.33) (diameter 0) (color 0 0 0 0) + (uuid 3f6cc0ad-4335-47bd-b211-8a6bf336c025) + ) + (junction (at 168.91 115.57) (diameter 0) (color 0 0 0 0) + (uuid 48ec1d09-fa57-46c9-a54d-1785131bde38) + ) + (junction (at 124.46 62.23) (diameter 0) (color 0 0 0 0) + (uuid 4c622de1-cfc3-4e54-8fc9-64c3a58efa2b) + ) + (junction (at 85.09 53.34) (diameter 0) (color 0 0 0 0) + (uuid 60ad26a4-e5a2-4756-8545-cb8a8d066d88) + ) + (junction (at 93.98 91.44) (diameter 0) (color 0 0 0 0) + (uuid 63fe69d5-daec-4ed7-b05f-c3dc00e2414b) + ) + (junction (at 134.62 91.44) (diameter 0) (color 0 0 0 0) + (uuid 67635d2e-145c-4c1d-baec-0db0d64f69dd) + ) + (junction (at 93.98 22.86) (diameter 0) (color 0 0 0 0) + (uuid 6f997379-7c7b-4a48-8f4b-8cc545de0b46) + ) + (junction (at 78.74 91.44) (diameter 0) (color 0 0 0 0) + (uuid 6fde8244-ba92-4977-b00e-d5e5037505c0) + ) + (junction (at 104.14 91.44) (diameter 0) (color 0 0 0 0) + (uuid 913843ae-a42d-4ec5-bc54-9bb74f618eb8) + ) + (junction (at 248.92 161.29) (diameter 0) (color 0 0 0 0) + (uuid 99cee904-8167-43d9-b5a1-75d8d52fa7af) + ) + (junction (at 148.59 120.65) (diameter 0) (color 0 0 0 0) + (uuid 9e4eddb0-78e8-40fb-a65e-89bf9efd3ed3) + ) + (junction (at 104.14 71.12) (diameter 0) (color 0 0 0 0) + (uuid a0a84e92-30a2-487e-a1ae-a95c01d2941d) + ) + (junction (at 124.46 91.44) (diameter 0) (color 0 0 0 0) + (uuid a7d268f7-32e9-4092-9d89-5d1361add476) + ) + (junction (at 55.88 69.85) (diameter 0) (color 0 0 0 0) + (uuid af59d873-87f6-4b6b-9c63-7a90ce8852c2) + ) + (junction (at 233.68 22.86) (diameter 0) (color 0 0 0 0) + (uuid bb34be9b-b9cd-40cd-97fe-549557c0e323) + ) + (junction (at 238.76 91.44) (diameter 0) (color 0 0 0 0) + (uuid bd060b68-f50f-4a4b-a001-e41b25bba6b6) + ) + (junction (at 71.12 67.31) (diameter 0) (color 0 0 0 0) + (uuid c88283da-9c13-4284-836e-75cf6bab38a8) + ) + (junction (at 262.89 161.29) (diameter 0) (color 0 0 0 0) + (uuid cb75efd0-5091-475c-b9a4-a383ad8715b8) + ) + (junction (at 113.03 125.73) (diameter 0) (color 0 0 0 0) + (uuid d1f7b90a-841d-429a-97bc-3ef1f3ad9d22) + ) + (junction (at 243.84 91.44) (diameter 0) (color 0 0 0 0) + (uuid d51a1750-dc4f-4048-97ed-fa6d6ef5d6da) + ) + (junction (at 148.59 100.33) (diameter 0) (color 0 0 0 0) + (uuid d5f51a30-dfcb-4196-aac5-a0d7f0bc744c) + ) + (junction (at 93.98 71.12) (diameter 0) (color 0 0 0 0) + (uuid d736eead-cbaa-43b0-8dc3-22839d3ea164) + ) + (junction (at 148.59 39.37) (diameter 0) (color 0 0 0 0) + (uuid d98e79d0-b38e-41be-9a19-ca676cc54129) + ) + (junction (at 231.14 22.86) (diameter 0) (color 0 0 0 0) + (uuid da35b086-93cc-486a-90d1-17aa47b306d8) + ) + (junction (at 231.14 91.44) (diameter 0) (color 0 0 0 0) + (uuid dbea0063-2988-4ef5-b7fd-ef6aadf5096d) + ) + (junction (at 236.22 91.44) (diameter 0) (color 0 0 0 0) + (uuid e434f566-99fd-4163-ab46-60221e8ba1c6) + ) + (junction (at 233.68 91.44) (diameter 0) (color 0 0 0 0) + (uuid e642a0de-7bac-4eeb-a493-b1206ed4421b) + ) + (junction (at 148.59 160.02) (diameter 0) (color 0 0 0 0) + (uuid e7916721-4296-490d-8c91-bb53f40e85d3) + ) + (junction (at 71.12 53.34) (diameter 0) (color 0 0 0 0) + (uuid e7c05ab6-2bd8-49c0-a635-d0d1fd09c595) + ) + (junction (at 226.06 91.44) (diameter 0) (color 0 0 0 0) + (uuid e8fb63b5-ae2c-42e1-96ce-007c7f91b427) + ) + (junction (at 113.03 160.02) (diameter 0) (color 0 0 0 0) + (uuid ea535c8c-76c3-4fbb-b79e-0dea7f5993cc) + ) + (junction (at 148.59 91.44) (diameter 0) (color 0 0 0 0) + (uuid eb95f643-f29a-46e0-9eb6-27dc165dc446) + ) + (junction (at 238.76 19.05) (diameter 0) (color 0 0 0 0) + (uuid f137c567-e6a0-4665-9b41-c4f1bff4e3b2) + ) + + (wire (pts (xy 129.54 118.11) (xy 129.54 125.73)) + (stroke (width 0) (type default)) + (uuid 00c299e7-faaa-4c4d-8b68-982f28ddbc93) + ) + (wire (pts (xy 233.68 22.86) (xy 266.7 22.86)) + (stroke (width 0) (type default)) + (uuid 01976d1f-e857-47fc-ad6b-71a4c59c2029) + ) + (wire (pts (xy 124.46 91.44) (xy 134.62 91.44)) + (stroke (width 0) (type default)) + (uuid 06afda85-d153-4ddb-ad6e-6d6085e8a731) + ) + (wire (pts (xy 57.15 53.34) (xy 71.12 53.34)) + (stroke (width 0) (type default)) + (uuid 07616570-01cf-4d5f-a6fe-efdb7e5ff878) + ) + (wire (pts (xy 203.2 34.29) (xy 256.54 34.29)) + (stroke (width 0) (type default)) + (uuid 0c9b4583-5977-4735-8928-12b65c0756ad) + ) + (wire (pts (xy 224.79 161.29) (xy 236.22 161.29)) + (stroke (width 0) (type default)) + (uuid 0cdb394d-7b35-4730-8a70-762a1875597f) + ) + (wire (pts (xy 243.84 91.44) (xy 270.51 91.44)) + (stroke (width 0) (type default)) + (uuid 0d2d4a60-9d17-456a-8f29-b95dafcc3d81) + ) + (wire (pts (xy 238.76 91.44) (xy 236.22 91.44)) + (stroke (width 0) (type default)) + (uuid 0e90cdb9-539c-4382-89f3-fb2797a773b4) + ) + (wire (pts (xy 262.89 161.29) (xy 248.92 161.29)) + (stroke (width 0) (type default)) + (uuid 0f4ff432-ab4e-4582-99c1-e76b1e69c085) + ) + (wire (pts (xy 148.59 120.65) (xy 148.59 125.73)) + (stroke (width 0) (type default)) + (uuid 182dcdc1-058b-4a60-9535-239abab67be4) + ) + (wire (pts (xy 93.98 68.58) (xy 93.98 71.12)) + (stroke (width 0) (type default)) + (uuid 19807358-ad40-49e4-93cb-138c1cd3fc58) + ) + (wire (pts (xy 106.68 95.25) (xy 104.14 95.25)) + (stroke (width 0) (type default)) + (uuid 1c27f105-cb8e-432f-b0ff-1055c36422b0) + ) + (wire (pts (xy 241.3 19.05) (xy 238.76 19.05)) + (stroke (width 0) (type default)) + (uuid 1dd160da-7789-4e91-bb49-101ae6cc53ae) + ) + (wire (pts (xy 224.79 132.08) (xy 224.79 137.16)) + (stroke (width 0) (type default)) + (uuid 202ca01e-ec29-4afa-873b-86d103569e2b) + ) + (wire (pts (xy 241.3 19.05) (xy 266.7 19.05)) + (stroke (width 0) (type default)) + (uuid 206c205f-8dab-4ec0-a8bd-bac5347724a5) + ) + (wire (pts (xy 129.54 107.95) (xy 129.54 100.33)) + (stroke (width 0) (type default)) + (uuid 20bc100d-4e13-4951-8cae-306aaeb10e92) + ) + (wire (pts (xy 124.46 53.34) (xy 127 53.34)) + (stroke (width 0) (type default)) + (uuid 222e42b3-d6b3-4ce3-956c-527dd6d7efd8) + ) + (wire (pts (xy 148.59 135.89) (xy 148.59 160.02)) + (stroke (width 0) (type default)) + (uuid 22370f96-3779-412b-8d13-ab550cd9d766) + ) + (wire (pts (xy 104.14 71.12) (xy 104.14 73.66)) + (stroke (width 0) (type default)) + (uuid 24f66ba9-5e65-45aa-9769-2649e40f195f) + ) + (wire (pts (xy 231.14 91.44) (xy 228.6 91.44)) + (stroke (width 0) (type default)) + (uuid 28e430a3-cdd7-4697-9b02-ca9708701734) + ) + (wire (pts (xy 236.22 91.44) (xy 233.68 91.44)) + (stroke (width 0) (type default)) + (uuid 2a2ca6ea-8390-498d-8a09-2378bc201b0c) + ) + (wire (pts (xy 58.42 113.03) (xy 96.52 113.03)) + (stroke (width 0) (type default)) + (uuid 2abb512a-db72-4e2a-9120-c1aacf308d65) + ) + (wire (pts (xy 55.88 64.77) (xy 78.74 64.77)) + (stroke (width 0) (type default)) + (uuid 2b9a13b7-2a69-42f5-920e-efd345e7e88c) + ) + (wire (pts (xy 22.86 86.36) (xy 22.86 91.44)) + (stroke (width 0) (type default)) + (uuid 303cddc0-903a-48da-9011-3f8b8a6d39e2) + ) + (wire (pts (xy 238.76 19.05) (xy 238.76 25.4)) + (stroke (width 0) (type default)) + (uuid 332c1d5f-cdf1-4103-9fe1-0e1d703602f2) + ) + (wire (pts (xy 93.98 22.86) (xy 231.14 22.86)) + (stroke (width 0) (type default)) + (uuid 3504c25b-c266-4edc-bf23-66089abff71a) + ) + (wire (pts (xy 148.59 19.05) (xy 238.76 19.05)) + (stroke (width 0) (type default)) + (uuid 3d228b31-9238-40e1-b7b6-7063fa5d491e) + ) + (wire (pts (xy 93.98 71.12) (xy 104.14 71.12)) + (stroke (width 0) (type default)) + (uuid 3d5ea4ae-a29c-4afc-99c6-4f313dfb4cab) + ) + (wire (pts (xy 78.74 91.44) (xy 93.98 91.44)) + (stroke (width 0) (type default)) + (uuid 40862c9d-c9cf-436f-828f-d8fe8ad5169c) + ) + (wire (pts (xy 93.98 22.86) (xy 85.09 22.86)) + (stroke (width 0) (type default)) + (uuid 41eed07a-a86b-4a64-9cf1-023e913aa4c3) + ) + (wire (pts (xy 22.86 91.44) (xy 78.74 91.44)) + (stroke (width 0) (type default)) + (uuid 4481d758-7dcf-4af6-86df-5a2940430e75) + ) + (wire (pts (xy 93.98 58.42) (xy 93.98 60.96)) + (stroke (width 0) (type default)) + (uuid 450e7a3b-76d3-47b6-b23b-7b8e9883ce80) + ) + (wire (pts (xy 71.12 69.85) (xy 71.12 67.31)) + (stroke (width 0) (type default)) + (uuid 45710f38-26a7-4688-85be-54a6e32b00b3) + ) + (wire (pts (xy 168.91 105.41) (xy 168.91 100.33)) + (stroke (width 0) (type default)) + (uuid 47e32fdd-b11f-4fde-b4ca-3adcbfe4169c) + ) + (wire (pts (xy 104.14 95.25) (xy 104.14 91.44)) + (stroke (width 0) (type default)) + (uuid 48a0cf6f-de36-49d7-909f-349dd7930b6f) + ) + (wire (pts (xy 85.09 53.34) (xy 86.36 53.34)) + (stroke (width 0) (type default)) + (uuid 4b3d62dd-3687-43ec-940f-620f9b3c93a5) + ) + (wire (pts (xy 96.52 113.03) (xy 96.52 120.65)) + (stroke (width 0) (type default)) + (uuid 4daf8146-08c3-4f61-aa4b-20b19fa66d7f) + ) + (wire (pts (xy 113.03 152.4) (xy 113.03 160.02)) + (stroke (width 0) (type default)) + (uuid 4e1338f4-b971-43b9-8d89-4ddf46fe4423) + ) + (wire (pts (xy 168.91 100.33) (xy 184.15 100.33)) + (stroke (width 0) (type default)) + (uuid 5203ffb6-b70a-4af4-88ed-839ac948ccb8) + ) + (wire (pts (xy 93.98 22.86) (xy 93.98 48.26)) + (stroke (width 0) (type default)) + (uuid 53986d54-588b-4b19-b64f-297fc6b169e9) + ) + (wire (pts (xy 148.59 105.41) (xy 148.59 100.33)) + (stroke (width 0) (type default)) + (uuid 5445dd0f-6996-4b88-a6fc-1b4ac493827c) + ) + (wire (pts (xy 93.98 71.12) (xy 93.98 73.66)) + (stroke (width 0) (type default)) + (uuid 5616785c-633b-44aa-98f6-1077520da460) + ) + (wire (pts (xy 124.46 83.82) (xy 124.46 91.44)) + (stroke (width 0) (type default)) + (uuid 5638611c-6a9e-4022-9054-5f7c3068d555) + ) + (wire (pts (xy 228.6 91.44) (xy 226.06 91.44)) + (stroke (width 0) (type default)) + (uuid 5a2bfc69-993b-4173-8737-f7ff8f3d85d0) + ) + (wire (pts (xy 256.54 34.29) (xy 256.54 35.56)) + (stroke (width 0) (type default)) + (uuid 5ad0dc39-f36f-455c-946c-412f8b542573) + ) + (wire (pts (xy 148.59 160.02) (xy 167.64 160.02)) + (stroke (width 0) (type default)) + (uuid 5e2215c9-0b9a-4480-b70b-5e0fffc6842f) + ) + (wire (pts (xy 138.43 113.03) (xy 138.43 120.65)) + (stroke (width 0) (type default)) + (uuid 621877c7-134b-4bdb-9eeb-a62f425b71c4) + ) + (wire (pts (xy 148.59 39.37) (xy 148.59 57.15)) + (stroke (width 0) (type default)) + (uuid 625509e4-0842-4a5a-8a0b-117c6a421e34) + ) + (wire (pts (xy 71.12 53.34) (xy 77.47 53.34)) + (stroke (width 0) (type default)) + (uuid 6536fb26-c818-4a30-a617-fa2ec6d474ba) + ) + (wire (pts (xy 148.59 35.56) (xy 148.59 39.37)) + (stroke (width 0) (type default)) + (uuid 659c9797-24f8-4c5b-bd1d-8a54b51a02cf) + ) + (wire (pts (xy 231.14 22.86) (xy 231.14 25.4)) + (stroke (width 0) (type default)) + (uuid 6669daa5-08f0-4acc-9c79-01c1455e0f88) + ) + (wire (pts (xy 22.86 69.85) (xy 22.86 76.2)) + (stroke (width 0) (type default)) + (uuid 668aaf4a-bf41-4c80-952f-ee5222a99d3b) + ) + (wire (pts (xy 233.68 91.44) (xy 231.14 91.44)) + (stroke (width 0) (type default)) + (uuid 67c5b6b1-ca68-41b1-833b-5fb5d67e21e2) + ) + (wire (pts (xy 104.14 71.12) (xy 110.49 71.12)) + (stroke (width 0) (type default)) + (uuid 68eb80fe-cb1e-47ca-8f0f-51c4d30013c8) + ) + (wire (pts (xy 233.68 22.86) (xy 233.68 25.4)) + (stroke (width 0) (type default)) + (uuid 6f7b28ef-1ebc-4e0e-a7ed-804c1ad2fe50) + ) + (wire (pts (xy 134.62 91.44) (xy 148.59 91.44)) + (stroke (width 0) (type default)) + (uuid 70d03e07-ad24-4325-94e6-ef06c1bdc445) + ) + (wire (pts (xy 134.62 58.42) (xy 134.62 91.44)) + (stroke (width 0) (type default)) + (uuid 73616a01-4faa-4ffd-8d94-19ab712113f5) + ) + (wire (pts (xy 22.86 69.85) (xy 55.88 69.85)) + (stroke (width 0) (type default)) + (uuid 77da716c-6f64-47c0-96e4-1d7322095536) + ) + (wire (pts (xy 248.92 118.11) (xy 248.92 130.81)) + (stroke (width 0) (type default)) + (uuid 79063825-2d82-4234-a3b2-778ed97a0592) + ) + (wire (pts (xy 93.98 81.28) (xy 93.98 91.44)) + (stroke (width 0) (type default)) + (uuid 7c4e1592-28c8-420d-8373-6adc2654f538) + ) + (wire (pts (xy 129.54 100.33) (xy 148.59 100.33)) + (stroke (width 0) (type default)) + (uuid 7d30ac54-087c-46a4-98ba-b71ed6d78be2) + ) + (wire (pts (xy 134.62 31.75) (xy 134.62 35.56)) + (stroke (width 0) (type default)) + (uuid 7d6f7221-3f56-4282-82d4-91289b95ec3f) + ) + (wire (pts (xy 241.3 91.44) (xy 238.76 91.44)) + (stroke (width 0) (type default)) + (uuid 820f511d-21c1-4109-abe1-26f33a54f148) + ) + (wire (pts (xy 243.84 91.44) (xy 241.3 91.44)) + (stroke (width 0) (type default)) + (uuid 89ce8bc6-7f6b-4856-a39e-4a545f9d4cda) + ) + (wire (pts (xy 148.59 39.37) (xy 256.54 39.37)) + (stroke (width 0) (type default)) + (uuid 8bda66b5-537e-46c9-8f5c-636a2d480d32) + ) + (wire (pts (xy 168.91 115.57) (xy 168.91 119.38)) + (stroke (width 0) (type default)) + (uuid 8bf79e71-8dda-4e02-992f-9d684eab025c) + ) + (wire (pts (xy 104.14 81.28) (xy 104.14 91.44)) + (stroke (width 0) (type default)) + (uuid 8c37fbd4-42fa-4ab8-ba24-57cdc86bb211) + ) + (wire (pts (xy 148.59 91.44) (xy 226.06 91.44)) + (stroke (width 0) (type default)) + (uuid 8fa3d46c-f729-415b-adac-1f48951af633) + ) + (wire (pts (xy 93.98 91.44) (xy 93.98 93.98)) + (stroke (width 0) (type default)) + (uuid 901fa84e-927a-4e0a-ad84-2514050ba4df) + ) + (wire (pts (xy 138.43 113.03) (xy 137.16 113.03)) + (stroke (width 0) (type default)) + (uuid 902cd960-7a30-489d-b4b1-29b820037f7a) + ) + (wire (pts (xy 134.62 19.05) (xy 148.59 19.05)) + (stroke (width 0) (type default)) + (uuid 9129feb5-19a4-45a0-a250-e6248498a9f9) + ) + (wire (pts (xy 236.22 118.11) (xy 236.22 130.81)) + (stroke (width 0) (type default)) + (uuid 936c209f-d533-41e4-a51c-089c25ee45a7) + ) + (wire (pts (xy 256.54 38.1) (xy 256.54 39.37)) + (stroke (width 0) (type default)) + (uuid 97895bc7-b864-4777-9d67-a549479db6f5) + ) + (wire (pts (xy 148.59 19.05) (xy 148.59 27.94)) + (stroke (width 0) (type default)) + (uuid 97fc6270-b096-4834-a0f7-3b73adc27269) + ) + (wire (pts (xy 134.62 19.05) (xy 134.62 24.13)) + (stroke (width 0) (type default)) + (uuid 986df6be-4177-47a1-a0a6-67759be10eac) + ) + (wire (pts (xy 148.59 100.33) (xy 168.91 100.33)) + (stroke (width 0) (type default)) + (uuid 9cfa7a0a-9409-411c-a970-09a18b3031cd) + ) + (wire (pts (xy 124.46 62.23) (xy 124.46 71.12)) + (stroke (width 0) (type default)) + (uuid 9fb53aa7-3322-410e-8134-3ed110349727) + ) + (wire (pts (xy 248.92 161.29) (xy 248.92 140.97)) + (stroke (width 0) (type default)) + (uuid a208ba4c-b337-404e-b00f-fde003eb3019) + ) + (wire (pts (xy 55.88 69.85) (xy 59.69 69.85)) + (stroke (width 0) (type default)) + (uuid a51c56f9-ec89-4bd0-ac27-7b9fdb1aec53) + ) + (wire (pts (xy 129.54 125.73) (xy 113.03 125.73)) + (stroke (width 0) (type default)) + (uuid a96bd147-5b5e-437a-836e-3a7dd78175c8) + ) + (wire (pts (xy 138.43 120.65) (xy 148.59 120.65)) + (stroke (width 0) (type default)) + (uuid a9996425-63e3-4b86-9f15-0a87760adb39) + ) + (wire (pts (xy 156.21 130.81) (xy 168.91 130.81)) + (stroke (width 0) (type default)) + (uuid acf4034f-3bba-4c21-a0fb-e57002a1e0f4) + ) + (wire (pts (xy 262.89 140.97) (xy 262.89 161.29)) + (stroke (width 0) (type default)) + (uuid b1aaa67c-8dd8-4b91-b0aa-079a442b7051) + ) + (wire (pts (xy 118.11 71.12) (xy 124.46 71.12)) + (stroke (width 0) (type default)) + (uuid b2e64cf4-c6fd-4372-b178-0d34f67d5c9b) + ) + (wire (pts (xy 113.03 105.41) (xy 113.03 100.33)) + (stroke (width 0) (type default)) + (uuid b3e88ad6-41c3-49fc-8773-9139c38916fd) + ) + (wire (pts (xy 124.46 53.34) (xy 124.46 62.23)) + (stroke (width 0) (type default)) + (uuid b50b33f9-9974-4323-80bb-00b3c2c55d4e) + ) + (wire (pts (xy 113.03 125.73) (xy 113.03 144.78)) + (stroke (width 0) (type default)) + (uuid b5710270-de76-41aa-b8fe-9f009f8cff25) + ) + (wire (pts (xy 124.46 71.12) (xy 124.46 76.2)) + (stroke (width 0) (type default)) + (uuid b6dfa58d-df5c-46de-843e-c44e82e2388b) + ) + (wire (pts (xy 85.09 44.45) (xy 85.09 53.34)) + (stroke (width 0) (type default)) + (uuid b6edb122-0d4a-408b-a38f-95303db9b51c) + ) + (wire (pts (xy 78.74 64.77) (xy 78.74 91.44)) + (stroke (width 0) (type default)) + (uuid be0cb463-2824-4c93-a3e4-68c50010e20b) + ) + (wire (pts (xy 224.79 147.32) (xy 224.79 161.29)) + (stroke (width 0) (type default)) + (uuid bf23c6b2-8776-4bae-a52d-d247198afb25) + ) + (wire (pts (xy 85.09 22.86) (xy 85.09 36.83)) + (stroke (width 0) (type default)) + (uuid bf64f970-ef53-4c36-8ac4-49c8b60f02c6) + ) + (wire (pts (xy 267.97 161.29) (xy 262.89 161.29)) + (stroke (width 0) (type default)) + (uuid bfb84e88-4141-45ae-954d-626ec12e011c) + ) + (wire (pts (xy 71.12 67.31) (xy 71.12 53.34)) + (stroke (width 0) (type default)) + (uuid c0572784-d1df-4005-9ecf-d1883cfddb5b) + ) + (wire (pts (xy 236.22 161.29) (xy 248.92 161.29)) + (stroke (width 0) (type default)) + (uuid c3065789-50d3-42bb-b0a3-807b4379f96b) + ) + (wire (pts (xy 134.62 43.18) (xy 134.62 48.26)) + (stroke (width 0) (type default)) + (uuid c4547859-0ba7-4c68-a227-2f8f006e8aa9) + ) + (wire (pts (xy 113.03 160.02) (xy 148.59 160.02)) + (stroke (width 0) (type default)) + (uuid c71ebad9-22f3-496c-9b73-5ef0d8a5e47f) + ) + (wire (pts (xy 55.88 67.31) (xy 71.12 67.31)) + (stroke (width 0) (type default)) + (uuid cca0a654-af1e-47e5-b55a-03ca6521b2e8) + ) + (wire (pts (xy 148.59 113.03) (xy 148.59 120.65)) + (stroke (width 0) (type default)) + (uuid ce7d71ee-cdce-412d-be7e-f57b471cc858) + ) + (wire (pts (xy 148.59 67.31) (xy 148.59 91.44)) + (stroke (width 0) (type default)) + (uuid d457545d-3fcc-4d1a-ad12-230425332698) + ) + (wire (pts (xy 140.97 62.23) (xy 124.46 62.23)) + (stroke (width 0) (type default)) + (uuid d6e94bbc-4b7e-406e-a14d-dd9b76c1d3f5) + ) + (wire (pts (xy 67.31 69.85) (xy 71.12 69.85)) + (stroke (width 0) (type default)) + (uuid d6f65a1f-1882-48da-b571-8c495f1ab874) + ) + (wire (pts (xy 96.52 160.02) (xy 113.03 160.02)) + (stroke (width 0) (type default)) + (uuid d9261f2e-2e0c-4e7b-9727-310fd7c8d4d3) + ) + (wire (pts (xy 168.91 115.57) (xy 190.5 115.57)) + (stroke (width 0) (type default)) + (uuid d9f3c6f9-48b5-4430-84b2-b3cdddd985cf) + ) + (wire (pts (xy 113.03 113.03) (xy 113.03 125.73)) + (stroke (width 0) (type default)) + (uuid db011b32-8b32-41ec-8cb9-34117c3ec79c) + ) + (wire (pts (xy 236.22 140.97) (xy 236.22 161.29)) + (stroke (width 0) (type default)) + (uuid dbafdac4-99b9-4ed5-8c8c-8a8fd2aaa381) + ) + (wire (pts (xy 104.14 91.44) (xy 124.46 91.44)) + (stroke (width 0) (type default)) + (uuid e311e9f0-1479-4d99-89df-432133f88945) + ) + (wire (pts (xy 241.3 19.05) (xy 241.3 25.4)) + (stroke (width 0) (type default)) + (uuid e3f73ef8-9f90-4c4a-b4bc-223ac5ce04a7) + ) + (wire (pts (xy 224.79 116.84) (xy 224.79 124.46)) + (stroke (width 0) (type default)) + (uuid e98e9d13-3d71-4ee6-bf72-fa58ce31813e) + ) + (wire (pts (xy 168.91 130.81) (xy 168.91 127)) + (stroke (width 0) (type default)) + (uuid ecb8e0e5-c49a-4c34-a69c-95e4acc4c3cd) + ) + (wire (pts (xy 104.14 125.73) (xy 113.03 125.73)) + (stroke (width 0) (type default)) + (uuid ed4258d0-f82f-4d1e-a000-02800815b56f) + ) + (wire (pts (xy 233.68 22.86) (xy 231.14 22.86)) + (stroke (width 0) (type default)) + (uuid ef541797-9c16-4a14-92a0-5181a5882cca) + ) + (wire (pts (xy 96.52 130.81) (xy 96.52 160.02)) + (stroke (width 0) (type default)) + (uuid efc38956-8ea5-409e-97d1-667213bb5655) + ) + (wire (pts (xy 93.98 91.44) (xy 104.14 91.44)) + (stroke (width 0) (type default)) + (uuid f8293061-f56a-4bbc-91ed-4f1237ae0700) + ) + (wire (pts (xy 168.91 113.03) (xy 168.91 115.57)) + (stroke (width 0) (type default)) + (uuid fbb335b9-473f-40dc-9a76-eccb62aeca08) + ) + (wire (pts (xy 129.54 100.33) (xy 113.03 100.33)) + (stroke (width 0) (type default)) + (uuid fbe9c3d3-0fdc-4ffd-9ee0-d54b0d4365f0) + ) + (wire (pts (xy 262.89 118.11) (xy 262.89 130.81)) + (stroke (width 0) (type default)) + (uuid fe05c879-b14e-440a-ac6b-1542adaabac9) + ) + + (rectangle (start 215.9 102.87) (end 275.59 163.83) + (stroke (width 0) (type default)) + (fill (type color) (color 194 194 194 1)) + (uuid 88379ac3-85fc-4435-b3d8-63c3b7351833) + ) + + (text ".options warn=1" (at 179.07 180.34 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 5b2393dc-2858-4734-a0ae-f5fb98f18dac) + ) + (text "Simulation components only" (at 217.17 101.6 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid b3445cbc-3a63-4202-b51c-b28d86bcef27) + ) + + (global_label "SEATALK" (shape bidirectional) (at 57.15 53.34 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 198f52c9-cf71-4edd-8633-37b8f7313a76) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 45.2521 53.34 0) (show_name) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "SEATALK" (shape output) (at 224.79 116.84 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 29f71db3-7bff-4ff6-acaa-84fe0e08e66a) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 224.79 106.0534 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "TXD" (shape output) (at 203.2 34.29 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 3121f960-5443-441a-b6eb-0e5528d78a8c) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 196.7677 34.29 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "GND" (shape passive) (at 167.64 160.02 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 3f93229d-0f0b-4294-928e-4f5b5813613b) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 173.3844 160.02 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "SEATALK" (shape bidirectional) (at 58.42 113.03 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 407c5812-314e-49c3-9938-6ef288831654) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 46.5221 113.03 0) (show_name) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "VCC_3.3" (shape passive) (at 236.22 118.11 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 7a64d7eb-50df-4fe0-9ac5-7878eacbbce8) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 236.22 108.6161 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "GND" (shape passive) (at 106.68 95.25 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 7c64d0e5-79f6-4427-9ac5-d7eff9427f5b) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 112.4244 95.25 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "VCC_5.0" (shape passive) (at 266.7 22.86 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 7e710555-a55f-4988-9494-128d9a9b57c7) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 276.1939 22.86 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "VCC_3.3" (shape passive) (at 184.15 100.33 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 81042077-9ece-4974-ad5f-149377f8095b) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 193.6439 100.33 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "GND" (shape passive) (at 267.97 161.29 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid b45a8b0b-a002-4b9f-af67-752912951233) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 273.7144 161.29 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "VCC_5.0" (shape passive) (at 248.92 118.11 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid b580814b-c917-4700-9f80-e80a097ae25b) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 248.92 108.6161 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "TXD" (shape output) (at 262.89 118.11 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid c69bd050-d2e8-49b7-9f18-ee59dd42d211) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 262.89 111.6777 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "TXD" (shape input) (at 190.5 115.57 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid dc2ec9f7-8865-4a96-b3b2-310f10e92d85) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 196.9323 115.57 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "VCC_3.3" (shape passive) (at 266.7 19.05 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid ee191e7e-23b9-4b3a-9f08-b4ef5174e3ff) + (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 276.1939 19.05 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + + (symbol (lib_id "Device:R") (at 148.59 31.75 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 05087989-f568-4ae5-b297-c298921fe111) + (property "Reference" "R8" (at 151.13 30.48 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.2k" (at 151.13 33.02 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 146.812 31.75 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 148.59 31.75 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 148.59 31.75 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 148.59 31.75 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 23fd5977-895a-4de9-b4aa-29e651b6afaa)) + (pin "1" (uuid 579306a8-864d-4547-a3b8-09bc519fc2a9)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R8") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 93.98 64.77 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 0512ba43-5f13-4592-bd94-7ec2752829fa) + (property "Reference" "R3" (at 96.52 63.5 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.2k" (at 96.52 66.04 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 92.202 64.77 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 93.98 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 93.98 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 93.98 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c5fb0546-c935-4b56-89dd-7cbc18cddd58)) + (pin "1" (uuid dd1e4fb9-6fed-486e-92dd-45d7a391daf4)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R3") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:0") (at 93.98 93.98 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 19fcdd91-a2f5-4b2b-9f11-e0127d3cfd92) + (property "Reference" "#GND01" (at 93.98 96.52 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "0" (at 93.98 91.44 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 93.98 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 93.98 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 811cdd2d-378b-4564-948a-18b0194f45e1)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "#GND01") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 124.46 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 1e712663-9f97-4762-926c-2b4ce56e9875) + (property "Reference" "R7" (at 127 78.74 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "22k" (at 127 81.28 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 122.682 80.01 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 124.46 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 718bcf05-afb0-4f58-b927-a125fbb3677b)) + (pin "2" (uuid d4c2291f-b5b5-493c-a651-fd336fabe2c2)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R7") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 224.79 128.27 180) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid 2380401b-e9df-4f16-9e3b-08b946053151) + (property "Reference" "R11" (at 227.33 127 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "200" (at 227.33 129.54 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 226.568 128.27 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 224.79 128.27 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Remarks" "Simulates wire" (at 224.79 128.27 90) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b7c93cf5-6831-400a-b49a-f48d2ed2d31a)) + (pin "2" (uuid bab0e589-52b6-450b-a0c0-2819a167d32c)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R11") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:VDC") (at 22.86 81.28 0) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid 27f6dfc4-6d11-4993-be5b-18f0ba52532f) + (property "Reference" "V2" (at 26.67 79.8802 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "12" (at 26.67 82.4202 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 22.86 81.28 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 22.86 81.28 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 22.86 81.28 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "DC" (at 22.86 81.28 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 22.86 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "2" (uuid 22a64731-0d02-4297-846d-46b0f43ff1a9)) + (pin "1" (uuid bfd63275-e1fe-44f8-b205-974e4ec469ed)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "V2") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC547") (at 99.06 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4e0376b7-268d-4d3c-bc7b-c625228f33d1) + (property "Reference" "Q4" (at 93.98 124.46 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 93.98 127 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 93.98 127.635 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "NPN" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "bc547b" (at 99.06 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 3367cd39-97f8-464b-a87a-4f6f3199fd61)) + (pin "1" (uuid 668ea38e-27e2-4722-a035-b12c5a7fa846)) + (pin "3" (uuid 9398563b-f3b1-42a7-8eb5-9b0ec735eed4)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q4") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 104.14 77.47 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 4f117a73-66ee-4224-8fe8-71a32870a260) + (property "Reference" "R6" (at 106.68 76.2 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "4.7k" (at 106.68 78.74 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 102.362 77.47 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 104.14 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 104.14 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 104.14 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 8808513d-8069-4fe3-9b6d-d064a3065192)) + (pin "1" (uuid 205b156d-26ef-41b7-b527-501fe06c5a82)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R6") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:VPULSE") (at 224.79 142.24 0) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid 520cf6fd-7c36-4222-967b-e5d1fe5a143a) + (property "Reference" "V1" (at 228.6 139.5702 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "VPULSE" (at 228.6 142.1102 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 224.79 142.24 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 224.79 142.24 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 224.79 142.24 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "PULSE" (at 224.79 142.24 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 224.79 142.24 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Params" "y1=12 y2=2 td=1m tr=2n tf=2n tw=0.2m per=2m np=3" (at 228.6 144.6502 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (pin "1" (uuid 075f54ff-0140-4922-8631-014e613fcc3b)) + (pin "2" (uuid e9d8303d-59c0-48cd-883e-9775b2b743e0)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "V1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 168.91 123.19 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 579a3129-1551-4263-8c06-93d703fd61dd) + (property "Reference" "R10" (at 171.45 121.92 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.5k" (at 171.45 124.46 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 167.132 123.19 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 168.91 123.19 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fadcfb61-48cc-4b27-9352-2a82bf72a90c)) + (pin "2" (uuid fcda8fed-3e64-4caf-bd2d-e14e11e0feb1)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R10") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Connector:Raspberry_Pi_2_3") (at 236.22 58.42 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 58887779-90ab-4780-98be-8f57c4f8f78b) + (property "Reference" "J1" (at 243.4941 22.86 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Raspberry_Pi_2_3" (at 243.4941 25.4 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_2x20_P2.54mm_Vertical" (at 236.22 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf" (at 236.22 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Enable" "0" (at 236.22 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "30" (uuid 9480ed7e-078d-410d-a689-dc84c1e25f24)) + (pin "35" (uuid 9630f1c2-f63c-4d2b-a862-14f7b46dad99)) + (pin "10" (uuid 47751548-b485-4658-a3cc-455edcd0d745)) + (pin "13" (uuid cc3a8932-8890-470f-a5bc-060adb2583d2)) + (pin "14" (uuid 961490a7-bb94-4450-9326-6da8f7d68030)) + (pin "2" (uuid 59275134-53c4-4f1b-89dd-89d8f70f4071)) + (pin "32" (uuid 66194a78-33f0-44b7-958b-6ddbab6b48b8)) + (pin "37" (uuid dffdac9d-b2f1-4ac9-be42-85771e5b3c92)) + (pin "20" (uuid 99723dac-830e-4798-9b2a-1e8e97efcd9e)) + (pin "12" (uuid 21f8a5d7-1582-43be-b763-dc15e2599ec7)) + (pin "31" (uuid df3a96ed-cdd8-4d0c-9100-d079e4880fd8)) + (pin "23" (uuid f68f7ba2-47fc-47ba-99ff-95af47627038)) + (pin "16" (uuid 98944481-1ba3-4ccd-9e95-ae67c1f6bf7e)) + (pin "21" (uuid ecd1adcc-68c1-42c9-b0aa-a54e6aef7762)) + (pin "6" (uuid 0ca6ab34-7822-459d-b829-d0de68e831bf)) + (pin "19" (uuid afbfedd7-7c68-4c29-8371-8cdc9050141a)) + (pin "28" (uuid 9186a61f-8094-4f45-b162-66bad66a3075)) + (pin "9" (uuid ac1752c3-5834-4710-be1b-deb5958858b0)) + (pin "25" (uuid 4d6044fb-43dc-4410-9ccd-16b5a269ac1b)) + (pin "33" (uuid a2158618-4b7f-4173-8f76-ecc839b3c43f)) + (pin "40" (uuid 14419fc0-0565-46de-9da4-98bc3c67a247)) + (pin "7" (uuid 81c4ec06-f27f-4a3c-aec8-ee65302ad913)) + (pin "29" (uuid 8c6c8ada-657f-4c95-850a-b7b59d05ceeb)) + (pin "4" (uuid 0097ad2e-70c6-4d68-836d-b4fb54fbab2b)) + (pin "34" (uuid c368e4c2-66a7-4f9e-821c-236fd0ce2710)) + (pin "26" (uuid a7dac948-7c59-48ec-b865-5db6f6b5bd48)) + (pin "17" (uuid 484a6157-4f5a-4a2d-aecd-d50ca5adff3d)) + (pin "5" (uuid 978f7a18-95e4-49f5-af64-4cb861e7a5a4)) + (pin "27" (uuid bdde28df-1d31-4583-95f8-5131b173e59d)) + (pin "22" (uuid b5ecece4-a6ca-4f7d-950c-1255e62e554b)) + (pin "39" (uuid 98d2ace0-fac0-4edb-a2fa-78d7f3a8def2)) + (pin "1" (uuid cab3a939-966a-490e-b0dd-deeeddf0d348)) + (pin "15" (uuid 327f3e04-9548-4592-99da-517332607cd3)) + (pin "36" (uuid cb646cf3-2206-40aa-95d8-1efdb95b7e63)) + (pin "38" (uuid c4159ad3-663a-45dd-86c2-6de777616765)) + (pin "8" (uuid 58bbf9f8-a1e7-4e44-bf09-004e70b99514)) + (pin "18" (uuid 8c99e4b4-3bb8-4c9f-ad09-4ac285a133a8)) + (pin "11" (uuid 20de94e6-63c1-453a-a87c-018e12bfc525)) + (pin "3" (uuid 5300d9b1-54b6-4771-8c22-aaf5394ed8ef)) + (pin "24" (uuid e189ee54-0dcd-49e5-b6af-d94cb720711c)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "J1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 63.5 69.85 270) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 71be8ad0-bfd2-4f59-afd6-b1bb5fcc5604) + (property "Reference" "R12" (at 63.5 63.5 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "10k" (at 63.5 66.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 63.5 68.072 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 63.5 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Remarks" "External pull-up from bus" (at 63.5 69.85 90) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c7b42ef2-f5f0-4e97-a1ad-b69fd4fc0dba)) + (pin "2" (uuid a5409b60-43b9-4437-b794-08fad3c810ac)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R12") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 134.62 27.94 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 72ecdcab-4412-431f-ae1a-4d8a433bda34) + (property "Reference" "R9" (at 137.16 26.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "100" (at 137.16 29.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 132.842 27.94 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 134.62 27.94 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 134.62 27.94 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "=" (at 134.62 27.94 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Params" "r=100" (at 134.62 27.94 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 134.62 27.94 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 861f3a84-52ac-43ea-9c29-79b0d54de8c7)) + (pin "1" (uuid 1d8c2ac8-ec61-4c66-b17e-6cb52d228bf2)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R9") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC547") (at 132.08 53.34 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 7762f63f-936a-4d38-a129-b66d3e12b33b) + (property "Reference" "Q3" (at 137.16 52.07 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 137.16 54.61 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 137.16 55.245 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "NPN" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "bc547b" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Params" "temp=20" (at 132.08 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid da7fff44-1bca-4aef-a89e-947384f9e451)) + (pin "1" (uuid b9f98078-d730-4e82-9708-1d0ddae25c5c)) + (pin "3" (uuid fc87a471-71b7-4dbe-a28d-8169194fe763)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q3") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC547") (at 151.13 130.81 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7a1d8624-75b3-40d9-8367-28b38d93d05c) + (property "Reference" "Q5" (at 146.05 129.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 146.05 132.08 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 146.05 132.715 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "NPN" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "bc547b" (at 151.13 130.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c62ca8e2-0dde-4551-a266-35e461e0adf1)) + (pin "1" (uuid e752aa40-be11-4ed0-9746-1d2ee4306350)) + (pin "3" (uuid ac05d841-5c8d-43b4-9b40-a905ed79695b)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q5") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Connector:Conn_01x03_Pin") (at 50.8 67.31 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 8008b50a-ac2b-42d5-8e97-ecafe76dc831) + (property "Reference" "J3" (at 51.435 59.69 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x03_Pin" (at 51.435 62.23 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" (at 50.8 67.31 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 50.8 67.31 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Enable" "0" (at 50.8 67.31 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "3" (uuid fd27ed41-2fab-4a7f-8599-5c70cb840497)) + (pin "1" (uuid fa94d794-5b25-4185-bd0b-e430b6cdfa7d)) + (pin "2" (uuid 01af7c04-95fa-4882-b7de-0ead8b96d27d)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "J3") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 93.98 77.47 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 873fd484-3122-4533-8a3d-0b6694e5decf) + (property "Reference" "R4" (at 96.52 76.2 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "4.7k" (at 96.52 78.74 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 92.202 77.47 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 93.98 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 93.98 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 93.98 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 850c0ff1-5cfb-432d-b559-5ae329c5e9d9)) + (pin "1" (uuid 81bd7a99-e543-4e2e-b5e9-dc3f85d690d8)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R4") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:LED") (at 134.62 39.37 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 88a72208-5af9-4097-94e1-8cb31aaadfea) + (property "Reference" "D1" (at 138.43 39.6875 90) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "blue" (at 138.43 42.2275 90) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "LED_THT:LED_D3.0mm_Horizontal_O3.81mm_Z6.0mm" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "D" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=K 2=A" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Params" "is=259390a" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "Leds.lib" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "DLED_Nichia" (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 2a7e67eb-09da-4759-853a-db9309bb07cf)) + (pin "1" (uuid cd299df1-148c-4e6a-a30a-37e9b22e3db4)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "D1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 113.03 148.59 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 8b0fd059-b19f-4565-852a-74e3223bfaf1) + (property "Reference" "R14" (at 115.57 147.32 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.2k" (at 115.57 149.86 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 111.252 148.59 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 113.03 148.59 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid dd913944-28c9-4746-9bd0-f01dc889dc9b)) + (pin "1" (uuid c8ea70aa-f98f-4467-bd6e-a45a7d9e8df2)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R14") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:VDC") (at 236.22 135.89 0) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid 8d319acf-73f1-4920-a135-ca5006e07087) + (property "Reference" "V_USB2" (at 240.03 134.4902 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "3.3" (at 240.03 137.0302 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 236.22 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 236.22 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 236.22 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "DC" (at 236.22 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 236.22 135.89 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "2" (uuid da8006eb-4425-4fa4-a55a-89cc621706f3)) + (pin "1" (uuid ec7fd62e-9e1a-4a7a-9978-745ed62e78a0)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "V_USB2") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 148.59 109.22 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 94c334ed-1cb5-4404-a652-a5f07f1cffb8) + (property "Reference" "R15" (at 151.13 107.95 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "10k" (at 151.13 110.49 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 146.812 109.22 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 148.59 109.22 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 80d6861b-799a-4c03-9151-b8da83629859)) + (pin "2" (uuid 5892eb60-8354-4c13-bb54-aef39919887d)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R15") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC547") (at 146.05 62.23 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 9fb6ea96-3606-4642-89c7-d6759aecd3a2) + (property "Reference" "Q2" (at 151.13 60.96 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 151.13 63.5 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 151.13 64.135 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "NPN" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "bc547b" (at 146.05 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid f888593a-740f-4651-be6d-4f4e520939dc)) + (pin "1" (uuid a651270e-f665-4a52-bb8e-5d3c497f6ef6)) + (pin "3" (uuid c431e722-4bcb-4b1b-9d79-759516162690)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q2") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 168.91 109.22 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid a88aec3a-89e0-4123-9d67-40bd4310a5ef) + (property "Reference" "R13" (at 171.45 107.95 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "10k" (at 171.45 110.49 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 167.132 109.22 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 168.91 109.22 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 6c7738cd-1b88-47c6-8a3a-d5f1150da7ec)) + (pin "1" (uuid ef7c36bc-0b03-41cb-8993-5066ede9bf19)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R13") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC547") (at 132.08 113.03 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid aab4eea5-37eb-4106-bd44-0c724bfeaa6e) + (property "Reference" "Q6" (at 127 111.76 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC547" (at 127 114.3 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 127 114.935 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC550-D.pdf" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "NPN" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "bc547b" (at 132.08 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 4380ce94-2ec6-4b4e-9d24-a57ee5255d53)) + (pin "1" (uuid 8a32c0a2-5157-46c1-9ffc-90073642e9d0)) + (pin "3" (uuid e20180c7-5e2a-45fe-8ae0-08449c33597e)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q6") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 113.03 109.22 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid c3004251-8088-4827-aa14-0a4ce9cc2dcb) + (property "Reference" "R1" (at 115.57 107.95 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "22k" (at 115.57 110.49 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 111.252 109.22 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 113.03 109.22 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 437993f0-7a9d-42e6-87c6-e461b227a337)) + (pin "2" (uuid 88a52db0-12c4-46d5-a901-1dc788c2190d)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Transistor_BJT:BC557") (at 91.44 53.34 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e18074c3-15bb-48dd-a644-780be992a99a) + (property "Reference" "Q1" (at 96.52 54.61 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC557" (at 96.52 52.07 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (at 96.52 51.435 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC556BTA-D.pdf" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Device" "PNP" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "GUMMELPOON" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=C 2=B 3=E" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Library" "BC547_and_BC557.lib" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Name" "BC557b" (at 91.44 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ac39719a-1b38-4901-adf8-afb9c6f1b1fc)) + (pin "2" (uuid 4d97f581-84ec-472f-b952-ecd17c27be04)) + (pin "3" (uuid b1b4cd83-1026-4a05-bb55-6c7551efa209)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "Q1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 81.28 53.34 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid e7236bba-1884-40d5-b2d5-3b06582681db) + (property "Reference" "R5" (at 81.28 46.99 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "4.7k" (at 81.28 49.53 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 81.28 55.118 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 81.28 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 81.28 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 81.28 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid d1a69e02-ddfd-4458-9128-a98a4aa419f2)) + (pin "1" (uuid 73b8599c-47ea-4703-9d21-eca93a510f81)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R5") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:VPULSE") (at 262.89 135.89 0) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid e7e16ff2-fd42-4d7f-b3c0-2d8d792d9503) + (property "Reference" "V_TXD1" (at 266.7 133.2202 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "VPULSE" (at 266.7 135.7602 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 262.89 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 262.89 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 262.89 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "PULSE" (at 262.89 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 262.89 135.89 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Sim.Params" "y1=3.3 y2=0 td=5m tr=2n tf=2n tw=0.4m per=2m np=3" (at 266.7 138.3002 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (pin "2" (uuid 226f822e-d132-4c9f-8e6f-dd413c9023a7)) + (pin "1" (uuid bcd28291-277f-47d5-8d9e-84e712dfbef2)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "V_TXD1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:R") (at 85.09 40.64 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid efcaf01a-542f-4f53-800a-efe3e3979d0e) + (property "Reference" "R2" (at 87.63 39.37 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.2k" (at 87.63 41.91 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal" (at 83.312 40.64 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 85.09 40.64 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "R" (at 85.09 40.64 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 85.09 40.64 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 20e40ffc-d633-4828-b531-961997cde439)) + (pin "1" (uuid 39844626-9c50-41ef-8860-1ae0bdb583c0)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "R2") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Simulation_SPICE:VDC") (at 248.92 135.89 0) (unit 1) + (in_bom no) (on_board no) (dnp no) (fields_autoplaced) + (uuid f69ca6e6-c1ae-4ffe-9afd-f64ccc3b1066) + (property "Reference" "V_USB1" (at 252.73 134.4902 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "5" (at 252.73 137.0302 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 248.92 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 248.92 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 248.92 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Type" "DC" (at 248.92 135.89 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "V" (at 248.92 135.89 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "2" (uuid 9218efc9-de31-4ced-a14a-f0c6e792cf1b)) + (pin "1" (uuid 40938104-262a-45b7-bc29-b13133e3a182)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "V_USB1") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C_Polarized") (at 114.3 71.12 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid ff3cc76a-1a65-43c7-a10c-c52bf541e8be) + (property "Reference" "C1" (at 113.411 63.5 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150u" (at 113.411 66.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D12.5mm_P7.50mm" (at 118.11 70.1548 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 114.3 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Device" "C" (at 114.3 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Sim.Pins" "1=+ 2=-" (at 114.3 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid dc84e234-298d-4b41-9f14-bfab0168c5e4)) + (pin "1" (uuid 32d8b955-5d5f-4f9e-ba02-1fa97f21c210)) + (instances + (project "SeaTalk1" + (path "/fef6b826-4a15-4295-9e8e-e163f69cffe7" + (reference "C1") (unit 1) + ) + ) + ) + ) + + (sheet_instances + (path "/" (page "1")) + ) +) diff --git a/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.wbk b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.wbk new file mode 100644 index 0000000000..713057609e --- /dev/null +++ b/src/devices/Seatalk1/schematics/SeaTalk1/SeaTalk1.wbk @@ -0,0 +1,14 @@ +version 2 +1 +9 +.tran 10u 20m{return}.kicad adjustpaths{return}.save all{return}.probe alli +3 +1 +V(Net-_J1-GPIO15/RXD_) + +1 +V(SEATALK) + +1 +V(TXD) + diff --git a/src/devices/Seatalk1/tests/AutoPilotRemoteControllerTests.cs b/src/devices/Seatalk1/tests/AutoPilotRemoteControllerTests.cs new file mode 100644 index 0000000000..7187f97ec5 --- /dev/null +++ b/src/devices/Seatalk1/tests/AutoPilotRemoteControllerTests.cs @@ -0,0 +1,309 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Iot.Device.Nmea0183.Sentences; +using Iot.Device.Seatalk1; +using Iot.Device.Seatalk1.Messages; +using Moq; +using UnitsNet; +using Xunit; + +namespace Iot.Device.Tests.Seatalk1 +{ + public sealed class AutoPilotRemoteControllerTests + { + private readonly Mock _interface; + private readonly AutoPilotRemoteController _testee; + private readonly CancellationTokenSource _tokenSource; + + public AutoPilotRemoteControllerTests() + { + _interface = new Mock(MockBehavior.Strict); + _testee = new AutoPilotRemoteController(_interface.Object); + _tokenSource = new CancellationTokenSource(); + } + + [Fact] + public void StartupWasSuccessful() + { + Assert.Equal(AutopilotStatus.Offline, _testee.Status); + Assert.Null(_testee.AutopilotDesiredHeading); + Assert.Null(_testee.AutopilotHeading); + Assert.Equal(AutopilotAlarms.None, _testee.Alarms); + Assert.False(_testee.RudderAngleAvailable); + } + + [Fact] + public void SetToStandby() + { + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Standby, AutoPilotCourse = Angle.FromDegrees(100), CompassHeading = Angle.FromDegrees(95) + }; + + _interface.Object.OnNewMessage(msg); + Assert.Equal(AutopilotStatus.Standby, _testee.Status); + Assert.Null(_testee.AutopilotDesiredHeading); + Assert.Equal(Angle.FromDegrees(95), _testee.AutopilotHeading); + Assert.Equal(AutopilotAlarms.None, _testee.Alarms); + Assert.False(_testee.RudderAngleAvailable); + } + + [Fact] + public void SetToAuto() + { + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(100), + CompassHeading = Angle.FromDegrees(95), + Alarms = AutopilotAlarms.OffCourse, + AutoPilotType = 2, + RudderPosition = Angle.FromDegrees(-10) + }; + + _interface.Object.OnNewMessage(msg); + Assert.Equal(AutopilotStatus.Auto, _testee.Status); + Assert.Equal(Angle.FromDegrees(100), _testee.AutopilotDesiredHeading); + Assert.Equal(Angle.FromDegrees(95), _testee.AutopilotHeading); + Assert.Equal(AutopilotAlarms.OffCourse, _testee.Alarms); + Assert.True(_testee.RudderAngleAvailable); + Assert.Equal(Angle.FromDegrees(-10), _testee.RudderAngle); + } + + [Fact] + public void AnglesOnly() + { + var msg = new CompassHeadingAndRudderPosition() + { + CompassHeading = Angle.FromDegrees(90), + RudderPosition = Angle.Zero, + }; + + _interface.Object.OnNewMessage(msg); + Assert.Null(_testee.AutopilotDesiredHeading); + Assert.Equal(Angle.FromDegrees(90), _testee.AutopilotHeading); + Assert.Equal(AutopilotAlarms.None, _testee.Alarms); + Assert.False(_testee.RudderAngleAvailable); + } + + [Fact] + public void TurnToHasNoEffectWhenStandby() + { + SetToStandby(); + Assert.Equal(AutopilotStatus.Standby, _testee.Status); + // Also: Shouldn't block, despite no Cancellation given + Assert.False(_testee.TurnTo(Angle.FromDegrees(100), TurnDirection.Starboard)); + } + + [Fact] + public void TurnToStarboard() + { + // Ap is in auto mode + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(10), + CompassHeading = Angle.FromDegrees(9), + }; + + _interface.Object.OnNewMessage(msg); + + Keystroke ks = new Keystroke(AutopilotButtons.PlusTen, 1); + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + Assert.True(ks.Equals(i)); + }).Returns(true); + _tokenSource.Cancel(); // Cancellation is only tested after the first command was sent + Assert.False(_testee.TurnBy(Angle.FromDegrees(90), TurnDirection.Starboard, _tokenSource.Token)); + + _interface.Verify(x => x.SendMessage(ks)); + } + + [Fact] + public void TurnToPort() + { + // Ap is in auto mode + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(10), + CompassHeading = Angle.FromDegrees(9), + }; + + _interface.Object.OnNewMessage(msg); + + Keystroke ks = new Keystroke(AutopilotButtons.MinusTen, 1); + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + Assert.Equal(ks, i); + }).Returns(true); + _tokenSource.Cancel(); // Cancellation is only tested after the first command was sent + Assert.False(_testee.TurnBy(Angle.FromDegrees(90), TurnDirection.Port, _tokenSource.Token)); + + _interface.Verify(x => x.SendMessage(ks)); + } + + [Fact] + public void TurnToPortFullSequence() + { + // Ap is in auto mode + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(10), + CompassHeading = Angle.FromDegrees(9), + }; + + _interface.Object.OnNewMessage(msg); + + int indexOfCommand = 0; + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + var ks = (Keystroke)i; + if (indexOfCommand == 0) + { + Assert.True(ks.ButtonsPressed == AutopilotButtons.MinusTen); + msg = msg with + { + AutoPilotCourse = Angle.Zero + }; + } + else if (indexOfCommand == 1) + { + Assert.True(ks.ButtonsPressed == AutopilotButtons.MinusOne); + msg = msg with + { + AutoPilotCourse = Angle.FromDegrees(359) + }; + } + else if (indexOfCommand == 2) + { + Assert.True(ks.ButtonsPressed == AutopilotButtons.MinusOne); + msg = msg with + { + AutoPilotCourse = Angle.FromDegrees(358) + }; + } + else + { + Assert.Fail("More commands sent than necessary"); + } + + _interface.Object.OnNewMessage(msg); + indexOfCommand++; + }).Returns(true); + + Assert.True(_testee.TurnBy(Angle.FromDegrees(12), TurnDirection.Port, _tokenSource.Token)); + } + + [Fact] + public void TurnTo() + { + // Ap is in auto mode + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(10), + CompassHeading = Angle.FromDegrees(9), + }; + + _interface.Object.OnNewMessage(msg); + + Keystroke ks = new Keystroke(AutopilotButtons.PlusTen, 1); // We expect that it's automatically guessing the "nearer" direction right + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + Assert.Equal(ks, i); + }).Returns(true); + _tokenSource.Cancel(); // Cancellation is only tested after the first command was sent + Assert.False(_testee.TurnTo(Angle.FromDegrees(100), null, _tokenSource.Token)); + + _interface.Verify(x => x.SendMessage(ks)); + } + + [Fact] + public void SetAndResetDeadbandMode() + { + SetToStandby(); + Assert.Equal(DeadbandMode.Automatic, _testee.DeadbandMode); + Assert.False(_testee.SetDeadbandMode(DeadbandMode.Minimal)); + SetToAuto(); + + int num = 0; + Keystroke ks = new Keystroke(0x0a); // We expect that it's automatically guessing the "nearer" direction right + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + if (num == 0) + { + Assert.Equal(ks, i); + var msg = new DeadbandSetting() + { + Mode = DeadbandMode.Minimal, + }; + + _interface.Object.OnNewMessage(msg); + } + else + { + var ks2 = (Keystroke)i; + Assert.Equal(0x09, ks2.KeyCode); + var msg = new DeadbandSetting() + { + Mode = DeadbandMode.Automatic, + }; + + _interface.Object.OnNewMessage(msg); + } + + num++; + }).Returns(true); + + Assert.True(_testee.SetDeadbandMode(DeadbandMode.Minimal)); + Assert.True(_testee.SetDeadbandMode(DeadbandMode.Automatic)); + } + + [Fact] + public void AnglesAreClose() + { + Assert.True(_testee.AnglesAreClose(Angle.FromDegrees(359), Angle.FromDegrees(0.1))); + Assert.True(_testee.AnglesAreClose(Angle.FromDegrees(360), Angle.FromDegrees(359))); + Assert.True(_testee.AnglesAreClose(Angle.FromDegrees(0), Angle.FromDegrees(359))); + Assert.True(_testee.AnglesAreClose(Angle.FromDegrees(181), Angle.FromDegrees(180))); + } + + [Fact] + public void ToStringTest() + { + Assert.NotEmpty(_testee.ToString()); + } + + [Fact] + public void SetToAutoRemotely() + { + SetToStandby(); + Keystroke ks = new Keystroke(AutopilotButtons.Auto, 1); // We expect that it's automatically guessing the "nearer" direction right + _interface.Setup(x => x.SendMessage(It.IsAny())).Callback(i => + { + Assert.Equal(ks, i); + var msg = new CompassHeadingAutopilotCourse() + { + AutopilotStatus = AutopilotStatus.Auto, + AutoPilotCourse = Angle.FromDegrees(10), + CompassHeading = Angle.FromDegrees(9), + }; + + _interface.Object.OnNewMessage(msg); + + }).Returns(true); + + TurnDirection? ignore = TurnDirection.Starboard; + Assert.True(_testee.SetStatus(AutopilotStatus.Auto, ref ignore)); + } + } +} diff --git a/src/devices/Seatalk1/tests/MessageTests.cs b/src/devices/Seatalk1/tests/MessageTests.cs new file mode 100644 index 0000000000..c49043f35a --- /dev/null +++ b/src/devices/Seatalk1/tests/MessageTests.cs @@ -0,0 +1,193 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Iot.Device.Seatalk1; +using Iot.Device.Seatalk1.Messages; +using UnitsNet; +using Xunit; + +namespace Iot.Device.Tests.Seatalk1 +{ + public class MessageTests + { + private Seatalk1Parser _parser; + public MessageTests() + { + _parser = new Seatalk1Parser(new MemoryStream()); + } + + [Theory] + [InlineData("95 86 26 97 02 00 00 00 08", typeof(CompassHeadingAutopilotCourseAlt))] + [InlineData("95 86 0E 00 10 00 00 04 08", typeof(CompassHeadingAutopilotCourseAlt))] + [InlineData("84 86 26 97 02 00 00 00 08", typeof(CompassHeadingAutopilotCourse))] + [InlineData("9c 01 12 00", typeof(CompassHeadingAndRudderPosition))] + [InlineData("87 00 01", typeof(DeadbandSetting))] + [InlineData("86 01 02 fd", typeof(Keystroke))] + [InlineData("10 01 00 01", typeof(ApparentWindAngle))] + [InlineData("85 06 00 00 C0 0D 1F 00 E0", typeof(NavigationToWaypoint))] + [InlineData("11 01 00 00", typeof(ApparentWindSpeed))] + public void KnownMessageTypeDecode(string msg, Type expectedType) + { + msg = msg.Replace(" ", string.Empty); + byte[] data = Convert.FromHexString(msg); + var actualType = _parser.GetTypeOfNextMessage(data, out int length); + Assert.NotNull(actualType); + Assert.Equal(data.Length, length); + + Assert.Equal(expectedType, actualType.GetType()); + } + + [Fact] + public void WithKeywordCreatesCopy() + { + var obj = new CompassHeadingAndRudderPosition() + { + CompassHeading = Angle.FromDegrees(10) + }; + + var copy = obj with + { + CompassHeading = Angle.FromDegrees(12) + }; + + Assert.False(ReferenceEquals(obj, copy)); + + Assert.NotEqual(obj, copy); + } + + [Fact] + public void EqualKeysAreEqual() + { + Keystroke ks1 = new Keystroke(AutopilotButtons.PlusTen, 1); + Keystroke ks2 = new Keystroke(AutopilotButtons.PlusTen, 1); + Assert.Equal(ks1, ks2); + Assert.True(ks1.Equals(ks2)); + Assert.Equal(ks1.GetHashCode(), ks2.GetHashCode()); + } + + [Fact] + public void UnEqualKeysAreNotEqual() + { + Keystroke ks1 = new Keystroke(AutopilotButtons.PlusTen, 1); + Keystroke ks2 = new Keystroke(AutopilotButtons.MinusTen, 1); + Assert.NotEqual(ks1, ks2); + Assert.False(ks1.Equals(ks2)); + Assert.NotEqual(ks1.GetHashCode(), ks2.GetHashCode()); + } + + [Theory] + [InlineData(10.0)] + [InlineData(0.0)] + [InlineData(-11.0)] + public void SignIsMaintainedInWindAngle(double value) + { + ApparentWindAngle angle = new ApparentWindAngle(Angle.FromDegrees(value)); + byte[] data = angle.CreateDatagram(); + var angle2 = angle.CreateNewMessage(data); + Assert.Equal(angle, angle2); + } + + [Fact] + public void NavigationToWaypointMessage1() + { + var n = new NavigationToWaypoint() + { + BearingToDestination = Angle.FromDegrees(230), + CrossTrackError = Length.FromNauticalMiles(2.61), + DistanceToDestination = Length.FromNauticalMiles(5.13), + }; + + byte[] data = n.CreateDatagram(); + // Cross track error + Assert.Equal(0x85, data[0]); + Assert.Equal(0x56, data[1]); + Assert.Equal(0x10, data[2]); + + // Distance + Assert.Equal(0x10, data[4] & 0xF0); + Assert.Equal(0x20, data[5]); + Assert.Equal(0x10, data[6] & 0xF0); + + // Bearing + Assert.Equal(0x42, data[3]); + Assert.Equal(0x06, data[4] & 0x0F); + + Assert.Equal(0x0F, data[6] & 0xF); // flags + + var reverse = n.CreateNewMessage(data); + Assert.Equal(n, reverse); + } + + [Fact] + public void NavigationToWaypointMessage2() + { + var n = new NavigationToWaypoint() + { + BearingToDestination = Angle.FromDegrees(0), + BearingIsTrue = true, + CrossTrackError = Length.FromNauticalMiles(-2.61), + DistanceToDestination = Length.FromNauticalMiles(51.3), + }; + + byte[] data = n.CreateDatagram(); + // Cross track error + Assert.Equal(0x85, data[0]); + Assert.Equal(0x56, data[1]); + Assert.Equal(0x10, data[2]); + + // Distance + Assert.Equal(0x10, data[4] & 0xF0); + Assert.Equal(0x20, data[5]); + Assert.Equal(0x40, data[6] & 0xF0); + + // Bearing + Assert.Equal(0x08, data[3]); + Assert.Equal(0x00, data[4] & 0x0F); + + Assert.Equal(0x0F, data[6] & 0xF); // flags + + var reverse = n.CreateNewMessage(data); + Assert.Equal(n, reverse); + } + + [Fact] + public void NavigationToWaypointMessage3() + { + var n = new NavigationToWaypoint() + { + BearingToDestination = Angle.FromDegrees(299.5), + BearingIsTrue = true, + CrossTrackError = Length.FromNauticalMiles(-0.1), + DistanceToDestination = Length.FromNauticalMiles(5.3), + }; + + byte[] data = n.CreateDatagram(); + var reverse = n.CreateNewMessage(data); + Assert.Equal(n, reverse); + } + + [Fact] + public void WindSpeedMessage() + { + var windSpeed = new ApparentWindSpeed() + { + ApparentSpeed = Speed.FromKnots(12.2) + }; + + byte[] data = windSpeed.CreateDatagram(); + Assert.Equal(0x11, data[0]); + Assert.Equal(0x1, data[1]); + Assert.Equal(12, data[2]); + Assert.Equal(2, data[3]); + + var reverse = windSpeed.CreateNewMessage(data); + Assert.Equal(windSpeed, reverse); + } + } +} diff --git a/src/devices/Seatalk1/tests/Seatalk1.Tests.csproj b/src/devices/Seatalk1/tests/Seatalk1.Tests.csproj new file mode 100644 index 0000000000..0e08b4d22b --- /dev/null +++ b/src/devices/Seatalk1/tests/Seatalk1.Tests.csproj @@ -0,0 +1,15 @@ + + + + $(DefaultSampleTfms) + 10 + false + false + Iot.Device.Tests.Seatalk1 + + + + + + + diff --git a/src/devices/Seatalk1/tests/Seatalk1Tests.cs b/src/devices/Seatalk1/tests/Seatalk1Tests.cs new file mode 100644 index 0000000000..c5140b6eb3 --- /dev/null +++ b/src/devices/Seatalk1/tests/Seatalk1Tests.cs @@ -0,0 +1,213 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.ComponentModel; +using System.IO; +using System.IO.Ports; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using Iot.Device.Seatalk1; +using Iot.Device.Seatalk1.Messages; +using UnitsNet; +using Xunit; + +namespace Iot.Device.Tests.Seatalk1 +{ + public class Seatalk1Tests + { + [Fact] + public void DecodeSomeSentences() + { + string data = @"9c 01 12 00 +84 06 12 00 00 00 00 00 08 +86 01 02 fd +84 06 12 00 00 00 00 00 08 +9c 01 12 00 +84 06 12 00 00 00 00 00 08"; + MemoryStream ms = GetStreamFromInputString(data); + + int numMessages = 0; + Seatalk1Parser parser = new Seatalk1Parser(ms); + parser.NewMessageDecoded += message => + { + numMessages++; + Assert.NotNull(message); + Assert.True(message.ExpectedLength >= 3); + if (message is CompassHeadingAndRudderPosition ch) + { + Assert.Equal(Angle.FromDegrees(36), ch.CompassHeading); + } + + if (message is Keystroke ks) + { + Assert.Equal(AutopilotButtons.StandBy, ks.ButtonsPressed); + } + }; + parser.StartDecode(); + + int cnt = 10; + while (numMessages != 6 && cnt-- >= 0) + { + Thread.Sleep(100); + } + + parser.StopDecode(); + + Assert.True(cnt > 0); // timeout? + + parser.Dispose(); + } + + [Fact] + public void SkipSomeGarbage() + { + // The second row is garbled (for this test, at least 18 bytes must be in the input after the garbage) + string data = @"9c 01 12 00 +0A 02 12 00 00 FF DD 00 08 +86 01 02 fd +84 06 12 00 00 00 00 00 08 +9c 01 12 00 +84 06 12 00 00 00 00 00 08"; + MemoryStream ms = GetStreamFromInputString(data); + + int numMessages = 0; + Seatalk1Parser parser = new Seatalk1Parser(ms); + parser.NewMessageDecoded += message => + { + numMessages++; + }; + parser.StartDecode(); + + int cnt = 100; + while (numMessages != 5 && cnt-- >= 0) + { + Thread.Sleep(100); + } + + parser.StopDecode(); + + Assert.True(cnt > 0); // timeout? + + parser.Dispose(); + } + + [Fact] + public void ParityBitCheckForMessageThatWorks() + { + // This message (-10 key) worked right away + byte[] datagram = new byte[] + { + 0x86, 0x11, 0x06, 0xf9 + }; + + var withParity = SeatalkInterface.CalculateParityForEachByte(datagram); + Assert.Equal(0x86, withParity[0].B); + Assert.Equal(0, withParity[0].Index); + // 0x86 is odd (not the value, but it's bitcount), and we want the stopbit to be 1, so the parity should be even + Assert.Equal(Parity.Even, withParity[0].P); + // 0x11 is even, but we need the stopbit to be 0, so parity still needs to be even + Assert.Equal(Parity.Even, withParity[1].P); + // 0x06 is even, we need the stopbit to be 0, so parity still needs to be even + Assert.Equal(Parity.Even, withParity[2].P); + // 0xf9 is even, we need the stopbit to be 0, so parity still needs to be even + Assert.Equal(Parity.Even, withParity[3].P); + } + + [Fact] + public void ParityBitCheckForMessageThatMustWork() + { + // This message took a bit to get right + byte[] datagram = new byte[] + { + 0x86, 0x11, 0x08, 0xf7 + }; + + var withParity = SeatalkInterface.CalculateParityForEachByte(datagram); + Assert.Equal(0x86, withParity[0].B); + Assert.Equal(0, withParity[0].Index); + // 0x86 is odd (not the value, but it's bitcount), and we want the stopbit to be 1, so the parity should be even + Assert.Equal(Parity.Even, withParity[0].P); + // 0x11 is even, but we need the stopbit to be 0, so parity still needs to be even + Assert.Equal(Parity.Even, withParity[1].P); + // 0x08 is odd, we need the stopbit to be 0, so parity needs to be odd + Assert.Equal(Parity.Odd, withParity[2].P); + // 0xf7 is odd, we need the stopbit to be 0, so parity needs to be odd + Assert.Equal(Parity.Odd, withParity[3].P); + } + + [Fact] + public void ParityBitCheckForMessageWithOddCommandByte() + { + byte[] datagram = new byte[] + { + 0x9C, 0x01, 0x03, 0x0f + }; + + var withParity = SeatalkInterface.CalculateParityForEachByte(datagram); + Assert.Equal(0x9c, withParity[0].B); + Assert.Equal(0, withParity[0].Index); + // 0x9c is even (not the value, but it's bitcount), and we want the stopbit to be 1, so the parity should be odd + Assert.Equal(Parity.Odd, withParity[0].P); + // 0x01 is odd, we need the stopbit to be 0, so parity needs to be odd + Assert.Equal(Parity.Odd, withParity[1].P); + // 0x03 is even, we need the stopbit to be 0, so parity needs to be even + Assert.Equal(Parity.Even, withParity[2].P); + } + + [Fact] + public void CanBasicRoundTripMessages() + { + MemoryStream ms = new MemoryStream(); + + Seatalk1Parser parser = new Seatalk1Parser(ms); + foreach (var m in parser.MessageTypes) + { + // we already have an instance of each message type + byte[] data = m.CreateDatagram(); + var decoded = parser.GetTypeOfNextMessage(data, out int bytesOfNewMessage); + Assert.NotNull(decoded); + Assert.NotEqual(0, bytesOfNewMessage); + Assert.Equal(m.GetType(), decoded.GetType()); + Assert.Equal(m, decoded); + } + } + + [Theory] + [InlineData("9c 01 12 00")] + [InlineData("84 06 12 00 00 00 00 00 08")] + [InlineData("86 01 02 fd")] + [InlineData("95 86 26 97 02 00 00 00 08")] + [InlineData("87 00 01")] + [InlineData("87 00 02")] + [InlineData("10 01 00 01")] + [InlineData("85 06 00 00 C0 0D 17 00 E8")] + [InlineData("11 01 12 04")] + public void ParseAndBack(string inputSentence) + { + var split = inputSentence.Split(new char[] { '\n', '\r', ' ' }, StringSplitOptions.RemoveEmptyEntries); + // FromHexString expects an uninterrupted sequence of two-char pairs + byte[] inputDatagram = Convert.FromHexString(string.Join(string.Empty, split)); + + MemoryStream ms = new MemoryStream(); + Seatalk1Parser parser = new Seatalk1Parser(ms); + + var msg = parser.GetTypeOfNextMessage(inputDatagram, out int bytesInMessage); + Assert.NotNull(msg); + Assert.NotEqual(0, bytesInMessage); + + byte[] roundTripped = msg.CreateDatagram(); + Assert.Equal(inputDatagram, roundTripped); + } + + private static MemoryStream GetStreamFromInputString(string data) + { + var split = data.Split(new char[] { '\n', '\r', ' ' }, StringSplitOptions.RemoveEmptyEntries); + // FromHexString expects an uninterrupted sequence of two-char pairs + byte[] input = Convert.FromHexString(string.Join(string.Empty, split)); + + MemoryStream ms = new MemoryStream(input); + return ms; + } + } +}