Leo Merel
/
APP4
APP4
Fork of rtos_basic by
Diff: main.cpp
- Revision:
- 14:42a7d108b134
- Parent:
- 13:3c020f9bfdc7
- Child:
- 15:872151771dec
diff -r 3c020f9bfdc7 -r 42a7d108b134 main.cpp --- 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); + } }