bool FocuserInterface::processSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) { INDI_UNUSED(dev); // This one is for us if (strcmp(name, "FOCUS_MOTION") == 0) { // Record last direction and state. FocusDirection prevDirection = FocusMotionS[FOCUS_INWARD].s == ISS_ON ? FOCUS_INWARD : FOCUS_OUTWARD; IPState prevState = FocusMotionSP.s; IUUpdateSwitch(&FocusMotionSP, states, names, n); FocusDirection targetDirection = FocusMotionS[FOCUS_INWARD].s == ISS_ON ? FOCUS_INWARD : FOCUS_OUTWARD; if (CanRelMove() || CanAbsMove() || HasVariableSpeed()) { FocusMotionSP.s = IPS_OK; } // If we are dealing with a simple dumb DC focuser, we move in a specific direction in an open-loop fashion until stopped. else { // If we are reversing direction let's issue abort first. if (prevDirection != targetDirection && prevState == IPS_BUSY) AbortFocuser(); FocusMotionSP.s = MoveFocuser(targetDirection, 0, 0); } IDSetSwitch(&FocusMotionSP, nullptr); return true; } if (strcmp(name, "FOCUS_ABORT_MOTION") == 0) { IUResetSwitch(&AbortSP); if (AbortFocuser()) { AbortSP.s = IPS_OK; if (CanAbsMove() && FocusAbsPosNP.s != IPS_IDLE) { FocusAbsPosNP.s = IPS_IDLE; IDSetNumber(&FocusAbsPosNP, nullptr); } if (CanRelMove() && FocusRelPosNP.s != IPS_IDLE) { FocusRelPosNP.s = IPS_IDLE; IDSetNumber(&FocusRelPosNP, nullptr); } } else AbortSP.s = IPS_ALERT; IDSetSwitch(&AbortSP, nullptr); return true; } return false; }
bool FocuserInterface::updateProperties() { if (m_defaultDevice->isConnected()) { // Now we add our focusser specific stuff m_defaultDevice->defineSwitch(&FocusMotionSP); if (HasVariableSpeed()) { m_defaultDevice->defineNumber(&FocusSpeedNP); // We only define Focus Timer if we can not absolute move if (CanAbsMove() == false) m_defaultDevice->defineNumber(&FocusTimerNP); } if (CanRelMove()) m_defaultDevice->defineNumber(&FocusRelPosNP); if (CanAbsMove()) { m_defaultDevice->defineNumber(&FocusAbsPosNP); m_defaultDevice->defineNumber(&FocusMaxPosNP); } if (CanAbort()) m_defaultDevice->defineSwitch(&FocusAbortSP); if (CanSync()) m_defaultDevice->defineNumber(&FocusSyncNP); if (CanReverse()) m_defaultDevice->defineSwitch(&FocusReverseSP); } else { m_defaultDevice->deleteProperty(FocusMotionSP.name); if (HasVariableSpeed()) { m_defaultDevice->deleteProperty(FocusSpeedNP.name); if (CanAbsMove() == false) m_defaultDevice->deleteProperty(FocusTimerNP.name); } if (CanRelMove()) m_defaultDevice->deleteProperty(FocusRelPosNP.name); if (CanAbsMove()) { m_defaultDevice->deleteProperty(FocusAbsPosNP.name); m_defaultDevice->deleteProperty(FocusMaxPosNP.name); } if (CanAbort()) m_defaultDevice->deleteProperty(FocusAbortSP.name); if (CanSync()) m_defaultDevice->deleteProperty(FocusSyncNP.name); if (CanReverse()) m_defaultDevice->deleteProperty(FocusReverseSP.name); } return true; }
bool INDI::Focuser::updateProperties() { if(isConnected()) { // Now we add our focusser specific stuff defineSwitch(&FocusMotionSP); if (HasVariableSpeed()) { defineNumber(&FocusSpeedNP); defineNumber(&FocusTimerNP); } if (CanRelMove()) defineNumber(&FocusRelPosNP); if (CanAbsMove()) defineNumber(&FocusAbsPosNP); if (CanAbort()) defineSwitch(&AbortSP); if (CanAbsMove()) { defineNumber(&PresetNP); defineSwitch(&PresetGotoSP); } } else { deleteProperty(FocusMotionSP.name); if (HasVariableSpeed()) { deleteProperty(FocusSpeedNP.name); deleteProperty(FocusTimerNP.name); } if (CanRelMove()) deleteProperty(FocusRelPosNP.name); if (CanAbsMove()) deleteProperty(FocusAbsPosNP.name); if (CanAbort()) deleteProperty(AbortSP.name); if (CanAbsMove()) { deleteProperty(PresetNP.name); deleteProperty(PresetGotoSP.name); } } controller->updateProperties(); return true; }
bool FocuserInterface::updateProperties() { if (m_defaultDevice->isConnected()) { // Now we add our focusser specific stuff m_defaultDevice->defineSwitch(&FocusMotionSP); if (HasVariableSpeed()) { m_defaultDevice->defineNumber(&FocusSpeedNP); m_defaultDevice->defineNumber(&FocusTimerNP); } if (CanRelMove()) m_defaultDevice->defineNumber(&FocusRelPosNP); if (CanAbsMove()) m_defaultDevice->defineNumber(&FocusAbsPosNP); if (CanAbort()) m_defaultDevice->defineSwitch(&AbortSP); } else { m_defaultDevice->deleteProperty(FocusMotionSP.name); if (HasVariableSpeed()) { m_defaultDevice->deleteProperty(FocusSpeedNP.name); m_defaultDevice->deleteProperty(FocusTimerNP.name); } if (CanRelMove()) m_defaultDevice->deleteProperty(FocusRelPosNP.name); if (CanAbsMove()) m_defaultDevice->deleteProperty(FocusAbsPosNP.name); if (CanAbort()) m_defaultDevice->deleteProperty(AbortSP.name); } return true; }
void INDI::Focuser::processButton(const char * button_n, ISState state) { //ignore OFF if (state == ISS_OFF) return; FocusTimerN[0].value = lastTimerValue; IPState rc= IPS_IDLE; // Abort if (!strcmp(button_n, "Abort Focus")) { if (AbortFocuser()) { AbortSP.s = IPS_OK; DEBUG(INDI::Logger::DBG_SESSION, "Focuser aborted."); if (CanAbsMove() && FocusAbsPosNP.s != IPS_IDLE) { FocusAbsPosNP.s = IPS_IDLE; IDSetNumber(&FocusAbsPosNP, NULL); } if (CanRelMove() && FocusRelPosNP.s != IPS_IDLE) { FocusRelPosNP.s = IPS_IDLE; IDSetNumber(&FocusRelPosNP, NULL); } } else { AbortSP.s = IPS_ALERT; DEBUG(INDI::Logger::DBG_ERROR, "Aborting focuser failed."); } IDSetSwitch(&AbortSP, NULL); } // Focus In else if (!strcmp(button_n, "Focus In")) { if (FocusMotionS[FOCUS_INWARD].s != ISS_ON) { FocusMotionS[FOCUS_INWARD].s = ISS_ON; FocusMotionS[FOCUS_OUTWARD].s = ISS_OFF; IDSetSwitch(&FocusMotionSP, NULL); } if (HasVariableSpeed()) { rc = MoveFocuser(FOCUS_INWARD, FocusSpeedN[0].value, FocusTimerN[0].value); FocusTimerNP.s = rc; IDSetNumber(&FocusTimerNP,NULL); } else if (CanRelMove()) { rc=MoveRelFocuser(FOCUS_INWARD, FocusRelPosN[0].value); if (rc == IPS_OK) { FocusRelPosNP.s=IPS_OK; IDSetNumber(&FocusRelPosNP, "Focuser moved %d steps inward", (int) FocusRelPosN[0].value); IDSetNumber(&FocusAbsPosNP, NULL); } else if (rc == IPS_BUSY) { FocusRelPosNP.s=IPS_BUSY; IDSetNumber(&FocusAbsPosNP, "Focuser is moving %d steps inward...", (int) FocusRelPosN[0].value); } } } else if (!strcmp(button_n, "Focus Out")) { if (FocusMotionS[FOCUS_OUTWARD].s != ISS_ON) { FocusMotionS[FOCUS_INWARD].s = ISS_OFF; FocusMotionS[FOCUS_OUTWARD].s = ISS_ON; IDSetSwitch(&FocusMotionSP, NULL); } if (HasVariableSpeed()) { rc = MoveFocuser(FOCUS_OUTWARD, FocusSpeedN[0].value, FocusTimerN[0].value); FocusTimerNP.s = rc; IDSetNumber(&FocusTimerNP,NULL); } else if (CanRelMove()) { rc=MoveRelFocuser(FOCUS_OUTWARD, FocusRelPosN[0].value); if (rc == IPS_OK) { FocusRelPosNP.s=IPS_OK; IDSetNumber(&FocusRelPosNP, "Focuser moved %d steps outward", (int) FocusRelPosN[0].value); IDSetNumber(&FocusAbsPosNP, NULL); } else if (rc == IPS_BUSY) { FocusRelPosNP.s=IPS_BUSY; IDSetNumber(&FocusAbsPosNP, "Focuser is moving %d steps outward...", (int) FocusRelPosN[0].value); } } } }