For robots and stuff
Radio/Radio.cpp@2:c42a035d71ed, 2014-12-31 (annotated)
- Committer:
- jjones646
- Date:
- Wed Dec 31 22:16:01 2014 +0000
- Revision:
- 2:c42a035d71ed
- Parent:
- 1:05a48c038381
adding dummy cc1101 support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jjones646 | 0:c5afea7b9057 | 1 | #include "Radio.h" |
jjones646 | 0:c5afea7b9057 | 2 | |
jjones646 | 0:c5afea7b9057 | 3 | Radio::Radio() : |
jjones646 | 0:c5afea7b9057 | 4 | _tx_led(NC), |
jjones646 | 0:c5afea7b9057 | 5 | _rx_led(NC), |
jjones646 | 2:c42a035d71ed | 6 | _err_led(NC), |
jjones646 | 0:c5afea7b9057 | 7 | _receive_thread(&Radio::receive_thread, this, osPriorityLow, 0), |
jjones646 | 0:c5afea7b9057 | 8 | _transmit_thread(&Radio::transmit_thread, this, osPriorityLow, 0), |
jjones646 | 0:c5afea7b9057 | 9 | _tx_led_thread(&Radio::led_tick, &_tx_led, osPriorityLow, 0), |
jjones646 | 0:c5afea7b9057 | 10 | _rx_led_thread(&Radio::led_tick, &_rx_led, osPriorityLow, 0) |
jjones646 | 0:c5afea7b9057 | 11 | { |
jjones646 | 0:c5afea7b9057 | 12 | _channel = 1; |
jjones646 | 0:c5afea7b9057 | 13 | _addr = 0; |
jjones646 | 0:c5afea7b9057 | 14 | _freq = 0; |
jjones646 | 0:c5afea7b9057 | 15 | _need_ack = false; |
jjones646 | 2:c42a035d71ed | 16 | _p_count = 0; |
jjones646 | 2:c42a035d71ed | 17 | _has_error = false; |
jjones646 | 0:c5afea7b9057 | 18 | } |
jjones646 | 0:c5afea7b9057 | 19 | |
jjones646 | 0:c5afea7b9057 | 20 | Radio::Radio(PinName tx_led, PinName rx_led) : |
jjones646 | 0:c5afea7b9057 | 21 | _tx_led(tx_led), |
jjones646 | 0:c5afea7b9057 | 22 | _rx_led(rx_led), |
jjones646 | 2:c42a035d71ed | 23 | _err_led(p29), |
jjones646 | 0:c5afea7b9057 | 24 | _receive_thread(&Radio::receive_thread, this, osPriorityRealtime, 2048), |
jjones646 | 0:c5afea7b9057 | 25 | _transmit_thread(&Radio::transmit_thread, this, osPriorityNormal, 1024), |
jjones646 | 0:c5afea7b9057 | 26 | _tx_led_thread(&Radio::led_tick, &_tx_led, osPriorityLow, 128), |
jjones646 | 0:c5afea7b9057 | 27 | _rx_led_thread(&Radio::led_tick, &_rx_led, osPriorityLow, 128) |
jjones646 | 0:c5afea7b9057 | 28 | { |
jjones646 | 0:c5afea7b9057 | 29 | _channel = 1; |
jjones646 | 0:c5afea7b9057 | 30 | _addr = 0; |
jjones646 | 0:c5afea7b9057 | 31 | _freq = 0; |
jjones646 | 0:c5afea7b9057 | 32 | _need_ack = false; |
jjones646 | 2:c42a035d71ed | 33 | _p_count = 0; |
jjones646 | 2:c42a035d71ed | 34 | _tx_led = 1; |
jjones646 | 2:c42a035d71ed | 35 | _rx_led = 1; |
jjones646 | 2:c42a035d71ed | 36 | |
jjones646 | 2:c42a035d71ed | 37 | // always off initially |
jjones646 | 2:c42a035d71ed | 38 | _err_led = 1; |
jjones646 | 2:c42a035d71ed | 39 | |
jjones646 | 2:c42a035d71ed | 40 | _has_error = false; |
jjones646 | 0:c5afea7b9057 | 41 | } |
jjones646 | 0:c5afea7b9057 | 42 | |
jjones646 | 0:c5afea7b9057 | 43 | bool Radio::send(const RTP_t& packet) |
jjones646 | 0:c5afea7b9057 | 44 | { |
jjones646 | 0:c5afea7b9057 | 45 | _need_ack = packet.ack; |
jjones646 | 0:c5afea7b9057 | 46 | while (_need_ack) { |
jjones646 | 0:c5afea7b9057 | 47 | this->put_pck(packet.payload, packet.size); |
jjones646 | 0:c5afea7b9057 | 48 | } |
jjones646 | 0:c5afea7b9057 | 49 | |
jjones646 | 0:c5afea7b9057 | 50 | } |
jjones646 | 0:c5afea7b9057 | 51 | |
jjones646 | 0:c5afea7b9057 | 52 | // INTERRUPT ROUTINES |
jjones646 | 0:c5afea7b9057 | 53 | void Radio::isr_receive(void) |
jjones646 | 0:c5afea7b9057 | 54 | { |
jjones646 | 0:c5afea7b9057 | 55 | _receive_thread.signal_set(NEW_DATA); |
jjones646 | 0:c5afea7b9057 | 56 | } |
jjones646 | 0:c5afea7b9057 | 57 | |
jjones646 | 0:c5afea7b9057 | 58 | void Radio::led_tick(void const *arg) |
jjones646 | 0:c5afea7b9057 | 59 | { |
jjones646 | 0:c5afea7b9057 | 60 | DigitalOut *led = (DigitalOut*)arg; |
jjones646 | 2:c42a035d71ed | 61 | |
jjones646 | 2:c42a035d71ed | 62 | // initial LED state to OFF |
jjones646 | 2:c42a035d71ed | 63 | *led = 1; |
jjones646 | 0:c5afea7b9057 | 64 | |
jjones646 | 0:c5afea7b9057 | 65 | while(1) { |
jjones646 | 0:c5afea7b9057 | 66 | // wait for signal to be set before doing anything |
jjones646 | 0:c5afea7b9057 | 67 | osSignalWait(SET_LED_TICK, osWaitForever); |
jjones646 | 0:c5afea7b9057 | 68 | |
jjones646 | 0:c5afea7b9057 | 69 | // blink the led once |
jjones646 | 2:c42a035d71ed | 70 | *led = !*led; |
jjones646 | 0:c5afea7b9057 | 71 | Thread::wait(10); // ms |
jjones646 | 2:c42a035d71ed | 72 | *led = !*led; |
jjones646 | 0:c5afea7b9057 | 73 | Thread::wait(60); |
jjones646 | 0:c5afea7b9057 | 74 | } |
jjones646 | 2:c42a035d71ed | 75 | } |
jjones646 | 2:c42a035d71ed | 76 | |
jjones646 | 2:c42a035d71ed | 77 | bool Radio::hasError(void){ |
jjones646 | 2:c42a035d71ed | 78 | return _has_error; |
jjones646 | 2:c42a035d71ed | 79 | } |