Add calcAP

This commit is contained in:
eddyem 2020-01-21 10:45:11 +03:00
parent 36a215be1f
commit f7ff00fcf1
13 changed files with 863 additions and 3 deletions

Binary file not shown.

39
USB_reset.c Normal file
View File

@ -0,0 +1,39 @@
// https://askubuntu.com/a/661/501233
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;
if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];
fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}
printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");
close(fd);
return 0;
}

14
calcAP/Makefile Normal file
View File

@ -0,0 +1,14 @@
LDFLAGS = -lm -lsla -lsofa_c
SRCS = $(wildcard *.c)
CC = gcc
DEFINES = -D_XOPEN_SOURCE=1111
CFLAGS = -Wall -Werror -Wextra $(DEFINES)
TARGS = $(SRCS:.c=)
all : $(TARGS)
slalib_and_sofa : slalib_and_sofa.c
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
slalib_sofa_nova : slalib_sofa_nova.c
$(CC) $(CFLAGS) $(LDFLAGS) -lnova -lerfa $< -o $@
clean:
/bin/rm -f *.o *~

1
calcAP/Readme Normal file
View File

@ -0,0 +1 @@
Comparison of apparent place calculation in different libraries

189
calcAP/slalib_and_sofa.c Normal file
View File

@ -0,0 +1,189 @@
/*
* slalib_and_sofa.c - calculate apparent place by slalib & libsofa
*
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#define _GNU_SOURCE 1111 // strcasecmp
#include "sofa.h"
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#define DBG(...) printf(__VA_ARGS__)
extern void sla_caldj(int*, int*, int*, double*, int*);
extern void sla_amp(double*, double*, double*, double*, double*, double*);
extern void sla_map(double*, double*, double*, double*, double*,double*, double*, double*, double*, double*);
void slacaldj(int y, int m, int d, double *djm, int *j){
int iy = y, im = m, id = d;
sla_caldj(&iy, &im, &id, djm, j);
}
void slaamp(double ra, double da, double date, double eq, double *rm, double *dm ){
double r = ra, d = da, mjd = date, equi = eq;
sla_amp(&r, &d, &mjd, &equi, rm, dm);
}
// rm,dm - mean RA,Dec (rad), pr,pd - RA,Dec changes per Julian year (dRA/dt, dDec/dt)
// px - parallax (arcsec), rv - radial speed (km/sec, +ve if receding)
// eq - epoch and equinox of star data (Julian)
// date - TDB for apparent place (JD-2400000.5)
void slamap(double rm, double dm, double pr, double pd,
double px, double rv, double eq, double date,
double *ra, double *da){
double r = rm, d = dm, p1 = pr, p2 = pd, ppx = px, prv = rv, equi = eq, dd = date;
sla_map(&r, &d, &p1, &p2, &ppx, &prv, &equi, &dd, ra, da);
}
void reprd(char* s, double ra, double dc){
char pm;
int i[4];
printf ( "%30s", s );
iauA2tf ( 7, ra, &pm, i );
printf ( " %2.2d %2.2d %2.2d.%7.7d", i[0],i[1],i[2],i[3] );
iauA2af ( 6, dc, &pm, i );
printf ( " %c%2.2d %2.2d %2.2d.%6.6d\n", pm, i[0],i[1],i[2],i[3] );
}
void radtodeg(double r){
int i[4]; char pm;
int rem = (int)(r / D2PI);
if(rem) r -= D2PI * rem;
if(r > DPI) r -= D2PI;
else if(r < -DPI) r += D2PI;
iauA2af (2, r, &pm, i);
printf("%c%02d %02d %02d.%2.d", pm, i[0],i[1],i[2],i[3]);
}
double getta(char *str){
int a,b,s = 1; double c;
if(3 != sscanf(str, "%d:%d:%lf", &a,&b,&c)) return -1;
if(a < 0){ s = -1; a = -a;}
c /= 3600.;
c += a + b/60.;
c *= s;
return c;
}
int main (int argc, char **argv){
double rc, dc;
if(argc == 3){
rc = getta(argv[1]) * DPI / 12;
dc = getta(argv[2]) * DD2R;
}else{
/* Star ICRS RA,Dec (radians). */
if ( iauTf2a ( ' ', 19, 50, 47.6, &rc ) ) return -1;
if ( iauAf2a ( '+', 8, 52, 12.3, &dc ) ) return -1;
}
reprd ( "ICRS, epoch J2000.0:", rc, dc );
struct tm tms;
time_t t = time(NULL);
gmtime_r(&t, &tms);
int y, m, d, err;
y = 1900 + tms.tm_year;
m = tms.tm_mon + 1;
d = tms.tm_mday;
double mjd, add = ((double)tms.tm_hour + (double)tms.tm_min/60.0 + tms.tm_sec/3600.0) / 24.;
DBG("Date: (d/m/y +frac) %d/%d/%d +%g\n", d, m, y, add);
slacaldj(y, m, d, &mjd, &err);
if(err){
fprintf(stderr, "slacaldj(): Wrong %s!", (err == 1) ? "year" :
(err == 2? "month" : "day"));
return -1;
}
mjd += add;
DBG("MJD by slalib: %g\n", mjd);
double utc1, utc2;
/* UTC date. */
if(iauDtf2d("UTC", y, m, d, tms.tm_hour, tms.tm_min, tms.tm_sec,
&utc1, &utc2)) return -1;
DBG("UTC by sofa: %g, %g\n", utc1 - 2400000.5, utc2);
double tai1, tai2, tt1, tt2;
/* TT date. */
if ( iauUtctai ( utc1, utc2, &tai1, &tai2 ) ) return -1;
if ( iauTaitt ( tai1, tai2, &tt1, &tt2 ) ) return -1;
DBG("date by sofa (utc/tt): %g/%g & %g/%g\n", tai1 - 2400000.5, tt1 - 2400000.5, tai2, tt2);
double pmra=0, pr=0, pd=0, px=0, rv=0;
/*
// Proper motion: RA/Dec derivatives, epoch J2000.0.
pmra = 536.23e-3 * DAS2R;
pr = atan2 ( pmra, cos(dc) );
pd = 385.29e-3 * DAS2R;
// Parallax (arcsec) and recession speed (km/s).
px = 0.19495;
rv = -26.1;*/
double ri, di, eo;
/* ICRS to CIRS (geocentric observer). */
iauAtci13 ( rc, dc, pr, pd, px, rv, tt1, tt2, &ri, &di, &eo );
reprd ( "catalog -> CIRS:", ri, di );
double rca, dca;
/* CIRS to ICRS (astrometric). */
iauAtic13 ( ri, di, tt1, tt2, &rca, &dca, &eo );
reprd ( "CIRS -> astrometric:", rca, dca );
/* ICRS (astrometric) to CIRS (geocentric observer). */
iauAtci13 ( rca, dca, 0.0, 0.0, 0.0, 0.0, tt1, tt2, &ri, &di, &eo );
reprd ( "astrometric -> CIRS:", ri, di );
double ra, da;
/* Apparent place. */
ra = iauAnp ( ri - eo );
da = di;
reprd ( "geocentric apparent:", ra, da );
slamap(rc, dc, pmra, pd, px, rv, 2000., mjd, &ra, &da);
reprd ( "geocentric apparent (sla):", ra, da );
double ra2000, decl2000;
slaamp(ra, da, mjd, 2000.0, &ra2000, &decl2000);
reprd ( "apparent -> astrometric (sla):", ra2000, decl2000);
double elong, phi, hm, phpa, tc, rh, wl, xp, yp, dut1;
/* Site longitude, latitude (radians) and height above the geoid (m). */
iauAf2a ( '+', 41, 26, 26.45, &elong );
iauAf2a ( '+', 43, 39, 12.69, &phi );
hm = 2070.0;
/* Ambient pressure (HPa), temperature (C) and rel. humidity (frac). */
phpa = 770.0; // milliBar or hectopascal
tc = -5.0;
rh = 0.7;
/* Effective wavelength (microns) */
wl = 0.55;
/* EOPs: polar motion in radians, UT1-UTC in seconds. */
xp = 0.1074 * DAS2R; //polarX
yp = 0.2538 * DAS2R;//polarY
dut1 = 0.13026 ; // DUT1
/* ICRS to observed. */
double aob, zob, hob, dob, rob;
if ( iauAtco13 ( rc, dc, pr,
pd, px, rv, utc1, utc2, dut1, elong, phi,
hm, xp, yp, phpa, tc, rh, wl, &aob, &zob,
&hob, &dob, &rob, &eo ) ) return -1;
reprd ( "ICRS -> observed:", rob, dob );
printf("A(bta)/Z: ");
radtodeg(aob);
printf("("); radtodeg(DPI-aob);
printf(")/"); radtodeg(zob);
printf("\n");
if( iauAtoc13 ( "R", rc, dc, utc1, utc2, dut1,
//if( iauAtoc13 ( "R", rob, dob, 2451545, 0, dut1,
elong, phi, hm, xp, yp, phpa, tc, rh, wl, &rca, &dca )) return -1;
reprd ( "observed -> astrometric:", rca, dca );
return 0;
}

