36 #include "sys/cooja_mt.h"
37 #include "lib/simEnvChange.h"
44 #include "dev/cooja-radio.h"
46 #define COOJA_RADIO_BUFSIZE PACKETBUF_SIZE
47 #define CCA_SS_THRESHOLD -95
49 #define WITH_TURNAROUND 1
50 #define WITH_SEND_CCA 1
52 const struct simInterface radio_interface;
55 char simReceiving = 0;
56 char simInDataBuffer[COOJA_RADIO_BUFSIZE];
58 char simOutDataBuffer[COOJA_RADIO_BUFSIZE];
60 char simRadioHWOn = 1;
61 int simSignalStrength = -100;
62 int simLastSignalStrength = -100;
64 int simRadioChannel = 26;
67 static const void *pending_data;
69 PROCESS(cooja_radio_process,
"cooja radio process");
73 radio_set_channel(
int channel)
75 simRadioChannel = channel;
79 radio_set_txpower(
unsigned char power)
86 radio_signal_strength_last(
void)
88 return simLastSignalStrength;
92 radio_signal_strength_current(
void)
94 return simSignalStrength;
118 doInterfaceActionsBeforeTick(
void)
125 simLastSignalStrength = simSignalStrength;
135 doInterfaceActionsAfterTick(
void)
140 radio_read(
void *buf,
unsigned short bufsize)
147 if(bufsize < simInSize) {
149 RIMESTATS_ADD(toolong);
153 memcpy(buf, simInDataBuffer, simInSize);
155 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, simSignalStrength);
156 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, simLQI);
164 if(simSignalStrength > CCA_SS_THRESHOLD) {
171 radio_send(
const void *payload,
unsigned short payload_len)
173 int radiostate = simRadioHWOn;
177 simProcessRunValue = 1;
179 if(payload_len > 3) {
180 simProcessRunValue = 1;
189 if(payload_len > COOJA_RADIO_BUFSIZE) {
192 if(payload_len == 0) {
201 if(!channel_clear()) {
202 return RADIO_TX_COLLISION;
207 memcpy(simOutDataBuffer, payload, payload_len);
208 simOutSize = payload_len;
211 while(simOutSize > 0) {
215 simRadioHWOn = radiostate;
220 prepare_packet(
const void *data,
unsigned short len)
227 transmit_packet(
unsigned short len)
229 int ret = RADIO_TX_ERR;
230 if(pending_data !=
NULL) {
231 ret = radio_send(pending_data, len);
237 receiving_packet(
void)
245 return !simReceiving && simInSize > 0;
261 NETSTACK_RDC.input();
275 static radio_result_t
278 return RADIO_RESULT_NOT_SUPPORTED;
281 static radio_result_t
284 return RADIO_RESULT_NOT_SUPPORTED;
287 static radio_result_t
288 get_object(radio_param_t param,
void *dest,
size_t size)
290 return RADIO_RESULT_NOT_SUPPORTED;
293 static radio_result_t
294 set_object(radio_param_t param,
const void *src,
size_t size)
296 return RADIO_RESULT_NOT_SUPPORTED;
317 SIM_INTERFACE(radio_interface,
318 doInterfaceActionsBeforeTick,
319 doInterfaceActionsAfterTick);
void process_poll(struct process *p)
Request a process to be polled.
#define PROCESS_BEGIN()
Define the beginning of a process.
Header file for the radio API
Header file for the Rime buffer (packetbuf) management
#define NULL
The null pointer.
The structure of a device driver for a radio in Contiki.
int(* pending_packet)(void)
Check if the radio driver has just received a packet.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not...
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
#define PROCESS(name, strname)
Declare a process.
void packetbuf_clear(void)
Clear and reset the packetbuf.
void process_start(struct process *p, process_data_t data)
Start a process.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
Header file for Rime statistics
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
Include file for the Contiki low-layer network stack (NETSTACK)