/// <inheritdoc cref="ElectricPotential.FromMillivolts(double)"/>
 public static ElectricPotential Millivolts(this int value) => ElectricPotential.FromMillivolts(value);
Пример #2
0
 /// <inheritdoc cref="ElectricPotential.FromMillivolts(double)"/>
 public static ElectricPotential Millivolts(this decimal value) => ElectricPotential.FromMillivolts(Convert.ToDouble(value));
Пример #3
0
 /// <inheritdoc cref="ElectricPotential.FromMillivolts(double?)"/>
 public static ElectricPotential?Millivolts(this decimal?value) => ElectricPotential.FromMillivolts(value == null ? (double?)null : Convert.ToDouble(value.Value));
Пример #4
0
 /// <inheritdoc cref="ElectricPotential.FromMillivolts(double?)"/>
 public static ElectricPotential?Millivolts(this float?value) => ElectricPotential.FromMillivolts(value);
 public void NumberToMillivoltsTest() =>
 Assert.Equal(ElectricPotential.FromMillivolts(2), 2.Millivolts());
Пример #6
0
        /// <summary>
        /// Get supplied voltage
        /// </summary>
        /// <returns>Voltage supplied from the GPIO power output from the PiJuice or when charging, voltage supplied in millivolts</returns>
        public ElectricPotential GetIOVoltage()
        {
            var response = _piJuice.ReadCommand(PiJuiceCommand.IOVoltage, 2);

            return(ElectricPotential.FromMillivolts(BinaryPrimitives.ReadInt16LittleEndian(response)));
        }
Пример #7
0
        private void Evaluate(CancellationToken cancellationToken = default(CancellationToken))
        {
            // Don't do anything if the structure isn't valid
            if (!IsValid)
            {
                return;
            }

            int iterationNumber;

            // Since we integrate left to right, we want to specify the voltage on the left
            var voltageBias = -Bias + WorkFunctionDifference;

            // Iterate until we find the desired voltage
            var chargeHigh  = ChargeDensity.FromCoulombsPerSquareCentimeter(1.0);
            var chargeLow   = ChargeDensity.FromCoulombsPerSquareCentimeter(-1.0);
            var chargeGuess = (chargeHigh + chargeLow) / 2;

            // !!!!!!!!!!!!!!!!!!
            EvaluateGivenCharge(chargeGuess, cancellationToken);
            // !!!!!!!!!!!!!!!!!!

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            var potentialCalc    = BottomLayer.EvalPoints[1].Potential;
            var tinyPositiveBias = new ElectricPotential(1e-6);
            var tinyNegativeBias = new ElectricPotential(-1e-6);

            // Iterate
            for (iterationNumber = 0;
                 (potentialCalc > voltageBias + ElectricPotential.Abs(voltageBias * 1e-6)
                  + tinyPositiveBias ||
                  potentialCalc < voltageBias - ElectricPotential.Abs(voltageBias * 1e-6)
                  + tinyNegativeBias) &&
                 iterationNumber < maximumIterations;
                 iterationNumber++)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                if (potentialCalc > voltageBias)
                {
                    chargeLow = chargeGuess;
                }
                else
                {
                    chargeHigh = chargeGuess;
                }

                // Update the guessCharge
                chargeGuess = (chargeHigh + chargeLow) / 2;

                // !!!!!!!!!!!!!!!!!!
                EvaluateGivenCharge(chargeGuess, cancellationToken);
                // !!!!!!!!!!!!!!!!!!

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                potentialCalc = BottomLayer.EvalPoints[1].Potential;

                if (iterationNumber == maximumIterations - 1)
                {
                    if (!(potentialCalc > voltageBias + ElectricPotential.FromMillivolts(1) ||
                          potentialCalc < voltageBias - ElectricPotential.FromMillivolts(1)))
                    {
                        // TODO: Inform that solution only found to accuracy of 1e-3
                    }
                    else
                    {
                        NoSolution = true;
                        return;
                    }
                }
            }

            // If the last material is a semiconductor, fill in the missing points
            if (IsBottomLayerSemiconductor)
            {
                ((Semiconductor)BottomLayer).Evaluate();

                // Now subtract the potential from all the points so the right is ref to 0
                var lastPoint = BottomLayer.EvalPoints.Last();
                var potential = lastPoint.Potential;

                foreach (var layer in Layers)
                {
                    foreach (var ep in layer.EvalPoints)
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return;
                        }

                        ep.Potential = ep.Potential - potential;
                    }
                }

                var trueLast = lastPoint.DeepClone();
                if (trueLast.Location < Length.FromNanometers(50))
                {
                    trueLast.Location = Length.FromNanometers(50);
                }
                BottomLayer.EvalPoints.Add(trueLast);
            }

            NoSolution = false;

            /*
             * Debug.WriteLine(String.Format("Evaluation finished after {0} iterations in {1} ms",
             *  iterationNumber, stopwatch.ElapsedMilliseconds));
             */
        }
Пример #8
0
        static void Main(string[] args)
        {
            Console.WriteLine("GPIOTestHarness");
            bool Station1OutputState = false;
            bool Station2OutputState = false;
            bool Station3OutputState = false;
            bool Station4OutputState = false;

            //var Output1 = Station1OutputPin.Output();
            //var Output2 = Station2OutputPin.Output();
            //var Output3 = Station3OutputPin.Output();
            //var Output4 = Station4OutputPin.Output();
            var pins = new PinConfiguration[]
            {
                Station1OutputPin.Output().Name("Output1"),
                Station2OutputPin.Output().Name("Output2"),
                Station3OutputPin.Output().Name("Output3"),
                Station4OutputPin.Output().Name("Output4")
            };
            //var settings = new GpioConnectionSettings();
            var connection = new GpioConnection(pins);

            var Input1 = LowPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowPressureFaultInput {0}", b ? "on" : "off");
                if (Station1OutputState != b)
                {
                    connection.Toggle("Output1"); Station1OutputState = b;
                }
            });

            connection.Add(Input1);
            var Input2 = HighPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("HighPressureFaultInput {0}", b ? "on" : "off");
                if (Station2OutputState != b)
                {
                    connection.Toggle("Output2"); Station2OutputState = b;
                }
            });

            connection.Add(Input2);
            var Input3 = LowWellFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowWellFaultInput {0}", b ? "on" : "off");
                if (Station3OutputState != b)
                {
                    connection.Toggle("Output3"); Station3OutputState = b;
                }
            });

            connection.Add(Input3);
            var Input4 = OverloadFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("OverloadFaultInput {0}", b ? "on" : "off");
                if (Station4OutputState != b)
                {
                    connection.Toggle("Output4"); Station4OutputState = b;
                }
            });

            connection.Add(Input4);

            ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3);

            var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver;

            Mcp3008SpiConnection spi = new Mcp3008SpiConnection(
                driver.Out(adcClock),
                driver.Out(adcCs),
                driver.In(adcMiso),
                driver.Out(adcMosi));

            IInputAnalogPin inputPin = spi.In(Mcp3008Channel.Channel0);

            connection.Open();
            ElectricPotential volts = ElectricPotential.FromVolts(0);

            while (!Console.KeyAvailable)
            {
                var v = referenceVoltage * (double)inputPin.Read().Relative;
                if ((Math.Abs(v.Millivolts - volts.Millivolts) > 100))
                {
                    volts = ElectricPotential.FromMillivolts(v.Millivolts);
                    Console.WriteLine("Voltage ch0: {0}", volts.Millivolts.ToString());
                }
            }
            connection.Close();
        }