Exemple #1
0
/*
	-Pre-Reqs:	SetupPWM(uint32_t prescale) with prescale = 10
				setupI2C1()
				setupUART()
				setupADC()
	-Globals:	sweepspeed
				samplespersweep
				sweepstartpos
				sweepstoppos
	-Desc:	Moves servo between servo start and end position at a set speed,
			scans a set number of times.
			If '0' is pressed on the keypad, quits.
*/
void scanMode(void){
	initServo(1);
	setServo(sweepstartpos);
	SystickTimer(100);

	// gap between scans = scan range / sample speed
	uint32_t scangap = (uint32_t)((float)(sweepstoppos - sweepstartpos)/(float)samplespersweep);
	char button;
	int turnAmt;
	int dir = 1;
	int i = samplespersweep - 1;
	while(1){
		// If servo at edge, change direction
		if(servoAtEdge()){
			dir = dir*-1;
			startSweep();
			i = samplespersweep - 1;
			averageDistance = _averageSweep();
		}

		// Turn servo in the "dir" direction by "sweepspeed"
		turnAmt = dir*sweepspeed;
		turnServo(turnAmt);

		if(servo_position % scangap < sweepspeed){
			currentIr = irMedian();
			sendScanData(currentIr);
			sweep[i] = currentIr;
			currentRawIr = irMedianRaw();
		}

		// If 0 was pressed on the keypad, break out of the loop.
		button = KeypadTest();
		if(button == '0'){
			break;
		};

		SystickTimer(10);
	}
}
Exemple #2
0
void SweepHelper(Mesh& mesh) {
    float r_i = 0.2;
    float r_o = 0.7;

    glm::vec3 startSweep(0.0f, 0.0f, 1.0f);
    glm::vec3   endSweep(0.0f, 0.0f, 3.5f);

    // the sweep curve.
    auto sweepCurve = [=](float t) {
	return
	(1.0f-t)*startSweep + t * endSweep

//	glm::vec3(0.0f, -0.9f * t*t, 0.0f );

//	glm::vec3(0.0f,0.5f,0.0f) * (float)sin(0.8f*2.0f*M_PI * t);
	; };


    const float STEP_LENGTH = 0.01;

    for(float t = 0.0f; t <= 1.0; t+=STEP_LENGTH) {

	float t2 = t+STEP_LENGTH;
	float t1 = t;

	glm::vec3 c = sweepCurve(t1);

	glm::vec3 v = sweepCurve(t2) - sweepCurve(t1);
	float deltaLength = glm::length(v);
	v = glm::normalize(v);

	glm::vec3 u;
	glm::vec3 w;

	FindBasis(v, u, w);

	auto e = [&](glm::vec3 x) { return glm::dot(u, x-c ); };
	auto f = [&](glm::vec3 x) { return glm::dot(w, x-c ); };

	auto b = [=](float rx) {
	    float a = (rx - r_i) / (r_o - r_i);
	    return 3*a*a*a*a - 4*a*a*a + 1;
	};


	auto p = [&](const glm::vec3& x) {
	    float rx = glm::length(x - c);

	    if(rx < r_i) {
		return e(x);
	    }else if(rx >= r_i && rx <= r_o) {
		return e(x) * b(rx);
	    } else {
		return 0.0f;
	    }
	};

	auto q = [&](const glm::vec3& x) {
	    float rx = glm::length(x - c);

	    if(rx < r_i) {
		return f(x);
	    }else if(rx >= r_i && rx <= r_o) {
		return f(x) * b(rx);
	    } else {
		return 0.0f;
	    }
	};

	for(glm::vec3& x : mesh.vertices) {

	    glm::vec3 grad_p = Gradient(p, x );
	    glm::vec3 grad_q = Gradient(q, x );

	    /*
	      float rx = glm::length(x - c);
	      float s = 1.0f;
	      if(rx < r_i) {

	      s *= deltaLength;
	      } else if(rx >= r_i && rx <= r_o) {
	      s *= b(rx);
	      } else {
	      s *= 0.0f;
	      }

	      // deformation field.
	      //glm::vec3 D = (glm::cross(div_e, div_f));
	      glm::vec3 D = s * v;
	    */

	    glm::vec3 D = deltaLength * glm::cross(grad_q, grad_p  );

	    x += D;

	}


    }

}