Contiki 3.x
collect-view.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010, Swedish Institute of Computer Science.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the Institute nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * This file is part of the Contiki operating system.
30  *
31  */
32 
33 /**
34  * \file
35  * Collect view client code
36  * \author
37  * Adam Dunkels <adam@sics.se>
38  */
39 
40 #include "contiki.h"
42 #include "net/rime/rime.h"
43 #include "net/rime/timesynch.h"
44 #include "collect-view.h"
45 
46 #include <string.h>
47 
48 /*---------------------------------------------------------------------------*/
49 void
50 collect_view_construct_message(struct collect_view_data_msg *msg,
51  const linkaddr_t *parent,
52  uint16_t parent_etx,
53  uint16_t current_rtmetric,
54  uint16_t num_neighbors,
55  uint16_t beacon_interval)
56 {
57  static unsigned long last_cpu, last_lpm, last_transmit, last_listen;
58  unsigned long cpu, lpm, transmit, listen;
59 
60 
61  msg->len = sizeof(struct collect_view_data_msg) / sizeof(uint16_t);
62  msg->clock = clock_time();
63 #if TIMESYNCH_CONF_ENABLED
64  msg->timesynch_time = timesynch_time();
65 #else /* TIMESYNCH_CONF_ENABLED */
66  msg->timesynch_time = 0;
67 #endif /* TIMESYNCH_CONF_ENABLED */
68 
69  energest_flush();
70 
71  cpu = energest_type_time(ENERGEST_TYPE_CPU) - last_cpu;
72  lpm = energest_type_time(ENERGEST_TYPE_LPM) - last_lpm;
73  transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT) - last_transmit;
74  listen = energest_type_time(ENERGEST_TYPE_LISTEN) - last_listen;
75 
76  /* Make sure that the values are within 16 bits. If they are larger,
77  we scale them down to fit into 16 bits. */
78  while(cpu >= 65536ul || lpm >= 65536ul ||
79  transmit >= 65536ul || listen >= 65536ul) {
80  cpu /= 2;
81  lpm /= 2;
82  transmit /= 2;
83  listen /= 2;
84  }
85 
86  msg->cpu = cpu;
87  msg->lpm = lpm;
88  msg->transmit = transmit;
89  msg->listen = listen;
90 
91  last_cpu = energest_type_time(ENERGEST_TYPE_CPU);
92  last_lpm = energest_type_time(ENERGEST_TYPE_LPM);
93  last_transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT);
94  last_listen = energest_type_time(ENERGEST_TYPE_LISTEN);
95 
96  memcpy(&msg->parent, &parent->u8[LINKADDR_SIZE - 2], 2);
97  msg->parent_etx = parent_etx;
98  msg->current_rtmetric = current_rtmetric;
99  msg->num_neighbors = num_neighbors;
100  msg->beacon_interval = beacon_interval;
101 
102  memset(msg->sensors, 0, sizeof(msg->sensors));
103  collect_view_arch_read_sensors(msg);
104 }
105 /*---------------------------------------------------------------------------*/
Header file for a simple time synchronization mechanism
Header file for the Rime stack
rtimer_clock_t timesynch_time(void)
Get the current time-synchronized time.
CCIF clock_time_t clock_time(void)
Get the current clock time.
Definition: clock.c:41
Header file for the Contiki radio neighborhood management