示例#1
0
 internal static bool PinIsTX(BBBPin Pin)
 {
     switch (Pin)
     {
     case BBBPin.P9_24:
     case BBBPin.P9_21:
     case BBBPin.P9_42:
     case BBBPin.P9_13: return(true);
     }
     return(false);
 }
示例#2
0
 /// <summary> Converts a Scarlet BBBPin to a BBBCSIO GpioEnum. </summary>
 public static GpioEnum PinToGPIO(BBBPin Pin)
 {
     if (PinInfo.ContainsKey(Pin))
     {
         return(PinInfo[Pin].GPIO);
     }
     else
     {
         return(GpioEnum.GPIO_NONE);
     }
 }
示例#3
0
 /// <summary> Returns the memory address offset for each pin. Returns 0x000 if not found or invalid input. </summary>
 internal static int GetOffset(BBBPin Pin)
 {
     if (PinInfo.ContainsKey(Pin))
     {
         return(PinInfo[Pin].Offset);
     }
     else
     {
         return(0x000);
     }
 }
示例#4
0
 public DigitalInBBB(BBBPin Pin)
 {
     this.Pin = Pin;
     if (BeagleBone.FastGPIO)
     {
         this.InputPort = new InputPortMM(IO.BeagleBone.Pin.PinToGPIO(this.Pin));
     }
     else
     {
         this.InputPort = new InputPortFS(IO.BeagleBone.Pin.PinToGPIO(this.Pin));
     }
 }
示例#5
0
        /// <summary> Converts a pin number to the corresponding CAN bus ID. 255 if invalid. </summary>
        static internal byte PinToCANBus(BBBPin Pin)
        {
            switch (Pin)
            {
            case BBBPin.P9_19:
            case BBBPin.P9_20: return(0);

            case BBBPin.P9_24:
            case BBBPin.P9_26: return(1);
            }
            return(255);
        }
示例#6
0
 public DigitalOutBBB(BBBPin Pin)
 {
     if (!IO.BeagleBone.Pin.CheckPin(Pin, BeagleBone.Peripherals))
     {
         throw new ArgumentOutOfRangeException("Cannot use pin " + Enum.GetName(typeof(BBBPin), Pin) + " in current peripheral mode.");
     }
     this.Pin = Pin;
     if (BeagleBone.FastGPIO)
     {
         this.OutputPort = new OutputPortMM(IO.BeagleBone.Pin.PinToGPIO(this.Pin));
     }
     else
     {
         this.OutputPort = new OutputPortFS(IO.BeagleBone.Pin.PinToGPIO(this.Pin));
     }
 }
示例#7
0
        /// <summary> Converts a pin number to the corresponding UART bus ID.</summary>
        /// <param name="Pin"> The pin to translate. </param>
        /// <returns> The corresponding UART bus ID, or 255 if the input is invalid.</returns>
        internal static byte PinToUARTBus(BBBPin Pin)
        {
            switch (Pin)
            {
            case BBBPin.P9_24:
            case BBBPin.P9_26: return(1);

            case BBBPin.P9_21:
            case BBBPin.P9_22: return(2);

            case BBBPin.P9_42: return(3);

            case BBBPin.P9_13:
            case BBBPin.P9_11: return(4);
            }
            return(255);
        }
示例#8
0
 public static BBBPin StringToPin(string pinName)
 {
     try
     {
         BBBPin Value = (BBBPin)Enum.Parse(typeof(BBBPin), pinName);
         if (Enum.IsDefined(typeof(BBBPin), Value))
         {
             return(Value);
         }
         else
         {
             throw new IndexOutOfRangeException("Not a pin");
         }
     }
     catch
     {
         TestMain.ErrorExit("Given BBBPin is invalid.");
         return(BBBPin.NONE);
     }
 }
