teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
funcoesSDCard.cpp
- Committer:
- brunofgc
- Date:
- 2017-08-09
- Revision:
- 9:cf406384efd9
- Parent:
- 7:ae9c47f62946
- Child:
- 10:263c093f8977
File content as of revision 9:cf406384efd9:
#include "funcoesSDCard.h" #include "serialPC.h" arquivoSD sdCard::envio; arquivoSD sdCard::armazenamento; arquivoSD sdCard::config; arquivoSD sdCard::devices; arquivoSD sdCard::status; arquivoSD sdCard::tempFile; bool sdCard::arquivosAbertos=false; char sdCard::nomeArquivoEmRecebimento[30]; bool sdCard::deleteSentFiles; SDFileSystem sd(p11, p12, p13, p14, "sd"); bool sdCard::abreArquivo(arquivoSD *arquivo,char *mode){ //Struct do arquivo e seu nome /*uint32_t timeOut=30000; while(timeOut && arquivo->aberto){ timeOut--; osDelay(1); } if(arquivo->aberto){return false;} */ if(!sdCard::arquivoAberto(15000)){return false;} //pc.printf("Abrindo um arquivo de nome <%s> em modo <%s>.\r\n",arquivo->nome,mode); //pc.printf("Abrindo arquivo <%s>.\n",arquivo->nome); if((arquivo->fp = fopen(arquivo->nome,mode))!=NULL){ arquivo->aberto = true; return true; }else{ return false; } } uint16_t sdCard::calcCheckSum16BITFile(char *nome){ FILE *fp; char c; uint16_t sum = 0; fp = fopen (nome,"r"); if(fp != NULL){ do{ c = fgetc(fp); if(!feof(fp)){sum+=c;} }while(!feof(fp)); fclose(fp); } return sum; } /*bool sdCard::insereDadosArquivoPeloNome(char *nome, char *dados,uint16_t tam){ FILE *fp; fp = fopen(nome,"a"); uint16_t i; if(fp!=NULL){ sdCard::arquivoAberto = true; for(i=0;i<tam;i++){ fprintf(fp,"%c",dados[i]); fflush(fp); } fclose(fp); sdCard::arquivoAberto = false; }else{ return false; } return true; }*/ bool sdCard::insereDadosArquivo(arquivoSD *arquivo, char* data,uint16_t tam){ //Struct do arquivo, dados a inserir e tamanho deles uint16_t i; if(!sdCard::abreArquivo(arquivo,"a")){ sdCard::fechaArquivo(arquivo); return false; } for(i=0;i<tam;i++){ //fprintf(arquivo->fp,"%c",data[i]); fputc(data[i],arquivo->fp); fflush(arquivo->fp); } sdCard::fechaArquivo(arquivo); return true; } bool sdCard::fechaArquivo(arquivoSD* arquivo){ //Struct do arquivo fclose(arquivo->fp); arquivo->aberto = false; return true; } bool sdCard::excluiArquivo(arquivoSD *arquivo){ if(arquivo->aberto){ if(!sdCard::fechaArquivo(arquivo)){return false;} } if(!remove(arquivo->nome)){return false;} return true; } bool sdCard::exibeArquivo(arquivoSD *arquivo){ char c; if(!sdCard::arquivoAberto(2000)){return false;} if(!sdCard::abreArquivo(arquivo,"r")){ return false; } pc.printf("\n\nInicio do arquivo %s.\n\n",arquivo->nome); do{ c = fgetc(arquivo->fp); if(!feof(arquivo->fp)){pc.printf("%c",c);} }while(!feof(arquivo->fp)); pc.printf("\n\nFim do arquivo %s.\n",arquivo->nome); sdCard::fechaArquivo(arquivo); return true; } int sdCard::init(){ //Inicializando SDCard strcpy(sdCard::envio.nome,"/sd/RAD/envio.txt"); strcpy(sdCard::armazenamento.nome,"/sd/RAD/armazenamento.txt"); strcpy(sdCard::config.nome,"/sd/RAD/config.bin"); strcpy(sdCard::devices.nome,"/sd/RAD/devices.cfg"); strcpy(sdCard::status.nome,"/sd/RAD/status.txt"); strcpy(sdCard::tempFile.nome,"/sd/RAD/tempFile.bin"); /*if(!sdCard::abreArquivo(&sdCard::config,"r")){ //Não foi encontrado o arquivo config.bin, então vou criar o diretório pc.printf("Nao foi encontrado o arquivo config.bin .\n"); //Criando o diretorio pc.printf("Criando diretorio e arquivo config.bin .\n"); mkdir("/sd/RAD", 0777); if(sdCard::abreArquivo(&sdCard::config,"w")){ //Fazer o arquivo de configuração aqui! pc.printf("Criado arquivo config.bin .\n"); fprintf(sdCard::config.fp,"SSID:DROME\r\nPASSWORD:VITAE\r\nPORT:80"); } } //Fechando arquivo de configuração; fechaArquivo(&sdCard::config); */ if(!sdCard::abreArquivo(&sdCard::devices,"r")){ pc.printf("Remota nao parametrizada!!!\n"); }else{ fechaArquivo(&sdCard::devices); } return 1; } int sdCard::preparaEnvio(void){ //Verifico se existe arquivo pendente de envio. if(!sdCard::arquivoAberto(5000)){return 2;} if(abreArquivo(&sdCard::envio,"r")){ pc.printf("Tem um arquivo pendente de envio.\n"); fechaArquivo(&sdCard::envio); return 1; } sdCard::getFileTam(&sdCard::armazenamento); if(armazenamento.bytes>46080){ sdCard::excluiArquivo(&sdCard::armazenamento); } //Incluindo o status no envio modemCom::writeStatusToSD(); if(sdCard::abreArquivo(&sdCard::armazenamento,"r")){ sdCard::fechaArquivo(&sdCard::armazenamento); }else{ pc.printf("Nao foi encontrado arquivo de armazenamento em preparaEnvio.\n"); return 0; } if(!sdCard::file_rename("/sd/RAD/armazenamento.txt","/sd/RAD/envio.txt")){ pc.printf("Nao foi possivel renomear arquivo para envio.\n"); return 0; } return 1; } void sdCard::finalizaEnvio(void){ if(sdCard::envio.aberto){fclose(sdCard::envio.fp);} remove(sdCard::envio.nome); pc.printf("Deletado o arquivo de envio apos envio do mesmo ao server.\n"); } bool sdCard::getFileTam(arquivoSD *arquivo){ uint32_t tam=0; uint8_t timeOut = timeOutArquivoAberto; if(!sdCard::arquivoAberto(5000)){return false;} if(arquivo->aberto){ fechaArquivo(arquivo); } if(sdCard::abreArquivo(arquivo,"r")){ fseek(arquivo->fp, 0, SEEK_END); // seek to end of file tam = ftell(arquivo->fp); // get current file pointer fseek(arquivo->fp, 0, SEEK_SET); // seek back to beginning of file sdCard::fechaArquivo(arquivo); }else{ return false; } arquivo->bytes = tam; return true; } bool sdCard::arquivoAberto(uint16_t timeOut){ while( (sdCard::envio.aberto||sdCard::armazenamento.aberto||sdCard::config.aberto||sdCard::devices.aberto||sdCard::status.aberto||sdCard::tempFile.aberto||sdCard::arquivosAbertos) && timeOut){ timeOut--; if((timeOut%1000)==0){pc.printf("Timeout em arquivoAberto()<%lu>.\r\n",timeOut);} osDelay(1); } if(timeOut){return true;} else{return false;} } /*//*********************************************************** // file_rename: renames a file (via copy & delete). // Moves data instead of adjusting the file name in the // file directory. Checks to insure the file was renamed. // Returns 0 = error; 1 = success //*********************************************************** uint8_t sdCard::file_rename(const char *oldfname, const char *newfname) { //rename(oldfname,newfname); int retval = 0; int ch; sdCard::envio.bytes=0; if(!sdCard::arquivoAberto(30000)){return false;} FILE *fpold = fopen(oldfname, "r"); // src file if(fpold == NULL){ pc.printf("file_rename 4.\r\n"); fclose(fpold); return 0; } FILE *fpnew = fopen(newfname, "w"); // dest file if(fpnew == NULL){ fclose(fpnew); return 0; } pc.printf("Iniciando copia.\n"); sdCard::envio.bytes=0; ch = fgetc(fpold); while(ch != EOF){ fputc(ch, fpnew); ch = fgetc(fpold); sdCard::envio.bytes++; } fclose(fpnew); fclose(fpold); fpnew = fopen(newfname, "r"); // Reopen dest to insure if(fpnew == NULL) { // that it was created. retval = (0); // Return Error. } else { fclose(fpnew); remove(oldfname); // Remove original file. retval = (1); // Return Success. } sdCard::arquivosAbertos=false; pc.printf("file_rename retval <%lu>.\r\n",retval); return (retval); }*/ //*********************************************************** // file_rename: renames a file (via copy & delete). // Moves data instead of adjusting the file name in the // file directory. Checks to insure the file was renamed. // Returns 0 = error; 1 = success //*********************************************************** uint8_t sdCard::file_rename(const char *oldfname, const char *newfname) { //rename(oldfname,newfname); #define maxTamFileCopy 128 char bufCopy[maxTamFileCopy]; uint8_t retval = 0; uint32_t fileSize = 0; uint32_t fileNumParts = 0; uint32_t fileEnding=0; char ch; uint32_t i,j; sdCard::envio.bytes=0; if(!sdCard::arquivoAberto(30000)){return false;} FILE *fpold = fopen(oldfname, "r"); // src file if(fpold == NULL){ fclose(fpold); return 0; } sdCard::arquivosAbertos = true; FILE *fpnew = fopen(newfname, "w"); // dest file if(fpnew == NULL){ fclose(fpnew); return 0; sdCard::arquivosAbertos = false; } pc.printf("Iniciando copia.\n"); fseek(fpold, 0, SEEK_END); // seek to end of file fileSize = ftell(fpold); // get current file pointer fseek(fpold, 0, SEEK_SET); // seek back to beginning of file sdCard::envio.bytes=0; fileNumParts = fileSize/maxTamFileCopy; fileEnding = fileSize%maxTamFileCopy; for(i=0;i<fileNumParts;i++){ for(j=0;j<maxTamFileCopy;j++){ bufCopy[j]=fgetc(fpold); } for(j=0;j<maxTamFileCopy;j++){ fputc(bufCopy[j],fpnew); } } for(j=0;j<fileEnding;j++){ bufCopy[j]=fgetc(fpold); } for(j=0;j<fileEnding;j++){ fputc(bufCopy[j],fpnew); } fclose(fpnew); fclose(fpold); fpnew = fopen(newfname, "r"); // Reopen dest to insure if(fpnew == NULL) { // that it was created. retval = (0); // Return Error. } else { fclose(fpnew); remove(oldfname); // Remove original file. retval = (1); // Return Success. } sdCard::arquivosAbertos=false; pc.printf("file_rename retval <%lu>.\r\n",retval); return (retval); }