APP3 / Mbed 2 deprecated APP4

Dependencies:   mbed mbed-rtos

Files at this revision

API Documentation at this revision

Comitter:
EmileArseneault
Date:
Wed Mar 08 02:59:25 2017 +0000
Parent:
5:25101883c27a
Commit message:
Merge dans un ?tat l?thargique

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Mar 07 18:33:03 2017 +0000
+++ b/main.cpp	Wed Mar 08 02:59:25 2017 +0000
@@ -11,13 +11,20 @@
 
 DigitalOut myled(LED1);
 DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
 InterruptIn rX(p27);
 DigitalOut tX(p28);
 Serial pc(USBTX, USBRX);
 
+Mail<char [83], 4> textToPrint;
 Queue<int, 1500> envoi;
+Queue<int, 1500> recoit;
+Queue<int, 200> rise_n_fall_queue;
 Thread* listeningThread;
 Thread* Push_data;
+osThreadId mainThread;
+Semaphore ecriture(0);
 
 
 void printBin(uint16_t data)
@@ -274,12 +281,15 @@
     // Emile
     // thread.signal_set(0x1);
     // Synchronize with wire
+    pc.printf("SendBits - len %d\r\n", len);
+    pc.printf("Waiting\r\n");
+    //Thread::signal_wait(1);
+    ecriture.wait();
     for (int i = 0; i < len; i++)
     {
         envoi.put((int *) bits[i]);
     }
     Push_data->signal_set(0x1);
-    
     //ReceiveBits(bits, len);
 }
 
@@ -293,8 +303,8 @@
     {
         tmp[i + 2 * 8] = data[i];
     }
-    AddStartEnd(tmp + (len + 3 - 1) * 8);
-    SendBits(tmp, len + 3 * 8);
+    AddStartEnd(tmp + len + (2 * 8));
+    SendBits(tmp, len + (3 * 8));
 }
 
 void SendManchester(char* data, int len)
@@ -338,14 +348,26 @@
     }
 }
 
