Program to read and display 3-axis acceleration data

Dependencies:   USBDevice mbed DipCortex-USB-EEProm

main.cpp

Committer:
johnhalfpenny
Date:
2015-09-11
Revision:
11:8eed6d69b336
Parent:
10:ba3a28345f76

File content as of revision 11:8eed6d69b336:

//
// Accellerometer project
//
// Laurence Halfpenny
// August 2015
 
#include <stdint.h>
#include <string.h>
#include "mbed.h"           // Needed for MBED library functions
#include "main.h"           // Needed for definitions of things that can be changed
#include "USBSerial.h"      // Needed for USB serial port
#include "DipCortex-EEprom.h"
#include "LPC13Uxx.h"          

// Define the X, Y & Z analogue inputs on ADCs
AnalogIn Z_in(P0_11);       // Z accelleration voltage
AnalogIn Y_in(P0_12);       // Y accelleration voltage
AnalogIn X_in(P0_13);       // X accelleration voltage

// On-board LED
DigitalOut LED(P0_1);

// Push button
// Logic FALSE when pushed, logic TRUE when no pushed
DigitalIn BUTTON(P0_16);

// Acceleration values
int Z_accelleration=0;
int Y_accelleration=0;
int X_accelleration=0;

// Storage arrays for X,Y,Z
// Pack them to save RAM space
#pragma pack(push,1)
uint16_t Z_store[MAXSAMPLES]={};
uint16_t Y_store[MAXSAMPLES]={};
uint16_t X_store[MAXSAMPLES]={};
#pragma pack(pop)

int Sample_index=0;
int Last_sample=0;
int EEPROM_index=0;

// Control variables
bool monitoring=FALSE;      // Controls whether monitoring is running or stopped

// Ticker for monitoring
Ticker monitor_tick;


// ------------------------------------------------------------------------------------------------------------
//  Read and Write the EEPROM 
// ------------------------------------------------------------------------------------------------------------


// ------------------------------------------------------------------------------------------------------------
//  Initialise the LPC1347 processor
// ------------------------------------------------------------------------------------------------------------
void init() 
{
    NVIC_SetPriority(SSP1_IRQn, 0x0); 
    NVIC_SetPriority(PIN_INT0_IRQn, 0x1);
    
    // SysTick set to lower priority than Wi-Fi SPI bus interrupt
    NVIC_SetPriority(SysTick_IRQn, 0x2); 
    
    
    // Enable RAM1
    LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26);
    
    // Clear the LED
    LED=FALSE;
    
    // Pull the BUTTON pin up to logic high
    BUTTON.mode(PullUp);
    
    // Initialise the IAP for EEPROM reading and writing
    IAP_Init();
}

// ------------------------------------------------------------------------------------------------------------
//  The monitoring software, triggered by the monitoring ticker
// ------------------------------------------------------------------------------------------------------------
void monitor_accelleration(void)
{
    LED = !LED;                         // Toggle the LED each sample
    
    X_accelleration=X_in.read_u16();    // Read and print X accelleration
    X_store[Sample_index]=X_accelleration;
    X_accelleration=(X_accelleration-(0xFFFF/2));  // Convert to change in accelleration 
    X_accelleration=X_accelleration/16;
    //pc.printf("X: %d ",X_accelleration);  

    Y_accelleration=Y_in.read_u16();    // Read and print Y accelleration
    Y_store[Sample_index]=Y_accelleration;
    Y_accelleration=(Y_accelleration-(0xFFFF/2));  // Convert to change in accelleration 
    Y_accelleration=Y_accelleration/16;
    //pc.printf("Y: %d ",Y_accelleration);  

    Z_accelleration=Z_in.read_u16();    // Read and print Z accelleration
    Z_store[Sample_index]=Z_accelleration;
    Z_accelleration=(Z_accelleration-(0xFFFF/2));  // Convert to change in accelleration 
    Z_accelleration=Z_accelleration/16;
    //pc.printf("Z: %d \r\n",Z_accelleration);  
    
    //pc.printf("Sample index: %d \r\n",Sample_index);  
    Sample_index++;
    
    if (Sample_index>=MAXSAMPLES)
        {
        //pc.printf("Stopping - full!\r\n");
        monitoring=FALSE;
        monitor_tick.detach();
        Last_sample=Sample_index;
        }
}

