36 #include "sys/cooja_mt.h" 37 #include "lib/simEnvChange.h" 44 #include "dev/cooja-radio.h" 51 #ifdef COOJA_RADIO_CONF_BUFSIZE 52 #define COOJA_RADIO_BUFSIZE COOJA_RADIO_CONF_BUFSIZE 54 #define COOJA_RADIO_BUFSIZE 125 57 #define CCA_SS_THRESHOLD -95 59 const struct simInterface radio_interface;
62 char simReceiving = 0;
63 char simInDataBuffer[COOJA_RADIO_BUFSIZE];
65 rtimer_clock_t simLastPacketTimestamp = 0;
66 char simOutDataBuffer[COOJA_RADIO_BUFSIZE];
68 char simRadioHWOn = 1;
69 int simSignalStrength = -100;
70 int simLastSignalStrength = -100;
72 int simRadioChannel = 26;
75 static const void *pending_data;
78 static int poll_mode = 0;
79 static int auto_ack = 0;
80 static int addr_filter = 0;
81 static int send_on_cca = (COOJA_TRANSMIT_ON_CCA != 0);
83 PROCESS(cooja_radio_process,
"cooja radio process");
86 set_send_on_cca(uint8_t enable)
92 set_frame_filtering(
int enable)
98 set_auto_ack(
int enable)
104 set_poll_mode(
int enable)
110 radio_set_channel(
int channel)
112 simRadioChannel = channel;
116 radio_set_txpower(
unsigned char power)
123 radio_signal_strength_last(
void)
125 return simLastSignalStrength;
129 radio_signal_strength_current(
void)
131 return simSignalStrength;
143 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
151 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
157 doInterfaceActionsBeforeTick(
void)
164 simLastSignalStrength = simSignalStrength;
174 doInterfaceActionsAfterTick(
void)
179 radio_read(
void *buf,
unsigned short bufsize)
186 if(bufsize < simInSize) {
191 memcpy(buf, simInDataBuffer, simInSize);
194 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, simSignalStrength);
195 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, simLQI);
204 if(simSignalStrength > CCA_SS_THRESHOLD) {
211 radio_send(
const void *payload,
unsigned short payload_len)
214 int radio_was_on = simRadioHWOn;
216 if(payload_len > COOJA_RADIO_BUFSIZE) {
219 if(payload_len == 0) {
227 ENERGEST_SWITCH(ENERGEST_TYPE_LISTEN, ENERGEST_TYPE_TRANSMIT);
231 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
234 #if COOJA_SIMULATE_TURNAROUND 235 simProcessRunValue = 1;
237 if(payload_len > 3) {
238 simProcessRunValue = 1;
244 if(COOJA_TRANSMIT_ON_CCA && send_on_cca && !channel_clear()) {
245 result = RADIO_TX_COLLISION;
248 memcpy(simOutDataBuffer, payload, payload_len);
249 simOutSize = payload_len;
252 while(simOutSize > 0) {
256 result = RADIO_TX_OK;
260 ENERGEST_SWITCH(ENERGEST_TYPE_TRANSMIT, ENERGEST_TYPE_LISTEN);
262 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
265 simRadioHWOn = radio_was_on;
270 prepare_packet(
const void *data,
unsigned short len)
272 if(len > COOJA_RADIO_BUFSIZE) {
280 transmit_packet(
unsigned short len)
282 int ret = RADIO_TX_ERR;
283 if(pending_data != NULL) {
284 ret = radio_send(pending_data, len);
290 receiving_packet(
void)
298 return !simReceiving && simInSize > 0;
317 NETSTACK_MAC.
input();
331 static radio_result_t
335 case RADIO_PARAM_RX_MODE:
341 *value |= RADIO_RX_MODE_AUTOACK;
344 *value |= RADIO_RX_MODE_POLL_MODE;
346 return RADIO_RESULT_OK;
347 case RADIO_PARAM_TX_MODE:
352 return RADIO_RESULT_OK;
353 case RADIO_PARAM_LAST_RSSI:
354 *value = simSignalStrength;
355 return RADIO_RESULT_OK;
356 case RADIO_PARAM_LAST_LINK_QUALITY:
358 return RADIO_RESULT_OK;
359 case RADIO_PARAM_RSSI:
361 *value = -90 + simRadioChannel - 11;
362 return RADIO_RESULT_OK;
363 case RADIO_CONST_MAX_PAYLOAD_LEN:
365 return RADIO_RESULT_OK;
367 return RADIO_RESULT_NOT_SUPPORTED;
371 static radio_result_t
375 case RADIO_PARAM_RX_MODE:
377 RADIO_RX_MODE_AUTOACK | RADIO_RX_MODE_POLL_MODE)) {
378 return RADIO_RESULT_INVALID_VALUE;
383 return RADIO_RESULT_NOT_SUPPORTED;
385 set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
388 if ((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0) {
389 return RADIO_RESULT_NOT_SUPPORTED;
391 set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0);
393 set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0);
394 return RADIO_RESULT_OK;
395 case RADIO_PARAM_TX_MODE:
397 return RADIO_RESULT_INVALID_VALUE;
400 return RADIO_RESULT_OK;
401 case RADIO_PARAM_CHANNEL:
402 if(value < 11 || value > 26) {
403 return RADIO_RESULT_INVALID_VALUE;
405 radio_set_channel(value);
406 return RADIO_RESULT_OK;
408 return RADIO_RESULT_NOT_SUPPORTED;
412 static radio_result_t
413 get_object(radio_param_t param,
void *dest,
size_t size)
415 if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) {
416 if(size !=
sizeof(rtimer_clock_t) || !dest) {
417 return RADIO_RESULT_INVALID_VALUE;
419 *(rtimer_clock_t *)dest = (rtimer_clock_t)simLastPacketTimestamp;
420 return RADIO_RESULT_OK;
422 return RADIO_RESULT_NOT_SUPPORTED;
425 static radio_result_t
426 set_object(radio_param_t param,
const void *src,
size_t size)
428 return RADIO_RESULT_NOT_SUPPORTED;
449 SIM_INTERFACE(radio_interface,
450 doInterfaceActionsBeforeTick,
451 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.
Header file for the energy estimation mechanism
#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.