Lab 2 for ECE 2036 (work in progress)

Dependencies:   mbed 4DGL-uLCD-SE SDFileSystem PinDetect

main.cpp

Committer:
jmcmath
Date:
2019-02-11
Revision:
0:f10415100c39

File content as of revision 0:f10415100c39:

#include "mbed.h"
#include "uLCD_4DGL.h"
#include "AnalogIn.h"

#include "Speaker.h"
#include "PinDetect.h"

#include "SDFileSystem.h"
#include <string>

#include "MMA8452.h"

uLCD_4DGL uLCD(p9, p10, p11);          // used in all parts

Speaker mySpeaker(p21);                // used in parts 4 and 6

SDFileSystem sd(p5, p6, p7, p8, "sd"); // used in part 5

Serial pc(USBTX,USBRX);                // used in part 6

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

PinDetect pb1(p16);
PinDetect pb2(p17);
PinDetect pb3(p18);
PinDetect selector(p14);

int currentPart = 1; // global placeholder

void part1() // What's up mbed!
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 1:\n  What's up mbed!\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    uLCD.printf("\nWhat's up mbed!\n");
}

void part2() // Bouncing Ball
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 2:\n  Bouncing Balls\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    uLCD.display_control(PORTRAIT);
    uLCD.cls();
    uLCD.printf("Bouncing Ball");
    uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display
    wait(1.0);
    
    //Set up initial conditions
    float fx=50.0,fy=21.0,vx=0.4,vy=0.3;
    int x=50,y=21,radius=4;
    uLCD.background_color(BLACK);
    uLCD.cls();
    
    //draw borders
    uLCD.line(0, 0, 127, 0, WHITE);
    uLCD.line(127, 0, 127, 127, WHITE);
    uLCD.line(127, 127, 0, 127, WHITE);
    uLCD.line(0, 127, 0, 0, WHITE);
    
    for (int i=0; i<1500; i++)
    {
        //draw ball
        uLCD.circle(x, y, radius, RED);
        //bounce off edge walls and slow down a bit
        if ((x<=radius+1) || (x>=126-radius)) vx = -.95*vx;
        if ((y<=radius+1) || (y>=126-radius)) vy = -.95*vy;
        //erase old ball location
        uLCD.filled_circle(x, y, radius, BLACK);
        //calculate new ball position
        fx=fx+vx;
        fy=fy+vy;
        x=(int)fx;
        y=(int)fy;
    } //end for loop
}

void part3() // Digital Thermometer
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 3:\n  Digital\n  Thermometer\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    class TMP36
    {
        public:
            TMP36(PinName pin);
            TMP36();
            float read();
        private:
            AnalogIn _pin;
    };

    TMP36::TMP36(PinName pin) : _pin(pin) {} //This is an initializer list … pass pin to AnalogIn constructor
    float TMP36::read()
    {
        //convert sensor reading to C
        return ((_pin.read() * 3.3) - 0.500) * 100.0;
        // _pin.read() returns normalized voltage value as float
    }

    //instantiate new class to set p15 to analog input
    //to read and convert TMP36 sensor's voltage output
    TMP36 myTMP36(p15);

    float tempC, tempF;
    while(1)
    {
        tempC = myTMP36.read();
        // convert to F
        tempF = (9.0 * tempC) / 5.0 + 32.0;
        // print current temp
        uLCD.cls();
        uLCD.printf("\n%5.2f C\n%5.2f F\n\n", tempC, tempF);
        wait(0.5);
    }
}

void part4() // Jazzy Tunes
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 4:\n  Jazzy Tunes\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    void pb1_hit_callback (void)
    {
        myled1 = !myled1;
        mySpeaker.PlayNote(200.0,0.25,0.1);
    }
    //------------------------------------------------------------------------------
    // Callback routine is interrupt activated by a debounced pb2 hit
    // That is … this code runs with interrupt is generated by second button press
    void pb2_hit_callback (void)
    {
        myled2 = !myled2;
        mySpeaker.PlayNote(400.0,0.25,0.1);
    }
    //------------------------------------------------------------------------------
    // Callback routine is interrupt activated by a debounced pb3 hit
    // That is … this code runs with interrupt is generated by third button press
    void pb3_hit_callback (void)
    {
        myled3 = !myled3;
        mySpeaker.PlayNote(800.0,0.25,0.1);
    }
    //------------------------------------------------------------------------------

    //setup push buttons
    pb1.mode(PullUp);
    pb2.mode(PullUp);
    pb3.mode(PullUp);
    // Delay for initial pullup to take effect
    wait(.01);
    // Setup Interrupt callback functions for a pb hit
    pb1.attach_deasserted(&pb1_hit_callback);
    pb2.attach_deasserted(&pb2_hit_callback);
    pb3.attach_deasserted(&pb3_hit_callback);
    // Start sampling pb inputs using interrupts
    pb1.setSampleFrequency();
    pb2.setSampleFrequency();
    pb3.setSampleFrequency();
    // pushbuttons now setup and running
    while(1)
    {
        myled4 = !myled4;
        wait(0.5);
    }
}

