Mistake on this page?
Report an issue in GitHub or email us
MeshInterfaceNanostack.h
1 /*
2  * Copyright (c) 2016-2019 ARM Limited. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  * Licensed under the Apache License, Version 2.0 (the License); you may
5  * not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MESHINTERFACENANOSTACK_H
18 #define MESHINTERFACENANOSTACK_H
19 
20 #include "Semaphore.h"
21 #include "MeshInterface.h"
22 #include "NanostackRfPhy.h"
23 #include "Nanostack.h"
24 #include "mesh_interface_types.h"
25 
26 class Nanostack::Interface : public OnboardNetworkStack::Interface, private mbed::NonCopyable<Nanostack::Interface> {
27 public:
28  virtual char *get_ip_address(char *buf, nsapi_size_t buflen);
29  virtual char *get_mac_address(char *buf, nsapi_size_t buflen);
30  virtual char *get_netmask(char *buf, nsapi_size_t buflen);
31  virtual char *get_gateway(char *buf, nsapi_size_t buflen);
32  virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
33  virtual nsapi_connection_status_t get_connection_status() const;
34 
35  void get_mac_address(uint8_t *buf) const
36  {
37  NanostackMACPhy *phy = interface_phy.nanostack_mac_phy();
38  if (phy) {
39  phy->get_mac_address(buf);
40  }
41  }
42 
43  /**
44  * \brief Callback from C-layer
45  * \param status state of the network
46  * */
47  void network_handler(mesh_connection_status_t status);
48 
49  int8_t get_interface_id() const
50  {
51  return interface_id;
52  }
53  int8_t get_driver_id() const
54  {
55  return _device_id;
56  }
57 
58 private:
59  NanostackPhy &interface_phy;
60 protected:
61  Interface(NanostackPhy &phy);
62  virtual nsapi_error_t register_phy();
63  NanostackPhy &get_phy() const
64  {
65  return interface_phy;
66  }
67  int8_t interface_id;
68  int8_t _device_id;
69  rtos::Semaphore connect_semaphore;
70  rtos::Semaphore disconnect_semaphore;
71 
73  nsapi_connection_status_t _connect_status;
74  nsapi_connection_status_t _previous_connection_status;
75  bool _blocking;
76 };
77 
79 protected:
80  MeshInterface(NanostackRfPhy &phy) : Interface(phy) { }
81  NanostackRfPhy &get_phy() const
82  {
83  return static_cast<NanostackRfPhy &>(Interface::get_phy());
84  }
85 };
86 
87 
88 class InterfaceNanostack : public virtual NetworkInterface {
89 public:
90  /** Start the interface
91  *
92  * @return 0 on success, negative error code on failure
93  */
94  virtual nsapi_error_t connect();
95 
96  /** Stop the interface
97  *
98  * @return 0 on success, negative error code on failure
99  */
100  virtual nsapi_error_t disconnect();
101 
102  /** Get the internally stored IP address
103  /return IP address of the interface or null if not yet connected
104  */
105  virtual const char *get_ip_address();
106 
107  /** Get the internally stored MAC address
108  /return MAC address of the interface
109  */
110  virtual const char *get_mac_address();
111 
112  /** Register callback for status reporting
113  *
114  * The specified status callback function will be called on status changes
115  * on the network. The parameters on the callback are the event type and
116  * event-type dependent reason parameter.
117  *
118  * @param status_cb The callback for status changes
119  */
120  virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
121 
122  /** Get the connection status
123  *
124  * @return The connection status according to ConnectionStatusType
125  */
126  virtual nsapi_connection_status_t get_connection_status() const;
127 
128  /** Set blocking status of connect() which by default should be blocking
129  *
130  * @param blocking true if connect is blocking
131  * @return 0 on success, negative error code on failure
132  */
133  virtual nsapi_error_t set_blocking(bool blocking);
134 
135  /** Set file system root path.
136  *
137  * Set file system root path that stack will use to write and read its data.
138  * Setting root_path to NULL will disable file system usage.
139  *
140  * @param root_path Address to NUL-terminated root-path string or NULL to disable file system usage.
141  * @return MESH_ERROR_NONE on success, MESH_ERROR_MEMORY in case of memory failure, MESH_ERROR_UNKNOWN in case of other error.
142  */
143  virtual nsapi_error_t set_file_system_root_path(const char *root_path);
144 
145  /** Get the interface ID
146  * @return Interface identifier
147  */
148  int8_t get_interface_id() const
149  {
150  return _interface->get_interface_id();
151  }
152 
153 protected:
155  virtual Nanostack *get_stack(void);
156  Nanostack::Interface *get_interface() const
157  {
158  return _interface;
159  }
160  virtual nsapi_error_t do_initialize() = 0;
161 
162  Nanostack::Interface *_interface;
163 
164  char ip_addr_str[40];
165  char mac_addr_str[24];
166  mbed::Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
167  bool _blocking;
168 };
169 
170 class MeshInterfaceNanostack : public InterfaceNanostack, public MeshInterface, private mbed::NonCopyable<MeshInterfaceNanostack> {
171 public:
172 
173  /** Attach phy and initialize the mesh
174  *
175  * Initializes a mesh interface on the given phy. Not needed if
176  * the phy is passed to the mesh's constructor.
177  *
178  * @return 0 on success, negative on failure
179  */
180  nsapi_error_t initialize(NanostackRfPhy *phy);
181 
182 protected:
183  MeshInterfaceNanostack() : _phy(NULL) { }
184  MeshInterfaceNanostack(NanostackRfPhy *phy) : _phy(phy) { }
185  Nanostack::MeshInterface *get_interface() const
186  {
187  return static_cast<Nanostack::MeshInterface *>(_interface);
188  }
189  NanostackRfPhy *_phy;
190 };
191 
192 #endif /* MESHINTERFACENANOSTACK_H */
Radio PHY driver class for Nanostack.
The Semaphore class is used to manage and protect access to a set of shared resources.
Definition: Semaphore.h:47
Representation of a stack&#39;s view of an interface.
virtual void get_mac_address(uint8_t *mac)=0
Read the mac address of this physical interface.
signed int nsapi_error_t
Type used to represent error codes.
Definition: nsapi_types.h:95
virtual void attach(mbed::Callback< void(nsapi_event_t, intptr_t)> status_cb)
Register callback for status reporting.
Common interface that is shared between mesh hardware.
Definition: MeshInterface.h:29
Prevents generation of copy constructor and copy assignment operator in derived classes.
Definition: NonCopyable.h:169
virtual char * get_ip_address(char *buf, nsapi_size_t buflen)
Copies IP address of the network interface to user supplied buffer.
virtual char * get_mac_address(char *buf, nsapi_size_t buflen)
Return MAC address of the network interface.
Common interface that is shared between network devices.
virtual char * get_netmask(char *buf, nsapi_size_t buflen)
Copies netmask of the network interface to user supplied buffer.
PHY driver class for Nanostack.
Definition: NanostackPhy.h:25
virtual char * get_gateway(char *buf, nsapi_size_t buflen)
Copies gateway address of the network interface to user supplied buffer.
unsigned int nsapi_size_t
Type used to represent the size of data passed through sockets.
Definition: nsapi_types.h:99
MAC PHY driver class for Nanostack.
void network_handler(mesh_connection_status_t status)
Callback from C-layer.
virtual NanostackMACPhy * nanostack_mac_phy()
Return pointer to a NanostackMACPhy.
Definition: NanostackPhy.h:40
Callback class based on template specialization.
Definition: Callback.h:39
virtual nsapi_connection_status_t get_connection_status() const
Get the connection status.
int8_t get_interface_id() const
Get the interface ID.
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.