APP4 S5

Dependencies:   mbed-rtos mbed

Committer:
Cheroukee
Date:
Sun Oct 22 20:20:42 2017 +0000
Revision:
13:b44c1f678aff
Parent:
12:e21604b50719
Needs testing, added CRC calculations and adapted queue code to work with radio

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cheroukee 10:c4629b6c42f8 1 /*
Cheroukee 10:c4629b6c42f8 2 * radio.cpp - Code de radio manchester - Jean-Philippe Fournier (fouj1807) - Jean-Pascal McGee (mcgj2701)
Cheroukee 10:c4629b6c42f8 3 */
Cheroukee 1:5fc0c0996264 4
Cheroukee 1:5fc0c0996264 5 #include "radio.h"
Cheroukee 10:c4629b6c42f8 6 #include "quick_queue.h"
Cheroukee 1:5fc0c0996264 7
Cheroukee 2:fdb34827d964 8 #include "mbed.h"
Cheroukee 3:6ea97936f6fa 9 #include "rtos.h"
Cheroukee 2:fdb34827d964 10
Cheroukee 13:b44c1f678aff 11 #include "crc.h"
Cheroukee 10:c4629b6c42f8 12 // Vitesse de sortie des message manchester
Cheroukee 11:1d277e7e272d 13 #define MANCHESTER_SPEED_OUT 4
Cheroukee 1:5fc0c0996264 14
Cheroukee 10:c4629b6c42f8 15 // Pins de reception et d'entree
Cheroukee 3:6ea97936f6fa 16 #define INPUT_RADIO p18
Cheroukee 2:fdb34827d964 17 #define OUTPUT_RADIO p6
Cheroukee 2:fdb34827d964 18
Cheroukee 10:c4629b6c42f8 19 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 20 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 21 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 22 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 23
Cheroukee 10:c4629b6c42f8 24 // Private API enumerations
Cheroukee 10:c4629b6c42f8 25 // Receiver states
Cheroukee 10:c4629b6c42f8 26 typedef enum {
Cheroukee 10:c4629b6c42f8 27 in_attente = 0,
Cheroukee 10:c4629b6c42f8 28 in_preambule,
Cheroukee 10:c4629b6c42f8 29 in_data
Cheroukee 10:c4629b6c42f8 30 } receive_state_t;
Cheroukee 10:c4629b6c42f8 31
Cheroukee 10:c4629b6c42f8 32 // Emitter states
Cheroukee 10:c4629b6c42f8 33 typedef enum {
Cheroukee 10:c4629b6c42f8 34 out_preambule = 0,
Cheroukee 10:c4629b6c42f8 35 out_start,
Cheroukee 10:c4629b6c42f8 36 out_options,
Cheroukee 10:c4629b6c42f8 37 out_length,
Cheroukee 10:c4629b6c42f8 38 out_data,
Cheroukee 10:c4629b6c42f8 39 out_crc,
Cheroukee 10:c4629b6c42f8 40 out_end,
Cheroukee 10:c4629b6c42f8 41 out_idle
Cheroukee 10:c4629b6c42f8 42 } emitter_state_t;
Cheroukee 10:c4629b6c42f8 43
Cheroukee 10:c4629b6c42f8 44 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 45 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 46 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 47 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 48 // Fonctions privee de l'API
Cheroukee 1:5fc0c0996264 49
Cheroukee 10:c4629b6c42f8 50 // Setup radio output
Cheroukee 10:c4629b6c42f8 51 void setup_radio_out();
Cheroukee 10:c4629b6c42f8 52 // Setup radio input
Cheroukee 10:c4629b6c42f8 53 void setup_radio_in();
Cheroukee 10:c4629b6c42f8 54 // Fonction periodique d'envoi de messages
Cheroukee 10:c4629b6c42f8 55 void radio_out(void const *args);
Cheroukee 10:c4629b6c42f8 56 // Fonction appellee lors de l'interruption sur la pin d'entree
Cheroukee 10:c4629b6c42f8 57 void radio_in();
Cheroukee 10:c4629b6c42f8 58 // Fonction content la state machine de reception de trame
Cheroukee 11:1d277e7e272d 59 bool receive_frame(byte read_byte);
Cheroukee 11:1d277e7e272d 60 // Fonction de timeout de la reception de d ata manchester
Cheroukee 10:c4629b6c42f8 61 void stop_frame(void const *n);
Cheroukee 10:c4629b6c42f8 62 // Fonction du thread d'affichage dans le terminal
Cheroukee 10:c4629b6c42f8 63 void thread_putc();
Cheroukee 2:fdb34827d964 64
Cheroukee 10:c4629b6c42f8 65 // Fonction qui cree un message et le mets dans un message
Cheroukee 10:c4629b6c42f8 66 void add_new_message();
Cheroukee 10:c4629b6c42f8 67
Cheroukee 10:c4629b6c42f8 68 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 69 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 70 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 71 ////////////////////////////////////////////////////////////////////////////
Cheroukee 3:6ea97936f6fa 72
Cheroukee 10:c4629b6c42f8 73 // TODO HOW WE DO THIS
Cheroukee 10:c4629b6c42f8 74 Mail<radio_message_t, MESSAGE_BUFFER_SIZE> out_mail;
Cheroukee 10:c4629b6c42f8 75 Mail<radio_message_t, MESSAGE_BUFFER_SIZE> in_mail;
Cheroukee 3:6ea97936f6fa 76
Cheroukee 10:c4629b6c42f8 77 // Utilise pour les interruptions et la lecture de la valeur d'entree de la pin de reception
Cheroukee 10:c4629b6c42f8 78 InterruptIn input(INPUT_RADIO);
Cheroukee 10:c4629b6c42f8 79 // Pin de sortie de la radio, permet l'envoi de code binaire, dans ce cas, manchester
Cheroukee 2:fdb34827d964 80 DigitalOut output(OUTPUT_RADIO);
Cheroukee 2:fdb34827d964 81
Cheroukee 10:c4629b6c42f8 82 // Definition des LED de debug de la radio
Cheroukee 9:081324663b8c 83 #ifndef LED
Cheroukee 9:081324663b8c 84 DigitalOut in_debug_led4(LED4);
Cheroukee 9:081324663b8c 85 DigitalOut out_debug_led3(LED3);
Cheroukee 3:6ea97936f6fa 86
Cheroukee 9:081324663b8c 87 DigitalOut frame_out_end_led2(LED2);
Cheroukee 9:081324663b8c 88 DigitalOut frame_in_end_led1(LED1);
Cheroukee 8:a878763b0ae3 89 #endif
Cheroukee 8:a878763b0ae3 90
Cheroukee 10:c4629b6c42f8 91 // Thread d'output de debugging
Cheroukee 10:c4629b6c42f8 92 Thread thread;
Cheroukee 8:a878763b0ae3 93
Cheroukee 9:081324663b8c 94 int start_speed = MANCHESTER_SPEED_OUT;
Cheroukee 8:a878763b0ae3 95
Cheroukee 8:a878763b0ae3 96 byte current_state = in_attente;
Cheroukee 8:a878763b0ae3 97 byte current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 98
Cheroukee 10:c4629b6c42f8 99 // Timer d'evoi periodic de donnes vers la radio
Cheroukee 10:c4629b6c42f8 100 RtosTimer out_timer(radio_out, osTimerPeriodic, NULL);
Cheroukee 10:c4629b6c42f8 101
Cheroukee 10:c4629b6c42f8 102 // Timer qui mesure le temps et cree un timer sur la reception de data, permet le timeout du
Cheroukee 10:c4629b6c42f8 103 // data qui arrive de la reception. Termine la reception manchester
Cheroukee 10:c4629b6c42f8 104 RtosTimer ticker_watch(stop_frame, osTimerOnce, NULL);
Cheroukee 10:c4629b6c42f8 105
Cheroukee 10:c4629b6c42f8 106 // Char used by the debugging serial
Cheroukee 10:c4629b6c42f8 107 volatile int debug_char_output = 0;
Cheroukee 8:a878763b0ae3 108
Cheroukee 10:c4629b6c42f8 109 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 110 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 111 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 112 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 113
Cheroukee 10:c4629b6c42f8 114 // Setup radio input
Cheroukee 10:c4629b6c42f8 115 void setup_radio_in()
Cheroukee 10:c4629b6c42f8 116 {
Cheroukee 10:c4629b6c42f8 117 //thread.start(callback(thread_putc));
Cheroukee 10:c4629b6c42f8 118
Cheroukee 10:c4629b6c42f8 119 input.rise(&radio_in);
Cheroukee 10:c4629b6c42f8 120 input.fall(&radio_in);
Cheroukee 10:c4629b6c42f8 121 }
Cheroukee 9:081324663b8c 122
Cheroukee 10:c4629b6c42f8 123 // Setup radio output
Cheroukee 10:c4629b6c42f8 124 void setup_radio_out()
Cheroukee 10:c4629b6c42f8 125 {
Cheroukee 10:c4629b6c42f8 126 out_debug_led3 = 0;
Cheroukee 10:c4629b6c42f8 127 frame_out_end_led2 = 0;
Cheroukee 10:c4629b6c42f8 128 output = 0;
Cheroukee 10:c4629b6c42f8 129
Cheroukee 10:c4629b6c42f8 130 //add_new_message();
Cheroukee 10:c4629b6c42f8 131
Cheroukee 10:c4629b6c42f8 132 wait(1);
Cheroukee 10:c4629b6c42f8 133 out_timer.start(start_speed);
Cheroukee 10:c4629b6c42f8 134 }
Cheroukee 8:a878763b0ae3 135
Cheroukee 10:c4629b6c42f8 136 void add_new_message(){
Cheroukee 10:c4629b6c42f8 137 //////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 138 // Creation d'un message et insertion dans le buffer
Cheroukee 10:c4629b6c42f8 139 radio_message_t* message = get_new_out_message();
Cheroukee 10:c4629b6c42f8 140 if (message != NULL)
Cheroukee 10:c4629b6c42f8 141 {
Cheroukee 10:c4629b6c42f8 142 message->preambule = HEADER_DELIMITER;
Cheroukee 10:c4629b6c42f8 143 message->start = HEADER_START;
Cheroukee 10:c4629b6c42f8 144 message->options = HEADER_DELIMITER;
Cheroukee 10:c4629b6c42f8 145 message->length = 0x3;
Cheroukee 10:c4629b6c42f8 146
Cheroukee 10:c4629b6c42f8 147 message->data[0] = 0xC0;
Cheroukee 10:c4629b6c42f8 148 message->data[1] = 0xFF;
Cheroukee 10:c4629b6c42f8 149 message->data[2] = 0xEE;
Cheroukee 10:c4629b6c42f8 150
Cheroukee 10:c4629b6c42f8 151 // Ajouter calcul
Cheroukee 10:c4629b6c42f8 152 message->control = 0xCE;
Cheroukee 10:c4629b6c42f8 153
Cheroukee 10:c4629b6c42f8 154 message->end = FOOTER_END;
Cheroukee 10:c4629b6c42f8 155 // On avance dans le buffer;
Cheroukee 10:c4629b6c42f8 156 new_out_message_ready();
Cheroukee 10:c4629b6c42f8 157 }
Cheroukee 10:c4629b6c42f8 158 //////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 159 }
Cheroukee 10:c4629b6c42f8 160
Cheroukee 10:c4629b6c42f8 161 #define SET_VAL_BIT_MASK(val) next_value = 0x1 & val;
Cheroukee 10:c4629b6c42f8 162 #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift))
Cheroukee 10:c4629b6c42f8 163 #define CHECK_NEXT_STATE if (current_byte_progress > 7) \
Cheroukee 10:c4629b6c42f8 164 { \
Cheroukee 10:c4629b6c42f8 165 out_current_state++; \
Cheroukee 10:c4629b6c42f8 166 current_byte_progress = 0; \
Cheroukee 10:c4629b6c42f8 167 }
Cheroukee 10:c4629b6c42f8 168
Cheroukee 10:c4629b6c42f8 169 // Fonction appellee periodiquement pour l'envoi du message courant
Cheroukee 10:c4629b6c42f8 170 void radio_out(void const *args)
Cheroukee 3:6ea97936f6fa 171 {
Cheroukee 10:c4629b6c42f8 172 static byte current_byte_progress = 0;
Cheroukee 10:c4629b6c42f8 173 static byte current_byte = 0;
Cheroukee 10:c4629b6c42f8 174 static byte out_current_state = out_preambule;
Cheroukee 10:c4629b6c42f8 175 static bool IsBitTransition = false;
Cheroukee 10:c4629b6c42f8 176 static byte next_value = 0;
Cheroukee 10:c4629b6c42f8 177 static radio_message_t* message = NULL;
Cheroukee 10:c4629b6c42f8 178
Cheroukee 11:1d277e7e272d 179 out_debug_led3 = !out_debug_led3;
Cheroukee 11:1d277e7e272d 180 // Si on est a la fin du packet, on retourne au debut et on reenvoye les donnees
Cheroukee 11:1d277e7e272d 181 if (out_current_state > out_idle)
Cheroukee 11:1d277e7e272d 182 {
Cheroukee 11:1d277e7e272d 183 // Message termine
Cheroukee 11:1d277e7e272d 184 message = NULL;
Cheroukee 11:1d277e7e272d 185 last_out_message_read();
Cheroukee 11:1d277e7e272d 186 frame_out_end_led2 = 0;
Cheroukee 11:1d277e7e272d 187
Cheroukee 11:1d277e7e272d 188 // Reinitialisation des var de messages
Cheroukee 11:1d277e7e272d 189 current_byte = 0;
Cheroukee 11:1d277e7e272d 190 current_byte_progress = 0;
Cheroukee 11:1d277e7e272d 191 out_current_state = out_preambule;
Cheroukee 11:1d277e7e272d 192
Cheroukee 11:1d277e7e272d 193 out_timer.stop();
Cheroukee 11:1d277e7e272d 194 out_timer.start(start_speed);
Cheroukee 11:1d277e7e272d 195 }
Cheroukee 11:1d277e7e272d 196
Cheroukee 10:c4629b6c42f8 197 if (message == NULL)
Cheroukee 10:c4629b6c42f8 198 {
Cheroukee 10:c4629b6c42f8 199 message = get_last_out_message();
Cheroukee 10:c4629b6c42f8 200 }
Cheroukee 8:a878763b0ae3 201
Cheroukee 10:c4629b6c42f8 202 if (message != NULL)
Cheroukee 10:c4629b6c42f8 203 {
Cheroukee 10:c4629b6c42f8 204 if (!IsBitTransition)
Cheroukee 11:1d277e7e272d 205 {
Cheroukee 10:c4629b6c42f8 206 // Dependant du state, on progresse dans l'envoi du message
Cheroukee 10:c4629b6c42f8 207 switch (out_current_state)
Cheroukee 10:c4629b6c42f8 208 {
Cheroukee 10:c4629b6c42f8 209 case out_preambule: // preambule
Cheroukee 10:c4629b6c42f8 210 {
Cheroukee 10:c4629b6c42f8 211 frame_out_end_led2 = 1;
Cheroukee 10:c4629b6c42f8 212 SET_VAL_SHIFT(message->preambule, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 213 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 214 break;
Cheroukee 10:c4629b6c42f8 215 }
Cheroukee 10:c4629b6c42f8 216 case out_start: // start
Cheroukee 10:c4629b6c42f8 217 {
Cheroukee 10:c4629b6c42f8 218 SET_VAL_SHIFT(message->start, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 219 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 220 break;
Cheroukee 10:c4629b6c42f8 221 }
Cheroukee 10:c4629b6c42f8 222 case out_options: // entete options
Cheroukee 10:c4629b6c42f8 223 {
Cheroukee 10:c4629b6c42f8 224 SET_VAL_SHIFT(message->options, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 225 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 226 break;
Cheroukee 10:c4629b6c42f8 227 }
Cheroukee 10:c4629b6c42f8 228 case out_length: // entete lenght
Cheroukee 10:c4629b6c42f8 229 {
Cheroukee 10:c4629b6c42f8 230 SET_VAL_SHIFT(message->length, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 231 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 232 break;
Cheroukee 10:c4629b6c42f8 233 }
Cheroukee 10:c4629b6c42f8 234 case out_data: // charge utile
Cheroukee 10:c4629b6c42f8 235 {
Cheroukee 10:c4629b6c42f8 236 SET_VAL_SHIFT(message->data[current_byte], current_byte_progress++)
Cheroukee 10:c4629b6c42f8 237 if (current_byte_progress > 7)
Cheroukee 10:c4629b6c42f8 238 {
Cheroukee 10:c4629b6c42f8 239 current_byte++;
Cheroukee 10:c4629b6c42f8 240 current_byte_progress = 0;
Cheroukee 10:c4629b6c42f8 241 if (current_byte >= message->length)
Cheroukee 10:c4629b6c42f8 242 {
Cheroukee 10:c4629b6c42f8 243 current_byte = 0;
Cheroukee 10:c4629b6c42f8 244 out_current_state++;
Cheroukee 10:c4629b6c42f8 245 }
Cheroukee 10:c4629b6c42f8 246 }
Cheroukee 10:c4629b6c42f8 247 break;
Cheroukee 10:c4629b6c42f8 248 }
Cheroukee 10:c4629b6c42f8 249 case out_crc: // controle
Cheroukee 10:c4629b6c42f8 250 {
Cheroukee 10:c4629b6c42f8 251 SET_VAL_SHIFT(message->control, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 252 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 253 break;
Cheroukee 10:c4629b6c42f8 254 }
Cheroukee 10:c4629b6c42f8 255 case out_end: // end
Cheroukee 10:c4629b6c42f8 256 {
Cheroukee 10:c4629b6c42f8 257 SET_VAL_SHIFT(message->end, current_byte_progress++);
Cheroukee 10:c4629b6c42f8 258 CHECK_NEXT_STATE
Cheroukee 10:c4629b6c42f8 259 break;
Cheroukee 10:c4629b6c42f8 260 }
Cheroukee 10:c4629b6c42f8 261 case out_idle:
Cheroukee 10:c4629b6c42f8 262 {
Cheroukee 11:1d277e7e272d 263 /*out_debug_led3 = !out_debug_led3;
Cheroukee 10:c4629b6c42f8 264 message = NULL;
Cheroukee 10:c4629b6c42f8 265 last_out_message_read();
Cheroukee 10:c4629b6c42f8 266 current_byte = 0;
Cheroukee 11:1d277e7e272d 267 current_byte_progress = 0;*/
Cheroukee 10:c4629b6c42f8 268 break;
Cheroukee 10:c4629b6c42f8 269 }
Cheroukee 10:c4629b6c42f8 270 }
Cheroukee 10:c4629b6c42f8 271
Cheroukee 10:c4629b6c42f8 272 // Changement d'etat pour permettre de faire la bonne transition de valeur
Cheroukee 11:1d277e7e272d 273 if (next_value != output && out_current_state <= out_idle)
Cheroukee 10:c4629b6c42f8 274 {
Cheroukee 10:c4629b6c42f8 275 output = !output;
Cheroukee 10:c4629b6c42f8 276 }
Cheroukee 10:c4629b6c42f8 277 }
Cheroukee 10:c4629b6c42f8 278 // Si on est pas dans une transitipon
Cheroukee 11:1d277e7e272d 279 else if (out_current_state != out_idle + 1)
Cheroukee 10:c4629b6c42f8 280 {
Cheroukee 10:c4629b6c42f8 281 output = !output;
Cheroukee 11:1d277e7e272d 282 if (out_current_state == out_idle)
Cheroukee 11:1d277e7e272d 283 {
Cheroukee 11:1d277e7e272d 284 out_current_state++;
Cheroukee 11:1d277e7e272d 285 }
Cheroukee 10:c4629b6c42f8 286 }
Cheroukee 10:c4629b6c42f8 287 IsBitTransition = !IsBitTransition;
Cheroukee 10:c4629b6c42f8 288 }
Cheroukee 10:c4629b6c42f8 289 }
Cheroukee 10:c4629b6c42f8 290
Cheroukee 10:c4629b6c42f8 291 // Fonction appellee lors de l'interruption sur la pin d'entree
Cheroukee 8:a878763b0ae3 292 void radio_in()
Cheroukee 8:a878763b0ae3 293 {
Cheroukee 10:c4629b6c42f8 294 // Timer utilise pour le calcul de la periode de l'horloge du code manchester
Cheroukee 8:a878763b0ae3 295 static Timer timer;
Cheroukee 10:c4629b6c42f8 296 // Valeur de la demi periode
Cheroukee 10:c4629b6c42f8 297 static int half_period = 0;
Cheroukee 10:c4629b6c42f8 298 // Valeur de la periode de l'horloge
Cheroukee 10:c4629b6c42f8 299 static int calculated_period = 0;
Cheroukee 10:c4629b6c42f8 300 //
Cheroukee 8:a878763b0ae3 301 static byte current_byte = 0;
Cheroukee 8:a878763b0ae3 302
Cheroukee 9:081324663b8c 303 in_debug_led4 = !in_debug_led4;
Cheroukee 8:a878763b0ae3 304
Cheroukee 8:a878763b0ae3 305
Cheroukee 8:a878763b0ae3 306 switch (current_state)
Cheroukee 8:a878763b0ae3 307 {
Cheroukee 8:a878763b0ae3 308 case in_attente:
Cheroukee 9:081324663b8c 309 {
Cheroukee 9:081324663b8c 310 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 311 if (input == 1)
Cheroukee 8:a878763b0ae3 312 {
Cheroukee 8:a878763b0ae3 313 timer.start();
Cheroukee 8:a878763b0ae3 314 current_state = in_preambule;
Cheroukee 8:a878763b0ae3 315 current_byte_progress = 1;
Cheroukee 9:081324663b8c 316 frame_in_end_led1 = 1;
Cheroukee 8:a878763b0ae3 317 }
Cheroukee 8:a878763b0ae3 318 break;
Cheroukee 8:a878763b0ae3 319 }
Cheroukee 8:a878763b0ae3 320 case in_preambule:
Cheroukee 8:a878763b0ae3 321 {
Cheroukee 8:a878763b0ae3 322 current_byte_progress++;
Cheroukee 10:c4629b6c42f8 323 calculated_period = timer.read_ms();
Cheroukee 8:a878763b0ae3 324 timer.reset();
Cheroukee 8:a878763b0ae3 325 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 326 {
Cheroukee 10:c4629b6c42f8 327 half_period = calculated_period / 2;
Cheroukee 10:c4629b6c42f8 328 ticker_watch.start(calculated_period + half_period);
Cheroukee 8:a878763b0ae3 329 current_byte_progress = 0;
Cheroukee 10:c4629b6c42f8 330 current_byte = 0;
Cheroukee 8:a878763b0ae3 331 current_state = in_data;
Cheroukee 10:c4629b6c42f8 332 debug_char_output = calculated_period;
Cheroukee 10:c4629b6c42f8 333 // thread.signal_set(0x1);
Cheroukee 8:a878763b0ae3 334 }
Cheroukee 8:a878763b0ae3 335 break;
Cheroukee 8:a878763b0ae3 336 }
Cheroukee 8:a878763b0ae3 337 case in_data:
Cheroukee 8:a878763b0ae3 338 {
Cheroukee 10:c4629b6c42f8 339 // Si ca fait plus longtemps que la periode usuelle de reception de donne
Cheroukee 10:c4629b6c42f8 340 // Cela veut dire que l'on doit recommencer la reception
Cheroukee 10:c4629b6c42f8 341 if(timer.read_ms() > calculated_period)
Cheroukee 8:a878763b0ae3 342 {
Cheroukee 9:081324663b8c 343 frame_in_end_led1 = 0;
Cheroukee 8:a878763b0ae3 344 timer.stop();
Cheroukee 10:c4629b6c42f8 345 timer.reset();
Cheroukee 10:c4629b6c42f8 346 if (input == 1)
Cheroukee 10:c4629b6c42f8 347 {
Cheroukee 10:c4629b6c42f8 348 timer.start();
Cheroukee 10:c4629b6c42f8 349 current_state = in_preambule;
Cheroukee 10:c4629b6c42f8 350 current_byte_progress = 1;
Cheroukee 10:c4629b6c42f8 351 }
Cheroukee 10:c4629b6c42f8 352 else
Cheroukee 10:c4629b6c42f8 353 {
Cheroukee 10:c4629b6c42f8 354 current_state = in_attente;
Cheroukee 10:c4629b6c42f8 355 current_byte_progress = 0;
Cheroukee 10:c4629b6c42f8 356 }
Cheroukee 8:a878763b0ae3 357 }
Cheroukee 10:c4629b6c42f8 358 // Si le temps de la demi periode est passe, donc on a une donne reele
Cheroukee 10:c4629b6c42f8 359 else if (timer.read_ms() > half_period)
Cheroukee 8:a878763b0ae3 360 {
Cheroukee 8:a878763b0ae3 361 current_byte = (!input << (7 - current_byte_progress)) | current_byte;
Cheroukee 10:c4629b6c42f8 362 current_byte_progress++ ;
Cheroukee 10:c4629b6c42f8 363 ticker_watch.start(calculated_period + half_period);
Cheroukee 8:a878763b0ae3 364 timer.reset();
Cheroukee 8:a878763b0ae3 365
Cheroukee 8:a878763b0ae3 366 if (current_byte_progress > 7)
Cheroukee 8:a878763b0ae3 367 {
Cheroukee 10:c4629b6c42f8 368 debug_char_output = current_byte;
Cheroukee 11:1d277e7e272d 369 if (receive_frame(current_byte))
Cheroukee 11:1d277e7e272d 370 {
Cheroukee 11:1d277e7e272d 371 current_state = in_attente;
Cheroukee 11:1d277e7e272d 372 }
Cheroukee 10:c4629b6c42f8 373 current_byte_progress = 0;
Cheroukee 8:a878763b0ae3 374 current_byte = 0;
Cheroukee 8:a878763b0ae3 375 }
Cheroukee 8:a878763b0ae3 376 }
Cheroukee 8:a878763b0ae3 377 break;
Cheroukee 8:a878763b0ae3 378 }
Cheroukee 8:a878763b0ae3 379 }
Cheroukee 3:6ea97936f6fa 380 }
Cheroukee 3:6ea97936f6fa 381
Cheroukee 10:c4629b6c42f8 382 // Fonction content la state machine de reception de trame
Cheroukee 11:1d277e7e272d 383 bool receive_frame(byte read_byte)
Cheroukee 3:6ea97936f6fa 384 {
Cheroukee 10:c4629b6c42f8 385 static radio_message_t* current_message;
Cheroukee 10:c4629b6c42f8 386 static byte receive_current_state = out_start;
Cheroukee 10:c4629b6c42f8 387 static int data_index = 0;
Cheroukee 10:c4629b6c42f8 388
Cheroukee 10:c4629b6c42f8 389 if (current_message == NULL)
Cheroukee 10:c4629b6c42f8 390 {
Cheroukee 10:c4629b6c42f8 391 current_message = get_new_in_message();
Cheroukee 11:1d277e7e272d 392 receive_current_state = out_start;
Cheroukee 11:1d277e7e272d 393 if (current_message == NULL){
Cheroukee 11:1d277e7e272d 394 return true;
Cheroukee 11:1d277e7e272d 395 }
Cheroukee 10:c4629b6c42f8 396 }
Cheroukee 10:c4629b6c42f8 397
Cheroukee 10:c4629b6c42f8 398 if (current_message != NULL)
Cheroukee 8:a878763b0ae3 399 {
Cheroukee 10:c4629b6c42f8 400 switch (receive_current_state)
Cheroukee 10:c4629b6c42f8 401 {
Cheroukee 10:c4629b6c42f8 402 case out_start:
Cheroukee 10:c4629b6c42f8 403 {
Cheroukee 10:c4629b6c42f8 404 current_message->start = read_byte;
Cheroukee 10:c4629b6c42f8 405 receive_current_state++;
Cheroukee 10:c4629b6c42f8 406 break;
Cheroukee 10:c4629b6c42f8 407 }
Cheroukee 10:c4629b6c42f8 408 case out_options:
Cheroukee 10:c4629b6c42f8 409 {
Cheroukee 10:c4629b6c42f8 410 current_message->options = read_byte;
Cheroukee 10:c4629b6c42f8 411 receive_current_state++;
Cheroukee 10:c4629b6c42f8 412 break;
Cheroukee 10:c4629b6c42f8 413 }
Cheroukee 10:c4629b6c42f8 414 case out_length:
Cheroukee 10:c4629b6c42f8 415 {
Cheroukee 10:c4629b6c42f8 416 current_message->length = read_byte;
Cheroukee 10:c4629b6c42f8 417 receive_current_state++;
Cheroukee 10:c4629b6c42f8 418 break;
Cheroukee 10:c4629b6c42f8 419 }
Cheroukee 10:c4629b6c42f8 420 case out_data:
Cheroukee 10:c4629b6c42f8 421 {
Cheroukee 10:c4629b6c42f8 422 current_message->data[data_index++] = read_byte;
Cheroukee 10:c4629b6c42f8 423 if (data_index >= current_message->length)
Cheroukee 10:c4629b6c42f8 424 {
Cheroukee 10:c4629b6c42f8 425 data_index = 0;
Cheroukee 10:c4629b6c42f8 426 receive_current_state++;
Cheroukee 10:c4629b6c42f8 427 }
Cheroukee 10:c4629b6c42f8 428 break;
Cheroukee 10:c4629b6c42f8 429 }
Cheroukee 10:c4629b6c42f8 430 case out_crc:
Cheroukee 10:c4629b6c42f8 431 {
Cheroukee 10:c4629b6c42f8 432 current_message->control = read_byte;
Cheroukee 10:c4629b6c42f8 433 receive_current_state++;
Cheroukee 10:c4629b6c42f8 434 break;
Cheroukee 10:c4629b6c42f8 435 }
Cheroukee 10:c4629b6c42f8 436 case out_end:
Cheroukee 10:c4629b6c42f8 437 {
Cheroukee 10:c4629b6c42f8 438 current_message->end = read_byte;
Cheroukee 10:c4629b6c42f8 439 new_in_message_ready();
Cheroukee 11:1d277e7e272d 440 receive_current_state = out_start;
Cheroukee 11:1d277e7e272d 441 current_message = NULL;
Cheroukee 11:1d277e7e272d 442 return true;
Cheroukee 10:c4629b6c42f8 443 break;
Cheroukee 10:c4629b6c42f8 444 }
Cheroukee 10:c4629b6c42f8 445
Cheroukee 10:c4629b6c42f8 446 }
Cheroukee 10:c4629b6c42f8 447 }
Cheroukee 11:1d277e7e272d 448 return false;
Cheroukee 3:6ea97936f6fa 449 }
Cheroukee 3:6ea97936f6fa 450
Cheroukee 10:c4629b6c42f8 451 // Fonction de timeout de la reception de data manchester
Cheroukee 10:c4629b6c42f8 452 void stop_frame(void const *n)
Cheroukee 10:c4629b6c42f8 453 {
Cheroukee 10:c4629b6c42f8 454 frame_in_end_led1 = 0;
Cheroukee 10:c4629b6c42f8 455 current_state = in_attente;
Cheroukee 10:c4629b6c42f8 456 current_byte_progress = 0;
Cheroukee 10:c4629b6c42f8 457 ticker_watch.stop();
Cheroukee 10:c4629b6c42f8 458 }
Cheroukee 10:c4629b6c42f8 459
Cheroukee 10:c4629b6c42f8 460 // Fonction du thread d'affichage dans le terminal
Cheroukee 10:c4629b6c42f8 461 /*
Cheroukee 10:c4629b6c42f8 462 void thread_putc()
Cheroukee 3:6ea97936f6fa 463 {
Cheroukee 10:c4629b6c42f8 464 while(true)
Cheroukee 10:c4629b6c42f8 465 {
Cheroukee 10:c4629b6c42f8 466 Thread::signal_wait(0x1);
Cheroukee 10:c4629b6c42f8 467 debug_output.printf("0x%c\n\r", debug_char_output);
Cheroukee 10:c4629b6c42f8 468 }
Cheroukee 10:c4629b6c42f8 469 }*/
Cheroukee 10:c4629b6c42f8 470
Cheroukee 10:c4629b6c42f8 471 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 472 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 473 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 474 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 475
Cheroukee 10:c4629b6c42f8 476 /*
Cheroukee 10:c4629b6c42f8 477 * Public API function
Cheroukee 10:c4629b6c42f8 478 */
Cheroukee 10:c4629b6c42f8 479
Cheroukee 10:c4629b6c42f8 480 /*
Cheroukee 10:c4629b6c42f8 481 * Inits the radio system and begins receiving manchester coded messages
Cheroukee 10:c4629b6c42f8 482 * Sends buffered messages
Cheroukee 10:c4629b6c42f8 483 */
Cheroukee 10:c4629b6c42f8 484 void init_radio_system()
Cheroukee 10:c4629b6c42f8 485 {
Cheroukee 13:b44c1f678aff 486 init_crc_module();
Cheroukee 10:c4629b6c42f8 487 setup_radio_in();
Cheroukee 10:c4629b6c42f8 488 setup_radio_out();
Cheroukee 3:6ea97936f6fa 489 }
Cheroukee 3:6ea97936f6fa 490
Cheroukee 3:6ea97936f6fa 491
Cheroukee 10:c4629b6c42f8 492
Cheroukee 10:c4629b6c42f8 493 bool send_message(char* buffer, int length)
Cheroukee 2:fdb34827d964 494 {
Cheroukee 3:6ea97936f6fa 495 //////////////////////////////////////////////////////
Cheroukee 3:6ea97936f6fa 496 // Creation d'un message et insertion dans le buffer
Cheroukee 10:c4629b6c42f8 497 radio_message_t* message = get_new_out_message();
Cheroukee 10:c4629b6c42f8 498 if (length <= MAX_MESSAGE_LENGTH && message != NULL)
Cheroukee 10:c4629b6c42f8 499 {
Cheroukee 10:c4629b6c42f8 500 message->preambule = HEADER_DELIMITER;
Cheroukee 10:c4629b6c42f8 501 message->start = HEADER_START;
Cheroukee 10:c4629b6c42f8 502 message->options = HEADER_DELIMITER;
Cheroukee 10:c4629b6c42f8 503 message->length = length;
Cheroukee 10:c4629b6c42f8 504
Cheroukee 10:c4629b6c42f8 505 for (int i = 0; i < length; i++){
Cheroukee 10:c4629b6c42f8 506 message->data[i] = buffer[i];
Cheroukee 10:c4629b6c42f8 507 }
Cheroukee 10:c4629b6c42f8 508
Cheroukee 10:c4629b6c42f8 509 // Ajouter calcul du CRC
Cheroukee 13:b44c1f678aff 510 message->control = get_crc_value(message->data, message->length);//0xCE;
Cheroukee 10:c4629b6c42f8 511
Cheroukee 10:c4629b6c42f8 512 message->end = FOOTER_END;
Cheroukee 10:c4629b6c42f8 513 // On avance dans le buffer;
Cheroukee 10:c4629b6c42f8 514 return new_out_message_ready();
Cheroukee 10:c4629b6c42f8 515 }
Cheroukee 10:c4629b6c42f8 516 return false;
Cheroukee 3:6ea97936f6fa 517 //////////////////////////////////////////////////////
Cheroukee 2:fdb34827d964 518 }
Cheroukee 3:6ea97936f6fa 519
Cheroukee 13:b44c1f678aff 520 bool get_message(radio_message_t* message)
Cheroukee 13:b44c1f678aff 521 {
Cheroukee 13:b44c1f678aff 522 radio_message_t* received_message;
Cheroukee 13:b44c1f678aff 523 // Si un message a ete recu par la radio
Cheroukee 13:b44c1f678aff 524 if((received_message = get_last_in_message()) != NULL)
Cheroukee 13:b44c1f678aff 525 {
Cheroukee 13:b44c1f678aff 526 // Si la valeur de CRC est valide par rapport a ce qui est calcule
Cheroukee 13:b44c1f678aff 527 if (get_crc_value(received_message->data, received_message->length) == received_message->control)
Cheroukee 13:b44c1f678aff 528 {
Cheroukee 13:b44c1f678aff 529 message->preambule = received_message->preambule;
Cheroukee 13:b44c1f678aff 530 message->start = received_message->start;
Cheroukee 13:b44c1f678aff 531 message->options = received_message->options;
Cheroukee 13:b44c1f678aff 532 message->length = received_message->length;
Cheroukee 13:b44c1f678aff 533 // memcopy
Cheroukee 13:b44c1f678aff 534 memcpy(message->data, received_message->data, received_message->length);
Cheroukee 13:b44c1f678aff 535
Cheroukee 13:b44c1f678aff 536 message->control = received_message->control;
Cheroukee 13:b44c1f678aff 537 message->end = received_message->end;
Cheroukee 13:b44c1f678aff 538
Cheroukee 13:b44c1f678aff 539 last_in_message_read();
Cheroukee 13:b44c1f678aff 540 return true;
Cheroukee 13:b44c1f678aff 541 }
Cheroukee 13:b44c1f678aff 542 }
Cheroukee 13:b44c1f678aff 543 return false;
Cheroukee 13:b44c1f678aff 544 }
Cheroukee 13:b44c1f678aff 545
Cheroukee 10:c4629b6c42f8 546 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 547 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 548 ////////////////////////////////////////////////////////////////////////////
Cheroukee 10:c4629b6c42f8 549 ////////////////////////////////////////////////////////////////////////////