Projet S5 Lecture de l'accelerometre avec interruption

Dependencies:   mbed PowerControl

Fork of Projet_S5 by Jonathan Tousignant

main.cpp

Committer:
trixrabbit
Date:
2014-04-13
Revision:
13:d25fe10677e8
Parent:
12:16390cea4420
Child:
14:67f44035ef61

File content as of revision 13:d25fe10677e8:

#include "accelerometer.h"
#include "analyzer.h"
#include "interrupt.h"
#include <iostream>
#include <fstream>
#include "PowerControl/PowerControl.h"
#include "PowerControl/EthernetPowerControl.h"

Serial pc(USBTX, USBRX);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led4(LED4);
DigitalIn button(p30);

LocalFileSystem local("local");

void *accelerometer = Accelerometer_C_new();
void *analyzer = Analyzer_C_new();

bool rebound = true;
bool appuyer = false;

extern "C" void interruptCapture(void)
{
    if(rebound && !appuyer)
    {
        LPC_TIM2->TC = 0;       // clear timer counter
        LPC_TIM2->PC = 0;       // clear prescale counter
        LPC_TIM2->PR = 0;       // clear prescale register
        LPC_TIM2->MCR |= 0x03;  // interrupt and reset control
        LPC_TIM2->CCR = 0;  //no capture interupt
        rebound = false;
    }
    else if(!rebound && !appuyer)
    {
        led1 = 1;
        LPC_TIM2->MCR = 0;
        LPC_TIM2->CCR = (0x06 << 0);  //falling edge
        
        LPC_TIM1->TC = 0;       // clear timer counter
        LPC_TIM1->PC = 0;       // clear prescale counter
        LPC_TIM1->PR = 0;       // clear prescale register
        LPC_TIM1->IR |= 0xFF;
        LPC_TIM1->TCR = 0x01;   //enable timer 3
    
        appuyer = true;
        NVIC_EnableIRQ(TIMER1_IRQn); // Enable TIMER1 interrupt
        
        signed char* values = Accelerometer_C_getAccelValue(accelerometer);
        
        // Analyze data
        Analyzer_C_setInitial(values, analyzer);
    }
    else
    {
        led1 = 0;
        LPC_TIM2->CCR = (5 << 0);  //rising edge
        
        LPC_TIM1->TC = 0;       // clear timer counter
        LPC_TIM1->PC = 0;       // clear prescale counter
        LPC_TIM1->PR = 0;       // clear prescale register
        LPC_TIM1->IR |= 0xFF;
        LPC_TIM1->TCR = 0;      //disable timer 3
        
        appuyer = false;
        rebound = true;
        NVIC_DisableIRQ(TIMER1_IRQn); // Disable TIMER1 interrupt
        
        Analyzer_C_checkMouvement(analyzer);
    }
    
    
    LPC_TIM2->IR |= 0xFF;
}

extern "C" void interruptMatch(void)
{
    if(button)
    {
        led4 = !led4;
        signed char* values;
    
        values = Accelerometer_C_getAccelValue(accelerometer);
    
        pc.printf("\n\r x: %i, y: %i, z: %i; ", values[0],values[1],values[2]);
        
        // Analyze data
        Analyzer_C_setMinMax(values, analyzer);
        
        delete values;
    }
    
    LPC_TIM1->IR |= 0xFF; // Reset timer  
}

void initialize()
{
    //Initialize the analyzer
    Analyzer_C_Initialize(analyzer);

    //  CAPTURE 
    //  Enable the pins on the device to use TIMER CAP2.0 on pin 30
    LPC_PINCON->PINSEL0 |= 3 << 8;     //set pin 30 capture 2.0
    LPC_SC->PCONP |= (1 << 22);        // Timer2 power on
    
      //LPC_TIM2->MCR |= 3;             //interrupt and reset control
    LPC_TIM2->TC = 0;                   // clear timer counter
    LPC_TIM2->PC = 0;                   // clear prescale counter
    LPC_TIM2->PR = 0;                   // clear prescale register
    LPC_TIM2->MR0 = SystemCoreClock / 100; //match pour rebound
    
    LPC_TIM2->IR |= 0xFF;               // Clear CR0 interrupt flag
    LPC_TIM2->CCR = (5 << 0);           // enable cap2.0 rising-edge capture; interrupt on cap2.0 p.496
    LPC_TIM2->TCR = (1 << 1);           // reset timer
    LPC_TIM2->TCR = 1;                  // enable timer
    
    NVIC_EnableIRQ(TIMER2_IRQn);        // Enable timer2 interrupt
    NVIC_SetVector(TIMER2_IRQn, uint32_t(interruptCapture));
    
    //  TIMER 3
    //LPC_SC->PCONP |= 1 << 23;           // TIMER3 power on
        
    LPC_TIM1->MCR = 3;                  // Interrupt and reset control
    LPC_TIM1->TC = 0;                   // clear timer counter
    LPC_TIM1->PC = 0;                   // clear prescale counter
    LPC_TIM1->PR = 0;                   // clear prescale register
    LPC_TIM1->MR0 = SystemCoreClock / 100;
        
    LPC_TIM1->IR |= 0xFF;               // Clear MR0 interrupt flag
    LPC_TIM1->TCR = (1 << 1);           // Reset TIMER1
    LPC_TIM1->TCR = 0;                  // Disable timer
    
    //NVIC_EnableIRQ(TIMER1_IRQn);      // Enable TIMER1 interrupt
    NVIC_SetVector(TIMER1_IRQn, uint32_t(interruptMatch));
}

int main()
{
    string line;
    string filename = "/local/config.txt";
    
    PHY_PowerDown(); //power down ethernet interface 175mw
    
    
    ifstream myfile(filename.c_str());
    
    if (myfile.is_open())
    {
        while (getline(myfile,line))
        {
            if (line[0] != '#')
            {
                // Find hand
                if (line.find("Hand") != string::npos)
                {
                    if (line.compare(5,6,"L") == 0)
                        Analyzer_C_setHand(true, analyzer);
                    else
                        Analyzer_C_setHand(false, analyzer);
                }
            }
        }
        
        myfile.close();
        
        initialize();
        pc.printf("\n\rReady");
        
        while(true)
        {
           Sleep();
        }
    }
    
    return 0;
}