204 lines
6.6 KiB
C
204 lines
6.6 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "pico/stdlib.h"
|
|
|
|
#include "ff.h"
|
|
|
|
#define TAILLE_TAMPON_LECTURE 10
|
|
#define TAILLE_TAMPON_ECRITURE 0x8000
|
|
|
|
struct tampon_ecriture_t{
|
|
char tampon0[TAILLE_TAMPON_ECRITURE], tampon1[TAILLE_TAMPON_ECRITURE];
|
|
char * tampon_a_ecrire, *tampon_actif;
|
|
unsigned int index_tampon, taille_tampon_a_ecrire;
|
|
FIL fp;
|
|
} tampon_event, tampon_telemetrie;
|
|
|
|
|
|
|
|
void ecrit_tampon_dans_sd(struct tampon_ecriture_t * tampon_ecriture){
|
|
if(tampon_ecriture->tampon_a_ecrire != NULL){
|
|
absolute_time_t current_time, start_time;
|
|
unsigned int nb_ecrit;
|
|
start_time = get_absolute_time();
|
|
f_write(&tampon_ecriture->fp, tampon_ecriture->tampon_a_ecrire, tampon_ecriture->taille_tampon_a_ecrire, &nb_ecrit);
|
|
f_sync(&tampon_ecriture->fp);
|
|
current_time = get_absolute_time();
|
|
printf(">sd(Mo/s):%d:%.3f\n", (int)(current_time/1000), (float)(nb_ecrit) / (float)(current_time - start_time));
|
|
//printf(">Octets:%d:%d\n", (int)(current_time/1000), nb_ecrit);
|
|
//printf(">temps_sd:%d:%lld\n", (int)(current_time/1000), current_time - start_time);
|
|
tampon_ecriture->tampon_a_ecrire = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
void routine_log_sd(void){
|
|
while(1){
|
|
ecrit_tampon_dans_sd(&tampon_event);
|
|
ecrit_tampon_dans_sd(&tampon_telemetrie);
|
|
sleep_ms(10);
|
|
}
|
|
};
|
|
|
|
void ajout_texte_a_tampon(const char *chaine, struct tampon_ecriture_t * tampon_ecriture){
|
|
if(tampon_ecriture->index_tampon + strlen(chaine) > TAILLE_TAMPON_ECRITURE){
|
|
tampon_ecriture->tampon_a_ecrire = tampon_ecriture->tampon_actif;
|
|
// permutation du tampon actif
|
|
// indication du tampon à écrire
|
|
// remise à 0 de l'index du tampon
|
|
if(tampon_ecriture->tampon_actif == tampon_ecriture->tampon0){
|
|
tampon_ecriture->tampon_actif = tampon_ecriture->tampon1;
|
|
tampon_ecriture->tampon_a_ecrire = tampon_ecriture->tampon0;
|
|
}else{
|
|
tampon_ecriture->tampon_actif = tampon_ecriture->tampon0;
|
|
tampon_ecriture->tampon_a_ecrire = tampon_ecriture->tampon1;
|
|
}
|
|
tampon_ecriture->taille_tampon_a_ecrire = tampon_ecriture->index_tampon;
|
|
tampon_ecriture->index_tampon = 0;
|
|
tampon_ecriture->tampon_actif[0] = 0;
|
|
}
|
|
strcat(tampon_ecriture->tampon_actif, chaine);
|
|
tampon_ecriture->index_tampon += strlen(chaine);
|
|
ecrit_tampon_dans_sd(tampon_ecriture);
|
|
}
|
|
|
|
void init_tampon_ecriture( struct tampon_ecriture_t * tampon_ecriture ){
|
|
tampon_ecriture->tampon_actif = tampon_ecriture->tampon0;
|
|
tampon_ecriture->index_tampon = 0;
|
|
tampon_ecriture->tampon_a_ecrire = NULL;
|
|
tampon_ecriture->tampon0[0];
|
|
tampon_ecriture->tampon1[0];
|
|
}
|
|
|
|
char * get_tampon_inactif(struct tampon_ecriture_t * tampon_ecriture){
|
|
if(tampon_ecriture->index_tampon){
|
|
return tampon_ecriture->tampon0;
|
|
}
|
|
return tampon_ecriture->tampon1;
|
|
}
|
|
|
|
char * get_tampon_actif(struct tampon_ecriture_t * tampon_ecriture){
|
|
if(tampon_ecriture->index_tampon){
|
|
return tampon_ecriture->tampon0;
|
|
}
|
|
return tampon_ecriture->tampon1;
|
|
}
|
|
|
|
void log_message(const char * message, struct tampon_ecriture_t * tampon_ecriture);
|
|
|
|
int log_running = 0;
|
|
|
|
|
|
void erreur(char * message){
|
|
while(1){
|
|
puts(message);
|
|
sleep_ms(100);
|
|
}
|
|
}
|
|
|
|
void log_init(const char * drive_path){
|
|
FIL fp;
|
|
FRESULT result;
|
|
uint16_t num_log;
|
|
unsigned int nb_lu;
|
|
char message_erreur[150];
|
|
char tampon[TAILLE_TAMPON_LECTURE];
|
|
|
|
// Ouverture de num_log.txt
|
|
char path_num_log[20], path[30];
|
|
strcpy(path_num_log, drive_path);
|
|
strcat(path_num_log, "/num_log.txt");
|
|
result = f_open(&fp, path_num_log, FA_OPEN_EXISTING | FA_READ);
|
|
num_log = 0;
|
|
if(!result){
|
|
// le fichier existe, lisons-le
|
|
result = f_read (&fp, tampon, TAILLE_TAMPON_LECTURE, &nb_lu);
|
|
if(!result){
|
|
// lisons le nombre dans le tampon
|
|
for(int index = 0; index < TAILLE_TAMPON_LECTURE; index++){
|
|
if(tampon[index] >= '0' && tampon[index] <= '9'){
|
|
num_log = num_log * 10 + tampon[index] - '0';
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
num_log++;
|
|
}else{
|
|
sprintf(message_erreur, "Échec à la lecture du fichier %s: %d", path_num_log, result);
|
|
erreur(message_erreur);
|
|
}
|
|
}
|
|
f_close(&fp);
|
|
// Écriture de num_log dans num_log.txt
|
|
sprintf(tampon, "%d\n", num_log);
|
|
printf("%s", tampon);
|
|
result = f_open(&fp, path_num_log, FA_CREATE_ALWAYS | FA_WRITE);
|
|
if(!result){
|
|
result = f_write(&fp, tampon, strlen(tampon), &nb_lu);
|
|
if(result){
|
|
sprintf(message_erreur, "Échec à l'écriture du fichier %s: %d", path_num_log, result);
|
|
erreur(message_erreur);
|
|
}
|
|
}else{
|
|
sprintf(message_erreur, "Échec à l'ouverture du fichier %s: %d", path_num_log, result);
|
|
erreur(message_erreur);
|
|
}
|
|
f_close(&fp);
|
|
|
|
printf("num_log:%d\n", num_log);
|
|
|
|
|
|
init_tampon_ecriture(&tampon_event);
|
|
init_tampon_ecriture(&tampon_telemetrie);
|
|
|
|
// Ouverture du fichier de log
|
|
sprintf(path, "%s%s%03d.txt", drive_path, "data", num_log);
|
|
printf("path: %s\n", path);
|
|
result = f_open(&(tampon_telemetrie.fp), path, FA_CREATE_ALWAYS | FA_WRITE);
|
|
if(result){
|
|
sprintf(message_erreur, "Échec à l'ouverture du fichier %s: %d", path, result);
|
|
erreur(message_erreur);
|
|
}
|
|
result = f_write(&(tampon_telemetrie.fp), "Début du fichier\n", strlen("Début du fichier"), &nb_lu);
|
|
f_sync(&(tampon_telemetrie.fp));
|
|
printf("Fichier créé: %s\n", path);
|
|
|
|
// Ouverture du fichier de telemetrie
|
|
sprintf(path, "%s%s%03d.txt", drive_path, "event", num_log);
|
|
result = f_open(&(tampon_event.fp), path, FA_CREATE_ALWAYS | FA_WRITE);
|
|
result |= f_write(&(tampon_event.fp), "Début du fichier\n", strlen("Début du fichier"), &nb_lu);
|
|
if(result){
|
|
sprintf(message_erreur, "Échec à l'ouverture du fichier %s: %d", path, result);
|
|
erreur(message_erreur);
|
|
}
|
|
printf("Fichier créé: %s\n", path);
|
|
|
|
|
|
log_running = 1;
|
|
|
|
|
|
}
|
|
|
|
void log_telemetrie(char * message){
|
|
log_message(message, &tampon_telemetrie);
|
|
}
|
|
|
|
void log_event(char * message){
|
|
log_message(message, &tampon_event);
|
|
|
|
}
|
|
|
|
void log_message(const char * message, struct tampon_ecriture_t * tampon_ecriture){
|
|
if(log_running){
|
|
absolute_time_t current_time;
|
|
char temps[20];
|
|
|
|
current_time = get_absolute_time();
|
|
|
|
sprintf(temps, "%lld:", current_time);
|
|
ajout_texte_a_tampon(temps, tampon_ecriture);
|
|
ajout_texte_a_tampon(message, tampon_ecriture);
|
|
}
|
|
}
|
|
|