APP4

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Files at this revision

API Documentation at this revision

Comitter:
leomerel
Date:
Sun Oct 21 21:54:28 2018 +0000
Parent:
13:3c020f9bfdc7
Child:
15:872151771dec
Commit message:
Envoi fini et debut reception

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Oct 12 18:47:00 2018 +0000
+++ b/main.cpp	Sun Oct 21 21:54:28 2018 +0000
@@ -1,57 +1,243 @@
 #include "mbed.h"
-
-//Jean-Philippe
+#include "rtos.h"
 
-DigitalOut myled(p18);
+DigitalOut dout(p18);
+InterruptIn button(p5);
+DigitalOut led(LED1);
+DigitalOut flash(LED4);
 
-/*#define PREAMBULE 01010101
-#define START 01111110
-#define END 01111110*/
-
+int periode = 10; //10ms
 bool PREAMBULE[] = {0,1,0,1,0,1,0,1};
 bool START_END[] = {0,1,1,1,1,1,1,0};
+Thread envoi_t;
+Thread reception_t;
+Mutex mutex;
+Mail<bool,16> mailbox;
 
-bool message[16] = {0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0};
+bool messageUtile[64] = {0,0,1,0,1,1,1,0,
+                        1,0,1,0,0,0,0,0,
+                        0,0,1,1,1,0,1,0,
+                        1,1,0,0,0,1,1,0,
+                        0,1,0,1,1,0,1,1,
+                        1,0,1,0,1,1,1,0,
+                        0,0,1,0,1,0,0,0,
+                        1,0,1,0,1,1,0,0};
 
