示例#1
0
void FishCampCCD::TimerHit()
{
    int timerHitID = -1, state = -1, rc = -1;
    float timeleft;
    double ccdTemp;

    if (!isConnected())
        return; //  No need to reset timer if we are not connected anymore

    if (InExposure)
    {
        timeleft = CalcTimeLeft();

        if (timeleft < 1.0)
        {
            if (timeleft > 0.25)
            {
                //  a quarter of a second or more
                //  just set a tighter timer
                timerHitID = SetTimer(250);
            }
            else
            {
                if (timeleft > 0.07)
                {
                    //  use an even tighter timer
                    timerHitID = SetTimer(50);
                }
                else
                {
                    //  it's real close now, so spin on it
                    //  We have to wait till the camera is ready to download
                    bool ready = false;
                    int slv;
                    slv = fabs(100000 * timeleft); //0.05s (50000 us) is checked every 5000 us or so
                    while (!sim && !ready)
                    {
                        state = fcUsb_cmd_getState(cameraNum);
                        if (state == 0)
                            ready = true;
                        else
                            usleep(slv);
                    }

                    /* We're done exposing */
                    LOG_DEBUG("Exposure done, downloading image...");

                    PrimaryCCD.setExposureLeft(0);
                    InExposure = false;
                    /* grab and save image */
                    grabImage();
                }
            }
        }
        else
        {
            LOGF_DEBUG("Image not yet ready. With time left %ld\n", timeleft);
            PrimaryCCD.setExposureLeft(timeleft);
        }
    }

    switch (TemperatureNP.s)
    {
        case IPS_IDLE:
        case IPS_OK:
            rc = fcUsb_cmd_getTemperature(cameraNum);

            LOGF_DEBUG("fcUsb_cmd_getTemperature returns %d", rc);

            ccdTemp = rc / 100.0;

            LOGF_DEBUG("Temperature %g", ccdTemp);

            if (fabs(TemperatureN[0].value - ccdTemp) >= TEMP_THRESHOLD)
            {
                TemperatureN[0].value = ccdTemp;
                IDSetNumber(&TemperatureNP, nullptr);
            }

            break;

        case IPS_BUSY:
            if (sim)
            {
                TemperatureN[0].value = TemperatureRequest;
            }
            else
            {
                rc = fcUsb_cmd_getTemperature(cameraNum);

                LOGF_DEBUG("fcUsb_cmd_getTemperature returns %d", rc);

                TemperatureN[0].value = rc / 100.0;
            }

            // If we're within threshold, let's make it BUSY ---> OK
            if (fabs(TemperatureRequest - TemperatureN[0].value) <= TEMP_THRESHOLD)
                TemperatureNP.s = IPS_OK;

            IDSetNumber(&TemperatureNP, nullptr);
            break;

        case IPS_ALERT:
            break;
    }

    switch (CoolerNP.s)
    {
        case IPS_OK:
            CoolerN[0].value = fcUsb_cmd_getTECPowerLevel(cameraNum);
            IDSetNumber(&CoolerNP, nullptr);
            LOGF_DEBUG("Cooler power level %g %", CoolerN[0].value);
            break;

        default:
            break;
    }

    if (timerHitID == -1)
        SetTimer(POLLMS);
    return;
}
示例#2
0
void FishCampCCD::TimerHit()
{
    int timerHitID = -1, state = -1, rc = -1;
    long timeleft;
    double ccdTemp;

    if (isConnected() == false)
        return; //  No need to reset timer if we are not connected anymore

    if (InExposure)
    {
        timeleft = CalcTimeLeft();

        if (timeleft < 1.0)
        {
            if (timeleft > 0.25)
            {
                //  a quarter of a second or more
                //  just set a tighter timer
                timerHitID = SetTimer(250);
            }
            else
            {
                if (timeleft > 0.07)
                {
                    //  use an even tighter timer
                    timerHitID = SetTimer(50);
                }
                else
                {
                    //  it's real close now, so spin on it
                    while (!sim && timeleft > 0)
                    {
                        state = fcUsb_cmd_getState(cameraNum);
                        if (state == 0)
                            timeleft = 0;

                        int slv;
                        slv = 100000 * timeleft;
                        usleep(slv);
                    }

                    /* We're done exposing */
                    DEBUG(INDI::Logger::DBG_DEBUG, "Exposure done, downloading image...");

                    PrimaryCCD.setExposureLeft(0);
                    InExposure = false;
                    /* grab and save image */
                    grabImage();
                }
            }
        }
        else
        {
            DEBUGF(INDI::Logger::DBG_DEBUG, "Image not yet ready. With time left %ld\n", timeleft);
        }

        PrimaryCCD.setExposureLeft(timeleft);
    }

    switch (TemperatureNP.s)
    {
        case IPS_IDLE:
        case IPS_OK:
            rc = fcUsb_cmd_getTemperature(cameraNum);

            DEBUGF(INDI::Logger::DBG_DEBUG, "fcUsb_cmd_getTemperature returns %d", rc);

            ccdTemp = rc / 100.0;

            DEBUGF(INDI::Logger::DBG_DEBUG, "Temperature %g", ccdTemp);

            if (fabs(TemperatureN[0].value - ccdTemp) >= TEMP_THRESHOLD)
            {
                TemperatureN[0].value = ccdTemp;
                IDSetNumber(&TemperatureNP, NULL);
            }

            break;

        case IPS_BUSY:
            if (sim)
            {
                TemperatureN[0].value = TemperatureRequest;
            }
            else
            {
                rc = fcUsb_cmd_getTemperature(cameraNum);

                DEBUGF(INDI::Logger::DBG_DEBUG, "fcUsb_cmd_getTemperature returns %d", rc);

                TemperatureN[0].value = rc / 100.0;
            }

            // If we're within threshold, let's make it BUSY ---> OK
            if (fabs(TemperatureRequest - TemperatureN[0].value) <= TEMP_THRESHOLD)
                TemperatureNP.s = IPS_OK;

            IDSetNumber(&TemperatureNP, NULL);
            break;

        case IPS_ALERT:
            break;
    }

    switch (CoolerNP.s)
    {
        case IPS_OK:
            CoolerN[0].value = fcUsb_cmd_getTECPowerLevel(cameraNum);
            IDSetNumber(&CoolerNP, NULL);
            DEBUGF(INDI::Logger::DBG_DEBUG, "Cooler power level %g %", CoolerN[0].value);
            break;

        default:
            break;
    }

    if (timerHitID == -1)
        SetTimer(POLLMS);
    return;
}