// Keyboard interface handler int MMU::clbkConsumeDirectKey (char *kstate) { OBJHANDLE hvessel; if (KEYMOD_SHIFT (kstate)) { return 0; // shift combinations are reserved } else if (KEYMOD_CONTROL (kstate)) { // insert ctrl key combinations here } else { // unmodified keys if (KEYDOWN (kstate, OAPI_KEY_E)) { // "End EVA" if (oapiAcceptDelayedKey (OAPI_KEY_E, 1.0)) { char name[256]; char vname[256]; UINT i; strcpy (vname, GetName()); for (i=0;i<strlen(vname)+1;i++) name[i]=0; for (i=0;i<strlen(vname)-4;i++) name[i]=vname[i]; //strncpy (name, vname,strlen(vname)+1-4); hvessel=oapiGetVesselByName(name); if (hvessel != 0) oapiSetFocusObject(hvessel); }; return 1; } } return 0; }
LRESULT CALLBACK WinProc(int nCode, WPARAM w, LPARAM l) { if ((GetKeyState(VK_TAB) & 0x800)== 0 || (GetKeyState(w) & 0x800) == 0 || nCode < 0 || Ejection==TRUE) return CallNextHookEx(hhook, nCode, w, l); DWORD key = OAPI_KEY_TAB; if (!GetKey(w,key)) return CallNextHookEx(hhook,nCode,w,l); VOBJ * v = g_UFA.GetFocus(); if (v==NULL) return CallNextHookEx(hhook,nCode,w,l); char cbuf[255]; switch(key) { case OAPI_KEY_EQUALS: { if (v->crew.GetCrewTotalNumber() < 1) sprintf(cbuf,"No one on board!"); else sprintf(cbuf,"Selected member: %s",v->nextslot()); v->hudprint.insert(cbuf); break; } case OAPI_KEY_UP: { EVA(v); break; } case OAPI_KEY_MINUS: { sprintf(cbuf,"Selected airlock: %d",v->nextlock()+1); v->hudprint.insert(cbuf); break; } case OAPI_KEY_RIGHT: { OBJHANDLE e = v->crew.GetObjHandleOfLastEVACrew(); if (oapiIsVessel(e)) oapiSetFocusObject(e); break; } case OAPI_KEY_LEFT: { oapiOpenDialog(g_hInst, IDD_DIALOG1 ,MsgProc,0); break; } case OAPI_KEY_E: { Ejection=TRUE; v->hudprint.insert("EJECTION!"); lEjectionTime=oapiGetSimTime()-1; break; } } return CallNextHookEx(hhook, nCode, w, l); }
int MMU::clbkConsumeBufferedKey (DWORD key, bool down, char *kstate) { if (!down) return 0; // only process keydown events if (KEYMOD_SHIFT (kstate)) { } else if (KEYMOD_CONTROL (kstate)) { } else { // unmodified keys switch (key) { case OAPI_KEY_E: { // end EVA DOCKHANDLE hDock = GetDockHandle (0); OBJHANDLE mate = GetDockStatus (hDock); if (mate) { oapiSetFocusObject(mate); oapiDeleteVessel (GetHandle(), mate); } } return 1; } } return 0; }
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()); } } } }