Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
radio.cpp@5:70d338ee3f77, 2017-10-11 (annotated)
- Committer:
- Cheroukee
- Date:
- Wed Oct 11 20:53:15 2017 +0000
- Revision:
- 5:70d338ee3f77
- Parent:
- 4:728322e9e3eb
- Child:
- 6:f3f442d43c8f
Send message and receive direct into input
Who changed what in which revision?
| User | Revision | Line number | New 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 | 3:6ea97936f6fa | 11 | #define MANCHESTER_SPEED_OUT 250 |
| 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 | 3:6ea97936f6fa | 30 | DigitalOut in_debug_led(LED4); |
| Cheroukee | 3:6ea97936f6fa | 31 | DigitalOut out_debug_led(LED3); |
| Cheroukee | 3:6ea97936f6fa | 32 | |
| Cheroukee | 5:70d338ee3f77 | 33 | DigitalOut frame_end_led(LED2); |
| Cheroukee | 5:70d338ee3f77 | 34 | |
| Cheroukee | 2:fdb34827d964 | 35 | // API functions |
| Cheroukee | 2:fdb34827d964 | 36 | void init_radio_system() |
| Cheroukee | 2:fdb34827d964 | 37 | { |
| Cheroukee | 3:6ea97936f6fa | 38 | setup_radio_in(); |
| Cheroukee | 3:6ea97936f6fa | 39 | setup_radio_out(); |
| Cheroukee | 3:6ea97936f6fa | 40 | output = 0; |
| Cheroukee | 2:fdb34827d964 | 41 | } |
| Cheroukee | 2:fdb34827d964 | 42 | |
| Cheroukee | 2:fdb34827d964 | 43 | // Private functions |
| Cheroukee | 3:6ea97936f6fa | 44 | |
| Cheroukee | 3:6ea97936f6fa | 45 | void in_rise() |
| Cheroukee | 3:6ea97936f6fa | 46 | { |
| Cheroukee | 3:6ea97936f6fa | 47 | in_debug_led = 1; |
| Cheroukee | 3:6ea97936f6fa | 48 | } |
| Cheroukee | 3:6ea97936f6fa | 49 | |
| Cheroukee | 3:6ea97936f6fa | 50 | void in_fall() |
| Cheroukee | 3:6ea97936f6fa | 51 | { |
| Cheroukee | 3:6ea97936f6fa | 52 | in_debug_led = 0; |
| Cheroukee | 3:6ea97936f6fa | 53 | } |
| Cheroukee | 3:6ea97936f6fa | 54 | |
| Cheroukee | 3:6ea97936f6fa | 55 | void setup_radio_in() |
| Cheroukee | 3:6ea97936f6fa | 56 | { |
| Cheroukee | 4:728322e9e3eb | 57 | in_message_in = 0; |
| Cheroukee | 4:728322e9e3eb | 58 | in_message_out = 0; |
| Cheroukee | 4:728322e9e3eb | 59 | |
| Cheroukee | 3:6ea97936f6fa | 60 | in_debug_led = 0; |
| Cheroukee | 3:6ea97936f6fa | 61 | |
| Cheroukee | 3:6ea97936f6fa | 62 | input.rise(&in_rise); |
| Cheroukee | 3:6ea97936f6fa | 63 | input.fall(&in_fall); |
| Cheroukee | 3:6ea97936f6fa | 64 | } |
| Cheroukee | 3:6ea97936f6fa | 65 | |
| Cheroukee | 3:6ea97936f6fa | 66 | |
| Cheroukee | 3:6ea97936f6fa | 67 | void setup_radio_out() |
| Cheroukee | 2:fdb34827d964 | 68 | { |
| Cheroukee | 3:6ea97936f6fa | 69 | out_message_in = 0; |
| Cheroukee | 3:6ea97936f6fa | 70 | out_message_out = 0; |
| Cheroukee | 3:6ea97936f6fa | 71 | |
| Cheroukee | 3:6ea97936f6fa | 72 | out_debug_led = 0; |
| Cheroukee | 5:70d338ee3f77 | 73 | frame_end_led = 1; |
| Cheroukee | 2:fdb34827d964 | 74 | |
| Cheroukee | 3:6ea97936f6fa | 75 | ////////////////////////////////////////////////////// |
| Cheroukee | 3:6ea97936f6fa | 76 | // Creation d'un message et insertion dans le buffer |
| Cheroukee | 3:6ea97936f6fa | 77 | radio_message_t* message = (out_messages + out_message_in); |
| Cheroukee | 3:6ea97936f6fa | 78 | |
| Cheroukee | 3:6ea97936f6fa | 79 | message->preambule = HEADER_DELIMITER; |
| Cheroukee | 3:6ea97936f6fa | 80 | message->start = HEADER_START; |
| Cheroukee | 3:6ea97936f6fa | 81 | message->options = HEADER_DELIMITER; |
| Cheroukee | 5:70d338ee3f77 | 82 | message->length = 0x3; |
| Cheroukee | 3:6ea97936f6fa | 83 | |
| Cheroukee | 5:70d338ee3f77 | 84 | message->data[0] = 0xC0; |
| Cheroukee | 5:70d338ee3f77 | 85 | message->data[1] = 0xFF; |
| Cheroukee | 5:70d338ee3f77 | 86 | message->data[2] = 0xEE; |
| Cheroukee | 3:6ea97936f6fa | 87 | |
| Cheroukee | 3:6ea97936f6fa | 88 | // Ajouter calcul |
| Cheroukee | 5:70d338ee3f77 | 89 | message->control = 0xCE; |
| Cheroukee | 3:6ea97936f6fa | 90 | |
| Cheroukee | 3:6ea97936f6fa | 91 | message->end = FOOTER_END; |
| Cheroukee | 3:6ea97936f6fa | 92 | // On avance dans le buffer; |
| Cheroukee | 3:6ea97936f6fa | 93 | out_message_in++; |
| Cheroukee | 3:6ea97936f6fa | 94 | ////////////////////////////////////////////////////// |
| Cheroukee | 3:6ea97936f6fa | 95 | |
| Cheroukee | 3:6ea97936f6fa | 96 | out_timer.start(MANCHESTER_SPEED_OUT); |
| Cheroukee | 2:fdb34827d964 | 97 | } |
| Cheroukee | 3:6ea97936f6fa | 98 | |
| Cheroukee | 4:728322e9e3eb | 99 | typedef enum { |
| Cheroukee | 4:728322e9e3eb | 100 | preambule = 0, |
| Cheroukee | 4:728322e9e3eb | 101 | start, |
| Cheroukee | 4:728322e9e3eb | 102 | options, |
| Cheroukee | 4:728322e9e3eb | 103 | length, |
| Cheroukee | 4:728322e9e3eb | 104 | data, |
| Cheroukee | 4:728322e9e3eb | 105 | crc, |
| Cheroukee | 4:728322e9e3eb | 106 | end |
| Cheroukee | 4:728322e9e3eb | 107 | } out_state_t; |
| Cheroukee | 4:728322e9e3eb | 108 | |
| Cheroukee | 3:6ea97936f6fa | 109 | void radio_out(void const *args) |
| Cheroukee | 3:6ea97936f6fa | 110 | { |
| Cheroukee | 4:728322e9e3eb | 111 | static byte current_byte_progress = 0; |
| Cheroukee | 4:728322e9e3eb | 112 | static byte current_byte = 0; |
| Cheroukee | 4:728322e9e3eb | 113 | static byte current_state = 0; |
| Cheroukee | 4:728322e9e3eb | 114 | |
| Cheroukee | 3:6ea97936f6fa | 115 | radio_message_t* message = (radio_message_t*)(out_messages + out_message_out); |
| Cheroukee | 3:6ea97936f6fa | 116 | |
| Cheroukee | 3:6ea97936f6fa | 117 | #define OUTPUT_HIGH output = 1; |
| Cheroukee | 3:6ea97936f6fa | 118 | #define OUTPUT_LOW output = 0; |
| Cheroukee | 3:6ea97936f6fa | 119 | |
| Cheroukee | 5:70d338ee3f77 | 120 | #define SET_VAL_BIT_MASK(val) output = 0x1 & val; |
| Cheroukee | 4:728322e9e3eb | 121 | #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift)) |
| Cheroukee | 4:728322e9e3eb | 122 | |
| Cheroukee | 4:728322e9e3eb | 123 | |
| Cheroukee | 4:728322e9e3eb | 124 | #define CHECK_NEXT_STATE if (current_byte_progress > 7) \ |
| Cheroukee | 4:728322e9e3eb | 125 | { \ |
| Cheroukee | 4:728322e9e3eb | 126 | current_state++; \ |
| Cheroukee | 4:728322e9e3eb | 127 | current_byte_progress = 0; \ |
| Cheroukee | 4:728322e9e3eb | 128 | } |
| Cheroukee | 4:728322e9e3eb | 129 | |
| Cheroukee | 3:6ea97936f6fa | 130 | out_debug_led = !out_debug_led; |
| Cheroukee | 4:728322e9e3eb | 131 | |
| Cheroukee | 5:70d338ee3f77 | 132 | // Dependant du state, on progresse dans l'envoi du message |
| Cheroukee | 4:728322e9e3eb | 133 | switch (current_state) |
| Cheroukee | 4:728322e9e3eb | 134 | { |
| Cheroukee | 4:728322e9e3eb | 135 | case preambule: // preambule |
| Cheroukee | 4:728322e9e3eb | 136 | { |
| Cheroukee | 4:728322e9e3eb | 137 | SET_VAL_SHIFT(message->preambule, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 138 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 139 | break; |
| Cheroukee | 4:728322e9e3eb | 140 | } |
| Cheroukee | 4:728322e9e3eb | 141 | case start: // start |
| Cheroukee | 4:728322e9e3eb | 142 | { |
| Cheroukee | 4:728322e9e3eb | 143 | SET_VAL_SHIFT(message->start, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 144 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 145 | break; |
| Cheroukee | 4:728322e9e3eb | 146 | } |
| Cheroukee | 4:728322e9e3eb | 147 | case options: // entete options |
| Cheroukee | 4:728322e9e3eb | 148 | { |
| Cheroukee | 4:728322e9e3eb | 149 | SET_VAL_SHIFT(message->options, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 150 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 151 | break; |
| Cheroukee | 4:728322e9e3eb | 152 | } |
| Cheroukee | 4:728322e9e3eb | 153 | case length: // entete lenght |
| Cheroukee | 4:728322e9e3eb | 154 | { |
| Cheroukee | 4:728322e9e3eb | 155 | SET_VAL_SHIFT(message->length, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 156 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 157 | break; |
| Cheroukee | 4:728322e9e3eb | 158 | } |
| Cheroukee | 4:728322e9e3eb | 159 | case data: // charge utile |
| Cheroukee | 4:728322e9e3eb | 160 | { |
| Cheroukee | 5:70d338ee3f77 | 161 | SET_VAL_SHIFT(message->data[current_byte], current_byte_progress++) |
| Cheroukee | 5:70d338ee3f77 | 162 | if (current_byte_progress > 7) |
| Cheroukee | 5:70d338ee3f77 | 163 | { |
| Cheroukee | 5:70d338ee3f77 | 164 | current_byte++; |
| Cheroukee | 5:70d338ee3f77 | 165 | current_byte_progress = 0; |
| Cheroukee | 5:70d338ee3f77 | 166 | if (current_byte > message->length) |
| Cheroukee | 5:70d338ee3f77 | 167 | { |
| Cheroukee | 5:70d338ee3f77 | 168 | current_byte = 0; |
| Cheroukee | 5:70d338ee3f77 | 169 | current_state++; |
| Cheroukee | 5:70d338ee3f77 | 170 | } |
| Cheroukee | 5:70d338ee3f77 | 171 | } |
| Cheroukee | 4:728322e9e3eb | 172 | //CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 173 | break; |
| Cheroukee | 4:728322e9e3eb | 174 | } |
| Cheroukee | 4:728322e9e3eb | 175 | case crc: // controle |
| Cheroukee | 4:728322e9e3eb | 176 | { |
| Cheroukee | 5:70d338ee3f77 | 177 | SET_VAL_SHIFT(message->control, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 178 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 179 | break; |
| Cheroukee | 4:728322e9e3eb | 180 | } |
| Cheroukee | 4:728322e9e3eb | 181 | case end: // end |
| Cheroukee | 4:728322e9e3eb | 182 | { |
| Cheroukee | 5:70d338ee3f77 | 183 | SET_VAL_SHIFT(message->end, current_byte_progress++); |
| Cheroukee | 4:728322e9e3eb | 184 | CHECK_NEXT_STATE |
| Cheroukee | 4:728322e9e3eb | 185 | break; |
| Cheroukee | 4:728322e9e3eb | 186 | } |
| Cheroukee | 4:728322e9e3eb | 187 | default: |
| Cheroukee | 4:728322e9e3eb | 188 | { |
| Cheroukee | 5:70d338ee3f77 | 189 | //current_state = 0; |
| Cheroukee | 4:728322e9e3eb | 190 | current_byte = 0; |
| Cheroukee | 4:728322e9e3eb | 191 | current_byte_progress = 0; |
| Cheroukee | 4:728322e9e3eb | 192 | break; |
| Cheroukee | 4:728322e9e3eb | 193 | } |
| Cheroukee | 4:728322e9e3eb | 194 | |
| Cheroukee | 4:728322e9e3eb | 195 | } |
| Cheroukee | 4:728322e9e3eb | 196 | |
| Cheroukee | 5:70d338ee3f77 | 197 | if (current_state > end) |
| Cheroukee | 5:70d338ee3f77 | 198 | { |
| Cheroukee | 5:70d338ee3f77 | 199 | frame_end_led = 0; |
| Cheroukee | 5:70d338ee3f77 | 200 | //current_state = preambule; |
| Cheroukee | 5:70d338ee3f77 | 201 | } |
| Cheroukee | 4:728322e9e3eb | 202 | //output = !output; |
| Cheroukee | 3:6ea97936f6fa | 203 | } |