avec dfu

Fork of Utils by POTLESS

Revision:
11:a41267cffa61
Parent:
10:21f3ff5d6a3d
Child:
12:9dd7c462a2c0
--- a/Utils.cpp	Sat Feb 24 16:55:04 2018 +0000
+++ b/Utils.cpp	Mon Mar 05 11:14:45 2018 +0000
@@ -3,12 +3,14 @@
 
 //SDBlockDevice bd(Flash_MOSI, Flash_MISO, Flash_SCK, Flash_CS);
 SPIFBlockDevice bd(Flash_MOSI, Flash_MISO, Flash_SCK, Flash_CS);
- 
-    
+
 FATFileSystem Root("Root");
 
 int Exist_Val = 0;
 
+//Init des PIN i2c pour l'eeprom
+I2C I2C_EEPROM(SDA_PIN, SCL_PIN);
+
 void return_error(int ret_val)
 {
     Exist_Val = 0;
@@ -44,44 +46,43 @@
     printf("Flash erase size   : %llu\r\n", bd.get_erase_size());
 }
 
-void UTILS::Get_File_Size(char* File_Name) {
-    
+void UTILS::Get_File_Size(char* File_Name)
+{
+
     char filename[20];
     sprintf(filename, "/Root/%s", File_Name);
 
     FILE* fd = fopen(filename, "r");
-    errno_error(fd); 
-         
+    errno_error(fd);
+
     fseek(fd, 0, SEEK_END);
     int size = ftell(fd);
     fseek(fd, 0, SEEK_SET);
-    
+
     fclose(fd);
-    
+
     printf("\r\n");
     printf("  Taille du fichier %s = %d Kb\r\n", filename, size / 1024);
 }
 
 /*
 void UTILS::Get_File_Infos(char* File_Name) {
-    
+
     char filename[20];
     sprintf(filename, "/Root/%s", File_Name);
-    
+
     struct stat fileStat;
-    stat(filename, &fileStat); 
-    
+    stat(filename, &fileStat);
+
     printf("Informations sur %s\r\n\r\n",filename);
     printf("  Taille du fichier           :  %d bytes\r\n",&fileStat.st_size);
     printf("  Heure dernier accès         :  %s\r\n",ctime(&fileStat.st_atime));
     printf("  Heure dernière modification :  %s\r\n",ctime(&fileStat.st_mtime));
     printf("  Heure dernier changement    :  %s\r\n",ctime(&fileStat.st_ctime));
 
-  
     struct stat stat_buf;
 
     stat(filename, &stat_buf);
-    
 
     stat_buf.st_size;
     stat_buf.st_dev;
@@ -103,23 +104,23 @@
     printf("  Heure dernière modification :  %s\r\n",ctime(&stat_buf.st_mtime));
     printf("  Heure dernier changement    :  %s\r\n",ctime(&stat_buf.st_ctime));
 
-}    
+}
 
 void UTILS::Get_File_Infos_bis(char* File_Name) {
-    
+
     char filename[20];
     sprintf(filename, "/Root/%s", File_Name);
-    
+
     struct stat fileStat;
- 
-    stat(filename, &fileStat); 
+
+    stat(filename, &fileStat);
 
     printf("Information for %s\n",filename);
     printf("---------------------------\n");
     printf("File Size: \t\t%d bytes\n",fileStat.st_size);
     printf("Number of Links: \t%d\n",fileStat.st_nlink);
     printf("File inode: \t\t%d\n",fileStat.st_ino);
- 
+
     printf("File Permissions: \t");
     printf( (fileStat.st_mode & S_IRUSR) ? "r" : "-");
     printf( (fileStat.st_mode & S_IWUSR) ? "w" : "-");
@@ -131,7 +132,7 @@
     printf( (fileStat.st_mode & S_IWOTH) ? "w" : "-");
     printf( (fileStat.st_mode & S_IXOTH) ? "x" : "-");
     printf("\n\n");
-  
+
 }
 */
 
@@ -208,14 +209,14 @@
 
     //printf("  Contenu du fichier :\r\n\r\n");
     char buff[100] = {0};
-       
-    while (!feof(fd)) {        
+
+    while (!feof(fd)) {
         int size = fread(&buff[0], 1, 15, fd);
-        fwrite(&buff[0], 1, size, stdout);        
+        fwrite(&buff[0], 1, size, stdout);
     }
     //printf("\r\n  Fin du fichier.\r\n");
     fclose(fd);
-    
+
 }
 */
 
@@ -225,7 +226,7 @@
     sprintf(filename, "/Root/%s", File_Name);
 
     FILE* fd = fopen(filename, "r");
-    errno_error(fd);   
+    errno_error(fd);
     char s1[100];
     printf("\r\n");
     printf("  Contenu du fichier :\r\n\r\n");
@@ -235,8 +236,8 @@
         printf("%s", s1);
         fflush(stdout);
     }
