App1_S5 / Mbed 2 deprecated APP4_IRQ

Dependencies:   mbed-rtos mbed

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?

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