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.
Dependencies: nRF51_Vdd TextLCD BME280
LoWPANNDInterface.cpp
00001 #include "LoWPANNDInterface.h" 00002 #include "include/nd_tasklet.h" 00003 #include "callback_handler.h" 00004 #include "NanostackLockGuard.h" 00005 #include "mesh_system.h" 00006 #include "randLIB.h" 00007 00008 #include "ns_trace.h" 00009 #define TRACE_GROUP "nslp" 00010 00011 class Nanostack::LoWPANNDInterface : public Nanostack::MeshInterface 00012 { 00013 public: 00014 virtual nsapi_error_t bringup(bool dhcp, const char *ip, 00015 const char *netmask, const char *gw, 00016 nsapi_ip_stack_t stack = IPV6_STACK, 00017 bool blocking = true); 00018 virtual nsapi_error_t bringdown(); 00019 virtual char *get_gateway(char *buf, nsapi_size_t buflen); 00020 00021 friend Nanostack; 00022 friend class ::LoWPANNDInterface; 00023 private: 00024 LoWPANNDInterface(NanostackRfPhy &phy) : MeshInterface(phy) { } 00025 mesh_error_t init(); 00026 mesh_error_t mesh_connect(); 00027 mesh_error_t mesh_disconnect(); 00028 }; 00029 00030 Nanostack::LoWPANNDInterface *LoWPANNDInterface::get_interface() const 00031 { 00032 return static_cast<Nanostack::LoWPANNDInterface*>(_interface); 00033 } 00034 00035 nsapi_error_t LoWPANNDInterface::do_initialize() 00036 { 00037 if (!_interface) { 00038 _interface = new (std::nothrow) Nanostack::LoWPANNDInterface(*_phy); 00039 if (!_interface) { 00040 return NSAPI_ERROR_NO_MEMORY ; 00041 } 00042 _interface->attach(_connection_status_cb); 00043 } 00044 return NSAPI_ERROR_OK ; 00045 } 00046 00047 nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip, 00048 const char *netmask, const char *gw, 00049 nsapi_ip_stack_t stack, bool blocking) 00050 { 00051 nanostack_lock(); 00052 00053 if (register_phy() < 0) { 00054 nanostack_unlock(); 00055 return NSAPI_ERROR_DEVICE_ERROR ; 00056 } 00057 00058 _blocking = blocking; 00059 00060 // After the RF is up, we can seed the random from it. 00061 randLIB_seed_random(); 00062 00063 mesh_error_t status = init(); 00064 if (status != MESH_ERROR_NONE) { 00065 nanostack_unlock(); 00066 return map_mesh_error(status); 00067 } 00068 00069 status = mesh_connect(); 00070 if (status != MESH_ERROR_NONE) { 00071 nanostack_unlock(); 00072 return map_mesh_error(status); 00073 } 00074 00075 // Release mutex before blocking 00076 nanostack_unlock(); 00077 00078 if (blocking) { 00079 // wait connection for ever 00080 int32_t count = connect_semaphore.wait(osWaitForever); 00081 00082 if (count <= 0) { 00083 return NSAPI_ERROR_DHCP_FAILURE ; // sort of... 00084 } 00085 } 00086 return 0; 00087 00088 } 00089 00090 nsapi_error_t Nanostack::LoWPANNDInterface::bringdown() 00091 { 00092 NanostackLockGuard lock; 00093 00094 mesh_error_t status = mesh_disconnect(); 00095 00096 return map_mesh_error(status); 00097 } 00098 00099 mesh_error_t Nanostack::LoWPANNDInterface::init() 00100 { 00101 nd_tasklet_init(); 00102 __mesh_handler_set_callback(this); 00103 interface_id = nd_tasklet_network_init(_device_id); 00104 00105 if (interface_id == -2) { 00106 return MESH_ERROR_PARAM; 00107 } else if (interface_id == -3) { 00108 return MESH_ERROR_MEMORY; 00109 } else if (interface_id < 0) { 00110 return MESH_ERROR_UNKNOWN; 00111 } 00112 return MESH_ERROR_NONE; 00113 } 00114 00115 mesh_error_t Nanostack::LoWPANNDInterface::mesh_connect() 00116 { 00117 int8_t status = -9; // init to unknown error 00118 tr_debug("connect()"); 00119 00120 status = nd_tasklet_connect(&__mesh_handler_c_callback, interface_id); 00121 00122 if (status >= 0) { 00123 return MESH_ERROR_NONE; 00124 } else if (status == -1) { 00125 return MESH_ERROR_PARAM; 00126 } else if (status == -2) { 00127 return MESH_ERROR_MEMORY; 00128 } else if (status == -3) { 00129 return MESH_ERROR_STATE; 00130 } else { 00131 return MESH_ERROR_UNKNOWN; 00132 } 00133 } 00134 00135 mesh_error_t Nanostack::LoWPANNDInterface::mesh_disconnect() 00136 { 00137 int8_t status = -1; 00138 00139 status = nd_tasklet_disconnect(true); 00140 00141 if (status >= 0) { 00142 return MESH_ERROR_NONE; 00143 } 00144 00145 return MESH_ERROR_UNKNOWN; 00146 } 00147 00148 char *Nanostack::LoWPANNDInterface::get_gateway(char *buf, nsapi_size_t buflen) 00149 { 00150 NanostackLockGuard lock; 00151 if (nd_tasklet_get_router_ip_address(buf, buflen) == 0) { 00152 return buf; 00153 } 00154 return NULL; 00155 } 00156 00157 bool LoWPANNDInterface::getRouterIpAddress(char *address, int8_t len) 00158 { 00159 return _interface->get_gateway(address, len); 00160 } 00161 00162 #define LOWPAN 0x2345 00163 #if MBED_CONF_NSAPI_DEFAULT_MESH_TYPE == LOWPAN && DEVICE_802_15_4_PHY 00164 MBED_WEAK MeshInterface *MeshInterface::get_target_default_instance() 00165 { 00166 static LoWPANNDInterface lowpan(&NanostackRfPhy::get_default_instance()); 00167 00168 return &lowpan; 00169 } 00170 #endif
Generated on Tue Jul 12 2022 15:15:48 by
