Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

main.cpp

Committer:
groygirard
Date:
2015-04-06
Revision:
33:ab4ff35d27ea
Parent:
29:9a932d354ae3
Child:
34:ac7c8d759009

File content as of revision 33:ab4ff35d27ea:

/* S5 Projet - Conception d'un systeme embarque reseaute
 * main.cpp
 *
 * @author Equipe de projet 2
 *
 */

// System libraries
#include "mbed.h"
#include "rtos.h"

// Proprietary libraries
#include "Cible.h"
#include "CountDown.h"
#include "FlexSensor.h"
#include "MMA8452Q.h"
#include "Structure.h"
#include "Xbee.h"

#define GO 0x01
#define ACTIVATE_ACCEL 1

Serial m_pc(USBTX, USBRX);
LocalFileSystem local("local"); // file system for config.txt

//PROTOTYPES DE FONCTION
void gunner(void const* args);
void rps(void const* args);
void airGuitar(void const* args);
void flex(void const* args);
void analyze_sensor_data(void const* args);
void configure_GUNNER();
void configure_RPS();
void configure_GUITAR();
void ReadConfig();
void timer2_init(void);
void flex_read(void const* args);

uint8_t play = 0;

FlexSensor flexSensors(p15, p16, p17);       // flex sensor 1.
Accel accel;
flex_t flex_data;
RtosTimer *sync;
GameMode_e mode = RPS;
short PanId;
Xbee* xbee = NULL;

Thread *threads[3];
Thread* gunner_thread_ptr = NULL;       // Possiblement mettre dans un tableau
Thread* rps_thread_ptr = NULL;          // avec des position codees
Thread* airguitar_thread_ptr = NULL;    // dans des define. guillaume
Thread* rps_read = NULL;
Thread* flex_thread_ptr = NULL;         // Lecture des entrées analogiques

Mail<flex_t, 32> mailbox_flex;
Mail<Mobile_Vers_Fixe, 32> mailbox_Mobile_Vers_Fixe;

extern "C" void TIMER2_IRQHandler(void)
{
    /*Flag du decodage - s'execute a chaque fronts, descendants et montants*/
    if ((LPC_TIM2->IR & 0x20) == 0x20) {
        LPC_TIM2->IR |= 0x20;     // clear Timer2 interrupt register
        threads[mode]->signal_set(0x02);
    }
}


int main(void const* args)
{
    m_pc.printf("==== PROGRAM START MOBILE ====\r\n");
    // Initializing the accelerometer

    ReadConfig(); //read config file
    m_pc.printf("PANID %#04x\r\n", PanId);
    xbee = new Xbee(PanId, p13, p14); //set PAN ID

#if ACTIVATE_ACCEL
    accel = Accel();
    accel.init_MMA8452();
    timer2_init();
#endif

    switch(mode) {
        case GUNNER:
            gunner_thread_ptr =  new Thread(gunner);
            flex_thread_ptr = new Thread(flex);
            m_pc.printf("gunner mode started\r\n");
            break;
        case RPS:
            flex_thread_ptr = new Thread(flex);
            rps_thread_ptr =  new Thread(rps);
            m_pc.printf("rps mode started\r\n");
            break;
        case AirGuitar:
            airguitar_thread_ptr = new Thread(airGuitar);
            break;
        default:
            break;
    }
    threads[GUNNER] = gunner_thread_ptr;
    threads[RPS] = rps_thread_ptr;
    threads[AirGuitar] = airguitar_thread_ptr;

    rps_read = new Thread(flex_read);

    while(true) {
    }
}

void timer2_init(void)
{
    LPC_PINCON->PINSEL0  |= 0xc00;      // set P0.5 to CAP2.1
    LPC_SC->PCONP    |= (1 << 22);      // Timer2 power on
    LPC_SC->PCLKSEL1 |= (1 << 12);      // Divide CCLK by 1 for Timer2
    LPC_TIM2->CCR    |= 0x30;           // set cap2.1 rising-edge/falling-edge and interrupt
    LPC_TIM2->TCR    |= (1 << 0);       // start Timer2
    LPC_TIM2->EMR     = 0x20;           //
    LPC_TIM2->IR     |= 0xFFFFFFFF;
    NVIC_EnableIRQ(TIMER2_IRQn);
}

void flex(void const* args)
{
    flexSensors.Run();
}


void gunner(void const* args)
{
    // local variables
    while(true) {
        Thread::signal_wait(0x02);
        flex_data = flexSensors.get_flex_values();
        Mobile_Vers_Fixe *mail = mailbox_Mobile_Vers_Fixe.alloc();
        mail->flexSensor = flex_data;
        mail->gants = 0x01;
        mail->accelData.x = 0x00;
        mail->accelData.y = 0x00;
        mail->accelData.z = 0x01;
        mailbox_Mobile_Vers_Fixe.put(mail);
    }
}

void configure_GUNNER()
{
    accel.set_TRANSIENT_MODE(0x18, 0x05, 0x08); // z plan transient motion detection
}

void rps(void const* args)
{
    // local variables
    m_pc.printf("RPS Start! \n\r");
    configure_RPS();
    uint8_t windup = 0;
    while(true) {
        Thread::signal_wait(0x02);
        windup++;
        m_pc.printf("Decide in : %d \n\r", windup);
        if(windup >= 3) {
            windup = 0;
            Thread::wait(500);
            flex_data = flexSensors.get_flex_values();
            Mobile_Vers_Fixe *mail = mailbox_Mobile_Vers_Fixe.alloc();
            mail->flexSensor = flex_data;
            mail->gants = 0x01;
            mail->accelData.x = 0x01;
            mail->accelData.y = 0x00;
            mail->accelData.z = 0x00;
            mailbox_Mobile_Vers_Fixe.put(mail);
            // send data frame to the fixed mbed for analyze
        }
        accel.clear_TRANSIENT_INTERRUPT();
    }
}

void flex_read(void const* args)
{
    while (true) {
        // attente et lecture d'un événement digital
        osEvent evtD = mailbox_flex.get();
        if (evtD.status == osEventMail) {
            flex_t *mail = (flex_t*)evtD.value.p;
            // écriture de l'événement en sortie (port série)
            m_pc.printf("Valeur des flex : %d, %d, %d\r\n" , mail->index, mail->majeur, mail->annulaire);
            mailbox_flex.free(mail);
        }
    }
}

void configure_RPS()
{
    accel.set_TRANSIENT_MODE(0x12, 0x05, 0x08);
}

void airGuitar(void const* args)
{
    // local variables

    while(true) {
        Thread::signal_wait(GO);
        // code...
    }
}

void configure_GUITAR()
{
}


//read config file
void ReadConfig()
{
    FILE* file = fopen("/local/config.txt","r");
    if (file != NULL) {
        char buffer[2];
        //char time;
        //char selector;

        fscanf(file, "%x", &buffer); //panID = 2 char
        //fscanf(file, "%d", &time); //read period = 1 decimal
        //fscanf(file, "%d", &selector); //end device selector = 1 decimal

        PanId = buffer[1] << 8 | buffer[0]; //set PAN ID global variable
        //ReadPeriod = time; //set read period global variable
        //EndDeviceSelection = selector; //set end device selection global variable

        fclose(file); //close file
    } else { //if file is not found
        m_pc.printf("ERROR AT CONFIG FILE \r\n");
    }
}