APP4 S5

Dependencies:   mbed-rtos mbed

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