diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/LEM.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/LEM.cpp index 15097c49c4..12dbf58a04 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/LEM.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/LEM.cpp @@ -1056,6 +1056,7 @@ int LEM::clbkConsumeBufferedKey(DWORD key, bool down, char *keystate) { break; } } + return 0; } if (!KEYMOD_SHIFT(keystate) && !KEYMOD_CONTROL(keystate) && KEYMOD_ALT(keystate)) @@ -1114,20 +1115,53 @@ int LEM::clbkConsumeBufferedKey(DWORD key, bool down, char *keystate) { break; case OAPI_KEY_W: - optics.ReticleMoved = 0.52; //Fast Rate (about 30 deg/sec) + if (AOTReticleDetent.GetState() == 1) + { + sprintf(oapiDebugString(), "AOT DETENT ENABLED"); + DebugLineClearTimer = 5; + } + else + { + optics.ReticleMoved = 0.52; //Fast Rate (about 30 deg/sec) - if (KEYMOD_ALT(keystate)) { - optics.ReticleMoved = 0.01; //Slow Rate (about 0.5 deg/sec) + if (KEYMOD_ALT(keystate)) { + optics.ReticleMoved = 0.01; //Slow Rate (about 0.5 deg/sec) + } } break; case OAPI_KEY_S: - optics.ReticleMoved = -0.52; //Fast Rate (about 30 deg/sec) + if (AOTReticleDetent.GetState() == 1) + { + sprintf(oapiDebugString(), "AOT DETENT ENABLED"); + DebugLineClearTimer = 5; + } + else + { + optics.ReticleMoved = -0.52; //Fast Rate (about 30 deg/sec) + + if (KEYMOD_ALT(keystate)) { + optics.ReticleMoved = -0.01; //Slow Rate (about 0.5 deg/sec) + } + } + break; + + case OAPI_KEY_Z: if (KEYMOD_ALT(keystate)) { - optics.ReticleMoved = -0.01; //Slow Rate (about 0.5 deg/sec) + optics.AOTDetentToggle(); // Toggle AOT detent + if (AOTReticleDetent.GetState() == 1) + { + sprintf(oapiDebugString(), "AOT DETENT ENABLED"); + } + else + { + sprintf(oapiDebugString(), "AOT DETENT DISABLED"); + } + DebugLineClearTimer = 5; } break; + case OAPI_KEY_Q: agc.SetInputChannelBit(016, MarkX, 1); // Mark X break; diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/LEM.h b/Orbitersdk/samples/ProjectApollo/src_lm/LEM.h index 60a7319018..1f88342491 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/LEM.h +++ b/Orbitersdk/samples/ProjectApollo/src_lm/LEM.h @@ -792,10 +792,12 @@ class LEM : public Payload, public PanelSwitchListener { LMAbortButton AbortSwitch; LMAbortStageButton AbortStageSwitch; - SwitchRow RRGyroSelSwitchRow; ThreePosSwitch RRGyroSelSwitch; + + SwitchRow AOTReticleSwitchRow; + ToggledPushSwitch AOTReticleDetent; ///////////////// // LEM panel 1 // diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.cpp index d210fc9e37..306050d2cb 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.cpp @@ -422,6 +422,7 @@ void LEMcomputer::GetRadarData(int radarBits) LMOptics::LMOptics() { lem = NULL; + OpticsShaft = 3; OpticsReticle = 0.0; ReticleMoved = 0; @@ -434,6 +435,29 @@ void LMOptics::Init(LEM *vessel) { lem = vessel; } +bool LMOptics::ReticlePush() { + if (((360.0 - OpticsReticle / RAD) < 1.0) || ((360.0 - OpticsReticle / RAD > 359.0))) + { + return true; + } + else + return false; +} + +void LMOptics::AOTDetentToggle() { + + if (lem->AOTReticleDetent.GetState() == 0 && ReticlePush() == true) + { + lem->AOTReticleDetent.SetState(1); + } + + else + { + lem->AOTReticleDetent.SetState(0); + } + return; +} + void LMOptics::SystemTimestep(double simdt) { if (lem->AOTLampFeeder.Voltage() > SP_MIN_ACVOLTAGE) { @@ -479,15 +503,27 @@ bool LMOptics::PaintReticleAngle(SURFHANDLE surf, SURFHANDLE digits) { } void LMOptics::Timestep(double simdt) { - OpticsReticle = OpticsReticle + simdt * ReticleMoved; + if (lem->AOTReticleDetent.GetState() == 1) + { + OpticsReticle = 0.0; + ReticleMoved = 0.0; + } - /*if (ReticleMoved) + else { - sprintf(oapiDebugString(), "Optics Shaft %d, Optics Reticle %.2f, Moved? %.4f, KnobTurning %d", OpticsShaft, 360.0 - OpticsReticle / RAD, ReticleMoved, KnobTurning); - }*/ + OpticsReticle = OpticsReticle + simdt * ReticleMoved; + + /*if (ReticleMoved) + { + sprintf(oapiDebugString(), "Optics Shaft %d, Optics Reticle %.2f, Moved? %.4f, KnobTurning %d", OpticsShaft, 360.0 - OpticsReticle / RAD, ReticleMoved, KnobTurning); + }*/ - if (OpticsReticle > 2*PI) OpticsReticle -= 2*PI; - if (OpticsReticle < 0) OpticsReticle += 2*PI; + //sprintf(oapiDebugString(), "Optics Reticle %.2f", 360.0 - OpticsReticle / RAD); + + if (OpticsReticle > 2 * PI) OpticsReticle -= 2 * PI; + if (OpticsReticle < 0) OpticsReticle += 2 * PI; + } + //sprintf(oapiDebugString(), "Detent %d", lem->AOTReticleDetent.GetState()); } void LMOptics::SaveState(FILEHANDLE scn) { diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.h b/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.h index 0233cf39f1..72956f6178 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.h +++ b/Orbitersdk/samples/ProjectApollo/src_lm/LEMcomputer.h @@ -89,10 +89,12 @@ class LEMcomputer: public ApolloGuidance /// \ingroup AGC /// \brief LM Optics. /// -class LMOptics { -public: +class LMOptics { +public: LMOptics(); // Cons - void Init(LEM *vessel); // Initialization + void Init(LEM* vessel); // Initialization + bool ReticlePush(); // Checks If Reticle Can Pe Pushed In + void AOTDetentToggle(); // Toggles Reticle Detent void Timestep(double simdt); // Timestep void SystemTimestep(double simdt); bool PaintReticleAngle(SURFHANDLE surf, SURFHANDLE digits); // Update panel image @@ -103,7 +105,7 @@ class LMOptics { // These should really be protected variables. // - LEM *lem; // Our Ship + LEM* lem; // Our Ship int OpticsShaft; // Shaft Position (can be 0=0, 1=60, 2=120, 3=180, 4=-120, 5=-60 degrees) double OpticsReticle; // AOT Reticle rotation diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lempanel.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lempanel.cpp index 63b06817de..082b58b236 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lempanel.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lempanel.cpp @@ -709,6 +709,8 @@ void LEM::InitSwitches() { RRGyroSelSwitch.Register(PSH,"RRGyroSelSwitch",THREEPOSSWITCH_UP); + AOTReticleDetent.Register(PSH, "AOTReticleDetent", 1); + DskySwitchVerb.Register(PSH, "DskySwitchVerb", false); DskySwitchNoun.Register(PSH, "DskySwitchNoun", false); DskySwitchPlus.Register(PSH, "DskySwitchPlus", false); @@ -1820,7 +1822,7 @@ bool LEM::clbkLoadPanel (int id) { case LMPANEL_AOTVIEW: // LEM Alignment Optical Telescope View oapiRegisterPanelBackground(hBmp, PANEL_ATTACH_TOP | PANEL_ATTACH_BOTTOM | PANEL_ATTACH_LEFT | PANEL_MOVEOUT_RIGHT, g_Param.col[4]); - oapiRegisterPanelArea(AID_AOT_RETICLE_KNOB, _R(1427, 694, 1502, 1021), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_PRESSED|PANEL_MOUSE_UP, PANEL_MAP_BACKGROUND); + oapiRegisterPanelArea(AID_AOT_RETICLE_KNOB, _R(1427, 694, 1502, 1021), PANEL_REDRAW_NEVER, PANEL_MOUSE_DOWN, PANEL_MAP_BACKGROUND); oapiRegisterPanelArea(AID_AOT_SHAFT_KNOB, _R(1433, 0, 1496, 156), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_DOWN, PANEL_MAP_BACKGROUND); oapiRegisterPanelArea(AID_RR_GYRO_SEL_SWITCH, _R( 300, 66, 335, 96), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_DOWN, PANEL_MAP_BACKGROUND); oapiRegisterPanelArea(AID_AOT_RETICLEDISPLAY, _R( 341, 824, 461, 860), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_IGNORE, PANEL_MAP_BACKGROUND); @@ -2645,6 +2647,9 @@ void LEM::SetSwitches(int panel) { RRGyroSelSwitchRow.Init(AID_RR_GYRO_SEL_SWITCH, MainPanel); RRGyroSelSwitch.Init(0, 0, 34, 29, srf[SRF_LMTHREEPOSSWITCH], srf[SRF_BORDER_34x29], RRGyroSelSwitchRow); + AOTReticleSwitchRow.Init(AID_AOT_RETICLE_KNOB, MainPanel); + AOTReticleDetent.Init(0, 0, 74, 326, 0, 0, AOTReticleSwitchRow); + // ECS Panel ECSSuitGasDiverterSwitchRow.Init(IDB_LEM_SGD_LEVER, MainPanel); SuitGasDiverterSwitch.Init(0, 0, 126, 131, srf[SRF_LEM_SGD_LEVER], srf[SRF_BORDER_126x131], ECSSuitGasDiverterSwitchRow); @@ -3114,17 +3119,7 @@ bool LEM::clbkPanelMouseEvent (int id, int event, int mx, int my) return true; case AID_AOT_RETICLE_KNOB: - optics.ReticleMoved = 0; - if (my >=0 && my <= 163 ){ - optics.ReticleMoved = 0.001 * pow(163 - my,1.25); - optics.KnobTurning++; - } else if (my >= 164 && my <= 326){ - optics.ReticleMoved = -0.001 * pow(my-164,1.25); - optics.KnobTurning++; - } - if (optics.KnobTurning == 2) optics.KnobTurning = 0; - - if (event & PANEL_MOUSE_UP) optics.ReticleMoved = 0; + optics.AOTDetentToggle(); return true; @@ -3523,11 +3518,11 @@ bool LEM::clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf) case AID_AOT_RETICLE: RedrawPanel_AOTReticle(surf); return true; - + /* case AID_AOT_RETICLE_KNOB: oapiBlt(surf,srf[SRF_AOTRETICLEKNOB],0,0,optics.KnobTurning*74,0,74,326); return true; - + */ case AID_AOT_SHAFT_KNOB: oapiBlt(surf,srf[SRF_AOTSHAFTKNOB],0,0,optics.OpticsShaft*62,0,62,155); return true; diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp index edaa67822b..7bcb31d254 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lemsystems.cpp @@ -386,6 +386,9 @@ void LEM::SystemsInit() dsky.Init(&NumDockCompLTGFeeder, &LGC_DSKY_CB, &LtgAnunNumKnob, &LtgIntegralKnob, &LtgORideAnunSwitch, &LtgORideIntegralSwitch); agc.InitHeat((h_HeatLoad *)Panelsdk.GetPointerByString("HYDRAULIC:LGCHEAT")); + //Optics + optics.Init(this); + // AGS stuff asa.Init(this, &AGSOperateSwitch, (Boiler *)Panelsdk.GetPointerByString("ELECTRIC:LEM-ASA-FastHeater"), (Boiler *)Panelsdk.GetPointerByString("ELECTRIC:LEM-ASA-FineHeater"), diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lemvc.cpp b/Orbitersdk/samples/ProjectApollo/src_lm/lemvc.cpp index 95af2ceef6..2f0e20b3c8 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lemvc.cpp +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lemvc.cpp @@ -426,6 +426,7 @@ const VECTOR3 UtilityLights_LMPLocation = { 0.1030, 1.0318, 0.8908 }; // AOT const VECTOR3 Sw_RRGyroLocation = { -0.1557, 0.7949, 1.3874 }; const VECTOR3 AOT_ShaftSelectorLocation = { 0.0640, 0.8800, 1.4792 }; +const VECTOR3 AOTReticleDetentLocation ={ 0.066068, 0.743351, 1.38436 }; // Flood lights const VECTOR3 floodLightPos_Right = { 0.238, 0.89, 1.2 }; @@ -1477,6 +1478,10 @@ void LEM::RegisterActiveAreas() oapiVCRegisterArea(AID_VC_RETICLEDISP, _R(1068*TexMul, 1891*TexMul, 1188*TexMul, 1927*TexMul), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_IGNORE, PANEL_MAP_BACKGROUND, MainPanelTex2); + // AOT Reticle + oapiVCRegisterArea(AID_VC_AOTRETICLEDETENT, PANEL_REDRAW_ALWAYS, PANEL_MOUSE_DOWN); + oapiVCSetAreaClickmode_Spherical(AID_VC_AOTRETICLEDETENT, AOTReticleDetentLocation + ofs, 0.05); + // COAS FWD const VECTOR3 COAS2Location = { -0.5612, 0.7323, 1.6805 }; oapiVCRegisterArea(AID_VC_COAS2, PANEL_REDRAW_NEVER, PANEL_MOUSE_LBDOWN); @@ -3308,6 +3313,12 @@ void LEM::DefineVCAnimations() RRGyroSelSwitch.SetReference(Sw_RRGyroLocation, _V(-0.048633374944462, -0.519162328382934, 0.853290848204481)); RRGyroSelSwitch.DefineMeshGroup(VC_GRP_Sw_RRGyro); + // AOT Reticle Knob + MainPanelVC.AddSwitch(&AOTReticleDetent, AID_VC_AOTRETICLEDETENT); + AOTReticleDetent.SetReference(AOTReticleDetentLocation); + AOTReticleDetent.SetDirection(_V(-0.003, 0, 0)); + AOTReticleDetent.DefineMeshGroup(VC_GRP_AOT_ReticleKnob); + // EVA Antenna Handle MainPanelVC.AddSwitch(&EvaAntennaHandle, AID_VC_EVA_Ant_Handle); EvaAntennaHandle.SetReference(_V(-0.268539, 0.960945, -0.3565), _V(0, -0.01, 0)); diff --git a/Orbitersdk/samples/ProjectApollo/src_lm/lmresource.h b/Orbitersdk/samples/ProjectApollo/src_lm/lmresource.h index 0086710f2c..af7e5dd2d2 100644 --- a/Orbitersdk/samples/ProjectApollo/src_lm/lmresource.h +++ b/Orbitersdk/samples/ProjectApollo/src_lm/lmresource.h @@ -866,6 +866,7 @@ #define AID_VC_SW_RRGYRO 3020 #define AID_VC_RETICLEDISP 3021 +#define AID_VC_AOTRETICLEDETENT 3022 #define AID_VC_COAS1 3030 #define AID_VC_COAS2 3031