2022-07-31 21:22:11 +03:00

116 lines
3.9 KiB
C

/*
* This file is part of the SSII project.
* Copyright 2022 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <math.h>
#include <stdio.h>
#include <usefull_macros.h>
#include "emulator.h"
#include "motlog.h"
// HA/DEC of starting point, starting time
static double Eha0 = 0., Edec0 = 0., Et0 = 0.;
// monitor each 100ms motor's motion; stop when coords are the same for 3 times in a row
// inistat - returning of binary command (if len equal to sizeof SSstat)
void SSmotor_monitoring(SSstat *inistat){
DBG("Start monitoring");
//int32_t oldDec = 0, oldRA = 0; // old positions in encoder values (also for speed calculations)
SSstat prevstat = {0};
uint8_t start = 1, repeat = 0, errctr = 0;
int32_t oldRAm = 0, oldDm = 0;
double tlast = dtime();
if(inistat){ // get initial values
start = 0;
prevstat = *inistat;
oldRAm = prevstat.HAmot;
oldDm = prevstat.DECmot;
}
while(1){
if(start){ // didn't get initial values -> need to know first
if(!SSgetPartialstat(&prevstat)) continue;
start = 0;
tlast = dtime();
oldRAm = prevstat.HAmot;
oldDm = prevstat.DECmot;
}else{
if(!SSlog_motor_data(&prevstat, &tlast)){
WARNX("Hmmm... in %dth time", ++errctr);
if(++errctr > 10) break;
else continue;
}else errctr = 0;
}
if(prevstat.HAmot == oldRAm && prevstat.DECmot == oldDm){
if(++repeat > 2) break;
}else repeat = 0;
oldRAm = prevstat.HAmot;
oldDm = prevstat.DECmot;
}
DBG("End of monitoring");
}
/**
* @brief log_motor_data - get current config & put to log difference between values
* @param old (io) - old parameters value: as it was -> as it become
* @param told (io) - previous time (`dtime()` output) -> current time
* @return TRUE if all OK (if return FALSE, the `old` and `told` won't be changed!
*/
int SSlog_motor_data(SSstat *old, double *told){
SSstat s;
if(!old || !told) return FALSE;
if(!SSgetPartialstat(&s)) return FALSE;
double tnow = dtime(), tdif = tnow - *told;
mot_log(1, "%d\t%d\t%.1f\t%d\t%d\t%.1f", s.DECmot, s.DECenc, (s.DECmot - old->DECmot) / tdif,
s.HAmot, s.HAenc, (s.HAmot - old->HAmot) / tdif);
*old = s;
*told = tnow;
return TRUE;
}
// calculate next `target` position in current moment of time
// ha changed as 15''/s + 15*sin(t*2pi/600s);
// dec changed as 30*cos(t*2pi/600s)
static void emul_next_pos(double *ha, double *dec, double tnew){
if(!ha || !dec) return;
double s1, c1, t = tnew - Et0;
sincos(t*2.*M_PI/600., &s1, &c1);
*ha = Eha0 + ARCSEC2DEG(15) * (t + s1);
*dec = Edec0 + ARCSEC2DEG(30) * c1;
}
// init emulated variables and start target's searching
void SSstart_emulation(double ha_start, double dec_start){
Eha0 = ha_start;
Edec0 = dec_start;
Et0 = dtime();
DBG("Try to send short command");
SSscmd sc = {0};
// now calculate first starting position and try to catch it
double ha, dec;
emul_next_pos(&ha, &dec, Et0 + 1.);
mot_log(0, "goto ha=%d, dec=%d");
SSgoto(ha, dec);
SSwaitmoving();
// now we are near of the target: start to catch it
;
while(SScmds(&sc) != sizeof(SSstat)) WARNX("SSCMDshort bad answer!");
}