-   fclose(fd);
-   printf("\r\n  Fin du fichier.\r\n");
+    fclose(fd);
+    printf("\r\n  Fin du fichier.\r\n");
 }
 
 bool UTILS::File_Exist(string File_Name)
@@ -275,14 +276,16 @@
     DEBUG("Nettoyage de la Flash.\r\n");
     float Saved_O2 = UTILS::Read_A_Val("Calibration_O2");
     int Saved_Motor = (int)UTILS::Read_A_Val("Servo_Poumon");
+    int ARNSRS_ID = (int)UTILS::Read_A_Val("ARNSRS_ID");
     UTILS::UnMount_Flash();
     UTILS::Format_Flash();
     UTILS::Mount_Flash();
     UTILS::Store_A_Val(Saved_O2, "Calibration_O2");
     UTILS::Store_A_Val(Saved_Motor, "Servo_Poumon");
+    UTILS::Store_A_Val(ARNSRS_ID, "ARNSRS_ID");
     DEBUG("Flash nettoyée.\r\n");
     DEBUG("Redémmarage code.\r\n");
-    NVIC_SystemReset();   
+    NVIC_SystemReset();
 }
 
 void UTILS::Rename_Flash_File(char* Old_File_Name, char* New_File_Name)
@@ -406,21 +409,130 @@
     printf("  get X            =    récupérer le contenu du fichier LOG_X.\n\r");
     printf("  file_s X         =    récupérer la taille du fichier LOG_X.\n\r\n\r");
     //printf("  file_i X         =    récupérer les informations sur le fichier LOG_X.\n\r\n\r");
-    printf("  COMMANDES MOTEURS\r\n\r\n");    
+    printf("  COMMANDES MOTEURS\r\n\r\n");
     printf("  c_pou X          =    changement consigne volet poumon à X.\n\r");
     printf("  c_fui X          =    changement consigne volet fuite à X.\n\r");
     printf("  calib_p          =    calibration à 0 du volet poumon.\n\r");
-    printf("  calib_f          =    calibration à 0 du volet fuite.\n\r"); 
+    printf("  calib_f          =    calibration à 0 du volet fuite.\n\r");
     printf("  secu             =    mise des volets en mode sécu.\n\r\n\r");
-    printf("  COMMANDES CAPTEURS\r\n\r\n");   
+    printf("  COMMANDES CAPTEURS\r\n\r\n");
+    printf("  Head_ID X        =    Numérote le numéro X d'identification de la sensor Head dans l'eeprom.\n\r");
+    printf("  O2_1_ID X        =    Numérote le numéro X d'identification de la cellule O2 1 dans l'eeprom.\n\r");
+    printf("  O2_2_ID X        =    Numérote le numéro X d'identification de la cellule O2 2 dans l'eeprom.\n\r");
+    printf("  CO2_ID X         =    Numérote le numéro X d'identification du capteur CO2 dans l'eeprom.\n\r");
     printf("  calib_O2 X       =    calibration des cellules O2 dans l'air avec X itérations.\n\r");
-    printf("  check            =    sortie des valeurs de calibrations enregistrées.\n\r\n\r");  
+    printf("  check            =    sortie des valeurs de calibrations enregistrées.\n\r\n\r");
     printf("  Les commandes pour le Mini-r sont à entrer conformément à la doc. Les plus utilisée :\n\r");
     printf("  G                =    calibration du capteur CO2 dans l'air.\n\r");
