Publish test

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO LCD_DISCO_F746NG SD_DISCO_F746NG TS_DISCO_F746NG USBHost_DISCO-F746NG_joerg mbed-rtos mbed

Fork of rtos_basic by mbed official

main.cpp

Committer:
schmalzl
Date:
2016-11-30
Revision:
8:98bd91792454
Parent:
7:8d9919175929

File content as of revision 8:98bd91792454:

#include "mbed.h"
#include "rtos.h"
#include "USBHostMouseKeyboard.h"
#include "USBHostMSD.h"
#include "LCD_DISCO_F746NG.h"
#include "F746_GUI.hpp"
#include "SAI_InOut.hpp"

using namespace Mikami;


LCD_DISCO_F746NG lcd;
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Thread read_adc;
Thread thread2;
const int FS = I2S_AUDIOFREQ_16K;   // 16 kHz

int data_length;        //  length of adc_data
Array<float> adc_data(513);   // data - read from mic .. write to usb-stick
Mutex data_mutex; 

#define FastSpeedInterface 0
#define HighSpeedInterface 1

void usb_task(void const *) {

    USBHostMSD msd("usb",HighSpeedInterface);
//    USBHostMSD msd("usb",FastSpeedInterface);

    int i = 0;
    int res;
    int error=0,nBlocksWritten ;
    char buf[50], buf2[50];
    while(1) {
            lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"USB connect", CENTER_MODE);

        // try to connect a MSD device
        while(!msd.connect()) {
            lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"USB Waiting", CENTER_MODE);

            Thread::wait(500);
            printf("waiting\n");
        }
  
               wait_ms(500);
                msd.mount() ;
               wait_ms(500);
            
             
         // open a file
            srand(time(NULL));
            sprintf(buf2,"/usb/test%i.txt\0", rand()%4);
            FILE * fp = fopen(buf2, "w");
            lcd.DisplayStringAt(0, LINE(11), (uint8_t *)buf2, CENTER_MODE);
        // in a loop, append a file
        // if the device is disconnected, we try to connect it again
        
        
        while(1) {

  

            if (fp != NULL) {
                i++;

              data_mutex.lock(); 
              
                 sprintf(buf, "Vor dem fwrite %i length %i    \0", i, data_length);
                 lcd.DisplayStringAt(0, LINE(4), (uint8_t *)buf, CENTER_MODE);

               // Write the data block
                nBlocksWritten = fwrite(
                                adc_data,               // const void *ptr
                                2,         // size_t size 2byte=float
                                data_length,   // size_t nmemb
                                fp               // FILE *stream
                                );
                              //  fflush(fp);

                data_length = 0;
            

                sprintf(buf, "Nach fwrite %i length %i \0",i, nBlocksWritten);
                lcd.DisplayStringAt(0, LINE(5), (uint8_t *)buf, CENTER_MODE);
 
               Thread::wait(100);

               data_mutex.unlock();
     /*
                if (error==1)
                {
                sprintf(buf,"Goodbye New World!\r\n");
                lcd.DisplayStringAt(0, LINE(7), (uint8_t *)buf, CENTER_MODE);

                error=0;
                }
                fclose(fp);
    */
     /*           if(res<0)
                {
                   sprintf(buf,"FILE write ERROR\r\n");
                lcd.DisplayStringAt(0, LINE(7), (uint8_t *)buf, CENTER_MODE);

                   msd.unmount();
                   wait_ms(5000);
                   msd.mount() ;
                   error=1;
                }
*/
            } else {
                
 /*
                sprintf(buf, "FILE == NULL\r\n");
                lcd.DisplayStringAt(0, LINE(7), (uint8_t *)buf, CENTER_MODE);

                msd.unmount();
                wait_ms(5000);
                msd.mount() ;
                error=1;
   */
            }

            Thread::wait(500);

            // if device disconnected, try to connect again
            if (!msd.connected())
                break;
        }  

      
    } 
}


 
void adc_thread() {
    int i=0;
    char buf[50];
         
          
    lcd.SetTextColor(LCD_COLOR_WHITE);
    
    SaiIO mySai(SaiIO::INPUT, 512+1, FS,
                INPUT_DEVICE_DIGITAL_MICROPHONE_2);
                Thread::wait(1000);
                int16_t xLn, xRn;
                mySai.Input(xLn, xRn); // haengt wenn ich das nicht mache  .. warum ??
                   

    while (1) {
        data_mutex.lock();        

         i++;
         
        sprintf(buf,"adc_read .. vor read %i",i);
        lcd.DisplayStringAt(0, LINE(2), (uint8_t *)buf, CENTER_MODE);       

            data_length = mySai.GetLength();
 
               for (int n=0; n<data_length; n++)
                {
                    int16_t xL, xR;
                    mySai.Input(xL, xR);
                    adc_data[n] = (float)xL;
                   
         sprintf(buf,"adc_read .. nach read %i length %i",n, data_length);
        lcd.DisplayStringAt(0, LINE(3), (uint8_t *)buf, CENTER_MODE);


                }
                mySai.ResetCaptured();
 
    
         sprintf(buf,"adc_read .. nach read %i length %i",i, data_length);
        lcd.DisplayStringAt(0, LINE(3), (uint8_t *)buf, CENTER_MODE);
        Thread::wait(100);
        data_mutex.unlock();     

    }
}
 
 void led2_thread2() {
    int i=0;
    char buf[50];
          lcd.SetTextColor(LCD_COLOR_WHITE);

    while (true) {
        sprintf(buf,"In der Thread2 %i",i++);
        led2 = !led2;
      //  lcd.Clear(LCD_COLOR_GREEN);
    //    lcd.DisplayStringAt(0, LINE(3), (uint8_t *)buf, CENTER_MODE);
        Thread::wait(100);
        
    }
}
int main() {
     int i=0;
    char buf[50];
    
    read_adc.start(adc_thread); 
    thread2.start(led2_thread2);
   
   // thread2.set_priority(osPriorityNormal);
    
    Thread msdTask(usb_task, NULL, osPriorityNormal, 1024 * 4);
    
     lcd.Clear(LCD_COLOR_BLACK);
     lcd.SetBackColor(LCD_COLOR_BLACK);
     lcd.SetTextColor(LCD_COLOR_WHITE);
     ButtonGroup bG(400, 200, 50, 30, 2, (string[]){"ON", "OFF"}, 0, 5, 1, 0);
 
    while (true) {

      wait(0.3);
      sprintf(buf,"In Main %i",i++);
       int num;
       if (bG.GetTouchedNumber(num)) sprintf(buf,"ist on");
     lcd.SetBackColor(LCD_COLOR_BLACK);

      lcd.DisplayStringAt(0, LINE(9), (uint8_t *)buf, CENTER_MODE);
      wait(.1);

     if(!num) {
 
         }
      
    }
}