Scusa avevo letto male...
#include <stdio.h>
#include <string.h>
#include "GPS.h"
#include "DES.h"
#include "Posizione.h"
#include "POSITION.h"
#define secondi_settimana 3600*24*7
#define file_password "password.bin"
#define file_position "position.bin"
class TA : public Observer
{
private:
//! \var stato
//! \brief stato del programma
bool stato;
//! \var positionCount
//! \brief conto delle posizioni
unsigned int positionCount;
//! \var direzione
//! \brief direzione attuale
double direzione;
//! \var velocita
//! \brief velocita' attuale
double velocita;
//! \var positions
//! \brief vettore delle posizioni
Posizione* positions;
//! \var positionFile
//! \brief riferimento al file di salvataggio
FILE* positionFile;
/*!
\fn checkPassword
\brief controlla la password
\param password utente
*/
bool checkPassword(char password[])
{
BYTE clear[8], coded[8], pswd[8];
int passwordLen = strlen(password);
FILE* passwordFile;
// correzione della password
if (passwordLen<=8)
{
for (int i=0; i<passwordLen; i++)
clear = password;
for (int i=passwordLen; i<8; i++)
clear = ' ';
}
else
{
for (int i=0; i<8; i++)
clear = password;
}
// codifica della password
DES_encrypt(clear, coded, clear);
// apertura file
passwordFile = fopen(file_password,"rb");
fread(pswd, 8, 1, passwordFile);
fclose(passwordFile);
// controllo della password
for (int i=0; i<8; i++)
if (coded != pswd)
return false;
return true;
}
/*!
\fn loadFromFile
\brief carica le posizioni da file
\return numero di posizioni caricate, -1 in caso di errore
*/
int loadFromFile(const char filename[])
{
POSITION pos;
positionFile = fopen(filename, "rb");
if (positionFile != NULL)
{
positionCount = 0;
while (!feof(positionFile))
{
if (fread(&pos,sizeof(POSITION),1,positionFile) == 1)
{
Data data(pos.giorno, pos.mese, pos.anno);
Tempo time(pos.ora, pos.min, pos.sec);
Latitudine lat(pos.glat, pos.plat, pos.slat, pos.olat);
Longitudine lon(pos.glon, pos.plon, pos.slon, pos.olon);
Posizione position(data, time, lat, lon);
positions[positionCount] = position;
positionCount++;
};
}
}
else
return-1;
fclose(positionFile);
return positionCount;
}
public:
/*!
\fn distanzaTotale
\brief calcola la distanza totale
\return distanza totale
*/
double distanzaTotale(void)
{
double distanza;
for (unsigned int i=1; i<positionCount; i++)
distanza += positions.distanza(positions[i-1]);
return distanza/1000.0;
}
/*!
\fn TA
\brief costruttore
*/
TA(void)
{
stato = false;
positionCount = 0;
direzione = 0.0;
velocita = 0.0;
positions = new Posizione[secondi_settimana];
if (loadFromFile(file_position) >= 0)
stato = true;
}
/*!
\fn ATC
\brief distruttore
*/
~TA(void)
{
delete positions;
}
/*!
\fn isViaggio
\brief controllo stato del viaggio
*/
bool isViaggio(void)
{
return stato;
}
/*!
\fn settaViaggio
\brief inizio del viaggio e memorizzazione della password
\param password password utente
*/
void settaViaggio(char password[])
{
BYTE clear[8], coded[8];
int passwordLen = strlen(password);
FILE *passwordFile;
if (stato) // viaggio in corso
return;
// elaborazione della password (aggiustamento della lunghezza se e' minore o maggiore di 8 caratteri)
if (passwordLen<=8)
{
for (int i=0; i<passwordLen; i++)
clear = password;
for (int i=passwordLen; i<8; i++)
clear[i] = ' ';
}
else
{
for (int i=0; i<8; i++)
clear[i] = password[i];
}
// codifica password
DES_encrypt(clear, coded, clear);
// scrittura password codificata su file
passwordFile = fopen(file_password,"wb");
fwrite(coded, 8, 1, passwordFile);
fclose(passwordFile);
// rimozione file delle posizioni
remove(file_position);
positionCount = 0;
stato = true;
}
/*!
\fn concludiViaggio
\brief fine del viaggio
\param password
*/
void concludiViaggio(char password[])
{
if (stato == false)
return;
if (checkPassword(password))
{
remove(file_position);
remove(file_password);
positionCount = 0;
stato = false;
}
}
/*!
\fn posizioneAttuale
\brief richiesta posizione attuale
\retval speed velocità (Km/h)
\retval direction direzione rispetto al Nord (gradi)
\return posizione attuale
\note viene restituita l'ultima posizione registrata, o una posizione nulla se il viaggio non è in corso
*/
Posizione posizioneAttuale(double* vel, double* dir)
{
Latitudine lat;
Longitudine lon;
Data date;
Tempo time;
Posizione pos(date, time, lat, lon);
*vel = velocita;
*dir = direzione;
if (positionCount == 0) // il viaggio non e' in corso
return pos;
return positions[positionCount-1];
}
/*!
\fn saveFile
\brief salvataggio su file testuale
\param filename denominazione/percorso del file
\param password password utente
*/
void saveFile(char filename[], char password[])
{
FILE* positionFile;
char string[128], tmp[8];
unsigned char crc;
if (stato == false)
return;
if (!checkPassword(password))
return;
positionFile = fopen(filename,"wt");
for (unsigned int i=0; i<positionCount; i++)
{
sprintf(string,"$GPRMC,%02i%02i%02i.000,A,%02i%02.4f,%c,%03i%02.4f,%c,0.00,000.00,%02i%02i%02i*",
positions[i].getTempo().getOra(), positions[i].getTempo().getMinuti(), positions[i].getTempo().getSecondi(),
positions[i].getLatitudine().getGradi(),(double)positions[i].getLatitudine().getPrimi()+(double)positions[i].getLatitudine().getSecondi()/60.0,(positions[i].getLatitudine().getOrientamento()>0 ? 'N' : 'S'),
positions[i].getLongitudine().getGradi(),(double)positions[i].getLongitudine().getPrimi()+(double)positions[i].getLongitudine().getSecondi()/60.0,(positions[i].getLongitudine().getOrientamento()>0 ? 'E' : 'O'),
positions[i].getData().getGiorno(), positions[i].getData().getMese(), positions[i].getData().getAnno()-2000);
crc = 0x00;
for (unsigned int i=1; string[i]!='*'; i++)
crc ^= string[i];
sprintf(tmp,"%02X",crc);
fprintf(positionFile,"%s%s\r\n",string,tmp);
}
fclose(positionFile);
}
/*!
\fn notify
\brief funzione ereditata dalla classe GPSobserver ed invocata dalla classe GPS per l'aggiornamento della posizione
\param position posizione attuale
\param direction direzione rispetto al Nord (gradi)
\param speed velocita' (Km/h)
*/
void notify(POSITION pos,double direction,double speed)
{
positionFile = fopen(file_position, "ab");
fwrite(&pos, sizeof(pos), 1, positionFile);
fclose(positionFile);
direzione = direction;
velocita = speed;
}
};