/************************************************************************************ * * ***********************************************************************************/ void ScopeDome::TimerHit() { if (!isConnected()) return; // No need to reset timer if we are not connected anymore readU16(GetStatus, currentStatus); // LOGF_INFO("Status: %x", currentStatus); UpdatePosition(); UpdateShutterStatus(); IDSetSwitch(&DomeShutterSP, nullptr); UpdateRelayStatus(); if (status == DOME_HOMING) { if ((currentStatus & 8) == 0 && getInputState(IN_HOME)) { // Found home status = DOME_READY; targetAz = DomeHomePositionN[0].value; // Reset counter writeCmd(ResetCounter); FindHomeSP.s = IPS_OK; DomeAbsPosNP.s = IPS_OK; IDSetSwitch(&FindHomeSP, nullptr); } IDSetNumber(&DomeAbsPosNP, nullptr); } else if (status == DOME_DEROTATING) { if ((currentStatus & 2) == 0) { readS32(GetCounterExt, currentRotation); LOGF_INFO("Current rotation is %d", currentRotation); if (abs(currentRotation) < 100) { // Close enough status = DOME_READY; DerotateSP.s = IPS_OK; DomeAbsPosNP.s = IPS_OK; IDSetSwitch(&DerotateSP, nullptr); } else { if (currentRotation < 0) { writeU16(CCWRotation, compensateInertia(-currentRotation)); } else { writeU16(CWRotation, compensateInertia(currentRotation)); } } } IDSetNumber(&DomeAbsPosNP, nullptr); } else if (DomeAbsPosNP.s == IPS_BUSY) { if ((currentStatus & 2) == 0) { // Rotation idle, are we close enough? double azDiff = targetAz - DomeAbsPosN[0].value; if (azDiff > 180) { azDiff -= 360; } if (azDiff < -180) { azDiff += 360; } if (fabs(azDiff) <= DomeParamN[0].value) { DomeAbsPosN[0].value = targetAz; DomeAbsPosNP.s = IPS_OK; LOG_INFO("Dome reached requested azimuth angle."); if (getDomeState() == DOME_PARKING) { if (ParkShutterS[0].s == ISS_ON && getInputState(IN_CLOSED1) == ISS_OFF) { ControlShutter(SHUTTER_CLOSE); } else { SetParked(true); } } else if (getDomeState() == DOME_UNPARKING) SetParked(false); else setDomeState(DOME_SYNCED); } else { // Refine azimuth MoveAbs(targetAz); } } IDSetNumber(&DomeAbsPosNP, nullptr); } else IDSetNumber(&DomeAbsPosNP, nullptr); // Read temperatures only every 10th time static int tmpCounter = 0; if (--tmpCounter <= 0) { UpdateSensorStatus(); tmpCounter = 10; } SetTimer(POLLMS); }
/************************************************************************************ * * ***********************************************************************************/ bool ScopeDome::UpdateShutterStatus() { int rc = readBuffer(GetAllDigitalExt, 5, digitalSensorState); if (rc != 0) { LOGF_ERROR("Error reading input state: %d", rc); return false; } // LOGF_INFO("digitalext %x %x %x %x %x", digitalSensorState[0], // digitalSensorState[1], digitalSensorState[2], digitalSensorState[3], // digitalSensorState[4]); SensorsS[0].s = getInputState(IN_ENCODER); SensorsS[1].s = ISS_OFF; // ? SensorsS[2].s = getInputState(IN_HOME); SensorsS[3].s = getInputState(IN_OPEN1); SensorsS[4].s = getInputState(IN_CLOSED1); SensorsS[5].s = getInputState(IN_OPEN2); SensorsS[6].s = getInputState(IN_CLOSED2); SensorsS[7].s = getInputState(IN_S_HOME); SensorsS[8].s = getInputState(IN_CLOUDS); SensorsS[9].s = getInputState(IN_CLOUD); SensorsS[10].s = getInputState(IN_SAFE); SensorsS[11].s = getInputState(IN_ROT_LINK); SensorsS[12].s = getInputState(IN_FREE); SensorsSP.s = IPS_OK; IDSetSwitch(&SensorsSP, nullptr); DomeShutterSP.s = IPS_OK; IUResetSwitch(&DomeShutterSP); if (getInputState(IN_OPEN1) == ISS_ON) // shutter open switch triggered { if (shutterState == SHUTTER_MOVING && targetShutter == SHUTTER_OPEN) { LOGF_INFO("%s", GetShutterStatusString(SHUTTER_OPENED)); setOutputState(OUT_OPEN1, ISS_OFF); shutterState = SHUTTER_OPENED; if (getDomeState() == DOME_UNPARKING) SetParked(false); } DomeShutterS[SHUTTER_OPEN].s = ISS_ON; } else if (getInputState(IN_CLOSED1) == ISS_ON) // shutter closed switch triggered { if (shutterState == SHUTTER_MOVING && targetShutter == SHUTTER_CLOSE) { LOGF_INFO("%s", GetShutterStatusString(SHUTTER_CLOSED)); setOutputState(OUT_CLOSE1, ISS_OFF); shutterState = SHUTTER_CLOSED; if (getDomeState() == DOME_PARKING && DomeAbsPosNP.s != IPS_BUSY) { SetParked(true); } } DomeShutterS[SHUTTER_CLOSE].s = ISS_ON; } else { shutterState = SHUTTER_MOVING; DomeShutterSP.s = IPS_BUSY; } return true; }
/************************************************************************************ * * ***********************************************************************************/ void BaaderDome::TimerHit() { if (!isConnected()) return; // No need to reset timer if we are not connected anymore UpdatePosition(); if (DomeAbsPosNP.s == IPS_BUSY) { if (sim) { double speed = 0; if (fabs(targetAz - DomeAbsPosN[0].value) > SIM_DOME_HI_SPEED) speed = SIM_DOME_HI_SPEED; else speed = SIM_DOME_LO_SPEED; if (DomeRelPosNP.s == IPS_BUSY) { // CW if (DomeMotionS[0].s == ISS_ON) DomeAbsPosN[0].value += speed; // CCW else DomeAbsPosN[0].value -= speed; } else { if (targetAz > DomeAbsPosN[0].value) { DomeAbsPosN[0].value += speed; } else if (targetAz < DomeAbsPosN[0].value) { DomeAbsPosN[0].value -= speed; } } if (DomeAbsPosN[0].value < DomeAbsPosN[0].min) DomeAbsPosN[0].value += DomeAbsPosN[0].max; if (DomeAbsPosN[0].value > DomeAbsPosN[0].max) DomeAbsPosN[0].value -= DomeAbsPosN[0].max; } if (fabs(targetAz - DomeAbsPosN[0].value) < DomeParamN[0].value) { DomeAbsPosN[0].value = targetAz; DEBUG(INDI::Logger::DBG_SESSION, "Dome reached requested azimuth angle."); if (status != DOME_CALIBRATING) { if (getDomeState() == DOME_PARKING) SetParked(true); else if (getDomeState() == DOME_UNPARKING) SetParked(false); else setDomeState(DOME_SYNCED); } if (status == DOME_CALIBRATING) { if (calibrationStage == CALIBRATION_STAGE1) { DEBUG(INDI::Logger::DBG_SESSION, "Calibration stage 1 complete. Starting stage 2..."); calibrationTarget2 = DomeAbsPosN[0].value + 2; calibrationStage = CALIBRATION_STAGE2; MoveAbs(calibrationTarget2); DomeAbsPosNP.s = IPS_BUSY; } else if (calibrationStage == CALIBRATION_STAGE2) { DEBUGF(INDI::Logger::DBG_SESSION, "Calibration stage 2 complete. Returning to initial position %g...", calibrationStart); calibrationStage = CALIBRATION_STAGE3; MoveAbs(calibrationStart); DomeAbsPosNP.s = IPS_BUSY; } else if (calibrationStage == CALIBRATION_STAGE3) { calibrationStage = CALIBRATION_COMPLETE; DEBUG(INDI::Logger::DBG_SESSION, "Dome reached initial position."); } } } IDSetNumber(&DomeAbsPosNP, nullptr); } else IDSetNumber(&DomeAbsPosNP, nullptr); UpdateShutterStatus(); if (sim && DomeShutterSP.s == IPS_BUSY) { if (simShutterTimer-- <= 0) { simShutterTimer = 0; simShutterStatus = (targetShutter == SHUTTER_OPEN) ? SHUTTER_OPENED : SHUTTER_CLOSED; } } else IDSetSwitch(&DomeShutterSP, nullptr); UpdateFlapStatus(); if (sim && DomeFlapSP.s == IPS_BUSY) { if (simFlapTimer-- <= 0) { simFlapTimer = 0; simFlapStatus = (targetFlap == FLAP_OPEN) ? FLAP_OPENED : FLAP_CLOSED; } } else IDSetSwitch(&DomeFlapSP, nullptr); SetTimer(POLLMS); }
void DomeScript::TimerHit() { if (!isConnected()) return; char name[1024]={0}; // N.B. INDI_UNUSED to make it compile on MacOS // DO NOT CHANGE char *s = tmpnam(name); INDI_UNUSED(s); bool status = RunScript(SCRIPT_STATUS, name, nullptr); if (status) { int parked = 0, shutter = 0; float az = 0; FILE *file = fopen(name, "r"); int ret = 0; ret = fscanf(file, "%d %d %f", &parked, &shutter, &az); fclose(file); unlink(name); DomeAbsPosN[0].value = az = round(range360(az) * 10) / 10; if (parked != 0) { if (getDomeState() == DOME_PARKING || getDomeState() == DOME_UNPARKED) { SetParked(true); TargetAz = az; LOG_INFO("Park succesfully executed"); } } else { if (getDomeState() == DOME_UNPARKING || getDomeState() == DOME_PARKED) { SetParked(false); TargetAz = az; LOG_INFO("Unpark succesfully executed"); } } if (std::round(az * 10) != std::round(TargetAz * 10)) { LOGF_INFO("Moving %g -> %g %d", std::round(az * 10) / 10, std::round(TargetAz * 10) / 10, getDomeState()); IDSetNumber(&DomeAbsPosNP, nullptr); } else if (getDomeState() == DOME_MOVING) { setDomeState(DOME_SYNCED); IDSetNumber(&DomeAbsPosNP, nullptr); } if (shutterState == SHUTTER_OPENED) { if (shutter == 0) { shutterState = SHUTTER_CLOSED; DomeShutterSP.s = IPS_OK; IDSetSwitch(&DomeShutterSP, nullptr); LOG_INFO("Shutter was succesfully closed"); } } else { if (shutter == 1) { shutterState = SHUTTER_OPENED; DomeShutterSP.s = IPS_OK; IDSetSwitch(&DomeShutterSP, nullptr); LOG_INFO("Shutter was succesfully opened"); } } } else { LOG_ERROR("Failed to read status"); } SetTimer(POLLMS); if (!isParked() && TimeSinceUpdate++ > 4) { TimeSinceUpdate = 0; UpdateMountCoords(); } }
void DomeSim::TimerHit() { int nexttimer=1000; if(isConnected() == false) return; // No need to reset timer if we are not connected anymore if (DomeAbsPosNP.s == IPS_BUSY) { if (targetAz > DomeAbsPosN[0].value) { DomeAbsPosN[0].value += DOME_SPEED; } else if (targetAz < DomeAbsPosN[0].value) { DomeAbsPosN[0].value -= DOME_SPEED; } DomeAbsPosN[0].value = range360(DomeAbsPosN[0].value); if (fabs(targetAz - DomeAbsPosN[0].value) <= DOME_SPEED) { DomeAbsPosN[0].value = targetAz; DEBUG(INDI::Logger::DBG_SESSION, "Dome reached requested azimuth angle."); if (getDomeState() == DOME_PARKING) SetParked(true); else if (getDomeState() == DOME_UNPARKING) SetParked(false); else setDomeState(DOME_SYNCED); } IDSetNumber(&DomeAbsPosNP, NULL); } if (DomeShutterSP.s == IPS_BUSY) { if (shutterTimer-- <= 0) { shutterTimer=0; DomeShutterSP.s = IPS_OK; DEBUGF(INDI::Logger::DBG_SESSION, "Shutter is %s.", (DomeShutterS[0].s == ISS_ON ? "open" : "closed")); IDSetSwitch(&DomeShutterSP, NULL); if (getDomeState() == DOME_UNPARKING) SetParked(false); } } SetTimer(nexttimer); // Not all mounts update ra/dec constantly if tracking co-ordinates // This is to ensure our alt/az gets updated even if ra/dec isn't being updated // Once every 10 seconds is more than sufficient // with this added, dome simulator will now correctly track telescope simulator // which does not emit new ra/dec co-ords if they are not changing if(isParked() == false && TimeSinceUpdate++ > 9) { TimeSinceUpdate=0; UpdateMountCoords(); } return; }