From 9cbc6286708cf7a17854510c110d3e80ec4e3a2d Mon Sep 17 00:00:00 2001 From: pifou <pifou@zabeth28> Date: Wed, 20 Dec 2023 18:46:05 +0000 Subject: [PATCH] =?UTF-8?q?RM=20corrig=C3=A9,=20TYPE=20bugg=C3=A9=20pour?= =?UTF-8?q?=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SD/picofs.c | 180 ++++++++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 82 deletions(-) diff --git a/SD/picofs.c b/SD/picofs.c index 9cc3640..9d7fd4c 100755 --- a/SD/picofs.c +++ b/SD/picofs.c @@ -32,7 +32,7 @@ void readBlock(SD_info *sd, unsigned int numBlock, int offset, char *storage, in void writeBlock(SD_info *sd, unsigned int numBlock, int offset, char *source, int size) { - char buffer_write[BLOCK_SIZE/2]; + char buffer_write[BLOCK_SIZE]; readData(sd, numBlock, 0, size, (uint8_t *)buffer_write); if(offset + size > 512 ) { @@ -51,22 +51,35 @@ void writeBlock(SD_info *sd, unsigned int numBlock, int offset, char *source, in } +// void eraseSD(SD_info *sd){ //met des 0 partout dans la carte SD +// char zeros[BLOCK_SIZE]; +// for(int i = 0; i< BLOCK_SIZE-1;i++){ +// zeros[i] = '0'; +// } +// zeros[BLOCK_SIZE-1] = '\0'; +// +// for (int blockNum = 0; blockNum < 5000; blockNum ++){ +// //printf("erase\n"); +// writeBlockSD(sd,blockNum,zeros); +// } +// return; +// } + void LS(SD_info *sd) { char buffer[MAX_FILENAME_LENGTH]; int fileCount = 0; printf("\n"); - // Parcourir les blocs multiples de 16 à partir de 0 jusqu'à MAX_BLOCKS_IN_SUPERBLOCK + // // Parcourir les blocs multiples de 16 à partir de 0 jusqu'à MAX_BLOCKS_IN_SUPERBLOCK for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { - readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH); + readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH); - // Vérifier si le nom de fichier est vide - if (buffer[0] != 0) { - // Afficher le nom du fichier + // Vérifier si le nom de fichier est vide + if (buffer[0] != 0) { + // Afficher le nom du fichier printf("%s\n", buffer); fileCount++; - } - } - + } + } if (fileCount == 0) { printf("\nAucun fichier trouvé.\n"); } @@ -105,10 +118,18 @@ int min(int a, int b) { return a < b ? a : b; } +// Fonction qui reconstitue le numéro de bloc à partir du tableau +int reconstituteNumber(char blockNumberBuffer[2]) { + char octet1 = blockNumberBuffer[0]; + char octet2 = blockNumberBuffer[1]; + int dataBlockNum = (octet1 << 8) | octet2; + return dataBlockNum; +} + void RM(SD_info *sd, char *filename) { int fileFound = -1; int offset; - char fileBuffer[BLOCK_SIZE]; + char fileBuffer[CHUNK_SIZE]; // Parcourir les blocs réservés pour la description des fichiers (superbloc) for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { @@ -139,25 +160,26 @@ void RM(SD_info *sd, char *filename) { startOffset = MAX_FILENAME_LENGTH; } - for (int chunkStart = startOffset; chunkStart < BLOCK_SIZE/2; chunkStart += CHUNK_SIZE) { - int chunkSize = min(CHUNK_SIZE, BLOCK_SIZE/2 - chunkStart); - readBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); + //for (int chunkStart = startOffset; chunkStart < BLOCK_SIZE/2; chunkStart += CHUNK_SIZE) { + // int chunkSize = min(CHUNK_SIZE, BLOCK_SIZE/2 - chunkStart); + int chunkSize = 0; + int chunkStart = 0; + readBlock(sd,blockNum, 0, fileBuffer, chunkSize); - for (int i = 0; i < chunkSize; i += 2) { - int blockNumData = (fileBuffer[i] << 8) | fileBuffer[i + 1]; - + //for (int i = 0; i < chunkSize; i += 2) { + // int blockNumData = (fileBuffer[i] << 8) | fileBuffer[i + 1]; + int blockNumData = reconstituteNumber(fileBuffer); if (blockNumData == 0) { - writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); + writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); printf("\nLe fichier \"%s\" a été supprimé avec succès.\n", filename); return; // Sortir des boucles } - setBlockAvailability(sd,blockNumData, 0); // Marquer le bloc comme disponible - fileBuffer[i] = 0; - fileBuffer[i + 1] = 0; - } - + else setBlockAvailability(sd,blockNumData, 0); // Marquer le bloc comme disponible + //fileBuffer[i] = 0; + //fileBuffer[i + 1] = 0; + //} writeBlock(sd,blockNum, chunkStart, fileBuffer, chunkSize); - } + //} } printf("\nLe fichier \"%s\" a été supprimé avec succès.\n", filename); @@ -171,7 +193,7 @@ void MV(SD_info *sd, char *old_filename, char *new_filename) { int fileFound = 0; // Parcourir les blocs réservés pour la description des fichiers (superbloc) - for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { + for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 1) { readBlock(sd,blockNum, 0, filenameBuffer, MAX_FILENAME_LENGTH); @@ -181,14 +203,15 @@ void MV(SD_info *sd, char *old_filename, char *new_filename) { if (sizeNew_filename < MAX_FILENAME_LENGTH) { sizeNew_filename+=1; } - + // Écrire le nom du fichier dans l'emplacement writeBlock(sd,blockNum, 0, new_filename, sizeNew_filename); - + fileFound=1; break; // Nom modifié, sortir de la boucle } + } if (fileFound == 1) { printf("\nLe nom du fichier \"%s\" a été renommé avec succès.\n", old_filename); @@ -232,13 +255,7 @@ int findAvailableBlock(SD_info *sd) { return -1; } -// Fonction qui reconstitue le numéro de bloc à partir du tableau -int reconsituteNumber(char blockNumberBuffer[2]) { - char octet1 = blockNumberBuffer[0]; - char octet2 = blockNumberBuffer[1]; - int dataBlockNum = (octet1 << 8) | octet2; - return dataBlockNum; -} + // Fonction qui réparti un numéro de bloc sur deux octets @@ -256,12 +273,12 @@ void TYPE(SD_info *sd, char *filename, char *data) { int index_in_descrBlock = 0; int offset; - + if (sizeFilename > MAX_FILENAME_LENGTH) { printf("\nImpossible de créer le fichier, nom trop long\n"); return; } - + // Parcours des blocs réservés pour la description des fichiers (superbloc) for (int blockNum = 0; blockNum < MAX_BLOCKS_IN_SUPERBLOCK; blockNum += 16) { readBlock(sd,blockNum, 0, buffer, MAX_FILENAME_LENGTH); @@ -273,59 +290,58 @@ void TYPE(SD_info *sd, char *filename, char *data) { } writeBlock(sd,blockNum, 0, filename, sizeFilename); placeFound = blockNum; - + // Lire les données depuis l'entrée standard et écrire dans le fichier int dataBlockNum = findAvailableBlock(sd); // Premier bloc de données à partir du bloc 1040 int blockSizeUsed = 0; // Compteur d'octets dans le bloc actuel - + char chunkBuffer[CHUNK_SIZE]; size_t bytesRead; - - bytesRead = strlen(data); - strcpy(chunkBuffer,data); - // Écrire le chunk dans le bloc de données - writeBlock(sd,dataBlockNum, blockSizeUsed, chunkBuffer, bytesRead); - setBlockAvailability(sd,dataBlockNum, 1); - // Écrire le numéro du bloc actuel dans la description du fichier - char blockNumberBuffer[64]; - createNumberBuffer(dataBlockNum,blockNumberBuffer); - blockSizeUsed += bytesRead; - - // Si le bloc actuel est plein, passer au bloc suivant OU si c'est le premier tour dans la boucle - // Ecriture du numéro de bloc utilisé dans les blocs de description - if (index_description_block == 0) { - offset = MAX_FILENAME_LENGTH; - } else { - offset = 0; - } - writeBlock(sd,placeFound + index_description_block, offset + index_in_descrBlock*2, blockNumberBuffer, 2); - index_in_descrBlock++; + bytesRead = strlen(data); + strcpy(chunkBuffer,data); + // Écrire le chunk dans le bloc de données + writeBlock(sd,dataBlockNum, blockSizeUsed, chunkBuffer, bytesRead); + setBlockAvailability(sd,dataBlockNum, 1); + // Écrire le numéro du bloc actuel dans la description du fichier + char blockNumberBuffer[64]; + createNumberBuffer(dataBlockNum,blockNumberBuffer); + blockSizeUsed += bytesRead; + + // Si le bloc actuel est plein, passer au bloc suivant OU si c'est le premier tour dans la boucle + // Ecriture du numéro de bloc utilisé dans les blocs de description + if (index_description_block == 0) { + offset = MAX_FILENAME_LENGTH; + } else { + offset = 0; + } - dataBlockNum = findAvailableBlock(sd); // Passer au bloc suivant - blockSizeUsed = 0; // Réinitialiser la taille utilisée - - // Passage au bloc de description suivant - if (block_counter == (BLOCK_SIZE/2-offset)) { - index_description_block++; - index_in_descrBlock=0; - } - - // Compteur de nombre de blocs utilisés - block_counter++; - - // Vérifie si on a atteint le nombre maximal de blocs par fichier - if (block_counter >= 2040) { - printf("Le fichier a atteint sa taille maximale\n"); - return; - } + writeBlock(sd,placeFound + index_description_block, offset + index_in_descrBlock*2, blockNumberBuffer, 2); + index_in_descrBlock++; + + dataBlockNum = findAvailableBlock(sd); // Passer au bloc suivant + blockSizeUsed = 0; // Réinitialiser la taille utilisée + + // Passage au bloc de description suivant + if (block_counter == (BLOCK_SIZE/2-offset)) { + index_description_block++; + index_in_descrBlock=0; + } + + // Compteur de nombre de blocs utilisés + block_counter++; + + // Vérifie si on a atteint le nombre maximal de blocs par fichier + if (block_counter >= 2040) { + printf("Le fichier a atteint sa taille maximale\n"); + return; + } - break; // Fichier créé, sortir de la boucle } } - + if (placeFound != -1) { printf("Le fichier \"%s\" a été créé avec succès.\n", filename); } else { @@ -361,9 +377,9 @@ void CAT(SD_info *sd, char *filename) { // Lecture des octets deux par deux for (int i=0; i<BLOCK_SIZE;i+=2) { readBlock(sd,descrBlockNum+blockNum, offset+i, byteBuffer, 2); - + printf("\nByte buffer: %s\n", byteBuffer); // Lire les numéros de blocs associés à ce fichier depuis les blocs de description - int dataBlockNum = reconsituteNumber(byteBuffer); + int dataBlockNum = reconstituteNumber(byteBuffer); // Vérifier si le numéro de bloc est valide (non nul) if (dataBlockNum == 0) { return; // Fin du fichier @@ -372,7 +388,7 @@ void CAT(SD_info *sd, char *filename) { //for (int chunkStart = 0; chunkStart < BLOCK_SIZE; chunkStart += CHUNK_SIZE) { // Lire et afficher le contenu du bloc de données readBlock(sd,dataBlockNum, 0, dataBuffer, CHUNK_SIZE); - printf("\n%s\n",dataBuffer ); + printf("\n%s\n",dataBuffer); //} } } @@ -445,7 +461,7 @@ void CP(SD_info *sd, char *source_filename, char *destination_filename) { readBlock(sd,source_offset + i, offset + byteNum, numBuffer, 2); - numDataBlock = reconsituteNumber(numBuffer); + numDataBlock = reconstituteNumber(numBuffer); if (numDataBlock == 0) { printf("\nLa copie de \"%s\" sous le nom \"%s\" a été créée avec succès.\n", source_filename, destination_filename); return; @@ -493,10 +509,10 @@ int main(int argc, char *argv[]) { printf("Pico ordinateur OK\n\n"); // char current_cmd[CMD_SIZE + 1]; // +1 pour le caractère nul - erase(&sd, 0, 15000); + erase(&sd,0,15000); current_cmd[0] = '\0'; // Initialise la chaîne vide printf("PicoOrdi>"); - + //eraseSD(&sd); while (1) { _delay_ms(10); -- GitLab