diff --git a/sw/airborne/subsystems/datalink/datalink.h b/sw/airborne/subsystems/datalink/datalink.h index 1ec00307ef..e8fe6bfef6 100644 --- a/sw/airborne/subsystems/datalink/datalink.h +++ b/sw/airborne/subsystems/datalink/datalink.h @@ -46,6 +46,7 @@ #define PPRZ 1 #define XBEE 2 #define SUPERBITRF 3 +#define W5100 4 EXTERN bool_t dl_msg_available; /** Flag provided to control calls to ::dl_parse_msg. NOT used in this module*/ diff --git a/sw/airborne/subsystems/datalink/downlink.c b/sw/airborne/subsystems/datalink/downlink.c index d83050baba..58d5f8a73c 100644 --- a/sw/airborne/subsystems/datalink/downlink.c +++ b/sw/airborne/subsystems/datalink/downlink.c @@ -63,7 +63,7 @@ void downlink_init(void) downlink.nb_msgs = 0; #if defined DATALINK -#if DATALINK == PPRZ +#if DATALINK == PPRZ || DATALINK == SUPERBITRF || DATALINK == W5100 pprz_transport_init(); #endif #if DATALINK == XBEE diff --git a/sw/airborne/subsystems/datalink/superbitrf.c b/sw/airborne/subsystems/datalink/superbitrf.c index 760594bf4e..2cd58c2ee3 100644 --- a/sw/airborne/subsystems/datalink/superbitrf.c +++ b/sw/airborne/subsystems/datalink/superbitrf.c @@ -200,15 +200,18 @@ static void send_superbit(struct transport_tx *trans, struct link_device *dev) { #endif // Functions for the generic device API -static int superbitrf_check_free_space(struct SuperbitRF* p __attribute__((unused)), uint8_t len __attribute__((unused))) +static bool_t superbitrf_check_free_space(struct SuperbitRF* p, uint8_t len) { - return (((superbitrf.tx_insert_idx+1) %128) != superbitrf.tx_extract_idx); + int16_t space = p->tx_extract_idx - p->tx_insert_idx; + if (space <= 0) + space += SUPERBITRF_TX_BUFFER_SIZE; + return (uint16_t)(space - 1) >= len; } -static void superbitrf_transmit(struct SuperbitRF* p __attribute__((unused)), uint8_t byte) +static void superbitrf_transmit(struct SuperbitRF* p, uint8_t byte) { - superbitrf.tx_buffer[superbitrf.tx_insert_idx] = byte; - superbitrf.tx_insert_idx = (superbitrf.tx_insert_idx+1) %128; + p->tx_buffer[p->tx_insert_idx] = byte; + p->tx_insert_idx = (p->tx_insert_idx+1) %SUPERBITRF_TX_BUFFER_SIZE; } static void superbitrf_send(struct SuperbitRF* p __attribute__((unused))) { } @@ -506,12 +509,12 @@ void superbitrf_event(void) { tx_packet[1] = (superbitrf.bind_mfg_id[3])+1+superbitrf.packet_loss_bit; } - packet_size = (superbitrf.tx_insert_idx-superbitrf.tx_extract_idx+128 %128); + packet_size = (superbitrf.tx_insert_idx-superbitrf.tx_extract_idx+SUPERBITRF_TX_BUFFER_SIZE %SUPERBITRF_TX_BUFFER_SIZE); if(packet_size > 14) packet_size = 14; for(i = 0; i < packet_size; i++) - tx_packet[i+2] = superbitrf.tx_buffer[(superbitrf.tx_extract_idx+i) %128]; + tx_packet[i+2] = superbitrf.tx_buffer[(superbitrf.tx_extract_idx+i) %SUPERBITRF_TX_BUFFER_SIZE]; } // Send a packet @@ -519,7 +522,7 @@ void superbitrf_event(void) { // Update the packet extraction if(!superbitrf.packet_loss) - superbitrf.tx_extract_idx = (superbitrf.tx_extract_idx+packet_size) %128; + superbitrf.tx_extract_idx = (superbitrf.tx_extract_idx+packet_size) %SUPERBITRF_TX_BUFFER_SIZE; superbitrf.state++; break; @@ -632,12 +635,12 @@ void superbitrf_event(void) { tx_packet[1] = ((superbitrf.bind_mfg_id[3])+1+superbitrf.packet_loss_bit) % 0xFF; } - packet_size = (superbitrf.tx_insert_idx-superbitrf.tx_extract_idx+128 %128); + packet_size = (superbitrf.tx_insert_idx-superbitrf.tx_extract_idx+SUPERBITRF_TX_BUFFER_SIZE %SUPERBITRF_TX_BUFFER_SIZE); if(packet_size > 14) packet_size = 14; for(i = 0; i < packet_size; i++) - tx_packet[i+2] = superbitrf.tx_buffer[(superbitrf.tx_extract_idx+i) %128]; + tx_packet[i+2] = superbitrf.tx_buffer[(superbitrf.tx_extract_idx+i) %SUPERBITRF_TX_BUFFER_SIZE]; } // Send a packet @@ -645,7 +648,7 @@ void superbitrf_event(void) { // Update the packet extraction if(!superbitrf.packet_loss) - superbitrf.tx_extract_idx = (superbitrf.tx_extract_idx+packet_size) %128; + superbitrf.tx_extract_idx = (superbitrf.tx_extract_idx+packet_size) %SUPERBITRF_TX_BUFFER_SIZE; superbitrf.state++; break; diff --git a/sw/airborne/subsystems/datalink/superbitrf.h b/sw/airborne/subsystems/datalink/superbitrf.h index 1bba6ffd7c..afb73e5482 100644 --- a/sw/airborne/subsystems/datalink/superbitrf.h +++ b/sw/airborne/subsystems/datalink/superbitrf.h @@ -70,6 +70,8 @@ enum dsm_protocol { #define IS_DSM2(x) (x == DSM_DSM2P || x == DSM_DSM2_1 || x == DSM_DSM2_2) #define IS_DSMX(x) (!IS_DSM2(x)) +#define SUPERBITRF_TX_BUFFER_SIZE 128 + /* The superbitrf structure */ struct SuperbitRF { struct Cyrf6936 cyrf6936; /**< The cyrf chip used */ @@ -108,7 +110,7 @@ struct SuperbitRF { struct pprz_transport rx_transport; /**< The receive transport */ - uint8_t tx_buffer[128]; /**< The transmit buffer */ + uint8_t tx_buffer[SUPERBITRF_TX_BUFFER_SIZE]; /**< The transmit buffer */ uint8_t tx_insert_idx; /**< The transmit buffer insert index */ uint8_t tx_extract_idx; /**< The transmit buffer extract index */ @@ -125,10 +127,10 @@ extern void superbitrf_set_protocol(uint8_t protocol); /* The datalink defines */ #define SuperbitRFInit() { }//superbitrf_init(); } -#define SuperbitRFCheckFreeSpace(_x) (((superbitrf.tx_insert_idx+1) %128) != superbitrf.tx_extract_idx) +#define SuperbitRFCheckFreeSpace(_x) (((superbitrf.tx_insert_idx+1) %SUPERBITRF_TX_BUFFER_SIZE) != superbitrf.tx_extract_idx) #define SuperbitRFTransmit(_x) { \ superbitrf.tx_buffer[superbitrf.tx_insert_idx] = _x; \ - superbitrf.tx_insert_idx = (superbitrf.tx_insert_idx+1) %128; \ + superbitrf.tx_insert_idx = (superbitrf.tx_insert_idx+1) %SUPERBITRF_TX_BUFFER_SIZE; \ } #define SuperbitRFSendMessage() { } #define SuperbitRFCheckAndParse() { }