Versión sin post-procesado del software del VmRideR

Dependencies:   mbed

FileManager/SistemaArchivos.cpp

Committer:
jjmedina
Date:
2015-06-15
Revision:
1:a3c9b672b8e2
Parent:
0:3d456b8ce449

File content as of revision 1:a3c9b672b8e2:

#include "SistemaArchivos.h"

extern ScreenManager SC;
extern MSCFileSystem msc;

extern DigitalOut myled;

SistemaArchivos::SistemaArchivos(){
    nViajes = 0;
}

void SistemaArchivos::addElement(char newElement[]){
    FILE* file = fopen("/local/RideList.vme","a");
    fprintf(file, "%s\n", newElement);
    fclose(file);
}

int SistemaArchivos::reloadRideNames(){
    // Se reinicia el número de viajes
    nViajes = 0;
    // Se abre el archivo de nombres de viajes
    FILE* file = fopen("/local/RideList.vme","r");
    if(file == NULL){
        return 1;
    }else{
        while(!feof(file)){ // Mientras no se haya llegado al fin de fichero
            //strcpy(names[nViajes], readTextLine(file));
            fgets(names[nViajes], NCARACTERES, file);
            // Se borra el último caracter de la cadena, el caracter '\n'
            deleteLastChar(names[nViajes]);
            //fscanf(file, "%s", names[nViajes]);
            nViajes++;
        }
        // La última cadena es '\n', esta no se contara como cadena
        nViajes--;
        fclose(file);
        return 0;
    }
}

int SistemaArchivos::deleteRide(char *fileName){   // Borra los archivos asociados a un viaje, y lo borra de la lista de viajes
    char file[64]; 

    // Primero se intenta borrar el archivo de la memoria flash
    strcpy(file, "/usb/");
    strcat(file, fileName);
    strcat(file, ".txt"); 
    
    if(remove(file) != 0){  // Si no se pudo borrar se devuelve un 1
        return 1;
    }else{      // Si se borró el archivo se borra también de la lista de viajes
        // Para ello primero se borra el viaje del array "names"
        // Procedimiento:
        // - Se busca el nombre en la lista
        // - Una vez encontrada su posición todos los elementos por debajo de este se suben una posición
        int pos = 0;      
        
        // - Se busca el nombre en la lista
        while(strcmp(names[pos], fileName)){
            pos++;
        }
        
        // En este momento la variable "pos" guarda la posición de memoria de el elemento a borrar
        // Se aumenta en uno este índice para subir de posición los elementos por debajo de este
        pos++;
        
        // - Una vez encontrada su posición todos los elementos por debajo de este se suben una posición
        for (int i = pos; i < nViajes; i++){ 
            strcpy(names[i-1], names[i]);
        }
        
        // El número de viajes es una unidad menor
        nViajes--;
        
        // Se guarda la nueva lista de viajes
        saveRideList();
        
        return 0;
    }
}

int SistemaArchivos::renameRide(char *fileName, char *newName){   // Cambia el nombre de los archivos asociados a un viaje, y de la lista de viajes
    char oldFile[64]; 
    char newFile[64];

    // Primero se intenta cambiar el nombre del archivo de la memoria flash
    strcpy(oldFile, "/usb/");
    strcat(oldFile, fileName);
    strcat(oldFile, ".txt"); 
    
    strcpy(newFile, "/usb/");
    strcat(newFile, newName);
    strcat(newFile, ".txt"); 
    
    if(file_rename(oldFile, newFile) != 0){  // Si no se pudo borrar se devuelve un 1
        return 1;
    }else{      // Si se cambió el nombre del archivo también se cambia el nombre en la lista de viajes
        // Procedimiento:
        // - Se busca el nombre antiguo en la lista
        // - Una vez encontrada su posición se cambia su nombre
        int pos = 0;      
        
        // - Se busca el nombre antiguo en la lista
        while(strcmp(names[pos], fileName)){
            pos++;
        }
        
        // - Una vez encontrada su posición se cambia su nombre
        strcpy(names[pos], newName);
        
        // Se guarda la nueva lista de viajes
        saveRideList();
        
        return 0;
    }
}

bool SistemaArchivos::alredyExist(char *name){
    bool value = false;
    for(int i = 0; i < nViajes; i++){
        if(!strcmp(names[i], name)){
            value = true;
        }
    }
    return value;
}

void SistemaArchivos::saveRideList(){
    // Se sobreescribe el archivo "RideList.vme" con la lista de el array nombres
    FILE* file = fopen("/local/RideList.vme","w");
    for(int i = 0; i < nViajes; i++){
        fprintf(file, "%s\n", names[i]);
    }   
    fclose(file);
}    

char* SistemaArchivos::getNameRide(int nameNumber){
    return names[nameNumber];    
}

int SistemaArchivos::getNrides(){
    return nViajes;
}

//***********************************************************
// file_rename: renames a file.
//    Kind of hoakey as it moves data instead of adjusting
//    the file name in the directory. 
//    Checks to insure the file was renamed.
//    Returns -1 = error; 0 = success
//***********************************************************
int SistemaArchivos::file_rename(const char *oldfile, const char *newfile) {
    int retval = 0;
    int ch;
 
    FILE *fpold = fopen(oldfile, "r");
    if(fpold == NULL) {
        retval = (-1);
    }else{ 
        FILE *fpnew = fopen(newfile, "w");
        
        while (1) {  
            ch = fgetc(fpold); 
            if (ch == EOF) break;
            fputc(ch, fpnew);  
        }
        
        fclose(fpnew);
        fclose(fpold);
     
        fpnew = fopen(newfile, "r");
        if(fpnew == NULL) {
            retval = (-1);
        } 
        else {
            remove(oldfile);
        }
        fclose(fpnew);
    }
    return (retval);
}

void SistemaArchivos::deleteLastChar(char *str){     // Borra el último caracter de una cadena
    str[strlen(str)-1] = '\0';
}