first version of TDEM on Nucleo board

Dependencies:   mbed-src anaDMA stm32_adafruit

main.cpp

Committer:
willybayot
Date:
2015-01-05
Revision:
7:6dd9921fb208
Parent:
6:74471623ffc3

File content as of revision 7:6dd9921fb208:

#include "mbed.h"
#include "AnaloginDMA.h"
#include "ff_gen_drv.h"
#include "stm32_adafruit_lcd.h"
#include "stm32_adafruit_sd.h"
#include "stm32f4xx_nucleo.h"

extern Diskio_drvTypeDef  SD_Driver; 

PwmOut mypwm(PWM_OUT);          // This is the TX pulse pin
AnalogInDMA adc1(PA_0);              // This is the ADC pin
PwmOut buzzer(PC_9);             // This is the digital out pin connected to the buzzer
InterruptIn event(PA_0);          // This sets a semaphore on rising front of pulse pin
DigitalIn button(USER_BUTTON);
Timeout timer;                  // This sets the net reading period

uint16_t reading[50][500];                  // most current ADC capture values 
uint16_t data_buf[500];   
bool sema, end_period;
int n, nbsamples;

int linenr;
FIL gp_file;
FIL grid_file;
char  buf[256];
int filenum;

// system parameters
float Gradient_Threshold = 0.05;    // audio threshold 
int reading_period = 10000;         // in µsec
int integration_ratio = 10;
int pulse_period = 207;
int pulse_width = 200;


void read_one_pulse () {
    sema = false;
    while (!sema)
        ;
    adc1.read(&reading[n][0],nbsamples);
    }

void trigger () {
    sema = true;
    }

void TO() {
   end_period = true;
   }

static int TFT_ShieldDetect(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct; 

  /* Enable GPIO clock */
  __GPIOB_CLK_ENABLE();
  
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  
  if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) != 0)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

int get_num(void) {
FIL f;
int i;
UINT br;
    if ( f_open( &f,  "NUM.BIN" , FA_READ ) == 0) {
        f_read (&f,&i,4,&br);
        i++;
        f_close(&f);
        }
    else 
        i = 1;
    f_open( &f, "NUM.BIN" , FA_WRITE | FA_OPEN_ALWAYS );
    f_write(&f,&i,4,&br);
    f_close(&f);
    return(i);
}

void OpenGrid(char* grid_name){
int i;
    f_unlink( grid_name );
    i = f_open( &grid_file, grid_name , FA_WRITE | FA_OPEN_ALWAYS );
}
 
void CloseGrid(void){
    f_close( &grid_file );
}
   

void Save_Buffer(void) {
int i,j;
UINT byteswritten;
//    data_buf[0] = T1TC;
    j = (nbsamples+5)*2;
    i = 0;


    i = f_write(&grid_file,&linenr,2,&byteswritten);
    i = f_write(&grid_file,data_buf,j,&byteswritten);
//  i = f_write(&grid_file,buf,strlen(buf),&byteswritten);
    if (i > 0) {
//      generate_tics (5, 200);
        return;
        }
    if (byteswritten < j) {
//      generate_tics (5, 200);
        return;
        }
    f_sync(&grid_file);
    }