-void ReceiveText(char* data)
+void ReceiveText()
 {
-    pc.printf("Received: %s\r\n", data);
+    while (1)
+    {
+        osEvent evt = textToPrint.get();
+        if (evt.status == osEventMail){
+            led3 = 1;
+            char * message = (char *) evt.value.p;
+            pc.printf("Received: %s\r\n", message);
+            //ReceiveBits((bool *) message->bits, message->len);
+            textToPrint.free((char (*)[83]) message);
+        }
+    }
+    
 }
 
 void ReceiveFormated(char* data, int len)
 {
     pc.printf("ReceiveFormated - len %d\r\n", len);
+    //pc.printf("%c%c\r\n",data[2], data[3]);
     char tmp[len - 2];
     int id, frame, frames, predicted_len;
     AnalyseHeading(data, &id, &frame, &frames, &predicted_len);
@@ -371,8 +393,17 @@
     if (tmp[len - 4] == data[len - 2] && tmp[len - 3] == data[len - 1])
     {
         tmp[len - 4] = '\0';
-        led2= 1;
-        ReceiveText(tmp);
+        char* toPrint = (char *)textToPrint.alloc();
+        int i = 0;
+        for (; i < len - 3; i++)
+        {
+            toPrint[i] = tmp[i];
+        }
+        toPrint[i] = '\r';
+        toPrint[i+1] = '\n';
+        toPrint[i + 2] = '\0';
+        
+        textToPrint.put((char (*)[83]) toPrint);
     }
     else
     {
@@ -395,6 +426,7 @@
 
 void ReceiveBits(bool* data, int len)
 {   
+    /*
     if (compareBoolArray(data, PREAMBULEBOOL))
     {
         data += 8;
@@ -404,7 +436,7 @@
     {
         pc.printf("DEBUG -- Received payload with wrong Preambule.");PrintBoolArray(data , 8);pc.printf("\r\n");
         return;
-    }
+    }*/
     
     // Ensure Start and end are present
     if (compareBoolArray(data, STARTENDBOOL) || compareBoolArray(data + (len - 8), STARTENDBOOL))
@@ -447,7 +479,7 @@
 {
     LPC_SC->PCLKSEL1 |=1<<12;       //pclk = cclk timer2
     LPC_SC->PCONP |=1<<22;          //timer2 power on
-    LPC_TIM2->MR0 = 9600000;          //100 msec
+    LPC_TIM2->MR0 = 960000;          //10 msec
     LPC_TIM2->MCR = 3;              //interrupt and reset control
                                     //3 = Interrupt & reset timer2 on match
                                     //1 = Interrupt only, no reset of timer0
@@ -458,25 +490,37 @@
 
 void SendData()
 {
+    bool releaseSent = false;
     bool fin = false;
     int valeur = 0;
     
     while(true)
     {
-        Thread::signal_wait(1);
+        //osSignalSet(mainThread, 1);
+        if (!releaseSent)
+            {
+                pc.printf("Release sent\r\n");
+                ecriture.release();
+                releaseSent = true;
+            }
+        //pc.printf("SendData Waiting\r\n");
+        
+        //Thread::signal_wait(1);
         
         while(!fin)
         {
-            osEvent evt = envoi.get();
+            osEvent evt = envoi.get(1000);
             if (evt.status == osEventMessage) 
             {
                 valeur = (int)evt.value.p;
                 Thread::signal_wait(2);
                 tX = valeur;
+                releaseSent = false;
             }
             else
             {
                 fin = true;
+                tX = 1;
             }
             
         }
@@ -484,17 +528,141 @@
     }
 }
 
+void StartEnd(int intervale)
+{
+    bool End = false;
+    bool Start = false;
+    bool data[1500] = {0};
+    int i = 0;
+    bool ones[8] = {1, 1, 1, 1, 1, 1, 1, 1};
+
+    while(!End)
+    {
+        wait_us(intervale);
+        data[i] = rX.read();
+        led2 = data[i];
+        // Regarde si 3 valeurs consécutives sont 0
+        if (i >= 2)
+        {
+            if ((data[i-2] == data[i-1]) && (data[i] == data[i-1]) && (data[i] == 0))
+            {
+                printf("Ligne coupee\r\n");
+                return;   
+            }
+        }
+        
+        // Comparer pour les séquence de bits de fin et start
+        if (i >= 7)
+        {
+            if (compareBoolArray(ones, &(data[i-7])))
+            {
+                printf("Court_circuit\r\n");
+                return;
+            }
+            if (compareBoolArray(STARTENDBOOL, &(data[i-7])))
+            {
+                if (!Start)
+                {
+                    Start = true;
+                }
+                else
+                {
+                    ReceiveBits(data, i+1);
+                    End = true;
+                }
+            } 
+        }
+        i++;
+    }
+}
+
+void Preambule_Check(void const *args) 
+{
+    int position = 1;
+    int valeur = 0;
+    int preambule[8] = {0, 1, 0, 1, 0, 1, 0, 1};
+    int timeBetween[6] = {0};
+    int sum;
+    int intervale = 0;
+    Timer t;
+    
+    while(true)
+    {
+        osEvent evt = rise_n_fall_queue.get();
+        if (evt.status == osEventMessage) 
+        {
+            valeur = (int)evt.value.p;
+            if (valeur == preambule[position])
+            {
+                if (position > 1)
+                {
+                    t.stop();
+                    timeBetween[position - 2] = t.read_us();
+                    t.reset();
+                    t.start();
+                }
+                else
+                {
+                    t.stop();
+                    t.reset();
+                    t.start();   
+                }
+            
+                if (position < 7)
+                {
+                    position++;
+                }
+                else
+                {
+                    // Calculer la moyenne (pt oter les valeurs extrèmes s'il y en a)
+                    sum = 0;
+                    for (int i =0; i < 6; i++)
+                    {
+                        sum += timeBetween[i];
+                    }
+                    intervale = sum/6;
+                    StartEnd(intervale);
+                    wait(0.5);
+                    position = 1;
+                    led4 = !led4;
+                }
+            }
+            else
+            {
+                position = 1;   
+            }
+        }
+    }
+}
+
+void Call_Preambule_Rise()
+{
+    rise_n_fall_queue.put((int *)1, 0);
+}
+
+void Call_Preambule_Fall()
+{
+    rise_n_fall_queue.put((int *)0, 0);
+}
+
 void TestManchester();
 void TestUtility();
 void mainRaph()
 {
     //TestUtility();
    // TestManchester();
-   SendText("A more complex sentence to prove our algorithm is robust!", 57);
-   wait(1);
-    SendText("OK", 2);
-    wait(1);
-    SendText("A more complex sentence to prove our algorithm is robust!", 57);
+   //SendText("A more complex sentence to prove our algorithm is robust!", 57);
+   //wait(10);
+   tX = 0;
+   wait_us(100);
+   tX= 1;
+   wait_us(100);
+   tX = 0;
+    //SendText("OK", 2);
+    //wait(4);
+    //SendText("OK", 2);
+    //wait(1);
+    //SendText("A more complex sentence to prove our algorithm is robust!", 57);
 }
 
 void tick()
@@ -505,15 +673,23 @@
     Ticker ticker;
     ticker.attach(&tick, 0.5);
     timer2_init();
+    mainThread = osThreadGetId(); 
     
     listeningThread = new Thread();
     listeningThread->start(Listening);
     
+    Thread get_data_thread(Preambule_Check);
     Thread push_thread(SendData);
+    Thread printing(ReceiveText);
     Push_data = &push_thread;
     
+    rX.rise(Call_Preambule_Rise);
+    rX.fall(Call_Preambule_Fall);
+    
     mainRaph();
-    while (1){}
+    led3 = 1;
+    while (1){
+        }
 }
 
 //--------------------------------TEST---------------------------------------------------//