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()) {
248 memcpy(simOutDataBuffer, payload, payload_len);
249 simOutSize = payload_len;
252 while(simOutSize > 0) {
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)
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();
354 *value = simSignalStrength;
361 *value = -90 + simRadioChannel - 11;
363 case RADIO_CONST_MAX_PAYLOAD_LEN:
385 set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
388 if ((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0) {
402 if(value < 11 || value > 26) {
405 radio_set_channel(value);
413 get_object(radio_param_t param,
void *dest,
size_t size)
416 if(size !=
sizeof(rtimer_clock_t) || !dest) {
419 *(rtimer_clock_t *)dest = (rtimer_clock_t)simLastPacketTimestamp;
426 set_object(radio_param_t param,
const void *src,
size_t size)
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.
The parameter is not supported.
void packetbuf_clear(void)
Clear and reset the packetbuf.
Header file for the energy estimation mechanism
TX failed due to a collision.
#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.
Received signal strength indicator in dBm.
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 a packet has been received and is available in the radio driver's buffers.
The structure of a Contiki-NG radio device driver.
Channel used for radio communication.
The value argument was incorrect.
The parameter was set/read successfully.
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...
Radio transmission mode determines if the radio has send on CCA (RADIO_TX_MODE_SEND_ON_CCA) enabled o...
The RSSI value of the last received packet.
void(* input)(void)
Callback for getting notified of incoming packet.
void process_poll(struct process *p)
Request a process to be polled.
Radio receiver mode determines if the radio has address filter (RADIO_RX_MODE_ADDRESS_FILTER) and aut...
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
#define RADIO_RX_MODE_ADDRESS_FILTER
Enable address-based frame filtering.
enum radio_result_e radio_result_t
Radio return values when setting or getting radio parameters.
#define RADIO_TX_MODE_SEND_ON_CCA
Radio TX mode control / retrieval.
#define RADIO_RX_MODE_AUTOACK
Enable automatic transmission of ACK frames.
int(* init)(void)
Initialise the radio hardware.
#define RADIO_RX_MODE_POLL_MODE
Enable/disable/get the state of radio driver poll mode operation.
Link quality indicator of the last received packet.
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.
Last packet timestamp, of type rtimer_clock_t.
An error occurred during transmission.
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.
TX was successful and where an ACK was requested one was received.
void process_start(struct process *p, process_data_t data)
Start a process.