示例#9
0
        /// <summary> Determines if the given pin can be used in the system mode, or if it used by another device. </summary>
        public static bool CheckPin(BBBPin Pin, SystemMode Mode)
        {
            if (!PinInfo.ContainsKey(Pin))
            {
                return(false);
            }

            if (Mode == SystemMode.DEFAULT)
            {
                return(PinInfo[Pin].Devices == 0);
            }                                                                    // No devices must be present.
            else if (Mode == SystemMode.NO_STORAGE)
            {
                return((PinInfo[Pin].Devices & 0b1111_1110) == 0);
            }                                                                                            // No devices except for eMMC must be present.
            else if (Mode == SystemMode.NO_HDMI)
            {
                return((PinInfo[Pin].Devices & 0b1111_1101) == 0);
            }              // No devices except for HDMI must be present.
            return(false); // Invalid system mode.
        }
示例#10
0
        /// <summary> Converts a Scarlet BBBPin to a BBBCSIO A2DPinEnum. </summary>
        public static A2DPortEnum PinToA2D(BBBPin Pin)
        {
            switch (Pin)
            {
            case BBBPin.P9_39: return(A2DPortEnum.AIN_0);

            case BBBPin.P9_40: return(A2DPortEnum.AIN_1);

            case BBBPin.P9_37: return(A2DPortEnum.AIN_2);

            case BBBPin.P9_38: return(A2DPortEnum.AIN_3);

            case BBBPin.P9_33: return(A2DPortEnum.AIN_4);

            case BBBPin.P9_36: return(A2DPortEnum.AIN_5);

            case BBBPin.P9_35: return(A2DPortEnum.AIN_6);

            default: return(A2DPortEnum.AIN_NONE);
            }
        }
示例#11
0
        /// <summary> Prepares the analogue input for use. This can block for up to 5 seconds while the hardware and kernel are intiializing. </summary>
        /// <param name="Pin"> The pin on the BeagleBone to use for analogue input. Must be one of the 7 AIN pins. </param>
        /// <exception cref="TimeoutException"> If the hardware/kernel take longer than 5 seconds to initialize. </exception>
        public AnalogueInBBB(BBBPin Pin)
        {
            this.Pin = Pin;
            // The ADC input file is not always available immediately, it can take a bit for it to be available after device tree overaly application.
            // Therefore, we will wait for it for up to 5 seconds, then throw an error if it is not ready at that time.
            string Filename = "/sys/bus/iio/devices/iio:device0/in_voltage";

            switch (this.Pin)
            {
            case BBBPin.P9_39: Filename += 0; break;

            case BBBPin.P9_40: Filename += 1; break;

            case BBBPin.P9_37: Filename += 2; break;

            case BBBPin.P9_38: Filename += 3; break;

            case BBBPin.P9_33: Filename += 4; break;

            case BBBPin.P9_36: Filename += 5; break;

            case BBBPin.P9_35: Filename += 6; break;

            default: throw new Exception("Given pin is not a valid ADC pin!");
            }
            Filename += "_raw";
            DateTime Timeout = DateTime.Now.Add(TimeSpan.FromSeconds(5));

            while (!File.Exists(Filename))
            {
                if (DateTime.Now > Timeout)
                {
                    Log.Output(Log.Severity.ERROR, Log.Source.HARDWAREIO, "ADC Failed to initialize.");
                    throw new TimeoutException("ADC failed to initialize within the timeout period.");
                }
                Thread.Sleep(50);
            }
            this.Port = new A2DPortFS(IO.BeagleBone.Pin.PinToA2D(this.Pin));
        }
示例#12
0
        /// <summary> Gets the PWM output corresponding to a given pin on the BeagleBone Black. </summary>
        /// <param name="Pin"> The pin to find a PWM output associated with. </param>
        /// <returns> A <see cref="PWMOutputBBB"/>, or <c>null</c> if the given pin is not valid. </returns>
        public static PWMOutputBBB GetFromPin(BBBPin Pin)
        {
            switch (Pin)
            {
            case BBBPin.P9_22:
            case BBBPin.P9_31: return(PWMDevice0.OutputA);

            case BBBPin.P9_21:
            case BBBPin.P9_29: return(PWMDevice0.OutputB);

            case BBBPin.P9_14:
            case BBBPin.P8_36: return(PWMDevice1.OutputA);

            case BBBPin.P9_16:
            case BBBPin.P8_34: return(PWMDevice1.OutputB);

            case BBBPin.P8_19:
            case BBBPin.P8_45: return(PWMDevice2.OutputA);

            case BBBPin.P8_13:
            case BBBPin.P8_46: return(PWMDevice2.OutputB);
            }
            return(null);
        }