void convert_file(void) {
UINT i,byteswritten,bytesread;
float r = 3300.0/1024.0;
//      sprintf(buf,"grid%i.BIN",filenum);
        if ( f_open( &gp_file,  "grid.$$$" , FA_READ ) == 0) {
//          sprintf(buf,"grid%i.TXT",filenum);
            i = f_open( &grid_file, "grid.txt" , FA_WRITE | FA_OPEN_ALWAYS );
            strcpy(buf,"SESSION\r\n");
            f_write(&grid_file,buf,strlen(buf),&byteswritten);
            while (1) {
                f_read (&gp_file,&linenr,4,(UINT *)&bytesread);
                if (bytesread < 4 || linenr == 0xFFFFFFFF)
                    break;
                sprintf(buf,"$ %u 0 ",linenr);
                f_write(&grid_file,buf,strlen(buf),&byteswritten);
                f_read (&gp_file,&data_buf,(nbsamples+5)*2,(UINT *)&bytesread);
                if (bytesread < (nbsamples+5)*2 || data_buf[0] == 0xFFFFFFFF)
                    break;
                sprintf(buf,"%i ",data_buf[0]);
                f_write(&grid_file,buf,strlen(buf),&byteswritten);
                for (i = 1;i<nbsamples+1;i++) {
                    sprintf(buf,"%0.0f ",r*data_buf[i]);
                    f_write(&grid_file,buf,strlen(buf),&byteswritten);
                    }
                for (i = nbsamples+1;i<nbsamples+5;i++) {
                    sprintf(buf,"%i ",data_buf[i]);
                    f_write(&grid_file,buf,strlen(buf),&byteswritten);
                    }
                f_write(&grid_file,"\r\n",2,&byteswritten);
                }

            }
        f_truncate (&grid_file);
        f_close( &gp_file );
        f_close( &grid_file );
        filenum = get_num();
        sprintf(buf,"grid%i.TXT",filenum);
        f_rename("grid.txt",buf );
//        generate_tics (5, 200);

}

  
int main() {

    uint16_t ref_reading[500];          // Reference reading of ground signal
    int sample_count;
    int delta, j;
    UINT i;
    char SD_Path[4];
    FATFS SD_FatFs;  /* File system object for SD card logical drive */


 
    if(TFT_ShieldDetect() == 0)
        {
        /* Initialize the LCD */
        BSP_LCD_Init();
        /* Initialize the Joystick available on adafruit 1.8" TFT shield */
        BSP_JOY_Init();
        FATFS_LinkDriver(&SD_Driver, SD_Path);
        /* Initialize the SD mounted on adafruit 1.8" TFT shield */
        BSP_SD_Init();
        f_mount(&SD_FatFs, (TCHAR const*)"/", 0);  
        }       
    mypwm.period_us(pulse_period);
    mypwm.pulsewidth_us(0);
    buzzer.period_ms(0);
    buzzer.write(50);
    event.rise(&trigger);
    
    while (button == 1)     //Wait to start session until button is pressed and released
        ;
    while (button == 0)
        ;       
    sample_count = 0;
    OpenGrid("grid.$$$");
    while(1) {
        end_period = false;
        timer.attach_us(&TO,reading_period);
        mypwm.pulsewidth_us(pulse_width);       // Start TX pulses
        nbsamples = pulse_period*2;
        for (n=0;n<integration_ratio;n++)
            read_one_pulse();                   // Accumulate ADC captures into reading
        mypwm.pulsewidth_us(0);                 // Stop TX pulses
        for (i=0; i < nbsamples;i++) {
            data_buf[j] = 0;
            for (j=0; j < integration_ratio;j++)
                data_buf[j] += reading[j][i];
            }
        for (i=0; i < nbsamples;i++)
            data_buf[i] /= integration_ratio;           // Average reading
        if (sample_count == 0) {                // If first reading of session, save reading into ground reference signal level
            for (i=0; i < integration_ratio;i++)
                ref_reading[i] = data_buf[i];
            sample_count++;
            }
        delta = ref_reading[0] - data_buf[0];          // Delta is the gradient
        if (abs(delta) > Gradient_Threshold )   // if hte graient is larger than a threshold, start buzzing
            buzzer.period_ms(1);
        else 
            buzzer.period_ms(0);
        if (delta != 0 && abs(delta) <= 0.01 )  // If delta is small enough but not nul, update the ref_reading with th ecurrent reading through a powerful low pass FIR filter.
            for (i=0; i < integration_ratio;i++)
               ref_reading[i] = (ref_reading[i]*127 + reading[0][i] ) / 128;
        Save_Buffer();
        if (button == 0) {                      // pushing again on the button and relasing it stops the session
            while (button == 0)
                ;
            data_buf[0] = 0xFFFF;
            f_write(&grid_file,data_buf,(nbsamples+1)*2,&i);            CloseGrid();
            return(0);
            }
        while (!end_period)             // Wait for end of reading period (i.e. 10msec)
            ;
      }
}