APP4 S5

Dependencies:   mbed-rtos mbed

Committer:
Cheroukee
Date:
Thu Oct 12 20:14:21 2017 +0000
Revision:
8:a878763b0ae3
Parent:
7:d25bcde7dcf1
Child:
9:081324663b8c
Receive, cleanup necessary

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cheroukee 1:5fc0c0996264 1
Cheroukee 1:5fc0c0996264 2 #include "radio.h"
Cheroukee 1:5fc0c0996264 3
Cheroukee 2:fdb34827d964 4 #include "mbed.h"
Cheroukee 3:6ea97936f6fa 5 #include "rtos.h"
Cheroukee 2:fdb34827d964 6
Cheroukee 2:fdb34827d964 7 #include <LPC17xx.h>
Cheroukee 2:fdb34827d964 8
Cheroukee 1:5fc0c0996264 9 #define MESSAGE_BUFFER_SIZE 16
Cheroukee 1:5fc0c0996264 10
Cheroukee 8:a878763b0ae3 11 #define MANCHESTER_SPEED_OUT 10
Cheroukee 3:6ea97936f6fa 12
Cheroukee 3:6ea97936f6fa 13 #define INPUT_RADIO p18
Cheroukee 2:fdb34827d964 14 #define OUTPUT_RADIO p6
Cheroukee 2:fdb34827d964 15
Cheroukee 2:fdb34827d964 16 radio_message_t out_messages[MESSAGE_BUFFER_SIZE];
Cheroukee 1:5fc0c0996264 17 byte out_message_in;
Cheroukee 1:5fc0c0996264 18 byte out_message_out;
Cheroukee 1:5fc0c0996264 19
Cheroukee 2:fdb34827d964 20 radio_message_t in_messages[MESSAGE_BUFFER_SIZE];
Cheroukee 1:5fc0c0996264 21 byte in_message_in;
Cheroukee 2:fdb34827d964 22 byte in_message_out;
Cheroukee 2:fdb34827d964 23
Cheroukee 3:6ea97936f6fa 24 InterruptIn input(INPUT_RADIO);
Cheroukee 3:6ea97936f6fa 25
Cheroukee 3:6ea97936f6fa 26 RtosTimer out_timer(radio_out, osTimerPeriodic, (void *)out_messages);
Cheroukee 3:6ea97936f6fa 27
Cheroukee 2:fdb34827d964 28 DigitalOut output(OUTPUT_RADIO);
Cheroukee 2:fdb34827d964 29
Cheroukee 8:a878763b0ae3 30 #ifdef LED
Cheroukee 3:6ea97936f6fa 31 DigitalOut in_debug_led(LED4);
Cheroukee 3:6ea97936f6fa 32 DigitalOut out_debug_led(LED3);
Cheroukee 3:6ea97936f6fa 33
Cheroukee 5:70d338ee3f77 34 DigitalOut frame_end_led(LED2);
Cheroukee 8:a878763b0ae3 35 DigitalOut frame_in_end_led(LED1);
Cheroukee 8:a878763b0ae3 36 #endif
Cheroukee 8:a878763b0ae3 37
Cheroukee 8:a878763b0ae3 38 Serial PC(USBTX, USBRX);
Cheroukee 5:70d338ee3f77 39
Cheroukee 2:fdb34827d964 40 // API functions
Cheroukee 2:fdb34827d964 41 void init_radio_system()
Cheroukee 2:fdb34827d964 42 {
Cheroukee 3:6ea97936f6fa 43 setup_radio_in();
Cheroukee 3:6ea97936f6fa 44 setup_radio_out();
Cheroukee 3:6ea97936f6fa 45 output = 0;
Cheroukee 2:fdb34827d964 46 }
Cheroukee 2:fdb34827d964 47
Cheroukee 2:fdb34827d964 48 // Private functions
Cheroukee 3:6ea97936f6fa 49
Cheroukee 8:a878763b0ae3 50 typedef enum {
Cheroukee 8:a878763b0ae3 51 in_attente = 0,
Cheroukee 8:a878763b0ae3 52 in_preambule,
Cheroukee 8:a878763b0ae3 53 in_data,
Cheroukee 8:a878763b0ae3 54 in_idle
Cheroukee 8:a878763b0ae3 55 } receive_state_t;
Cheroukee 8:a878763b0ae3 56
Cheroukee 8:a878763b0ae3 57
Cheroukee 8:a878763b0ae3 58
Cheroukee 8:a878763b0ae3 59 DigitalOut led4(LED4);
Cheroukee 8:a878763b0ae3 60 DigitalOut led3(LED3);
Cheroukee 8:a878763b0ae3 61 DigitalOut led2(LED2);
Cheroukee 8:a878763b0ae3 62 DigitalOut led1(LED1);
Cheroukee 8:a878763b0ae3 63
Cheroukee 8:a878763b0ae3 64 byte current_state = in_attente;
Cheroukee 8:a878763b0ae3 65 byte current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 66
Cheroukee 8:a878763b0ae3 67
Cheroukee 8:a878763b0ae3 68 void stop_frame(void const *n);
Cheroukee 8:a878763b0ae3 69
Cheroukee 8:a878763b0ae3 70 RtosTimer ticker_watch(stop_frame, osTimerPeriodic, NULL);
Cheroukee 8:a878763b0ae3 71 Thread thread;
Cheroukee 8:a878763b0ae3 72
Cheroukee 8:a878763b0ae3 73 void stop_frame(void const *n)
Cheroukee 3:6ea97936f6fa 74 {
Cheroukee 8:a878763b0ae3 75 //frame_in_end_led = 0;
Cheroukee 8:a878763b0ae3 76 current_state = in_attente;
Cheroukee 8:a878763b0ae3 77 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 78 ticker_watch.stop();
Cheroukee 8:a878763b0ae3 79 }
Cheroukee 8:a878763b0ae3 80
Cheroukee 8:a878763b0ae3 81 volatile int t = 0;
Cheroukee 8:a878763b0ae3 82 volatile int c = 0;
Cheroukee 8:a878763b0ae3 83
Cheroukee 8:a878763b0ae3 84 void radio_in()
Cheroukee 8:a878763b0ae3 85 {
Cheroukee 8:a878763b0ae3 86
Cheroukee 8:a878763b0ae3 87 static Timer timer;
Cheroukee 8:a878763b0ae3 88 static int t_half = 0;
Cheroukee 8:a878763b0ae3 89
Cheroukee 8:a878763b0ae3 90 static byte current_byte = 0;
Cheroukee 8:a878763b0ae3 91
Cheroukee 8:a878763b0ae3 92 //in_debug_led = !in_debug_led;
Cheroukee 8:a878763b0ae3 93
Cheroukee 8:a878763b0ae3 94
Cheroukee 8:a878763b0ae3 95 switch (current_state)
Cheroukee 8:a878763b0ae3 96 {
Cheroukee 8:a878763b0ae3 97 case in_attente:
Cheroukee 8:a878763b0ae3 98 {
Cheroukee 8:a878763b0ae3 99 //led4 = 0;
Cheroukee 8:a878763b0ae3 100 led3 = 0;
Cheroukee 8:a878763b0ae3 101 led2 = 0;
Cheroukee 8:a878763b0ae3 102 led1 = 0;
Cheroukee 8:a878763b0ae3 103 //frame_in_end_led = 0;
Cheroukee 8:a878763b0ae3 104 if (input == 1)
Cheroukee 8:a878763b0ae3 105 {
Cheroukee 8:a878763b0ae3 106 led1 = 1;
Cheroukee 8:a878763b0ae3 107 timer.start();
Cheroukee 8:a878763b0ae3 108 current_state = in_preambule;
Cheroukee 8:a878763b0ae3 109 current_byte_progress = 1;
Cheroukee 8:a878763b0ae3 110 //frame_in_end_led = 1;
Cheroukee 8:a878763b0ae3 111 }
Cheroukee 8:a878763b0ae3 112 break;
Cheroukee 8:a878763b0ae3 113 }
Cheroukee 8:a878763b0ae3 114 case in_preambule:
Cheroukee 8:a878763b0ae3 115 {
Cheroukee 8:a878763b0ae3 116 led2 = 1;
Cheroukee 8:a878763b0ae3 117 current_byte_progress++;
Cheroukee 8:a878763b0ae3 118 t = timer.read_ms();
Cheroukee 8:a878763b0ae3 119 timer.reset();
Cheroukee 8:a878763b0ae3 120 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 121 {
Cheroukee 8:a878763b0ae3 122 t_half = t / 2;
Cheroukee 8:a878763b0ae3 123 ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 124 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 125 current_state = in_data;
Cheroukee 8:a878763b0ae3 126 c = t;
Cheroukee 8:a878763b0ae3 127 thread.signal_set(0x1);
Cheroukee 8:a878763b0ae3 128 }
Cheroukee 8:a878763b0ae3 129 break;
Cheroukee 8:a878763b0ae3 130 }
Cheroukee 8:a878763b0ae3 131 case in_data:
Cheroukee 8:a878763b0ae3 132 {
Cheroukee 8:a878763b0ae3 133 led3 = 1;
Cheroukee 8:a878763b0ae3 134 if(timer.read_ms() > t + t_half)
Cheroukee 8:a878763b0ae3 135 {
Cheroukee 8:a878763b0ae3 136 led4 = 1;
Cheroukee 8:a878763b0ae3 137 //frame_in_end_led = 0;
Cheroukee 8:a878763b0ae3 138 current_state = in_attente;
Cheroukee 8:a878763b0ae3 139 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 140
Cheroukee 8:a878763b0ae3 141 timer.stop();
Cheroukee 8:a878763b0ae3 142 timer.reset();
Cheroukee 8:a878763b0ae3 143 }
Cheroukee 8:a878763b0ae3 144 else if (timer.read_ms() > t_half)
Cheroukee 8:a878763b0ae3 145 {
Cheroukee 8:a878763b0ae3 146 current_byte = (!input << (7 - current_byte_progress)) | current_byte;
Cheroukee 8:a878763b0ae3 147 current_byte_progress++ ;
Cheroukee 8:a878763b0ae3 148 //PC.putc(input);
Cheroukee 8:a878763b0ae3 149 // Display data
Cheroukee 8:a878763b0ae3 150 //frame_in_end_led = !input;
Cheroukee 8:a878763b0ae3 151 ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 152 timer.reset();
Cheroukee 8:a878763b0ae3 153
Cheroukee 8:a878763b0ae3 154 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 155 {
Cheroukee 8:a878763b0ae3 156 c = current_byte;
Cheroukee 8:a878763b0ae3 157 thread.signal_set(0x1);
Cheroukee 8:a878763b0ae3 158 current_byte = 0;
Cheroukee 8:a878763b0ae3 159 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 160 }
Cheroukee 8:a878763b0ae3 161 }
Cheroukee 8:a878763b0ae3 162 else
Cheroukee 8:a878763b0ae3 163 {
Cheroukee 8:a878763b0ae3 164 //ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 165 }
Cheroukee 8:a878763b0ae3 166 break;
Cheroukee 8:a878763b0ae3 167 }
Cheroukee 8:a878763b0ae3 168 case in_idle:
Cheroukee 8:a878763b0ae3 169 {
Cheroukee 8:a878763b0ae3 170 led4 = 1;
Cheroukee 8:a878763b0ae3 171 //frame_in_end_led = 0;
Cheroukee 8:a878763b0ae3 172 current_state = in_attente;
Cheroukee 8:a878763b0ae3 173 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 174 break;
Cheroukee 8:a878763b0ae3 175 }
Cheroukee 8:a878763b0ae3 176 }
Cheroukee 3:6ea97936f6fa 177 }
Cheroukee 3:6ea97936f6fa 178
Cheroukee 8:a878763b0ae3 179 void thread_putc()
Cheroukee 3:6ea97936f6fa 180 {
Cheroukee 8:a878763b0ae3 181 while(1)
Cheroukee 8:a878763b0ae3 182 {
Cheroukee 8:a878763b0ae3 183 Thread::signal_wait(0x1);
Cheroukee 8:a878763b0ae3 184 PC.printf("0x%x\n\r", c);
Cheroukee 8:a878763b0ae3 185 }
Cheroukee 3:6ea97936f6fa 186 }
Cheroukee 3:6ea97936f6fa 187
Cheroukee 8:a878763b0ae3 188
Cheroukee 3:6ea97936f6fa 189 void setup_radio_in()
Cheroukee 3:6ea97936f6fa 190 {
Cheroukee 4:728322e9e3eb 191 in_message_in = 0;
Cheroukee 4:728322e9e3eb 192 in_message_out = 0;
Cheroukee 4:728322e9e3eb 193
Cheroukee 8:a878763b0ae3 194 thread.start(callback(thread_putc));
Cheroukee 3:6ea97936f6fa 195
Cheroukee 8:a878763b0ae3 196 input.rise(&radio_in);
Cheroukee 8:a878763b0ae3 197 input.fall(&radio_in);
Cheroukee 3:6ea97936f6fa 198 }
Cheroukee 3:6ea97936f6fa 199
Cheroukee 3:6ea97936f6fa 200
Cheroukee 3:6ea97936f6fa 201 void setup_radio_out()
Cheroukee 2:fdb34827d964 202 {
Cheroukee 3:6ea97936f6fa 203 out_message_in = 0;
Cheroukee 3:6ea97936f6fa 204 out_message_out = 0;
Cheroukee 3:6ea97936f6fa 205
Cheroukee 8:a878763b0ae3 206 //out_debug_led = 0;
Cheroukee 8:a878763b0ae3 207 //frame_end_led = 1;
Cheroukee 2:fdb34827d964 208
Cheroukee 3:6ea97936f6fa 209 //////////////////////////////////////////////////////
Cheroukee 3:6ea97936f6fa 210 // Creation d'un message et insertion dans le buffer
Cheroukee 3:6ea97936f6fa 211 radio_message_t* message = (out_messages + out_message_in);
Cheroukee 3:6ea97936f6fa 212
Cheroukee 3:6ea97936f6fa 213 message->preambule = HEADER_DELIMITER;
Cheroukee 3:6ea97936f6fa 214 message->start = HEADER_START;
Cheroukee 3:6ea97936f6fa 215 message->options = HEADER_DELIMITER;
Cheroukee 5:70d338ee3f77 216 message->length = 0x3;
Cheroukee 3:6ea97936f6fa 217
Cheroukee 5:70d338ee3f77 218 message->data[0] = 0xC0;
Cheroukee 5:70d338ee3f77 219 message->data[1] = 0xFF;
Cheroukee 5:70d338ee3f77 220 message->data[2] = 0xEE;
Cheroukee 3:6ea97936f6fa 221
Cheroukee 3:6ea97936f6fa 222 // Ajouter calcul
Cheroukee 5:70d338ee3f77 223 message->control = 0xCE;
Cheroukee 3:6ea97936f6fa 224
Cheroukee 3:6ea97936f6fa 225 message->end = FOOTER_END;
Cheroukee 3:6ea97936f6fa 226 // On avance dans le buffer;
Cheroukee 3:6ea97936f6fa 227 out_message_in++;
Cheroukee 3:6ea97936f6fa 228 //////////////////////////////////////////////////////
JayMcGee 7:d25bcde7dcf1 229 output = 0;
JayMcGee 7:d25bcde7dcf1 230 wait(1);
Cheroukee 3:6ea97936f6fa 231 out_timer.start(MANCHESTER_SPEED_OUT);
Cheroukee 2:fdb34827d964 232 }
Cheroukee 3:6ea97936f6fa 233
Cheroukee 4:728322e9e3eb 234 typedef enum {
Cheroukee 4:728322e9e3eb 235 preambule = 0,
Cheroukee 4:728322e9e3eb 236 start,
Cheroukee 4:728322e9e3eb 237 options,
Cheroukee 4:728322e9e3eb 238 length,
Cheroukee 4:728322e9e3eb 239 data,
Cheroukee 4:728322e9e3eb 240 crc,
Cheroukee 8:a878763b0ae3 241 end,
Cheroukee 8:a878763b0ae3 242 idle
Cheroukee 4:728322e9e3eb 243 } out_state_t;
Cheroukee 4:728322e9e3eb 244
Cheroukee 3:6ea97936f6fa 245 void radio_out(void const *args)
Cheroukee 3:6ea97936f6fa 246 {
Cheroukee 4:728322e9e3eb 247 static byte current_byte_progress = 0;
Cheroukee 4:728322e9e3eb 248 static byte current_byte = 0;
Cheroukee 8:a878763b0ae3 249 static byte out_current_state = 0;
Cheroukee 6:f3f442d43c8f 250 static bool IsBitTransition = false;
Cheroukee 6:f3f442d43c8f 251 static byte next_value = 0;
Cheroukee 4:728322e9e3eb 252
Cheroukee 3:6ea97936f6fa 253 radio_message_t* message = (radio_message_t*)(out_messages + out_message_out);
Cheroukee 3:6ea97936f6fa 254
Cheroukee 3:6ea97936f6fa 255 #define OUTPUT_HIGH output = 1;
Cheroukee 3:6ea97936f6fa 256 #define OUTPUT_LOW output = 0;
Cheroukee 3:6ea97936f6fa 257
Cheroukee 6:f3f442d43c8f 258 #define SET_VAL_BIT_MASK(val) next_value = 0x1 & val;
Cheroukee 4:728322e9e3eb 259 #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift))
Cheroukee 4:728322e9e3eb 260
Cheroukee 4:728322e9e3eb 261
Cheroukee 4:728322e9e3eb 262 #define CHECK_NEXT_STATE if (current_byte_progress > 7) \
Cheroukee 4:728322e9e3eb 263 { \
Cheroukee 8:a878763b0ae3 264 out_current_state++; \
Cheroukee 4:728322e9e3eb 265 current_byte_progress = 0; \
Cheroukee 4:728322e9e3eb 266 }
Cheroukee 4:728322e9e3eb 267
Cheroukee 8:a878763b0ae3 268 //out_debug_led = !out_debug_led;
Cheroukee 4:728322e9e3eb 269
Cheroukee 6:f3f442d43c8f 270 if (!IsBitTransition)
Cheroukee 4:728322e9e3eb 271 {
Cheroukee 6:f3f442d43c8f 272 // Dependant du state, on progresse dans l'envoi du message
Cheroukee 8:a878763b0ae3 273 switch (out_current_state)
Cheroukee 4:728322e9e3eb 274 {
Cheroukee 6:f3f442d43c8f 275 case preambule: // preambule
Cheroukee 6:f3f442d43c8f 276 {
Cheroukee 6:f3f442d43c8f 277 SET_VAL_SHIFT(message->preambule, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 278 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 279 break;
Cheroukee 6:f3f442d43c8f 280 }
Cheroukee 6:f3f442d43c8f 281 case start: // start
Cheroukee 6:f3f442d43c8f 282 {
Cheroukee 6:f3f442d43c8f 283 SET_VAL_SHIFT(message->start, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 284 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 285 break;
Cheroukee 6:f3f442d43c8f 286 }
Cheroukee 6:f3f442d43c8f 287 case options: // entete options
Cheroukee 6:f3f442d43c8f 288 {
Cheroukee 6:f3f442d43c8f 289 SET_VAL_SHIFT(message->options, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 290 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 291 break;
Cheroukee 6:f3f442d43c8f 292 }
Cheroukee 6:f3f442d43c8f 293 case length: // entete lenght
Cheroukee 6:f3f442d43c8f 294 {
Cheroukee 6:f3f442d43c8f 295 SET_VAL_SHIFT(message->length, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 296 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 297 break;
Cheroukee 6:f3f442d43c8f 298 }
Cheroukee 6:f3f442d43c8f 299 case data: // charge utile
Cheroukee 5:70d338ee3f77 300 {
Cheroukee 6:f3f442d43c8f 301 SET_VAL_SHIFT(message->data[current_byte], current_byte_progress++)
Cheroukee 6:f3f442d43c8f 302 if (current_byte_progress > 7)
Cheroukee 5:70d338ee3f77 303 {
Cheroukee 6:f3f442d43c8f 304 current_byte++;
Cheroukee 6:f3f442d43c8f 305 current_byte_progress = 0;
JayMcGee 7:d25bcde7dcf1 306 if (current_byte >= message->length)
Cheroukee 6:f3f442d43c8f 307 {
Cheroukee 6:f3f442d43c8f 308 current_byte = 0;
Cheroukee 8:a878763b0ae3 309 out_current_state++;
Cheroukee 6:f3f442d43c8f 310 }
Cheroukee 6:f3f442d43c8f 311 }
Cheroukee 6:f3f442d43c8f 312 //CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 313 break;
Cheroukee 6:f3f442d43c8f 314 }
Cheroukee 6:f3f442d43c8f 315 case crc: // controle
Cheroukee 6:f3f442d43c8f 316 {
Cheroukee 6:f3f442d43c8f 317 SET_VAL_SHIFT(message->control, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 318 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 319 break;
Cheroukee 6:f3f442d43c8f 320 }
Cheroukee 6:f3f442d43c8f 321 case end: // end
Cheroukee 6:f3f442d43c8f 322 {
Cheroukee 6:f3f442d43c8f 323 SET_VAL_SHIFT(message->end, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 324 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 325 break;
Cheroukee 5:70d338ee3f77 326 }
Cheroukee 8:a878763b0ae3 327 case idle:
Cheroukee 6:f3f442d43c8f 328 {
Cheroukee 6:f3f442d43c8f 329 //current_state = 0;
Cheroukee 6:f3f442d43c8f 330 current_byte = 0;
Cheroukee 6:f3f442d43c8f 331 current_byte_progress = 0;
Cheroukee 6:f3f442d43c8f 332 break;
JayMcGee 7:d25bcde7dcf1 333 }
Cheroukee 6:f3f442d43c8f 334 }
Cheroukee 6:f3f442d43c8f 335
Cheroukee 8:a878763b0ae3 336 if (next_value != output && out_current_state != idle)
Cheroukee 4:728322e9e3eb 337 {
Cheroukee 6:f3f442d43c8f 338 output = !output;
Cheroukee 6:f3f442d43c8f 339 }
Cheroukee 6:f3f442d43c8f 340
Cheroukee 8:a878763b0ae3 341 if (out_current_state > end)
Cheroukee 4:728322e9e3eb 342 {
Cheroukee 8:a878763b0ae3 343 //frame_end_led = 0;
Cheroukee 8:a878763b0ae3 344 //out_current_state = preambule;
Cheroukee 4:728322e9e3eb 345 }
Cheroukee 6:f3f442d43c8f 346 }
Cheroukee 8:a878763b0ae3 347 else if (out_current_state != idle)
Cheroukee 6:f3f442d43c8f 348 {
Cheroukee 6:f3f442d43c8f 349 output = !output;
Cheroukee 4:728322e9e3eb 350 }
Cheroukee 4:728322e9e3eb 351
JayMcGee 7:d25bcde7dcf1 352 IsBitTransition = !IsBitTransition;
JayMcGee 7:d25bcde7dcf1 353
Cheroukee 3:6ea97936f6fa 354 }