Newsgroup: it.comp.lang.c++
Titolo: [newbie] aiuto modifica programma

Ciao a tutti,
Ho la necessità di modificare in tempo breve un programma in C++ per 
GNU/Linux, ma al momento le mie conoscenze di C++ sono a un livello ridicolo 
(OK, forse mi illudo). 
Per inquadrare le mie competenze: anni fa, all'università, ho studiato 
Fortran, conosco vagamente il C e negli ultimi tempi uso sempre di più 
python, per soluzioni di piccoli problemi. 
Vengo a chiedere qui perché magari sapete darmi qualche dritta per risolvere 
rapidamente il mio problema, mentre cerco di imparare meglio il C++.
Il problema è questo: ho un programma, qastrocam [1] che usa la libreria 
CFITSIO [2] per acquisire immagini da una webcam collegata a un telescopio e 
salvarle in formato FITS. 
Le immagini andranno analizzate da un altro programma che, insieme alla data 
e l'ora della ripresa dall'header delle immagini, mi permetterà di fare un 
grafico (curva di luce) di un fenomeno. 
Il problema è che qastrocam non aggiunge all'header le informazioni sulla 
data e ora della ripresa. Vorrei modificare il programma per poter 
aggiungere queste informazioni alle immagini.
Con l'aiuto di find e grep credo di aver identificato, tra i file sorgente, 
quello che si occupa della creazione dei file FITS:
./qastrolib/FitsImage.cpp
Adesso me sto provando a leggerlo, con l'aiuto di un po' di documentazione  
sul C++ trovata in rete e della documentazione della libreria CFITSIO, ma 
ovviamente, non è che ci capisca un gran ché, tanto più che l'autore del 
programma incriminato non ha aggiunto commenti utili al listato :-( 
Come procedere adesso? Avete dritte utili, o almeno mi sapete suggerire dove 
guardare e come muovermi?
grazie a tutti
gerlos
[1] 
http://3demi.net/astro/qastrocam/doc/
[2] 
http://heasarc.gsfc.nasa.gov/docs/software/fitsio/fitsio.html
-- 
"Solo lo scienziato è vero poeta: ci dà la luna, ci promette le stelle,
 ci farà un nuovo universo se sarà il caso."
                 < 
http://gerlos.altervista.org
 >
 gerlos  +- - - >  gnu/linux registred user #311588

Ciao,
guardando in velocità, pagina 32:
http://fits.gsfc.nasa.gov/standard30/htmlfiles/fits_standard30index.html
DATE Keyword: The value field shall contain a character string giving
the date onwhich the HDU was created, in the form YYYY-MM-DD, or the
date and time when theHDU was created, in the form YYYY-MM-DDThh:mm:ss
[.sss. . . ], where YYYY shall be thefour-digit calendar year number,
MM the two-digit month number with January given by01 and December by
12, and DD the two-digit day of the month. When both date andtime are
given, the literal T shall separate the date and time, hh shall be the
two-digithour in the day, mm the two-digit number of minutes after the
hour, and ss[.sss. . . ]the number of seconds (two digits followed by
an optional fraction) after the minute.
Tutti i tempi devono essere in UTC.
In ctime hai le funzioni per manipolare le date.
Vedi: 
http://www.cplusplus.com/reference/clibrary/ctime/
e in particolare: 
http://www.cplusplus.com/reference/clibrary/ctime/tm/
Nei cinque minuti che ho speso a leggere la documentazione, devi
creare un oggetto FITS che carichi il file esistente su disco:
http://heasarc.gsfc.nasa.gov/docs/software/fitsio/CCfits/html/classCCfits_1_1FITS.html#913bc6d48a4ff69013e49e1ae4fbb696
Non è chiarissimo, ma forse sei fortunato e col parametro primaryKeys
del costruttore puoi aggiungere la chiave di DATE formattata come da
specifiche.
Devi però controllare perché non ho capito se queste primaryKeys sono
quelle dell'header o meno. Prova in caso a stampare a terminale quelle
già esistenti nel file che ti carichi, così ti rendi conto.
Quando hai fatto si tratta solo di salvare il file usando l'originale
come source:
http://heasarc.gsfc.nasa.gov/docs/software/fitsio/CCfits/html/classCCfits_1_1FITS.html#cb344d192a9cce91ef4fa70d983af305
Buon lavoro.
Matteo


 specifiche.
Uhmmm... ho provato a cercare, con 
find ./ -exec grep -H 'CCfits' '{}' ';'
Ma non trovo nessuna occorrenza nei sorgenti. Mi viene il dubbio se l'autore 
abbia realmente usato cfitsio o altro codice... 
Guardando l'output sul terminale nel momento in cui salvo una immagine, ho 
identificato dei comandi fprintf che scrivono sullo standard output. 
Fondamentalmente, mi sembra di capire (da quel poco che capisco di C++) che 
queste funzioni (perdonatemi il linguaggio forse scorretto) vengano chiamate 
in ./qastrolib/FitsImage.cpp e siano definite in ./qastrolib/FitsImage.hpp.
Forse che la parte da modificare è proprio questa? Boh
grazie della collaborazione
gerlos


 usare ctime! Ci sto dando un'occhiata.
La stringa di timestamp che mi serve generare è del tipo:
17:56:32.123
Da alcuni articoli letti in rete mi sembra di aver capito che dovrei usare 
gettimeofday() che mi dà la granularità necessaria. Però non ho capito 
*come* fare. In particolare, non ho ancor capito come fare a ottenere data, 
ora, minuti e secondi umanamente leggibili da gettimeofday().
Questo è quel che ho fatto finora:
struct timeval mytime;
gettimeofday(&mytime,NULL);
// questo stampa i secondi dal01/01/1970
printf("%d", mytime.tv_sec );
// questo stampa i millisecondi del secondo attuale
printf("%d", mytime.tv_usec / 1000);
Come faccio a convertire l'intero mytime.tv_sec in una data utilizzabile?
grazie a chiunque saprà illuminarmi
ciao


 ora, minuti e secondi umanamente leggibili da gettimeofday().
Te l'ha suggerito tchernobog:
http://www.cplusplus.com/reference/clibrary/ctime/
Ad es.:
struct timeval mytime;
gettimeofday(&mytime,NULL);
printf("%s\n", ctime(&(mytime.tv_sec)));
Da li' dovresti riuscire a estrarre il pezzo che ti interessa.
Se no, mi viene in mente una mezza porcheria, ma divertente: se ben
ricordo, lo unix time non ha concetto di split second eccetera.
Quindi, facendo
mytime.tv_sec % (24 * 3600)
ottieni il numero di secondi di oggi, a meno dell'ora legale! A quel
punto, convertirlo nel formato che ti serve e' facile, e'
semplicemente un numero tra 0 e 86399 da cui estrarre ora, minuti e
secondi.
Pleg
PS: la granularita' di gettimeofday dipende dal sistema operativo, ma
sulla tua Debian :) dovrebbe essere del millisecondo.
PPS: curiosita': ma a cosa serve quella precisione? Sei sicuro che il
tuo pc sia corretto al millisecondo? O ti interessa solo il tempo
relativo tra le immagini? Approp, sei sicuro di star prendendo il
timestamp corretto? Non so nulla di come funziona quello che fai, ma
butto li': metti che stai prendendo il timestamp di quando hai finito
l'elaborazione, e che il tempo di elaborazione sia variabile
(interrupt, preemption del SO...): il numero che hai in ms non sarebbe
per nulla affidabile.

 per nulla affidabile.
