branch for tests with T265

Dependencies:   Lib_Cntrl AHRS Lib_Misc

Threads_and_main/Data_Logger.cpp

Committer:
Kiwicjam
Date:
2019-11-22
Revision:
4:dc844fde64d7
Parent:
3:bc24fee36ba3

File content as of revision 4:dc844fde64d7:

#include "Data_Logger.h"
using namespace std;

// Class Data logger
// -----------------------------------------------------------------------------
Data_Logger::Data_Logger(uint8_t nb, float Ts) : sd(PC_12, PC_11, PC_10, PD_2),fs("sd"),thread(osPriorityBelowNormal, 4096)
{   
    sd.init();      // init SD-card
    fs.mount(&sd);  // mount drive
    ti.reset();
    this->Ts = Ts;
    fp = fopen("/sd/copter_QK2/number.txt", "r");     // read ff number for next log
    log_number = 0;
    if (fp != NULL) {
        fscanf(fp,"%d",&log_number);
        fclose(fp);
        fp = fopen("/sd/copter_QK2/number.txt", "w");
        fprintf(fp,"%d\r\n",++log_number);      // write incremented number
        fclose(fp);    
    } else {
        printf("\r\nfailed to open logging number file!\r\n");
    }
    //-----------------------------------------------
    printf("Log Data on  log_%d.txt\r\n",log_number);
    char str[30];
    //sprintf(str, "/sd/copter_altb1/log_%d.txt", log_number);
    // Write Textfile for description:
    sprintf(str, "/sd/copter_QK2/log_%d.txt", log_number);
    fp = fopen(str, "w");
    if(fp == NULL) {
        error("Could not open file for write\r\n");
        file_is_open = false;
    }
    else{
        //fprintf(fp,"gyr, 1:3\r\nEKF, 4:7\r\nOptFl, 8:11\r\nLidar, 12\r\nMxyz, 14:16\r\nFT, 17\r\nwMot, 18:21\r\nUSens, 22\r\nASens, 23\r\nCS, 24\r\ndt, 25\r\nRPYdes, 26:28\r\n");      // Description
        fprintf(fp,"gyr, 1:3\r\nacc, 4:6\r\nLidar, 7\r\nOF, 8:13\r\nRPY, 14:16\r\nMxyz, 17:19\r\nFT, 20\r\nwMot, 21:24\r\ndes_z, 25\r\ndes_yaw, 26\r\nest_v, 27:29\r\nMag_raw, 30:32\r\nRP_RPY, 33:37\r\n");      // Description
        fclose(fp);
        sprintf(str, "/sd/copter_QK2/log_%d.bin", log_number);
        fp = fopen(str, "wb");
        file_is_open = true;
        fwrite(&nb, 1, 1, fp); // write number of columns once!!!
        }
    this->nb_cols = nb;
}
// ------------------- start logging ----------------
void Data_Logger::start_logging(void){
        ti.reset();
        ti.start();
        pc.printf("DataLogger Thread started\r\n");
        if(file_is_open){
            log_is_active = true;
            thread.start(callback(this, &Data_Logger::write_line));
            ticker.attach(callback(this, &Data_Logger::sendSignal), Ts);
            }
}
// ------------------- stop logging ----------------
void Data_Logger::stop_logging(void){
        log_is_active = false;
        ticker.detach();
        thread.terminate();
        }
// ------------------- stop logging ----------------
void Data_Logger::pause_logging(void){
        log_is_active = false;
        }
// ------------------- stop logging ----------------
void Data_Logger::continue_logging(void){
        log_is_active = true;
        }
// ------------------- destructor -----------------
Data_Logger::~Data_Logger() {
    ticker.detach();
    }
// ------------------ write line -------------
void Data_Logger::write_line(void){
printf("THREAD LOG loop\r\n"); 
    while(true){
        thread.signal_wait(signal);
        if(log_is_active && file_is_open)
            {
            mutex.lock();
            float t_temp = ti.read(); 
            fwrite(&t_temp, 4, 1, fp);
            //fwrite(data_vector, 4, nb_cols, fp);
            fwrite(data.sens_gyr, 4, 3, fp);
            fwrite(data.sens_acc, 4, 3, fp);
            fwrite(&data.sens_Lidar[0], 4, 1, fp);
            fwrite(data.sens_OF, 4, 6, fp);
            fwrite(data.est_RPY, 4, 3, fp);
            fwrite(data.cntrl_Mxyz, 4, 3, fp);
            fwrite(&data.F_Thrust, 4, 1, fp);
            fwrite(data.wMot, 4, 4, fp);
            fwrite(&data.cntrl_pos_xyz_des[2], 4, 1, fp);
            fwrite(&data.cntrl_att_rpy_des[2], 4, 1, fp);
            fwrite(data.est_Vxyz, 4, 3, fp);
            fwrite(data.sens_mag_raw, 4, 3, fp);
            fwrite(data.est_RP_RPY, 4, 5, fp);
            mutex.unlock();
            }
        }
    }
// ------------- close file -----------------    
void Data_Logger::close_file(void){
    if(log_is_active)
        stop_logging();
    fclose(fp);
    }
// this is for realtime OS
void Data_Logger::sendSignal() {
    thread.signal_set(signal);
}