Quand le télescope travaille la nuit, je ne garde pas toujours un oeil dessus. Je regarde de temps en temps pour m’assurer que tout va bien, mais le reste du temps je laisse tourner. Quand le telescope suit un programme, j’aimerais bien savoir en temps réel ou il en est. J’ai donc créé un programme pour qu’il tweete.
Le programme utilise 2 librairies: le SDK de développement ASCOM (pour accéder à l’état du telescope) et Tweeninvi (une librairie de connection à twitter tres simple).
Le programme consiste d’une simple boucle qui demande l’état du télescope, résout sa position à partir des coordonnées de pointage (en utilisant SIMBAD), puis récupère une photo de la zone pointée (en utilisant SDSS).
Pour récupérer l’état du telescope, j’ai créé un wrapper pour ASCOM (just au cas ou je change la librairie). L’objet peut retourner les coordonnées et l’etat (tracking, parked, slewing) du telescope.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ASCOM.DriverAccess;
using ASCOM.Utilities;
namespace ObsState.Model
{
public class ObsStateTelescope
{
private String TelescopeLocal = « EQMOD.Telescope »;
private String TelescopeEmulator = « EQMOD_SIM.Telescope »;
public String TelescopeId { get; private set; }
private Telescope _telescope = null;
public ObsStateTelescope(TelescopeType telescopeType)
{
if (telescopeType == TelescopeType.Local)
{
TelescopeId = TelescopeLocal;
}
else if (telescopeType == TelescopeType.Emulator)
{
TelescopeId = TelescopeEmulator;
}
else if (telescopeType == TelescopeType.Choose)
{
TelescopeId = Telescope.Choose(« ASCOM.Simulator.Telescope »);
}
else
{
throw new Exception(« Unknown telescope type » + telescopeType);
}
}
public void Connect()
{
if (String.IsNullOrEmpty(TelescopeId))
throw new Exception(« Telescope type not initialised properly »);
_telescope = new Telescope(TelescopeId)
{
Connected = true//, SiteElevation = 100, SiteLatitude = 45.892051, SiteLongitude = -0.223150, UTCDate = DateTime.UtcNow
};
}
public bool Connected()
{
if (_telescope == null)
throw new Exception(« Telescope type not initialised properly »);
return _telescope.Connected;
}
public void Disconnect()
{
if (_telescope == null)
throw new Exception(« Telescope type not initialised properly »);
if (!_telescope.Connected)
throw new Exception(« Telescope not connected »);
_telescope.Connected = false;
_telescope.Dispose();
}
public TelescopePosition Position()
{
if (_telescope == null)
throw new Exception(« Telescope type not initialised properly »);
if (!_telescope.Connected)
throw new Exception(« Telescope not connected »);
return new TelescopePosition()
{ SideralTime = _telescope.SiderealTime, Dec = _telescope.Declination, RA = _telescope.RightAscension };
}
public bool IsSlewing()
{
return _telescope.Slewing;
}
public bool IsTracking()
{
return _telescope.Tracking;
}
public bool IsParked()
{
return _telescope.AtPark;
}
}
}
La position du télescope est encapsulée dans un objet qui contient les données et quelques méthodes pratiques:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ObsState
{
public class TelescopePosition
{
public double SideralTime { get; internal set; }
public double RA { get; internal set; }
public double Dec { get; internal set; }
public bool Equals(TelescopePosition tp)
{
bool equal = true;
if (tp == null)
return false;
if ((Math.Abs(Math.Round(this.RA, 4)- Math.Round(tp.RA, 4))>0.01) || (Math.Abs(Math.Round(this.Dec, 4) – Math.Round(tp.Dec, 4)) > 0.01))
equal = false;
return equal;
}
public String RAToHMS()
{
String h = Math.Truncate(RA).ToString();
double t = RA – Math.Truncate(RA);
String m = Math.Truncate(t * 60).ToString();
t = t * 60 – Math.Truncate(t * 60);
String s = Math.Round(t * 60, 2).ToString();
return h + « h » + m + « m » + s;
}
public String DecToDMS()
{
String d = Math.Truncate(Dec).ToString();
double t = Dec – Math.Truncate(Dec);
String m = Math.Truncate(t * 60).ToString();
t = t * 60 – Math.Truncate(t * 60);
String s = Math.Round(t * 60, 2).ToString();
return d + « d » + m + « m » + s;
}
}
}
Note: il y a un probleme de linkage de DLL dans Tweetinvi qui fait que la DLL System.Net.Http.dll n’est pas copiée lors de la compilation. La solution est de l’ajouter a la main a la solution.