Ejemplo n.º 1
0
void configureMiniCooperTriggerShape(TriggerShape *s) {
	s->initialize(FOUR_STROKE_CAM_SENSOR, true);

//	s->initialState[0] = 1;

	float w = 360.0 / 121;
	float a = w / 2;
	s->addEvent720(a, T_SECONDARY, TV_FALL);
	a += w;

	for (int i = 0; i <= 22; i++) {
		a = addPair(s, a, w);
	}

	a += 3 * w;

	float firstGapAngle = a;
	/* may be */UNUSED(firstGapAngle);

	s->addEvent720(a, T_SECONDARY, TV_RISE);
	a += 3 * w;
	s->addEvent720(a, T_SECONDARY, TV_FALL);
	a += w;

	for (int i = 0; i < 36; i++) {
		a = addPair(s, a, w);
	}

	s->addEvent720(376, T_PRIMARY, TV_RISE);

	for (int i = 0; i < 21; i++) {
		a = addPair(s, a, w);
	}
	a += 3 * w;

	efiAssertVoid(CUSTOM_ERR_6584, absF(firstGapAngle + 360 - a) < 0.1, "shape constraint");

	s->addEvent720(a, T_SECONDARY, TV_RISE);
	a += 3 * w;
	s->addEvent720(a, T_SECONDARY, TV_FALL);
	a += w;

	for (int i = 0; i < 33; i++) {
		a = addPair(s, a, w);
	}

	efiAssertVoid(CUSTOM_ERR_6585, absF(720 - w / 2 - a) < 0.1, "shape constraint");
	s->addEvent720(a, T_SECONDARY, TV_RISE);

	s->addEvent720(720.0, T_PRIMARY, TV_FALL);

	/**
	 * With just one tooth on camshaft synchronization is not needed
	 */
	s->isSynchronizationNeeded = false;
	s->useOnlyPrimaryForSync = true;
}
Ejemplo n.º 2
0
void configureMiniCooperTriggerShape(TriggerShape *s) {
	s->reset(FOUR_STROKE_CAM_SENSOR, true);

//	s->initialState[0] = 1;

	float w = 360.0 / 121;
	float a = w / 2;
	s->addEvent(a, T_SECONDARY, TV_LOW);
	a += w;

	for (int i = 0; i <= 22; i++) {
		a = addPair(s, a, w);
	}

	a += 3 * w;

	float firstGapAngle = a;

	s->addEvent(a, T_SECONDARY, TV_HIGH);
	a += 3 * w;
	s->addEvent(a, T_SECONDARY, TV_LOW);
	a += w;

	for (int i = 0; i < 36; i++) {
		a = addPair(s, a, w);
	}

	s->addEvent(376, T_PRIMARY, TV_HIGH);

	for (int i = 0; i < 21; i++) {
		a = addPair(s, a, w);
	}
	a += 3 * w;

	efiAssertVoid(absF(firstGapAngle + 360 - a) < 0.1, "shape constraint");

	s->addEvent(a, T_SECONDARY, TV_HIGH);
	a += 3 * w;
	s->addEvent(a, T_SECONDARY, TV_LOW);
	a += w;

	for (int i = 0; i < 33; i++) {
		a = addPair(s, a, w);
	}

	efiAssertVoid(absF(720 - w / 2 - a) < 0.1, "shape constraint");
	s->addEvent(a, T_SECONDARY, TV_HIGH);

	s->addEvent(720.0, T_PRIMARY, TV_LOW);

	/**
	 * With just one tooth on camshaft synchronization is not needed
	 */
	s->isSynchronizationNeeded = false;
}
Ejemplo n.º 3
0
static void manualIdleController(int positionPercent) {
	// todo: this is not great that we have to write into configuration here
	boardConfiguration->manIdlePosition = positionPercent;

	if (isCranking()) {
		positionPercent += engineConfiguration->crankingIdleAdjustment;
	}

	percent_t cltCorrectedPosition = interpolate2d(engine->engineState.clt, config->cltIdleCorrBins, config->cltIdleCorr,
	CLT_CURVE_SIZE) / PERCENT_MULT * positionPercent;

	// let's put the value into the right range
	cltCorrectedPosition = maxF(cltCorrectedPosition, 0.01);
	cltCorrectedPosition = minF(cltCorrectedPosition, 99.9);

	if (engineConfiguration->debugMode == IDLE) {
		tsOutputChannels.debugFloatField1 = actualIdlePosition;
	}

	if (absF(cltCorrectedPosition - actualIdlePosition) < 1) {
		return; // value is pretty close, let's leave the poor valve alone
	}
	actualIdlePosition = cltCorrectedPosition;


	if (boardConfiguration->useStepperIdle) {
		iacMotor.setTargetPosition(cltCorrectedPosition / 100 * engineConfiguration->idleStepperTotalSteps);
	} else {
		setIdleValvePwm(cltCorrectedPosition);
	}
}
Ejemplo n.º 4
0
void assertEqualsM(const char *msg, float expected, float actual) {
	if (cisnan(actual) && !cisnan(expected)) {
		printf("Unexpected: %s %.4f while expected %.4f\r\n", msg, actual, expected);
		exit(-1);
	}

	float delta = absF(actual - expected);
	if (delta > 0.0001) {
		printf("delta: %.7f\r\n", delta);
		printf("Unexpected: %s %.4f while expected %.4f\r\n", msg, actual, expected);
		exit(-1);
	}
	printf("Validated %s: %f\r\n", msg, expected);
}
Ejemplo n.º 5
0
void assertEqualsM3(const char *prefix, const char *message, float expected, float actual, float EPS) {
	char msg[100];
	strcpy(msg, prefix);
	strcat(msg, message);
	if (cisnan(actual) && !cisnan(expected)) {
		printf("Assert failed: %s %.4f while expected %.4f\r\n", msg, actual, expected);
		exit(-1);
	}

	float delta = absF(actual - expected);
	if (delta > EPS) {
		printf("delta: %.7f\r\n", delta);
		printf("Unexpected: %s %.4f while expected %.4f\r\n", msg, actual, expected);
		exit(-1);
	}
	printf("Validated %s: %f\r\n", msg, expected);
}
Ejemplo n.º 6
0
bool isSameF(float v1, float v2) {
	return absF(v1 - v2) < EPS;
}
Ejemplo n.º 7
0
int main(int argc, char** argv) {
    double konst_pres = 0.000000001;
    
    double x1, y1, r1;
    printf("Zadejte parametry kruznice #1:\n");
    int result = scanf("%lf %lf %lf", &x1, &y1, &r1);
    if(result < 3 || r1 <= 0){
        printf("Nespravny vstup.\n");
        return (EXIT_FAILURE);
    }
    
    double x2, y2, r2;
    printf("Zadejte parametry kruznice #2:\n");
    result = scanf("%lf %lf %lf", &x2, &y2, &r2);
    if(result < 3 || r2 <= 0){
        printf("Nespravny vstup.\n");
        return (EXIT_FAILURE);
    }    
    
    /* x1=-48.2991131647392e-31;
         y1=-27.9464314187738e-31;
         r1=12.7254519795283e-31;
         x2=-25.2082785966678e-31;
         y2=-47.4113147848634e-31;
         r2=17.4750169821536e-31;*/
         
    //double dist = sqrt(pow(absF(x2-x1),2)+pow(absF(y2-y1),2));
    double dist = sqrt(absF(x2-x1)*absF(x2-x1)+absF(y2-y1)*absF(y2-y1));
    //printf("Dist: %.32f\n",dist);
    //printf("R1-R2: %.32f\n",r1-r2);
    //printf("R1+R2: %.32f\n",r1+r2);
    
    if(dist < r1 + r2){
        if(dist > absF(r1 - r2))
            printf("Kruznice se protinaji, prekryv: %f\n",prekryv(r1,r2,dist));
        else if(absF(dist - absF(r1 - r2)) < konst_pres)
            if((absF(x1 - x2)<konst_pres) && (absF(y1 - y2)<konst_pres) && (absF(r1 - r2)<konst_pres))
                printf("Kruznice splyvaji, prekryv: %f\n",(M_PI*pow(r1,2)));
            else{
                if(r1 > r2)
                    printf("Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: %f\n",(M_PI*pow(r2,2)));
                else
                    printf("Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: %f\n",(M_PI*pow(r1,2)));
            }
        else{
            if(r1 > r2)
                printf("Kruznice #2 lezi uvnitr kruznice #1, prekryv: %f\n",(M_PI*pow(r2,2)));
            else
                printf("Kruznice #1 lezi uvnitr kruznice #2, prekryv: %f\n",(M_PI*pow(r1,2)));
        }
    }else if(absF(dist - (r1 + r2)) < konst_pres){
        printf("Vnejsi dotyk, zadny prekryv.\n");
    }else{
        printf("Kruznice lezi vne sebe, zadny prekryv.\n");
    }
    
    return (EXIT_SUCCESS);
}
Ejemplo n.º 8
0
MonoChainDemo::MonoChainDemo(QWidget *parent) :
    DemoWidget(parent)
{
    ui->labelMass->hide();
    ui->labelMassValue->hide();
    ui->horizontalSlider->hide();
    ui->pushButtonMax->move(ui->dispCurve->x()+10,ui->dispCurve->y()+50);
    ui->labelOmega->move(ui->labelOmega->x()-3,ui->labelOmega->y()-1);
    ui->labelKValue->move(ui->dispCurve->x()+ui->dispCurve->width()/2+195,ui->dispCurve->y()+ui->dispCurve->height()-26);
    ui->labelW0->setPixmap(QPixmap(":/images/omega1.png"));
    ui->labelHuyeybl->hide();
    ui->labelHuyeybl_2->hide();
    ui->labelAcMaxFormula->hide();
    ui->labelOptMaxFormula->hide();
    ui->labelOptMinFormula->hide();
    QObject::connect(ui->pushButtonMax,  SIGNAL(clicked()), this, SLOT(rateChanged()));
    QObject::connect(ui->verticalSlider, SIGNAL(valueChanged(int)), this, SLOT(rateChanged()));
    QObject::connect(ui->verticalSlider, SIGNAL(sliderMoved(int)), this, SLOT(rateChanged()));
    QObject::connect(ui->verticalSlider, SIGNAL(sliderMoved(int)), this, SLOT(on_verticalSlider_sliderMoved(int)));
    //create chain
    chainSettings setting(18, 1500, currRate, 1650/10*17, 16);
    myChain = new Monochain(setting, *springGradient, *massGradient);
    backgroundChain = new Monochain(setting, *backgroundSpringGradient, *backgroundMassGradient);

    scene->addItem(backgroundChain->drawAt(0,0));
    backgroundChain->pause(true);
    scene->addItem(myChain->drawAt(0,0));
    pause();
    connect(myChain->getTimer(), SIGNAL(timeout()), this, SLOT(time_slot()));

    ui->dispCurve->xAxis->setRange(0,M_PI);
    ui->dispCurve->yAxis->setRange(0,1.1);
    ui->dispCurve->yAxis->setAutoTickStep(0);
    ui->dispCurve->yAxis->setTickStep(1.0);
    for (int i = 0; i < 101; ++i)
    {
        k1[i] = i*M_PI/100;
        omega1[i] = sin(k1[i]/2);
        if (absF(omega1[i] - currRate/(2*sqrt(myChain->getCoefficient()/(*myChain)[0]->getMass()))) <= 0.5*ui->dispCurve->yAxis->range().upper/100)
        {
            kDot[0] = k1[i];
            omegaDot[0] = omega1[i];
        }
    }
    qDebug() << k1[100] << "k1";
    //draw plot
    ui->dispCurve->graph(0)->setData(k1,omega1);
    QPen graphPen(blueDotPen);
    graphPen.setWidthF(2.0);
    graphPen.setColor(QColor(Qt::red));
    ui->dispCurve->graph(0)->setPen(graphPen);
    ui->dispCurve->addGraph();
    ui->dispCurve->graph(1)->setLineStyle(QCPGraph::lsNone);
    ui->dispCurve->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 7));
    ui->dispCurve->graph(1)->setPen(blueDotPen);
    qDebug() << kDot[0] << omegaDot[0];
    ui->dispCurve->graph(1)->setData(kDot,omegaDot);
    ui->dispCurve->replot();
    num = QString("<html><head/><body><p><span style=\" font-size:12pt;\"><font size = 5>ω = %1ω<sub>0</sub></font></span></p></body></html>").arg(currRate/(2*sqrt(myChain->getCoefficient()/(*myChain)[0]->getMass())),0,'gb',2);
    ui->labelOmega->setText(num);
    num = QString("<html><head/><body><p><span style=\" font-size:12pt;\">   = %1</span></p></body></html>").arg(kDot[0],0,'gb',2);
    ui->labelKValue->setText(num);
    w0 = 1;
    ui->dispCurve->yAxis->setAutoTickLabels(false);
    omegaTickLabel.clear();
    omegaTickLabel << "" << "ωₒ";
    ui->dispCurve->yAxis->setTickVectorLabels(omegaTickLabel);
    ui->labelChastota->move(ui->pushButtonMax->x(),ui->pushButtonMax->y()-ui->labelChastota->height()-20);
    ui->verticalSlider->setSliderPosition(currRate/ui->dispCurve->yAxis->range().upper*100.0/(2*sqrt(myChain->getCoefficient()/(*myChain)[0]->getMass())));
}
/*
수정내역
1. pows함수 math의 pow함수로 대체 pows제거
2. bool ON Player로 이동
3. if(!ON) Player로 이동
4. 이동조건문 Player로 이동
*/
void CMainScene::update(float eTime){
	ISceneNode::update(eTime);
	float temp, tX, tY, tvX, tvY;
	

	if(pow((a->pos.x-P->pos.x),2)+pow((a->pos.y-P->pos.y),2) <= pow( ((a->GetWidth()/2)+(P->GetWidth()/2)+60),2 ))
	{
		if((P->pos.x <= a->pos.x && P->pos.y <= a->pos.y) || (P->pos.x >= a->pos.x && P->pos.y >= a->pos.y))
		{
			a->vY+=Sin(a->pos.x , P->pos.x, a->pos.y, P->pos.y) / 15;
			a->vX+=Cos(a->pos.x , P->pos.x, a->pos.y, P->pos.y) / 15;
		}
		else
		{
			a->vY+=-Sin(a->pos.x , P->pos.x, a->pos.y, P->pos.y) / 15;
			a->vX+=-Cos(a->pos.x , P->pos.x, a->pos.y, P->pos.y) / 15;
		}
		if(pow((a->pos.x - P->pos.x),2) + pow((a->pos.y - P->pos.y),2) <= pow( ((a->GetWidth() / 2) + (P->GetWidth() / 2)),2) )
		{
			printf("a\n");
			tX = a->pos.x;
			tY = a->pos.y;
			tvX = a->vX;
			tvY = a->vY;

			temp = tvX;
			tvX = -tvY;
			tvY = -temp;
			
			tX += 2*tvX;
			tY += 2*tvY;

			if( pow((tX - P->pos.x), 2)+pow((tY - P->pos.y), 2) <= pow( ((a->GetWidth() / 2) + (P->GetWidth() / 2)),2 ) || plma(tX,a->vX,tY,a->vY) )
			{
				printf("s\n");
				tX = a->pos.x;
				tY = a->pos.y;
				tvX = a->vX;
				tvY = a->vY;

				temp = tvX;
				tvX = -tvY;
				tvY = temp;

				tX += 2*tvX;
				tY += 2*tvY;

				if( pow((tX - P->pos.x),2) + pow((tY - P->pos.y),2) <= pow( ((a->GetWidth() / 2) + (P->GetWidth() / 2)),2 ) || plma(tX,a->vX,tY,a->vY) )
				{
					printf("d\n");
					tX = a->pos.x;
					tY = a->pos.y;
					tvX = a->vX;
					tvY = a->vY;

					temp = tvX;
					a->vX = tvY;
					a->vY = -temp;

					tX += 2*tvX;
					tY += 2*tvY;
					if( pow((tX - P->pos.x),2) + pow((tY - P->pos.y),2) <= pow( ((a->GetWidth() / 2) + (P->GetWidth() / 2)),2 ) || plma(tX,a->vX,tY,a->vY) )
					{
						printf("f\n");
						tX = a->pos.x;
						tY = a->pos.y;
						tvX = a->vX;
						tvY = a->vY;

						temp = tvX;
						a->vX = tvY;
						a->vY = temp;

						a->vX = tvX;
						a->vY = tvY;
					}
					else
					{
						a->vX = tvX;
						a->vY = tvY;
					}
				}
				else
				{
					a->vX = tvX;
					a->vY = tvY;
				}
			}
			else
			{
				a->vX = tvX;
				a->vY = tvY;
			}
			a->vX-=a->vX/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y)*0.85+((a->vX/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y))/100000000)));
			a->vY-=a->vY/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y)*0.85+((a->vY/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y))/100000000)));
			
		}
		else
		{
			a->vX-=a->vX/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y)*0.85+((a->vX/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y))/100000000)));
			a->vY-=a->vY/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y)*0.85+((a->vY/(TryLength(a->pos.x , P->pos.x, a->pos.y, P->pos.y))/100000000)));
			if((absF(a->vX) <= 0.4 && absF(a->vY) <= 0.4) && pow((a->pos.x - P->pos.x),2) + pow((a->pos.y - P->pos.y),2) <= pow( ((a->GetWidth() / 2) + (P->GetWidth() / 2)+0.5),2 ))
			{
				a->vX = 0;
				a->vY = 0;
			}
		}
	}


	 
}