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 #include "LoWPANNDInterface.h"
kadonotakashi 0:8fdf9a60065b 2 #include "include/nd_tasklet.h"
kadonotakashi 0:8fdf9a60065b 3 #include "callback_handler.h"
kadonotakashi 0:8fdf9a60065b 4 #include "NanostackLockGuard.h"
kadonotakashi 0:8fdf9a60065b 5 #include "mesh_system.h"
kadonotakashi 0:8fdf9a60065b 6 #include "randLIB.h"
kadonotakashi 0:8fdf9a60065b 7
kadonotakashi 0:8fdf9a60065b 8 #include "ns_trace.h"
kadonotakashi 0:8fdf9a60065b 9 #define TRACE_GROUP "nslp"
kadonotakashi 0:8fdf9a60065b 10
kadonotakashi 0:8fdf9a60065b 11 class Nanostack::LoWPANNDInterface : public Nanostack::MeshInterface
kadonotakashi 0:8fdf9a60065b 12 {
kadonotakashi 0:8fdf9a60065b 13 public:
kadonotakashi 0:8fdf9a60065b 14 virtual nsapi_error_t bringup(bool dhcp, const char *ip,
kadonotakashi 0:8fdf9a60065b 15 const char *netmask, const char *gw,
kadonotakashi 0:8fdf9a60065b 16 nsapi_ip_stack_t stack = IPV6_STACK,
kadonotakashi 0:8fdf9a60065b 17 bool blocking = true);
kadonotakashi 0:8fdf9a60065b 18 virtual nsapi_error_t bringdown();
kadonotakashi 0:8fdf9a60065b 19 virtual char *get_gateway(char *buf, nsapi_size_t buflen);
kadonotakashi 0:8fdf9a60065b 20
kadonotakashi 0:8fdf9a60065b 21 friend Nanostack;
kadonotakashi 0:8fdf9a60065b 22 friend class ::LoWPANNDInterface;
kadonotakashi 0:8fdf9a60065b 23 private:
kadonotakashi 0:8fdf9a60065b 24 LoWPANNDInterface(NanostackRfPhy &phy) : MeshInterface(phy) { }
kadonotakashi 0:8fdf9a60065b 25 mesh_error_t init();
kadonotakashi 0:8fdf9a60065b 26 mesh_error_t mesh_connect();
kadonotakashi 0:8fdf9a60065b 27 mesh_error_t mesh_disconnect();
kadonotakashi 0:8fdf9a60065b 28 };
kadonotakashi 0:8fdf9a60065b 29
kadonotakashi 0:8fdf9a60065b 30 Nanostack::LoWPANNDInterface *LoWPANNDInterface::get_interface() const
kadonotakashi 0:8fdf9a60065b 31 {
kadonotakashi 0:8fdf9a60065b 32 return static_cast<Nanostack::LoWPANNDInterface*>(_interface);
kadonotakashi 0:8fdf9a60065b 33 }
kadonotakashi 0:8fdf9a60065b 34
kadonotakashi 0:8fdf9a60065b 35 nsapi_error_t LoWPANNDInterface::do_initialize()
kadonotakashi 0:8fdf9a60065b 36 {
kadonotakashi 0:8fdf9a60065b 37 if (!_interface) {
kadonotakashi 0:8fdf9a60065b 38 _interface = new (nothrow) Nanostack::LoWPANNDInterface(*_phy);
kadonotakashi 0:8fdf9a60065b 39 if (!_interface) {
kadonotakashi 0:8fdf9a60065b 40 return NSAPI_ERROR_NO_MEMORY;
kadonotakashi 0:8fdf9a60065b 41 }
kadonotakashi 0:8fdf9a60065b 42 _interface->attach(_connection_status_cb);
kadonotakashi 0:8fdf9a60065b 43 }
kadonotakashi 0:8fdf9a60065b 44 return NSAPI_ERROR_OK;
kadonotakashi 0:8fdf9a60065b 45 }
kadonotakashi 0:8fdf9a60065b 46
kadonotakashi 0:8fdf9a60065b 47 nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip,
kadonotakashi 0:8fdf9a60065b 48 const char *netmask, const char *gw,
kadonotakashi 0:8fdf9a60065b 49 nsapi_ip_stack_t stack, bool blocking)
kadonotakashi 0:8fdf9a60065b 50 {
kadonotakashi 0:8fdf9a60065b 51 nanostack_lock();
kadonotakashi 0:8fdf9a60065b 52
kadonotakashi 0:8fdf9a60065b 53 if (register_phy() < 0) {
kadonotakashi 0:8fdf9a60065b 54 nanostack_unlock();
kadonotakashi 0:8fdf9a60065b 55 return NSAPI_ERROR_DEVICE_ERROR;
kadonotakashi 0:8fdf9a60065b 56 }
kadonotakashi 0:8fdf9a60065b 57
kadonotakashi 0:8fdf9a60065b 58 _blocking = blocking;
kadonotakashi 0:8fdf9a60065b 59
kadonotakashi 0:8fdf9a60065b 60 // After the RF is up, we can seed the random from it.
kadonotakashi 0:8fdf9a60065b 61 randLIB_seed_random();
kadonotakashi 0:8fdf9a60065b 62
kadonotakashi 0:8fdf9a60065b 63 mesh_error_t status = init();
kadonotakashi 0:8fdf9a60065b 64 if (status != MESH_ERROR_NONE) {
kadonotakashi 0:8fdf9a60065b 65 nanostack_unlock();
kadonotakashi 0:8fdf9a60065b 66 return map_mesh_error(status);
kadonotakashi 0:8fdf9a60065b 67 }
kadonotakashi 0:8fdf9a60065b 68
kadonotakashi 0:8fdf9a60065b 69 status = mesh_connect();
kadonotakashi 0:8fdf9a60065b 70 if (status != MESH_ERROR_NONE) {
kadonotakashi 0:8fdf9a60065b 71 nanostack_unlock();
kadonotakashi 0:8fdf9a60065b 72 return map_mesh_error(status);
kadonotakashi 0:8fdf9a60065b 73 }
kadonotakashi 0:8fdf9a60065b 74
kadonotakashi 0:8fdf9a60065b 75 // Release mutex before blocking
kadonotakashi 0:8fdf9a60065b 76 nanostack_unlock();
kadonotakashi 0:8fdf9a60065b 77
kadonotakashi 0:8fdf9a60065b 78 if (blocking) {
kadonotakashi 0:8fdf9a60065b 79 // wait connection for ever
kadonotakashi 0:8fdf9a60065b 80 int32_t count = connect_semaphore.wait(osWaitForever);
kadonotakashi 0:8fdf9a60065b 81
kadonotakashi 0:8fdf9a60065b 82 if (count <= 0) {
kadonotakashi 0:8fdf9a60065b 83 return NSAPI_ERROR_DHCP_FAILURE; // sort of...
kadonotakashi 0:8fdf9a60065b 84 }
kadonotakashi 0:8fdf9a60065b 85 }
kadonotakashi 0:8fdf9a60065b 86 return 0;
kadonotakashi 0:8fdf9a60065b 87
kadonotakashi 0:8fdf9a60065b 88 }
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 nsapi_error_t Nanostack::LoWPANNDInterface::bringdown()
kadonotakashi 0:8fdf9a60065b 91 {
kadonotakashi 0:8fdf9a60065b 92 NanostackLockGuard lock;
kadonotakashi 0:8fdf9a60065b 93
kadonotakashi 0:8fdf9a60065b 94 mesh_error_t status = mesh_disconnect();
kadonotakashi 0:8fdf9a60065b 95
kadonotakashi 0:8fdf9a60065b 96 return map_mesh_error(status);
kadonotakashi 0:8fdf9a60065b 97 }
kadonotakashi 0:8fdf9a60065b 98
kadonotakashi 0:8fdf9a60065b 99 mesh_error_t Nanostack::LoWPANNDInterface::init()
kadonotakashi 0:8fdf9a60065b 100 {
kadonotakashi 0:8fdf9a60065b 101 nd_tasklet_init();
kadonotakashi 0:8fdf9a60065b 102 __mesh_handler_set_callback(this);
kadonotakashi 0:8fdf9a60065b 103 interface_id = nd_tasklet_network_init(_device_id);
kadonotakashi 0:8fdf9a60065b 104
kadonotakashi 0:8fdf9a60065b 105 if (interface_id == -2) {
kadonotakashi 0:8fdf9a60065b 106 return MESH_ERROR_PARAM;
kadonotakashi 0:8fdf9a60065b 107 } else if (interface_id == -3) {
kadonotakashi 0:8fdf9a60065b 108 return MESH_ERROR_MEMORY;
kadonotakashi 0:8fdf9a60065b 109 } else if (interface_id < 0) {
kadonotakashi 0:8fdf9a60065b 110 return MESH_ERROR_UNKNOWN;
kadonotakashi 0:8fdf9a60065b 111 }
kadonotakashi 0:8fdf9a60065b 112 return MESH_ERROR_NONE;
kadonotakashi 0:8fdf9a60065b 113 }
kadonotakashi 0:8fdf9a60065b 114
kadonotakashi 0:8fdf9a60065b 115 mesh_error_t Nanostack::LoWPANNDInterface::mesh_connect()
kadonotakashi 0:8fdf9a60065b 116 {
kadonotakashi 0:8fdf9a60065b 117 int8_t status = -9; // init to unknown error
kadonotakashi 0:8fdf9a60065b 118 tr_debug("connect()");
kadonotakashi 0:8fdf9a60065b 119
kadonotakashi 0:8fdf9a60065b 120 status = nd_tasklet_connect(&__mesh_handler_c_callback, interface_id);
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 if (status >= 0) {
kadonotakashi 0:8fdf9a60065b 123 return MESH_ERROR_NONE;
kadonotakashi 0:8fdf9a60065b 124 } else if (status == -1) {
kadonotakashi 0:8fdf9a60065b 125 return MESH_ERROR_PARAM;
kadonotakashi 0:8fdf9a60065b 126 } else if (status == -2) {
kadonotakashi 0:8fdf9a60065b 127 return MESH_ERROR_MEMORY;
kadonotakashi 0:8fdf9a60065b 128 } else if (status == -3) {
kadonotakashi 0:8fdf9a60065b 129 return MESH_ERROR_STATE;
kadonotakashi 0:8fdf9a60065b 130 } else {
kadonotakashi 0:8fdf9a60065b 131 return MESH_ERROR_UNKNOWN;
kadonotakashi 0:8fdf9a60065b 132 }
kadonotakashi 0:8fdf9a60065b 133 }
kadonotakashi 0:8fdf9a60065b 134
kadonotakashi 0:8fdf9a60065b 135 mesh_error_t Nanostack::LoWPANNDInterface::mesh_disconnect()
kadonotakashi 0:8fdf9a60065b 136 {
kadonotakashi 0:8fdf9a60065b 137 int8_t status = -1;
kadonotakashi 0:8fdf9a60065b 138
kadonotakashi 0:8fdf9a60065b 139 status = nd_tasklet_disconnect(true);
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 if (status >= 0) {
kadonotakashi 0:8fdf9a60065b 142 return MESH_ERROR_NONE;
kadonotakashi 0:8fdf9a60065b 143 }
kadonotakashi 0:8fdf9a60065b 144
kadonotakashi 0:8fdf9a60065b 145 return MESH_ERROR_UNKNOWN;
kadonotakashi 0:8fdf9a60065b 146 }
kadonotakashi 0:8fdf9a60065b 147
kadonotakashi 0:8fdf9a60065b 148 char *Nanostack::LoWPANNDInterface::get_gateway(char *buf, nsapi_size_t buflen)
kadonotakashi 0:8fdf9a60065b 149 {
kadonotakashi 0:8fdf9a60065b 150 NanostackLockGuard lock;
kadonotakashi 0:8fdf9a60065b 151 if (nd_tasklet_get_router_ip_address(buf, buflen) == 0) {
kadonotakashi 0:8fdf9a60065b 152 return buf;
kadonotakashi 0:8fdf9a60065b 153 }
kadonotakashi 0:8fdf9a60065b 154 return NULL;
kadonotakashi 0:8fdf9a60065b 155 }
kadonotakashi 0:8fdf9a60065b 156
kadonotakashi 0:8fdf9a60065b 157 bool LoWPANNDInterface::getRouterIpAddress(char *address, int8_t len)
kadonotakashi 0:8fdf9a60065b 158 {
kadonotakashi 0:8fdf9a60065b 159 return _interface->get_gateway(address, len);
kadonotakashi 0:8fdf9a60065b 160 }
kadonotakashi 0:8fdf9a60065b 161
kadonotakashi 0:8fdf9a60065b 162 #define LOWPAN 0x2345
kadonotakashi 0:8fdf9a60065b 163 #if MBED_CONF_NSAPI_DEFAULT_MESH_TYPE == LOWPAN && DEVICE_802_15_4_PHY
kadonotakashi 0:8fdf9a60065b 164 MBED_WEAK MeshInterface *MeshInterface::get_target_default_instance()
kadonotakashi 0:8fdf9a60065b 165 {
kadonotakashi 0:8fdf9a60065b 166 static LoWPANNDInterface lowpan(&NanostackRfPhy::get_default_instance());
kadonotakashi 0:8fdf9a60065b 167
kadonotakashi 0:8fdf9a60065b 168 return &lowpan;
kadonotakashi 0:8fdf9a60065b 169 }
kadonotakashi 0:8fdf9a60065b 170 #endif