-//convert to Manchester
-void convertToManchester(bool message)
-{
-    if(message == 0){
-        myled = 0;
-        wait_ms(10);
-        myled = 1; 
-        wait_ms(10);
+//convert length from int to binary -----------------------------------------------------------------------------------------------------
+bool r;
+void int_to_bin(bool bin[8], int length){ //Fonctionne
+    int i = 0;
+    while(length >0 || i<8){
+        r = length%2;
+        length/=2;
+        bin[7-i]=r;
+        i++;
+    }
+    while(i<8){
+        bin[i]=0;
+        i++;   
+    }
+}
+
+//convert to Manchester ------------------------------------------------------------------------------------------------
+void convertBitToManchester(bool *manchester, bool bit){ //Fonctionne
+    if(bit == 0){
+        manchester[0]=0;
+        manchester[1]=1;
     } 
-    else if(message == 1){
-        myled = 1;
-        wait_ms(10);
-        myled = 0; 
-        wait_ms(10);  
+    else if(bit == 1){
+        manchester[0]=1;
+        manchester[1]=0; 
     }
 }
 
-//detection du préambule
+void convertByteToManchester(bool *manchester, bool byte[8]){ //Fonctionne
+    for(int i=0; i<8; i++){
+        if(byte[i] == 0){
+            manchester[i*2]=0;
+            manchester[i*2+1]=1;
+        } 
+        else if(byte[i] == 1){
+            manchester[i*2]=1;
+            manchester[i*2+1]=0; 
+        }     
+    }     
+}
 
-//decode Manchester
-
-void decodeManchester(bool *data){
+void convertMessageToManchester(bool *manchester, bool *message, int length){
+        for(int i=0; i<length; i++){
+            if(message[i] == 0){
+                manchester[i*2]=0;
+                manchester[i*2+1]=1;
+            } 
+            else if(message[i] == 1){
+                manchester[i*2]=1;
+                manchester[i*2+1]=0; 
+            }   
+        }     
 }
 
-//envoie des trames
+//création d'une trame  --------------------------------------------------------------------------------------------------------------
+void creationTrame(bool *message, int length){ //Fonctionne
+    printf("OK1 \r\n");
+    bool bin[8];
+    int_to_bin(bin, length);
+    printf("OK2 \r\n");
+    for(int i=0; i<8; i++){
+        *message=PREAMBULE[i];
+        message++;
+    }
+     printf("OK3 \r\n");
+    for(int i=0; i<8; i++){
+        *message=START_END[i];
+        message++;
+    }
+    for(int i=0; i<8; i++){
+        *message=0;
+        message++;
+    }
+    for(int i=0; i<8; i++){
+        *message=bin[i];
+        message++;
+    }
+    for(int i=0; i<sizeof(messageUtile); i++){
+        *message=messageUtile[i];
+        message++;        
+    }
+    //CRC16
+    for(int i=0; i<8; i++){
+        *message=0;
+        message++;        
+    }
+    for(int i=0; i<8; i++){
+        *message=START_END[i];
+        message++;
+    }            
+}
+
+//Envoi d'une trame ----------------------------------------------------------------------------------------------------------------
+void envoiTrame(){
+    int length3 = sizeof(messageUtile);
+    bool message3[length3+6*8];
+    bool manchester3[(length3+6*8)*2];
+    
+    creationTrame(message3,length3);
+    convertMessageToManchester(manchester3, message3,length3+6*8);
+    
+    for(int i=0; i<sizeof(manchester3); i++){
+        dout = manchester3[i];
+        Thread::wait(periode);   
+    }
+}
+
+//CRC16 (détection des erreurs) ----------------------------------------------------------------------------------------------------
+unsigned short crc16(const unsigned char* data_p, unsigned char length){
+    unsigned char x;
+    unsigned short crc = 0xFFFF;
+
+    while (length--){
+        x = crc >> 8 ^ *data_p++;
+        x ^= x>>4;
+        crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
+    }
+    return crc;
+}
+
+//detection du préambule
+void detectionPreambule() {
+    while(1){
+        printf("\r\n C'est bon \r\n");
+        mutex.lock();
+    }
+}
+
 //reception des trames
+void receptionTrames(){
+     printf("\r\n C'est bon 2 \r\n");
+      
+}
+
+//decode Manchester ------------------------------------------------------------------------------------------------------------------
+void decodeManchester(bool *data){
+    
+}
+
+
+
 //assemblage des trames
 //desassemblage des trames
-//CRC16 (détection des erreurs)
 
 
+void flip() {
+    led = !led;
+    //printf("\r\n C'est bon \r\n");
+}
+ 
+
 int main() {
-    while(1) {
+    /*while(1) {
        for(int i=0; i<sizeof(message); i++){
            convertToManchester(message[i]);
            printf("OK\r\n");
        }
-       wait(1);
-    }
+       wait(1);*/
+       /*int length = sizeof(message);
+       printf("%d \r\n", length);
+       printf("Binary length : ");
+       for(int i=0; i<8; i++){
+           printf("%d",bin[i]);
+       }
+       printf("\r\n");*/
+       
+       int length = sizeof(messageUtile);
+       bool message[length+6*8];
+       creationTrame(message,length);
+       printf("Message : ");
+       for(int i=0; i<sizeof(message); i++){
+           if(i>0 && i%8 == 0){
+               printf(" ");
+           }
+           printf("%d",message[i]);
+       }
+       printf("\r\n");
+       
+       
+       bool manchester[16];
+       bool byte[8] = {0,1,0,0,1,1,1,0};
+       convertByteToManchester(manchester,byte);
+       printf("Manchester : ");
+       for(int i=0; i<16; i++){
+           if(i>0 && i%2 == 0){
+               printf(" ");
+           }
+           printf("%d",manchester[i]);
+       }
+       printf("\r\n");
+       
+       int length2 = sizeof(messageUtile);
+       bool message2[length2+6*8];
+       bool manchester2[(length2+6*8)*2];
+       creationTrame(message2,length2);
+       convertMessageToManchester(manchester2, message2, length2+6*8);
+       printf("Message : \r\n");
+       for(int i=0; i<sizeof(manchester2); i++){
+           if(i>0 && i%16 == 0){
+               printf("\r\n");
+           }
+           if(i>0 && i%2 == 0){
+               printf(" ");
+           }
+           printf("%d",manchester2[i]);
+       }
+       printf("\r\n");
+       
+       envoi_t.start(envoiTrame);
+       reception_t.start(receptionTrames);
+        button.rise(&flip);  // attach the address of the flip function to the rising edge
+        while(1) {           // wait around, interrupts will interrupt this!
+            flash = !flash;
+            wait(0.25);
+        }
 }