int8_t thread_tasklet_connect(mesh_interface_cb callback, int8_t nwk_interface_id) { int8_t re_connecting = true; int8_t tasklet = thread_tasklet_data_ptr->tasklet; if (thread_tasklet_data_ptr->nwk_if_id != INVALID_INTERFACE_ID) { return -3; // already connected to network } if (thread_tasklet_data_ptr->tasklet_state == TASKLET_STATE_CREATED) { re_connecting = false; } memset(thread_tasklet_data_ptr, 0, sizeof(thread_tasklet_data_str_t)); thread_tasklet_data_ptr->mesh_api_cb = callback; thread_tasklet_data_ptr->nwk_if_id = nwk_interface_id; thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_INITIALIZED; thread_tasklet_data_ptr->poll_network_status_timeout = eventOS_timeout_every_ms(thread_tasklet_poll_network_status, 2000, NULL); if (re_connecting == false) { thread_tasklet_data_ptr->tasklet = eventOS_event_handler_create(&thread_tasklet_main, ARM_LIB_TASKLET_INIT_EVENT); if (thread_tasklet_data_ptr->tasklet < 0) { // -1 handler already used by other tasklet // -2 memory allocation failure return thread_tasklet_data_ptr->tasklet; } } else { thread_tasklet_data_ptr->tasklet = tasklet; mesh_system_send_connect_event(thread_tasklet_data_ptr->tasklet); } return thread_tasklet_data_ptr->tasklet; }
/* * \brief A function which will be eventually called by NanoStack OS when ever the OS has an event to deliver. * @param event, describes the sender, receiver and event type. * * NOTE: Interrupts requested by HW are possible during this function! */ void thread_tasklet_main(arm_event_s *event) { arm_library_event_type_e event_type; event_type = (arm_library_event_type_e) event->event_type; switch (event_type) { case ARM_LIB_NWK_INTERFACE_EVENT: /* This event is delivered every and each time when there is new * information of network connectivity. */ thread_tasklet_parse_network_event(event); break; case ARM_LIB_TASKLET_INIT_EVENT: /* Event with type EV_INIT is an initializer event of NanoStack OS. * The event is delivered when the NanoStack OS is running fine. * This event should be delivered ONLY ONCE. */ mesh_system_send_connect_event(thread_tasklet_data_ptr->tasklet); break; case ARM_LIB_SYSTEM_TIMER_EVENT: eventOS_event_timer_cancel(event->event_id, thread_tasklet_data_ptr->tasklet); if (event->event_id == TIMER_EVENT_START_BOOTSTRAP) { int8_t status; tr_debug("Restart bootstrap"); status = arm_nwk_interface_up(thread_tasklet_data_ptr->nwk_if_id); if (status >= 0) { thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_STARTED; tr_info("Start Thread bootstrap (%s mode)", thread_tasklet_data_ptr->operating_mode == NET_6LOWPAN_SLEEPY_HOST ? "SED" : "Router"); thread_tasklet_network_state_changed(MESH_BOOTSTRAP_STARTED); } else { thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED; tr_err("Bootstrap start failed, %d", status); thread_tasklet_network_state_changed(MESH_BOOTSTRAP_START_FAILED); } } break; case APPLICATION_EVENT: if (event->event_id == APPL_EVENT_CONNECT) { thread_tasklet_configure_and_connect_to_network(); } break; default: break; } // switch(event_type) }
/* * \brief A function which will be eventually called by NanoStack OS when ever the OS has an event to deliver. * @param event, describes the sender, receiver and event type. * * NOTE: Interrupts requested by HW are possible during this function! */ void nd_tasklet_main(arm_event_s *event) { arm_library_event_type_e event_type; event_type = (arm_library_event_type_e) event->event_type; switch (event_type) { case ARM_LIB_NWK_INTERFACE_EVENT: /* This event is delivered every and each time when there is new * information of network connectivity. */ nd_tasklet_parse_network_event(event); break; case ARM_LIB_TASKLET_INIT_EVENT: /* Event with type EV_INIT is an initializer event of NanoStack OS. * The event is delivered when the NanoStack OS is running fine. * This event should be delivered ONLY ONCE. */ tasklet_data_ptr->node_main_tasklet_id = event->receiver; mesh_system_send_connect_event(tasklet_data_ptr->tasklet); break; case ARM_LIB_SYSTEM_TIMER_EVENT: eventOS_event_timer_cancel(event->event_id, tasklet_data_ptr->node_main_tasklet_id); if (event->event_id == TIMER_EVENT_START_BOOTSTRAP) { tr_debug("Restart bootstrap"); nd_tasklet_configure_and_connect_to_network(); } break; case APPLICATION_EVENT: if (event->event_id == APPL_EVENT_CONNECT) { nd_tasklet_configure_and_connect_to_network(); } break; default: break; } // switch(event_type) }
int8_t nd_tasklet_connect(mesh_interface_cb callback, int8_t nwk_interface_id) { int8_t re_connecting = true; int8_t tasklet_id = tasklet_data_ptr->tasklet; if (tasklet_data_ptr->network_interface_id != INVALID_INTERFACE_ID) { return -3; // already connected to network } if (tasklet_data_ptr->tasklet_state == TASKLET_STATE_CREATED) { re_connecting = false; } memset(tasklet_data_ptr, 0, sizeof(tasklet_data_str_t)); tasklet_data_ptr->mesh_api_cb = callback; tasklet_data_ptr->network_interface_id = nwk_interface_id; tasklet_data_ptr->tasklet_state = TASKLET_STATE_INITIALIZED; tasklet_data_ptr->mode = MBED_CONF_MBED_MESH_API_6LOWPAN_ND_DEVICE_TYPE; tasklet_data_ptr->sec_mode = NET_SEC_MODE_NO_LINK_SECURITY; //tasklet_data_ptr->psk_sec_info.key_id = 0; if (re_connecting == false) { tasklet_data_ptr->tasklet = eventOS_event_handler_create(&nd_tasklet_main, ARM_LIB_TASKLET_INIT_EVENT); if (tasklet_data_ptr->tasklet < 0) { // -1 handler already used by other tasklet // -2 memory allocation failure return tasklet_data_ptr->tasklet; } #ifndef YOTTA_CFG ns_event_loop_thread_start(); #endif } else { tasklet_data_ptr->tasklet = tasklet_id; mesh_system_send_connect_event(tasklet_data_ptr->tasklet); } return tasklet_data_ptr->tasklet; }
int8_t nd_tasklet_connect(mesh_interface_cb callback, int8_t nwk_interface_id) { int8_t re_connecting = true; int8_t tasklet_id = tasklet_data_ptr->tasklet; if (tasklet_data_ptr->network_interface_id != INVALID_INTERFACE_ID) { return -3; // already connected to network } if (tasklet_data_ptr->tasklet_state == TASKLET_STATE_CREATED) { re_connecting = false; } memset(tasklet_data_ptr, 0, sizeof(tasklet_data_str_t)); tasklet_data_ptr->mesh_api_cb = callback; tasklet_data_ptr->network_interface_id = nwk_interface_id; tasklet_data_ptr->tasklet_state = TASKLET_STATE_INITIALIZED; //TODO: Fetch these values from device config api tasklet_data_ptr->mode = NET_6LOWPAN_ROUTER; tasklet_data_ptr->sec_mode = NET_SEC_MODE_NO_LINK_SECURITY; //tasklet_data_ptr->psk_sec_info.key_id = 0; if (re_connecting == false) { tasklet_data_ptr->tasklet = eventOS_event_handler_create(&nd_tasklet_main, ARM_LIB_TASKLET_INIT_EVENT); if (tasklet_data_ptr->tasklet < 0) { // -1 handler already used by other tasklet // -2 memory allocation failure return tasklet_data_ptr->tasklet; } } else { tasklet_data_ptr->tasklet = tasklet_id; mesh_system_send_connect_event(tasklet_data_ptr->tasklet); } return tasklet_data_ptr->tasklet; }