App1_S5
/
APP4_IRQ
APP4 S5
radio.cpp@6:f3f442d43c8f, 2017-10-11 (annotated)
- Committer:
- Cheroukee
- Date:
- Wed Oct 11 21:23:45 2017 +0000
- Revision:
- 6:f3f442d43c8f
- Parent:
- 5:70d338ee3f77
- Child:
- 7:d25bcde7dcf1
Manchester output test
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 | 6:f3f442d43c8f | 114 | static bool IsBitTransition = false; |
Cheroukee | 6:f3f442d43c8f | 115 | static byte next_value = 0; |
Cheroukee | 4:728322e9e3eb | 116 | |
Cheroukee | 3:6ea97936f6fa | 117 | radio_message_t* message = (radio_message_t*)(out_messages + out_message_out); |
Cheroukee | 3:6ea97936f6fa | 118 | |
Cheroukee | 3:6ea97936f6fa | 119 | #define OUTPUT_HIGH output = 1; |
Cheroukee | 3:6ea97936f6fa | 120 | #define OUTPUT_LOW output = 0; |
Cheroukee | 3:6ea97936f6fa | 121 | |
Cheroukee | 6:f3f442d43c8f | 122 | #define SET_VAL_BIT_MASK(val) next_value = 0x1 & val; |
Cheroukee | 4:728322e9e3eb | 123 | #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift)) |
Cheroukee | 4:728322e9e3eb | 124 | |
Cheroukee | 4:728322e9e3eb | 125 | |
Cheroukee | 4:728322e9e3eb | 126 | #define CHECK_NEXT_STATE if (current_byte_progress > 7) \ |
Cheroukee | 4:728322e9e3eb | 127 | { \ |
Cheroukee | 4:728322e9e3eb | 128 | current_state++; \ |
Cheroukee | 4:728322e9e3eb | 129 | current_byte_progress = 0; \ |
Cheroukee | 4:728322e9e3eb | 130 | } |
Cheroukee | 4:728322e9e3eb | 131 | |
Cheroukee | 3:6ea97936f6fa | 132 | out_debug_led = !out_debug_led; |
Cheroukee | 4:728322e9e3eb | 133 | |
Cheroukee | 6:f3f442d43c8f | 134 | if (!IsBitTransition) |
Cheroukee | 4:728322e9e3eb | 135 | { |
Cheroukee | 6:f3f442d43c8f | 136 | // Dependant du state, on progresse dans l'envoi du message |
Cheroukee | 6:f3f442d43c8f | 137 | switch (current_state) |
Cheroukee | 4:728322e9e3eb | 138 | { |
Cheroukee | 6:f3f442d43c8f | 139 | case preambule: // preambule |
Cheroukee | 6:f3f442d43c8f | 140 | { |
Cheroukee | 6:f3f442d43c8f | 141 | SET_VAL_SHIFT(message->preambule, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 142 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 143 | break; |
Cheroukee | 6:f3f442d43c8f | 144 | } |
Cheroukee | 6:f3f442d43c8f | 145 | case start: // start |
Cheroukee | 6:f3f442d43c8f | 146 | { |
Cheroukee | 6:f3f442d43c8f | 147 | SET_VAL_SHIFT(message->start, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 148 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 149 | break; |
Cheroukee | 6:f3f442d43c8f | 150 | } |
Cheroukee | 6:f3f442d43c8f | 151 | case options: // entete options |
Cheroukee | 6:f3f442d43c8f | 152 | { |
Cheroukee | 6:f3f442d43c8f | 153 | SET_VAL_SHIFT(message->options, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 154 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 155 | break; |
Cheroukee | 6:f3f442d43c8f | 156 | } |
Cheroukee | 6:f3f442d43c8f | 157 | case length: // entete lenght |
Cheroukee | 6:f3f442d43c8f | 158 | { |
Cheroukee | 6:f3f442d43c8f | 159 | SET_VAL_SHIFT(message->length, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 160 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 161 | break; |
Cheroukee | 6:f3f442d43c8f | 162 | } |
Cheroukee | 6:f3f442d43c8f | 163 | case data: // charge utile |
Cheroukee | 5:70d338ee3f77 | 164 | { |
Cheroukee | 6:f3f442d43c8f | 165 | SET_VAL_SHIFT(message->data[current_byte], current_byte_progress++) |
Cheroukee | 6:f3f442d43c8f | 166 | if (current_byte_progress > 7) |
Cheroukee | 5:70d338ee3f77 | 167 | { |
Cheroukee | 6:f3f442d43c8f | 168 | current_byte++; |
Cheroukee | 6:f3f442d43c8f | 169 | current_byte_progress = 0; |
Cheroukee | 6:f3f442d43c8f | 170 | if (current_byte > message->length) |
Cheroukee | 6:f3f442d43c8f | 171 | { |
Cheroukee | 6:f3f442d43c8f | 172 | current_byte = 0; |
Cheroukee | 6:f3f442d43c8f | 173 | current_state++; |
Cheroukee | 6:f3f442d43c8f | 174 | } |
Cheroukee | 6:f3f442d43c8f | 175 | } |
Cheroukee | 6:f3f442d43c8f | 176 | //CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 177 | break; |
Cheroukee | 6:f3f442d43c8f | 178 | } |
Cheroukee | 6:f3f442d43c8f | 179 | case crc: // controle |
Cheroukee | 6:f3f442d43c8f | 180 | { |
Cheroukee | 6:f3f442d43c8f | 181 | SET_VAL_SHIFT(message->control, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 182 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 183 | break; |
Cheroukee | 6:f3f442d43c8f | 184 | } |
Cheroukee | 6:f3f442d43c8f | 185 | case end: // end |
Cheroukee | 6:f3f442d43c8f | 186 | { |
Cheroukee | 6:f3f442d43c8f | 187 | SET_VAL_SHIFT(message->end, current_byte_progress++); |
Cheroukee | 6:f3f442d43c8f | 188 | CHECK_NEXT_STATE |
Cheroukee | 6:f3f442d43c8f | 189 | break; |
Cheroukee | 5:70d338ee3f77 | 190 | } |
Cheroukee | 6:f3f442d43c8f | 191 | default: |
Cheroukee | 6:f3f442d43c8f | 192 | { |
Cheroukee | 6:f3f442d43c8f | 193 | //current_state = 0; |
Cheroukee | 6:f3f442d43c8f | 194 | current_byte = 0; |
Cheroukee | 6:f3f442d43c8f | 195 | current_byte_progress = 0; |
Cheroukee | 6:f3f442d43c8f | 196 | break; |
Cheroukee | 6:f3f442d43c8f | 197 | } |
Cheroukee | 6:f3f442d43c8f | 198 | |
Cheroukee | 6:f3f442d43c8f | 199 | |
Cheroukee | 6:f3f442d43c8f | 200 | |
Cheroukee | 6:f3f442d43c8f | 201 | } |
Cheroukee | 6:f3f442d43c8f | 202 | |
Cheroukee | 6:f3f442d43c8f | 203 | if (next_value != output) |
Cheroukee | 4:728322e9e3eb | 204 | { |
Cheroukee | 6:f3f442d43c8f | 205 | output = !output; |
Cheroukee | 6:f3f442d43c8f | 206 | } |
Cheroukee | 6:f3f442d43c8f | 207 | |
Cheroukee | 6:f3f442d43c8f | 208 | if (current_state > end) |
Cheroukee | 4:728322e9e3eb | 209 | { |
Cheroukee | 6:f3f442d43c8f | 210 | frame_end_led = 0; |
Cheroukee | 6:f3f442d43c8f | 211 | //current_state = preambule; |
Cheroukee | 4:728322e9e3eb | 212 | } |
Cheroukee | 6:f3f442d43c8f | 213 | } |
Cheroukee | 6:f3f442d43c8f | 214 | else |
Cheroukee | 6:f3f442d43c8f | 215 | { |
Cheroukee | 6:f3f442d43c8f | 216 | output = !output; |
Cheroukee | 4:728322e9e3eb | 217 | } |
Cheroukee | 4:728322e9e3eb | 218 | |
Cheroukee | 3:6ea97936f6fa | 219 | } |