namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
// DockingUpdate reads this original logical ForwardReverseThrust source.
// The controller's +680 cache and the materialized inputRoot +70 are
// separate consumers and cannot prove that this source reached zero.
private static bool ReadOriginalDockingThrottle(nuint computer,out float value)
{
value=float.NaN;
try
{
if(computer<0x10000)return false;
var source=Pointer(computer+0x260);
if(source<0x10000)return false;
value=Read<float>(source+0x18);
return float.IsFinite(value)&&Math.Abs(value)<=1.001f&&Pointer(computer+0x260)==source;
}
catch{return false;}
}
private static bool LocalDockingSourceZeroConfirmed(bool nativeDuty,bool inputSent,float controllerThrottle,double actualThrottle,double sourceThrottle)
=>nativeDuty||LocalDockingZeroConfirmed(false,inputSent,controllerThrottle,actualThrottle)
&&double.IsFinite(sourceThrottle)&&Math.Abs(sourceThrottle)<=.001;
private static uint DockingSourceZeroSelfTest()
{
uint passed=0;
if(!LocalDockingSourceZeroConfirmed(false,true,0,0,.75))passed|=1;
if(LocalDockingSourceZeroConfirmed(false,true,0,0,0))passed|=2;
if(!LocalDockingSourceZeroConfirmed(false,false,0,0,0))passed|=4;
if(!LocalDockingSourceZeroConfirmed(false,true,.5f,0,0)&&!LocalDockingSourceZeroConfirmed(false,true,0,.75,0))passed|=8;
if(!LocalDockingSourceZeroConfirmed(false,true,0,0,double.NaN)&&!LocalDockingSourceZeroConfirmed(false,true,0,0,double.PositiveInfinity))passed|=16;
if(LocalDockingSourceZeroConfirmed(true,false,-100,.75,.75))passed|=32;
if(!ReadOriginalDockingThrottle(0,out _)&&!ReadOriginalDockingThrottle(1,out _))passed|=64;
var memory=Platform.Allocate(1024);if(memory==0)return passed;
try
{
var source=memory+768;Write(memory+0x260,source);Write(source+0x18,.75f);
var rejected=ReadOriginalDockingThrottle(memory,out var value)&&value==.75f&&!LocalDockingSourceZeroConfirmed(false,true,0,0,value);
Write(source+0x18,0f);
if(rejected&&ReadOriginalDockingThrottle(memory,out value)&&LocalDockingSourceZeroConfirmed(false,true,0,0,value))passed|=128;
}
finally{Platform.Free(memory);}
return passed;
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationDockingSourceZeroSelfTest")]
internal static uint ExportDockingSourceZeroSelfTest()=>RunTest(DockingSourceZeroSelfTest);
#endif
}
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
// DockingUpdate reads this original logical ForwardReverseThrust source.
// The controller's +680 cache and the materialized inputRoot +70 are
// separate consumers and cannot prove that this source reached zero.
private static bool ReadOriginalDockingThrottle(nuint computer,out float value)
{
value=float.NaN;
try
{
if(computer<0x10000)return false;
var source=Pointer(computer+0x260);
if(source<0x10000)return false;
value=Read<float>(source+0x18);
return float.IsFinite(value)&&Math.Abs(value)<=1.001f&&Pointer(computer+0x260)==source;
}
catch{return false;}
}
private static bool LocalDockingSourceZeroConfirmed(bool nativeDuty,bool inputSent,float controllerThrottle,double actualThrottle,double sourceThrottle)
=>nativeDuty||LocalDockingZeroConfirmed(false,inputSent,controllerThrottle,actualThrottle)
&&double.IsFinite(sourceThrottle)&&Math.Abs(sourceThrottle)<=.001;
private static uint DockingSourceZeroSelfTest()
{
uint passed=0;
if(!LocalDockingSourceZeroConfirmed(false,true,0,0,.75))passed|=1;
if(LocalDockingSourceZeroConfirmed(false,true,0,0,0))passed|=2;
if(!LocalDockingSourceZeroConfirmed(false,false,0,0,0))passed|=4;
if(!LocalDockingSourceZeroConfirmed(false,true,.5f,0,0)&&!LocalDockingSourceZeroConfirmed(false,true,0,.75,0))passed|=8;
if(!LocalDockingSourceZeroConfirmed(false,true,0,0,double.NaN)&&!LocalDockingSourceZeroConfirmed(false,true,0,0,double.PositiveInfinity))passed|=16;
if(LocalDockingSourceZeroConfirmed(true,false,-100,.75,.75))passed|=32;
if(!ReadOriginalDockingThrottle(0,out _)&&!ReadOriginalDockingThrottle(1,out _))passed|=64;
var memory=Platform.Allocate(1024);if(memory==0)return passed;
try
{
var source=memory+768;Write(memory+0x260,source);Write(source+0x18,.75f);
var rejected=ReadOriginalDockingThrottle(memory,out var value)&&value==.75f&&!LocalDockingSourceZeroConfirmed(false,true,0,0,value);
Write(source+0x18,0f);
if(rejected&&ReadOriginalDockingThrottle(memory,out value)&&LocalDockingSourceZeroConfirmed(false,true,0,0,value))passed|=128;
}
finally{Platform.Free(memory);}
return passed;
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationDockingSourceZeroSelfTest")]
internal static uint ExportDockingSourceZeroSelfTest()=>RunTest(DockingSourceZeroSelfTest);
#endif
}