/// <inheritdoc cref="ElectricPotential.FromMillivolts(double)"/> public static ElectricPotential Millivolts(this int value) => ElectricPotential.FromMillivolts(value);
/// <inheritdoc cref="ElectricPotential.FromMillivolts(double)"/> public static ElectricPotential Millivolts(this decimal value) => ElectricPotential.FromMillivolts(Convert.ToDouble(value));
/// <inheritdoc cref="ElectricPotential.FromMillivolts(double?)"/> public static ElectricPotential?Millivolts(this decimal?value) => ElectricPotential.FromMillivolts(value == null ? (double?)null : Convert.ToDouble(value.Value));
/// <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());
/// <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))); }
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)); */ }
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(); }