App1_S5
/
APP4_IRQ
APP4 S5
radio.cpp@4:728322e9e3eb, 2017-10-11 (annotated)
- Committer:
- Cheroukee
- Date:
- Wed Oct 11 20:36:04 2017 +0000
- Revision:
- 4:728322e9e3eb
- Parent:
- 3:6ea97936f6fa
- Child:
- 5:70d338ee3f77
Added enum and switch for message sending
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 | 2:fdb34827d964 | 33 | // API functions |
Cheroukee | 2:fdb34827d964 | 34 | void init_radio_system() |
Cheroukee | 2:fdb34827d964 | 35 | { |
Cheroukee | 3:6ea97936f6fa | 36 | setup_radio_in(); |
Cheroukee | 3:6ea97936f6fa | 37 | setup_radio_out(); |
Cheroukee | 3:6ea97936f6fa | 38 | output = 0; |
Cheroukee | 2:fdb34827d964 | 39 | } |
Cheroukee | 2:fdb34827d964 | 40 | |
Cheroukee | 2:fdb34827d964 | 41 | // Private functions |
Cheroukee | 3:6ea97936f6fa | 42 | |
Cheroukee | 3:6ea97936f6fa | 43 | void in_rise() |
Cheroukee | 3:6ea97936f6fa | 44 | { |
Cheroukee | 3:6ea97936f6fa | 45 | in_debug_led = 1; |
Cheroukee | 3:6ea97936f6fa | 46 | } |
Cheroukee | 3:6ea97936f6fa | 47 | |
Cheroukee | 3:6ea97936f6fa | 48 | void in_fall() |
Cheroukee | 3:6ea97936f6fa | 49 | { |
Cheroukee | 3:6ea97936f6fa | 50 | in_debug_led = 0; |
Cheroukee | 3:6ea97936f6fa | 51 | } |
Cheroukee | 3:6ea97936f6fa | 52 | |
Cheroukee | 3:6ea97936f6fa | 53 | void setup_radio_in() |
Cheroukee | 3:6ea97936f6fa | 54 | { |
Cheroukee | 4:728322e9e3eb | 55 | in_message_in = 0; |
Cheroukee | 4:728322e9e3eb | 56 | in_message_out = 0; |
Cheroukee | 4:728322e9e3eb | 57 | |
Cheroukee | 3:6ea97936f6fa | 58 | in_debug_led = 0; |
Cheroukee | 3:6ea97936f6fa | 59 | |
Cheroukee | 3:6ea97936f6fa | 60 | input.rise(&in_rise); |
Cheroukee | 3:6ea97936f6fa | 61 | input.fall(&in_fall); |
Cheroukee | 3:6ea97936f6fa | 62 | } |
Cheroukee | 3:6ea97936f6fa | 63 | |
Cheroukee | 3:6ea97936f6fa | 64 | |
Cheroukee | 3:6ea97936f6fa | 65 | void setup_radio_out() |
Cheroukee | 2:fdb34827d964 | 66 | { |
Cheroukee | 3:6ea97936f6fa | 67 | out_message_in = 0; |
Cheroukee | 3:6ea97936f6fa | 68 | out_message_out = 0; |
Cheroukee | 3:6ea97936f6fa | 69 | |
Cheroukee | 3:6ea97936f6fa | 70 | out_debug_led = 0; |
Cheroukee | 2:fdb34827d964 | 71 | |
Cheroukee | 3:6ea97936f6fa | 72 | ////////////////////////////////////////////////////// |
Cheroukee | 3:6ea97936f6fa | 73 | // Creation d'un message et insertion dans le buffer |
Cheroukee | 3:6ea97936f6fa | 74 | radio_message_t* message = (out_messages + out_message_in); |
Cheroukee | 3:6ea97936f6fa | 75 | |
Cheroukee | 3:6ea97936f6fa | 76 | message->preambule = HEADER_DELIMITER; |
Cheroukee | 3:6ea97936f6fa | 77 | message->start = HEADER_START; |
Cheroukee | 3:6ea97936f6fa | 78 | message->options = HEADER_DELIMITER; |
Cheroukee | 3:6ea97936f6fa | 79 | message->length = 0x2; |
Cheroukee | 3:6ea97936f6fa | 80 | |
Cheroukee | 3:6ea97936f6fa | 81 | message->data[0] = 0xF0; |
Cheroukee | 3:6ea97936f6fa | 82 | message->data[1] = 0x0F; |
Cheroukee | 3:6ea97936f6fa | 83 | |
Cheroukee | 3:6ea97936f6fa | 84 | // Ajouter calcul |
Cheroukee | 3:6ea97936f6fa | 85 | message->control = 0xFF; |
Cheroukee | 3:6ea97936f6fa | 86 | |
Cheroukee | 3:6ea97936f6fa | 87 | message->end = FOOTER_END; |
Cheroukee | 3:6ea97936f6fa | 88 | // On avance dans le buffer; |
Cheroukee | 3:6ea97936f6fa | 89 | out_message_in++; |
Cheroukee | 3:6ea97936f6fa | 90 | ////////////////////////////////////////////////////// |
Cheroukee | 3:6ea97936f6fa | 91 | |
Cheroukee | 3:6ea97936f6fa | 92 | out_timer.start(MANCHESTER_SPEED_OUT); |
Cheroukee | 2:fdb34827d964 | 93 | } |
Cheroukee | 3:6ea97936f6fa | 94 | |
Cheroukee | 3:6ea97936f6fa | 95 | |
Cheroukee | 4:728322e9e3eb | 96 | typedef enum { |
Cheroukee | 4:728322e9e3eb | 97 | preambule = 0, |
Cheroukee | 4:728322e9e3eb | 98 | start, |
Cheroukee | 4:728322e9e3eb | 99 | options, |
Cheroukee | 4:728322e9e3eb | 100 | length, |
Cheroukee | 4:728322e9e3eb | 101 | data, |
Cheroukee | 4:728322e9e3eb | 102 | crc, |
Cheroukee | 4:728322e9e3eb | 103 | end |
Cheroukee | 4:728322e9e3eb | 104 | } out_state_t; |
Cheroukee | 4:728322e9e3eb | 105 | |
Cheroukee | 3:6ea97936f6fa | 106 | void radio_out(void const *args) |
Cheroukee | 3:6ea97936f6fa | 107 | { |
Cheroukee | 4:728322e9e3eb | 108 | static byte current_byte_progress = 0; |
Cheroukee | 4:728322e9e3eb | 109 | static byte current_byte = 0; |
Cheroukee | 4:728322e9e3eb | 110 | static byte current_state = 0; |
Cheroukee | 4:728322e9e3eb | 111 | |
Cheroukee | 3:6ea97936f6fa | 112 | radio_message_t* message = (radio_message_t*)(out_messages + out_message_out); |
Cheroukee | 3:6ea97936f6fa | 113 | |
Cheroukee | 3:6ea97936f6fa | 114 | #define OUTPUT_HIGH output = 1; |
Cheroukee | 3:6ea97936f6fa | 115 | #define OUTPUT_LOW output = 0; |
Cheroukee | 3:6ea97936f6fa | 116 | |
Cheroukee | 4:728322e9e3eb | 117 | #define SET_VAL_BIT_MASK(val) output = 0x1 & val; |
Cheroukee | 4:728322e9e3eb | 118 | #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift)) |
Cheroukee | 4:728322e9e3eb | 119 | |
Cheroukee | 4:728322e9e3eb | 120 | |
Cheroukee | 4:728322e9e3eb | 121 | #define CHECK_NEXT_STATE if (current_byte_progress > 7) \ |
Cheroukee | 4:728322e9e3eb | 122 | { \ |
Cheroukee | 4:728322e9e3eb | 123 | current_state++; \ |
Cheroukee | 4:728322e9e3eb | 124 | current_byte_progress = 0; \ |
Cheroukee | 4:728322e9e3eb | 125 | } |
Cheroukee | 4:728322e9e3eb | 126 | |
Cheroukee | 3:6ea97936f6fa | 127 | out_debug_led = !out_debug_led; |
Cheroukee | 4:728322e9e3eb | 128 | |
Cheroukee | 4:728322e9e3eb | 129 | switch (current_state) |
Cheroukee | 4:728322e9e3eb | 130 | { |
Cheroukee | 4:728322e9e3eb | 131 | case preambule: // preambule |
Cheroukee | 4:728322e9e3eb | 132 | { |
Cheroukee | 4:728322e9e3eb | 133 | SET_VAL_SHIFT(message->preambule, current_byte_progress++); |
Cheroukee | 4:728322e9e3eb | 134 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 135 | break; |
Cheroukee | 4:728322e9e3eb | 136 | } |
Cheroukee | 4:728322e9e3eb | 137 | case start: // start |
Cheroukee | 4:728322e9e3eb | 138 | { |
Cheroukee | 4:728322e9e3eb | 139 | SET_VAL_SHIFT(message->start, current_byte_progress++); |
Cheroukee | 4:728322e9e3eb | 140 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 141 | break; |
Cheroukee | 4:728322e9e3eb | 142 | } |
Cheroukee | 4:728322e9e3eb | 143 | case options: // entete options |
Cheroukee | 4:728322e9e3eb | 144 | { |
Cheroukee | 4:728322e9e3eb | 145 | SET_VAL_SHIFT(message->options, current_byte_progress++); |
Cheroukee | 4:728322e9e3eb | 146 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 147 | break; |
Cheroukee | 4:728322e9e3eb | 148 | } |
Cheroukee | 4:728322e9e3eb | 149 | case length: // entete lenght |
Cheroukee | 4:728322e9e3eb | 150 | { |
Cheroukee | 4:728322e9e3eb | 151 | SET_VAL_SHIFT(message->length, current_byte_progress++); |
Cheroukee | 4:728322e9e3eb | 152 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 153 | break; |
Cheroukee | 4:728322e9e3eb | 154 | } |
Cheroukee | 4:728322e9e3eb | 155 | case data: // charge utile |
Cheroukee | 4:728322e9e3eb | 156 | { |
Cheroukee | 4:728322e9e3eb | 157 | //CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 158 | break; |
Cheroukee | 4:728322e9e3eb | 159 | } |
Cheroukee | 4:728322e9e3eb | 160 | case crc: // controle |
Cheroukee | 4:728322e9e3eb | 161 | { |
Cheroukee | 4:728322e9e3eb | 162 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 163 | break; |
Cheroukee | 4:728322e9e3eb | 164 | } |
Cheroukee | 4:728322e9e3eb | 165 | case end: // end |
Cheroukee | 4:728322e9e3eb | 166 | { |
Cheroukee | 4:728322e9e3eb | 167 | CHECK_NEXT_STATE |
Cheroukee | 4:728322e9e3eb | 168 | break; |
Cheroukee | 4:728322e9e3eb | 169 | } |
Cheroukee | 4:728322e9e3eb | 170 | default: |
Cheroukee | 4:728322e9e3eb | 171 | { |
Cheroukee | 4:728322e9e3eb | 172 | current_state = 0; |
Cheroukee | 4:728322e9e3eb | 173 | current_byte = 0; |
Cheroukee | 4:728322e9e3eb | 174 | current_byte_progress = 0; |
Cheroukee | 4:728322e9e3eb | 175 | break; |
Cheroukee | 4:728322e9e3eb | 176 | } |
Cheroukee | 4:728322e9e3eb | 177 | |
Cheroukee | 4:728322e9e3eb | 178 | } |
Cheroukee | 4:728322e9e3eb | 179 | |
Cheroukee | 4:728322e9e3eb | 180 | |
Cheroukee | 4:728322e9e3eb | 181 | //output = !output; |
Cheroukee | 3:6ea97936f6fa | 182 | } |