App1_S5
/
APP4_IRQ
APP4 S5
radio.cpp@13:b44c1f678aff, 2017-10-22 (annotated)
- 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?
User | Revision | Line number | New 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 | //////////////////////////////////////////////////////////////////////////// |