bool TCFS::Handshake() { LOGF_DEBUG("%s %s",__FUNCTION__, me); if (isSimulation()) { LOG_INFO("TCF-S: Simulating connection."); currentPosition = simulated_position; return true; } char response[TCFS_MAX_CMD] = { 0 }; if(SetManualMode()) { dispatch_command(FWAKUP); read_tcfs(response); tcflush(PortFD, TCIOFLUSH); LOG_INFO("Successfully connected to TCF-S Focuser in Manual Mode."); // Enable temperature readout FocusTemperatureNP.s = IPS_OK; return true; } tcflush(PortFD, TCIOFLUSH); LOG_ERROR("Failed connection to TCF-S Focuser."); return false; }
void MainWidget::RunLocalMacros(RDMacro *rml) { QString str; QString logname; RDAirPlayConf::PanelType panel_type; int panel_number; QString sql; QPalette pal; bool ret=false; int fade; RDLogLine *logline=NULL; QString label; int mach=0; if(rml->role()!=RDMacro::Cmd) { return; } switch(rml->command()) { case RDMacro::LB: // Label if(rml->argQuantity()==0) { air_message_label->clear(); } else { for(int i=0;i<(rml->argQuantity()-1);i++) { str+=(rml->arg(i).toString()+" "); } str+=rml->arg(rml->argQuantity()-1).toString(); pal=air_message_label->palette(); pal.setColor(QPalette::Active,QColorGroup::Foreground,QColor(black)); pal.setColor(QPalette::Inactive,QColorGroup::Foreground, QColor(black)); air_message_label->setPalette(pal); air_message_label->setFont(MessageFont(str)); air_message_label->setText(str); } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::LC: // Color Label if(rml->argQuantity()<=1) { air_message_label->clear(); } else { QColor color(rml->arg(0).toString()); if(!color.isValid()) { color=QColor(black); } for(int i=1;i<(rml->argQuantity()-1);i++) { str+=(rml->arg(i).toString()+" "); } str+=rml->arg(rml->argQuantity()-1).toString(); pal=air_message_label->palette(); pal.setColor(QPalette::Active,QColorGroup::Foreground,color); pal.setColor(QPalette::Inactive,QColorGroup::Foreground,color); air_message_label->setPalette(pal); air_message_label->setFont(MessageFont(str)); air_message_label->setText(str); } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::LL: // Load Log if((rml->argQuantity()<1)||(rml->argQuantity()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()==1) { // Clear Log air_log[rml->arg(0).toInt()-1]->clear(); } else { // Load Log logname=rml->arg(1).toString(); if(!RDLog::exists(logname)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } air_log[rml->arg(0).toInt()-1]->setLogName(RDLog::tableName(logname)); air_log[rml->arg(0).toInt()-1]->load(); } if(rml->argQuantity()==3) { // Start Log if(rml->arg(2).toInt()<air_log[rml->arg(0).toInt()-1]->size()) { if(rml->arg(2).toInt()>=0) { // Unconditional start air_log[rml->arg(0).toInt()-1]->play(rml->arg(2).toInt(), RDLogLine::StartMacro); } if(rml->arg(2).toInt()==-2) { // Start if trans type allows // Find first non-running event bool found=false; for(int i=0;i<air_log[rml->arg(0).toInt()-1]->size();i++) { if((logline=air_log[rml->arg(0).toInt()-1]->logLine(i))!=NULL) { if(logline->status()==RDLogLine::Scheduled) { found=true; i=air_log[rml->arg(0).toInt()-1]->size(); } } } if(found) { switch(logline->transType()) { case RDLogLine::Play: case RDLogLine::Segue: air_log[rml->arg(0).toInt()-1]-> play(0,RDLogLine::StartMacro); break; case RDLogLine::Stop: case RDLogLine::NoTrans: break; } } } } } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::AL: // Append Log if(rml->argQuantity()!=2) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } logname=rml->arg(1).toString(); if(!RDLog::exists(logname)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } air_log[rml->arg(0).toInt()-1]->append(logname); break; case RDMacro::MN: // Make Next if(rml->argQuantity()!=2) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->size())) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } air_log[rml->arg(0).toInt()-1]->makeNext(rml->arg(1).toInt()); if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PB: // Push Button if(rml->argQuantity()!=1) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)|| (rml->arg(0).toInt()>BUTTON_TOTAL_BUTTONS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); return; } } air_button_list->startButton(rml->arg(0).toInt()-1); if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PC: // Label Button if(rml->argQuantity()<5) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<=0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<=0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } for(int i=3;i<(rml->argQuantity()-1);i++) { label+=(rml->arg(i).toString()+" "); } label=label.left(label.length()-1); air_panel->setText(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,label); air_panel->setColor(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1, rml->arg(rml->argQuantity()-1).toString()); if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PE: // Load Panel Button if(rml->argQuantity()!=4) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<=0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<=0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)|| (rml->arg(3).toUInt()>999999)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } air_panel->setButton(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toUInt()); if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PL: // Start if(rml->argQuantity()!=2) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->size())) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!air_log[rml->arg(0).toInt()-1]->running()) { if(!air_log[rml->arg(0).toInt()-1]->play(rml->arg(1).toInt(), RDLogLine::StartMacro)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PM: // Set Mode if((rml->argQuantity()!=1)&&(rml->argQuantity()!=2)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()==2) { mach=rml->arg(1).toInt(); if((mach<0)||(mach>RDAIRPLAY_LOG_QUANTITY)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } } switch((RDAirPlayConf::OpMode)rml->arg(0).toInt()) { case RDAirPlayConf::LiveAssist: SetLiveAssistMode(mach-1); break; case RDAirPlayConf::Manual: SetManualMode(mach-1); break; case RDAirPlayConf::Auto: SetAutoMode(mach-1); break; default: if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); return; } } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PN: // Start Next if((rml->argQuantity()<1)||(rml->argQuantity()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()>=2) { if((rml->arg(1).toInt()<1)||(rml->arg(1).toInt()>2)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()==3) { if((rml->arg(2).toInt()<0)||(rml->arg(2).toInt()>1)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } } } if(air_log[rml->arg(0).toInt()-1]->nextLine()>=0) { if(rml->argQuantity()==1) { air_log[rml->arg(0).toInt()-1]-> play(air_log[rml->arg(0).toInt()-1]->nextLine(), RDLogLine::StartMacro); } else { if(rml->argQuantity()==2) { air_log[rml->arg(0).toInt()-1]-> play(air_log[rml->arg(0).toInt()-1]->nextLine(), RDLogLine::StartMacro,rml->arg(1).toInt()-1); } else { air_log[rml->arg(0).toInt()-1]-> play(air_log[rml->arg(0).toInt()-1]->nextLine(), RDLogLine::StartMacro, rml->arg(1).toInt()-1,rml->arg(2).toInt()); } } } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PP: // Play Panel Button if(rml->argQuantity()<3 || rml->argQuantity()>5) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } switch(rml->argQuantity()) { case 3: air_panel->play(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,RDLogLine::StartMacro); break; case 4: air_panel->play(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,RDLogLine::StartMacro,rml->arg(3).toInt()); break; case 5: if(rml->arg(4).toInt()==1) { air_panel->play(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1, RDLogLine::StartMacro,rml->arg(3).toInt(),true); } else { air_panel->play(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,RDLogLine::StartMacro,rml->arg(3).toInt()); } break; default: break; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PS: // Stop if(rml->argQuantity()<1 || rml->argQuantity()>3) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<0)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } fade=0; if(rml->argQuantity()>1) { fade=rml->arg(1).toInt(); } switch(rml->arg(0).toInt()) { case 0: // Stop All Logs air_log[0]->stop(true,0,fade); air_log[1]->stop(true,0,fade); air_log[2]->stop(true,0,fade); break; case 1: case 2: case 3: if(rml->argQuantity()==3) { air_log[rml->arg(0).toInt()-1]->stop(false,rml->arg(2).toInt(),fade); } else { air_log[rml->arg(0).toInt()-1]->stop(true,0,fade); } break; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::MD: // Duck Machine if(rml->argQuantity()<3 || rml->argQuantity()>4) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<0)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } switch(rml->arg(0).toInt()) { case 0: // Duck All Logs air_log[0]->duckVolume(rml->arg(1).toInt()*100,rml->arg(2).toInt()); air_log[1]->duckVolume(rml->arg(1).toInt()*100,rml->arg(2).toInt()); air_log[2]->duckVolume(rml->arg(1).toInt()*100,rml->arg(2).toInt()); break; case 1: case 2: case 3: if(rml->argQuantity()==3) { air_log[rml->arg(0).toInt()-1]->duckVolume(rml->arg(1).toInt()*100,rml->arg(2).toInt()); } else { air_log[rml->arg(0).toInt()-1]->duckVolume(rml->arg(1).toInt()*100, rml->arg(2).toInt(),rml->arg(3).toInt()); } break; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PT: // Stop Panel Button if(rml->argQuantity()<3 || rml->argQuantity()>6) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } switch(rml->argQuantity()) { case 3: air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1); break; case 4: air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt()); break; case 5: if(rml->arg(4).toInt()==1) { air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt(),true); } else { air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt(),false); } break; case 6: if(rml->arg(4).toInt()==1) { air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt(),true, rml->arg(5).toInt()); } else { air_panel->stop(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt(),false, rml->arg(5).toInt()); } break; default: break; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PU: // Pause Panel Button if(rml->argQuantity()<3 || rml->argQuantity()>4) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()==3) { ret=air_panel->pause(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1); } else { ret=air_panel->pause(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,rml->arg(3).toInt()); } if(rml->echoRequested()) { rml->acknowledge(ret); rdripc->sendRml(rml); } break; case RDMacro::PD: // Duck Panel Button if(rml->argQuantity()<5 || rml->argQuantity()>6) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!GetPanel(rml->arg(0).toString(),&panel_type,&panel_number)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<0)|| (rml->arg(1).toInt()>AIR_PANEL_BUTTON_COLUMNS)|| (rml->arg(2).toInt()<0)|| (rml->arg(2).toInt()>AIR_PANEL_BUTTON_ROWS)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->argQuantity()==5) { air_panel->duckVolume(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,(rml->arg(3).toInt())*100,rml->arg(4).toInt()); } else { air_panel->duckVolume(panel_type,panel_number,rml->arg(2).toInt()-1, rml->arg(1).toInt()-1,(rml->arg(3).toInt())*100,rml->arg(4).toInt(), rml->arg(5).toInt()); } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PW: // Select Widget if(rml->argQuantity()!=1) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<0)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } switch(rml->arg(0).toInt()) { case 0: // Sound Panel panelButtonData(); break; case 1: case 2: case 3: fullLogButtonData(rml->arg(0).toInt()-1); break; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::PX: // Add Next if(rml->argQuantity()!=2) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)|| (rml->arg(1).toUInt()>999999)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(air_log[rml->arg(0).toInt()-1]->nextLine()>=0) { air_log[rml->arg(0).toInt()-1]-> insert(air_log[rml->arg(0).toInt()-1]->nextLine(), rml->arg(1).toUInt(),RDLogLine::Play); } else { air_log[rml->arg(0).toInt()-1]-> insert(air_log[rml->arg(0).toInt()-1]->size(), rml->arg(1).toUInt(),RDLogLine::Play); air_log[rml->arg(0).toInt()-1]-> makeNext(air_log[rml->arg(0).toInt()-1]->size()-1); } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::RL: // Refresh Log if(rml->argQuantity()!=1) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toInt()<1)||(rml->arg(0).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(!air_log[rml->arg(0).toInt()-1]->refresh()) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; case RDMacro::SN: // Set default Now & Next Cart if(rml->argQuantity()!=3) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(0).toString().lower()!="now")&& (rml->arg(0).toString().lower()!="next")) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if((rml->arg(1).toInt()<1)||(rml->arg(1).toInt()>3)) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->arg(2).toUInt()>999999) { if(rml->echoRequested()) { rml->acknowledge(false); rdripc->sendRml(rml); } return; } if(rml->arg(0).toString().lower()=="now") { air_log[rml->arg(1).toInt()-1]->setNowCart(rml->arg(2).toUInt()); } else { air_log[rml->arg(1).toInt()-1]->setNextCart(rml->arg(2).toUInt()); } if(rml->echoRequested()) { rml->acknowledge(true); rdripc->sendRml(rml); } break; default: break; } }
bool TCFS::ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) { //LOGF_DEBUG("%s %s",__FUNCTION__, me); if (dev != nullptr && strcmp(dev, getDeviceName()) == 0) { char response[TCFS_MAX_CMD] = { 0 }; if (!strcmp(FocusPowerSP.name, name)) { IUUpdateSwitch(&FocusPowerSP, states, names, n); bool sleep = false; ISwitch *sp = IUFindOnSwitch(&FocusPowerSP); // Sleep if (!strcmp(sp->name, "FOCUS_SLEEP")) { dispatch_command(FSLEEP); sleep = true; } // Wake Up else dispatch_command(FWAKUP); if (read_tcfs(response) == false) { IUResetSwitch(&FocusPowerSP); FocusPowerSP.s = IPS_ALERT; IDSetSwitch(&FocusPowerSP, "Error reading TCF-S reply."); return true; } if (sleep) { if (isSimulation()) strncpy(response, "ZZZ", TCFS_MAX_CMD); if (strcmp(response, "ZZZ") == 0) { FocusPowerSP.s = IPS_OK; IDSetSwitch(&FocusPowerSP, "Focuser is set into sleep mode."); FocusAbsPosNP.s = IPS_IDLE; IDSetNumber(&FocusAbsPosNP, nullptr); // if (FocusTemperatureNP) { FocusTemperatureNP.s = IPS_IDLE; IDSetNumber(&FocusTemperatureNP, nullptr); } return true; } else { FocusPowerSP.s = IPS_ALERT; IDSetSwitch(&FocusPowerSP, "Focuser sleep mode operation failed. Response: %s.", response); return true; } } else { if (isSimulation()) strncpy(response, "WAKE", TCFS_MAX_CMD); if (strcmp(response, "WAKE") == 0) { FocusPowerSP.s = IPS_OK; IDSetSwitch(&FocusPowerSP, "Focuser is awake."); FocusAbsPosNP.s = IPS_OK; IDSetNumber(&FocusAbsPosNP, nullptr); // if (FocusTemperatureNP) { FocusTemperatureNP.s = IPS_OK; IDSetNumber(&FocusTemperatureNP, nullptr); } return true; } else { FocusPowerSP.s = IPS_ALERT; IDSetSwitch(&FocusPowerSP, "Focuser wake up operation failed. Response: %s", response); return true; } } } // Do not process any command if focuser is asleep if (isConnected() && FocusPowerSP.sp[0].s == ISS_ON) { ISwitchVectorProperty *svp = getSwitch(name); if (svp) { svp->s = IPS_IDLE; LOG_WARN("Focuser is still in sleep mode. Wake up in order to issue commands."); IDSetSwitch(svp, nullptr); } return true; } if (!strcmp(FocusModeSP.name, name)) { IUUpdateSwitch(&FocusModeSP, states, names, n); FocusModeSP.s = IPS_OK; ISwitch *sp = IUFindOnSwitch(&FocusModeSP); if (!strcmp(sp->name, "Manual")) { if (!isSimulation() && !SetManualMode()) { IUResetSwitch(&FocusModeSP); FocusModeSP.s = IPS_ALERT; IDSetSwitch(&FocusModeSP, "Error switching to manual mode. No reply from TCF-S. Try again."); return true; } } else if (!strcmp(sp->name, "Auto A")) { dispatch_command(FAMODE); read_tcfs(response); if (!isSimulation() && strcmp(response, "A") != 0) { IUResetSwitch(&FocusModeSP); FocusModeSP.s = IPS_ALERT; IDSetSwitch(&FocusModeSP, "Error switching to Auto Mode A. No reply from TCF-S. Try again."); return true; } LOG_INFO("Entered Auto Mode A"); currentMode = MODE_A; } else { dispatch_command(FBMODE); read_tcfs(response); if (!isSimulation() && strcmp(response, "B") != 0) { IUResetSwitch(&FocusModeSP); FocusModeSP.s = IPS_ALERT; IDSetSwitch(&FocusModeSP, "Error switching to Auto Mode B. No reply from TCF-S. Try again."); return true; } LOG_INFO("Entered Auto Mode B"); currentMode = MODE_B; } IDSetSwitch(&FocusModeSP, nullptr); return true; } if (!strcmp(FocusGotoSP.name, name)) { if (FocusModeSP.sp[0].s != ISS_ON) { FocusGotoSP.s = IPS_IDLE; IDSetSwitch(&FocusGotoSP, nullptr); LOG_WARN("The focuser can only be moved in Manual mode."); return false; } IUUpdateSwitch(&FocusGotoSP, states, names, n); FocusGotoSP.s = IPS_BUSY; ISwitch *sp = IUFindOnSwitch(&FocusGotoSP); // Min if (!strcmp(sp->name, "FOCUS_MIN")) { targetTicks = currentPosition; MoveRelFocuser(FOCUS_INWARD, currentPosition); IDSetSwitch(&FocusGotoSP, "Moving focuser to minimum position..."); } // Center else if (!strcmp(sp->name, "FOCUS_CENTER")) { dispatch_command(FCENTR); FocusAbsPosNP.s = FocusRelPosNP.s = IPS_BUSY; IDSetNumber(&FocusAbsPosNP, nullptr); IDSetNumber(&FocusRelPosNP, nullptr); IDSetSwitch(&FocusGotoSP, "Moving focuser to center position %d...", isTCFS3 ? 5000 : 3500); return true; } // Max else if (!strcmp(sp->name, "FOCUS_MAX")) { unsigned int delta = 0; delta = FocusAbsPosN[0].max - currentPosition; MoveRelFocuser(FOCUS_OUTWARD, delta); IDSetSwitch(&FocusGotoSP, "Moving focuser to maximum position %g...", FocusAbsPosN[0].max); } // Home else if (!strcmp(sp->name, "FOCUS_HOME")) { dispatch_command(FHOME); read_tcfs(response); if (isSimulation()) strncpy(response, "DONE", TCFS_MAX_CMD); if (strcmp(response, "DONE") == 0) { IUResetSwitch(&FocusGotoSP); FocusGotoSP.s = IPS_OK; IDSetSwitch(&FocusGotoSP, "Moving focuser to new calculated position based on temperature..."); return true; } else { IUResetSwitch(&FocusGotoSP); FocusGotoSP.s = IPS_ALERT; IDSetSwitch(&FocusGotoSP, "Failed to move focuser to home position!"); return true; } } IDSetSwitch(&FocusGotoSP, nullptr); return true; } // handle quiet mode on/off if (!strcmp(FocusTelemetrySP.name, name)) { IUUpdateSwitch(&FocusTelemetrySP, states, names, n); bool quiet = false; ISwitch *sp = IUFindOnSwitch(&FocusTelemetrySP); // Telemetry off if (!strcmp(sp->name, "FOCUS_TELEMETRY_OFF")) { dispatch_command(FQUIET, 1); quiet = true; } // Telemetry On else dispatch_command(FQUIET, 0); if (read_tcfs(response) == false) { IUResetSwitch(&FocusTelemetrySP); FocusTelemetrySP.s = IPS_ALERT; IDSetSwitch(&FocusTelemetrySP, "Error reading TCF-S reply."); return true; } if (isSimulation()) strncpy(response, "DONE", TCFS_MAX_CMD); if (strcmp(response, "DONE") == 0) { FocusTelemetrySP.s = IPS_OK; IDSetSwitch(&FocusTelemetrySP, quiet ? "Focuser Telemetry is off." : "Focuser Telemetry is on."); // if (FocusTemperatureNP) { FocusTemperatureNP.s = quiet?IPS_IDLE:IPS_OK; IDSetNumber(&FocusTemperatureNP, nullptr); } return true; } else { FocusTelemetrySP.s = IPS_ALERT; IDSetSwitch(&FocusTelemetrySP, "Focuser telemetry mode failed. Response: %s.", response); return true; } } } return INDI::Focuser::ISNewSwitch(dev, name, states, names, n); }