Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbedConnectorInterfaceV3 by
source/mbedEndpointNetwork.cpp
- Committer:
- ansond
- Date:
- 2016-08-22
- Revision:
- 63:fc30c31a4d75
- Parent:
- 61:d02cd5e2bb26
- Child:
- 64:f6e3ecaa8c3a
File content as of revision 63:fc30c31a4d75:
/** * @file mbedEndpointNetwork.cpp * @brief mbed Connector Interface network low level functions and support (Ethernet, WiFi, Mesh (6LowPAN,Thread)) * @author Doug Anson * @version 1.0 * @see * * Copyright (c) 2014 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Connector Endpoint #include "mbed-connector-interface/ConnectorEndpoint.h" // OptionsBuilder #include "mbed-connector-interface/OptionsBuilder.h" // Forward declarations of public functions in mbedEndpointNetwork #include "mbed-connector-interface/mbedEndpointNetworkImpl.h" // Network Selection #if MBED_CONF_APP_NETWORK_INTERFACE == WIFI #define NETWORK_TYPE "WiFi" #include "ESP8266Interface.h" ESP8266Interface network(MBED_CONF_APP_WIFI_TX,MBED_CONF_APP_WIFI_RX); #elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET #define NETWORK_TYPE "Ethernet" #include "EthernetInterface.h" EthernetInterface network; #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND #define NETWORK_TYPE "6LowPAN" #include "NanostackInterface.h" LoWPANNDInterface network; #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD #define NETWORK_TYPE "Thread" #include "NanostackInterface.h" ThreadInterface network; #endif // Logger instance extern Logger logger; // endpoint instance static void *_endpoint_instance = NULL; // LWIP network instance forward reference extern NetworkInterface *__network_interface; // main loop cycle period static int _main_loop_iteration_wait_ms = MAIN_LOOP_WAIT_TIME_MS; // endpoint shutdown indicator static volatile bool _shutdown_endpoint = false; extern "C" { /*********************** START LOCAL FUNCTIONS **************************/ // start shutting downt the endpoint void start_endpoint_shutdown(void) { if (_shutdown_endpoint == true) { Connector::Endpoint *ep = (Connector::Endpoint *)_endpoint_instance; if (ep != NULL && ep->isRegistered() == true) { logger.log("mbedEndpointNetwork(%s): shutdown requested. De-registering the endpoint...",NETWORK_TYPE); ep->de_register_endpoint(); } // Clean up if (ep != NULL) { delete ep; _endpoint_instance = NULL; } } // ready to shutdown... logger.log("mbedEndpointNetwork(%s): endpoint shutdown. Bye!",NETWORK_TYPE); } // setup shutdown button #if MBED_CONF_APP_SHUTDOWN_BUTTON_ENABLE == true InterruptIn shutdown_button(MBED_CONF_APP_SHUTDOWN_PIN); void configure_deregistration_button(void) { logger.log("mbedEndpointNetwork(%s): configuring de-registration button...",NETWORK_TYPE); shutdown_button.fall(&net_shutdown_endpoint); } #endif // setup shutdown button void setup_deregistration_button(void) { #if MBED_CONF_APP_SHUTDOWN_BUTTON_ENABLE == true configure_deregistration_button(); #endif } // configure main loop parameters void configure_main_loop_params(Connector::Endpoint *endpoint) { // set the initial shutdown state _shutdown_endpoint = false; } // perform an actvity in the main loop void peform_main_loop_activity(void) { // empty for now... ; } // begin the main loop for processing endpoint events void begin_main_loop(void) { // DEBUG logger.log("mbedEndpointNetwork(%s): endpoint main loop beginning...",NETWORK_TYPE); // enter our main loop (until the shutdown condition flags it...) while(_shutdown_endpoint == false) { Thread::wait(_main_loop_iteration_wait_ms); peform_main_loop_activity(); } // main loop has exited... start the endpoint shutdown... logger.log("mbedEndpointNetwork(%s): endpoint main loop exited. Starting endpoint shutdown...",NETWORK_TYPE); start_endpoint_shutdown(); } /************************ END LOCAL FUNCTIONS ***************************/ /*********************** START PUBLIC FUNCTIONS *************************/ // get the network type char *net_get_type() { return NETWORK_TYPE; } // shutdown the endpoint void net_shutdown_endpoint() { _shutdown_endpoint = true; } // called after the endpoint is configured... void net_plumb_network(void *p) { int connected = 0; Connector::Endpoint *ep = NULL; Connector::Options *options = NULL; // save _endpoint_instance = p; // connected if (p != NULL) { ep = (Connector::Endpoint *)p; options = ep->getOptions(); } #if MBED_CONF_APP_NETWORK_INTERFACE == WIFI // map security types nsapi_security_t security_opt = NSAPI_SECURITY_NONE; if (options->getWiFiAuthType() == WIFI_WPA_PERSONAL) { security_opt = NSAPI_SECURITY_WPA; } if (options->getWiFiAuthType() == WIFI_WPA2_PERSONAL) { security_opt = NSAPI_SECURITY_WPA2; } if (options->getWiFiAuthType() == WIFI_WEP) { security_opt = NSAPI_SECURITY_WEP; } // Network Init (WIFI)... connected = network.connect(options->getWiFiSSID().c_str(),options->getWiFiAuthKey().c_str(),security_opt); #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND || MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD // Set the IP Address type to IPV6 ((Connector::OptionsBuilder *)options)->setIPAddressType(IP_ADDRESS_TYPE_IPV6); // Network Init (Mesh) connected = network.connect(); #else // not used... just removes a compiler warning... options->getConnectorURL(); // Network Init (Ethernet) connected = network.connect(); #endif // check the connection status.. if (connected == 0) { // success __network_interface = (NetworkInterface *)&network; if (ep != NULL) { ep->isConnected(true); // Debug logger.log("mbedEndpointNetwork(%s): IP Address: %s",NETWORK_TYPE,network.get_ip_address()); } } else { __network_interface = NULL; if (ep != NULL) { ep->isConnected(false); } // Debug logger.log("mbedEndpointNetwork(%s): CONNECTION FAILED",NETWORK_TYPE); } } // finalize and run the endpoint main loop void net_finalize_and_run_endpoint_main_loop(void *p) { // cast Connector::Endpoint *ep = (Connector::Endpoint *)p; // Initialize our main loop... configure_main_loop_params(ep); // setup the shutdown button (if enabled for a given platform...) setup_deregistration_button(); // register the endpoint logger.log("mbedEndpointNetwork(%s): registering endpoint...",NETWORK_TYPE); ep->register_endpoint(ep->getEndpointSecurity(),ep->getEndpointObjectList()); // Begin the endpoint's main loop begin_main_loop(); } /************************ END PUBLIC FUNCTIONS **************************/ }