Che sei curioso!!! Il fatto è questo: sto facendo riprese usando una webcam 
al fuoco di un telescopio, per lo studio di alcune eclissi tra satelliti di 
Giove. In prima battuta, devo riprendere delle immagini ogni tot, e 
successivamente analizzarle, per ottenere la luminosità di questo o quel 
satellite in un certo istante (costruisco la curva di luce del fenomeno). 
Perché le osservazioni siano significative mi serve che ogni immagine sia 
collocata nel tempo con una precisione del decimo di secondo. 
Mi aspetto una latenza nella ripresa, perciò prima di cominciare riprendo 
con al webcam l'output del comando ntptime, che dà l'ora con la precisione 
del millisecondo. Assumendo che il tempo necessario al sistema per scrivere 
sul terminale l'output di ntptime sia almeno un ordine di grandezza minore 
della latenza della webcam, confronto l'ora nell'immagine con l'ora 
nell'intestazione dell'immagine, inserita dal programma di acquisizione che 
sto pasticciando. Avere una o due cifre in più (ma non di più!) mi serve 
*anche* per valutare questa latenza in modo ragionevole.
Alla fine si tratta di una webcam che usa USB 1 che fornisce immagini da 
640x480 px a 10 fps, collegata a un computer recente, non credo che una roba 
del genere possa impegnare più di tanto la CPU... non arrivo neanche a 
generare 9 MB/s di dati su un disco SATA dedicato che può sostenere flussi 
di dati in scrittura ben più alti... non sarei così pessimista! :-)
Ma mi hai messo una pulce nell'orecchio: se ci riesco (in tutto questo, sono 
ancora un novellino di C++), una prova la vorrei fare, a prendere un 
timestamp *prima* di salvare l'immagine e uno *dopo*, e vedere se questo 
intervallo di tempo è costante e stabile o no.
Grazie per gli stimoli!


 intervallo di tempo è costante e stabile o no.
Come dicevo, non saprei stimare la precisione che ottieni, penso solo
che il sistema operativo mandera' in esecuzione i tuoi processi in
modo non controllabile, quindi magari hai buchi di decine (o
centinaia) di millisecondi tra eventi che ti piacerebbe fossero
continui (fosse anche solo la scrittura del timestamp!).
Per non saper ne' leggere ne' scrivere, mi aspetterei, tra i timestamp
prima e dopo, tempi variabili nell'ordine delle decine di
millisecondi, casuali. Magari di piu' durante le scritture a disco
(quando la CPU si mette a settare il DMA).
Cmq, se fai la prova fammi sapere, sono curioso!
E ora chiudo il terrificante OT :)
Pleg