Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Revision:
25:184915935d68
Parent:
15:dc18545822b3
Child:
27:0c0dfdf8d953
--- a/main.cpp	Sat Mar 21 17:24:38 2015 +0000
+++ b/main.cpp	Thu Mar 26 15:41:15 2015 +0000
@@ -27,11 +27,12 @@
 void airGuitar(void const* args);
 void get_sensor_data(void const* args);
 void analyze_sensor_data(void const* args);
-void analyze_GUNNER(uint8_t axe_x);
-void analyze_RPS(uint8_t axe_z);
-void analyze_GUITAR(uint8_t axe_z);
+void analyze_GUNNER();
+void analyze_RPS();
+void analyze_GUITAR();
 void etat_de_jeu(void const *args);
 void reception_coord(void const *args);
+void timer2_init(void);
 
 uint8_t play = 0;
 
@@ -40,6 +41,7 @@
 FlexSensor annulaire(DIGITAL, p17);   // flex sensor 3.
 CountDown countDown;
 Accel accel;
+flex_t flex_data;
 FlexSensor flex;
 RtosTimer *sync;
 GameMode mode = RPS;
@@ -50,21 +52,28 @@
 Thread* rps_thread_ptr = NULL;          // avec des position codees
 Thread* airguitar_thread_ptr = NULL;    // dans des define. guillaume
 
-typedef struct {
-    accel_t accel_data;
-    flex_t flex_data;
-} sensors_t;
+
+Mail<flex_t, 32> mailbox_flex;
 
-Mail<sensors_t, 32> mailbox_sensors;
-
+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[2]->signal_set(0x02);
+    }
+}
 
 int main(void const* args)
 {
     // Initializing the accelerometer
     accel = Accel();
     accel.init_MMA8452();
-    RtosTimer timer(get_sensor_data, osTimerPeriodic, (void *)0);
-    sync = &timer;
+    timer2_init();
+
+    //RtosTimer timer(get_sensor_data, osTimerPeriodic, (void *)0);
+    //sync = &timer;
+    //sync->start(200);
 
     switch(mode) {
         case GUNNER:
@@ -80,17 +89,29 @@
             break;
     }
 
-    Thread thread0(reception_coord);
-    Thread thread1(etat_de_jeu);
+    //Thread thread0(reception_coord);
+    //Thread thread1(etat_de_jeu);
     Thread thread2(analyze_sensor_data);
-    threads[0] = &thread0;
-    threads[1] = &thread1;
-    threads[2] = &thread2;
+    // threads[0] = &thread0;
+    // threads[1] = &thread1;
+    threads[2] = rps_thread_ptr;
 
     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 gunner(void const* args)
 {
     // local variables
@@ -98,7 +119,7 @@
     countDown.run();
 
     while(true) {
-        // Thread::signal_wait(GO);
+        Thread::signal_wait(GO);
         cible->reset();
         int target = rand() % 3;
 
@@ -110,10 +131,23 @@
 void rps(void const* args)
 {
     // local variables
-
+    analyze_RPS();
+    uint8_t windup = 0;
     while(true) {
-        Thread::signal_wait(GO);
-        // code...
+        Thread::signal_wait(0x02);
+        windup++;
+        m_pc.printf("Decide in : %d \n\r", windup);
+        if(windup >= 3){
+            windup = 0;
+            Thread::wait(500);
+            flex_data = flex.get_flex_values();
+            flex_t *mail = mailbox_flex.alloc();
+            mail = &flex_data;
+            mailbox_flex.put(mail);
+            // send data frame to the fixed mbed for analyze
+        }
+        accel.clear_TRANSIENT_INTERRUPT();
+
     }
 }
 
@@ -130,27 +164,23 @@
 
 void get_sensor_data(void const* args)
 {
-    sensors_t *mail = mailbox_sensors.alloc();
-    mail->accel_data = accel.get_axis_values();
-    mail->flex_data = flex.get_flex_values();
-    m_pc.printf("I2C Communication success: Data received %d; %d; %d;\r\n", mail->accel_data.x, mail->accel_data.y, mail->accel_data.z);
-    mailbox_sensors.put(mail);
+    flex_data = flex.get_flex_values();
 }
 
-void analyze_GUNNER(uint8_t axe_x)
+void analyze_GUNNER()
 {
 }
 
-void analyze_RPS(uint8_t axe_z)
+void analyze_RPS()
 {
-    
+    accel.set_TRANSIENT_MODE(0x12, 0x05, 0x08);
 }
 
-void analyze_GUITAR(uint8_t axe_z)
+void analyze_GUITAR()
 {
 }
 
-void etat_de_jeu(void const *args)
+/*void etat_de_jeu(void const *args)
 {
 
     while(true) {
@@ -158,18 +188,18 @@
         m_pc.printf("Etat \r\n");
         switch(play) {
             case 0:
-                sync->stop();
+                accel.set_STANDBY_MODE();
                 break;
             case 1:
-                sync->start(250);
+                accel.set_TRANSIENT_MODE(0x12, 0x08, 0x05);
                 break;
             default:
                 break;
         }
     }
-}
+}*/
 
-void reception_coord(void const *args)
+/*void reception_coord(void const *args)
 {
     while(true) {
         if(play == 0) {
@@ -178,35 +208,27 @@
             Thread::wait(2000);
         } else {
             play = 0;
-            threads[1]->signal_set(0x1);
             Thread::wait(2000);
         }
     }
-}
+}*/
 
 void analyze_sensor_data(void const* args)
 {
     while (true) {
-        // attente et lecture d'un événement digital
-        osEvent evtD = mailbox_sensors.get();
-        if (evtD.status == osEventMail) {
-            sensors_t *mail = (sensors_t*)evtD.value.p;
-            // écriture de l'événement en sortie (port série)
-            m_pc.printf("Valeur des trois axes de l'accelerometre: %d, %d, %d\r\n" , mail->accel_data.x, mail->accel_data.y, mail->accel_data.z);
-            switch(mode) {
-                case GUNNER:
-                    analyze_GUNNER(mail->accel_data.x);
-                    break;
-                case RPS:
-                    analyze_RPS(mail->accel_data.z);
-                    break;
-                case AirGuitar:
-                    analyze_GUITAR(mail->accel_data.z);
-                    break;
-                default:
-                    break;
-            }
-            mailbox_sensors.free(mail);
+        // écriture de l'événement en sortie (port série)
+        switch(mode) {
+            case GUNNER:
+                analyze_GUNNER();
+                break;
+            case RPS:
+                //analyze_RPS();
+                break;
+            case AirGuitar:
+                analyze_GUITAR();
+                break;
+            default:
+                break;
         }
     }
 }