void part5_1() // Hello Micro SD Card - Writing
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 5.1:\n  Hello Micro SD\n  Card - Writing\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    uLCD.printf("Hello Micro SD\nCard!\n");
    mkdir("/sd/mydir", 0777);
    FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
    if(fp == NULL) 
    {
        uLCD.printf("Error on open \n");
    }
    fprintf(fp, "I love ECE2036");
    fclose(fp);
}

void part5_2() // Hello Micro SD Card - Reading
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 5.2:\n  Hello Micro SD\n  Card - Reading\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    string inputString;
    uLCD.printf("Content of sdtest.txt is: \n");
    FILE *fp = fopen("/sd/mydir/sdtest.txt", "r");
    if(fp == NULL) 
    {
        uLCD.printf("Error on open \n");
    }
    else
    {
        while (fscanf(fp,"%s", inputString)!= EOF) //reads in a string delineated by white space
        {
            uLCD.printf("%s ", inputString.c_str());
        }
    }
    fclose(fp);
}

void part6() // Triple Axis Accelerometer
{
    // begin transition code
    uLCD.cls();
    uLCD.printf("\nLab 2 - part 6:\n  Triple Axis\n  Accelerometer\n");
    wait(2);
    uLCD.cls();
    // end transition code
    
    
    // you can play around with the parameters to see the response
    int radius = 10;
    int offsetx = 63;
    int offsety = 63;
    double factor = 50;
    double music_factor = 200;
    bool MusicOn = false;
   
    //set the push buttons that control sounds
    pb1.mode(PullUp);
    pb2.mode(PullUp);
    //I will not use interupts like in jazzy tunes
 
   
    double x = 0, y = 0, z = 0;
 
    MMA8452 acc(p28, p27, 40000);  //instantiate an acc object! 
   
    //set parameters -- use these and don't change
    acc.setBitDepth(MMA8452::BIT_DEPTH_12);
    acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
    acc.setDataRate(MMA8452::RATE_100);
   
   
    while(1) 
    {
        uLCD.circle(-1*y*factor+offsety, -1*x*factor+offsetx, radius, BLACK);
       
        if(!acc.isXYZReady()) 
        {
            wait(0.01);
        }
        else
        { 
            acc.readXYZGravity(&x,&y,&z); //notice this is passed by reference use pointers
      
            uLCD.circle(-1*y*factor+offsety, -1*x*factor+offsetx, radius, WHITE);
      
            if (MusicOn) mySpeaker.PlayNote(440.0+x*music_factor,0.25+0.2*y,0.05);
      
            if (pb1 == true) MusicOn = true;
           
            if (pb2 == false) MusicOn = false;
                 
            // You can uncomment this line to see the values coming off the MMA8452           
            uLCD.cls();
            uLCD.printf("\n(%.2f,%.2f,%.2f)  \n", x,y,z);
      
        } //end else
      
    } //end infinite while loop
}

void main_callback()
{
    switch (currentPart)
    {
        case 1: part1();
                currentPart++;
                break;
        case 2: part2();
                currentPart++;
                break;
        case 3: part3();
                currentPart++;
                break;
        case 4: part4();
                currentPart++;
                break;
        case 5: part5_1();
                part5_2();
                currentPart++;
                break;
        case 6: part6();
                currentPart = 1;
                break;
        
    }
}

int main() {
    selector.mode(PullUp);
    wait(.01);
    selector.attach_deasserted(&main_callback);
    selector.setSampleFrequency();
    while(1) 
    {
        continue;
    }
}