示例#13
0
        /// <summary> Converts a pin number to the corresponding PWM device and output number. Needed as every output is connected to 2 physical pins. </summary>
        /// <param name="Pin"> The pin to find the PWM ID of. </param>
        /// <returns> The PWM ID corresponding to the pin, or <see cref="PWMPortEnum.PWM_NONE"/> if the given pin is invalid. </returns>
        internal static PWMPortEnum PinToPWMID(BBBPin Pin)
        {
            switch (Pin)
            {
            case BBBPin.P9_22:
            case BBBPin.P9_31: return(PWMPortEnum.PWM0_A);

            case BBBPin.P9_21:
            case BBBPin.P9_29: return(PWMPortEnum.PWM0_B);

            case BBBPin.P9_14:
            case BBBPin.P8_36: return(PWMPortEnum.PWM1_A);

            case BBBPin.P9_16:
            case BBBPin.P8_34: return(PWMPortEnum.PWM1_B);

            case BBBPin.P8_19:
            case BBBPin.P8_45: return(PWMPortEnum.PWM2_A);

            case BBBPin.P8_13:
            case BBBPin.P8_46: return(PWMPortEnum.PWM2_B);
            }
            return(PWMPortEnum.PWM_NONE);
        }
示例#14
0
        public static void Start(string[] args)
        {
            if (args.Length < 3)
            {
                TestMain.ErrorExit("io bbb command requires functionality to test.");
            }
            BeagleBone.Initialize(SystemMode.DEFAULT, true);

            switch (args[2].ToLower())
            {
            case "digin":
            {
                if (args.Length < 4)
                {
                    TestMain.ErrorExit("io bbb digin command requires pin to test.");
                }
                BBBPin InputPin = StringToPin(args[3]);
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Testing digital input on BBB pin " + InputPin.ToString());
                BBBPinManager.AddMappingGPIO(InputPin, false, ResistorState.PULL_DOWN);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IDigitalIn Input = new DigitalInBBB(InputPin);
                while (true)
                {
                    Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Current pin state: " + (Input.GetInput() ? "HIGH" : "LOW"));
                    Thread.Sleep(250);
                }
            }

            case "digout":
            {
                if (args.Length < 4)
                {
                    TestMain.ErrorExit("io bbb digout command requires pin to test.");
                }
                BBBPin OutputPin = StringToPin(args[3]);
                if (args.Length < 5)
                {
                    TestMain.ErrorExit("io bbb digout command requires output mode (high/low/blink).");
                }
                if (args[4] != "high" && args[4] != "low" && args[4] != "blink")
                {
                    TestMain.ErrorExit("Invalid digout test mode supplied.");
                }
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Testing digital output on BBB pin " + OutputPin.ToString());
                BBBPinManager.AddMappingGPIO(OutputPin, true, ResistorState.PULL_DOWN);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IDigitalOut Output = new DigitalOutBBB(OutputPin);
                if (args[4] == "high")
                {
                    Output.SetOutput(true);
                }
                else if (args[4] == "low")
                {
                    Output.SetOutput(false);
                }
                else
                {
                    bool Out = false;
                    while (true)
                    {
                        Output.SetOutput(Out);
                        Out = !Out;
                        Thread.Sleep(250);
                    }
                }
                break;
            }

            case "pwm":
            {
                if (args.Length < 4)
                {
                    TestMain.ErrorExit("io bbb pwm command requires pin to test.");
                }
                BBBPin OutputPin = StringToPin(args[3]);
                if (args.Length < 5)
                {
                    TestMain.ErrorExit("io bbb pwm command requires frequency.");
                }
                int Frequency = int.Parse(args[4]);
                if (args.Length < 6)
                {
                    TestMain.ErrorExit("io bbb pwm command requires output mode.");
                }
                if (args[5] != "per" && args[5] != "sine")
                {
                    TestMain.ErrorExit("io bbb pwm command invalid (per/sine).");
                }
                if (args[5] == "per" && args.Length < 7)
                {
                    TestMain.ErrorExit("io bbb pwm per must be provided duty cycle.");
                }
                BBBPinManager.AddMappingPWM(OutputPin);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IPWMOutput Output = PWMBBB.GetFromPin(OutputPin);
                Output.SetFrequency(Frequency);
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Testing PWM output on BBB pin " + OutputPin.ToString() + " at " + Frequency + "Hz.");
                if (args[5] == "per")
                {
                    Output.SetOutput(int.Parse(args[6]) / 100F);
                    Output.SetEnabled(true);
                    Thread.Sleep(15000);     // Not sure if it stops outputting when the program exits.
                }
                else
                {
                    int Cycle = 0;
                    while (true)
                    {
                        float Val = (float)((Math.Sin(Cycle * Math.PI / 180.000D) + 1) / 2);
                        Output.SetOutput(Val);
                        Thread.Sleep(50);
                        Cycle += 20;
                    }
                }
                break;
            }

            case "adc":
            {
                if (args.Length < 4)
                {
                    TestMain.ErrorExit("io bbb adc command requires pin to test.");
                }
                BBBPin InputPin = StringToPin(args[3]);
                BBBPinManager.AddMappingADC(InputPin);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IAnalogueIn Input = new AnalogueInBBB(InputPin);
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Testing analogue input on BBB pin " + InputPin.ToString());
                while (true)
                {
                    Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "ADC Input: " + Input.GetInput() + " (Raw: " + Input.GetRawInput() + ")");
                    Thread.Sleep(250);
                }
            }

            case "int":
            {
                if (args.Length < 4)
                {
                    TestMain.ErrorExit("io bbb int command requires pin to test.");
                }
                BBBPin InputPin = StringToPin(args[3]);
                if (args.Length < 5)
                {
                    TestMain.ErrorExit("io bbb int command requires interrupt mode (rise/fall/both).");
                }
                if (args[4] != "rise" && args[4] != "fall" && args[4] != "both")
                {
                    TestMain.ErrorExit("Invalid interrupt mode supplied.");
                }

                BBBPinManager.AddMappingGPIO(InputPin, true, ResistorState.PULL_DOWN);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IDigitalIn Input = new DigitalInBBB(InputPin);
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Testing interrupts on BBB pin " + InputPin.ToString());
                switch (args[4])
                {
                case "rise": ((IInterruptSource)Input).RegisterInterruptHandler(GetInterrupt, InterruptType.RISING_EDGE); break;

                case "fall": ((IInterruptSource)Input).RegisterInterruptHandler(GetInterrupt, InterruptType.FALLING_EDGE); break;

                case "both": ((IInterruptSource)Input).RegisterInterruptHandler(GetInterrupt, InterruptType.ANY_EDGE); break;
                }
                while (true)
                {
                    Thread.Sleep(50);
                }                                     // Program needs to be running to receive.
            }

            case "mtk3339":
            {
                BBBPinManager.AddMappingUART(BBBPin.P9_24);
                BBBPinManager.AddMappingUART(BBBPin.P9_26);
                BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_REGARDLESS);
                IUARTBus UART = UARTBBB.UARTBus1;
                Log.Output(Log.Severity.INFO, Log.Source.HARDWAREIO, "Press any key to stop.");
                while (Console.KeyAvailable)
                {
                    Console.ReadKey();
                }
                byte[] Buffer = new byte[32];
                while (true)
                {
                    Thread.Sleep(10);
                    if (UART.BytesAvailable() > 0)
                    {
                        int Count = UART.Read(32, Buffer);
                        Console.Write(System.Text.Encoding.ASCII.GetString(UtilMain.SubArray(Buffer, 0, Count)));
                    }
                    if (Console.KeyAvailable)
                    {
                        break;
                    }
                }
                break;
            }
            }
        }
