radio.h
Go to the documentation of this file.
00001 /* Copyright (c) 2007-2009 Axel Wachtler
00002    All rights reserved.
00003 
00004    Redistribution and use in source and binary forms, with or without
00005    modification, are permitted provided that the following conditions
00006    are met:
00007 
00008    * Redistributions of source code must retain the above copyright
00009      notice, this list of conditions and the following disclaimer.
00010    * Redistributions in binary form must reproduce the above copyright
00011      notice, this list of conditions and the following disclaimer in the
00012      documentation and/or other materials provided with the distribution.
00013    * Neither the name of the authors nor the names of its contributors
00014      may be used to endorse or promote products derived from this software
00015      without specific prior written permission.
00016 
00017    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027    POSSIBILITY OF SUCH DAMAGE. */
00028 
00029 /* $Id$ */
00035 #ifndef RADIO_H
00036 #define RADIO_H
00037 
00038 /* === Includes ============================================================== */
00039 #include <stdbool.h>
00040 #include <stdio.h>
00041 #include <util/crc16.h>
00042 #include "const.h"
00043 
00049 /* === Externals ============================================================= */
00050 
00051 /* === Types ================================================================= */
00052 
00058 #define  STATE_OFF (0)
00059 
00060 #define  STATE_TX (1)
00061 
00062 #define STATE_RX (2)
00063 
00064 #define STATE_TXAUTO (3)
00065 
00066 #define STATE_RXAUTO (4)
00067 
00068 #define STATE_SLEEP (5)
00069 
00070 
00072 typedef uint8_t radio_state_t;
00073 
00077 typedef enum
00078 {
00079     TX_OK,          
00080     TX_CCA_FAIL,        
00081     TX_NO_ACK,          
00082     TX_FAIL,            
00083 } radio_tx_done_t;
00084 
00085 
00089 typedef enum SHORTENUM
00090 {
00091 #if defined(CCA_BUSY)
00092 
00096     RADIO_CCA_FREE = CCA_IDLE,
00097     RADIO_CCA_BUSY = CCA_BUSY,
00098     RADIO_CCA_FAIL = 255,
00099 #else
00100 
00101     RADIO_CCA_FREE = 0,
00103     RADIO_CCA_BUSY,
00105     RADIO_CCA_FAIL
00106 #endif
00107 
00108 } radio_cca_t;
00109 
00110 
00113 typedef enum SHORTENUM
00114 {
00116     phyCurrentChannel,
00118     phyChannelsSupported,
00120     phyTransmitPower,
00122     phyIdleState,
00132     phyCCAMode,
00134     phyPanId,
00136     phyShortAddr,
00138     phyLongAddr,
00139 
00141     phyDataRate,
00142 
00144     phyTxPa,
00146     phyRxLna
00147 
00148 } radio_attribute_t;
00149 
00150 
00159 typedef union radio_param_t
00160 {
00161 #if defined __cplusplus
00162 public:
00163     radio_param_t(int8_t c) { channel = c; } /* also used for txpwr_t */
00164     //radio_param_t(radio_state_t s) { idle_state = s; }
00165     radio_param_t(uint8_t m) { cca_mode = m; } /* also used for data_rate, tx_pa, rx_lna */
00166     radio_param_t(uint16_t p) { pan_id = p; } /* also used for short_addr */
00167     radio_param_t(uint64_t *la) { long_addr = la; }
00168 #endif
00169 
00170     channel_t channel;
00172     txpwr_t   tx_pwr;
00174     radio_state_t idle_state;
00176     ccamode_t cca_mode;
00178     uint16_t pan_id;
00180     uint16_t short_addr;
00182     uint64_t *long_addr;
00184     uint8_t data_rate;
00185 
00187     uint8_t tx_pa;
00189     uint8_t rx_lna;
00190 
00191 } radio_param_t;
00192 
00193 
00197 typedef enum SHORTENUM
00198 {
00199     #ifndef SUCCESS
00200 
00201     SUCCESS = 0,        
00202     #endif
00203     STATE_SET_FAILED = 1,   
00204     SET_PARM_FAILED,    
00205     GET_PARM_FAILED,    
00206     GENERAL_ERROR,      
00207 } radio_error_t;
00208 
00209 
00213 typedef struct
00214 {
00215     uint8_t  channel;      
00217     uint8_t  tx_pwr;       
00218     uint8_t  cca_mode;     
00219     radio_state_t state;      
00220     radio_state_t idle_state; 
00221     uint8_t  *rxframe;      
00222     uint8_t  rxframesz;     
00223     uint8_t tx_pa;
00224     uint8_t rx_lna;
00225 } radio_status_t;
00226 
00227 /* === Macros ================================================================ */
00228 
00232 #define VOID_RSSI (0xff)
00233 
00234 #if defined(DOXYGEN)
00235 
00239 #  define RP_CHANNEL(x)
00240 #elif defined __cplusplus
00241 #  define RP_CHANNEL(x) phyCurrentChannel,radio_param_t((channel_t)x)
00242 #else
00243 #  define RP_CHANNEL(x) phyCurrentChannel,(radio_param_t){.channel=x}
00244 #endif
00245 
00246 #if defined(DOXYGEN)
00247 
00251 #  define RP_TXPWR(x)
00252 #elif defined __cplusplus
00253 #  define RP_TXPWR(x)   phyTransmitPower,radio_param_t((txpwr_t)x)
00254 #else
00255 #  define RP_TXPWR(x)   phyTransmitPower,(radio_param_t){.tx_pwr=x}
00256 #endif
00257 
00258 #if defined(DOXYGEN)
00259 
00263 #  define RP_IDLESTATE(x)
00264 #elif defined __cplusplus
00265 #  define RP_IDLESTATE(x)  phyIdleState,radio_param_t(x)
00266 #else
00267 #  define RP_IDLESTATE(x)  phyIdleState,(radio_param_t){.idle_state=x}
00268 #endif
00269 
00270 #if defined(DOXYGEN)
00271 
00275 #  define RP_CCAMODE(x)
00276 #elif defined __cplusplus
00277 #  define RP_CCAMODE(x)  phyCCAMode,radio_param_t((ccamode_t)x)
00278 #else
00279 #  define RP_CCAMODE(x) phyCCAMode,(radio_param_t){.cca_mode=x}
00280 #endif
00281 
00282 #if defined(DOXYGEN)
00283 
00287 #  define RP_PANID(x)
00288 #elif defined __cplusplus
00289 #  define RP_PANID(x) phyPanId,radio_param_t((uint16_t)x)
00290 #else
00291 #  define RP_PANID(x) phyPanId,(radio_param_t){.pan_id=x}
00292 #endif
00293 
00294 #if defined(DOXYGEN)
00295 
00299 #  define RP_SHORTADDR(x)
00300 #elif defined __cplusplus
00301 #  define RP_SHORTADDR(x) phyShortAddr,radio_param_t((uint16_t)x)
00302 #else
00303 #  define RP_SHORTADDR(x) phyShortAddr,(radio_param_t){.short_addr=x}
00304 #endif
00305 
00306 #if defined(DOXYGEN)
00307 
00311 #  define RP_LONGADDR(x)
00312 #elif defined __cplusplus
00313 #  define RP_LONGADDR(x) phyLongAddr,radio_param_t((uint64_t *)x)
00314 #else
00315 #  define RP_LONGADDR(x) phyLongAddr,(radio_param_t){.long_addr=x}
00316 #endif
00317 
00318 
00319 #if defined(DOXYGEN)
00320 
00324 #  define RP_DATARATE(x)
00325 #elif defined __cplusplus
00326 #  define RP_DATARATE(x) phyDataRate,radio_param_t((uint16_t)x)
00327 #else
00328 #  define RP_DATARATE(x) phyDataRate,(radio_param_t){.data_rate=x}
00329 #endif
00330 
00331 #if defined(DOXYGEN)
00332 
00336 #  define RP_CHANNEL(x)
00337 #elif defined __cplusplus
00338 #  define RP_TX_PA(x) phyTxPa,radio_param_t((tx_pa_t)x)
00339 #else
00340 #  define RP_TX_PA(x) phyTxPa,(radio_param_t){.tx_pa=x}
00341 #endif
00342 
00343 #if defined(DOXYGEN)
00344 
00348 #  define RP_RX_LNA(x)
00349 #elif defined __cplusplus
00350 #  define RP_RX_LNA(x) phyRxLna,radio_param_t((rx_lna_t)x)
00351 #else
00352 #  define RP_RX_LNA(x) phyRxLna,(radio_param_t){.rx_lna=x}
00353 #endif
00354 
00355 #define CRC_CCITT_UPDATE(crc, data) _crc_ccitt_update(crc, data)
00356 
00357 #ifndef RADIO_CFG_EEOFFSET
00358 
00359 #define RADIO_CFG_EEOFFSET (8)
00360 #endif
00361 
00362 #ifndef RADIO_CFG_DATA
00363 
00364 #define RADIO_CFG_DATA {chan: 16, txp: 0, cca: 1, edt: 11, clkm: 0, crc: 0xab12}
00365 #endif
00366 
00367 /* === Prototypes ============================================================ */
00368 #ifdef __cplusplus
00369 extern "C" {
00370 #endif
00371 
00372 
00387 void radio_init(uint8_t * rxbuf, uint8_t rxbufsz);
00388 
00389 
00395 void radio_force_state(radio_state_t state);
00396 
00397 
00402 void radio_set_state(radio_state_t state);
00403 
00427 void radio_set_param(radio_attribute_t attr, radio_param_t parm);
00428 
00447 void radio_send_frame(uint8_t len, uint8_t *frm, uint8_t compcrc);
00448 
00449 
00454 radio_cca_t radio_do_cca(void);
00455 
00456 int radio_putchar(int c);
00457 int radio_getchar(void);
00458 
00459 /* application call back functions to radio library */
00460 
00461 
00470 void usr_radio_error(radio_error_t err);
00471 
00477 void usr_radio_irq(uint8_t cause);
00478 
00504 uint8_t * usr_radio_receive_frame(uint8_t len, uint8_t *frm, uint8_t lqi, int8_t ed, uint8_t crc_fail);
00505 
00506 
00512 void usr_radio_tx_done(radio_tx_done_t status);
00513 
00514 
00515 #ifdef __cplusplus
00516 } /* extern "C" */
00517 #endif
00518 
00519 
00523 #endif  /* #ifndef RADIO_H */
00524 /* EOF */