takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /* LWIP implementation of NetworkInterfaceAPI
kadonotakashi 0:8fdf9a60065b 2 * Copyright (c) 2015 ARM Limited
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Licensed under the Apache License, Version 2.0 (the "License");
kadonotakashi 0:8fdf9a60065b 5 * you may not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 6 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 7 *
kadonotakashi 0:8fdf9a60065b 8 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 9 *
kadonotakashi 0:8fdf9a60065b 10 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 11 * distributed under the License is distributed on an "AS IS" BASIS,
kadonotakashi 0:8fdf9a60065b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 13 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 14 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 15 */
kadonotakashi 0:8fdf9a60065b 16
kadonotakashi 0:8fdf9a60065b 17 #ifndef EMAC_INTERFACE_H
kadonotakashi 0:8fdf9a60065b 18 #define EMAC_INTERFACE_H
kadonotakashi 0:8fdf9a60065b 19
kadonotakashi 0:8fdf9a60065b 20 #include "nsapi.h"
kadonotakashi 0:8fdf9a60065b 21 #include "rtos.h"
kadonotakashi 0:8fdf9a60065b 22 #include "EMAC.h"
kadonotakashi 0:8fdf9a60065b 23 #include "OnboardNetworkStack.h"
kadonotakashi 0:8fdf9a60065b 24
kadonotakashi 0:8fdf9a60065b 25
kadonotakashi 0:8fdf9a60065b 26 /** EMACInterface class
kadonotakashi 0:8fdf9a60065b 27 * Implementation of the NetworkInterface for an EMAC-based driver
kadonotakashi 0:8fdf9a60065b 28 *
kadonotakashi 0:8fdf9a60065b 29 * This class provides the necessary glue logic to create a NetworkInterface
kadonotakashi 0:8fdf9a60065b 30 * based on an EMAC and an OnboardNetworkStack. EthernetInterface and
kadonotakashi 0:8fdf9a60065b 31 * EMAC-based Wi-Fi drivers derive from it.
kadonotakashi 0:8fdf9a60065b 32 *
kadonotakashi 0:8fdf9a60065b 33 * Drivers derived from EMACInterface should be constructed so that their
kadonotakashi 0:8fdf9a60065b 34 * EMAC is functional without the need to call `connect()`. For example
kadonotakashi 0:8fdf9a60065b 35 * a Wi-Fi driver should permit `WiFi::get_emac().power_up()` as soon as
kadonotakashi 0:8fdf9a60065b 36 * the credentials have been set. This is necessary to support specialised
kadonotakashi 0:8fdf9a60065b 37 * applications such as 6LoWPAN mesh border routers.
kadonotakashi 0:8fdf9a60065b 38 */
kadonotakashi 0:8fdf9a60065b 39 class EMACInterface : public virtual NetworkInterface {
kadonotakashi 0:8fdf9a60065b 40 public:
kadonotakashi 0:8fdf9a60065b 41 /** Create an EMAC-based network interface.
kadonotakashi 0:8fdf9a60065b 42 *
kadonotakashi 0:8fdf9a60065b 43 * The default arguments obtain the default EMAC, which will be target-
kadonotakashi 0:8fdf9a60065b 44 * dependent (and the target may have some JSON option to choose which
kadonotakashi 0:8fdf9a60065b 45 * is the default, if there are multiple). The default stack is configured
kadonotakashi 0:8fdf9a60065b 46 * by JSON option nsapi.default-stack.
kadonotakashi 0:8fdf9a60065b 47 *
kadonotakashi 0:8fdf9a60065b 48 * Due to inability to return errors from the constructor, no real
kadonotakashi 0:8fdf9a60065b 49 * work is done until the first call to connect().
kadonotakashi 0:8fdf9a60065b 50 *
kadonotakashi 0:8fdf9a60065b 51 * @param emac Reference to EMAC to use
kadonotakashi 0:8fdf9a60065b 52 * @param stack Reference to onboard-network stack to use
kadonotakashi 0:8fdf9a60065b 53 */
kadonotakashi 0:8fdf9a60065b 54 EMACInterface(EMAC &emac = EMAC::get_default_instance(),
kadonotakashi 0:8fdf9a60065b 55 OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
kadonotakashi 0:8fdf9a60065b 56
kadonotakashi 0:8fdf9a60065b 57 /** Set a static IP address
kadonotakashi 0:8fdf9a60065b 58 *
kadonotakashi 0:8fdf9a60065b 59 * Configures this network interface to use a static IP address.
kadonotakashi 0:8fdf9a60065b 60 * Implicitly disables DHCP, which can be enabled in set_dhcp.
kadonotakashi 0:8fdf9a60065b 61 * Requires that the network is disconnected.
kadonotakashi 0:8fdf9a60065b 62 *
kadonotakashi 0:8fdf9a60065b 63 * @param ip_address Null-terminated representation of the local IP address
kadonotakashi 0:8fdf9a60065b 64 * @param netmask Null-terminated representation of the local network mask
kadonotakashi 0:8fdf9a60065b 65 * @param gateway Null-terminated representation of the local gateway
kadonotakashi 0:8fdf9a60065b 66 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 67 */
kadonotakashi 0:8fdf9a60065b 68 virtual nsapi_error_t set_network(const char *ip_address, const char *netmask, const char *gateway);
kadonotakashi 0:8fdf9a60065b 69
kadonotakashi 0:8fdf9a60065b 70 /** Enable or disable DHCP on the network
kadonotakashi 0:8fdf9a60065b 71 *
kadonotakashi 0:8fdf9a60065b 72 * Requires that the network is disconnected
kadonotakashi 0:8fdf9a60065b 73 *
kadonotakashi 0:8fdf9a60065b 74 * @param dhcp False to disable dhcp (defaults to enabled)
kadonotakashi 0:8fdf9a60065b 75 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 76 */
kadonotakashi 0:8fdf9a60065b 77 virtual nsapi_error_t set_dhcp(bool dhcp);
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 /** Start the interface
kadonotakashi 0:8fdf9a60065b 80 * @return 0 on success, negative on failure
kadonotakashi 0:8fdf9a60065b 81 */
kadonotakashi 0:8fdf9a60065b 82 virtual nsapi_error_t connect();
kadonotakashi 0:8fdf9a60065b 83
kadonotakashi 0:8fdf9a60065b 84 /** Stop the interface
kadonotakashi 0:8fdf9a60065b 85 * @return 0 on success, negative on failure
kadonotakashi 0:8fdf9a60065b 86 */
kadonotakashi 0:8fdf9a60065b 87 virtual nsapi_error_t disconnect();
kadonotakashi 0:8fdf9a60065b 88
kadonotakashi 0:8fdf9a60065b 89 /** Get the local MAC address
kadonotakashi 0:8fdf9a60065b 90 *
kadonotakashi 0:8fdf9a60065b 91 * Provided MAC address is intended for info or debug purposes and
kadonotakashi 0:8fdf9a60065b 92 * may not be provided if the underlying network interface does not
kadonotakashi 0:8fdf9a60065b 93 * provide a MAC address
kadonotakashi 0:8fdf9a60065b 94 *
kadonotakashi 0:8fdf9a60065b 95 * @return Null-terminated representation of the local MAC address
kadonotakashi 0:8fdf9a60065b 96 * or null if no MAC address is available
kadonotakashi 0:8fdf9a60065b 97 */
kadonotakashi 0:8fdf9a60065b 98 virtual const char *get_mac_address();
kadonotakashi 0:8fdf9a60065b 99
kadonotakashi 0:8fdf9a60065b 100 /** Get the local IP address
kadonotakashi 0:8fdf9a60065b 101 *
kadonotakashi 0:8fdf9a60065b 102 * @return Null-terminated representation of the local IP address
kadonotakashi 0:8fdf9a60065b 103 * or null if no IP address has been recieved
kadonotakashi 0:8fdf9a60065b 104 */
kadonotakashi 0:8fdf9a60065b 105 virtual const char *get_ip_address();
kadonotakashi 0:8fdf9a60065b 106
kadonotakashi 0:8fdf9a60065b 107 /** Get the local network mask
kadonotakashi 0:8fdf9a60065b 108 *
kadonotakashi 0:8fdf9a60065b 109 * @return Null-terminated representation of the local network mask
kadonotakashi 0:8fdf9a60065b 110 * or null if no network mask has been recieved
kadonotakashi 0:8fdf9a60065b 111 */
kadonotakashi 0:8fdf9a60065b 112 virtual const char *get_netmask();
kadonotakashi 0:8fdf9a60065b 113
kadonotakashi 0:8fdf9a60065b 114 /** Get the local gateways
kadonotakashi 0:8fdf9a60065b 115 *
kadonotakashi 0:8fdf9a60065b 116 * @return Null-terminated representation of the local gateway
kadonotakashi 0:8fdf9a60065b 117 * or null if no network mask has been recieved
kadonotakashi 0:8fdf9a60065b 118 */
kadonotakashi 0:8fdf9a60065b 119 virtual const char *get_gateway();
kadonotakashi 0:8fdf9a60065b 120
kadonotakashi 0:8fdf9a60065b 121 /** Register callback for status reporting
kadonotakashi 0:8fdf9a60065b 122 *
kadonotakashi 0:8fdf9a60065b 123 * @param status_cb The callback for status changes
kadonotakashi 0:8fdf9a60065b 124 */
kadonotakashi 0:8fdf9a60065b 125 virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
kadonotakashi 0:8fdf9a60065b 126
kadonotakashi 0:8fdf9a60065b 127 /** Get the connection status
kadonotakashi 0:8fdf9a60065b 128 *
kadonotakashi 0:8fdf9a60065b 129 * @return The connection status according to nsapi_connection_status_t
kadonotakashi 0:8fdf9a60065b 130 */
kadonotakashi 0:8fdf9a60065b 131 virtual nsapi_connection_status_t get_connection_status() const;
kadonotakashi 0:8fdf9a60065b 132
kadonotakashi 0:8fdf9a60065b 133 /** Set blocking status of connect() which by default should be blocking
kadonotakashi 0:8fdf9a60065b 134 *
kadonotakashi 0:8fdf9a60065b 135 * @param blocking true if connect is blocking
kadonotakashi 0:8fdf9a60065b 136 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 137 */
kadonotakashi 0:8fdf9a60065b 138 virtual nsapi_error_t set_blocking(bool blocking);
kadonotakashi 0:8fdf9a60065b 139
kadonotakashi 0:8fdf9a60065b 140 /** Provide access to the EMAC
kadonotakashi 0:8fdf9a60065b 141 *
kadonotakashi 0:8fdf9a60065b 142 * This should be used with care - normally the network stack would
kadonotakashi 0:8fdf9a60065b 143 * control the EMAC, so manipulating the EMAC while the stack
kadonotakashi 0:8fdf9a60065b 144 * is also using it (ie after connect) will likely cause problems.
kadonotakashi 0:8fdf9a60065b 145 *
kadonotakashi 0:8fdf9a60065b 146 * @return Reference to the EMAC in use
kadonotakashi 0:8fdf9a60065b 147 */
kadonotakashi 0:8fdf9a60065b 148 EMAC &get_emac() const
kadonotakashi 0:8fdf9a60065b 149 {
kadonotakashi 0:8fdf9a60065b 150 return _emac;
kadonotakashi 0:8fdf9a60065b 151 }
kadonotakashi 0:8fdf9a60065b 152
kadonotakashi 0:8fdf9a60065b 153 virtual EMACInterface *emacInterface()
kadonotakashi 0:8fdf9a60065b 154 {
kadonotakashi 0:8fdf9a60065b 155 return this;
kadonotakashi 0:8fdf9a60065b 156 }
kadonotakashi 0:8fdf9a60065b 157
kadonotakashi 0:8fdf9a60065b 158 protected:
kadonotakashi 0:8fdf9a60065b 159 /** Provide access to the underlying stack
kadonotakashi 0:8fdf9a60065b 160 *
kadonotakashi 0:8fdf9a60065b 161 * @return The underlying network stack
kadonotakashi 0:8fdf9a60065b 162 */
kadonotakashi 0:8fdf9a60065b 163 virtual NetworkStack *get_stack();
kadonotakashi 0:8fdf9a60065b 164
kadonotakashi 0:8fdf9a60065b 165 EMAC &_emac;
kadonotakashi 0:8fdf9a60065b 166 OnboardNetworkStack &_stack;
kadonotakashi 0:8fdf9a60065b 167 OnboardNetworkStack::Interface *_interface;
kadonotakashi 0:8fdf9a60065b 168 bool _dhcp;
kadonotakashi 0:8fdf9a60065b 169 bool _blocking;
kadonotakashi 0:8fdf9a60065b 170 char _mac_address[NSAPI_MAC_SIZE];
kadonotakashi 0:8fdf9a60065b 171 char _ip_address[NSAPI_IPv6_SIZE];
kadonotakashi 0:8fdf9a60065b 172 char _netmask[NSAPI_IPv4_SIZE];
kadonotakashi 0:8fdf9a60065b 173 char _gateway[NSAPI_IPv4_SIZE];
kadonotakashi 0:8fdf9a60065b 174 Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
kadonotakashi 0:8fdf9a60065b 175 };
kadonotakashi 0:8fdf9a60065b 176
kadonotakashi 0:8fdf9a60065b 177 #endif