APP4

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Committer:
leomerel
Date:
Sun Oct 21 21:54:28 2018 +0000
Revision:
14:42a7d108b134
Parent:
13:3c020f9bfdc7
Child:
15:872151771dec
Envoi fini et debut reception

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
leomerel 14:42a7d108b134 2 #include "rtos.h"
jpbaillargeon 13:3c020f9bfdc7 3
leomerel 14:42a7d108b134 4 DigitalOut dout(p18);
leomerel 14:42a7d108b134 5 InterruptIn button(p5);
leomerel 14:42a7d108b134 6 DigitalOut led(LED1);
leomerel 14:42a7d108b134 7 DigitalOut flash(LED4);
leomerel 12:cfa3dec9e9a3 8
leomerel 14:42a7d108b134 9 int periode = 10; //10ms
leomerel 12:cfa3dec9e9a3 10 bool PREAMBULE[] = {0,1,0,1,0,1,0,1};
leomerel 12:cfa3dec9e9a3 11 bool START_END[] = {0,1,1,1,1,1,1,0};
leomerel 14:42a7d108b134 12 Thread envoi_t;
leomerel 14:42a7d108b134 13 Thread reception_t;
leomerel 14:42a7d108b134 14 Mutex mutex;
leomerel 14:42a7d108b134 15 Mail<bool,16> mailbox;
leomerel 12:cfa3dec9e9a3 16
leomerel 14:42a7d108b134 17 bool messageUtile[64] = {0,0,1,0,1,1,1,0,
leomerel 14:42a7d108b134 18 1,0,1,0,0,0,0,0,
leomerel 14:42a7d108b134 19 0,0,1,1,1,0,1,0,
leomerel 14:42a7d108b134 20 1,1,0,0,0,1,1,0,
leomerel 14:42a7d108b134 21 0,1,0,1,1,0,1,1,
leomerel 14:42a7d108b134 22 1,0,1,0,1,1,1,0,
leomerel 14:42a7d108b134 23 0,0,1,0,1,0,0,0,
leomerel 14:42a7d108b134 24 1,0,1,0,1,1,0,0};
leomerel 12:cfa3dec9e9a3 25
leomerel 14:42a7d108b134 26 //convert length from int to binary -----------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 27 bool r;
leomerel 14:42a7d108b134 28 void int_to_bin(bool bin[8], int length){ //Fonctionne
leomerel 14:42a7d108b134 29 int i = 0;
leomerel 14:42a7d108b134 30 while(length >0 || i<8){
leomerel 14:42a7d108b134 31 r = length%2;
leomerel 14:42a7d108b134 32 length/=2;
leomerel 14:42a7d108b134 33 bin[7-i]=r;
leomerel 14:42a7d108b134 34 i++;
leomerel 14:42a7d108b134 35 }
leomerel 14:42a7d108b134 36 while(i<8){
leomerel 14:42a7d108b134 37 bin[i]=0;
leomerel 14:42a7d108b134 38 i++;
leomerel 14:42a7d108b134 39 }
leomerel 14:42a7d108b134 40 }
leomerel 14:42a7d108b134 41
leomerel 14:42a7d108b134 42 //convert to Manchester ------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 43 void convertBitToManchester(bool *manchester, bool bit){ //Fonctionne
leomerel 14:42a7d108b134 44 if(bit == 0){
leomerel 14:42a7d108b134 45 manchester[0]=0;
leomerel 14:42a7d108b134 46 manchester[1]=1;
leomerel 12:cfa3dec9e9a3 47 }
leomerel 14:42a7d108b134 48 else if(bit == 1){
leomerel 14:42a7d108b134 49 manchester[0]=1;
leomerel 14:42a7d108b134 50 manchester[1]=0;
emilmont 1:491820ee784d 51 }
emilmont 1:491820ee784d 52 }
leomerel 12:cfa3dec9e9a3 53
leomerel 14:42a7d108b134 54 void convertByteToManchester(bool *manchester, bool byte[8]){ //Fonctionne
leomerel 14:42a7d108b134 55 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 56 if(byte[i] == 0){
leomerel 14:42a7d108b134 57 manchester[i*2]=0;
leomerel 14:42a7d108b134 58 manchester[i*2+1]=1;
leomerel 14:42a7d108b134 59 }
leomerel 14:42a7d108b134 60 else if(byte[i] == 1){
leomerel 14:42a7d108b134 61 manchester[i*2]=1;
leomerel 14:42a7d108b134 62 manchester[i*2+1]=0;
leomerel 14:42a7d108b134 63 }
leomerel 14:42a7d108b134 64 }
leomerel 14:42a7d108b134 65 }
leomerel 12:cfa3dec9e9a3 66
leomerel 14:42a7d108b134 67 void convertMessageToManchester(bool *manchester, bool *message, int length){
leomerel 14:42a7d108b134 68 for(int i=0; i<length; i++){
leomerel 14:42a7d108b134 69 if(message[i] == 0){
leomerel 14:42a7d108b134 70 manchester[i*2]=0;
leomerel 14:42a7d108b134 71 manchester[i*2+1]=1;
leomerel 14:42a7d108b134 72 }
leomerel 14:42a7d108b134 73 else if(message[i] == 1){
leomerel 14:42a7d108b134 74 manchester[i*2]=1;
leomerel 14:42a7d108b134 75 manchester[i*2+1]=0;
leomerel 14:42a7d108b134 76 }
leomerel 14:42a7d108b134 77 }
leomerel 12:cfa3dec9e9a3 78 }
leomerel 12:cfa3dec9e9a3 79
leomerel 14:42a7d108b134 80 //création d'une trame --------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 81 void creationTrame(bool *message, int length){ //Fonctionne
leomerel 14:42a7d108b134 82 printf("OK1 \r\n");
leomerel 14:42a7d108b134 83 bool bin[8];
leomerel 14:42a7d108b134 84 int_to_bin(bin, length);
leomerel 14:42a7d108b134 85 printf("OK2 \r\n");
leomerel 14:42a7d108b134 86 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 87 *message=PREAMBULE[i];
leomerel 14:42a7d108b134 88 message++;
leomerel 14:42a7d108b134 89 }
leomerel 14:42a7d108b134 90 printf("OK3 \r\n");
leomerel 14:42a7d108b134 91 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 92 *message=START_END[i];
leomerel 14:42a7d108b134 93 message++;
leomerel 14:42a7d108b134 94 }
leomerel 14:42a7d108b134 95 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 96 *message=0;
leomerel 14:42a7d108b134 97 message++;
leomerel 14:42a7d108b134 98 }
leomerel 14:42a7d108b134 99 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 100 *message=bin[i];
leomerel 14:42a7d108b134 101 message++;
leomerel 14:42a7d108b134 102 }
leomerel 14:42a7d108b134 103 for(int i=0; i<sizeof(messageUtile); i++){
leomerel 14:42a7d108b134 104 *message=messageUtile[i];
leomerel 14:42a7d108b134 105 message++;
leomerel 14:42a7d108b134 106 }
leomerel 14:42a7d108b134 107 //CRC16
leomerel 14:42a7d108b134 108 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 109 *message=0;
leomerel 14:42a7d108b134 110 message++;
leomerel 14:42a7d108b134 111 }
leomerel 14:42a7d108b134 112 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 113 *message=START_END[i];
leomerel 14:42a7d108b134 114 message++;
leomerel 14:42a7d108b134 115 }
leomerel 14:42a7d108b134 116 }
leomerel 14:42a7d108b134 117
leomerel 14:42a7d108b134 118 //Envoi d'une trame ----------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 119 void envoiTrame(){
leomerel 14:42a7d108b134 120 int length3 = sizeof(messageUtile);
leomerel 14:42a7d108b134 121 bool message3[length3+6*8];
leomerel 14:42a7d108b134 122 bool manchester3[(length3+6*8)*2];
leomerel 14:42a7d108b134 123
leomerel 14:42a7d108b134 124 creationTrame(message3,length3);
leomerel 14:42a7d108b134 125 convertMessageToManchester(manchester3, message3,length3+6*8);
leomerel 14:42a7d108b134 126
leomerel 14:42a7d108b134 127 for(int i=0; i<sizeof(manchester3); i++){
leomerel 14:42a7d108b134 128 dout = manchester3[i];
leomerel 14:42a7d108b134 129 Thread::wait(periode);
leomerel 14:42a7d108b134 130 }
leomerel 14:42a7d108b134 131 }
leomerel 14:42a7d108b134 132
leomerel 14:42a7d108b134 133 //CRC16 (détection des erreurs) ----------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 134 unsigned short crc16(const unsigned char* data_p, unsigned char length){
leomerel 14:42a7d108b134 135 unsigned char x;
leomerel 14:42a7d108b134 136 unsigned short crc = 0xFFFF;
leomerel 14:42a7d108b134 137
leomerel 14:42a7d108b134 138 while (length--){
leomerel 14:42a7d108b134 139 x = crc >> 8 ^ *data_p++;
leomerel 14:42a7d108b134 140 x ^= x>>4;
leomerel 14:42a7d108b134 141 crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
leomerel 14:42a7d108b134 142 }
leomerel 14:42a7d108b134 143 return crc;
leomerel 14:42a7d108b134 144 }
leomerel 14:42a7d108b134 145
leomerel 14:42a7d108b134 146 //detection du préambule
leomerel 14:42a7d108b134 147 void detectionPreambule() {
leomerel 14:42a7d108b134 148 while(1){
leomerel 14:42a7d108b134 149 printf("\r\n C'est bon \r\n");
leomerel 14:42a7d108b134 150 mutex.lock();
leomerel 14:42a7d108b134 151 }
leomerel 14:42a7d108b134 152 }
leomerel 14:42a7d108b134 153
leomerel 12:cfa3dec9e9a3 154 //reception des trames
leomerel 14:42a7d108b134 155 void receptionTrames(){
leomerel 14:42a7d108b134 156 printf("\r\n C'est bon 2 \r\n");
leomerel 14:42a7d108b134 157
leomerel 14:42a7d108b134 158 }
leomerel 14:42a7d108b134 159
leomerel 14:42a7d108b134 160 //decode Manchester ------------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 161 void decodeManchester(bool *data){
leomerel 14:42a7d108b134 162
leomerel 14:42a7d108b134 163 }
leomerel 14:42a7d108b134 164
leomerel 14:42a7d108b134 165
leomerel 14:42a7d108b134 166
leomerel 12:cfa3dec9e9a3 167 //assemblage des trames
leomerel 12:cfa3dec9e9a3 168 //desassemblage des trames
leomerel 12:cfa3dec9e9a3 169
leomerel 12:cfa3dec9e9a3 170
leomerel 14:42a7d108b134 171 void flip() {
leomerel 14:42a7d108b134 172 led = !led;
leomerel 14:42a7d108b134 173 //printf("\r\n C'est bon \r\n");
leomerel 14:42a7d108b134 174 }
leomerel 14:42a7d108b134 175
leomerel 14:42a7d108b134 176
emilmont 1:491820ee784d 177 int main() {
leomerel 14:42a7d108b134 178 /*while(1) {
leomerel 12:cfa3dec9e9a3 179 for(int i=0; i<sizeof(message); i++){
leomerel 12:cfa3dec9e9a3 180 convertToManchester(message[i]);
leomerel 12:cfa3dec9e9a3 181 printf("OK\r\n");
leomerel 12:cfa3dec9e9a3 182 }
leomerel 14:42a7d108b134 183 wait(1);*/
leomerel 14:42a7d108b134 184 /*int length = sizeof(message);
leomerel 14:42a7d108b134 185 printf("%d \r\n", length);
leomerel 14:42a7d108b134 186 printf("Binary length : ");
leomerel 14:42a7d108b134 187 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 188 printf("%d",bin[i]);
leomerel 14:42a7d108b134 189 }
leomerel 14:42a7d108b134 190 printf("\r\n");*/
leomerel 14:42a7d108b134 191
leomerel 14:42a7d108b134 192 int length = sizeof(messageUtile);
leomerel 14:42a7d108b134 193 bool message[length+6*8];
leomerel 14:42a7d108b134 194 creationTrame(message,length);
leomerel 14:42a7d108b134 195 printf("Message : ");
leomerel 14:42a7d108b134 196 for(int i=0; i<sizeof(message); i++){
leomerel 14:42a7d108b134 197 if(i>0 && i%8 == 0){
leomerel 14:42a7d108b134 198 printf(" ");
leomerel 14:42a7d108b134 199 }
leomerel 14:42a7d108b134 200 printf("%d",message[i]);
leomerel 14:42a7d108b134 201 }
leomerel 14:42a7d108b134 202 printf("\r\n");
leomerel 14:42a7d108b134 203
leomerel 14:42a7d108b134 204
leomerel 14:42a7d108b134 205 bool manchester[16];
leomerel 14:42a7d108b134 206 bool byte[8] = {0,1,0,0,1,1,1,0};
leomerel 14:42a7d108b134 207 convertByteToManchester(manchester,byte);
leomerel 14:42a7d108b134 208 printf("Manchester : ");
leomerel 14:42a7d108b134 209 for(int i=0; i<16; i++){
leomerel 14:42a7d108b134 210 if(i>0 && i%2 == 0){
leomerel 14:42a7d108b134 211 printf(" ");
leomerel 14:42a7d108b134 212 }
leomerel 14:42a7d108b134 213 printf("%d",manchester[i]);
leomerel 14:42a7d108b134 214 }
leomerel 14:42a7d108b134 215 printf("\r\n");
leomerel 14:42a7d108b134 216
leomerel 14:42a7d108b134 217 int length2 = sizeof(messageUtile);
leomerel 14:42a7d108b134 218 bool message2[length2+6*8];
leomerel 14:42a7d108b134 219 bool manchester2[(length2+6*8)*2];
leomerel 14:42a7d108b134 220 creationTrame(message2,length2);
leomerel 14:42a7d108b134 221 convertMessageToManchester(manchester2, message2, length2+6*8);
leomerel 14:42a7d108b134 222 printf("Message : \r\n");
leomerel 14:42a7d108b134 223 for(int i=0; i<sizeof(manchester2); i++){
leomerel 14:42a7d108b134 224 if(i>0 && i%16 == 0){
leomerel 14:42a7d108b134 225 printf("\r\n");
leomerel 14:42a7d108b134 226 }
leomerel 14:42a7d108b134 227 if(i>0 && i%2 == 0){
leomerel 14:42a7d108b134 228 printf(" ");
leomerel 14:42a7d108b134 229 }
leomerel 14:42a7d108b134 230 printf("%d",manchester2[i]);
leomerel 14:42a7d108b134 231 }
leomerel 14:42a7d108b134 232 printf("\r\n");
leomerel 14:42a7d108b134 233
leomerel 14:42a7d108b134 234 envoi_t.start(envoiTrame);
leomerel 14:42a7d108b134 235 reception_t.start(receptionTrames);
leomerel 14:42a7d108b134 236 button.rise(&flip); // attach the address of the flip function to the rising edge
leomerel 14:42a7d108b134 237 while(1) { // wait around, interrupts will interrupt this!
leomerel 14:42a7d108b134 238 flash = !flash;
leomerel 14:42a7d108b134 239 wait(0.25);
leomerel 14:42a7d108b134 240 }
emilmont 1:491820ee784d 241 }
leomerel 12:cfa3dec9e9a3 242
leomerel 12:cfa3dec9e9a3 243