bool park_ieqpro(int fd) { char cmd[] = ":MP1#"; int errcode = 0; char errmsg[MAXRBUF]; char response[8]; int nbytes_read=0; int nbytes_written=0; DEBUGFDEVICE(ieqpro_device, INDI::Logger::DBG_DEBUG, "CMD (%s)", cmd); if (ieqpro_simulation) { set_sim_system_status(ST_SLEWING); strcpy(response, "1"); nbytes_read = strlen(response); } else { if ( (errcode = tty_write(fd, cmd, strlen(cmd), &nbytes_written)) != TTY_OK) { tty_error_msg(errcode, errmsg, MAXRBUF); DEBUGFDEVICE(ieqpro_device, INDI::Logger::DBG_ERROR, "%s", errmsg); return false; } if ( (errcode = tty_read(fd, response, 1, IEQPRO_TIMEOUT, &nbytes_read))) { tty_error_msg(errcode, errmsg, MAXRBUF); DEBUGFDEVICE(ieqpro_device, INDI::Logger::DBG_ERROR, "%s", errmsg); return false; } } if (nbytes_read > 0) { response[nbytes_read] = '\0'; DEBUGFDEVICE(ieqpro_device, INDI::Logger::DBG_DEBUG, "RES (%s)", response); if (!strcmp(response, "1")) { tcflush(fd, TCIFLUSH); return true; } else { DEBUGDEVICE(ieqpro_device, INDI::Logger::DBG_ERROR, "Error: Requested parking position is below horizon."); return false; } } DEBUGFDEVICE(ieqpro_device, INDI::Logger::DBG_ERROR, "Only received #%d bytes, expected 1.", nbytes_read); return false; }
bool IEQPro::Handshake() { if (isSimulation()) { set_sim_gps_status(GPS_DATA_OK); set_sim_system_status(ST_STOPPED); set_sim_track_rate(TR_SIDEREAL); set_sim_slew_rate(SR_3); set_sim_time_source(TS_GPS); set_sim_hemisphere(HEMI_NORTH); } if (check_ieqpro_connection(PortFD) == false) return false; return true; }
void IEQPro::mountSim () { static struct timeval ltv; struct timeval tv; double dt, da, dx; int nlocked; /* update elapsed time since last poll, don't presume exactly POLLMS */ gettimeofday (&tv, NULL); if (ltv.tv_sec == 0 && ltv.tv_usec == 0) ltv = tv; dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec)/1e6; ltv = tv; da = SLEWRATE*dt; /* Process per current state. We check the state of EQUATORIAL_COORDS and act acoordingly */ switch (TrackState) { case SCOPE_TRACKING: /* RA moves at sidereal, Dec stands still */ currentRA += (SIDRATE*dt/15.); break; case SCOPE_SLEWING: case SCOPE_PARKING: /* slewing - nail it when both within one pulse @ SLEWRATE */ nlocked = 0; dx = targetRA - currentRA; // Take shortest path if (fabs(dx) > 12) dx *= -1; if (fabs(dx) <= da) { currentRA = targetRA; nlocked++; } else if (dx > 0) currentRA += da/15.; else currentRA -= da/15.; if (currentRA < 0) currentRA += 24; else if (currentRA > 24) currentRA -= 24; dx = targetDEC - currentDEC; if (fabs(dx) <= da) { currentDEC = targetDEC; nlocked++; } else if (dx > 0) currentDEC += da; else currentDEC -= da; if (nlocked == 2) { if (TrackState == SCOPE_SLEWING) set_sim_system_status(ST_TRACKING_PEC_OFF); else set_sim_system_status(ST_PARKED); } break; default: break; } set_sim_ra(currentRA); set_sim_dec(currentDEC); }
void IEQPro::getStartupData() { DEBUG(INDI::Logger::DBG_DEBUG, "Getting firmware data..."); if (get_ieqpro_firmware(PortFD, &firmwareInfo)) { IUSaveText(&FirmwareT[0], firmwareInfo.Model.c_str()); IUSaveText(&FirmwareT[1], firmwareInfo.MainBoardFirmware.c_str()); IUSaveText(&FirmwareT[2], firmwareInfo.ControllerFirmware.c_str()); IUSaveText(&FirmwareT[3], firmwareInfo.RAFirmware.c_str()); IUSaveText(&FirmwareT[4], firmwareInfo.DEFirmware.c_str()); FirmwareTP.s = IPS_OK; IDSetText(&FirmwareTP, NULL); } DEBUG(INDI::Logger::DBG_DEBUG, "Getting guiding rate..."); double guideRate=0; if (get_ieqpro_guide_rate(PortFD, &guideRate)) { GuideRateN[0].value = guideRate; IDSetNumber(&GuideRateNP, NULL); } double HA = ln_get_apparent_sidereal_time(ln_get_julian_from_sys()); double DEC = (HemisphereS[HEMI_NORTH].s == ISS_ON) ? 90 : -90; if (InitPark()) { // If loading parking data is successful, we just set the default parking values. SetAxis1ParkDefault(HA); SetAxis2ParkDefault(DEC); } else { // Otherwise, we set all parking data to default in case no parking data is found. SetAxis1Park(HA); SetAxis2Park(DEC); SetAxis1ParkDefault(HA); SetAxis2ParkDefault(DEC); } double utc_offset; int yy, dd, mm, hh, minute, ss; if (get_ieqpro_utc_date_time(PortFD, &utc_offset, &yy, &mm, &dd, &hh, &minute, &ss)) { char isoDateTime[32]; char utcOffset[8]; snprintf(isoDateTime, 32, "%04d-%02d-%02dT%02d:%02d:%02d", yy, mm, dd, hh, minute, ss); snprintf(utcOffset, 8, "%4.2f", utc_offset); IUSaveText(IUFindText(&TimeTP, "UTC"), isoDateTime); IUSaveText(IUFindText(&TimeTP, "OFFSET"), utcOffset); DEBUGF(INDI::Logger::DBG_SESSION, "Mount UTC offset is %s. UTC time is %s", utcOffset, isoDateTime); IDSetText(&TimeTP, NULL); } // Get Longitude and Latitude from mount double longitude=0,latitude=0; if (get_ieqpro_latitude(PortFD, &latitude) && get_ieqpro_longitude(PortFD, &longitude)) { // Convert to INDI standard longitude (0 to 360 Eastward) if (longitude < 0) longitude += 360; LocationN[LOCATION_LATITUDE].value = latitude; LocationN[LOCATION_LONGITUDE].value= longitude; LocationNP.s = IPS_OK; IDSetNumber(&LocationNP, NULL); } if (isSimulation()) { if (isParked()) set_sim_system_status(ST_PARKED); else set_sim_system_status(ST_STOPPED); } }