For robots and stuff

Dependents:   Base Station

Radio/Radio.h

Committer:
jjones646
Date:
2014-12-31
Revision:
2:c42a035d71ed
Parent:
1:05a48c038381

File content as of revision 2:c42a035d71ed:

#ifndef RADIO_H
#define RADIO_H

#include "mbed.h"
#include "rtos.h"

// THREAD SUPPORT SIGNALS
#define START_THREAD 0x01
#define NEW_DATA 0x02
#define SET_LED_TICK 0x04

typedef struct RTP_t {
    uint8_t *payload;
    uint8_t port;
    bool    ack;
    uint8_t destination;
    uint8_t source;
    uint8_t size;
} RTP_t;


class Radio
{
public:
    Radio();
    Radio(PinName, PinName);
    virtual ~Radio() {};

    bool send(const RTP_t&);

    virtual void address(uint8_t address) {};
    uint8_t address(void) const {
        return _addr;
    }

    virtual void freq(uint32_t) {};
    uint32_t freq(void) const {
        return _freq;
    }

    virtual void channel(uint8_t) {};
    uint8_t channel(void) const {
        return _channel;
    }

    virtual void powerUp(void) = 0;
    
    bool hasError(void);

protected:
    virtual void put_pck(uint8_t*, uint8_t) = 0;
    virtual bool get_pck(uint8_t*, uint8_t*) = 0;

    static const int BUFFER_SIZE = 70;
    uint8_t     buffer[BUFFER_SIZE];

    bool        _need_ack;
    uint8_t     _channel;
    uint32_t    _freq;
    uint8_t     _addr;
    int8_t      _rssi;

    uint8_t _p_count;

    static void transmit_thread(void const*);
    static void receive_thread(void const*);
    SPI *_spi;

    Thread _receive_thread;
    Thread _transmit_thread;
    Thread _tx_led_thread;
    Thread _rx_led_thread;

    InterruptIn *_rx_int;
    
        DigitalOut _err_led;

    bool _has_error;

private:
    void isr_receive(void);

    DigitalOut _tx_led;
    DigitalOut _rx_led;
    static void led_tick(void const*);
};

#endif  // RADIO_H