36 #include "sys/cooja_mt.h" 37 #include "lib/simEnvChange.h" 43 #include "dev/cooja-radio.h" 50 #ifdef COOJA_RADIO_CONF_BUFSIZE 51 #define COOJA_RADIO_BUFSIZE COOJA_RADIO_CONF_BUFSIZE 53 #define COOJA_RADIO_BUFSIZE 125 56 #define CCA_SS_THRESHOLD -95 58 const struct simInterface radio_interface;
61 char simReceiving = 0;
62 char simInDataBuffer[COOJA_RADIO_BUFSIZE];
64 rtimer_clock_t simLastPacketTimestamp = 0;
65 char simOutDataBuffer[COOJA_RADIO_BUFSIZE];
67 char simRadioHWOn = 1;
68 int simSignalStrength = -100;
69 int simLastSignalStrength = -100;
71 int simRadioChannel = 26;
74 static const void *pending_data;
77 static int poll_mode = 0;
78 static int auto_ack = 0;
79 static int addr_filter = 0;
80 static int send_on_cca = (COOJA_TRANSMIT_ON_CCA != 0);
82 PROCESS(cooja_radio_process,
"cooja radio process");
85 set_send_on_cca(uint8_t enable)
91 set_frame_filtering(
int enable)
97 set_auto_ack(
int enable)
103 set_poll_mode(
int enable)
109 radio_set_channel(
int channel)
111 simRadioChannel = channel;
115 radio_set_txpower(
unsigned char power)
122 radio_signal_strength_last(
void)
124 return simLastSignalStrength;
128 radio_signal_strength_current(
void)
130 return simSignalStrength;
154 doInterfaceActionsBeforeTick(
void)
161 simLastSignalStrength = simSignalStrength;
171 doInterfaceActionsAfterTick(
void)
176 radio_read(
void *buf,
unsigned short bufsize)
183 if(bufsize < simInSize) {
188 memcpy(buf, simInDataBuffer, simInSize);
191 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, simSignalStrength);
192 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, simLQI);
201 if(simSignalStrength > CCA_SS_THRESHOLD) {
208 radio_send(
const void *payload,
unsigned short payload_len)
210 int radiostate = simRadioHWOn;
213 #if COOJA_SIMULATE_TURNAROUND 214 simProcessRunValue = 1;
216 if(payload_len > 3) {
217 simProcessRunValue = 1;
226 if(payload_len > COOJA_RADIO_BUFSIZE) {
229 if(payload_len == 0) {
237 #if COOJA_TRANSMIT_ON_CCA 238 if(send_on_cca && !channel_clear()) {
239 return RADIO_TX_COLLISION;
244 memcpy(simOutDataBuffer, payload, payload_len);
245 simOutSize = payload_len;
248 while(simOutSize > 0) {
252 simRadioHWOn = radiostate;
257 prepare_packet(
const void *data,
unsigned short len)
259 if(len > COOJA_RADIO_BUFSIZE) {
267 transmit_packet(
unsigned short len)
269 int ret = RADIO_TX_ERR;
270 if(pending_data != NULL) {
271 ret = radio_send(pending_data, len);
277 receiving_packet(
void)
285 return !simReceiving && simInSize > 0;
304 NETSTACK_MAC.
input();
318 static radio_result_t
322 case RADIO_PARAM_RX_MODE:
328 *value |= RADIO_RX_MODE_AUTOACK;
331 *value |= RADIO_RX_MODE_POLL_MODE;
333 return RADIO_RESULT_OK;
334 case RADIO_PARAM_TX_MODE:
339 return RADIO_RESULT_OK;
340 case RADIO_PARAM_LAST_RSSI:
341 *value = simSignalStrength;
342 return RADIO_RESULT_OK;
343 case RADIO_PARAM_LAST_LINK_QUALITY:
345 return RADIO_RESULT_OK;
346 case RADIO_PARAM_RSSI:
348 *value = -90 + simRadioChannel - 11;
349 return RADIO_RESULT_OK;
350 case RADIO_CONST_MAX_PAYLOAD_LEN:
352 return RADIO_RESULT_OK;
354 return RADIO_RESULT_NOT_SUPPORTED;
358 static radio_result_t
362 case RADIO_PARAM_RX_MODE:
364 RADIO_RX_MODE_AUTOACK | RADIO_RX_MODE_POLL_MODE)) {
365 return RADIO_RESULT_INVALID_VALUE;
370 return RADIO_RESULT_NOT_SUPPORTED;
372 set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
375 if ((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0) {
376 return RADIO_RESULT_NOT_SUPPORTED;
378 set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0);
380 set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0);
381 return RADIO_RESULT_OK;
382 case RADIO_PARAM_TX_MODE:
384 return RADIO_RESULT_INVALID_VALUE;
387 return RADIO_RESULT_OK;
388 case RADIO_PARAM_CHANNEL:
389 if(value < 11 || value > 26) {
390 return RADIO_RESULT_INVALID_VALUE;
392 radio_set_channel(value);
393 return RADIO_RESULT_OK;
395 return RADIO_RESULT_NOT_SUPPORTED;
399 static radio_result_t
400 get_object(radio_param_t param,
void *dest,
size_t size)
402 if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) {
403 if(size !=
sizeof(rtimer_clock_t) || !dest) {
404 return RADIO_RESULT_INVALID_VALUE;
406 *(rtimer_clock_t *)dest = (rtimer_clock_t)simLastPacketTimestamp;
407 return RADIO_RESULT_OK;
409 return RADIO_RESULT_NOT_SUPPORTED;
412 static radio_result_t
413 set_object(radio_param_t param,
const void *src,
size_t size)
415 return RADIO_RESULT_NOT_SUPPORTED;
436 SIM_INTERFACE(radio_interface,
437 doInterfaceActionsBeforeTick,
438 doInterfaceActionsAfterTick);
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
#define PROCESS(name, strname)
Declare a process.
void packetbuf_clear(void)
Clear and reset the packetbuf.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
Header file for the radio API
#define PROCESS_BEGIN()
Define the beginning of a process.
#define PROCESS_END()
Define the end of a process.
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
int(* pending_packet)(void)
Check if the radio driver has just received a packet.
The structure of a device driver for a radio in Contiki.
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not...
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
void(* input)(void)
Callback for getting notified of incoming packet.
void process_poll(struct process *p)
Request a process to be polled.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
#define RADIO_RX_MODE_ADDRESS_FILTER
The radio reception mode controls address filtering and automatic transmission of acknowledgements in...
#define RADIO_TX_MODE_SEND_ON_CCA
The radio transmission mode controls whether transmissions should be done using clear channel assessm...
Header file for the Packet buffer (packetbuf) management
Include file for the Contiki low-layer network stack (NETSTACK)
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
PROCESS_THREAD(cc2538_rf_process, ev, data)
Implementation of the cc2538 RF driver process.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
void process_start(struct process *p, process_data_t data)
Start a process.