-    printf("  K 0              =    arrêt du capteur CO2.\n\r"); 
+    printf("  K 0              =    arrêt du capteur CO2.\n\r");
     printf("  K 1              =    capteur CO2 mode streaming.\n\r");
     printf("  K 2              =    capteur CO2 mode spooling.\n\r");
-    printf("  A X              =    digi filter X. X égal à 32, 64, 128...\n\r");  
+    printf("  A X              =    digi filter X. X égal à 32, 64, 128...\n\r");
     printf("\r\n\r\n");
     fflush(stdout);
-}
\ No newline at end of file
+}
+
+void UTILS::clean_line_EEPROM(unsigned int eeaddress, int address)
+{
+    DEBUG("  Effacage de la ligne à l'adresse %d de l'eeprom.\r\n", eeaddress);
+     
+    int size = 64;
+    char deleteData[] = {"                                                                "};
+    
+    char i2cBuffer[size + 2];
+    i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB
+    i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB
+ 
+    for (int i = 0; i < size; i++) {
+        i2cBuffer[i + 2] = deleteData[i];
+    }
+ 
+    int result = I2C_EEPROM.write(address, i2cBuffer, size + 2, false);
+    wait_ms(6);
+    
+    DEBUG("  Ligne à l'adresse %d de l'eeprom effacée.\r\n", eeaddress);
+}
+
+//Max 63 bit en écriture
+void UTILS::write_EEPROM(char *data, unsigned int eeaddress, int address)
+{   
+    //Nettoyage de la ligne ou on va stocker la nouvelle data
+    clean_line_EEPROM(eeaddress);
+    
+    // On calcul de la taille de la chaine a enregistrer
+    char size = 0;
+    do {
+        size++;
+    } while (data[size]);
+
+    char i2cBuffer[size + 2];
+    i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB
+    i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB
+
+    for (int i = 0; i < size; i++) {
+        i2cBuffer[i + 2] = data[i];
+    }
+
+    int res = I2C_EEPROM.write(address, i2cBuffer, size + 2, false);
+
+    wait_ms(6);
+
+    DEBUG("  Chaine écrite à l'adresse %d de l'eeprom : %s\r\n", eeaddress , data);
+}
+
+
+float UTILS::read_F_EEPROM(unsigned int eeaddress ,int address)
+{
+    //On lit toute la ligne
+    int size = 64;
+    char data[64];
+
+    char i2cBuffer[2];
+    i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB
+    i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB
+
+    int result = I2C_EEPROM.write(address, i2cBuffer, 2, false);
+    wait_ms(6);
+
+    I2C_EEPROM.read(address, data, size);
+    wait_ms(6);
+
+    float result_F = atof(data);
+    DEBUG("  Float lu à l'adresse %d de l'eeprom : %f\r\n", eeaddress, result_F);
+    return result_F;
+}
+
+
+int UTILS::read_I_EEPROM(unsigned int eeaddress ,int address)
+{
+    //On lit toute la ligne
+    int size = 64;
+    char data[64];
+
+    char i2cBuffer[2];
+    i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB
+    i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB
+
+    int result = I2C_EEPROM.write(address, i2cBuffer, 2, false);
+    wait_ms(6);
+
+    I2C_EEPROM.read(address, data, size);
+    wait_ms(6);
+
+    int result_I = atoi(data);
+    DEBUG("  Int lu à l'adresse %d l'eeprom : %d\r\n", eeaddress, result_I);
+    return result_I;
+}
+
+void UTILS::clean_EEPROM(int address)
+{
+    DEBUG("  Nettoyage total de l'Eeprom (64 colonnes, 4096 lignes).\r\n");
+    int i;
+    int pointer;
+    char deleteData[] = {"                                                                "};
+    for (i = 0; i < 4096; i++) {
+        pointer = 64 * i;
+        clean_line_EEPROM(pointer, address);
+    }
+    DEBUG("Eeprom néttoyée.\r\n");
+}