bool LEMMissionTimerSwitch::SwitchTo(int newState, bool dontspring) { bool rv; // Is the event timer powered? if (lem->MissionTimerDisplay.IsPowered()) { // Yes, print the time sprintf(oapiDebugString(), "LM MT: %.2d:%.2d:%.2d", lem->MissionTimerDisplay.GetHours(), lem->MissionTimerDisplay.GetMinutes(), lem->MissionTimerDisplay.GetSeconds()); lem->DebugLineClearTimer = 5; } //if (event & PANEL_MOUSE_RBDOWN || event & PANEL_MOUSE_RBUP) { // return false; // Disregard this //} // Animate switch rv = LEMThreePosSwitch::SwitchTo(newState, dontspring); // Perform function switch (sw) { case 0: // Run-Stop-Reset switch (newState) { case THREEPOSSWITCH_UP: // RUN lem->MissionTimerDisplay.SetRunning(true); break; case THREEPOSSWITCH_CENTER: // STOP lem->MissionTimerDisplay.SetRunning(false); break; case THREEPOSSWITCH_DOWN: // RESET lem->MissionTimerDisplay.Reset(); break; } break; case 1: // Hours Inc switch (newState) { case THREEPOSSWITCH_UP: // RUN lem->MissionTimerDisplay.UpdateHours(10); break; case THREEPOSSWITCH_DOWN: // RESET lem->MissionTimerDisplay.UpdateHours(1); break; } break; case 2: // Minutes Inc switch (newState) { case THREEPOSSWITCH_UP: // RUN lem->MissionTimerDisplay.UpdateMinutes(10); break; case THREEPOSSWITCH_DOWN: // RESET lem->MissionTimerDisplay.UpdateMinutes(1); break; } break; case 3: // Seconds Inc switch (newState) { case THREEPOSSWITCH_UP: // RUN lem->MissionTimerDisplay.UpdateSeconds(10); break; case THREEPOSSWITCH_DOWN: // RESET lem->MissionTimerDisplay.UpdateSeconds(1); break; } break; } return rv; }
bool EngineStartButton::Push() { //Can only be switched when off and engine stop button is also off if (stopbutton->GetState() == 0 && state == 0) { if (ToggleSwitch::SwitchTo(1)) { sprintf(oapiDebugString(), "Engine Start: %d, Engine Stop: %d", GetState(), stopbutton->GetState()); return true; } } return false; }
bool EngineStopButton::Push() { int newstate = !state; if (ToggleSwitch::SwitchTo(newstate)) { if (newstate = 1) { startbutton->SwitchTo(0); sprintf(oapiDebugString(), "Engine Start: %d, Engine Stop: %d", startbutton->GetState(), GetState()); } return true; } return false; }
// -------------------------------------------------------------- // Set up the dynamic elastic sail deformation code // -------------------------------------------------------------- void SolarSail::SetupElasticity (MESHHANDLE hMesh) { MESHGROUP *sail = oapiMeshGroup (hMesh, GRP_sail1); // all sail segments have the same mesh structure, so segment 1 represents all 4 DWORD nvtx = sail->nVtx/2; // scan front side only DWORD nidx = sail->nIdx/2; // scan front side only DWORD ntri = nidx/3; WORD *idx = sail->Idx; NTVERTEX *vtx = sail->Vtx; DWORD i, j, k, m, nj, nk; // generate node neighbour graph sail_vbuf = new VECTOR3[nvtx]; nbhr = new NBHR[nvtx]; for (i = 0; i < nvtx; i++) { nbhr[i].nnd = 0; nbhr[i].fix = (vtx[i].x == 0 || vtx[i].y == 0); } for (i = 0; i < ntri; i++) { WORD *tri = idx+(i*3); for (j = 0; j < 3; j++) { nj = tri[j]; for (k = 0; k < 3; k++) { if (j == k) continue; nk = tri[k]; for (m = 0; m < nbhr[nj].nnd; m++) if (nbhr[nj].nd[m] == nk) break; // already in neighbour list if (m == nbhr[nj].nnd) { if (nbhr[nj].nnd == MAXNBHR) strcpy (oapiDebugString(), "Problems!"); else { nbhr[nj].nd[m] = nk; nbhr[nj].dst0[m] = Dst (vtx+nj, vtx+nk); nbhr[nj].nnd++; } } } } } sail_nvtx = nvtx; sail_ntri = ntri; }
void AttitudeReference::PostStep (double simt, double simdt, double mjd) { valid_axes = false; valid_euler = false; valid_tgteuler = false; if (mode >= 4 && tgtmode == 3) { NAVHANDLE hNav = v->GetNavSource (navid); if (hNav) { VECTOR3 tvel,svel; v->GetGlobalVel (svel); NAVDATA data; OBJHANDLE hObj = NULL; oapiGetNavData (hNav, &data); switch (data.type) { case TRANSMITTER_IDS: hObj = data.ids.hVessel; break; case TRANSMITTER_XPDR: hObj = data.xpdr.hVessel; break; case TRANSMITTER_VTOL: hObj = data.vtol.hBase; break; case TRANSMITTER_VOR: { hObj = data.vor.hPlanet; MATRIX3 Rp; oapiGetRotationMatrix (hObj, &Rp); oapiGetGlobalVel (hObj, &tvel); tvel += mul (Rp, _V(-sin(data.vor.lng),0,cos(data.vor.lng)) * PI2/oapiGetPlanetPeriod(hObj)*oapiGetSize(hObj)*cos(data.vor.lat)); tgt_rvel = svel-tvel; sprintf (oapiDebugString(), "rvel: x=%f, y=%f, z=%f", tgt_rvel.x, tgt_rvel.y, tgt_rvel.z); } return; // done } if (hObj) { oapiGetGlobalVel (hObj, &tvel); tgt_rvel = svel-tvel; } else { // TODO } } } }
void EVA::clbkPreStep (double simt, double SimDT, double mjd) { char EVAName[256]=""; char CSMName[256]=""; char MSName[256]=""; strcpy(EVAName,GetName()); double VessCount; int i=0; VessCount=oapiGetVesselCount(); hMaster=oapiGetVesselByIndex(i); while (i<VessCount)i++;{ oapiGetObjectName(hMaster,MSName,256); strcpy(CSMName,MSName);strcat(CSMName,"-EVA"); if (strcmp(CSMName,EVAName)==0) { i=int(VessCount); } } sprintf(oapiDebugString(), "EVA Cable Attached to %s", MSName); VESSELSTATUS csmV; VESSELSTATUS evaV; VESSEL *csmvessel; VECTOR3 rdist = {0,0,0}; VECTOR3 posr = {0,0,0}; VECTOR3 rvel = {0,0,0}; VECTOR3 RelRot = {0,0,0}; double dist = 0.0; double Vel = 0.0; if (hMaster) { csmvessel = oapiGetVesselInterface(hMaster); oapiGetRelativePos (GetHandle() ,hMaster, &posr); oapiGetRelativeVel (GetHandle() ,hMaster , &rvel); GetStatus(evaV); csmvessel->GetStatus(csmV); GlobalRot (posr, RelRot); dist = sqrt(posr.x * posr.x + posr.y * posr.y + posr.z * posr.z); Vel = sqrt(rvel.x * rvel.x + rvel.y * rvel.y + rvel.z * rvel.z); if (dist >= 25) { rvel = evaV.rvel-csmV.rvel; rvel.x = -rvel.x; rvel.y = -rvel.y; rvel.z = -rvel.z; GetStatus(evaV); csmvessel->GetStatus(csmV); evaV.rvel = csmV.rvel + rvel; DefSetState(&evaV); } if (GoDock1){ sprintf(oapiDebugString(), "EVA Back CSM Mode Relative Distance M/s %f", dist); if (dist <= 0.55 && dist>=0.50 ){ GoDock1 =false; oapiSetFocusObject(hMaster); oapiDeleteVessel(GetHandle()); } } } }