// ------------------------------------------------------------------------------------------------------------
//  main loop
// ------------------------------------------------------------------------------------------------------------
int main( void ) 
{   
int i;  // For controlling loops
char charIn = 0;
char prevCharIn = 0;
char Command = 0;
char j=0;    // For writing to clear EEPROM 

    // Initalise the LPC1347 & WiFiDIPCORTEX board
    init(); 
    
    // Wait for program to start
    wait(1);
    
    // If the BUTTON is pushed (logic FALSE) start logging otherwise go into keyboard menu
    if (BUTTON==FALSE)
        {
        
        // Start the monitoring
        Sample_index=0;
        monitoring=TRUE;
        monitor_tick.attach(&monitor_accelleration,MONITORINTERVAL);       
        
        // Wait for the monitoring to finish and then save it to EEPROM
        while (monitoring==TRUE)
            {
            // Just wait for monitoring to finish    
            wait(1);
            }
        
        // Now copy the storage arrays to EEPROM
        LED=TRUE;   // Turn LED solid on when writing to EEPROM
        IAP_Eeprom_Write(EEPROMBASEADDRESS, (uint8_t *)&X_store, sizeof(X_store));                                  // Write the X array
        IAP_Eeprom_Write(EEPROMBASEADDRESS+sizeof(X_store), (uint8_t *)&Y_store, sizeof(Y_store));                  // Write the Y array
        IAP_Eeprom_Write(EEPROMBASEADDRESS+sizeof(X_store)+sizeof(Y_store), (uint8_t *)&Z_store, sizeof(Z_store));  // Write the Z array
        
        // Now wait for ever just flashing LED
        while (TRUE)
            {
            LED=!LED;   // Flash the LED slowly at end
            wait(1);    
            }
        }
    else
        {
        USBSerial pc;               // open USB CDC serial port
        // Wait for terminal program to start
        wait(WAITATSTART);
        
        // Show the start banner
        pc.printf("\r\n");
        pc.printf("+-------------------------------------------+\r\n");
        pc.printf("|   3-axis accelleration measurer           |\r\n");
        pc.printf("|   Laurence Halfpenny                      |\r\n");
        pc.printf("|   Version 1.2                             |\r\n");
        pc.printf("+-------------------------------------------+\r\n");
    
        // Forever check for commands from the keyboard
        while (TRUE)
            {
            pc.printf("+-------------------------------------------+\r\n");
            pc.printf("|   V 1.2 MENU:                             |\r\n");
            pc.printf("|   1: Start monitoring                     |\r\n");
            pc.printf("|   2: Stop  monitoring                     |\r\n");
            pc.printf("|   3: Stop / Dump values                   |\r\n");
            pc.printf("|   4: Dump EEPROM values                   |\r\n");
            pc.printf("|   9: Clear EEPROM values                  |\r\n");
            pc.printf("+-------------------------------------------+\r\n");
                     
            // Get a command from the keyboard
            pc.printf("Enter command: ");         
            while (TRUE)
                {
                prevCharIn = charIn;
                charIn = pc.getc();
                pc.printf("%c", charIn);
                if ((charIn == '\n') || (charIn == '\r'))
                    {
                    break;
                    }
                }
            Command=prevCharIn;
                
            // Action the command
            switch(Command) 
                {
                case '1':      
                    pc.printf("Starting monitor\r\n");
                    Sample_index=0;
                    monitoring=TRUE;
                    monitor_tick.attach(&monitor_accelleration,MONITORINTERVAL);
                break;
                
                case '2':      
                    pc.printf("Stopping monitoring\r\n");
                    monitoring=FALSE;
                    LED=FALSE;
                    monitor_tick.detach();
                    Last_sample=Sample_index;
                break;
                
                case '3':
                    if (monitoring==TRUE)
                        {
                        pc.printf("Stopping monitoring\r\n");
                        monitoring=FALSE;
                        LED=FALSE;
                        monitor_tick.detach();
                        Last_sample=Sample_index;    
                        }
                    
                    if (Last_sample>0)
                        {
                        for (i=0; i<Last_sample; i++)
                            {
                            pc.printf("No.: %d ",i);     
                            pc.printf("X: %d ",X_store[i]);  
                            pc.printf("Y: %d ",Y_store[i]);    
                            pc.printf("Z: %d \r\n",Z_store[i]);        
                            }
                        }
                break;
                
                case '4':
                    pc.printf("Dumping EEPROM\r\n");     
                    // Read EEPROM into Storage arrays
                    IAP_Eeprom_Read(EEPROMBASEADDRESS, (uint8_t *)&X_store, sizeof(X_store));                                   // Read EEPROM into X array       
                    IAP_Eeprom_Read(EEPROMBASEADDRESS+sizeof(X_store), (uint8_t *)&Y_store, sizeof(Y_store));                   // Read EEPROM into Y array       
                    IAP_Eeprom_Read(EEPROMBASEADDRESS+sizeof(X_store)+sizeof(Y_store), (uint8_t *)&Z_store, sizeof(Z_store));   // Read EEPROM into Z array       
                    // Display them
                    for (i=0; i<MAXSAMPLES; i++)
                        {
                        pc.printf("No.: %d ",i);     
                        pc.printf("X: %d ",X_store[i]);  
                        pc.printf("Y: %d ",Y_store[i]);    
                        pc.printf("Z: %d \r\n",Z_store[i]);        
                        }
                break;
                
                case '9':
                    pc.printf("Clearing EEPROM\r\n");     
                    // Fill one of the arrays with zeros
                    for (i=0; i<MAXSAMPLES; i++)
                        {
                        X_store[i]=(uint16_t)j;    
                        }
                    // Write this array to X, Y & Z EEPROM stores
                    IAP_Eeprom_Write(EEPROMBASEADDRESS, (uint8_t *)&X_store, sizeof(X_store));              
                    IAP_Eeprom_Write(EEPROMBASEADDRESS+sizeof(X_store), (uint8_t *)&X_store, sizeof(X_store));            
                    IAP_Eeprom_Write(EEPROMBASEADDRESS+sizeof(X_store)+sizeof(Y_store), (uint8_t *)&X_store, sizeof(X_store));            
                break;
                
                default:
                    pc.printf("Invalid command\r\n");
                break;
                }
            }
        }

}