Contiki 3.x
shell-rime-neighbors.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, 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  * The Contiki shell Rime ping application
36  * \author
37  * Adam Dunkels <adam@sics.se>
38  */
39 
40 #include <string.h>
41 #include "shell.h"
42 #include "net/rime/rime.h"
43 
44 PROCESS(shell_neighbors_process, "neighbors");
45 SHELL_COMMAND(neighbors_command,
46  "neighbors",
47  "neighbors: dump neighbor list in binary format",
48  &shell_neighbors_process);
49 
50 static uint8_t listening_for_neighbors = 0;
51 
52 /*---------------------------------------------------------------------------*/
53 static void
54 received_announcement(struct announcement *a, const linkaddr_t *from,
55  uint16_t id, uint16_t value)
56 {
57  struct {
58  uint16_t len;
59  uint16_t addr;
60  uint16_t rssi;
61  uint16_t lqi;
62  } msg;
63 
64  if(listening_for_neighbors) {
65  memset(&msg, 0, sizeof(msg));
66  msg.len = 3;
67  linkaddr_copy((linkaddr_t *)&msg.addr, from);
68  msg.rssi = packetbuf_attr(PACKETBUF_ATTR_RSSI);
69  msg.lqi = packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY);
70  shell_output(&neighbors_command, &msg, sizeof(msg), "", 0);
71  }
72 }
73 static struct announcement neighbor_announcement;
74 /*---------------------------------------------------------------------------*/
75 PROCESS_THREAD(shell_neighbors_process, ev, data)
76 {
77  static struct etimer et;
78 
79  PROCESS_EXITHANDLER(announcement_remove(&neighbor_announcement);)
80  PROCESS_BEGIN();
81 
82  listening_for_neighbors = 1;
84 
85  etimer_set(&et, CLOCK_SECOND * 10);
87  listening_for_neighbors = 0;
88 
89  PROCESS_END();
90 }
91 /*---------------------------------------------------------------------------*/
92 void
93 shell_rime_neighbors_init(void)
94 {
95  announcement_register(&neighbor_announcement,
96  SHELL_RIME_ANNOUNCEMENT_IDENTIFIER_NEIGHBORS,
97  received_announcement);
98  announcement_set_value(&neighbor_announcement, 0);
99 
100  shell_register_command(&neighbors_command);
101 }
102 /*---------------------------------------------------------------------------*/
void announcement_remove(struct announcement *a)
Remove a previously registered announcement.
Definition: announcement.c:76
int etimer_expired(struct etimer *et)
Check if an event timer has expired.
Definition: etimer.c:205
void announcement_register(struct announcement *a, uint16_t id, announcement_callback_t callback)
Register an announcement.
Definition: announcement.c:62
#define PROCESS_BEGIN()
Define the beginning of a process.
Definition: process.h:120
Main header file for the Contiki shell
Header file for the Rime stack
void shell_output(struct shell_command *c, void *data1, int len1, const void *data2, int len2)
Output data from a shell command.
Definition: shell.c:395
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a Rime address.
Definition: linkaddr.c:60
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
Definition: process.h:273
#define PROCESS_END()
Define the end of a process.
Definition: process.h:131
#define PROCESS_EXITHANDLER(handler)
Specify an action when a process exits.
Definition: process.h:254
void shell_register_command(struct shell_command *c)
Register a command with the shell.
Definition: shell.c:413
#define PROCESS_WAIT_EVENT_UNTIL(c)
Wait for an event to be posted to the process, with an extra condition.
Definition: process.h:157
void announcement_listen(int time)
Listen for announcements for a specific amount of announcement periods.
Definition: announcement.c:114
#define PROCESS(name, strname)
Declare a process.
Definition: process.h:307
Representation of an announcement.
Definition: announcement.h:83
void etimer_set(struct etimer *et, clock_time_t interval)
Set an event timer.
Definition: etimer.c:177
A timer.
Definition: etimer.h:76
void announcement_set_value(struct announcement *a, uint16_t value)
Set the value of an announcement.
Definition: announcement.c:92
#define SHELL_COMMAND(name, command, description, process)
Define a shell command.
Definition: shell.h:219
#define CLOCK_SECOND
A second, measured in system clock time.
Definition: clock.h:82