APP4

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Committer:
leomerel
Date:
Mon Oct 22 21:16:22 2018 +0000
Revision:
15:872151771dec
Parent:
14:42a7d108b134
Child:
16:a163a7c0315b
allo

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 15:872151771dec 6 DigitalOut led1(LED1);
leomerel 15:872151771dec 7 DigitalOut led2(LED2);
leomerel 15:872151771dec 8 DigitalOut led3(LED3);
leomerel 14:42a7d108b134 9 DigitalOut flash(LED4);
leomerel 15:872151771dec 10 DigitalIn pin12(p12);
leomerel 12:cfa3dec9e9a3 11
leomerel 14:42a7d108b134 12 int periode = 10; //10ms
leomerel 15:872151771dec 13 int periode_reception = 30;
leomerel 12:cfa3dec9e9a3 14 bool PREAMBULE[] = {0,1,0,1,0,1,0,1};
leomerel 12:cfa3dec9e9a3 15 bool START_END[] = {0,1,1,1,1,1,1,0};
leomerel 14:42a7d108b134 16 Thread envoi_t;
leomerel 14:42a7d108b134 17 Thread reception_t;
leomerel 15:872151771dec 18 Thread detection_t;
leomerel 15:872151771dec 19
leomerel 15:872151771dec 20 typedef struct {
leomerel 15:872151771dec 21 int time;
leomerel 15:872151771dec 22 bool front;
leomerel 15:872151771dec 23 } message_t;
leomerel 15:872151771dec 24
leomerel 15:872151771dec 25 Mail<message_t,16> mail_box;
leomerel 15:872151771dec 26 Timer timer;
leomerel 15:872151771dec 27 int etat;
leomerel 12:cfa3dec9e9a3 28
leomerel 14:42a7d108b134 29 bool messageUtile[64] = {0,0,1,0,1,1,1,0,
leomerel 14:42a7d108b134 30 1,0,1,0,0,0,0,0,
leomerel 14:42a7d108b134 31 0,0,1,1,1,0,1,0,
leomerel 14:42a7d108b134 32 1,1,0,0,0,1,1,0,
leomerel 14:42a7d108b134 33 0,1,0,1,1,0,1,1,
leomerel 14:42a7d108b134 34 1,0,1,0,1,1,1,0,
leomerel 14:42a7d108b134 35 0,0,1,0,1,0,0,0,
leomerel 14:42a7d108b134 36 1,0,1,0,1,1,0,0};
leomerel 12:cfa3dec9e9a3 37
leomerel 14:42a7d108b134 38 //convert length from int to binary -----------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 39 bool r;
leomerel 14:42a7d108b134 40 void int_to_bin(bool bin[8], int length){ //Fonctionne
leomerel 14:42a7d108b134 41 int i = 0;
leomerel 14:42a7d108b134 42 while(length >0 || i<8){
leomerel 14:42a7d108b134 43 r = length%2;
leomerel 14:42a7d108b134 44 length/=2;
leomerel 14:42a7d108b134 45 bin[7-i]=r;
leomerel 14:42a7d108b134 46 i++;
leomerel 14:42a7d108b134 47 }
leomerel 14:42a7d108b134 48 while(i<8){
leomerel 14:42a7d108b134 49 bin[i]=0;
leomerel 14:42a7d108b134 50 i++;
leomerel 14:42a7d108b134 51 }
leomerel 14:42a7d108b134 52 }
leomerel 14:42a7d108b134 53
leomerel 14:42a7d108b134 54 //convert to Manchester ------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 55 void convertBitToManchester(bool *manchester, bool bit){ //Fonctionne
leomerel 14:42a7d108b134 56 if(bit == 0){
leomerel 14:42a7d108b134 57 manchester[0]=0;
leomerel 14:42a7d108b134 58 manchester[1]=1;
leomerel 12:cfa3dec9e9a3 59 }
leomerel 14:42a7d108b134 60 else if(bit == 1){
leomerel 14:42a7d108b134 61 manchester[0]=1;
leomerel 14:42a7d108b134 62 manchester[1]=0;
emilmont 1:491820ee784d 63 }
emilmont 1:491820ee784d 64 }
leomerel 12:cfa3dec9e9a3 65
leomerel 14:42a7d108b134 66 void convertByteToManchester(bool *manchester, bool byte[8]){ //Fonctionne
leomerel 14:42a7d108b134 67 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 68 if(byte[i] == 0){
leomerel 14:42a7d108b134 69 manchester[i*2]=0;
leomerel 14:42a7d108b134 70 manchester[i*2+1]=1;
leomerel 14:42a7d108b134 71 }
leomerel 14:42a7d108b134 72 else if(byte[i] == 1){
leomerel 14:42a7d108b134 73 manchester[i*2]=1;
leomerel 14:42a7d108b134 74 manchester[i*2+1]=0;
leomerel 14:42a7d108b134 75 }
leomerel 14:42a7d108b134 76 }
leomerel 14:42a7d108b134 77 }
leomerel 12:cfa3dec9e9a3 78
leomerel 14:42a7d108b134 79 void convertMessageToManchester(bool *manchester, bool *message, int length){
leomerel 14:42a7d108b134 80 for(int i=0; i<length; i++){
leomerel 14:42a7d108b134 81 if(message[i] == 0){
leomerel 14:42a7d108b134 82 manchester[i*2]=0;
leomerel 14:42a7d108b134 83 manchester[i*2+1]=1;
leomerel 14:42a7d108b134 84 }
leomerel 14:42a7d108b134 85 else if(message[i] == 1){
leomerel 14:42a7d108b134 86 manchester[i*2]=1;
leomerel 14:42a7d108b134 87 manchester[i*2+1]=0;
leomerel 14:42a7d108b134 88 }
leomerel 14:42a7d108b134 89 }
leomerel 12:cfa3dec9e9a3 90 }
leomerel 12:cfa3dec9e9a3 91
leomerel 14:42a7d108b134 92 //création d'une trame --------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 93 void creationTrame(bool *message, int length){ //Fonctionne
leomerel 14:42a7d108b134 94 printf("OK1 \r\n");
leomerel 14:42a7d108b134 95 bool bin[8];
leomerel 14:42a7d108b134 96 int_to_bin(bin, length);
leomerel 14:42a7d108b134 97 printf("OK2 \r\n");
leomerel 14:42a7d108b134 98 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 99 *message=PREAMBULE[i];
leomerel 14:42a7d108b134 100 message++;
leomerel 14:42a7d108b134 101 }
leomerel 14:42a7d108b134 102 printf("OK3 \r\n");
leomerel 14:42a7d108b134 103 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 104 *message=START_END[i];
leomerel 14:42a7d108b134 105 message++;
leomerel 14:42a7d108b134 106 }
leomerel 14:42a7d108b134 107 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 108 *message=0;
leomerel 14:42a7d108b134 109 message++;
leomerel 14:42a7d108b134 110 }
leomerel 14:42a7d108b134 111 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 112 *message=bin[i];
leomerel 14:42a7d108b134 113 message++;
leomerel 14:42a7d108b134 114 }
leomerel 14:42a7d108b134 115 for(int i=0; i<sizeof(messageUtile); i++){
leomerel 14:42a7d108b134 116 *message=messageUtile[i];
leomerel 14:42a7d108b134 117 message++;
leomerel 14:42a7d108b134 118 }
leomerel 14:42a7d108b134 119 //CRC16
leomerel 14:42a7d108b134 120 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 121 *message=0;
leomerel 14:42a7d108b134 122 message++;
leomerel 14:42a7d108b134 123 }
leomerel 14:42a7d108b134 124 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 125 *message=START_END[i];
leomerel 14:42a7d108b134 126 message++;
leomerel 14:42a7d108b134 127 }
leomerel 14:42a7d108b134 128 }
leomerel 14:42a7d108b134 129
leomerel 14:42a7d108b134 130 //Envoi d'une trame ----------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 131 void envoiTrame(){
leomerel 15:872151771dec 132 bool app=false;
leomerel 15:872151771dec 133 while(1){
leomerel 15:872151771dec 134 /*int length3 = sizeof(messageUtile);
leomerel 15:872151771dec 135 bool message3[length3+6*8];
leomerel 15:872151771dec 136 bool manchester3[(length3+6*8)*2];
leomerel 15:872151771dec 137
leomerel 15:872151771dec 138 creationTrame(message3,length3);
leomerel 15:872151771dec 139 convertMessageToManchester(manchester3, message3,length3+6*8);*/
leomerel 15:872151771dec 140
leomerel 15:872151771dec 141 if(pin12 && !app){
leomerel 15:872151771dec 142 bool manchester3[16] = {0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0};
leomerel 15:872151771dec 143 app=true;
leomerel 15:872151771dec 144 for(int i=0; i<sizeof(manchester3); i++){
leomerel 15:872151771dec 145 dout = manchester3[i];
leomerel 15:872151771dec 146 Thread::wait(periode);
leomerel 15:872151771dec 147 }
leomerel 15:872151771dec 148 }
leomerel 15:872151771dec 149 else if(!pin12 && app){
leomerel 15:872151771dec 150 app=false;
leomerel 15:872151771dec 151 }
leomerel 14:42a7d108b134 152 }
leomerel 14:42a7d108b134 153 }
leomerel 14:42a7d108b134 154
leomerel 14:42a7d108b134 155 //CRC16 (détection des erreurs) ----------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 156 unsigned short crc16(const unsigned char* data_p, unsigned char length){
leomerel 14:42a7d108b134 157 unsigned char x;
leomerel 14:42a7d108b134 158 unsigned short crc = 0xFFFF;
leomerel 14:42a7d108b134 159
leomerel 14:42a7d108b134 160 while (length--){
leomerel 14:42a7d108b134 161 x = crc >> 8 ^ *data_p++;
leomerel 14:42a7d108b134 162 x ^= x>>4;
leomerel 14:42a7d108b134 163 crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
leomerel 14:42a7d108b134 164 }
leomerel 14:42a7d108b134 165 return crc;
leomerel 14:42a7d108b134 166 }
leomerel 14:42a7d108b134 167
leomerel 15:872151771dec 168 bool preambule[8];
leomerel 14:42a7d108b134 169 //detection du préambule
leomerel 14:42a7d108b134 170 void detectionPreambule() {
leomerel 15:872151771dec 171 int compteur = 0;
leomerel 15:872151771dec 172 int prev_time;
leomerel 15:872151771dec 173 int t;
leomerel 14:42a7d108b134 174 while(1){
leomerel 15:872151771dec 175 osEvent evt = mail_box.get();
leomerel 15:872151771dec 176 if (evt.status == osEventMail) {
leomerel 15:872151771dec 177 message_t *f = (message_t*)evt.value.p;
leomerel 15:872151771dec 178 //printf("%d",*f);
leomerel 15:872151771dec 179 led3 = f->front;
leomerel 15:872151771dec 180 t = f->time;
leomerel 15:872151771dec 181 if(f->front == 0){
leomerel 15:872151771dec 182 if(etat==0){
leomerel 15:872151771dec 183 compteur=0;
leomerel 15:872151771dec 184 timer.start();
leomerel 15:872151771dec 185 printf("%d Time : %d , compteur: %d\r\n", f->front, t, compteur);
leomerel 15:872151771dec 186 preambule[compteur] = f->front;
leomerel 15:872151771dec 187 etat = 1;
leomerel 15:872151771dec 188 }
leomerel 15:872151771dec 189 else if(etat==2){
leomerel 15:872151771dec 190 if((t-prev_time)<=35 && (t-prev_time)>=25){
leomerel 15:872151771dec 191 printf("%d Time : %d , compteur: %d\r\n", f->front, t, compteur);
leomerel 15:872151771dec 192 preambule[compteur] = f->front;
leomerel 15:872151771dec 193 }
leomerel 15:872151771dec 194 }
leomerel 15:872151771dec 195 }
leomerel 15:872151771dec 196 else if(f->front==1){
leomerel 15:872151771dec 197 if(etat ==1){
leomerel 15:872151771dec 198 if((t-prev_time)<=35 && (t-prev_time)>=25){
leomerel 15:872151771dec 199 printf("%d Time : %d , compteur: %d\r\n", f->front, t, compteur);
leomerel 15:872151771dec 200 preambule[compteur] = f->front;
leomerel 15:872151771dec 201 etat = 2;
leomerel 15:872151771dec 202 }
leomerel 15:872151771dec 203 else{
leomerel 15:872151771dec 204 etat=0;
leomerel 15:872151771dec 205 }
leomerel 15:872151771dec 206 }
leomerel 15:872151771dec 207 else if(etat ==2){
leomerel 15:872151771dec 208 if((t-prev_time)<=35 && (t-prev_time)>=25){
leomerel 15:872151771dec 209 printf("%d Time : %d , compteur: %d\r\n", f->front, t, compteur);
leomerel 15:872151771dec 210 preambule[compteur] = f->front;
leomerel 15:872151771dec 211 }
leomerel 15:872151771dec 212 }
leomerel 15:872151771dec 213
leomerel 15:872151771dec 214 }
leomerel 15:872151771dec 215 prev_time = t;
leomerel 15:872151771dec 216 mail_box.free(f);
leomerel 15:872151771dec 217 compteur++;
leomerel 15:872151771dec 218 }
leomerel 15:872151771dec 219 printf("----------------- compteur: %d, temps: %d\r\n", compteur, t);
leomerel 15:872151771dec 220 if(compteur ==8){
leomerel 15:872151771dec 221 etat = 0;
leomerel 15:872151771dec 222 for(int i=0; i<sizeof(preambule);i++){
leomerel 15:872151771dec 223 if(i>0 && i%2 == 0){
leomerel 15:872151771dec 224 printf(" ");
leomerel 15:872151771dec 225 }
leomerel 15:872151771dec 226 printf("%d", preambule[i]);
leomerel 15:872151771dec 227 }
leomerel 15:872151771dec 228 printf("\r\n");
leomerel 15:872151771dec 229 }
leomerel 14:42a7d108b134 230 }
leomerel 14:42a7d108b134 231 }
leomerel 14:42a7d108b134 232
leomerel 12:cfa3dec9e9a3 233 //reception des trames
leomerel 14:42a7d108b134 234 void receptionTrames(){
leomerel 14:42a7d108b134 235 }
leomerel 14:42a7d108b134 236
leomerel 14:42a7d108b134 237 //decode Manchester ------------------------------------------------------------------------------------------------------------------
leomerel 14:42a7d108b134 238 void decodeManchester(bool *data){
leomerel 14:42a7d108b134 239
leomerel 14:42a7d108b134 240 }
leomerel 14:42a7d108b134 241
leomerel 14:42a7d108b134 242
leomerel 14:42a7d108b134 243
leomerel 12:cfa3dec9e9a3 244 //assemblage des trames
leomerel 12:cfa3dec9e9a3 245 //desassemblage des trames
leomerel 12:cfa3dec9e9a3 246
leomerel 12:cfa3dec9e9a3 247
leomerel 15:872151771dec 248 void rise() {
leomerel 15:872151771dec 249 led1 = !led1;
leomerel 14:42a7d108b134 250 //printf("\r\n C'est bon \r\n");
leomerel 15:872151771dec 251 message_t *a = mail_box.alloc();
leomerel 15:872151771dec 252 a->time = timer.read_ms();;
leomerel 15:872151771dec 253 a->front = 0;
leomerel 15:872151771dec 254 mail_box.put(a);
leomerel 15:872151771dec 255 }
leomerel 15:872151771dec 256
leomerel 15:872151771dec 257 void fall() {
leomerel 15:872151771dec 258 led2 = !led2;
leomerel 15:872151771dec 259 //printf("\r\n C'est bon \r\n");
leomerel 15:872151771dec 260 message_t *a = mail_box.alloc();
leomerel 15:872151771dec 261 a->time = timer.read_ms();;
leomerel 15:872151771dec 262 a->front = 1;
leomerel 15:872151771dec 263 mail_box.put(a);
leomerel 14:42a7d108b134 264 }
leomerel 14:42a7d108b134 265
leomerel 14:42a7d108b134 266
emilmont 1:491820ee784d 267 int main() {
leomerel 14:42a7d108b134 268 /*while(1) {
leomerel 12:cfa3dec9e9a3 269 for(int i=0; i<sizeof(message); i++){
leomerel 12:cfa3dec9e9a3 270 convertToManchester(message[i]);
leomerel 12:cfa3dec9e9a3 271 printf("OK\r\n");
leomerel 12:cfa3dec9e9a3 272 }
leomerel 14:42a7d108b134 273 wait(1);*/
leomerel 14:42a7d108b134 274 /*int length = sizeof(message);
leomerel 14:42a7d108b134 275 printf("%d \r\n", length);
leomerel 14:42a7d108b134 276 printf("Binary length : ");
leomerel 14:42a7d108b134 277 for(int i=0; i<8; i++){
leomerel 14:42a7d108b134 278 printf("%d",bin[i]);
leomerel 14:42a7d108b134 279 }
leomerel 14:42a7d108b134 280 printf("\r\n");*/
leomerel 14:42a7d108b134 281
leomerel 14:42a7d108b134 282 int length = sizeof(messageUtile);
leomerel 14:42a7d108b134 283 bool message[length+6*8];
leomerel 14:42a7d108b134 284 creationTrame(message,length);
leomerel 14:42a7d108b134 285 printf("Message : ");
leomerel 14:42a7d108b134 286 for(int i=0; i<sizeof(message); i++){
leomerel 14:42a7d108b134 287 if(i>0 && i%8 == 0){
leomerel 14:42a7d108b134 288 printf(" ");
leomerel 14:42a7d108b134 289 }
leomerel 14:42a7d108b134 290 printf("%d",message[i]);
leomerel 14:42a7d108b134 291 }
leomerel 14:42a7d108b134 292 printf("\r\n");
leomerel 14:42a7d108b134 293
leomerel 14:42a7d108b134 294
leomerel 14:42a7d108b134 295 bool manchester[16];
leomerel 14:42a7d108b134 296 bool byte[8] = {0,1,0,0,1,1,1,0};
leomerel 14:42a7d108b134 297 convertByteToManchester(manchester,byte);
leomerel 14:42a7d108b134 298 printf("Manchester : ");
leomerel 14:42a7d108b134 299 for(int i=0; i<16; i++){
leomerel 14:42a7d108b134 300 if(i>0 && i%2 == 0){
leomerel 14:42a7d108b134 301 printf(" ");
leomerel 14:42a7d108b134 302 }
leomerel 14:42a7d108b134 303 printf("%d",manchester[i]);
leomerel 14:42a7d108b134 304 }
leomerel 14:42a7d108b134 305 printf("\r\n");
leomerel 14:42a7d108b134 306
leomerel 14:42a7d108b134 307 int length2 = sizeof(messageUtile);
leomerel 14:42a7d108b134 308 bool message2[length2+6*8];
leomerel 14:42a7d108b134 309 bool manchester2[(length2+6*8)*2];
leomerel 14:42a7d108b134 310 creationTrame(message2,length2);
leomerel 14:42a7d108b134 311 convertMessageToManchester(manchester2, message2, length2+6*8);
leomerel 14:42a7d108b134 312 printf("Message : \r\n");
leomerel 14:42a7d108b134 313 for(int i=0; i<sizeof(manchester2); i++){
leomerel 14:42a7d108b134 314 if(i>0 && i%16 == 0){
leomerel 14:42a7d108b134 315 printf("\r\n");
leomerel 14:42a7d108b134 316 }
leomerel 14:42a7d108b134 317 if(i>0 && i%2 == 0){
leomerel 14:42a7d108b134 318 printf(" ");
leomerel 14:42a7d108b134 319 }
leomerel 14:42a7d108b134 320 printf("%d",manchester2[i]);
leomerel 14:42a7d108b134 321 }
leomerel 14:42a7d108b134 322 printf("\r\n");
leomerel 14:42a7d108b134 323
leomerel 15:872151771dec 324
leomerel 15:872151771dec 325
leomerel 14:42a7d108b134 326 envoi_t.start(envoiTrame);
leomerel 14:42a7d108b134 327 reception_t.start(receptionTrames);
leomerel 15:872151771dec 328 detection_t.start(detectionPreambule);
leomerel 15:872151771dec 329 button.rise(&rise); // attach the address of the flip function to the rising edge
leomerel 15:872151771dec 330 button.fall(&fall);
leomerel 14:42a7d108b134 331 while(1) { // wait around, interrupts will interrupt this!
leomerel 14:42a7d108b134 332 flash = !flash;
leomerel 14:42a7d108b134 333 wait(0.25);
leomerel 14:42a7d108b134 334 }
emilmont 1:491820ee784d 335 }
leomerel 12:cfa3dec9e9a3 336
leomerel 12:cfa3dec9e9a3 337