36 #include "sys/cooja_mt.h" 37 #include "lib/simEnvChange.h" 43 #include "dev/cooja-radio.h" 45 #define COOJA_RADIO_BUFSIZE PACKETBUF_SIZE 46 #define CCA_SS_THRESHOLD -95 48 const struct simInterface radio_interface;
51 char simReceiving = 0;
52 char simInDataBuffer[COOJA_RADIO_BUFSIZE];
54 rtimer_clock_t simLastPacketTimestamp = 0;
55 char simOutDataBuffer[COOJA_RADIO_BUFSIZE];
57 char simRadioHWOn = 1;
58 int simSignalStrength = -100;
59 int simLastSignalStrength = -100;
61 int simRadioChannel = 26;
64 static const void *pending_data;
67 static int poll_mode = 0;
68 static int auto_ack = 0;
69 static int addr_filter = 0;
70 static int send_on_cca = (COOJA_TRANSMIT_ON_CCA != 0);
72 PROCESS(cooja_radio_process,
"cooja radio process");
75 set_send_on_cca(uint8_t enable)
81 set_frame_filtering(
int enable)
87 set_auto_ack(
int enable)
93 set_poll_mode(
int enable)
99 radio_set_channel(
int channel)
101 simRadioChannel = channel;
105 radio_set_txpower(
unsigned char power)
112 radio_signal_strength_last(
void)
114 return simLastSignalStrength;
118 radio_signal_strength_current(
void)
120 return simSignalStrength;
144 doInterfaceActionsBeforeTick(
void)
151 simLastSignalStrength = simSignalStrength;
161 doInterfaceActionsAfterTick(
void)
166 radio_read(
void *buf,
unsigned short bufsize)
173 if(bufsize < simInSize) {
178 memcpy(buf, simInDataBuffer, simInSize);
181 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, simSignalStrength);
182 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, simLQI);
191 if(simSignalStrength > CCA_SS_THRESHOLD) {
198 radio_send(
const void *payload,
unsigned short payload_len)
200 int radiostate = simRadioHWOn;
203 #if COOJA_SIMULATE_TURNAROUND 204 simProcessRunValue = 1;
206 if(payload_len > 3) {
207 simProcessRunValue = 1;
216 if(payload_len > COOJA_RADIO_BUFSIZE) {
219 if(payload_len == 0) {
227 #if COOJA_TRANSMIT_ON_CCA 228 if(send_on_cca && !channel_clear()) {
229 return RADIO_TX_COLLISION;
234 memcpy(simOutDataBuffer, payload, payload_len);
235 simOutSize = payload_len;
238 while(simOutSize > 0) {
242 simRadioHWOn = radiostate;
247 prepare_packet(
const void *data,
unsigned short len)
254 transmit_packet(
unsigned short len)
256 int ret = RADIO_TX_ERR;
257 if(pending_data != NULL) {
258 ret = radio_send(pending_data, len);
264 receiving_packet(
void)
272 return !simReceiving && simInSize > 0;
291 NETSTACK_MAC.
input();
305 static radio_result_t
309 case RADIO_PARAM_RX_MODE:
315 *value |= RADIO_RX_MODE_AUTOACK;
318 *value |= RADIO_RX_MODE_POLL_MODE;
320 return RADIO_RESULT_OK;
321 case RADIO_PARAM_TX_MODE:
326 return RADIO_RESULT_OK;
327 case RADIO_PARAM_LAST_RSSI:
328 *value = simSignalStrength;
329 return RADIO_RESULT_OK;
330 case RADIO_PARAM_LAST_LINK_QUALITY:
332 return RADIO_RESULT_OK;
333 case RADIO_PARAM_RSSI:
335 *value = -90 + simRadioChannel - 11;
336 return RADIO_RESULT_OK;
338 return RADIO_RESULT_NOT_SUPPORTED;
342 static radio_result_t
346 case RADIO_PARAM_RX_MODE:
348 RADIO_RX_MODE_AUTOACK | RADIO_RX_MODE_POLL_MODE)) {
349 return RADIO_RESULT_INVALID_VALUE;
354 return RADIO_RESULT_NOT_SUPPORTED;
356 set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
359 if ((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0) {
360 return RADIO_RESULT_NOT_SUPPORTED;
362 set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0);
364 set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0);
365 return RADIO_RESULT_OK;
366 case RADIO_PARAM_TX_MODE:
368 return RADIO_RESULT_INVALID_VALUE;
371 return RADIO_RESULT_OK;
372 case RADIO_PARAM_CHANNEL:
373 if(value < 11 || value > 26) {
374 return RADIO_RESULT_INVALID_VALUE;
376 radio_set_channel(value);
377 return RADIO_RESULT_OK;
379 return RADIO_RESULT_NOT_SUPPORTED;
383 static radio_result_t
384 get_object(radio_param_t param,
void *dest,
size_t size)
386 if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) {
387 if(size !=
sizeof(rtimer_clock_t) || !dest) {
388 return RADIO_RESULT_INVALID_VALUE;
390 *(rtimer_clock_t *)dest = (rtimer_clock_t)simLastPacketTimestamp;
391 return RADIO_RESULT_OK;
393 return RADIO_RESULT_NOT_SUPPORTED;
396 static radio_result_t
397 set_object(radio_param_t param,
const void *src,
size_t size)
399 return RADIO_RESULT_NOT_SUPPORTED;
420 SIM_INTERFACE(radio_interface,
421 doInterfaceActionsBeforeTick,
422 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.