Denna tjänst avvecklas 2026-01-19. Läs mer här (länk)
mobile.c
Denna tjänst avvecklas 2026-01-19. Läs mer här (länk)
#include "contiki.h"
#include "contiki-net.h"
#include "dev/leds.h"
#include "net/rime/rimeaddr.h"
#include "net/rime/packetbuf.h"
#include "net/rime/broadcast.h"
#include "net/rime/network_l.h"
#include "node-id.h"
#define DEBUG 1
#if DEBUG
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)
#else
#define PRINTF(...)
#endif
#include "../mobility.h"
static uint8_t val = 0;
PROCESS(mobile_packet_process, "Mobile Demo With Network_layer");
AUTOSTART_PROCESSES(&mobile_packet_process);
/*implements a counter, the leds count from 0 to 7
*param count - the value to be displayed of the leds
*/
static void leds_set(uint8_t count){
//the shift is due to the change on the leds in the Tmote Sky platform
if(count & LEDS_GREEN){
leds_on(LEDS_GREEN<<1);
}else{
leds_off(LEDS_GREEN<<1);
}
if(count & LEDS_YELLOW){
leds_on(LEDS_YELLOW>>1);
}else{
leds_off(LEDS_YELLOW>>1);
}
if(count & LEDS_RED){
leds_on(LEDS_RED);
}else{
leds_off(LEDS_RED);
}
}
/*----------------------------------------------------------------------------*/
static void inpacket(rimeaddr_t *from, void* data, uint8_t len){
packet_t *p =(packet_t *)data;
leds_set(p->seqno);
}
/*----------------------------------------------------------------------------*/
PROCESS_THREAD(mobile_packet_process, ev, data)
{
PROCESS_EXITHANDLER(network_close());
PROCESS_BEGIN();
static struct etimer et;
#if RATE_CONTROL
extern u8_t node_data_rate;
PRINTF("RATE CONTROL IS ENABLED\n");
#else
PRINTF("RATE CONTROL DISABLED\n");
#endif
PRINTF("using RTIMER_SECOND = %u ticks\n", RTIMER_SECOND);
static network_msg_t msg;
/*You can change this up to 10 for a mobile node. If a cluster is empty
or with only two mobile nodes, u can even request 16.*/
static uint8_t datarate = 1;
static rimeaddr_t addr, dest;
addr.u8[0] = 3;
addr.u8[1] = 0;
dest.u8[0] = 1;
/*We open the connection for data transmission*/
network_open();
/*we set the callback function to receive incoming traffic*/
network_recv_func(inpacket);
/*We ask the MAC layer to send a query to the cluster head, at what data
rate we want to send data.*/
network_set_data_rate(datarate);
etimer_set(&et, 10*CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
while(1){
#if RATE_CONTROL
etimer_set(&et, CLOCK_SECOND/node_data_rate);
#else
etimer_set(&et, CLOCK_SECOND/datarate);
#endif
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
packet_t *packet = (packet_t*)network_getbuffer(sizeof (packet_t));
packet->seqno = val++;
packet->type = 2;
network_send(&dest);
}
PROCESS_END();
}