예제 #1
0
static i32 timer_start(struct sw_timer *swt, struct u64_time *time_u64,
                       u32 options)
{
        if(false == is_alloc_only(swt))
                return -1; /* Not only allocated but started as well */
        
        if((-1 == setup_timer_interval(swt, time_u64))  ||
           (-1 == setup_timer_exec(swt, options)))
                return -1;

        set_periodic(swt, options & OPT_TIMER_PERIODIC ? true : false);

        return 0;
}
예제 #2
0
static i32 timer_stop(struct sw_timer *swt)
{
        struct hwt_info *hwt = swt->hwt_obj;

        if(0 != remove_elem(swt, &hwt->used_list)) {
                return -1;
        }

        set_scheduled(swt, false);
        set_periodic(swt, false);

        if(NULL != hwt->used_list)
                sched_timer_if_new(hwt->used_list);
        else
                hwt_stop(hwt); /* No pending request, stop HW */

        return 0;
}
예제 #3
0
void EinspurDynamikRealtime::run()
{
    motPlat->start();
    set_periodic(period);

    motPlat->getSendMutex().acquire(period);
    motPlat->switchToMode<ValidateMotionPlatform::controlDisabled>();
    motPlat->getSendMutex().release();
    rt_task_wait_period(&overruns);

    //SteeringWheel
    set_periodic(TM_INFINITE);
    steerWheel->init();
    std::deque<int32_t> steerSpeedDeque(50, 0);
    std::deque<int32_t>::iterator steerSpeedDequeIt;
    double lowPassSpeed = 0.0;
    int32_t driftPosition = 0;

    set_periodic(period);
    while (runTask)
    {
        brakePedal = std::max(0.0, std::min(1.0, ValidateMotionPlatform::instance()->getBrakePedalPosition() * 5.0));

        if (!pause)
        {
            double h = (double)(period * (overruns + 1)) * 1e-9;
            integrate(h, 0, 0, 0);
        }
        /*longAngleDeque.pop_front();
      longAngleDeque.push_back(-yOne.zeta);
      double longAngle=0;
      for(angleDequeIt=longAngleDeque.begin(); angleDequeIt!=longAngleDeque.end(); ++angleDequeIt) {
         longAngle += (*angleDequeIt);
      }
      longAngle = longAngle/(double)longAngleDeque.size();

      latAngleDeque.pop_front();
      latAngleDeque.push_back(-yOne.epsilon);
      double latAngle=0;
      for(angleDequeIt=latAngleDeque.begin(); angleDequeIt!=latAngleDeque.end(); ++angleDequeIt) {
         latAngle += (*angleDequeIt);
      }
      latAngle = latAngle/(double)latAngleDeque.size();*/

        if (movingToGround)
        {
            if (motPlat->isGrounded())
            {
                movingToGround = false;
                motPlat->getSendMutex().acquire(period);
                motPlat->switchToMode<ValidateMotionPlatform::controlDisabled>();
                motPlat->getSendMutex().release();
            }
        }
        else if (returningToAction)
        {
            if (motPlat->isMiddleLifted())
            {
                returningToAction = false;
                pause = false;

                motPlat->getSendMutex().acquire(period);
                //motPlat->switchToMode<ValidateMotionPlatform::controlPositioning>();
                motPlat->switchToMode<ValidateMotionPlatform::controlInterpolatedPositioning>();
                for (unsigned int motIt = 0; motIt < motPlat->numLinMots; ++motIt)
                {
                    motPlat->setVelocitySetpoint(motIt, ValidateMotionPlatform::velMax);
                    motPlat->setAccelerationSetpoint(motIt, ValidateMotionPlatform::accMax);
                }
                motPlat->getSendMutex().release();
            }
        }
        else if (!pause)
        {
            double longAngle = -yOne.zeta;
            double latAngle = -yOne.epsilon;

            motPlat->getSendMutex().acquire(period);
            motPlat->setLongitudinalAngleSetpoint(longAngle);
            motPlat->setLateralAngleSetpoint(latAngle);
            motPlat->getSendMutex().release();
        }

        //SteeringWheel
        steerCon->sendSync();
        steerCon->recvPDO(1);

        //steerPosition = steerWheel->getPosition();
        //steerSpeed = steerWheel->getSpeed();
        steerWheel->getPositionSpeed(steerPosition, steerSpeed);
        *(((uint8_t *)&steerSpeed) + 3) = (*(((uint8_t *)&steerSpeed) + 2) & 0x80) ? 0xff : 0x0;
        steerSpeedDeque.pop_front();
        steerSpeedDeque.push_back(steerSpeed);
        lowPassSpeed = 0;
        for (steerSpeedDequeIt = steerSpeedDeque.begin(); steerSpeedDequeIt != steerSpeedDeque.end(); ++steerSpeedDequeIt)
        {
            lowPassSpeed += (*steerSpeedDequeIt);
        }
        lowPassSpeed = (double)lowPassSpeed / (double)steerSpeedDeque.size();

        double drillElasticity = tanh(fabs(yOne.v));
        int32_t current = (int32_t)(-steerWheel->getSpringConstant() * drillElasticity * (double)steerPosition - steerWheel->getDampingConstant() * lowPassSpeed); //Spring-Damping-Model

        current += (int32_t)(((rand() / ((double)RAND_MAX)) - 0.5) * steerWheel->getRumbleAmplitude()); //Rumbling

        double drillRigidness = 1.0 - drillElasticity;
        if ((driftPosition - steerPosition) > 100000 * drillRigidness)
            driftPosition = steerPosition + (int32_t)(100000 * drillRigidness);
        else if ((driftPosition - steerPosition) < -100000 * drillRigidness)
            driftPosition = steerPosition - (int32_t)(100000 * drillRigidness);
        current += (int32_t)((double)(driftPosition - steerPosition) * steerWheel->getDrillConstant());
        //std::cerr << "drift steerPosition - steerPosition: " << (int32_t)((double)(driftPosition-steerPosition)*0.005) << ", drill current: " << (int32_t)((double)(driftPosition-steerPosition)*Kdrill) << ", Kdrill: " << Kdrill << std::endl;
        steerWheel->setCurrent(current);

        steerCon->sendPDO();

        /*if((count % 1000)==0) {
         std::cerr << "Count: " << count << ", overruns: " << overruns << std::endl;
      }
      ++count;*/
        if (overruns > 0)
        {
            std::cerr << "EinspurDynamikRealtime::run(): overruns: " << overruns << std::endl;
        }
        rt_task_wait_period(&overruns);
    }
    /*steerCon->sendSync();
   rt_task_wait_period(&overruns);
   rt_task_wait_period(&overruns);
   steerCon->sendSync();*/

    motPlat->getSendMutex().acquire(period);
    motPlat->switchToMode<ValidateMotionPlatform::controlToGround>();
    motPlat->getSendMutex().release();
    while (!motPlat->isGrounded())
    {
        rt_task_wait_period(&overruns);
    }
    motPlat->getSendMutex().acquire(period);
    motPlat->switchToMode<ValidateMotionPlatform::controlDisabled>();
    motPlat->getSendMutex().release();

    set_periodic(TM_INFINITE);
    //SteerWheel
    //rt_task_sleep(10000000);
    steerWheel->shutdown();

    taskFinished = true;
}