示例#15
0
        /// <summary> Gets the mux mode that needs to be used for the given pin usage. Returns 255 if invalid usage provided. </summary>
        internal static byte GetModeID(BBBPin Pin, BBBPinMode Mode)
        {
            // Definitely not the prettiest code in the world.
            // Source: http://www.ofitselfso.com/BeagleNotes/BeagleboneBlackPinMuxModes.php
            switch (Pin)
            {
            // P8 Header
            case BBBPin.P8_03:
            case BBBPin.P8_04:
            case BBBPin.P8_05:
            case BBBPin.P8_06:
            case BBBPin.P8_07:
            case BBBPin.P8_08:
            case BBBPin.P8_09:
            case BBBPin.P8_10:
            case BBBPin.P8_11:
            case BBBPin.P8_12:    //
            case BBBPin.P8_14:
            case BBBPin.P8_15:
            case BBBPin.P8_16:
            case BBBPin.P8_17:
            case BBBPin.P8_18:    //
            case BBBPin.P8_20:
            case BBBPin.P8_21:
            case BBBPin.P8_22:
            case BBBPin.P8_23:
            case BBBPin.P8_24:
            case BBBPin.P8_25:
            case BBBPin.P8_26:
            case BBBPin.P8_27:
            case BBBPin.P8_28:
            case BBBPin.P8_29:
            case BBBPin.P8_30:
            case BBBPin.P8_31:
            case BBBPin.P8_32:
            case BBBPin.P8_33:    //
            case BBBPin.P8_35:    //
            case BBBPin.P8_39:
            case BBBPin.P8_40:
            case BBBPin.P8_41:
            case BBBPin.P8_42:
            case BBBPin.P8_43:
            case BBBPin.P8_44:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P8_13:
            case BBBPin.P8_19:
                if (Mode == BBBPinMode.PWM)
                {
                    return(4);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P8_34:
            case BBBPin.P8_36:
                if (Mode == BBBPinMode.PWM)
                {
                    return(2);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P8_37:
            case BBBPin.P8_38:
                if (Mode == BBBPinMode.UART)
                {
                    return(4);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P8_45:
            case BBBPin.P8_46:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else if (Mode == BBBPinMode.PWM)
                {
                    return(3);
                }
                else
                {
                    return(255);
                }


            // P9 Header
            case BBBPin.P9_11:
            case BBBPin.P9_13:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else if (Mode == BBBPinMode.UART)
                {
                    return(6);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_12:
            case BBBPin.P9_15:
            case BBBPin.P9_23:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_14:
            case BBBPin.P9_16:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else if (Mode == BBBPinMode.PWM)
                {
                    return(6);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_17:
            case BBBPin.P9_18:
                if (Mode == BBBPinMode.SPI)
                {
                    return(0);
                }
                else if (Mode == BBBPinMode.I2C)
                {
                    return(2);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_19:
            case BBBPin.P9_20:
                if (Mode == BBBPinMode.I2C)
                {
                    return(3);
                }
                if (Mode == BBBPinMode.SPI)
                {
                    return(4);
                }
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_21:
            case BBBPin.P9_22:
                if (Mode == BBBPinMode.SPI)
                {
                    return(0);
                }
                else if (Mode == BBBPinMode.UART)
                {
                    return(1);
                }
                else if (Mode == BBBPinMode.I2C)
                {
                    return(2);
                }
                else if (Mode == BBBPinMode.PWM)
                {
                    return(3);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_24:
            case BBBPin.P9_26:
                if (Mode == BBBPinMode.UART)
                {
                    return(0);
                }
                else if (Mode == BBBPinMode.I2C)
                {
                    return(3);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_25:
            case BBBPin.P9_27:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_29:
            case BBBPin.P9_31:
                if (Mode == BBBPinMode.SPI)
                {
                    return(3);
                }
                else if (Mode == BBBPinMode.PWM)
                {
                    return(1);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_28:
            case BBBPin.P9_30:
                if (Mode == BBBPinMode.SPI)
                {
                    return(3);
                }
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_33:
            case BBBPin.P9_35:
            case BBBPin.P9_36:
            case BBBPin.P9_37:
            case BBBPin.P9_38:
            case BBBPin.P9_39:
            case BBBPin.P9_40:
                if (Mode == BBBPinMode.ADC)
                {
                    return(0);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_41:
                if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }

            case BBBPin.P9_42:
                if (Mode == BBBPinMode.SPI)
                {
                    return(4);
                }
                else if (Mode == BBBPinMode.UART)
                {
                    return(1);
                }                                                   // TODO: Not sure if this works.
                else if (Mode == BBBPinMode.GPIO)
                {
                    return(7);
                }
                else
                {
                    return(255);
                }
            }
            return(255);
        }
示例#16
0
        public static void Start(string[] args)
        {
            if (args.Length < 2)
            {
                TestMain.ErrorExit("Device testing needs device to test.");
            }
            switch (args[1].ToLower())
            {
            case "hx711":
            {
                if (args.Length < 5)
                {
                    TestMain.ErrorExit("Insufficient info to run HX711 test. See help.");
                }
                IDigitalIn  DataPin  = null;
                IDigitalOut ClockPin = null;
                if (args[2].Equals("pi", StringComparison.InvariantCultureIgnoreCase))
                {
                    RaspberryPi.Initialize();
                    DataPin  = new DigitalInPi(int.Parse(args[3]));
                    ClockPin = new DigitalOutPi(int.Parse(args[4]));
                }
                else if (args[2].Equals("bbb", StringComparison.InvariantCultureIgnoreCase))
                {
                    BeagleBone.Initialize(SystemMode.DEFAULT, true);
                    BBBPin DataBBBPin  = IOBBB.StringToPin(args[3]);
                    BBBPin ClockBBBPin = IOBBB.StringToPin(args[4]);
                    BBBPinManager.AddMappingGPIO(DataBBBPin, false, ResistorState.NONE);
                    BBBPinManager.AddMappingGPIO(ClockBBBPin, true, ResistorState.NONE);
                    BBBPinManager.ApplyPinSettings(BBBPinManager.ApplicationMode.APPLY_IF_NONE);
                    DataPin  = new DigitalInBBB(DataBBBPin);
                    ClockPin = new DigitalOutBBB(ClockBBBPin);
                }
                else
                {
                    TestMain.ErrorExit("HX711 test: Unknown platform. See help.");
                }
                HX711 DUT = new HX711(ClockPin, DataPin);
                while (Console.KeyAvailable)
                {
                    Console.ReadKey();
                }
                Log.Output(Log.Severity.INFO, Log.Source.GUI, "[w] to increase gain, [s] to decrease. [z] to zero.");
                Log.Output(Log.Severity.INFO, Log.Source.GUI, "Press any other key to exit.");

                HX711.Gain Gain     = HX711.Gain.GAIN_128x;
                bool       Continue = true;
                while (Continue)
                {
                    if (Console.KeyAvailable)
                    {
                        char Key = Console.ReadKey().KeyChar;
                        switch (Key)
                        {
                        case 'w':
                        {
                            if (Gain == HX711.Gain.GAIN_32x)
                            {
                                Gain = HX711.Gain.GAIN_64x;
                            }
                            else if (Gain == HX711.Gain.GAIN_64x)
                            {
                                Gain = HX711.Gain.GAIN_128x;
                            }
                            else
                            {
                                Log.Output(Log.Severity.ERROR, Log.Source.SENSORS, "Gain at maximum already.");
                            }
                            DUT.SetGain(Gain);
                            Log.Output(Log.Severity.INFO, Log.Source.SENSORS, "Gain now at " + Gain);
                            break;
                        }

                        case 's':
                        {
                            if (Gain == HX711.Gain.GAIN_128x)
                            {
                                Gain = HX711.Gain.GAIN_64x;
                            }
                            else if (Gain == HX711.Gain.GAIN_64x)
                            {
                                Gain = HX711.Gain.GAIN_32x;
                            }
                            else
                            {
                                Log.Output(Log.Severity.ERROR, Log.Source.SENSORS, "Gain at minimum already.");
                            }
                            DUT.SetGain(Gain);
                            Log.Output(Log.Severity.INFO, Log.Source.SENSORS, "Gain now at " + Gain);
                            break;
                        }

                        case 'z':
                        {
                            DUT.Tare();
                            Log.Output(Log.Severity.INFO, Log.Source.SENSORS, "Tared.");
                            break;
                        }

                        default:
                        {
                            Continue = false;
                            break;
                        }
                        }
                    }
                    DUT.UpdateState();
                    Log.Output(Log.Severity.INFO, Log.Source.SENSORS, "HX711 readings: Raw: " + DUT.GetRawReading() + ", Adjusted: " + DUT.GetAdjustedReading());
                    Thread.Sleep(250);
                }
                break;
            }

            default:
            {
                TestMain.ErrorExit("Unknown device.");
                break;
            }
            }
        }