App1_S5
/
APP4_IRQ
APP4 S5
radio.cpp
- Committer:
- Cheroukee
- Date:
- 2017-10-11
- Revision:
- 4:728322e9e3eb
- Parent:
- 3:6ea97936f6fa
- Child:
- 5:70d338ee3f77
File content as of revision 4:728322e9e3eb:
#include "radio.h" #include "mbed.h" #include "rtos.h" #include <LPC17xx.h> #define MESSAGE_BUFFER_SIZE 16 #define MANCHESTER_SPEED_OUT 250 #define INPUT_RADIO p18 #define OUTPUT_RADIO p6 radio_message_t out_messages[MESSAGE_BUFFER_SIZE]; byte out_message_in; byte out_message_out; radio_message_t in_messages[MESSAGE_BUFFER_SIZE]; byte in_message_in; byte in_message_out; InterruptIn input(INPUT_RADIO); RtosTimer out_timer(radio_out, osTimerPeriodic, (void *)out_messages); DigitalOut output(OUTPUT_RADIO); DigitalOut in_debug_led(LED4); DigitalOut out_debug_led(LED3); // API functions void init_radio_system() { setup_radio_in(); setup_radio_out(); output = 0; } // Private functions void in_rise() { in_debug_led = 1; } void in_fall() { in_debug_led = 0; } void setup_radio_in() { in_message_in = 0; in_message_out = 0; in_debug_led = 0; input.rise(&in_rise); input.fall(&in_fall); } void setup_radio_out() { out_message_in = 0; out_message_out = 0; out_debug_led = 0; ////////////////////////////////////////////////////// // Creation d'un message et insertion dans le buffer radio_message_t* message = (out_messages + out_message_in); message->preambule = HEADER_DELIMITER; message->start = HEADER_START; message->options = HEADER_DELIMITER; message->length = 0x2; message->data[0] = 0xF0; message->data[1] = 0x0F; // Ajouter calcul message->control = 0xFF; message->end = FOOTER_END; // On avance dans le buffer; out_message_in++; ////////////////////////////////////////////////////// out_timer.start(MANCHESTER_SPEED_OUT); } typedef enum { preambule = 0, start, options, length, data, crc, end } out_state_t; void radio_out(void const *args) { static byte current_byte_progress = 0; static byte current_byte = 0; static byte current_state = 0; radio_message_t* message = (radio_message_t*)(out_messages + out_message_out); #define OUTPUT_HIGH output = 1; #define OUTPUT_LOW output = 0; #define SET_VAL_BIT_MASK(val) output = 0x1 & val; #define SET_VAL_SHIFT(val, shift) SET_VAL_BIT_MASK(val >> (7 - shift)) #define CHECK_NEXT_STATE if (current_byte_progress > 7) \ { \ current_state++; \ current_byte_progress = 0; \ } out_debug_led = !out_debug_led; switch (current_state) { case preambule: // preambule { SET_VAL_SHIFT(message->preambule, current_byte_progress++); CHECK_NEXT_STATE break; } case start: // start { SET_VAL_SHIFT(message->start, current_byte_progress++); CHECK_NEXT_STATE break; } case options: // entete options { SET_VAL_SHIFT(message->options, current_byte_progress++); CHECK_NEXT_STATE break; } case length: // entete lenght { SET_VAL_SHIFT(message->length, current_byte_progress++); CHECK_NEXT_STATE break; } case data: // charge utile { //CHECK_NEXT_STATE break; } case crc: // controle { CHECK_NEXT_STATE break; } case end: // end { CHECK_NEXT_STATE break; } default: { current_state = 0; current_byte = 0; current_byte_progress = 0; break; } } //output = !output; }