318
calcAP/slalib_sofa_nova.c Normal file
View File

@ -0,0 +1,318 @@
/*
* slalib_and_sofa.c - calculate apparent place by slalib & libsofa
*
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#define _GNU_SOURCE 1111 // strcasecmp
/**
SOFA - NOVA - SLA
comparison
**/
#include <stdio.h>
#include <stdbool.h>
#include <sys/time.h>
#include <time.h>
#include <sofa.h>
#include <erfa.h> //- the same data as SOFA
#include <libnova/libnova.h>
#define DBG(...) printf(__VA_ARGS__)
extern void sla_caldj(int*, int*, int*, double*, int*);
extern void sla_amp(double*, double*, double*, double*, double*, double*);
extern void sla_map(double*, double*, double*, double*, double*,double*, double*, double*, double*, double*);
void slacaldj(int y, int m, int d, double *djm, int *j){
int iy = y, im = m, id = d;
sla_caldj(&iy, &im, &id, djm, j);
}
void slaamp(double ra, double da, double date, double eq, double *rm, double *dm ){
double r = ra, d = da, mjd = date, equi = eq;
sla_amp(&r, &d, &mjd, &equi, rm, dm);
}
// apparent->observed
extern void sla_aop(double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*);
/*
* Given:
* RAP d geocentric apparent right ascension
* DAP d geocentric apparent declination
* DATE d UTC date/time (Modified Julian Date, JD-2400000.5)
* DUT d delta UT: UT1-UTC (UTC seconds)
* ELONGM d mean longitude of the observer (radians, east +ve)
* PHIM d mean geodetic latitude of the observer (radians)
* HM d observer's height above sea level (metres)
* XP d polar motion x-coordinate (radians)
* YP d polar motion y-coordinate (radians)
* TDK d local ambient temperature (K; std=273.15D0)
* PMB d local atmospheric pressure (mb; std=1013.25D0)
* RH d local relative humidity (in the range 0D0-1D0)
* WL d effective wavelength (micron, e.g. 0.55D0)
* TLR d tropospheric lapse rate (K/metre, e.g. 0.0065D0)
*
* Returned:
* AOB d observed azimuth (radians: N=0,E=90)
* ZOB d observed zenith distance (radians)
* HOB d observed Hour Angle (radians)
* DOB d observed Declination (radians)
* ROB d observed Right Ascension (radians)
*/
void slaaop(double rap, double dap, double date, double dut, double elongm, double phim,
double hm, double xp, double yp, double tdk, double pmb, double rh, double wl,
double tlr,
double* aob, double* zob, double* hob, double* dob, double* rob){
double _rap=rap, _dap=dap, _date=date, _dut=dut, _elongm=elongm, _phim=phim,
_hm=hm, _xp=xp, _yp=yp, _tdk=tdk, _pmb=pmb, _rh=rh, _wl=wl, _tlr=tlr;
sla_aop(&_rap, &_dap, &_date, &_dut, &_elongm, &_phim, &_hm, &_xp, &_yp, &_tdk,
&_pmb, &_rh, &_wl, &_tlr, aob, zob, hob, dob, rob);
}
// rm,dm - mean RA,Dec (rad), pr,pd - RA,Dec changes per Julian year (dRA/dt, dDec/dt)
// px - parallax (arcsec), rv - radial speed (km/sec, +ve if receding)
// eq - epoch and equinox of star data (Julian)
// date - TDB for apparent place (JD-2400000.5)
void slamap(double rm, double dm, double pr, double pd,
double px, double rv, double eq, double date,
double *ra, double *da){
double r = rm, d = dm, p1 = pr, p2 = pd, ppx = px, prv = rv, equi = eq, dd = date;
sla_map(&r, &d, &p1, &p2, &ppx, &prv, &equi, &dd, ra, da);
}
void reprd(char* s, double ra, double dc){
char pm;
int i[4];
printf ( "%30s", s );
iauA2tf ( 7, ra, &pm, i );
printf ( " %2.2d %2.2d %2.2d.%7.7d", i[0],i[1],i[2],i[3] );
iauA2af ( 6, dc, &pm, i );
printf ( " %c%2.2d %2.2d %2.2d.%6.6d\n", pm, i[0],i[1],i[2],i[3] );
}
void radtodeg(double r){
int i[4]; char pm;
int rem = (int)(r / D2PI);
if(rem) r -= D2PI * rem;
if(r > DPI) r -= D2PI;
else if(r < -DPI) r += D2PI;
iauA2af (2, r, &pm, i);
printf("%c%02d %02d %02d.%2.d", pm, i[0],i[1],i[2],i[3]);
}
double getta(char *str){
int a,b,s = 1; double c;
if(3 != sscanf(str, "%d:%d:%lf", &a,&b,&c)) return -1;
if(a < 0){ s = -1; a = -a;}
c /= 3600.;
c += a + b/60.;
c *= s;
return c;
}
int main (int argc, char **argv){
double rc, dc;
if(argc == 3){
rc = getta(argv[1]) * DPI / 12;
dc = getta(argv[2]) * DD2R;
}else{
/* Star ICRS RA,Dec (radians). */
if ( iauTf2a ( ' ', 19, 50, 47.6, &rc ) ) return -1;
if ( iauAf2a ( '+', 8, 52, 12.3, &dc ) ) return -1;
}
reprd ( "ICRS (catalog), epoch J2000.0:", rc, dc );
struct tm tms;
struct timeval currentTime;
gettimeofday(&currentTime, NULL);
gmtime_r(&currentTime.tv_sec, &tms);
double tSeconds = tms.tm_sec + ((double)currentTime.tv_usec)/1e6;
int y, m, d, err;
y = 1900 + tms.tm_year;
m = tms.tm_mon + 1;
d = tms.tm_mday;
double mjd, add = ((double)tms.tm_hour + (double)tms.tm_min/60.0 + tSeconds/3600.0) / 24.;
DBG("Date: (d/m/y +frac) %d/%d/%d +%.8f\n", d, m, y, add);
slacaldj(y, m, d, &mjd, &err);
if(err){
fprintf(stderr, "slacaldj(): Wrong %s!", (err == 1) ? "year" :
(err == 2? "month" : "day"));
return -1;
}
mjd += add;
DBG("MJD by slalib: %.8f\n", mjd);
double utc1, utc2;
/* UTC date. */
if(iauDtf2d("UTC", y, m, d, tms.tm_hour, tms.tm_min, tSeconds,
&utc1, &utc2)) return -1;
DBG("UTC by sofa: %g, %.8f\n", utc1 - 2400000.5, utc2);
double tai1, tai2, tt1, tt2;
/* TT date. */
if ( iauUtctai ( utc1, utc2, &tai1, &tai2 ) ) return -1;
if ( iauTaitt ( tai1, tai2, &tt1, &tt2 ) ) return -1;
DBG("date by sofa (TAI/TT): %g/%g & %g/%g\n", tai1 - 2400000.5, tt1 - 2400000.5, tai2, tt2);
double pmra=0;
double pr = 0.0; // RA proper motion (radians/year; Note 2)
double pd = 0.0; // Dec proper motion (radians/year)
double px = 0.0; // parallax (arcsec)
double rv = 0.0; // radial velocity (km/s, positive if receding)
/*
// Proper motion: RA/Dec derivatives, epoch J2000.0.
pmra = 536.23e-3 * DAS2R;
pr = atan2 ( pmra, cos(dc) );
pd = 385.29e-3 * DAS2R;
// Parallax (arcsec) and recession speed (km/s).
px = 0.19495;
rv = -26.1;*/
double ri, di, eo;
/* ICRS to CIRS (geocentric observer). */
iauAtci13 ( rc, dc, pr, pd, px, rv, tt1, tt2, &ri, &di, &eo );
reprd ( "ICRS -> CIRS:", ri, di );
double rca, dca, eo1;
/* CIRS to ICRS (astrometric). */
iauAtic13 ( ri, di, tt1, tt2, &rca, &dca, &eo1);
reprd ( "CIRS -> ICRSc:", rca, dca );
/* ICRS to CIRS without PM
iauAtci13 ( rca, dca, 0.0, 0.0, 0.0, 0.0, tt1, tt2, &ri, &di, &eo );
reprd ( "ICRSc -> CIRS (without PM):", ri, di ); */
double ra, da;
/* Apparent place. */
ra = iauAnp ( ri - eo );
da = di;
reprd ( "geocentric apparent:", ra, da );
slamap(rc, dc, pmra, pd, px, rv, 2000., mjd, &ra, &da);
reprd ( "geocentric apparent (sla):", ra, da );
double ra2000, decl2000;
slaamp(ra, da, mjd, 2000.0, &ra2000, &decl2000);
reprd ( "apparent -> astrometric (sla):", ra2000, decl2000);
double elong, phi, hm, phpa, tc, rh, wl, xp, yp, dut1;
/* Site longitude, latitude (radians) and height above the geoid (m). */
iauAf2a ( '+', 41, 26, 26.45, &elong );
iauAf2a ( '+', 43, 39, 12.69, &phi );
hm = 2070.0;
/* Ambient pressure (HPa), temperature (C) and rel. humidity (frac). */
phpa = 780.0; tc = -5.0; rh = 0.7;
/* Effective wavelength (microns) */
wl = 0.55;
/* EOPs: polar motion in radians, UT1-UTC in seconds. */
xp = 0.1074 * DAS2R; //polarX
yp = 0.2538 * DAS2R;//polarY
dut1 = 0.13026 ; // DUT1
/* ICRS to observed. */
double aob, zob, hob, dob, rob;
if ( iauAtco13 ( rc, dc, pr,
pd, px, rv, utc1, utc2, dut1, elong, phi,
hm, xp, yp, phpa, tc, rh, wl, &aob, &zob,
&hob, &dob, &rob, &eo ) ) return -1;
reprd ( "ICRS -> observed:", rob, dob );
printf("A(bta)/Z: ");
radtodeg(aob);
printf("("); radtodeg(DPI-aob);
printf(")/"); radtodeg(zob);
printf("\n");
/*
* Given:
* RAP d geocentric apparent right ascension
* DAP d geocentric apparent declination
* DATE d UTC date/time (Modified Julian Date, JD-2400000.5)
* DUT d delta UT: UT1-UTC (UTC seconds)
* ELONGM d mean longitude of the observer (radians, east +ve)
* PHIM d mean geodetic latitude of the observer (radians)
* HM d observer's height above sea level (metres)
* XP d polar motion x-coordinate (radians)
* YP d polar motion y-coordinate (radians)
* TDK d local ambient temperature (K; std=273.15D0)
* PMB d local atmospheric pressure (mb; std=1013.25D0)
* RH d local relative humidity (in the range 0D0-1D0)
* WL d effective wavelength (micron, e.g. 0.55D0)
* TLR d tropospheric lapse rate (K/metre, e.g. 0.0065D0)
*
* Returned:
* AOB d observed azimuth (radians: N=0,E=90)
* ZOB d observed zenith distance (radians)
* HOB d observed Hour Angle (radians)
* DOB d observed Declination (radians)
* ROB d observed Right Ascension (radians)
*/
slaaop(ra, da, mjd, dut1, elong, phi, hm, xp, yp, tc+273., phpa, rh, wl, 0.0065,
&aob, &zob, &hob, &dob, &rob);
reprd ( "ICRS -> observed (sla):", rob, dob );
printf("A(bta)/Z: ");
radtodeg(aob);
printf("("); radtodeg(DPI-aob);
printf(")/"); radtodeg(zob);
printf("\n");
if( iauAtoc13 ( "R", rob, dob, utc1, utc2, dut1,
elong, phi, hm, xp, yp, phpa, tc, rh, wl, &rca, &dca )) return -1;
reprd ( "observed -> ICRS:", rca, dca );
////////////////////////////////////////////////////////////////////////////////////////////////
// libNOVA
////////////////////////////////////////////////////////////////////////////////////////////////
struct ln_equ_posn mean_position;
mean_position.ra = rc * ERFA_DR2D; // radians to degrees
mean_position.dec = dc * ERFA_DR2D;
/*
struct timeval tv;
struct timezone tz;
gettimeofday(&tv, &tz); // number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC) with microsecond precision
struct tm *utc_tm;
utc_tm = gmtime(&tv.tv_sec);
struct ln_date date;
date.seconds = utc_tm->tm_sec + ((double)tv.tv_usec / 1000000);
date.minutes = utc_tm->tm_min;
date.hours = utc_tm->tm_hour;
date.days = utc_tm->tm_mday;
date.months = utc_tm->tm_mon + 1;
date.years = utc_tm->tm_year + 1900;
double JNow = ln_get_julian_day(&date);*/
double JNow = ln_get_julian_from_sys();
struct ln_equ_posn propm={0,0}, apppl;//, equprec;
ln_get_apparent_posn(&mean_position, &propm, JNow, &apppl);
reprd ("geocentric apparent (NOVA):", apppl.ra*ERFA_DD2R, apppl.dec*ERFA_DD2R);
// Calculate the effects of precession on equatorial coordinates, between arbitary Jxxxx epochs.
/*
ln_get_equ_prec2(&mean_position, JD2000, JNow, &equprec);
reprd ("ln_get_equ_prec2 (NOVA):", equprec.ra*ERFA_DD2R, equprec.dec*ERFA_DD2R);
*/
/*
// ERFA
struct tm *ts;
ts = gmtime(&t);
int result = eraDtf2d ( "UTC", ts->tm_year+1900, ts->tm_mon+1, ts->tm_mday, ts->tm_hour, ts->tm_min, ts->tm_sec, &utc1, &utc2 );
if (result != 0) {
printf("eraDtf2d call failed\n");
return 1;
}
// Make TT julian date for Atci13 call
result = eraUtctai( utc1, utc2, &tai1, &tai2 );
if (result != 0) {
printf("eraUtctai call failed\n");
return 1;
}
eraTaitt( tai1, tai2, &tt1, &tt2 );
eraAtci13 ( rc, dc, pr, pd, px, rv, tt1, tt2, &ri, &di, &eo );
reprd ( "geocentric apparent (ERFA):", eraAnp(ri - eo), di);
*/
return 0;
}

