示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
// --------------------------------------------------------------
// 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;
}
示例#5
0
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
			}
		}
	}
}
示例#6
0
文件: eva.cpp 项目: dseagrav/NASSP
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());
			}
		}

	}
}