mirror of
https://github.com/oliverschmidt/contiki.git
synced 2025-01-10 11:29:38 +00:00
Merge branch 'master' of ssh://contiki.git.sourceforge.net/gitroot/contiki/contiki
This commit is contained in:
commit
c4eeb578a7
@ -202,8 +202,8 @@ handle_incoming_data(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
coap_error_code = INTERNAL_SERVER_ERROR_5_00;
|
coap_error_code = NOT_IMPLEMENTED_5_01;
|
||||||
coap_error_message = "Service callback undefined";
|
coap_error_message = "NoServiceCallbck"; // no a to fit 16 bytes
|
||||||
} /* if (service callback) */
|
} /* if (service callback) */
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -81,12 +81,14 @@ PT_THREAD(coap_blocking_request(struct request_state_t *state, process_event_t e
|
|||||||
blocking_response_handler request_callback));
|
blocking_response_handler request_callback));
|
||||||
|
|
||||||
#define COAP_BLOCKING_REQUEST(server_addr, server_port, request, chunk_handler) \
|
#define COAP_BLOCKING_REQUEST(server_addr, server_port, request, chunk_handler) \
|
||||||
static struct request_state_t request_state; \
|
{ \
|
||||||
PT_SPAWN(process_pt, &request_state.pt, \
|
static struct request_state_t request_state; \
|
||||||
coap_blocking_request(&request_state, ev, \
|
PT_SPAWN(process_pt, &request_state.pt, \
|
||||||
server_addr, server_port, \
|
coap_blocking_request(&request_state, ev, \
|
||||||
request, chunk_handler) \
|
server_addr, server_port, \
|
||||||
);
|
request, chunk_handler) \
|
||||||
|
); \
|
||||||
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#endif /* COAP_SERVER_H_ */
|
#endif /* COAP_SERVER_H_ */
|
||||||
|
@ -72,13 +72,6 @@ int coap_separate_handler(resource_t *resource, void *request, void *response)
|
|||||||
coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid);
|
coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid);
|
||||||
/* Serializing into IPBUF: Only overwrites header parts that are already parsed into the request struct. */
|
/* Serializing into IPBUF: Only overwrites header parts that are already parsed into the request struct. */
|
||||||
coap_send_message(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, (uip_appdata), coap_serialize_message(ack, uip_appdata));
|
coap_send_message(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, (uip_appdata), coap_serialize_message(ack, uip_appdata));
|
||||||
|
|
||||||
/* Change response to separate response. */
|
|
||||||
coap_res->type = COAP_TYPE_CON;
|
|
||||||
coap_res->mid = coap_get_mid();
|
|
||||||
|
|
||||||
/* Update MID in transaction for identification. */
|
|
||||||
t->mid = coap_res->mid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pre-handlers could skip the handling by returning 0. */
|
/* Pre-handlers could skip the handling by returning 0. */
|
||||||
@ -86,26 +79,26 @@ int coap_separate_handler(resource_t *resource, void *request, void *response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
coap_separate_response(void *response, coap_separate_t *separate_store)
|
coap_separate_response(void *request, coap_separate_t *separate_store)
|
||||||
{
|
{
|
||||||
coap_packet_t *const coap_res = (coap_packet_t *) response;
|
coap_packet_t *const coap_req = (coap_packet_t *) request;
|
||||||
coap_transaction_t *const t = coap_get_transaction_by_mid(coap_res->mid);
|
coap_transaction_t *const t = coap_get_transaction_by_mid(coap_req->mid);
|
||||||
|
|
||||||
if (t)
|
if (t)
|
||||||
{
|
{
|
||||||
uip_ipaddr_copy(&separate_store->addr, &t->addr);
|
uip_ipaddr_copy(&separate_store->addr, &t->addr);
|
||||||
separate_store->port = t->port;
|
separate_store->port = t->port;
|
||||||
|
|
||||||
separate_store->mid = coap_res->mid;
|
separate_store->type = coap_req->type==COAP_TYPE_CON ? COAP_TYPE_CON : COAP_TYPE_NON;
|
||||||
separate_store->type = coap_res->type;
|
separate_store->mid = coap_get_mid(); // if it was NON, we burned one MID in the engine...
|
||||||
|
|
||||||
memcpy(separate_store->token, coap_res->token, coap_res->token_len);
|
memcpy(separate_store->token, coap_req->token, coap_req->token_len);
|
||||||
separate_store->token_len = coap_res->token_len;
|
separate_store->token_len = coap_req->token_len;
|
||||||
|
|
||||||
separate_store->block2_num = coap_res->block2_num;
|
separate_store->block2_num = coap_req->block2_num;
|
||||||
separate_store->block2_more = coap_res->block2_more;
|
separate_store->block2_more = coap_req->block2_more;
|
||||||
separate_store->block2_size = coap_res->block2_size;
|
separate_store->block2_size = coap_req->block2_size;
|
||||||
separate_store->block2_offset = coap_res->block2_offset;
|
separate_store->block2_offset = coap_req->block2_offset;
|
||||||
|
|
||||||
/* Signal the engine to skip automatic response and clear transaction by engine. */
|
/* Signal the engine to skip automatic response and clear transaction by engine. */
|
||||||
coap_error_code = MANUAL_RESPONSE;
|
coap_error_code = MANUAL_RESPONSE;
|
||||||
|
@ -52,14 +52,12 @@ typedef struct coap_separate {
|
|||||||
uint8_t token_len;
|
uint8_t token_len;
|
||||||
uint8_t token[COAP_TOKEN_LEN];
|
uint8_t token[COAP_TOKEN_LEN];
|
||||||
|
|
||||||
|
/* separate + blockwise is untested! */
|
||||||
uint32_t block2_num;
|
uint32_t block2_num;
|
||||||
uint8_t block2_more;
|
uint8_t block2_more;
|
||||||
uint16_t block2_size;
|
uint16_t block2_size;
|
||||||
uint32_t block2_offset;
|
uint32_t block2_offset;
|
||||||
|
|
||||||
/* Add fields for addition information to be saved here, e.g.: */
|
|
||||||
char buffer[17];
|
|
||||||
|
|
||||||
} coap_separate_t;
|
} coap_separate_t;
|
||||||
|
|
||||||
int coap_separate_handler(resource_t *resource, void *request, void *response);
|
int coap_separate_handler(resource_t *resource, void *request, void *response);
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include "lib/random.h"
|
#include "lib/random.h"
|
||||||
#include "net/rime.h"
|
#include "net/rime.h"
|
||||||
#include "net/rime/timesynch.h"
|
#include "net/rime/timesynch.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#if TIMESYNCH_CONF_ENABLED
|
#if TIMESYNCH_CONF_ENABLED
|
||||||
static int authority_level;
|
static int authority_level;
|
||||||
|
@ -98,7 +98,7 @@ CFLAGS += -Os -fno-strict-aliasing
|
|||||||
LDFLAGS += -mmcu=$(MCU) -Wl,-Map=contiki-$(TARGET).map
|
LDFLAGS += -mmcu=$(MCU) -Wl,-Map=contiki-$(TARGET).map
|
||||||
|
|
||||||
### These flags can reduce the code size and RAM usage with up to 10%
|
### These flags can reduce the code size and RAM usage with up to 10%
|
||||||
ifdef SMALL
|
ifeq ($(SMALL),1)
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
# CFLAGS += -fdata-sections
|
# CFLAGS += -fdata-sections
|
||||||
LDFLAGS += -Wl,--gc-sections,--undefined=_reset_vector__,--undefined=InterruptVectors,--undefined=_copy_data_init__,--undefined=_clear_bss_init__,--undefined=_end_of_init__
|
LDFLAGS += -Wl,--gc-sections,--undefined=_reset_vector__,--undefined=InterruptVectors,--undefined=_copy_data_init__,--undefined=_clear_bss_init__,--undefined=_end_of_init__
|
||||||
|
@ -17,10 +17,14 @@ UIP_CONF_IPV6=1
|
|||||||
# configure CoAP implementation (3|7)
|
# configure CoAP implementation (3|7)
|
||||||
WITH_COAP=7
|
WITH_COAP=7
|
||||||
|
|
||||||
# must be CFLAGS not variables
|
# new variable since slip-radio
|
||||||
# minimal-net does not support RPL, avoid redefine warnings
|
|
||||||
ifneq ($(TARGET), minimal-net)
|
ifneq ($(TARGET), minimal-net)
|
||||||
CFLAGS += -DUIP_CONF_IPV6_RPL=1
|
UIP_CONF_RPL=1
|
||||||
|
else
|
||||||
|
# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
|
||||||
|
${info INFO: compiling without RPL}
|
||||||
|
UIP_CONF_RPL=0
|
||||||
|
CFLAGS += -DUIP_CONF_ND6_DEF_MAXDADNS=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# linker optimizations
|
# linker optimizations
|
||||||
|
@ -355,12 +355,22 @@ chunks_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
|
|||||||
#include "er-coap-07-transactions.h"
|
#include "er-coap-07-transactions.h"
|
||||||
/*
|
/*
|
||||||
* CoAP-specific example for separate responses.
|
* CoAP-specific example for separate responses.
|
||||||
* This resource is .
|
* Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process.
|
||||||
|
* The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests.
|
||||||
|
* The resource handler must store all information that required to finalize the response later.
|
||||||
*/
|
*/
|
||||||
RESOURCE(separate, METHOD_GET, "debug/separate", "title=\"Separate demo\"");
|
RESOURCE(separate, METHOD_GET, "debug/separate", "title=\"Separate demo\"");
|
||||||
|
|
||||||
|
/* A structure to store the required information */
|
||||||
|
typedef struct application_separate_store {
|
||||||
|
/* Provided by Erbium to store generic request information such as remote address and token. */
|
||||||
|
coap_separate_t request_metadata;
|
||||||
|
/* Add fields for addition information to be stored for finalizing, e.g.: */
|
||||||
|
char buffer[16];
|
||||||
|
} application_separate_store_t;
|
||||||
|
|
||||||
static uint8_t separate_active = 0;
|
static uint8_t separate_active = 0;
|
||||||
static coap_separate_t separate_store[1];
|
static application_separate_store_t separate_store[1];
|
||||||
|
|
||||||
void
|
void
|
||||||
separate_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
|
separate_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
|
||||||
@ -380,7 +390,7 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
|
|||||||
separate_active = 1;
|
separate_active = 1;
|
||||||
|
|
||||||
/* Take over and skip response by engine. */
|
/* Take over and skip response by engine. */
|
||||||
coap_separate_response(response, separate_store);
|
coap_separate_response(request, &separate_store->request_metadata);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
|
* At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
|
||||||
@ -397,10 +407,10 @@ separate_finalize_handler()
|
|||||||
if (separate_active)
|
if (separate_active)
|
||||||
{
|
{
|
||||||
coap_transaction_t *transaction = NULL;
|
coap_transaction_t *transaction = NULL;
|
||||||
if ( (transaction = coap_new_transaction(separate_store->mid, &separate_store->addr, separate_store->port)) )
|
if ( (transaction = coap_new_transaction(separate_store->request_metadata.mid, &separate_store->request_metadata.addr, separate_store->request_metadata.port)) )
|
||||||
{
|
{
|
||||||
coap_packet_t response[1]; /* This way the packet can be treated as pointer as usual. */
|
coap_packet_t response[1]; /* This way the packet can be treated as pointer as usual. */
|
||||||
coap_init_message(response, separate_store->type, CONTENT_2_05, separate_store->mid);
|
coap_init_message(response, separate_store->request_metadata.type, CONTENT_2_05, separate_store->request_metadata.mid);
|
||||||
|
|
||||||
coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer));
|
coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer));
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ exit(1);
|
|||||||
argv += optind - 1;
|
argv += optind - 1;
|
||||||
|
|
||||||
if(argc != 2 && argc != 3) {
|
if(argc != 2 && argc != 3) {
|
||||||
err(1, "usage: %s [-B baudrate] [-H] [-L] [-s siodev] [-t tundev] [-T] [-v verbosity] [-d delay] ipaddress", prog);
|
err(1, "usage: %s [-B baudrate] [-H] [-L] [-s siodev] [-t tundev] [-T] [-v verbosity] [-d delay] [-a serveraddress] [-p serverport] ipaddress", prog);
|
||||||
}
|
}
|
||||||
slip_config_ipaddr = argv[1];
|
slip_config_ipaddr = argv[1];
|
||||||
|
|
||||||
|
@ -72,14 +72,26 @@ AUTOSTART_PROCESSES(&border_router_process);
|
|||||||
#include "webserver-nogui.h"
|
#include "webserver-nogui.h"
|
||||||
AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
|
AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
|
||||||
#else
|
#else
|
||||||
/* Use simple webserver with only one page */
|
/* Use simple webserver with only one page for minimum footprint.
|
||||||
|
* Multiple connections can result in interleaved tcp segments since
|
||||||
|
* a single static buffer is used for all segments.
|
||||||
|
*/
|
||||||
#include "httpd-simple.h"
|
#include "httpd-simple.h"
|
||||||
|
/* The internal webserver can provide additional information if
|
||||||
|
* enough program flash is available.
|
||||||
|
*/
|
||||||
#define WEBSERVER_CONF_LOADTIME 0
|
#define WEBSERVER_CONF_LOADTIME 0
|
||||||
#define WEBSERVER_CONF_FILESTATS 0
|
#define WEBSERVER_CONF_FILESTATS 0
|
||||||
#define WEBSERVER_CONF_NEIGHBOR_STATUS 0
|
#define WEBSERVER_CONF_NEIGHBOR_STATUS 0
|
||||||
|
/* Adding links requires a larger RAM buffer. To avoid static allocation
|
||||||
|
* the stack can be used for formatting; however tcp retransmissions
|
||||||
|
* and multiple connections can result in garbled segments.
|
||||||
|
* TODO:use PSOCk_GENERATOR_SEND and tcp state storage to fix this.
|
||||||
|
*/
|
||||||
#define WEBSERVER_CONF_ROUTE_LINKS 0
|
#define WEBSERVER_CONF_ROUTE_LINKS 0
|
||||||
|
#if WEBSERVER_CONF_ROUTE_LINKS
|
||||||
#define BUF_USES_STACK 1
|
#define BUF_USES_STACK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
PROCESS(webserver_nogui_process, "Web server");
|
PROCESS(webserver_nogui_process, "Web server");
|
||||||
PROCESS_THREAD(webserver_nogui_process, ev, data)
|
PROCESS_THREAD(webserver_nogui_process, ev, data)
|
||||||
|
@ -387,7 +387,9 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
|||||||
|
|
||||||
public boolean setConfigXML(Simulation simulation, Collection<Element> configXML, boolean visAvailable) {
|
public boolean setConfigXML(Simulation simulation, Collection<Element> configXML, boolean visAvailable) {
|
||||||
setSimulation(simulation);
|
setSimulation(simulation);
|
||||||
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
if (myMoteInterfaceHandler == null) {
|
||||||
|
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
||||||
|
}
|
||||||
|
|
||||||
/* Create watchpoint container */
|
/* Create watchpoint container */
|
||||||
try {
|
try {
|
||||||
@ -497,18 +499,23 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
|||||||
}
|
}
|
||||||
if (di == null) {
|
if (di == null) {
|
||||||
/* Return PC value */
|
/* Return PC value */
|
||||||
MapEntry mapEntry = ((SimpleProfiler)myCpu.getProfiler()).getCallMapEntry(0);
|
SimpleProfiler sp = (SimpleProfiler)myCpu.getProfiler();
|
||||||
if (mapEntry != null) {
|
try {
|
||||||
String file = mapEntry.getFile();
|
MapEntry mapEntry = sp.getCallMapEntry(0);
|
||||||
if (file != null) {
|
if (mapEntry != null) {
|
||||||
if (file.indexOf('/') >= 0) {
|
String file = mapEntry.getFile();
|
||||||
file = file.substring(file.lastIndexOf('/')+1);
|
if (file != null) {
|
||||||
|
if (file.indexOf('/') >= 0) {
|
||||||
|
file = file.substring(file.lastIndexOf('/')+1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
String name = mapEntry.getName();
|
||||||
|
return file + ":?:" + name;
|
||||||
}
|
}
|
||||||
String name = mapEntry.getName();
|
return String.format("*%02x", myCpu.reg[MSP430Constants.PC]);
|
||||||
return file + ":?:" + name;
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return String.format("*%02x", myCpu.reg[MSP430Constants.PC]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lineNo = di.getLine();
|
int lineNo = di.getLine();
|
||||||
|
@ -30,9 +30,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja.mspmote.interfaces;
|
package se.sics.cooja.mspmote.interfaces;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
|
||||||
@ -40,7 +37,6 @@ import javax.swing.JLabel;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.jdom.Element;
|
|
||||||
|
|
||||||
import se.sics.cooja.Mote;
|
import se.sics.cooja.Mote;
|
||||||
import se.sics.cooja.MoteTimeEvent;
|
import se.sics.cooja.MoteTimeEvent;
|
||||||
@ -76,41 +72,6 @@ public class MspMoteID extends MoteID {
|
|||||||
public MspMoteID(Mote m) {
|
public MspMoteID(Mote m) {
|
||||||
this.mote = (MspMote) m;
|
this.mote = (MspMote) m;
|
||||||
this.moteMem = (MspMoteMemory) mote.getMemory();
|
this.moteMem = (MspMoteMemory) mote.getMemory();
|
||||||
|
|
||||||
final MoteTimeEvent writeIDEvent = new MoteTimeEvent(mote, 0) {
|
|
||||||
public void execute(long t) {
|
|
||||||
setMoteID(moteID);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
cpuMonitor = new CPUMonitor() {
|
|
||||||
public void cpuAction(int type, int adr, int data) {
|
|
||||||
if (type != MEMORY_WRITE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (data == moteID) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Simulation s = mote.getSimulation();
|
|
||||||
if (writeIDEvent.isScheduled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
s.scheduleEvent(writeIDEvent, s.getSimulationTime());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (moteMem.variableExists("node_id")) {
|
|
||||||
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("node_id"), cpuMonitor);
|
|
||||||
}
|
|
||||||
if (moteMem.variableExists("TOS_NODE_ID")) {
|
|
||||||
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("TOS_NODE_ID"), cpuMonitor);
|
|
||||||
}
|
|
||||||
if (moteMem.variableExists("ActiveMessageAddressC__addr")) {
|
|
||||||
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC__addr"), cpuMonitor);
|
|
||||||
}
|
|
||||||
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
|
||||||
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC$addr"), cpuMonitor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMoteID() {
|
public int getMoteID() {
|
||||||
@ -149,6 +110,42 @@ public class MspMoteID extends MoteID {
|
|||||||
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
||||||
moteMem.setIntValueOf("ActiveMessageAddressC$addr", newID);
|
moteMem.setIntValueOf("ActiveMessageAddressC$addr", newID);
|
||||||
}
|
}
|
||||||
|
if (cpuMonitor == null) {
|
||||||
|
final MoteTimeEvent writeIDEvent = new MoteTimeEvent(mote, 0) {
|
||||||
|
public void execute(long t) {
|
||||||
|
setMoteID(moteID);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
cpuMonitor = new CPUMonitor() {
|
||||||
|
public void cpuAction(int type, int address, int data) {
|
||||||
|
if (type != MEMORY_WRITE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == moteID) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (writeIDEvent.isScheduled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Simulation s = mote.getSimulation();
|
||||||
|
s.scheduleEvent(writeIDEvent, s.getSimulationTime());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (moteMem.variableExists("node_id")) {
|
||||||
|
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("node_id"), cpuMonitor);
|
||||||
|
}
|
||||||
|
if (moteMem.variableExists("TOS_NODE_ID")) {
|
||||||
|
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("TOS_NODE_ID"), cpuMonitor);
|
||||||
|
}
|
||||||
|
if (moteMem.variableExists("ActiveMessageAddressC__addr")) {
|
||||||
|
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC__addr"), cpuMonitor);
|
||||||
|
}
|
||||||
|
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
||||||
|
this.mote.getCPU().addWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC$addr"), cpuMonitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
notifyObservers();
|
notifyObservers();
|
||||||
}
|
}
|
||||||
@ -183,35 +180,22 @@ public class MspMoteID extends MoteID {
|
|||||||
this.deleteObserver(observer);
|
this.deleteObserver(observer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<Element> getConfigXML() {
|
|
||||||
ArrayList<Element> config = new ArrayList<Element>();
|
|
||||||
Element element = new Element("id");
|
|
||||||
element.setText(Integer.toString(getMoteID()));
|
|
||||||
config.add(element);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
|
|
||||||
for (Element element : configXML) {
|
|
||||||
if (element.getName().equals("id")) {
|
|
||||||
setMoteID(Integer.parseInt(element.getText()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removed() {
|
public void removed() {
|
||||||
super.removed();
|
super.removed();
|
||||||
if (moteMem.variableExists("node_id")) {
|
if (cpuMonitor != null) {
|
||||||
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("node_id"), cpuMonitor);
|
if (moteMem.variableExists("node_id")) {
|
||||||
}
|
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("node_id"), cpuMonitor);
|
||||||
if (moteMem.variableExists("TOS_NODE_ID")) {
|
}
|
||||||
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("TOS_NODE_ID"), cpuMonitor);
|
if (moteMem.variableExists("TOS_NODE_ID")) {
|
||||||
}
|
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("TOS_NODE_ID"), cpuMonitor);
|
||||||
if (moteMem.variableExists("ActiveMessageAddressC__addr")) {
|
}
|
||||||
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC__addr"), cpuMonitor);
|
if (moteMem.variableExists("ActiveMessageAddressC__addr")) {
|
||||||
}
|
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC__addr"), cpuMonitor);
|
||||||
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
}
|
||||||
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC$addr"), cpuMonitor);
|
if (moteMem.variableExists("ActiveMessageAddressC$addr")) {
|
||||||
|
this.mote.getCPU().removeWatchPoint(moteMem.getVariableAddress("ActiveMessageAddressC$addr"), cpuMonitor);
|
||||||
|
}
|
||||||
|
cpuMonitor = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ import java.awt.event.ActionListener;
|
|||||||
import java.awt.event.KeyAdapter;
|
import java.awt.event.KeyAdapter;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
@ -44,7 +45,6 @@ import javax.swing.JPopupMenu;
|
|||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
|
|
||||||
import se.sics.cooja.ClassDescription;
|
import se.sics.cooja.ClassDescription;
|
||||||
import se.sics.cooja.GUI;
|
import se.sics.cooja.GUI;
|
||||||
@ -53,6 +53,7 @@ import se.sics.cooja.MotePlugin;
|
|||||||
import se.sics.cooja.PluginType;
|
import se.sics.cooja.PluginType;
|
||||||
import se.sics.cooja.Simulation;
|
import se.sics.cooja.Simulation;
|
||||||
import se.sics.cooja.VisPlugin;
|
import se.sics.cooja.VisPlugin;
|
||||||
|
import se.sics.cooja.dialogs.UpdateAggregator;
|
||||||
import se.sics.cooja.mspmote.MspMote;
|
import se.sics.cooja.mspmote.MspMote;
|
||||||
import se.sics.mspsim.cli.CommandContext;
|
import se.sics.mspsim.cli.CommandContext;
|
||||||
import se.sics.mspsim.cli.LineListener;
|
import se.sics.mspsim.cli.LineListener;
|
||||||
@ -77,8 +78,8 @@ public class MspCLI extends VisPlugin implements MotePlugin {
|
|||||||
|
|
||||||
final Container panel = getContentPane();
|
final Container panel = getContentPane();
|
||||||
|
|
||||||
logArea = new JTextArea(4, 30);
|
logArea = new JTextArea(4, 20);
|
||||||
logArea.setTabSize(4);
|
logArea.setTabSize(8);
|
||||||
logArea.setEditable(false);
|
logArea.setEditable(false);
|
||||||
panel.add(new JScrollPane(logArea), BorderLayout.CENTER);
|
panel.add(new JScrollPane(logArea), BorderLayout.CENTER);
|
||||||
|
|
||||||
@ -176,27 +177,41 @@ public class MspCLI extends VisPlugin implements MotePlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cliResponseAggregator.start();
|
||||||
|
|
||||||
panel.add(commandField, BorderLayout.SOUTH);
|
panel.add(commandField, BorderLayout.SOUTH);
|
||||||
|
setSize(500,500);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void closePlugin() {
|
public void closePlugin() {
|
||||||
|
cliResponseAggregator.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addCLIData(final String text) {
|
public void addCLIData(final String text) {
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
cliResponseAggregator.add(text);
|
||||||
public void run() {
|
|
||||||
String current = logArea.getText();
|
|
||||||
int len = current.length();
|
|
||||||
if (len > 4096) {
|
|
||||||
current = current.substring(len - 4096);
|
|
||||||
}
|
|
||||||
current = len > 0 ? (current + '\n' + text) : text;
|
|
||||||
logArea.setText(current);
|
|
||||||
logArea.setCaretPosition(current.length());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final int UPDATE_INTERVAL = 250;
|
||||||
|
private UpdateAggregator<String> cliResponseAggregator = new UpdateAggregator<String>(UPDATE_INTERVAL) {
|
||||||
|
protected void handle(List<String> ls) {
|
||||||
|
String current = logArea.getText();
|
||||||
|
int len = current.length();
|
||||||
|
if (len > 4096) {
|
||||||
|
current = current.substring(len - 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add */
|
||||||
|
StringBuilder sb = new StringBuilder(current);
|
||||||
|
for (String l: ls) {
|
||||||
|
sb.append(l);
|
||||||
|
sb.append('\n');
|
||||||
|
}
|
||||||
|
logArea.setText(sb.toString());
|
||||||
|
logArea.setCaretPosition(sb.length());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private String trim(String text) {
|
private String trim(String text) {
|
||||||
return (text != null) && ((text = text.trim()).length() > 0) ? text : null;
|
return (text != null) && ((text = text.trim()).length() > 0) ? text : null;
|
||||||
}
|
}
|
||||||
|
@ -549,8 +549,9 @@ public class RadioLogger extends VisPlugin {
|
|||||||
|
|
||||||
private boolean analyzePacket(PacketAnalyzer.Packet packet, StringBuffer brief, StringBuffer verbose) {
|
private boolean analyzePacket(PacketAnalyzer.Packet packet, StringBuffer brief, StringBuffer verbose) {
|
||||||
if (analyzers == null) return false;
|
if (analyzers == null) return false;
|
||||||
boolean analyze = true;
|
try {
|
||||||
while (analyze) {
|
boolean analyze = true;
|
||||||
|
while (analyze) {
|
||||||
analyze = false;
|
analyze = false;
|
||||||
for (int i = 0; i < analyzers.size(); i++) {
|
for (int i = 0; i < analyzers.size(); i++) {
|
||||||
PacketAnalyzer analyzer = analyzers.get(i);
|
PacketAnalyzer analyzer = analyzers.get(i);
|
||||||
@ -570,6 +571,10 @@ public class RadioLogger extends VisPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.debug("Error when analyzing packet: " + e.getMessage(), e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return brief.length() > 0;
|
return brief.length() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,6 +262,7 @@ public class TimeLine extends VisPlugin {
|
|||||||
|
|
||||||
getContentPane().add(splitPane);
|
getContentPane().add(splitPane);
|
||||||
|
|
||||||
|
recalculateMoteHeight();
|
||||||
pack();
|
pack();
|
||||||
setSize(gui.getDesktopPane().getWidth(), 150);
|
setSize(gui.getDesktopPane().getWidth(), 150);
|
||||||
setLocation(0, gui.getDesktopPane().getHeight() - 150);
|
setLocation(0, gui.getDesktopPane().getHeight() - 150);
|
||||||
@ -1192,9 +1193,11 @@ public class TimeLine extends VisPlugin {
|
|||||||
if (showWatchpoints) {
|
if (showWatchpoints) {
|
||||||
h += EVENT_PIXEL_HEIGHT;
|
h += EVENT_PIXEL_HEIGHT;
|
||||||
}
|
}
|
||||||
paintedMoteHeight = h;
|
if (h != paintedMoteHeight) {
|
||||||
timelineMoteRuler.repaint();
|
paintedMoteHeight = h;
|
||||||
timeline.repaint();
|
timelineMoteRuler.repaint();
|
||||||
|
timeline.repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void closePlugin() {
|
public void closePlugin() {
|
||||||
@ -1346,6 +1349,7 @@ public class TimeLine extends VisPlugin {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private int mousePixelPositionX = -1;
|
private int mousePixelPositionX = -1;
|
||||||
private int mousePixelPositionY = -1;
|
private int mousePixelPositionY = -1;
|
||||||
private int mouseDownPixelPositionX = -1;
|
private int mouseDownPixelPositionX = -1;
|
||||||
|
@ -603,39 +603,44 @@ ifconf(const char *tundev, const char *ipaddr)
|
|||||||
#elif 1
|
#elif 1
|
||||||
/* Generate a link local address a la sixxs/aiccu */
|
/* Generate a link local address a la sixxs/aiccu */
|
||||||
/* First a full parse, stripping off the prefix length */
|
/* First a full parse, stripping off the prefix length */
|
||||||
{
|
{
|
||||||
char lladdr[40];
|
char lladdr[40];
|
||||||
char c,*ptr=(char *)ipaddr;
|
char c, *ptr=(char *)ipaddr;
|
||||||
uint16_t digit,ai,a[8],cc,scc,i;
|
uint16_t digit,ai,a[8],cc,scc,i;
|
||||||
for(ai=0;ai<8;ai++) a[ai]=0;
|
for(ai=0; ai<8; ai++) {
|
||||||
ai=0;cc=scc=0;
|
a[ai]=0;
|
||||||
while(c=*ptr++) {
|
|
||||||
if(c=='/') break;
|
|
||||||
if(c==':') {
|
|
||||||
if(cc) scc = ai;
|
|
||||||
cc = 1;
|
|
||||||
if (++ai>7) break;
|
|
||||||
} else {
|
|
||||||
cc=0;
|
|
||||||
digit = c-'0'; if (digit > 9) digit = 10 + (c & 0xdf) - 'A';
|
|
||||||
a[ai] = (a[ai] << 4) + digit;
|
|
||||||
}
|
}
|
||||||
}
|
ai=0;
|
||||||
/* Get # elided and shift what's after to the end */
|
cc=scc=0;
|
||||||
cc=8-ai;
|
while(c=*ptr++) {
|
||||||
for(i=0;i<cc;i++) {
|
if(c=='/') break;
|
||||||
if ((8-i-cc) <= scc) {
|
if(c==':') {
|
||||||
a[7-i] = 0;
|
if(cc)
|
||||||
} else {
|
scc = ai;
|
||||||
a[7-i] = a[8-i-cc];
|
cc = 1;
|
||||||
a[8-i-cc]=0;
|
if(++ai>7) break;
|
||||||
|
} else {
|
||||||
|
cc=0;
|
||||||
|
digit = c-'0';
|
||||||
|
if (digit > 9)
|
||||||
|
digit = 10 + (c & 0xdf) - 'A';
|
||||||
|
a[ai] = (a[ai] << 4) + digit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
/* Get # elided and shift what's after to the end */
|
||||||
|
cc=8-ai;
|
||||||
|
for(i=0;i<cc;i++) {
|
||||||
|
if ((8-i-cc) <= scc) {
|
||||||
|
a[7-i] = 0;
|
||||||
|
} else {
|
||||||
|
a[7-i] = a[8-i-cc];
|
||||||
|
a[8-i-cc]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sprintf(lladdr,"fe80::%x:%x:%x:%x",a[1]&0xfefd,a[2],a[3],a[7]);
|
||||||
|
if (timestamp) stamptime();
|
||||||
|
ssystem("ifconfig %s add %s/64", tundev, lladdr);
|
||||||
}
|
}
|
||||||
sprintf(lladdr,"fe80::%x:%x:%x:%x",a[1]&0xfefd,a[2],a[3],a[7]);
|
|
||||||
|
|
||||||
if (timestamp) stamptime();
|
|
||||||
ssystem("ifconfig %s add %s/64", tundev, lladdr);
|
|
||||||
|
|
||||||
#endif /* link local */
|
#endif /* link local */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user