View File

@ -34,6 +34,7 @@ if(DEFINED EBUG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W")
set(CMAKE_BUILD_TYPE DEBUG) set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_VERBOSE_MAKEFILE "ON")
add_definitions(-DEBUG) add_definitions(-DEBUG)
else() else()
set(CMAKE_BUILD_TYPE RELEASE) set(CMAKE_BUILD_TYPE RELEASE)

View File

@ -39,6 +39,7 @@ if(DEFINED EBUG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W")
set(CMAKE_BUILD_TYPE DEBUG) set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_VERBOSE_MAKEFILE "ON")
add_definitions(-DEBUG) add_definitions(-DEBUG)
else() else()
set(CMAKE_BUILD_TYPE RELEASE) set(CMAKE_BUILD_TYPE RELEASE)

42
cmakelists_/Makefile Normal file
View File

@ -0,0 +1,42 @@
# run `make DEF=...` to add extra defines
PROGRAM :=
LDFLAGS := -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--discard-all -Xlinker --warn-common
SRCS := $(wildcard *.c)
DEFINES := $(DEF) -D_XOPEN_SOURCE=1111
OBJDIR := mk
CFLAGS += -O2 -Wall -Werror -Wextra -Wno-trampolines -std=gnu99
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:%.c=%.o))
DEPS := $(OBJS:.o=.d)
CC = gcc
#CXX = g++
all : $(OBJDIR) $(PROGRAM)
$(PROGRAM) : $(OBJS)
@echo -e "\t\tLD $(PROGRAM)"
$(CC) $(LDFLAGS) $(OBJS) -o $(PROGRAM)
$(OBJDIR):
mkdir $(OBJDIR)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif
$(OBJDIR)/%.o: %.c
@echo -e "\t\tCC $<"
$(CC) -MD -c $(LDFLAGS) $(CFLAGS) $(DEFINES) -o $@ $<
clean:
@echo -e "\t\tCLEAN"
@rm -f $(OBJS) $(DEPS)
@rmdir $(OBJDIR) 2>/dev/null || true
xclean: clean
@rm -f $(PROGRAM)
gentags:
CFLAGS="$(CFLAGS) $(DEFINES)" geany -g $(PROGRAM).c.tags *[hc] 2>/dev/null
.PHONY: gentags clean xclean

