APP4 S5

Dependencies:   mbed-rtos mbed

Committer:
Cheroukee
Date:
Thu Oct 12 20:48:02 2017 +0000
Revision:
9:081324663b8c
Parent:
8:a878763b0ae3
Child:
10:c4629b6c42f8
Hello

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 9:081324663b8c 30 #ifndef LED
Cheroukee 9:081324663b8c 31 DigitalOut in_debug_led4(LED4);
Cheroukee 9:081324663b8c 32 DigitalOut out_debug_led3(LED3);
Cheroukee 3:6ea97936f6fa 33
Cheroukee 9:081324663b8c 34 DigitalOut frame_out_end_led2(LED2);
Cheroukee 9:081324663b8c 35 DigitalOut frame_in_end_led1(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 9:081324663b8c 57 int start_speed = MANCHESTER_SPEED_OUT;
Cheroukee 8:a878763b0ae3 58
Cheroukee 8:a878763b0ae3 59 byte current_state = in_attente;
Cheroukee 8:a878763b0ae3 60 byte current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 61
Cheroukee 8:a878763b0ae3 62 void stop_frame(void const *n);
Cheroukee 8:a878763b0ae3 63
Cheroukee 8:a878763b0ae3 64 RtosTimer ticker_watch(stop_frame, osTimerPeriodic, NULL);
Cheroukee 9:081324663b8c 65
Cheroukee 8:a878763b0ae3 66 Thread thread;
Cheroukee 8:a878763b0ae3 67
Cheroukee 8:a878763b0ae3 68 void stop_frame(void const *n)
Cheroukee 3:6ea97936f6fa 69 {
Cheroukee 9:081324663b8c 70 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 71 current_state = in_attente;
Cheroukee 8:a878763b0ae3 72 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 73 ticker_watch.stop();
Cheroukee 8:a878763b0ae3 74 }
Cheroukee 8:a878763b0ae3 75
Cheroukee 8:a878763b0ae3 76 volatile int t = 0;
Cheroukee 8:a878763b0ae3 77 volatile int c = 0;
Cheroukee 8:a878763b0ae3 78
Cheroukee 8:a878763b0ae3 79 void radio_in()
Cheroukee 8:a878763b0ae3 80 {
Cheroukee 8:a878763b0ae3 81
Cheroukee 8:a878763b0ae3 82 static Timer timer;
Cheroukee 8:a878763b0ae3 83 static int t_half = 0;
Cheroukee 8:a878763b0ae3 84
Cheroukee 8:a878763b0ae3 85 static byte current_byte = 0;
Cheroukee 8:a878763b0ae3 86
Cheroukee 9:081324663b8c 87 in_debug_led4 = !in_debug_led4;
Cheroukee 8:a878763b0ae3 88
Cheroukee 8:a878763b0ae3 89
Cheroukee 8:a878763b0ae3 90 switch (current_state)
Cheroukee 8:a878763b0ae3 91 {
Cheroukee 8:a878763b0ae3 92 case in_attente:
Cheroukee 9:081324663b8c 93 {
Cheroukee 9:081324663b8c 94 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 95 if (input == 1)
Cheroukee 8:a878763b0ae3 96 {
Cheroukee 8:a878763b0ae3 97 timer.start();
Cheroukee 8:a878763b0ae3 98 current_state = in_preambule;
Cheroukee 8:a878763b0ae3 99 current_byte_progress = 1;
Cheroukee 9:081324663b8c 100 frame_in_end_led1 = 1;
Cheroukee 8:a878763b0ae3 101 }
Cheroukee 8:a878763b0ae3 102 break;
Cheroukee 8:a878763b0ae3 103 }
Cheroukee 8:a878763b0ae3 104 case in_preambule:
Cheroukee 8:a878763b0ae3 105 {
Cheroukee 8:a878763b0ae3 106 current_byte_progress++;
Cheroukee 8:a878763b0ae3 107 t = timer.read_ms();
Cheroukee 8:a878763b0ae3 108 timer.reset();
Cheroukee 8:a878763b0ae3 109 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 110 {
Cheroukee 8:a878763b0ae3 111 t_half = t / 2;
Cheroukee 8:a878763b0ae3 112 ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 113 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 114 current_state = in_data;
Cheroukee 8:a878763b0ae3 115 c = t;
Cheroukee 8:a878763b0ae3 116 thread.signal_set(0x1);
Cheroukee 8:a878763b0ae3 117 }
Cheroukee 8:a878763b0ae3 118 break;
Cheroukee 8:a878763b0ae3 119 }
Cheroukee 8:a878763b0ae3 120 case in_data:
Cheroukee 8:a878763b0ae3 121 {
Cheroukee 8:a878763b0ae3 122 if(timer.read_ms() > t + t_half)
Cheroukee 8:a878763b0ae3 123 {
Cheroukee 9:081324663b8c 124 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 125 current_state = in_attente;
Cheroukee 8:a878763b0ae3 126 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 127
Cheroukee 8:a878763b0ae3 128 timer.stop();
Cheroukee 8:a878763b0ae3 129 timer.reset();
Cheroukee 8:a878763b0ae3 130 }
Cheroukee 8:a878763b0ae3 131 else if (timer.read_ms() > t_half)
Cheroukee 8:a878763b0ae3 132 {
Cheroukee 8:a878763b0ae3 133 current_byte = (!input << (7 - current_byte_progress)) | current_byte;
Cheroukee 8:a878763b0ae3 134 current_byte_progress++ ;
Cheroukee 8:a878763b0ae3 135 //PC.putc(input);
Cheroukee 8:a878763b0ae3 136 // Display data
Cheroukee 8:a878763b0ae3 137 ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 138 timer.reset();
Cheroukee 8:a878763b0ae3 139
Cheroukee 8:a878763b0ae3 140 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 141 {
Cheroukee 8:a878763b0ae3 142 c = current_byte;
Cheroukee 8:a878763b0ae3 143 thread.signal_set(0x1);
Cheroukee 8:a878763b0ae3 144 current_byte = 0;
Cheroukee 8:a878763b0ae3 145 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 146 }
Cheroukee 8:a878763b0ae3 147 }
Cheroukee 8:a878763b0ae3 148 else
Cheroukee 8:a878763b0ae3 149 {
Cheroukee 8:a878763b0ae3 150 //ticker_watch.start(t + t_half);
Cheroukee 8:a878763b0ae3 151 }
Cheroukee 8:a878763b0ae3 152 break;
Cheroukee 8:a878763b0ae3 153 }
Cheroukee 8:a878763b0ae3 154 case in_idle:
Cheroukee 8:a878763b0ae3 155 {
Cheroukee 9:081324663b8c 156 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 157 current_state = in_attente;
Cheroukee 8:a878763b0ae3 158 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 159 break;
Cheroukee 8:a878763b0ae3 160 }
Cheroukee 8:a878763b0ae3 161 }
Cheroukee 3:6ea97936f6fa 162 }
Cheroukee 3:6ea97936f6fa 163
Cheroukee 8:a878763b0ae3 164 void thread_putc()
Cheroukee 3:6ea97936f6fa 165 {
Cheroukee 8:a878763b0ae3 166 while(1)
Cheroukee 8:a878763b0ae3 167 {
Cheroukee 8:a878763b0ae3 168 Thread::signal_wait(0x1);
Cheroukee 8:a878763b0ae3 169 PC.printf("0x%x\n\r", c);
Cheroukee 8:a878763b0ae3 170 }
Cheroukee 3:6ea97936f6fa 171 }
Cheroukee 3:6ea97936f6fa 172
Cheroukee 8:a878763b0ae3 173
Cheroukee 3:6ea97936f6fa 174 void setup_radio_in()
Cheroukee 3:6ea97936f6fa 175 {
Cheroukee 4:728322e9e3eb 176 in_message_in = 0;
Cheroukee 4:728322e9e3eb 177 in_message_out = 0;
Cheroukee 4:728322e9e3eb 178
Cheroukee 8:a878763b0ae3 179 thread.start(callback(thread_putc));
Cheroukee 3:6ea97936f6fa 180
Cheroukee 8:a878763b0ae3 181 input.rise(&radio_in);
Cheroukee 8:a878763b0ae3 182 input.fall(&radio_in);
Cheroukee 3:6ea97936f6fa 183 }
Cheroukee 3:6ea97936f6fa 184
Cheroukee 3:6ea97936f6fa 185
Cheroukee 3:6ea97936f6fa 186 void setup_radio_out()
Cheroukee 2:fdb34827d964 187 {
Cheroukee 3:6ea97936f6fa 188 out_message_in = 0;
Cheroukee 3:6ea97936f6fa 189 out_message_out = 0;
Cheroukee 3:6ea97936f6fa 190
Cheroukee 9:081324663b8c 191 out_debug_led3 = 0;
Cheroukee 9:081324663b8c 192 frame_out_end_led2 = 0;
Cheroukee 2:fdb34827d964 193
Cheroukee 3:6ea97936f6fa 194 //////////////////////////////////////////////////////
Cheroukee 3:6ea97936f6fa 195 // Creation d'un message et insertion dans le buffer
Cheroukee 3:6ea97936f6fa 196 radio_message_t* message = (out_messages + out_message_in);
Cheroukee 3:6ea97936f6fa 197
Cheroukee 3:6ea97936f6fa 198 message->preambule = HEADER_DELIMITER;
Cheroukee 3:6ea97936f6fa 199 message->start = HEADER_START;
Cheroukee 3:6ea97936f6fa 200 message->options = HEADER_DELIMITER;
Cheroukee 5:70d338ee3f77 201 message->length = 0x3;
Cheroukee 3:6ea97936f6fa 202
Cheroukee 5:70d338ee3f77 203 message->data[0] = 0xC0;
Cheroukee 5:70d338ee3f77 204 message->data[1] = 0xFF;
Cheroukee 5:70d338ee3f77 205 message->data[2] = 0xEE;
Cheroukee 3:6ea97936f6fa 206
Cheroukee 3:6ea97936f6fa 207 // Ajouter calcul
Cheroukee 5:70d338ee3f77 208 message->control = 0xCE;
Cheroukee 3:6ea97936f6fa 209
Cheroukee 3:6ea97936f6fa 210 message->end = FOOTER_END;
Cheroukee 3:6ea97936f6fa 211 // On avance dans le buffer;
Cheroukee 3:6ea97936f6fa 212 out_message_in++;
Cheroukee 3:6ea97936f6fa 213 //////////////////////////////////////////////////////
JayMcGee 7:d25bcde7dcf1 214 output = 0;
JayMcGee 7:d25bcde7dcf1 215 wait(1);
Cheroukee 9:081324663b8c 216 out_timer.start(start_speed);
Cheroukee 2:fdb34827d964 217 }
Cheroukee 3:6ea97936f6fa 218
Cheroukee 4:728322e9e3eb 219 typedef enum {
Cheroukee 9:081324663b8c 220 out_preambule = 0,
Cheroukee 9:081324663b8c 221 out_start,
Cheroukee 9:081324663b8c 222 out_options,
Cheroukee 9:081324663b8c 223 out_length,
Cheroukee 9:081324663b8c 224 out_data,
Cheroukee 9:081324663b8c 225 out_crc,
Cheroukee 9:081324663b8c 226 out_end,
Cheroukee 9:081324663b8c 227 out_idle
Cheroukee 4:728322e9e3eb 228 } out_state_t;
Cheroukee 4:728322e9e3eb 229
Cheroukee 3:6ea97936f6fa 230 void radio_out(void const *args)
Cheroukee 3:6ea97936f6fa 231 {
Cheroukee 4:728322e9e3eb 232 static byte current_byte_progress = 0;
Cheroukee 4:728322e9e3eb 233 static byte current_byte = 0;
Cheroukee 8:a878763b0ae3 234 static byte out_current_state = 0;
Cheroukee 6:f3f442d43c8f 235 static bool IsBitTransition = false;
Cheroukee 6:f3f442d43c8f 236 static byte next_value = 0;
Cheroukee 4:728322e9e3eb 237
Cheroukee 3:6ea97936f6fa 238 radio_message_t* message = (radio_message_t*)(out_messages + out_message_out);
Cheroukee 3:6ea97936f6fa 239
Cheroukee 3:6ea97936f6fa 240 #define OUTPUT_HIGH output = 1;
Cheroukee 3:6ea97936f6fa 241 #define OUTPUT_LOW output = 0;
Cheroukee 3:6ea97936f6fa 242
Cheroukee 6:f3f442d43c8f 243 #define SET_VAL_BIT_MASK(val) next_value = 0x1 & val;
Cheroukee 4:728322e9e3eb 244 #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift))
Cheroukee 4:728322e9e3eb 245
Cheroukee 4:728322e9e3eb 246
Cheroukee 4:728322e9e3eb 247 #define CHECK_NEXT_STATE if (current_byte_progress > 7) \
Cheroukee 4:728322e9e3eb 248 { \
Cheroukee 8:a878763b0ae3 249 out_current_state++; \
Cheroukee 4:728322e9e3eb 250 current_byte_progress = 0; \
Cheroukee 4:728322e9e3eb 251 }
Cheroukee 4:728322e9e3eb 252
Cheroukee 9:081324663b8c 253 out_debug_led3 = !out_debug_led3;
Cheroukee 4:728322e9e3eb 254
Cheroukee 6:f3f442d43c8f 255 if (!IsBitTransition)
Cheroukee 4:728322e9e3eb 256 {
Cheroukee 6:f3f442d43c8f 257 // Dependant du state, on progresse dans l'envoi du message
Cheroukee 8:a878763b0ae3 258 switch (out_current_state)
Cheroukee 4:728322e9e3eb 259 {
Cheroukee 9:081324663b8c 260 case out_preambule: // preambule
Cheroukee 6:f3f442d43c8f 261 {
Cheroukee 9:081324663b8c 262 frame_out_end_led2 = 1;
Cheroukee 6:f3f442d43c8f 263 SET_VAL_SHIFT(message->preambule, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 264 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 265 break;
Cheroukee 6:f3f442d43c8f 266 }
Cheroukee 9:081324663b8c 267 case out_start: // start
Cheroukee 6:f3f442d43c8f 268 {
Cheroukee 6:f3f442d43c8f 269 SET_VAL_SHIFT(message->start, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 270 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 271 break;
Cheroukee 6:f3f442d43c8f 272 }
Cheroukee 9:081324663b8c 273 case out_options: // entete options
Cheroukee 6:f3f442d43c8f 274 {
Cheroukee 6:f3f442d43c8f 275 SET_VAL_SHIFT(message->options, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 276 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 277 break;
Cheroukee 6:f3f442d43c8f 278 }
Cheroukee 9:081324663b8c 279 case out_length: // entete lenght
Cheroukee 6:f3f442d43c8f 280 {
Cheroukee 6:f3f442d43c8f 281 SET_VAL_SHIFT(message->length, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 282 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 283 break;
Cheroukee 6:f3f442d43c8f 284 }
Cheroukee 9:081324663b8c 285 case out_data: // charge utile
Cheroukee 5:70d338ee3f77 286 {
Cheroukee 6:f3f442d43c8f 287 SET_VAL_SHIFT(message->data[current_byte], current_byte_progress++)
Cheroukee 6:f3f442d43c8f 288 if (current_byte_progress > 7)
Cheroukee 5:70d338ee3f77 289 {
Cheroukee 6:f3f442d43c8f 290 current_byte++;
Cheroukee 6:f3f442d43c8f 291 current_byte_progress = 0;
JayMcGee 7:d25bcde7dcf1 292 if (current_byte >= message->length)
Cheroukee 6:f3f442d43c8f 293 {
Cheroukee 6:f3f442d43c8f 294 current_byte = 0;
Cheroukee 8:a878763b0ae3 295 out_current_state++;
Cheroukee 6:f3f442d43c8f 296 }
Cheroukee 6:f3f442d43c8f 297 }
Cheroukee 6:f3f442d43c8f 298 //CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 299 break;
Cheroukee 6:f3f442d43c8f 300 }
Cheroukee 9:081324663b8c 301 case out_crc: // controle
Cheroukee 6:f3f442d43c8f 302 {
Cheroukee 6:f3f442d43c8f 303 SET_VAL_SHIFT(message->control, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 304 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 305 break;
Cheroukee 6:f3f442d43c8f 306 }
Cheroukee 9:081324663b8c 307 case out_end: // end
Cheroukee 6:f3f442d43c8f 308 {
Cheroukee 6:f3f442d43c8f 309 SET_VAL_SHIFT(message->end, current_byte_progress++);
Cheroukee 6:f3f442d43c8f 310 CHECK_NEXT_STATE
Cheroukee 6:f3f442d43c8f 311 break;
Cheroukee 5:70d338ee3f77 312 }
Cheroukee 9:081324663b8c 313 case out_idle:
Cheroukee 6:f3f442d43c8f 314 {
Cheroukee 6:f3f442d43c8f 315 //current_state = 0;
Cheroukee 6:f3f442d43c8f 316 current_byte = 0;
Cheroukee 6:f3f442d43c8f 317 current_byte_progress = 0;
Cheroukee 6:f3f442d43c8f 318 break;
JayMcGee 7:d25bcde7dcf1 319 }
Cheroukee 6:f3f442d43c8f 320 }
Cheroukee 6:f3f442d43c8f 321
Cheroukee 9:081324663b8c 322 // Changement d'etat pour permettre de faire la bonne transition de valeur
Cheroukee 9:081324663b8c 323 if (next_value != output && out_current_state != out_idle)
Cheroukee 4:728322e9e3eb 324 {
Cheroukee 6:f3f442d43c8f 325 output = !output;
Cheroukee 6:f3f442d43c8f 326 }
Cheroukee 6:f3f442d43c8f 327
Cheroukee 9:081324663b8c 328 // Si on est a la fin du packet, on retourne au debut et on reenvoye les donnees
Cheroukee 9:081324663b8c 329 if (out_current_state > out_end)
Cheroukee 4:728322e9e3eb 330 {
Cheroukee 9:081324663b8c 331 frame_out_end_led2 = 0;
Cheroukee 9:081324663b8c 332 out_current_state = out_preambule;
Cheroukee 9:081324663b8c 333 out_timer.stop();
Cheroukee 9:081324663b8c 334 start_speed += 1;
Cheroukee 9:081324663b8c 335 out_timer.start(start_speed);
Cheroukee 4:728322e9e3eb 336 }
Cheroukee 6:f3f442d43c8f 337 }
Cheroukee 9:081324663b8c 338 // Si on est pas dans une transitipon
Cheroukee 9:081324663b8c 339 else if (out_current_state != out_idle)
Cheroukee 6:f3f442d43c8f 340 {
Cheroukee 6:f3f442d43c8f 341 output = !output;
Cheroukee 4:728322e9e3eb 342 }
Cheroukee 4:728322e9e3eb 343
JayMcGee 7:d25bcde7dcf1 344 IsBitTransition = !IsBitTransition;
JayMcGee 7:d25bcde7dcf1 345
Cheroukee 3:6ea97936f6fa 346 }