Part 1 should work correctly if all of part 2 and sd card junk is commented out. Attempted to update the libraries multiple times but could not get code to compile. the error "overload function" kept appearing.

Dependencies:   4DGL-uLCD-SE MMA8452Q SDFileSystem bouncing_ball mbed

Fork of OCE360_4 by OCE_360

main.cpp

Committer:
jakebonney10
Date:
2017-11-17
Revision:
5:d432702334a9
Parent:
3:a7f02754bc99

File content as of revision 5:d432702334a9:

// A solution to OCE360 Homework #4.
// Objective: Use object oriented programming to create a system that displays
// multiple balls bouncing around the LCD screen.
// Stephen Licht, 11/7/2017

#include "mbed.h"
#include "MMA8452Q.h"           //acceleromater library
#include "uLCD_4DGL.h"          //LCD library
#include "bouncing_ball.h"      //new ball phyics library
#include "SDFileSystem.h"

#define UPDATE_TIME_S 0.02
#define START_X_1 10
#define START_Y_1 10
#define START_X_2 20
#define START_Y_2 20
#define RADIUS_1 6
#define RADIUS_2 3

#define DEBUG_MODE 0

// Variables for SD file system code
FILE *file;
float voltage_in;
float degrees_c;
int n = 0;
int c;

// Define Tickers/timers
Ticker flipper1; 
Ticker flipper2;
Timer timestamp;
Timer debounce;                 // debounce timer for Record external interrupt
Timer debounce2;                // debounce timer for LCDshow ecternal interrupt

//internal leds
DigitalOut myled2(LED2);
DigitalOut myled4(LED4);

//Function prototype for color selection and Ticker updates
int get_LCD_color(int color_integer);
void LCD_update(void);          // LCD screen update function prototype
void BALL_update(void);         // Ball update function prototype
void recording(void);           // Recording function prototype
void display(void);             // Display LCD screen function Prototype
void flip2() {                  // flip 2 function
 myled2 = !myled2;
}

// Temperature Analog input (pin 15)
AnalogIn ain(p15);

// External Interrupt inputs
InterruptIn record(p18);
InterruptIn LCDshow(p17);

// SD card (SPI pins)
SDFileSystem sd(p5, p6, p7, p8, "sd");

//Define Serial Terminal
Serial pc(USBTX, USBRX);

// Graphic LCD - TX, RX, and RES pins
uLCD_4DGL uLCD(p9,p10,p11);     //initialize a driver object for an LCD connected on pins 9-11

// Accelerometer - SDA, SCL, and I2C address
MMA8452Q accel(p28, p27, 0x1D);  //initialize a driver object for an accelerometer connected on pins 27-28.

physics_ball ball1;  //initialize two balls for bouncing
physics_ball ball2;  //the default states from the library will be used initially

int main()
{
    // led for ball update
    myled2 = 0;
    myled4 = 0;
    flipper2.attach(&flip2, .02);
    
    // Initialize uLCD
    uLCD.baudrate(115200);
    uLCD.background_color(BLACK);
    uLCD.cls();  
    
    // Initialize accelerometer
    accel.init();

    //Initialize balls:
    ball1.set_state(START_X_1,START_Y_1,0,0); //speeds are set to zero
    ball1.set_state(START_X_2,START_Y_2,0,0);

    //Set ball radius and color:
    ball1.set_param(RADIUS_1,0); //color is unimportant
    ball2.set_param(RADIUS_2,1); //just making sure the colors are different
    
    // Start Timers and Tickers
        debounce.start();
        debounce2.start();
    
    flipper2.attach(&BALL_update, 0.02); // update ball position @ 50hz
    flipper1.attach(&LCD_update, 0.0909); // update LCD screen @ 11hz
    
    //hardwareinterrupt
    record.rise(&recording);
    LCDshow.rise(&display);
            
    /* Make the balls "fall" in direction of accelerometer by forcing the ball objects
     to update themselves at regular intervals, and te drawing the locations reported
     by the ball objects on the LCD screen: */
    while (1) {  //execute 'forever'
    }
    }
        // Functions:
        void display()
}
        void LCD_update()  {   // LCD screen update function
    
    
        // Draw circles in the x and y positions stored by the ball objects:
        uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, get_LCD_color(ball1.color));
        uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, get_LCD_color(ball2.color));

        // Wait before erasing old circles:
        wait(UPDATE_TIME_S);         // In seconds

        // Erase old circles by writing over there locations using the screen color:
        uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, BLACK);
        uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, BLACK);

    }
        void BALL_update()      // BALL position update function
    {

        // Force the objects 'ball1' and 'ball2' to update their stored positions
        // and velocities:
        ball1.update(UPDATE_TIME_S,accel);
        ball2.update(UPDATE_TIME_S,accel);

        myled2=!myled2;
        
        // Potential way of counting updates
                n = n + 1;   
                
        void recording() { 
        
    if (debounce.read_ms()>200)    // only allow function if debounce timer   
        // Resets and starts time stamp timer
            timestamp.reset();
            timestamp.start();
        // Turn onboard LED on
            myled4 = 1;
            
    // Open file for writing
    file = fopen("/sd/temp_data.txt", "w");
    if ( file == NULL ) {
        error("ERROR: Could not open file for writing!\n\r");
        return -1;
    }

    // Tell the user we need to wait while we collect some data
    pc.printf("\nCollecting data (Do not remove SD Card!) ...\n\r");        
               
         // Collect temperatures with timestamps every second
    for(i = 0; i < 10; i++) {
        voltage_in = ain * 3.3;
        degrees_c = (voltage_in - 0.5) * 100.0;
        fprintf(file, "%2.2fs: %3.1f deg C\n\r", timer.read(), degrees_c);
        wait(1);
    }

    // Close file and re-open it for reading
    fclose(file);
    file = fopen("/sd/temp_data.txt", "r");
    if ( file == NULL ) {
        error("ERROR: Could not open file for reading!\n\r");
        return -1;
    }

    // Print results to console
    pc.printf("Temperature data:\n\r");
    while(1) {
       c = fgetc(file);
       if ( c == EOF ) {
           break;
       }
       pc.putc(c);
    }

    // Close the file and finish
    fclose(file);
    pc.printf("Done! Safe to remove SD card\n\r");

    return 0;
}


//Interpret LCD colors.
int get_LCD_color(int color_integer)
{
    switch (color_integer) {
        case 0:
            return(RED);
        case 1:
            return(BLUE);
        case 2:
            return(GREEN);
        default:
            return(WHITE);
    }
}