View File

@ -0,0 +1,157 @@
# make debug adds -DEBUG -Werror
# make ADDEFS="additional defs"
BINARY = chrono
BOOTPORT ?= /dev/ttyUSB0
BOOTSPEED ?= 115200
# MCU FAMILY
FAMILY ?= F1
# MCU code
MCU ?= F103x8
# density (stm32f10x.h, lines 70-84)
DENSITY ?= MD
# change this linking script depending on particular MCU model,
LDSCRIPT ?= stm32F103xB.ld
DEFS = ${ADDEFS} -DVERSION=\"0.1.0\"
TARGET := RELEASE
# proxy GPS output over USART1
#DEFS += -DUSART1PROXY
INDEPENDENT_HEADERS=
FP_FLAGS ?= -msoft-float -mfloat-abi=soft
ASM_FLAGS ?= -mthumb -mcpu=cortex-m3 -mfix-cortex-m3-ldrd
ARCH_FLAGS = $(ASM_FLAGS) $(FP_FLAGS)
###############################################################################
# Executables
#PREFIX ?= arm-none-eabi
# gcc from arm web site
PREFIX ?= /opt/bin/arm-none-eabi
TOOLCHLIB ?= /opt/arm-none-eabi/lib
RM := rm -f
RMDIR := rmdir
CC := $(PREFIX)-gcc
# don't replace ld with gcc: the binary size would be much greater!!
LD := $(PREFIX)-ld
AR := $(PREFIX)-ar
AS := $(PREFIX)-as
SIZE := $(PREFIX)-size
OBJCOPY := $(PREFIX)-objcopy
OBJDUMP := $(PREFIX)-objdump
GDB := $(PREFIX)-gdb
STFLASH := $(shell which st-flash)
STBOOT := $(shell which stm32flash)
DFUUTIL := $(shell which dfu-util)
###############################################################################
# Source files
OBJDIR = mk
SRC := $(wildcard *.c)
OBJS := $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o))
STARTUP = $(OBJDIR)/startup.o
OBJS += $(STARTUP)
# dependencies: we need them to recompile files if their headers-dependencies changed
DEPS := $(OBJS:.o=.d)
INC_DIR ?= ../inc
INCLUDE := -I$(INC_DIR)/Fx -I$(INC_DIR)/cm
LIB_DIR := $(INC_DIR)/ld
###############################################################################
# C flags
CFLAGS += -O2 -g -D__thumb2__=1 -MD
CFLAGS += -Wall -Wextra -Wshadow
CFLAGS += -fno-common -ffunction-sections -fdata-sections -fno-stack-protector
CFLAGS += $(ARCH_FLAGS)
###############################################################################
# Linker flags
LDFLAGS += --static -nostartfiles -nostdlibs
LDFLAGS += -L$(LIB_DIR) -L$(TOOLCHLIB)
LDFLAGS += -T$(LDSCRIPT)
###############################################################################
# Used libraries
LDLIBS += -lc $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
DEFS += -DSTM32$(FAMILY) -DSTM32$(MCU) -DSTM32F10X_$(DENSITY)
ELF := $(OBJDIR)/$(BINARY).elf
LIST := $(OBJDIR)/$(BINARY).list
BIN := $(BINARY).bin
HEX := $(BINARY).hex
all: $(OBJDIR)/RELEASE
all: bin list size
release: all
debug: CFLAGS += -DEBUG -Werror
debug: TARGET := DEBUG
debug: $(OBJDIR)/DEBUG
debug: bin list size
$(OBJDIR)/DEBUG:
make clean
$(OBJDIR)/RELEASE:
make clean
elf: $(ELF)
bin: $(BIN)
hex: $(HEX)
list: $(LIST)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif
$(OBJDIR):
mkdir $(OBJDIR)
$(STARTUP): $(INC_DIR)/startup/vector.c
$(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $<
$(OBJDIR)/%.o: %.c
@echo " CC $<"
$(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $<
$(BIN): $(ELF)
@echo "TARGET: $(TARGET)"
@> $(OBJDIR)/$(TARGET)
@echo " OBJCOPY $(BIN)"
$(OBJCOPY) -Obinary $(ELF) $(BIN)
$(HEX): $(ELF)
@echo " OBJCOPY $(HEX)"
$(OBJCOPY) -Oihex $(ELF) $(HEX)
$(LIST): $(ELF)
@echo " OBJDUMP $(LIST)"
$(OBJDUMP) -S $(ELF) > $(LIST)
$(ELF): $(OBJDIR) $(OBJS) $(LDSCRIPT)
@echo " LD $(ELF)"
$(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(ELF)
size: $(ELF)
$(SIZE) $(ELF)
clean:
@echo " CLEAN"
@$(RM) $(HEX)
@$(RM) -rf $(OBJDIR) 2>/dev/null || true
flash: $(BIN)
@echo " FLASH $(BIN)"
$(STFLASH) --reset write $(BIN) 0x8000000
boot: $(BIN)
@echo " LOAD $(BIN) through bootloader"
$(STBOOT) -b$(BOOTSPEED) $(BOOTPORT) -w $(BIN)
dfuboot: $(BIN)
@echo " LOAD $(BIN) THROUGH DFU"
$(DFUUTIL) -a0 -D $(BIN) -s 0x08000000
.PHONY: clean flash boot DEBUG

34
cryptpass.c Normal file
View File

@ -0,0 +1,34 @@
#define _GNU_SOURCE
#include <crypt.h> // gcc -lcrypt
#include <errno.h>
#include <stdio.h>
int main(int argc, char **argv){
if(argc != 3){
printf("USAGE:\n\t%s <password> <salt>\n", argv[0]);
printf("Example:\n\t%s password \\$6\\$salt -> SHA512 with given salt (see man 3 crypt)\n", argv[0]);
return 1;
}
struct crypt_data x;
x.initialized = 0;
char *c = crypt_r(argv[1], argv[2], &x);
int e = errno;
if(!c){
switch(e){
case EINVAL:
fprintf(stderr, "Wrong SALT format!\n");
break;
case ENOSYS:
fprintf(stderr, "crypt() not realized!\n");
break;
case EPERM:
fprintf(stderr, "/proc/sys/crypto/fips_enabled prohibits this encryption method!\n");
default:
fprintf(stderr, "Unknown error!\n");
}
return e;
}
printf("Result of crypt_r():\n%s\n", c);
return 0;
}

View File

@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.9) cmake_minimum_required(VERSION 3.9)
project(myapp) project(examples)
add_executable(myapp helloworld.c) link_libraries(usefull_macros)
include_directories(../) include_directories(../)
target_link_libraries(myapp usefull_macros)
#target_link_libraries(hello -lm)
add_executable(hello helloworld.c)

63
usb_reset/reset.c Normal file
View File

@ -0,0 +1,63 @@
#include <stdio.h>
#include <string.h>
#include <usb.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/usbdevice_fs.h>
#include <errno.h>
#include <stdlib.h>
#define ERR(...) fprintf(stderr, __VA_ARGS__)
#define DBG(...)
int main(int argc, char **argv){
int pid, vid;
int fd, rc;
char buf[256], *d = NULL, *f = NULL, *eptr;
struct usb_bus *bus;
struct usb_device *dev;
int found = 0;
if(argc != 2 || !(d = strchr(argv[1], ':'))){
printf("Usage: %s vid:pid\n", argv[0]);
return 1;
}
vid = (int)strtol(argv[1], &eptr, 16);
pid = (int)strtol(d+1, &eptr, 16);
printf("pid: %x, vid: %x\n", pid, vid);
d = NULL;
usb_init();
usb_find_busses();
usb_find_devices();
for(bus = usb_busses; bus && !found; bus = bus->next) {
for(dev = bus->devices; dev && !found; dev = dev->next) {
if (dev->descriptor.idVendor == vid && dev->descriptor.idProduct == pid){
found = 1;
d = bus->dirname;
f = dev->filename;
}
}
}
if(!found){
// "õÓÔÒÏÊÓÔ×Ï ÎÅ ÎÁÊÄÅÎÏ"
ERR("Device not found");
return 1;
}
snprintf(buf, 255, "/dev/bus/usb/%s/%s", d,f);
fd = open(buf, O_WRONLY);
if (fd < 0) {
// "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ÕÓÔÒÏÊÓÔ×Á %s: %s"
ERR("Can't open device file %s: %s", buf, strerror(errno));
return 1;
}
printf("Resetting USB device %s", buf);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
// "îÅ ÍÏÇÕ ×ÙÚÙ×ÁÔØ ioctl"
perror("Error in ioctl");
return 1;
}
close(fd);
return 0;
}