APP4 S5

Dependencies:   mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }