public static async Task Aggregator( FPGA.InputSignal <bool> RXD, FPGA.OutputSignal <bool> TXD ) { Sequential handler = () => { FPU.FPUScopeNoSync(); while (true) { FPGA.Optimizations.AddOptimizer <DefaultOptimizer>(); const uint baud = 115200; UART.ReadFloat(baud, RXD, out float mass); UART.ReadFloat(baud, RXD, out float radius); var vEsc = FPGAOrbitalCalc.VEsc(mass, radius); UART.WriteFloat(baud, vEsc, TXD); } }; FPGA.Config.OnStartup(handler); }
public void Quokka_VEsc() { var rnd = new Random(Environment.TickCount); using (var port = new QuokkaPort()) { // escape velocities from the surface of objects var cases = new[] { // sun new { // radius, in meters R = 695510e+3f, // mass, in kgs M = 1.989e+30f, // VEsc, is m/s V = 617500f }, // earth new { R = 6371e+3f, M = 5.972e+24f, V = 11186f }, // mars new { R = 3389.5e+3f, M = 6.39e+23f, V = 5030f }, }; foreach (var testCase in cases) { float calculated = FPGAOrbitalCalc.VEsc(testCase.M, testCase.R); var err = Math.Abs((calculated - testCase.V) / testCase.V); Assert.IsTrue(err < 0.01); port.WriteFloat(testCase.M); port.WriteFloat(testCase.R); var actualBytes = port.Read(4, true, port.DefaultTimeout); var actual = TestConverters.FloatFromByteArray(actualBytes); Assert.AreEqual(calculated, actual, $"Failed for {testCase}"); } } }