Knight KE / Mbed OS Game_Master
Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

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