diff --git a/Trinamic/SHA_client/client b/Trinamic/SHA_client/client deleted file mode 100755 index 15d2fd6..0000000 Binary files a/Trinamic/SHA_client/client and /dev/null differ diff --git a/USB_reset.c b/USB_reset.c new file mode 100644 index 0000000..d8811ef --- /dev/null +++ b/USB_reset.c @@ -0,0 +1,39 @@ +// https://askubuntu.com/a/661/501233 +#include +#include +#include +#include +#include + +#include + + +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; +} diff --git a/calcAP/Makefile b/calcAP/Makefile new file mode 100644 index 0000000..4e9dbc7 --- /dev/null +++ b/calcAP/Makefile @@ -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 *~ diff --git a/calcAP/Readme b/calcAP/Readme new file mode 100644 index 0000000..e56c7f9 --- /dev/null +++ b/calcAP/Readme @@ -0,0 +1 @@ +Comparison of apparent place calculation in different libraries diff --git a/calcAP/slalib_and_sofa.c b/calcAP/slalib_and_sofa.c new file mode 100644 index 0000000..fd91486 --- /dev/null +++ b/calcAP/slalib_and_sofa.c @@ -0,0 +1,189 @@ +/* + * slalib_and_sofa.c - calculate apparent place by slalib & libsofa + * + * Copyright 2016 Edward V. Emelianov + * + * 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 +#include +#include + +#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; +} + + diff --git a/calcAP/slalib_sofa_nova.c b/calcAP/slalib_sofa_nova.c new file mode 100644 index 0000000..419d909 --- /dev/null +++ b/calcAP/slalib_sofa_nova.c @@ -0,0 +1,318 @@ +/* + * slalib_and_sofa.c - calculate apparent place by slalib & libsofa + * + * Copyright 2016 Edward V. Emelianov + * + * 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 +#include +#include +#include +#include +#include //- the same data as SOFA +#include + +#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(¤tTime, NULL); + gmtime_r(¤tTime.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; +} + diff --git a/cmakelists_/CMakeLists_regular_01.txt b/cmakelists_/CMakeLists_regular_01.txt index 4bc2389..bba3016 100644 --- a/cmakelists_/CMakeLists_regular_01.txt +++ b/cmakelists_/CMakeLists_regular_01.txt @@ -34,6 +34,7 @@ if(DEFINED EBUG) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_BUILD_TYPE DEBUG) + set(CMAKE_VERBOSE_MAKEFILE "ON") add_definitions(-DEBUG) else() set(CMAKE_BUILD_TYPE RELEASE) diff --git a/cmakelists_/CMakeLists_regular_02.txt b/cmakelists_/CMakeLists_regular_02.txt index 118a9ca..3878716 100644 --- a/cmakelists_/CMakeLists_regular_02.txt +++ b/cmakelists_/CMakeLists_regular_02.txt @@ -39,6 +39,7 @@ if(DEFINED EBUG) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_BUILD_TYPE DEBUG) + set(CMAKE_VERBOSE_MAKEFILE "ON") add_definitions(-DEBUG) else() set(CMAKE_BUILD_TYPE RELEASE) diff --git a/cmakelists_/Makefile b/cmakelists_/Makefile new file mode 100644 index 0000000..b173143 --- /dev/null +++ b/cmakelists_/Makefile @@ -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 diff --git a/cmakelists_/Makefile_dbg_rls b/cmakelists_/Makefile_dbg_rls new file mode 100644 index 0000000..59a3ca8 --- /dev/null +++ b/cmakelists_/Makefile_dbg_rls @@ -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 diff --git a/cryptpass.c b/cryptpass.c new file mode 100644 index 0000000..9fdf51d --- /dev/null +++ b/cryptpass.c @@ -0,0 +1,34 @@ +#define _GNU_SOURCE +#include // gcc -lcrypt +#include +#include + +int main(int argc, char **argv){ + if(argc != 3){ + printf("USAGE:\n\t%s \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; +} diff --git a/sharedlib_template/examples/CMakeLists.txt b/sharedlib_template/examples/CMakeLists.txt index 1925ddf..7c97960 100644 --- a/sharedlib_template/examples/CMakeLists.txt +++ b/sharedlib_template/examples/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.9) -project(myapp) -add_executable(myapp helloworld.c) +project(examples) +link_libraries(usefull_macros) include_directories(../) -target_link_libraries(myapp usefull_macros) +#target_link_libraries(hello -lm) +add_executable(hello helloworld.c) diff --git a/usb_reset/reset.c b/usb_reset/reset.c new file mode 100644 index 0000000..9ef80b9 --- /dev/null +++ b/usb_reset/reset.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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; +} +