Merge remote-tracking branch 'contiki/master' into PR2
This commit is contained in:
commit
1fa9dde049
|
@ -256,12 +256,12 @@ coap_receive(void)
|
||||||
transaction = NULL;
|
transaction = NULL;
|
||||||
|
|
||||||
#if COAP_OBSERVE_CLIENT
|
#if COAP_OBSERVE_CLIENT
|
||||||
/* if observe notification */
|
/* if observe notification */
|
||||||
if((message->type == COAP_TYPE_CON || message->type == COAP_TYPE_NON)
|
if((message->type == COAP_TYPE_CON || message->type == COAP_TYPE_NON)
|
||||||
&& IS_OPTION(message, COAP_OPTION_OBSERVE)) {
|
&& IS_OPTION(message, COAP_OPTION_OBSERVE)) {
|
||||||
PRINTF("Observe [%u]\n", message->observe);
|
PRINTF("Observe [%u]\n", message->observe);
|
||||||
coap_handle_notification(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport,
|
coap_handle_notification(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport,
|
||||||
message);
|
message);
|
||||||
}
|
}
|
||||||
#endif /* COAP_OBSERVE_CLIENT */
|
#endif /* COAP_OBSERVE_CLIENT */
|
||||||
} /* request or response */
|
} /* request or response */
|
||||||
|
|
|
@ -107,7 +107,7 @@ int coap_obs_remove_observee_by_token(uip_ipaddr_t *addr, uint16_t port,
|
||||||
int coap_obs_remove_observee_by_url(uip_ipaddr_t *addr, uint16_t port,
|
int coap_obs_remove_observee_by_url(uip_ipaddr_t *addr, uint16_t port,
|
||||||
const char *url);
|
const char *url);
|
||||||
|
|
||||||
void coap_handle_notification(uip_ipaddr_t *, uint16_t port,
|
void coap_handle_notification(uip_ipaddr_t *addr, uint16_t port,
|
||||||
coap_packet_t *notification);
|
coap_packet_t *notification);
|
||||||
|
|
||||||
coap_observee_t *coap_obs_request_registration(uip_ipaddr_t *addr,
|
coap_observee_t *coap_obs_request_registration(uip_ipaddr_t *addr,
|
||||||
|
|
|
@ -266,7 +266,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response)
|
||||||
{
|
{
|
||||||
coap_packet_t *const coap_req = (coap_packet_t *)request;
|
coap_packet_t *const coap_req = (coap_packet_t *)request;
|
||||||
coap_packet_t *const coap_res = (coap_packet_t *)response;
|
coap_packet_t *const coap_res = (coap_packet_t *)response;
|
||||||
coap_observer_t * obs;
|
coap_observer_t *obs;
|
||||||
|
|
||||||
if(coap_req->code == COAP_GET && coap_res->code < 128) { /* GET request and response without error code */
|
if(coap_req->code == COAP_GET && coap_res->code < 128) { /* GET request and response without error code */
|
||||||
if(IS_OPTION(coap_req, COAP_OPTION_OBSERVE)) {
|
if(IS_OPTION(coap_req, COAP_OPTION_OBSERVE)) {
|
||||||
|
@ -274,7 +274,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response)
|
||||||
obs = add_observer(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport,
|
obs = add_observer(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport,
|
||||||
coap_req->token, coap_req->token_len,
|
coap_req->token, coap_req->token_len,
|
||||||
coap_req->uri_path, coap_req->uri_path_len);
|
coap_req->uri_path, coap_req->uri_path_len);
|
||||||
if(obs) {
|
if(obs) {
|
||||||
coap_set_header_observe(coap_res, (obs->obs_counter)++);
|
coap_set_header_observe(coap_res, (obs->obs_counter)++);
|
||||||
/*
|
/*
|
||||||
* Following payload is for demonstration purposes only.
|
* Following payload is for demonstration purposes only.
|
||||||
|
|
|
@ -178,7 +178,7 @@ coap_serialize_array_option(unsigned int number, unsigned int current_number,
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
PRINTF("ARRAY type %u, len %zu, full [%.*s]\n", number, length,
|
PRINTF("ARRAY type %u, len %zu, full [%.*s]\n", number, length,
|
||||||
(int)length, array);
|
(int)length, array);
|
||||||
|
|
||||||
if(split_char != '\0') {
|
if(split_char != '\0') {
|
||||||
int j;
|
int j;
|
||||||
|
@ -602,7 +602,7 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len)
|
||||||
coap_pkt->uri_host = (char *)current_option;
|
coap_pkt->uri_host = (char *)current_option;
|
||||||
coap_pkt->uri_host_len = option_length;
|
coap_pkt->uri_host_len = option_length;
|
||||||
PRINTF("Uri-Host [%.*s]\n", (int)coap_pkt->uri_host_len,
|
PRINTF("Uri-Host [%.*s]\n", (int)coap_pkt->uri_host_len,
|
||||||
coap_pkt->uri_host);
|
coap_pkt->uri_host);
|
||||||
break;
|
break;
|
||||||
case COAP_OPTION_URI_PORT:
|
case COAP_OPTION_URI_PORT:
|
||||||
coap_pkt->uri_port = coap_parse_int_option(current_option,
|
coap_pkt->uri_port = coap_parse_int_option(current_option,
|
||||||
|
|
|
@ -61,8 +61,8 @@
|
||||||
(REST_MAX_CHUNK_SIZE < 128 ? 64 : \
|
(REST_MAX_CHUNK_SIZE < 128 ? 64 : \
|
||||||
(REST_MAX_CHUNK_SIZE < 256 ? 128 : \
|
(REST_MAX_CHUNK_SIZE < 256 ? 128 : \
|
||||||
(REST_MAX_CHUNK_SIZE < 512 ? 256 : \
|
(REST_MAX_CHUNK_SIZE < 512 ? 256 : \
|
||||||
(REST_MAX_CHUNK_SIZE < 1024 ? 512 : \
|
(REST_MAX_CHUNK_SIZE < 1024 ? 512 : \
|
||||||
(REST_MAX_CHUNK_SIZE < 2048 ? 1024 : 2048)))))))
|
(REST_MAX_CHUNK_SIZE < 2048 ? 1024 : 2048)))))))
|
||||||
#endif /* COAP_MAX_BLOCK_SIZE */
|
#endif /* COAP_MAX_BLOCK_SIZE */
|
||||||
|
|
||||||
/* direct access into the buffer */
|
/* direct access into the buffer */
|
||||||
|
@ -135,7 +135,7 @@ typedef struct {
|
||||||
/* option format serialization */
|
/* option format serialization */
|
||||||
#define COAP_SERIALIZE_INT_OPTION(number, field, text) \
|
#define COAP_SERIALIZE_INT_OPTION(number, field, text) \
|
||||||
if(IS_OPTION(coap_pkt, number)) { \
|
if(IS_OPTION(coap_pkt, number)) { \
|
||||||
PRINTF(text " [%u]\n", (unsigned int)coap_pkt->field); \
|
PRINTF(text " [%u]\n", (unsigned int)coap_pkt->field); \
|
||||||
option += coap_serialize_int_option(number, current_number, option, coap_pkt->field); \
|
option += coap_serialize_int_option(number, current_number, option, coap_pkt->field); \
|
||||||
current_number = number; \
|
current_number = number; \
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ typedef struct {
|
||||||
uint32_t block = coap_pkt->field##_num << 4; \
|
uint32_t block = coap_pkt->field##_num << 4; \
|
||||||
if(coap_pkt->field##_more) { block |= 0x8; } \
|
if(coap_pkt->field##_more) { block |= 0x8; } \
|
||||||
block |= 0xF & coap_log_2(coap_pkt->field##_size / 16); \
|
block |= 0xF & coap_log_2(coap_pkt->field##_size / 16); \
|
||||||
PRINTF(text " encoded: 0x%lX\n", (unsigned long)block); \
|
PRINTF(text " encoded: 0x%lX\n", (unsigned long)block); \
|
||||||
option += coap_serialize_int_option(number, current_number, option, block); \
|
option += coap_serialize_int_option(number, current_number, option, block); \
|
||||||
current_number = number; \
|
current_number = number; \
|
||||||
}
|
}
|
||||||
|
|
|
@ -1338,7 +1338,9 @@ mqtt_connect(struct mqtt_connection *conn, char *host, uint16_t port,
|
||||||
conn->connect_vhdr_flags |= MQTT_VHDR_CLEAN_SESSION_FLAG;
|
conn->connect_vhdr_flags |= MQTT_VHDR_CLEAN_SESSION_FLAG;
|
||||||
|
|
||||||
/* convert the string IPv6 address to a numeric IPv6 address */
|
/* convert the string IPv6 address to a numeric IPv6 address */
|
||||||
uiplib_ip6addrconv(host, &ip6addr);
|
if(uiplib_ip6addrconv(host, &ip6addr) == 0) {
|
||||||
|
return MQTT_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
uip_ipaddr_copy(&(conn->server_ip), ipaddr);
|
uip_ipaddr_copy(&(conn->server_ip), ipaddr);
|
||||||
|
|
||||||
|
|
|
@ -148,13 +148,6 @@
|
||||||
#endif /* NBR_TABLE_FIND_REMOVABLE */
|
#endif /* NBR_TABLE_FIND_REMOVABLE */
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
/* RPL_CONF_MOP specifies the RPL mode of operation that will be
|
|
||||||
* advertised by the RPL root. Possible values: RPL_MOP_NO_DOWNWARD_ROUTES,
|
|
||||||
* RPL_MOP_NON_STORING, RPL_MOP_STORING_NO_MULTICAST, RPL_MOP_STORING_MULTICAST */
|
|
||||||
#ifndef RPL_CONF_MOP
|
|
||||||
#define RPL_CONF_MOP RPL_MOP_STORING_NO_MULTICAST
|
|
||||||
#endif /* RPL_CONF_MOP */
|
|
||||||
|
|
||||||
/* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each
|
/* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each
|
||||||
node will be able to handle. */
|
node will be able to handle. */
|
||||||
#ifndef UIP_CONF_MAX_ROUTES
|
#ifndef UIP_CONF_MAX_ROUTES
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# IEEE 802.15.4e TSCH (TimeSlotted Channel Hopping)
|
# IEEE 802.15.4-2015 TSCH and IETF 6TiSCH
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
TSCH is a MAC layer of the [IEEE 802.15.4e-2012 amendment][ieee802.15.4e-2012],
|
Time Slotted Channel Hopping (TSCH) is a MAC layer of the [IEEE 802.15.4e-2012 amendment][ieee802.15.4e-2012],
|
||||||
currently being integrated as part of the new IEEE 802.15.4-2015.
|
currently being integrated as part of the new IEEE 802.15.4-2015.
|
||||||
[6TiSCH][ietf-6tisch-wg] is an IETF Working Group focused on IPv6 over TSCH.
|
[6TiSCH][ietf-6tisch-wg] is an IETF Working Group focused on IPv6 over TSCH.
|
||||||
This is a Contiki implementation of TSCH and the 6TiSCH so-called "minimal configuration",
|
This is a Contiki implementation of TSCH and the 6TiSCH so-called "minimal configuration",
|
||||||
|
@ -13,7 +13,9 @@ It was developped by:
|
||||||
* Beshr Al Nahas, SICS (now Chalmers University), beshr@chalmers.se, github user: [beshrns](https://github.com/beshrns)
|
* Beshr Al Nahas, SICS (now Chalmers University), beshr@chalmers.se, github user: [beshrns](https://github.com/beshrns)
|
||||||
* Atis Elsts, Univ. Bristol, atis.elsts@bristol.ac.uk, github user: [atiselsts](https://github.com/atiselsts)
|
* Atis Elsts, Univ. Bristol, atis.elsts@bristol.ac.uk, github user: [atiselsts](https://github.com/atiselsts)
|
||||||
|
|
||||||
You can find an extensive evaluation of this implementation in our paper [*Orchestra: Robust Mesh Networks Through Autonomously Scheduled TSCH*](http://www.simonduquennoy.net/papers/duquennoy15orchestra.pdf), ACM SenSys'15.
|
|
||||||
|
This implementation is presented in depth and evaluated in our paper: [*TSCH and 6TiSCH for Contiki: Challenges, Design and Evaluation*](http://www.simonduquennoy.net/papers/duquennoy17tsch.pdf), IEEE DCOSS'17.
|
||||||
|
The scheduler Orchestra is detailled in [*Orchestra: Robust Mesh Networks Through Autonomously Scheduled TSCH*](http://www.simonduquennoy.net/papers/duquennoy15orchestra.pdf), ACM SenSys'15.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
@ -27,7 +29,7 @@ This implementation includes:
|
||||||
* Standard TSCH link selection and slot operation (10ms slots by default)
|
* Standard TSCH link selection and slot operation (10ms slots by default)
|
||||||
* Standard TSCH synchronization, including with ACK/NACK time correction Information Element
|
* Standard TSCH synchronization, including with ACK/NACK time correction Information Element
|
||||||
* Standard TSCH queues and CSMA-CA mechanism
|
* Standard TSCH queues and CSMA-CA mechanism
|
||||||
* Standard TSCH security
|
* Standard TSCH and 6TiSCH security
|
||||||
* Standard 6TiSCH TSCH-RPL interaction (6TiSCH Minimal Configuration and Minimal Schedule)
|
* Standard 6TiSCH TSCH-RPL interaction (6TiSCH Minimal Configuration and Minimal Schedule)
|
||||||
* A scheduling API to add/remove slotframes and links
|
* A scheduling API to add/remove slotframes and links
|
||||||
* A system for logging from TSCH timeslot operation interrupt, with postponed printout
|
* A system for logging from TSCH timeslot operation interrupt, with postponed printout
|
||||||
|
|
|
@ -642,12 +642,18 @@ rpl_update_header(void)
|
||||||
|
|
||||||
if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) {
|
if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) {
|
||||||
/* At the root, remove headers if any, and insert SRH or HBH
|
/* At the root, remove headers if any, and insert SRH or HBH
|
||||||
* (SRH is inserted only if the destination is in the DODAG) */
|
* (SRH is inserted only if the destination is in the DODAG) */
|
||||||
rpl_remove_header();
|
rpl_remove_header();
|
||||||
if(RPL_IS_NON_STORING(default_instance)) {
|
if(rpl_get_dag(&UIP_IP_BUF->destipaddr) != NULL) {
|
||||||
return insert_srh_header();
|
/* dest is in a DODAG; the packet is going down. */
|
||||||
|
if(RPL_IS_NON_STORING(default_instance)) {
|
||||||
|
return insert_srh_header();
|
||||||
|
} else {
|
||||||
|
return insert_hbh_header(default_instance);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return insert_hbh_header(default_instance);
|
/* dest is outside of DODAGs; no ext header is needed. */
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr)
|
if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr)
|
||||||
|
|
|
@ -67,7 +67,7 @@ AR = ar65
|
||||||
# The apps coming with Contiki run even on a 0x100 byte stack.
|
# The apps coming with Contiki run even on a 0x100 byte stack.
|
||||||
|
|
||||||
ASFLAGS = -t $(TARGET)
|
ASFLAGS = -t $(TARGET)
|
||||||
CFLAGS += -t $(TARGET) -Or -W -unused-param
|
CFLAGS += -t $(TARGET) -Ors -W -unused-param
|
||||||
LDFLAGS = -t $(TARGET) -m contiki-$(TARGET).map -D __STACKSIZE__=0x200
|
LDFLAGS = -t $(TARGET) -m contiki-$(TARGET).map -D __STACKSIZE__=0x200
|
||||||
AROPTS = a
|
AROPTS = a
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,7 @@
|
||||||
#define RG_RX_SYN 0x15
|
#define RG_RX_SYN 0x15
|
||||||
/** Offset for register XAH_CTRL_1 */
|
/** Offset for register XAH_CTRL_1 */
|
||||||
#define RG_XAH_CTRL_1 0x17
|
#define RG_XAH_CTRL_1 0x17
|
||||||
|
#define SR_AACK_PROM_MODE 0x17, 0x02, 1
|
||||||
/** Access parameters for sub-register XTAL_MODE in register @ref RG_XOSC_CTRL */
|
/** Access parameters for sub-register XTAL_MODE in register @ref RG_XOSC_CTRL */
|
||||||
#define SR_XTAL_MODE 0x12, 0xf0, 4
|
#define SR_XTAL_MODE 0x12, 0xf0, 4
|
||||||
/** Access parameters for sub-register XTAL_TRIM in register @ref RG_XOSC_CTRL */
|
/** Access parameters for sub-register XTAL_TRIM in register @ref RG_XOSC_CTRL */
|
||||||
|
@ -340,6 +341,7 @@
|
||||||
#define SR_CSMA_SEED_0 0x2d, 0xff, 0
|
#define SR_CSMA_SEED_0 0x2d, 0xff, 0
|
||||||
/** Offset for register CSMA_SEED_1 */
|
/** Offset for register CSMA_SEED_1 */
|
||||||
#define RG_CSMA_SEED_1 (0x2e)
|
#define RG_CSMA_SEED_1 (0x2e)
|
||||||
|
#define SR_AACK_DIS_ACK 0x2e, 0x10, 4
|
||||||
/** Offset for register CSMA_BE */
|
/** Offset for register CSMA_BE */
|
||||||
#define RG_CSMA_BE 0x2f
|
#define RG_CSMA_BE 0x2f
|
||||||
/** Access parameters for sub-register MIN_BE in register @ref RG_CSMA_SEED_1 */
|
/** Access parameters for sub-register MIN_BE in register @ref RG_CSMA_SEED_1 */
|
||||||
|
|
|
@ -83,7 +83,10 @@
|
||||||
#define SR_CCA_DONE 0x141, 0x80, 7
|
#define SR_CCA_DONE 0x141, 0x80, 7
|
||||||
#define SR_CCA_STATUS 0x141, 0x40, 6
|
#define SR_CCA_STATUS 0x141, 0x40, 6
|
||||||
#define SR_AACK_SET_PD 0x16e, 0x20, 5
|
#define SR_AACK_SET_PD 0x16e, 0x20, 5
|
||||||
|
#define SR_AACK_DIS_ACK 0x16e, 0x10, 4
|
||||||
|
|
||||||
|
#define RG_XAH_CTRL_1 (0x157)
|
||||||
|
#define SR_AACK_PROM_MODE 0x157, 0x02, 1
|
||||||
|
|
||||||
/* RF230 register assignments, for reference */
|
/* RF230 register assignments, for reference */
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -41,6 +41,120 @@
|
||||||
* Registers can be read with a macro, but the args for subregisters don't expand properly so the actual address
|
* Registers can be read with a macro, but the args for subregisters don't expand properly so the actual address
|
||||||
* is used with explicit _SFR_MEM8 in the subregister read/write routines.
|
* is used with explicit _SFR_MEM8 in the subregister read/write routines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Symbol Counter */
|
||||||
|
#define RG_SCCNTHH (0xE4) /* SCCNTHH7-0 */
|
||||||
|
#define RG_SCCNTHL (0xE3) /* SCCNTHL7-0 */
|
||||||
|
#define RG_SCCNTLH (0xE2) /* SCCNTLH7-0 */
|
||||||
|
#define RG_SCCNTLL (0xE1) /* SCCNTLL7-0 */
|
||||||
|
|
||||||
|
/* Counter control register 0 */
|
||||||
|
#define RG_SCCR0 (0xdc)
|
||||||
|
#define SR_SCCR0 0xdc, 0xff, 0
|
||||||
|
#define SR_SCCR0_SCRES 0xdc, 0x80, 7 /* Counter Sync. */
|
||||||
|
#define SR_SCCR0_SCMBTS 0xdc, 0x40, 6 /* Manual Beacon timestamp */
|
||||||
|
#define SR_SCCR0_SCEN 0xdc, 0x20, 5 /* Counter enable */
|
||||||
|
#define SR_SCCR0_SCCKSEL 0xdc, 0x10, 4 /* Counter clock source */
|
||||||
|
#define SR_SCCR0_SCTSE 0xdc, 0x08, 3 /* Auto timstamp Beacon, SFD */
|
||||||
|
#define SR_SCCR0_SCMP3 0xdc, 0x04, 2 /* Compare 3 counter mode sel. */
|
||||||
|
#define SR_SCCR0_SCMP2 0xdc, 0x02, 1 /* Compare 2 counter mode sel. */
|
||||||
|
#define SR_SCCR0_SCMP1 0xdc, 0x01, 0 /* Compare 1 counter mode sel. */
|
||||||
|
|
||||||
|
/* Counter control register 1 */
|
||||||
|
#define RG_SCCR1 (0xdd)
|
||||||
|
#define SR_SCCR1 0xdd, 0xff, 0
|
||||||
|
#define SR_SCCR1_SCBTSM 0xdd, 0x20, 5 /* Disable beacon timestamp */
|
||||||
|
#define SR_SCCR1_CLKDIV 0xdd, 0x1c, 2 /* CLKDIV */
|
||||||
|
#define SR_SCCR1_CLK0 0xdd, 0x10, 4 /* CLK0 */
|
||||||
|
#define SR_SCCR1_CLK1 0xdd, 0x08, 3 /* CLK1 */
|
||||||
|
#define SR_SCCR1_CLK2 0xdd, 0x04, 2 /* CLK2 */
|
||||||
|
#define SR_SCCR1_EECLK 0xdd, 0x02, 1 /* */
|
||||||
|
#define SR_SCCR1_SCENBO 0xdd, 0x01, 0 /* Backoff Slot Counter Enable */
|
||||||
|
|
||||||
|
/* Prescaler for symbol counter */
|
||||||
|
#define SCCKDIV_62_5k 0
|
||||||
|
#define SCCKDIV_125k 1
|
||||||
|
#define SCCKDIV_250k 2
|
||||||
|
#define SCCKDIV_500k 3
|
||||||
|
#define SCCKDIV_1M 4
|
||||||
|
#define SCCKDIV_2M 5
|
||||||
|
#define SCCKDIV_4M 6
|
||||||
|
|
||||||
|
/* Counter status register 1 */
|
||||||
|
#define RG_SCSR (0xde)
|
||||||
|
#define SR_SCSR 0xde, 0xff, 0
|
||||||
|
#define SR_SCBSY 0xde, 0x01, 0 /* Symbol counter busy */
|
||||||
|
|
||||||
|
/* Counter ISR */
|
||||||
|
#define RG_SCIRQS (0xe0)
|
||||||
|
#define SR_SCIRQS 0xe0, 0xff, 0
|
||||||
|
#define SR_SCIRQS_IRQSB0 0xe0, 0x10, 4 /* Backoff */
|
||||||
|
#define SR_SCIRQS_IRQSOF 0xe0, 0x08, 3 /* Counter overflow */
|
||||||
|
#define SR_SCIRQS_IRQSCP3 0xe0, 0x04, 2 /* Compare 3 counter */
|
||||||
|
#define SR_SCIRQS_IRQSCP2 0xe0, 0x02, 1 /* Compare 2 counter */
|
||||||
|
#define SR_SCIRQS_IRQSCP1 0xe0, 0x01, 0 /* Compare 1 counter */
|
||||||
|
|
||||||
|
/* Counter IRQ mask */
|
||||||
|
#define RG_SCIRQM (0xdf)
|
||||||
|
#define SR_SCIRQM 0xdf, 0xff, 0
|
||||||
|
#define SR_SCIRQM_IRQMB0 0xdf, 0x10, 4 /* Backoff mask */
|
||||||
|
#define SR_SCIRQM_IRQMOF 0xdf, 0x08, 3 /* Counter overflow mask */
|
||||||
|
#define SR_SCIRQM_IRQMCP3 0xdf, 0x04, 2 /* Compare 3 counter mask */
|
||||||
|
#define SR_SCIRQM_IRQMCP2 0xdf, 0x02, 1 /* Compare 2 counter mask */
|
||||||
|
#define SR_SCIRQM_IRQMCP1 0xdf, 0x01, 0 /* Compare 1 counter mask */
|
||||||
|
|
||||||
|
/* Timestamp SFD */
|
||||||
|
#define RG_SCTSRHH 0xFC /* SCTSRHH7-0 */
|
||||||
|
#define RG_SCTSRHL 0xFB /* SCTSRHL7-0 */
|
||||||
|
#define RG_SCTSRLH 0xFA /* SCTSRLH7-0 */
|
||||||
|
#define RG_SCTSRLL 0xF9 /* SCTSRLL7-0 */
|
||||||
|
|
||||||
|
/* Beacon Timestamp */
|
||||||
|
#define RG_SCBTSRHH (0xE8) /* SCBTSRHH7-0 */
|
||||||
|
#define RG_SCBTSRHL (0xE7) /* SCBTSRHL7-0 */
|
||||||
|
#define RG_SCBTSRLH (0xE6) /* SCBTSRLH7-0 */
|
||||||
|
#define RG_SCBTSRLL (0xE5) /* SCBTSRLL7-0 */
|
||||||
|
|
||||||
|
/* Output Compare 1 */
|
||||||
|
#define RG_SCOCR1HH (0xF8) /* SCOCR1HH7-0 */
|
||||||
|
#define RG_SCOCR1HL (0xF7) /* SCOCR1HL7-0 */
|
||||||
|
#define RG_SCOCR1LH (0xF6) /* SCOCR1LH7-0 */
|
||||||
|
#define RG_SCOCR1LL (0xF5) /* SCOCR1LL7-0 */
|
||||||
|
|
||||||
|
/* Output Compare 2 */
|
||||||
|
#define RG_SCOCR2HH (0xF4) /* SCOCR2HH7-0 */
|
||||||
|
#define RG_SCOCR2HL (0xF3) /* SCOCR2HL7-0 */
|
||||||
|
#define RG_SCOCR2LH (0xF2) /* SCOCR2LH7-0 */
|
||||||
|
#define RG_SCOCR2LL (0xF1) /* SCOCR2LL7-0 */
|
||||||
|
|
||||||
|
/* Output Compare 3 */
|
||||||
|
#define RG_SCOCR3HH (0xF0) /* SCOCR3HH7-0 */
|
||||||
|
#define RG_SCOCR3HL (0xEF) /* SCOCR3HL7-0 */
|
||||||
|
#define RG_SCOCR3LH (0xEE) /* SCOCR3LH7-0 */
|
||||||
|
#define RG_SCOCR3LL (0xED) /* SCOCR3LL7-0 */
|
||||||
|
|
||||||
|
/* Transmit Frame Timestamp */
|
||||||
|
#define RG_SCTSTRHH (0xFC) /* SCTSTRHH7-0 */
|
||||||
|
#define RG_SCTSTRHL (0xFB) /* SCTSTRHL7-0 */
|
||||||
|
#define RG_SCTSTRLH (0xFA) /* SCTSTRLH7-0 */
|
||||||
|
#define RG_SCTSTRLL (0xF9) /* SCTSTRLL7-0 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Interrupt Status
|
||||||
|
#define RG_SCIRQS (0xE0) Res2 Res1 Res0 IRQSBO IRQSOF IRQSCP3 IRQSCP2 IRQSCP1 page 173
|
||||||
|
Interrupt Mask
|
||||||
|
#define RG_SCIRQM (0xDF) Res2 Res1 Res0 IRQMBO IRQMOF IRQMCP3 IRQMCP2 IRQMCP1 page 174
|
||||||
|
Counter status
|
||||||
|
#define RG_SCSR (0xDE) Res6 Res5 Res4 Res3 Res2 Res1 Res0 SCBSY page 173
|
||||||
|
Counter Control 1
|
||||||
|
#define RG_SCCR1 (0xDD) Res6 Res5 SCBTSM SCCKDIV2 SCCKDIV1 SCCKDIV0 SCEECLK SCENBO page 172
|
||||||
|
Counter Control 0
|
||||||
|
#define RG_SCCR0 (0xDC) SCRES SCMBTS SCEN SCCKSEL SCTSE SCCMP3 SCCMP2 SCCMP1 page 171
|
||||||
|
Counter Compare Source
|
||||||
|
#define RG_SCCSR (0xDB) Res1 Res0 SCCS31 SCCS30 SCCS21 SCCS20 SCCS11 SCCS10 page 161
|
||||||
|
*/
|
||||||
|
|
||||||
#define RG_TRX_STATUS TRX_STATUS
|
#define RG_TRX_STATUS TRX_STATUS
|
||||||
#define SR_TRX_STATUS 0x141, 0x1f, 0
|
#define SR_TRX_STATUS 0x141, 0x1f, 0
|
||||||
#define SR_TRX_CMD 0x142, 0x1f, 0
|
#define SR_TRX_CMD 0x142, 0x1f, 0
|
||||||
|
@ -48,9 +162,35 @@
|
||||||
#define SR_TX_PWR 0x145, 0x0f, 0
|
#define SR_TX_PWR 0x145, 0x0f, 0
|
||||||
#define RG_VERSION_NUM VERSION_NUM
|
#define RG_VERSION_NUM VERSION_NUM
|
||||||
#define RG_MAN_ID_0 MAN_ID_0
|
#define RG_MAN_ID_0 MAN_ID_0
|
||||||
#define RG_IRQ_MASK IRQ_MASK
|
#define RG_IRQ_MASK (0x14e)
|
||||||
|
/** Access parameters for sub-register IRQ_MASK in register @ref RG_IRQ_MASK */
|
||||||
|
#define SR_IRQ_MASK 0x14e, 0xff, 0
|
||||||
|
/** Offset for register IRQ_STATUS */
|
||||||
|
#define RG_IRQ_STATUS (0x14f)
|
||||||
|
#define SR_IRQ_STATUS 0x14f, 0xff, 0
|
||||||
|
/** Awake Interrupt Status */
|
||||||
|
#define SR_IRQ_AWAKE 0x14f, 0x80, 7
|
||||||
|
/** TX_END Interrupt Status */
|
||||||
|
#define SR_IRQ_TX_END 0x14f, 0x40, 6
|
||||||
|
/** Address Match */
|
||||||
|
#define SR_IRQ_AMI 0x14f, 0x20, 5
|
||||||
|
/** End of ED Measurement Interrupt Status */
|
||||||
|
#define SR_CCA_ED_DONE 0x14f, 0x10, 4
|
||||||
|
/** Access parameters for sub-register IRQ_3_TRX_END in register @ref RG_IRQ_STATUS */
|
||||||
|
#define SR_IRQ_3_TRX_END 0x14f, 0x08, 3
|
||||||
|
/** Access parameters for sub-register IRQ_2_RX_START in register @ref RG_IRQ_STATUS */
|
||||||
|
#define SR_IRQ_2_RX_START 0x14f, 0x04, 2
|
||||||
|
/** Access parameters for sub-register IRQ_1_PLL_UNLOCK in register @ref RG_IRQ_STATUS */
|
||||||
|
#define SR_IRQ_1_PLL_UNLOCK 0x14f, 0x02, 1
|
||||||
|
/** Access parameters for sub-register IRQ_0_PLL_LOCK in register @ref RG_IRQ_STATUS */
|
||||||
|
#define RG_XAH_CTRL_1 (0x157)
|
||||||
|
#define SR_AACK_PROM_MODE 0x157, 0x02, 1
|
||||||
|
|
||||||
|
|
||||||
|
#define SR_IRQ_0_PLL_LOCK 0x14f, 0x01, 0
|
||||||
#define SR_MAX_FRAME_RETRIES 0x16C, 0xf0, 4
|
#define SR_MAX_FRAME_RETRIES 0x16C, 0xf0, 4
|
||||||
#define SR_TX_AUTO_CRC_ON 0x144, 0x20, 5
|
#define SR_TX_AUTO_CRC_ON 0x144, 0x20, 5
|
||||||
|
#define SR_PLL_FLT 0x144, 0x10, 4
|
||||||
#define SR_TRAC_STATUS 0x142, 0xe0, 5
|
#define SR_TRAC_STATUS 0x142, 0xe0, 5
|
||||||
#define SR_CHANNEL 0x148, 0x1f, 0
|
#define SR_CHANNEL 0x148, 0x1f, 0
|
||||||
#define SR_CCA_MODE 0x148, 0x60, 5
|
#define SR_CCA_MODE 0x148, 0x60, 5
|
||||||
|
@ -67,7 +207,7 @@
|
||||||
#define RG_IEEE_ADDR_5 IEEE_ADDR_5
|
#define RG_IEEE_ADDR_5 IEEE_ADDR_5
|
||||||
#define RG_IEEE_ADDR_6 IEEE_ADDR_6
|
#define RG_IEEE_ADDR_6 IEEE_ADDR_6
|
||||||
#define RG_IEEE_ADDR_7 IEEE_ADDR_7
|
#define RG_IEEE_ADDR_7 IEEE_ADDR_7
|
||||||
//#define SR_ED_LEVEL 0x147, 0xff, 0
|
/* #define SR_ED_LEVEL 0x147, 0xff, 0 */
|
||||||
#define RG_PHY_ED_LEVEL PHY_ED_LEVEL
|
#define RG_PHY_ED_LEVEL PHY_ED_LEVEL
|
||||||
#define RG_RX_SYN RX_SYN
|
#define RG_RX_SYN RX_SYN
|
||||||
#define SR_RSSI 0x146, 0x1f, 0
|
#define SR_RSSI 0x146, 0x1f, 0
|
||||||
|
@ -81,12 +221,13 @@
|
||||||
#define RG_CSMA_BE CSMA_BE
|
#define RG_CSMA_BE CSMA_BE
|
||||||
#define RG_CSMA_SEED_0 CSMA_SEED_0
|
#define RG_CSMA_SEED_0 CSMA_SEED_0
|
||||||
#define RG_PHY_RSSI PHY_RSSI
|
#define RG_PHY_RSSI PHY_RSSI
|
||||||
//#define SR_CCA_CS_THRES 0x149, 0xf0, 4
|
#define SR_CCA_CS_THRES 0x149, 0xf0, 4
|
||||||
#define SR_CCA_ED_THRES 0x149, 0x0f, 0
|
#define SR_CCA_ED_THRES 0x149, 0x0f, 0
|
||||||
#define SR_CCA_DONE 0x141, 0x80, 7
|
#define SR_CCA_DONE 0x141, 0x80, 7
|
||||||
#define SR_CCA_STATUS 0x141, 0x40, 6
|
#define SR_CCA_STATUS 0x141, 0x40, 6
|
||||||
#define SR_AACK_SET_PD 0x16e, 0x20, 5
|
#define SR_AACK_SET_PD 0x16e, 0x20, 5
|
||||||
#define SR_CSMA_SEED_1 0x16e, 0x10, 4
|
#define SR_CSMA_SEED_1 0x16e, 0x03, 0
|
||||||
|
#define SR_AACK_DIS_ACK 0x16e, 0x10, 4
|
||||||
|
|
||||||
/* RF230 register assignments, for reference */
|
/* RF230 register assignments, for reference */
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -216,27 +357,6 @@
|
||||||
///** Access parameters for sub-register CCA_ED_THRES in register @ref RG_CCA_THRES */
|
///** Access parameters for sub-register CCA_ED_THRES in register @ref RG_CCA_THRES */
|
||||||
//#define SR_CCA_ED_THRES 0x09, 0x0f, 0
|
//#define SR_CCA_ED_THRES 0x09, 0x0f, 0
|
||||||
///** Offset for register IRQ_MASK */
|
///** Offset for register IRQ_MASK */
|
||||||
//#define RG_IRQ_MASK (0x0e)
|
|
||||||
///** Access parameters for sub-register IRQ_MASK in register @ref RG_IRQ_MASK */
|
|
||||||
//#define SR_IRQ_MASK 0x0e, 0xff, 0
|
|
||||||
///** Offset for register IRQ_STATUS */
|
|
||||||
//#define RG_IRQ_STATUS (0x0f)
|
|
||||||
///** Access parameters for sub-register IRQ_7_BAT_LOW in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_7_BAT_LOW 0x0f, 0x80, 7
|
|
||||||
///** Access parameters for sub-register IRQ_6_TRX_UR in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_6_TRX_UR 0x0f, 0x40, 6
|
|
||||||
///** Access parameters for sub-register IRQ_5 in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_5 0x0f, 0x20, 5
|
|
||||||
///** Access parameters for sub-register IRQ_4 in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_4 0x0f, 0x10, 4
|
|
||||||
///** Access parameters for sub-register IRQ_3_TRX_END in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_3_TRX_END 0x0f, 0x08, 3
|
|
||||||
///** Access parameters for sub-register IRQ_2_RX_START in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_2_RX_START 0x0f, 0x04, 2
|
|
||||||
///** Access parameters for sub-register IRQ_1_PLL_UNLOCK in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_1_PLL_UNLOCK 0x0f, 0x02, 1
|
|
||||||
///** Access parameters for sub-register IRQ_0_PLL_LOCK in register @ref RG_IRQ_STATUS */
|
|
||||||
//#define SR_IRQ_0_PLL_LOCK 0x0f, 0x01, 0
|
|
||||||
///** Offset for register VREG_CTRL */
|
///** Offset for register VREG_CTRL */
|
||||||
//#define RG_VREG_CTRL (0x10)
|
//#define RG_VREG_CTRL (0x10)
|
||||||
///** Access parameters for sub-register AVREG_EXT in register @ref RG_VREG_CTRL */
|
///** Access parameters for sub-register AVREG_EXT in register @ref RG_VREG_CTRL */
|
||||||
|
|
|
@ -81,10 +81,10 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
|
||||||
#include "at86rf230_registermap.h"
|
#include "at86rf230_registermap.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void rf230_get_last_rx_packet_timestamp(void);
|
||||||
/*============================ VARIABLES =====================================*/
|
/*============================ VARIABLES =====================================*/
|
||||||
|
|
||||||
volatile extern signed char rf230_last_rssi;
|
volatile extern signed char rf230_last_rssi;
|
||||||
|
|
||||||
/*============================ CALLBACKS =====================================*/
|
/*============================ CALLBACKS =====================================*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -668,7 +668,7 @@ ISR(TRX24_RX_START_vect)
|
||||||
#if !RF230_CONF_AUTOACK
|
#if !RF230_CONF_AUTOACK
|
||||||
rf230_last_rssi = 3 * hal_subregister_read(SR_RSSI);
|
rf230_last_rssi = 3 * hal_subregister_read(SR_RSSI);
|
||||||
#endif
|
#endif
|
||||||
|
rf230_get_last_rx_packet_timestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PLL has locked, either from a transition out of TRX_OFF or a channel change while on */
|
/* PLL has locked, either from a transition out of TRX_OFF or a channel change while on */
|
||||||
|
|
|
@ -94,6 +94,9 @@
|
||||||
static bool is_promiscuous;
|
static bool is_promiscuous;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Poll mode disabled by default */
|
||||||
|
uint8_t poll_mode = 0;
|
||||||
|
|
||||||
/* RF230_CONF_FRAME_RETRIES is 1 plus the number written to the hardware. */
|
/* RF230_CONF_FRAME_RETRIES is 1 plus the number written to the hardware. */
|
||||||
/* Valid range 1-16, zero disables extended mode. */
|
/* Valid range 1-16, zero disables extended mode. */
|
||||||
#ifndef RF230_CONF_FRAME_RETRIES
|
#ifndef RF230_CONF_FRAME_RETRIES
|
||||||
|
@ -143,6 +146,8 @@ uint8_t ack_pending,ack_seqnum;
|
||||||
#warning RF230 Untested Configuration!
|
#warning RF230 Untested Configuration!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static rtimer_clock_t rf230_last_rx_packet_timestamp;
|
||||||
|
|
||||||
struct timestamp {
|
struct timestamp {
|
||||||
uint16_t time;
|
uint16_t time;
|
||||||
uint8_t authority_level;
|
uint8_t authority_level;
|
||||||
|
@ -201,6 +206,8 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
|
||||||
#define DEBUGFLOW(c)
|
#define DEBUGFLOW(c)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static radio_status_t radio_set_trx_state(uint8_t new_state);
|
||||||
|
|
||||||
/* XXX hack: these will be made as Chameleon packet attributes */
|
/* XXX hack: these will be made as Chameleon packet attributes */
|
||||||
#if RF230_CONF_TIMESTAMPS
|
#if RF230_CONF_TIMESTAMPS
|
||||||
rtimer_clock_t rf230_time_of_arrival, rf230_time_of_departure;
|
rtimer_clock_t rf230_time_of_arrival, rf230_time_of_departure;
|
||||||
|
@ -254,22 +261,238 @@ static int rf230_cca(void);
|
||||||
|
|
||||||
uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi;
|
uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi;
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_poll_mode(bool enable)
|
||||||
|
{
|
||||||
|
poll_mode = enable;
|
||||||
|
if(poll_mode) {
|
||||||
|
rf230_set_rpc(0x0); /* Disbable all RPC features */
|
||||||
|
radio_set_trx_state(RX_ON);
|
||||||
|
hal_subregister_write(SR_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK);
|
||||||
|
/* hal_register_write(RG_IRQ_MASK, 0xFF); */
|
||||||
|
} else {
|
||||||
|
/* Initialize and enable interrupts */
|
||||||
|
rf230_set_rpc(0xFF); /* Enable all RPC features. Only XRFR2 radios */
|
||||||
|
radio_set_trx_state(RX_AACK_ON);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
get_poll_mode(void)
|
||||||
|
{
|
||||||
|
return poll_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_frame_filtering(bool i)
|
||||||
|
{
|
||||||
|
if(i)
|
||||||
|
hal_subregister_write(SR_AACK_PROM_MODE, 0);
|
||||||
|
else {
|
||||||
|
hal_subregister_write(SR_AACK_PROM_MODE, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
get_frame_filtering(void)
|
||||||
|
{
|
||||||
|
int i = hal_subregister_read(SR_AACK_PROM_MODE);
|
||||||
|
if(i)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_auto_ack(bool i)
|
||||||
|
{
|
||||||
|
if(i)
|
||||||
|
hal_subregister_write(SR_AACK_DIS_ACK, 0);
|
||||||
|
else
|
||||||
|
hal_subregister_write(SR_AACK_DIS_ACK, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
get_auto_ack(void)
|
||||||
|
{
|
||||||
|
int i = hal_subregister_read(SR_AACK_DIS_ACK);
|
||||||
|
if(i)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
rf230_get_panid(void)
|
||||||
|
{
|
||||||
|
unsigned pan;
|
||||||
|
uint8_t byte;
|
||||||
|
|
||||||
|
byte = hal_register_read(RG_PAN_ID_1);
|
||||||
|
pan = byte;
|
||||||
|
byte = hal_register_read(RG_PAN_ID_0);
|
||||||
|
pan = (pan << 8) + byte;
|
||||||
|
|
||||||
|
return pan;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rf230_set_panid(uint16_t pan)
|
||||||
|
{
|
||||||
|
hal_register_write(RG_PAN_ID_1, (pan >> 8));
|
||||||
|
hal_register_write(RG_PAN_ID_0, (pan & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t
|
||||||
|
rf230_get_short_addr(void)
|
||||||
|
{
|
||||||
|
unsigned char a0, a1;
|
||||||
|
a0 = hal_register_read(RG_SHORT_ADDR_0);
|
||||||
|
a1 = hal_register_read(RG_SHORT_ADDR_1);
|
||||||
|
return (a1 << 8) | a0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rf230_set_short_addr(uint16_t addr)
|
||||||
|
{
|
||||||
|
hal_register_write(RG_SHORT_ADDR_0, (addr & 0xFF));
|
||||||
|
hal_register_write(RG_SHORT_ADDR_1, (addr >> 8));
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static radio_result_t
|
static radio_result_t
|
||||||
get_value(radio_param_t param, radio_value_t *value)
|
get_value(radio_param_t param, radio_value_t *value)
|
||||||
{
|
{
|
||||||
return RADIO_RESULT_NOT_SUPPORTED;
|
if(!value) {
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(param) {
|
||||||
|
case RADIO_PARAM_POWER_MODE:
|
||||||
|
/* *value = (REG(RFCORE_XREG_RXENABLE) && RFCORE_XREG_RXENABLE_RXENMASK) == 0 )?
|
||||||
|
RADIO_POWER_MODE_OFF : RADIO_POWER_MODE_ON; */
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_TX_MODE:
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_CHANNEL:
|
||||||
|
*value = (radio_value_t)rf230_get_channel();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_PAN_ID:
|
||||||
|
*value = rf230_get_panid();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_16BIT_ADDR:
|
||||||
|
*value = rf230_get_short_addr();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_RX_MODE:
|
||||||
|
*value = 0;
|
||||||
|
if(get_frame_filtering()) {
|
||||||
|
*value |= RADIO_RX_MODE_ADDRESS_FILTER;
|
||||||
|
}
|
||||||
|
if(get_auto_ack()) {
|
||||||
|
*value |= RADIO_RX_MODE_AUTOACK;
|
||||||
|
}
|
||||||
|
if(get_poll_mode()) {
|
||||||
|
*value |= RADIO_RX_MODE_POLL_MODE;
|
||||||
|
}
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_TXPOWER:
|
||||||
|
*value = rf230_get_txpower();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_CCA_THRESHOLD:
|
||||||
|
/* *value = get_cca_threshold(); */
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_RSSI:
|
||||||
|
*value = rf230_get_raw_rssi();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_CHANNEL_MIN:
|
||||||
|
*value = RF230_MIN_CHANNEL;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_CHANNEL_MAX:
|
||||||
|
*value = RF230_MAX_CHANNEL;;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_TXPOWER_MIN:
|
||||||
|
*value = TX_PWR_MIN;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_TXPOWER_MAX:
|
||||||
|
*value = TX_PWR_MAX;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
default:
|
||||||
|
return RADIO_RESULT_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static radio_result_t
|
static radio_result_t
|
||||||
set_value(radio_param_t param, radio_value_t value)
|
set_value(radio_param_t param, radio_value_t value)
|
||||||
{
|
{
|
||||||
return RADIO_RESULT_NOT_SUPPORTED;
|
switch(param) {
|
||||||
|
case RADIO_PARAM_POWER_MODE:
|
||||||
|
if(value == RADIO_POWER_MODE_ON) {
|
||||||
|
rf230_on();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
}
|
||||||
|
if(value == RADIO_POWER_MODE_OFF) {
|
||||||
|
rf230_off();
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
}
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
|
||||||
|
case RADIO_PARAM_CHANNEL:
|
||||||
|
|
||||||
|
if(value < RF230_MIN_CHANNEL ||
|
||||||
|
value > RF230_MAX_CHANNEL) {
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rf230_set_channel(value);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_TX_MODE:
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_PAN_ID:
|
||||||
|
rf230_set_panid(value & 0xffff);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_16BIT_ADDR:
|
||||||
|
rf230_set_short_addr(value & 0xffff);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_RX_MODE:
|
||||||
|
|
||||||
|
if(value & ~(RADIO_RX_MODE_ADDRESS_FILTER | RADIO_RX_MODE_POLL_MODE |
|
||||||
|
RADIO_RX_MODE_AUTOACK)) {
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
|
||||||
|
set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0);
|
||||||
|
set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_TXPOWER:
|
||||||
|
if(value < TX_PWR_MIN || value > TX_PWR_MAX) {
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
rf230_set_txpower(value);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
case RADIO_PARAM_CCA_THRESHOLD:
|
||||||
|
/* set_cca_threshold(value); */
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
default:
|
||||||
|
return RADIO_RESULT_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static radio_result_t
|
static radio_result_t
|
||||||
get_object(radio_param_t param, void *dest, size_t size)
|
get_object(radio_param_t param, void *dest, size_t size)
|
||||||
{
|
{
|
||||||
|
if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) {
|
||||||
|
if(size != sizeof(rtimer_clock_t) || !dest) {
|
||||||
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
*(rtimer_clock_t *)dest = rf230_last_rx_packet_timestamp;
|
||||||
|
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
}
|
||||||
return RADIO_RESULT_NOT_SUPPORTED;
|
return RADIO_RESULT_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -347,7 +570,7 @@ hal_rx_frame_t rxframe[RF230_CONF_RX_BUFFERS];
|
||||||
* \retval STATE_TRANSITION The radio transceiver's state machine is in
|
* \retval STATE_TRANSITION The radio transceiver's state machine is in
|
||||||
* transition between two states.
|
* transition between two states.
|
||||||
*/
|
*/
|
||||||
//static uint8_t
|
|
||||||
uint8_t
|
uint8_t
|
||||||
radio_get_trx_state(void)
|
radio_get_trx_state(void)
|
||||||
{
|
{
|
||||||
|
@ -878,7 +1101,7 @@ void rf230_warm_reset(void) {
|
||||||
DDRB &= ~(1<<7);
|
DDRB &= ~(1<<7);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hal_register_write(RG_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK);
|
hal_subregister_write(SR_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK);
|
||||||
|
|
||||||
/* Set up number of automatic retries 0-15
|
/* Set up number of automatic retries 0-15
|
||||||
* (0 implies PLL_ON sends instead of the extended TX_ARET mode */
|
* (0 implies PLL_ON sends instead of the extended TX_ARET mode */
|
||||||
|
@ -1291,24 +1514,16 @@ rf230_listen_channel(uint8_t c)
|
||||||
radio_set_trx_state(RX_ON);
|
radio_set_trx_state(RX_ON);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void
|
void
|
||||||
rf230_set_pan_addr(unsigned pan,
|
rf230_set_pan_addr(unsigned pan,
|
||||||
unsigned addr,
|
unsigned addr,
|
||||||
const uint8_t ieee_addr[8])
|
const uint8_t ieee_addr[8])
|
||||||
//rf230_set_pan_addr(uint16_t pan,uint16_t addr,uint8_t *ieee_addr)
|
|
||||||
{
|
{
|
||||||
PRINTF("rf230: PAN=%x Short Addr=%x\n",pan,addr);
|
PRINTF("rf230: PAN=%x Short Addr=%x\n",pan,addr);
|
||||||
|
|
||||||
uint8_t abyte;
|
rf230_set_panid(pan);
|
||||||
abyte = pan & 0xFF;
|
rf230_set_short_addr(addr);
|
||||||
hal_register_write(RG_PAN_ID_0,abyte);
|
|
||||||
abyte = (pan >> 8*1) & 0xFF;
|
|
||||||
hal_register_write(RG_PAN_ID_1, abyte);
|
|
||||||
|
|
||||||
abyte = addr & 0xFF;
|
|
||||||
hal_register_write(RG_SHORT_ADDR_0, abyte);
|
|
||||||
abyte = (addr >> 8*1) & 0xFF;
|
|
||||||
hal_register_write(RG_SHORT_ADDR_1, abyte);
|
|
||||||
|
|
||||||
if (ieee_addr != NULL) {
|
if (ieee_addr != NULL) {
|
||||||
PRINTF("MAC=%x",*ieee_addr);
|
PRINTF("MAC=%x",*ieee_addr);
|
||||||
|
@ -1330,6 +1545,14 @@ rf230_set_pan_addr(unsigned pan,
|
||||||
PRINTF("\n");
|
PRINTF("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* From ISR context */
|
||||||
|
void
|
||||||
|
rf230_get_last_rx_packet_timestamp(void)
|
||||||
|
{
|
||||||
|
rf230_last_rx_packet_timestamp = RTIMER_NOW();
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
* Interrupt leaves frame intact in FIFO.
|
* Interrupt leaves frame intact in FIFO.
|
||||||
|
|
|
@ -215,6 +215,7 @@ void rf230_set_channel(uint8_t channel);
|
||||||
void rf230_listen_channel(uint8_t channel);
|
void rf230_listen_channel(uint8_t channel);
|
||||||
uint8_t rf230_get_channel(void);
|
uint8_t rf230_get_channel(void);
|
||||||
void rf230_set_pan_addr(unsigned pan,unsigned addr,const uint8_t ieee_addr[8]);
|
void rf230_set_pan_addr(unsigned pan,unsigned addr,const uint8_t ieee_addr[8]);
|
||||||
|
unsigned rf230_get_panid(void);
|
||||||
void rf230_set_txpower(uint8_t power);
|
void rf230_set_txpower(uint8_t power);
|
||||||
uint8_t rf230_get_txpower(void);
|
uint8_t rf230_get_txpower(void);
|
||||||
void rf230_set_rpc(uint8_t rpc);
|
void rf230_set_rpc(uint8_t rpc);
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ti-lib.h"
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
PROCESS_NAME(cetic_6lbr_client_process);
|
PROCESS_NAME(cetic_6lbr_client_process);
|
||||||
PROCESS(cc26xx_web_demo_process, "CC26XX Web Demo");
|
PROCESS(cc26xx_web_demo_process, "CC26XX Web Demo");
|
||||||
|
@ -85,6 +87,13 @@ static struct etimer echo_request_timer;
|
||||||
int def_rt_rssi = 0;
|
int def_rt_rssi = 0;
|
||||||
#endif
|
#endif
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
PROCESS(adc_process, "ADC process");
|
||||||
|
|
||||||
|
static uint16_t single_adc_sample;
|
||||||
|
static struct etimer et_adc;
|
||||||
|
#endif
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
process_event_t cc26xx_web_demo_publish_event;
|
process_event_t cc26xx_web_demo_publish_event;
|
||||||
process_event_t cc26xx_web_demo_config_loaded_event;
|
process_event_t cc26xx_web_demo_config_loaded_event;
|
||||||
process_event_t cc26xx_web_demo_load_config_defaults;
|
process_event_t cc26xx_web_demo_load_config_defaults;
|
||||||
|
@ -111,6 +120,12 @@ DEMO_SENSOR(batmon_volt, CC26XX_WEB_DEMO_SENSOR_BATMON_VOLT,
|
||||||
"Battery Volt", "battery-volt", "batmon_volt",
|
"Battery Volt", "battery-volt", "batmon_volt",
|
||||||
CC26XX_WEB_DEMO_UNIT_VOLT);
|
CC26XX_WEB_DEMO_UNIT_VOLT);
|
||||||
|
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
DEMO_SENSOR(adc_dio23, CC26XX_WEB_DEMO_SENSOR_ADC_DIO23,
|
||||||
|
"ADC DIO23", "adc-dio23", "adc_dio23",
|
||||||
|
CC26XX_WEB_DEMO_UNIT_VOLT);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Sensortag sensors */
|
/* Sensortag sensors */
|
||||||
#if BOARD_SENSORTAG
|
#if BOARD_SENSORTAG
|
||||||
DEMO_SENSOR(bmp_pres, CC26XX_WEB_DEMO_SENSOR_BMP_PRES,
|
DEMO_SENSOR(bmp_pres, CC26XX_WEB_DEMO_SENSOR_BMP_PRES,
|
||||||
|
@ -467,6 +482,22 @@ get_batmon_reading(void *data)
|
||||||
ctimer_set(&batmon_timer, next, get_batmon_reading, NULL);
|
ctimer_set(&batmon_timer, next, get_batmon_reading, NULL);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
static void
|
||||||
|
get_adc_reading(void *data)
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
char *buf;
|
||||||
|
|
||||||
|
if(adc_dio23_reading.publish) {
|
||||||
|
value = single_adc_sample;
|
||||||
|
buf = adc_dio23_reading.converted;
|
||||||
|
memset(buf, 0, CC26XX_WEB_DEMO_CONVERTED_LEN);
|
||||||
|
snprintf(buf, CC26XX_WEB_DEMO_CONVERTED_LEN, "%d", (value * 4300) >> 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
#if BOARD_SENSORTAG
|
#if BOARD_SENSORTAG
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
|
@ -825,6 +856,11 @@ init_sensors(void)
|
||||||
|
|
||||||
list_add(sensor_list, &batmon_temp_reading);
|
list_add(sensor_list, &batmon_temp_reading);
|
||||||
list_add(sensor_list, &batmon_volt_reading);
|
list_add(sensor_list, &batmon_volt_reading);
|
||||||
|
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
list_add(sensor_list, &adc_dio23_reading);
|
||||||
|
#endif
|
||||||
|
|
||||||
SENSORS_ACTIVATE(batmon_sensor);
|
SENSORS_ACTIVATE(batmon_sensor);
|
||||||
|
|
||||||
#if BOARD_SENSORTAG
|
#if BOARD_SENSORTAG
|
||||||
|
@ -864,6 +900,7 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data)
|
||||||
|
|
||||||
/* Start all other (enabled) processes first */
|
/* Start all other (enabled) processes first */
|
||||||
process_start(&httpd_simple_process, NULL);
|
process_start(&httpd_simple_process, NULL);
|
||||||
|
|
||||||
#if CC26XX_WEB_DEMO_COAP_SERVER
|
#if CC26XX_WEB_DEMO_COAP_SERVER
|
||||||
process_start(&coap_server_process, NULL);
|
process_start(&coap_server_process, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
@ -880,13 +917,17 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data)
|
||||||
process_start(&net_uart_process, NULL);
|
process_start(&net_uart_process, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
process_start(&adc_process, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now that processes have set their own config default values, set our
|
* Now that processes have set their own config default values, set our
|
||||||
* own defaults and restore saved config from flash...
|
* own defaults and restore saved config from flash...
|
||||||
*/
|
*/
|
||||||
cc26xx_web_demo_config.sensors_bitmap = 0xFFFFFFFF; /* all on by default */
|
cc26xx_web_demo_config.sensors_bitmap = 0xFFFFFFFF; /* all on by default */
|
||||||
cc26xx_web_demo_config.def_rt_ping_interval =
|
cc26xx_web_demo_config.def_rt_ping_interval =
|
||||||
CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL;
|
CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL;
|
||||||
load_config();
|
load_config();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -967,6 +1008,56 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data)
|
||||||
PROCESS_END();
|
PROCESS_END();
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
PROCESS_THREAD(adc_process, ev, data)
|
||||||
|
{
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
etimer_set(&et_adc, CLOCK_SECOND * 5);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et_adc));
|
||||||
|
|
||||||
|
/* intialisation of ADC */
|
||||||
|
ti_lib_aon_wuc_aux_wakeup_event(AONWUC_AUX_WAKEUP);
|
||||||
|
while(!(ti_lib_aon_wuc_power_status_get() & AONWUC_AUX_POWER_ON));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable clock for ADC digital and analog interface (not currently enabled
|
||||||
|
* in driver)
|
||||||
|
*/
|
||||||
|
ti_lib_aux_wuc_clock_enable(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK |
|
||||||
|
AUX_WUC_SMPH_CLOCK);
|
||||||
|
while(ti_lib_aux_wuc_clock_status(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK |
|
||||||
|
AUX_WUC_SMPH_CLOCK)
|
||||||
|
!= AUX_WUC_CLOCK_READY);
|
||||||
|
|
||||||
|
/* Connect AUX IO7 (DIO23, but also DP2 on XDS110) as analog input. */
|
||||||
|
ti_lib_aux_adc_select_input(ADC_COMPB_IN_AUXIO7);
|
||||||
|
|
||||||
|
/* Set up ADC range, AUXADC_REF_FIXED = nominally 4.3 V */
|
||||||
|
ti_lib_aux_adc_enable_sync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US,
|
||||||
|
AUXADC_TRIGGER_MANUAL);
|
||||||
|
|
||||||
|
/* Trigger ADC converting */
|
||||||
|
ti_lib_aux_adc_gen_manual_trigger();
|
||||||
|
|
||||||
|
/* Read value */
|
||||||
|
single_adc_sample = ti_lib_aux_adc_read_fifo();
|
||||||
|
|
||||||
|
/* Shut the adc down */
|
||||||
|
ti_lib_aux_adc_disable();
|
||||||
|
|
||||||
|
get_adc_reading(NULL);
|
||||||
|
|
||||||
|
etimer_reset(&et_adc);
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -79,6 +79,12 @@
|
||||||
#else
|
#else
|
||||||
#define CC26XX_WEB_DEMO_NET_UART 1
|
#define CC26XX_WEB_DEMO_NET_UART 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CC26XX_WEB_DEMO_CONF_ADC_DEMO
|
||||||
|
#define CC26XX_WEB_DEMO_ADC_DEMO CC26XX_WEB_DEMO_CONF_ADC_DEMO
|
||||||
|
#else
|
||||||
|
#define CC26XX_WEB_DEMO_ADC_DEMO 0
|
||||||
|
#endif
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Active probing of RSSI from our preferred parent */
|
/* Active probing of RSSI from our preferred parent */
|
||||||
#if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT)
|
#if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT)
|
||||||
|
@ -146,6 +152,7 @@
|
||||||
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_X 12
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_X 12
|
||||||
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Y 13
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Y 13
|
||||||
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Z 14
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Z 14
|
||||||
|
#define CC26XX_WEB_DEMO_SENSOR_ADC_DIO23 15
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
extern process_event_t cc26xx_web_demo_publish_event;
|
extern process_event_t cc26xx_web_demo_publish_event;
|
||||||
extern process_event_t cc26xx_web_demo_config_loaded_event;
|
extern process_event_t cc26xx_web_demo_config_loaded_event;
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "rest-engine.h"
|
#include "rest-engine.h"
|
||||||
#include "board-peripherals.h"
|
#include "board-peripherals.h"
|
||||||
#include "rf-core/rf-ble.h"
|
#include "rf-core/rf-ble.h"
|
||||||
|
#include "cc26xx-web-demo.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -85,6 +86,10 @@ extern resource_t res_mpu_gyro_z;
|
||||||
extern resource_t res_toggle_orange;
|
extern resource_t res_toggle_orange;
|
||||||
extern resource_t res_toggle_yellow;
|
extern resource_t res_toggle_yellow;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
extern resource_t res_adc_dio23;
|
||||||
|
#endif
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
const char *coap_server_not_found_msg = "Resource not found";
|
const char *coap_server_not_found_msg = "Resource not found";
|
||||||
const char *coap_server_supported_msg = "Supported:"
|
const char *coap_server_supported_msg = "Supported:"
|
||||||
|
@ -134,6 +139,10 @@ PROCESS_THREAD(coap_server_process, ev, data)
|
||||||
rest_activate_resource(&res_batmon_temp, "sen/batmon/temp");
|
rest_activate_resource(&res_batmon_temp, "sen/batmon/temp");
|
||||||
rest_activate_resource(&res_batmon_volt, "sen/batmon/voltage");
|
rest_activate_resource(&res_batmon_volt, "sen/batmon/voltage");
|
||||||
|
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
rest_activate_resource(&res_adc_dio23, "sen/adc/dio23");
|
||||||
|
#endif
|
||||||
|
|
||||||
rest_activate_resource(&res_device_hw, "dev/mdl/hw");
|
rest_activate_resource(&res_device_hw, "dev/mdl/hw");
|
||||||
rest_activate_resource(&res_device_sw, "dev/mdl/sw");
|
rest_activate_resource(&res_device_sw, "dev/mdl/sw");
|
||||||
rest_activate_resource(&res_device_uptime, "dev/uptime");
|
rest_activate_resource(&res_device_uptime, "dev/uptime");
|
||||||
|
|
|
@ -1268,9 +1268,7 @@ appcall(void *state)
|
||||||
|
|
||||||
if(uip_closed() || uip_aborted() || uip_timedout()) {
|
if(uip_closed() || uip_aborted() || uip_timedout()) {
|
||||||
if(s != NULL) {
|
if(s != NULL) {
|
||||||
s->script = NULL;
|
memset(s, 0, sizeof(struct httpd_state));
|
||||||
s->blen = 0;
|
|
||||||
s->tmp_buf_len = 0;
|
|
||||||
memb_free(&conns, s);
|
memb_free(&conns, s);
|
||||||
}
|
}
|
||||||
} else if(uip_connected()) {
|
} else if(uip_connected()) {
|
||||||
|
@ -1291,7 +1289,7 @@ appcall(void *state)
|
||||||
if(uip_poll()) {
|
if(uip_poll()) {
|
||||||
if(timer_expired(&s->timer)) {
|
if(timer_expired(&s->timer)) {
|
||||||
uip_abort();
|
uip_abort();
|
||||||
s->script = NULL;
|
memset(s, 0, sizeof(struct httpd_state));
|
||||||
memb_free(&conns, s);
|
memb_free(&conns, s);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -698,10 +698,15 @@ static void
|
||||||
connect_to_broker(void)
|
connect_to_broker(void)
|
||||||
{
|
{
|
||||||
/* Connect to MQTT server */
|
/* Connect to MQTT server */
|
||||||
mqtt_connect(&conn, conf->broker_ip, conf->broker_port,
|
mqtt_status_t conn_attempt_result = mqtt_connect(&conn, conf->broker_ip,
|
||||||
conf->pub_interval * 3);
|
conf->broker_port,
|
||||||
|
conf->pub_interval * 3);
|
||||||
|
|
||||||
state = MQTT_CLIENT_STATE_CONNECTING;
|
if(conn_attempt_result == MQTT_STATUS_OK) {
|
||||||
|
state = MQTT_CLIENT_STATE_CONNECTING;
|
||||||
|
} else {
|
||||||
|
state = MQTT_CLIENT_STATE_CONFIG_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
|
@ -827,8 +832,8 @@ state_machine(void)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MQTT_CLIENT_STATE_NEWCONFIG:
|
case MQTT_CLIENT_STATE_NEWCONFIG:
|
||||||
/* Only update config after we have disconnected */
|
/* Only update config after we have disconnected or in the case of an error */
|
||||||
if(conn.state == MQTT_CONN_STATE_NOT_CONNECTED) {
|
if(conn.state == MQTT_CONN_STATE_NOT_CONNECTED || conn.state == MQTT_CONN_STATE_ERROR) {
|
||||||
update_config();
|
update_config();
|
||||||
DBG("New config\n");
|
DBG("New config\n");
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,13 @@
|
||||||
#define CC26XX_WEB_DEMO_CONF_6LBR_CLIENT 1
|
#define CC26XX_WEB_DEMO_CONF_6LBR_CLIENT 1
|
||||||
#define CC26XX_WEB_DEMO_CONF_COAP_SERVER 1
|
#define CC26XX_WEB_DEMO_CONF_COAP_SERVER 1
|
||||||
#define CC26XX_WEB_DEMO_CONF_NET_UART 1
|
#define CC26XX_WEB_DEMO_CONF_NET_UART 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ADC sensor functionality. To test this, an external voltage source should be
|
||||||
|
* connected to DIO23
|
||||||
|
* Enable/Disable DIO23 ADC reading by setting CC26XX_WEB_DEMO_CONF_ADC_DEMO
|
||||||
|
*/
|
||||||
|
#define CC26XX_WEB_DEMO_CONF_ADC_DEMO 0
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Enable the ROM bootloader */
|
/* Enable the ROM bootloader */
|
||||||
#define ROM_BOOTLOADER_ENABLE 1
|
#define ROM_BOOTLOADER_ENABLE 1
|
||||||
|
|
|
@ -117,6 +117,21 @@ RESOURCE(res_batmon_temp, "title=\"Battery Temp\";rt=\"C\"",
|
||||||
RESOURCE(res_batmon_volt, "title=\"Battery Voltage\";rt=\"mV\"",
|
RESOURCE(res_batmon_volt, "title=\"Battery Voltage\";rt=\"mV\"",
|
||||||
res_get_handler_batmon_volt, NULL, NULL, NULL);
|
res_get_handler_batmon_volt, NULL, NULL, NULL);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if CC26XX_WEB_DEMO_ADC_DEMO
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
res_get_handler_adc_dio23(void *request, void *response, uint8_t *buffer,
|
||||||
|
uint16_t preferred_size, int32_t *offset)
|
||||||
|
{
|
||||||
|
res_get_handler_all(CC26XX_WEB_DEMO_SENSOR_ADC_DIO23, request, response,
|
||||||
|
buffer, preferred_size, offset);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
RESOURCE(res_adc_dio23, "title=\"ADC DIO23\";rt=\"mV\"",
|
||||||
|
res_get_handler_adc_dio23, NULL, NULL, NULL);
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#endif
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
#if BOARD_SENSORTAG
|
#if BOARD_SENSORTAG
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* MPU resources and handler: Accelerometer and Gyro */
|
/* MPU resources and handler: Accelerometer and Gyro */
|
||||||
|
|
|
@ -49,6 +49,7 @@ The following radios have been tested:
|
||||||
* CC2538
|
* CC2538
|
||||||
* CC2530/CC2531
|
* CC2530/CC2531
|
||||||
* CC1200
|
* CC1200
|
||||||
|
* RF233
|
||||||
|
|
||||||
Once you have the radio sorted out, you also need to configure character I/O.
|
Once you have the radio sorted out, you also need to configure character I/O.
|
||||||
The firmware captures wireless frames and streams them over a serial line to
|
The firmware captures wireless frames and streams them over a serial line to
|
||||||
|
|
43
examples/sensniff/avr-rss2/avr-rss2-io.h
Normal file
43
examples/sensniff/avr-rss2/avr-rss2-io.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, George Oikonomou - http://www.spd.gr
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef AVR_RSS2_IO_H_
|
||||||
|
#define AVR_RSS2_IO_H_
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#include "contiki-conf.h"
|
||||||
|
#include "dev/rs232.h"
|
||||||
|
|
||||||
|
#define sensniff_io_byte_out(b) rs232_send(0, b)
|
||||||
|
#define sensniff_io_flush()
|
||||||
|
#define sensniff_io_set_input(b) rs232_set_input(RS232_PORT_0, b)
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#endif /* AVR_RSS2_IO_H_ */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
39
examples/sensniff/avr-rss2/target-conf.h
Normal file
39
examples/sensniff/avr-rss2/target-conf.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, George Oikonomou - http://www.spd.gr
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef TARGET_CONF_H_
|
||||||
|
#define TARGET_CONF_H_
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#define SENSNIFF_IO_DRIVER_H "avr-rss2/avr-rss2-io.h"
|
||||||
|
#define RS232_BAUDRATE USART_BAUD_500000
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#endif /* TARGET_CONF_H_ */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
|
@ -108,16 +108,9 @@ Tested applications and examples
|
||||||
* `rime`
|
* `rime`
|
||||||
* `ipv6/multicast`
|
* `ipv6/multicast`
|
||||||
* `examples/powertrace`
|
* `examples/powertrace`
|
||||||
|
* `examples/sensniff` use 500kBAUD
|
||||||
* `example-shell`
|
* `example-shell`
|
||||||
|
|
||||||
Note that the shell example needs file `symbols.c` to be added to project also seems like
|
|
||||||
in `core/dev/serial-line.c` the function `process_poll` must be replaced with `process_post`:
|
|
||||||
|
|
||||||
/* Wake up consumer process */
|
|
||||||
- process_poll(&serial_line_process);
|
|
||||||
+ process_post(&serial_line_process, 0, 0);
|
|
||||||
|
|
||||||
|
|
||||||
Platform tutorial applications
|
Platform tutorial applications
|
||||||
-----------------------------
|
-----------------------------
|
||||||
Example to read out various sensors, leds, serial numbers, and so on:
|
Example to read out various sensors, leds, serial numbers, and so on:
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
|
||||||
PROJECT_SOURCEFILES += stub-rdc.c
|
|
||||||
|
|
||||||
CONTIKI_PROJECT = sniffer
|
|
||||||
|
|
||||||
all: $(CONTIKI_PROJECT)
|
|
||||||
|
|
||||||
CONTIKI = ../../../..
|
|
||||||
|
|
||||||
CONTIKI_WITH_RIME = 1
|
|
||||||
include $(CONTIKI)/Makefile.include
|
|
|
@ -1,29 +0,0 @@
|
||||||
Sniffer application mote side
|
|
||||||
=============================
|
|
||||||
This put the radio in sniff mode and should capure all traffic used
|
|
||||||
on the set channel.
|
|
||||||
|
|
||||||
Default channel
|
|
||||||
---------------
|
|
||||||
26
|
|
||||||
|
|
||||||
Bulld
|
|
||||||
-----
|
|
||||||
make TARGET=avr-rss2
|
|
||||||
|
|
||||||
Default serial port speed
|
|
||||||
-------------------------
|
|
||||||
38400 bps
|
|
||||||
|
|
||||||
More info & uasage
|
|
||||||
------------------
|
|
||||||
Look in the host directory
|
|
||||||
|
|
||||||
Contiki support
|
|
||||||
---------------
|
|
||||||
The code promisc for support is needed. This also adds the sensniff
|
|
||||||
format.
|
|
||||||
|
|
||||||
References
|
|
||||||
----------
|
|
||||||
https://github.com/g-oikonomou/sensniff
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Loughborough University - Computer Science
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Institute nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the Contiki operating system.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file
|
|
||||||
* Project specific configuration defines for the sniffer example.
|
|
||||||
*
|
|
||||||
* \author
|
|
||||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
|
||||||
* Robert Olsson - <robert@radio.sensors.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PROJECT_CONF_H_
|
|
||||||
#define PROJECT_CONF_H_
|
|
||||||
|
|
||||||
|
|
||||||
#define NETSTACK_CONF_MAC nullmac_driver
|
|
||||||
/* Can see other channels. Interesting. */
|
|
||||||
/* #define NETSTACK_CONF_MAC csma_driver */
|
|
||||||
#define NETSTACK_CONF_RDC stub_rdc_driver
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* PROJECT_CONF_H_ */
|
|
|
@ -1,67 +0,0 @@
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Institute nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the Contiki operating system.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Author: Robert Olsson <robert@radio-sensors.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "contiki.h"
|
|
||||||
#include "net/rime/rime.h"
|
|
||||||
#include "random.h"
|
|
||||||
#include "dev/button-sensor.h"
|
|
||||||
#include "dev/leds.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
PROCESS(sniffer_process, "Sniffer process");
|
|
||||||
AUTOSTART_PROCESSES(&sniffer_process);
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
PROCESS_THREAD(sniffer_process, ev, data)
|
|
||||||
{
|
|
||||||
PROCESS_BEGIN();
|
|
||||||
|
|
||||||
/*
|
|
||||||
To get rf230bb radio in sniff mode we need to have radio in RX_ON.
|
|
||||||
The promisc commands fixes this for us. No need to set PAN and
|
|
||||||
address or MAC to zero is this case. Se Atmel datasheet. There is
|
|
||||||
a chance other radios works the same way.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rf230_set_promiscuous_mode(1);
|
|
||||||
|
|
||||||
printf("Sniffer started\n");
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
PROCESS_YIELD();
|
|
||||||
}
|
|
||||||
|
|
||||||
PROCESS_END();
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Loughborough University - Computer Science
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Institute nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the Contiki operating system.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file
|
|
||||||
* Definition of a fake RDC driver to be used with passive
|
|
||||||
* examples. The sniffer will never send packets and it will never
|
|
||||||
* push incoming packets up the stack. We do this by defining this
|
|
||||||
* driver as our RDC. We then drop everything
|
|
||||||
*
|
|
||||||
* \author
|
|
||||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "net/mac/mac.h"
|
|
||||||
#include "net/mac/rdc.h"
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
send(mac_callback_t sent, void *ptr)
|
|
||||||
{
|
|
||||||
if(sent) {
|
|
||||||
sent(ptr, MAC_TX_OK, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list)
|
|
||||||
{
|
|
||||||
if(sent) {
|
|
||||||
sent(ptr, MAC_TX_OK, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
input(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static int
|
|
||||||
on(void)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static int
|
|
||||||
off(int keep_radio_on)
|
|
||||||
{
|
|
||||||
return keep_radio_on;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
cca(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
init(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
const struct rdc_driver stub_rdc_driver = {
|
|
||||||
"stub-rdc",
|
|
||||||
init,
|
|
||||||
send,
|
|
||||||
send_list,
|
|
||||||
input,
|
|
||||||
on,
|
|
||||||
off,
|
|
||||||
cca,
|
|
||||||
};
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
|
@ -78,10 +78,6 @@
|
||||||
#define NETSTACK_CONF_RADIO rf230_driver
|
#define NETSTACK_CONF_RADIO rf230_driver
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CHANNEL_802_15_4
|
|
||||||
#define CHANNEL_802_15_4 26
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
|
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
|
||||||
#ifndef RF230_CONF_AUTOACK
|
#ifndef RF230_CONF_AUTOACK
|
||||||
#define RF230_CONF_AUTOACK 1
|
#define RF230_CONF_AUTOACK 1
|
||||||
|
@ -110,6 +106,11 @@ void clock_adjust_ticks(clock_time_t howmany);
|
||||||
#define AVR_CONF_USE32KCRYSTAL 1
|
#define AVR_CONF_USE32KCRYSTAL 1
|
||||||
#define SLIP_PORT RS232_PORT_0
|
#define SLIP_PORT RS232_PORT_0
|
||||||
|
|
||||||
|
/* Default baud rare on RS232 port */
|
||||||
|
#ifndef RS232_BAUDRATE
|
||||||
|
#define RS232_BAUDRATE USART_BAUD_38400
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Pre-allocated memory for loadable modules heap space (in bytes)*/
|
/* Pre-allocated memory for loadable modules heap space (in bytes)*/
|
||||||
/* Default is 4096. Currently used only when elfloader is present. Not tested on Raven */
|
/* Default is 4096. Currently used only when elfloader is present. Not tested on Raven */
|
||||||
/* #define MMEM_CONF_SIZE 256 */
|
/* #define MMEM_CONF_SIZE 256 */
|
||||||
|
@ -164,6 +165,16 @@ typedef unsigned short uip_stats_t;
|
||||||
#define RDC_CONF_MCU_SLEEP 1
|
#define RDC_CONF_MCU_SLEEP 1
|
||||||
|
|
||||||
#if NETSTACK_CONF_WITH_IPV6
|
#if NETSTACK_CONF_WITH_IPV6
|
||||||
|
|
||||||
|
#ifndef NBR_TABLE_CONF_MAX_NEIGHBORS
|
||||||
|
#define NBR_TABLE_CONF_MAX_NEIGHBORS 20
|
||||||
|
#endif
|
||||||
|
#ifndef UIP_CONF_MAX_ROUTES
|
||||||
|
#define UIP_CONF_MAX_ROUTES 20
|
||||||
|
#endif
|
||||||
|
#ifndef UIP_CONF_BUFFER_SIZE
|
||||||
|
#define UIP_CONF_BUFFER_SIZE 1280
|
||||||
|
#endif
|
||||||
#define LINKADDR_CONF_SIZE 8
|
#define LINKADDR_CONF_SIZE 8
|
||||||
#define UIP_CONF_ICMP6 1
|
#define UIP_CONF_ICMP6 1
|
||||||
#define UIP_CONF_UDP 1
|
#define UIP_CONF_UDP 1
|
||||||
|
@ -229,16 +240,15 @@ typedef unsigned short uip_stats_t;
|
||||||
/* from previous GETs, causing decreased throughput, retransmissions, and timeouts. Increase to study this. */
|
/* from previous GETs, causing decreased throughput, retransmissions, and timeouts. Increase to study this. */
|
||||||
/* ACKs to other ports become interleaved with computation-intensive GETs, so ACKs are particularly missed. */
|
/* ACKs to other ports become interleaved with computation-intensive GETs, so ACKs are particularly missed. */
|
||||||
/* Increasing the number of packet receive buffers in RAM helps to keep ACKs from being lost */
|
/* Increasing the number of packet receive buffers in RAM helps to keep ACKs from being lost */
|
||||||
|
|
||||||
#define UIP_CONF_MAX_CONNECTIONS 4
|
#define UIP_CONF_MAX_CONNECTIONS 4
|
||||||
/* 2 bytes per TCP listening port */
|
/* 2 bytes per TCP listening port */
|
||||||
#define UIP_CONF_MAX_LISTENPORTS 4
|
#define UIP_CONF_MAX_LISTENPORTS 4
|
||||||
/* 25 bytes per UDP connection */
|
/* 25 bytes per UDP connection */
|
||||||
#define UIP_CONF_UDP_CONNS 10
|
#define UIP_CONF_UDP_CONNS 10
|
||||||
/* See uip-ds6.h */
|
/* See uip-ds6.h */
|
||||||
#define NBR_TABLE_CONF_MAX_NEIGHBORS 20
|
|
||||||
#define UIP_CONF_DS6_DEFRT_NBU 2
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
#define UIP_CONF_DS6_PREFIX_NBU 3
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
#define UIP_CONF_MAX_ROUTES 20
|
|
||||||
#define UIP_CONF_DS6_ADDR_NBU 3
|
#define UIP_CONF_DS6_ADDR_NBU 3
|
||||||
#define UIP_CONF_DS6_MADDR_NBU 0
|
#define UIP_CONF_DS6_MADDR_NBU 0
|
||||||
#define UIP_CONF_DS6_AADDR_NBU 0
|
#define UIP_CONF_DS6_AADDR_NBU 0
|
||||||
|
@ -270,10 +280,8 @@ typedef unsigned short uip_stats_t;
|
||||||
#define UIP_CONF_MAX_CONNECTIONS 2
|
#define UIP_CONF_MAX_CONNECTIONS 2
|
||||||
#define UIP_CONF_MAX_LISTENPORTS 4
|
#define UIP_CONF_MAX_LISTENPORTS 4
|
||||||
#define UIP_CONF_UDP_CONNS 5
|
#define UIP_CONF_UDP_CONNS 5
|
||||||
#define NBR_TABLE_CONF_MAX_NEIGHBORS 20
|
|
||||||
#define UIP_CONF_DS6_DEFRT_NBU 2
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
#define UIP_CONF_DS6_PREFIX_NBU 3
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
#define UIP_CONF_MAX_ROUTES 4
|
|
||||||
#define UIP_CONF_DS6_ADDR_NBU 3
|
#define UIP_CONF_DS6_ADDR_NBU 3
|
||||||
#define UIP_CONF_DS6_MADDR_NBU 0
|
#define UIP_CONF_DS6_MADDR_NBU 0
|
||||||
#define UIP_CONF_DS6_AADDR_NBU 0
|
#define UIP_CONF_DS6_AADDR_NBU 0
|
||||||
|
@ -299,10 +307,8 @@ typedef unsigned short uip_stats_t;
|
||||||
#define UIP_CONF_MAX_CONNECTIONS 2
|
#define UIP_CONF_MAX_CONNECTIONS 2
|
||||||
#define UIP_CONF_MAX_LISTENPORTS 4
|
#define UIP_CONF_MAX_LISTENPORTS 4
|
||||||
#define UIP_CONF_UDP_CONNS 5
|
#define UIP_CONF_UDP_CONNS 5
|
||||||
#define NBR_TABLE_CONF_MAX_NEIGHBORS 4
|
|
||||||
#define UIP_CONF_DS6_DEFRT_NBU 2
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
#define UIP_CONF_DS6_PREFIX_NBU 3
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
#define UIP_CONF_MAX_ROUTES 4
|
|
||||||
#define UIP_CONF_DS6_ADDR_NBU 3
|
#define UIP_CONF_DS6_ADDR_NBU 3
|
||||||
#define UIP_CONF_DS6_MADDR_NBU 0
|
#define UIP_CONF_DS6_MADDR_NBU 0
|
||||||
#define UIP_CONF_DS6_AADDR_NBU 0
|
#define UIP_CONF_DS6_AADDR_NBU 0
|
||||||
|
@ -332,7 +338,6 @@ typedef unsigned short uip_stats_t;
|
||||||
/* For slow slip connections, to prevent buffer overruns */
|
/* For slow slip connections, to prevent buffer overruns */
|
||||||
/* #define UIP_CONF_RECEIVE_WINDOW 300 */
|
/* #define UIP_CONF_RECEIVE_WINDOW 300 */
|
||||||
#undef UIP_CONF_FWCACHE_SIZE
|
#undef UIP_CONF_FWCACHE_SIZE
|
||||||
#define UIP_CONF_BUFFER_SIZE 600 /* DHCPv4 packets by ip64 module */
|
|
||||||
#define UIP_CONF_FWCACHE_SIZE 30
|
#define UIP_CONF_FWCACHE_SIZE 30
|
||||||
#define UIP_CONF_BROADCAST 1
|
#define UIP_CONF_BROADCAST 1
|
||||||
#define UIP_ARCH_IPCHKSUM 1
|
#define UIP_ARCH_IPCHKSUM 1
|
||||||
|
|
|
@ -186,9 +186,8 @@ initialize(void)
|
||||||
watchdog_init();
|
watchdog_init();
|
||||||
watchdog_start();
|
watchdog_start();
|
||||||
leds_init();
|
leds_init();
|
||||||
serial_line_init();
|
|
||||||
|
|
||||||
rs232_init(RS232_PORT_0, USART_BAUD_38400, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
rs232_init(RS232_PORT_0, RS232_BAUDRATE, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
rs232_redirect_stdout(RS232_PORT_0);
|
rs232_redirect_stdout(RS232_PORT_0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -198,8 +197,6 @@ initialize(void)
|
||||||
//UBRR0L = 3; UBRR0H = 0; UCSR0A = (1 << U2X0); // 500k 0%
|
//UBRR0L = 3; UBRR0H = 0; UCSR0A = (1 << U2X0); // 500k 0%
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rs232_set_input(RS232_PORT_0, serial_line_input_byte);
|
|
||||||
|
|
||||||
clock_init();
|
clock_init();
|
||||||
|
|
||||||
if(MCUSR & (1 << PORF)) {
|
if(MCUSR & (1 << PORF)) {
|
||||||
|
@ -271,6 +268,10 @@ initialize(void)
|
||||||
process_start(&etimer_process, NULL);
|
process_start(&etimer_process, NULL);
|
||||||
ctimer_init();
|
ctimer_init();
|
||||||
|
|
||||||
|
/* After process start */
|
||||||
|
serial_line_init();
|
||||||
|
rs232_set_input(RS232_PORT_0, serial_line_input_byte);
|
||||||
|
|
||||||
/* Start radio and radio receive process */
|
/* Start radio and radio receive process */
|
||||||
NETSTACK_RADIO.init();
|
NETSTACK_RADIO.init();
|
||||||
|
|
||||||
|
@ -314,8 +315,18 @@ initialize(void)
|
||||||
memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_t));
|
memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_t));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef IEEE802154_CONF_PANID
|
||||||
|
rf230_set_pan_addr(IEEE802154_CONF_PANID, params_get_panaddr(), (uint8_t *)&addr.u8);
|
||||||
|
#else
|
||||||
rf230_set_pan_addr(params_get_panid(), params_get_panaddr(), (uint8_t *)&addr.u8);
|
rf230_set_pan_addr(params_get_panid(), params_get_panaddr(), (uint8_t *)&addr.u8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHANNEL_CONF_802_15_4
|
||||||
|
rf230_set_channel(CHANNEL_CONF_802_15_4);
|
||||||
|
#else
|
||||||
rf230_set_channel(params_get_channel());
|
rf230_set_channel(params_get_channel());
|
||||||
|
#endif
|
||||||
|
|
||||||
rf230_set_txpower(params_get_txpower());
|
rf230_set_txpower(params_get_txpower());
|
||||||
|
|
||||||
#if NETSTACK_CONF_WITH_IPV6
|
#if NETSTACK_CONF_WITH_IPV6
|
||||||
|
@ -339,8 +350,8 @@ initialize(void)
|
||||||
NETSTACK_NETWORK.init();
|
NETSTACK_NETWORK.init();
|
||||||
|
|
||||||
#if ANNOUNCE_BOOT
|
#if ANNOUNCE_BOOT
|
||||||
PRINTA("MAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", NETSTACK_MAC.name,
|
PRINTA("PAN=0x%X, MAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", rf230_get_panid(),
|
||||||
NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(),
|
NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(),
|
||||||
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 : NETSTACK_RDC.channel_check_interval()),
|
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 : NETSTACK_RDC.channel_check_interval()),
|
||||||
rf230_get_txpower());
|
rf230_get_txpower());
|
||||||
#if UIP_CONF_IPV6_RPL
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
@ -349,7 +360,6 @@ initialize(void)
|
||||||
#if UIP_CONF_ROUTER
|
#if UIP_CONF_ROUTER
|
||||||
PRINTA("Routing Enabled\n");
|
PRINTA("Routing Enabled\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* ANNOUNCE_BOOT */
|
#endif /* ANNOUNCE_BOOT */
|
||||||
|
|
||||||
#if NETSTACK_CONF_WITH_IPV6 || NETSTACK_CONF_WITH_IPV4
|
#if NETSTACK_CONF_WITH_IPV6 || NETSTACK_CONF_WITH_IPV4
|
||||||
|
|
|
@ -33,6 +33,12 @@ leds_off(unsigned char ledv)
|
||||||
void
|
void
|
||||||
leds_toggle(unsigned char ledv)
|
leds_toggle(unsigned char ledv)
|
||||||
{
|
{
|
||||||
|
if(ledv & LEDS_YELLOW) {
|
||||||
|
PORTE ^= (1 << LED_YELLOW);
|
||||||
|
}
|
||||||
|
if(ledv & LEDS_RED) {
|
||||||
|
PORTE ^= (1 << LED_RED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
leds_invert(unsigned char ledv)
|
leds_invert(unsigned char ledv)
|
||||||
|
|
|
@ -137,8 +137,12 @@
|
||||||
* Those values are not meant to be modified by the user
|
* Those values are not meant to be modified by the user
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
#define BOARD_IOID_SPI_SCK IOID_17
|
||||||
#define BOARD_IOID_SPI_MOSI IOID_19
|
#define BOARD_IOID_SPI_MOSI IOID_19
|
||||||
#define BOARD_IOID_SPI_MISO IOID_18
|
#define BOARD_IOID_SPI_MISO IOID_18
|
||||||
|
#define BOARD_SPI_SCK (1 << BOARD_IOID_SPI_SCK)
|
||||||
|
#define BOARD_SPI_MOSI (1 << BOARD_IOID_SPI_MOSI)
|
||||||
|
#define BOARD_SPI_MISO (1 << BOARD_IOID_SPI_MISO)
|
||||||
/** @} */
|
/** @} */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -186,7 +186,7 @@ static void
|
||||||
convert(float *temp, float *hum)
|
convert(float *temp, float *hum)
|
||||||
{
|
{
|
||||||
/* Convert temperature to degrees C */
|
/* Convert temperature to degrees C */
|
||||||
*temp = ((double)(int16_t)raw_temp / 65536) * 165 - 40;
|
*temp = ((double)raw_temp / 65536) * 165 - 40;
|
||||||
|
|
||||||
/* Convert relative humidity to a %RH value */
|
/* Convert relative humidity to a %RH value */
|
||||||
*hum = ((double)raw_hum / 65536) * 100;
|
*hum = ((double)raw_hum / 65536) * 100;
|
||||||
|
|
Loading…
Reference in a new issue