Sebastián Pastor / EtheriosCloudConnector
Committer:
spastor
Date:
Tue Dec 03 14:10:48 2013 +0000
Revision:
1:908afea5a49d
Parent:
0:1c358ea10753
Use internal Thread.h instead of Threads.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spastor 0:1c358ea10753 1 /*
spastor 0:1c358ea10753 2 * Copyright (c) 2013 Digi International Inc.,
spastor 0:1c358ea10753 3 * All rights not expressly granted are reserved.
spastor 0:1c358ea10753 4 *
spastor 0:1c358ea10753 5 * This Source Code Form is subject to the terms of the Mozilla Public
spastor 0:1c358ea10753 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
spastor 0:1c358ea10753 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
spastor 0:1c358ea10753 8 *
spastor 0:1c358ea10753 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
spastor 0:1c358ea10753 10 * =======================================================================
spastor 0:1c358ea10753 11 */
spastor 0:1c358ea10753 12
spastor 0:1c358ea10753 13 #define edp_set_active_state(connector_ptr, value) (connector_ptr)->edp_data.state.active = (value)
spastor 0:1c358ea10753 14 #define edp_get_active_state(connector_ptr) (connector_ptr)->edp_data.state.active
spastor 0:1c358ea10753 15
spastor 0:1c358ea10753 16 #define edp_set_initiate_state(connector_ptr, value) (connector_ptr)->edp_data.state.initiate = (value)
spastor 0:1c358ea10753 17 #define edp_get_initiate_state(connector_ptr) (connector_ptr)->edp_data.state.initiate
spastor 0:1c358ea10753 18
spastor 0:1c358ea10753 19 /* #define edp_get_error(connector_ptr) (connector_ptr)->edp_data.error_code
spastor 0:1c358ea10753 20 #define edp_set_error(connector_ptr, error) (connector_ptr)->edp_data.error_code = (error) */
spastor 0:1c358ea10753 21
spastor 0:1c358ea10753 22 #define edp_get_edp_state(connector_ptr) (connector_ptr)->edp_data.state.edp
spastor 0:1c358ea10753 23 #define edp_set_edp_state(connector_ptr, value) (connector_ptr)->edp_data.state.edp = (value)
spastor 0:1c358ea10753 24
spastor 0:1c358ea10753 25 #define edp_get_close_status(connector_ptr) (connector_ptr)->edp_data.close_status
spastor 0:1c358ea10753 26 #define edp_set_close_status(connector_ptr, value) (connector_ptr)->edp_data.close_status = (value)
spastor 0:1c358ea10753 27
spastor 0:1c358ea10753 28 #define edp_set_stop_condition(connector_ptr, value) (connector_ptr)->edp_data.stop.condition = (value)
spastor 0:1c358ea10753 29 #define edp_is_stop_immediately(connector_ptr) connector_bool((connector_ptr)->edp_data.stop.condition == connector_stop_immediately)
spastor 0:1c358ea10753 30 #define edp_is_stop_request(connector_ptr) connector_bool((connector_ptr)->edp_data.stop.is_set == connector_true)
spastor 0:1c358ea10753 31 #define edp_set_stop_request(connector_ptr, context) (connector_ptr)->edp_data.stop.is_set = connector_true; (connector_ptr)->edp_data.stop.user_context = (context)
spastor 0:1c358ea10753 32 #define edp_clear_stop_request(connector_ptr) (connector_ptr)->edp_data.stop.is_set = connector_false
spastor 0:1c358ea10753 33
spastor 0:1c358ea10753 34 static void edp_reset_initial_data(connector_data_t * const connector_ptr)
spastor 0:1c358ea10753 35 {
spastor 0:1c358ea10753 36 edp_set_edp_state(connector_ptr, edp_communication_connect_to_cloud);
spastor 0:1c358ea10753 37
spastor 0:1c358ea10753 38 connector_ptr->edp_data.facilities.current = NULL;
spastor 0:1c358ea10753 39 connector_ptr->edp_data.keepalive.last_rx_sent_time = 0;
spastor 0:1c358ea10753 40 connector_ptr->edp_data.keepalive.last_tx_received_time = 0;
spastor 0:1c358ea10753 41 connector_ptr->edp_data.keepalive.miss_tx_count = 0;
spastor 0:1c358ea10753 42
spastor 0:1c358ea10753 43 connector_ptr->edp_data.send_packet.total_length = 0;
spastor 0:1c358ea10753 44 connector_ptr->edp_data.send_packet.bytes_sent = 0;
spastor 0:1c358ea10753 45 connector_ptr->edp_data.send_packet.ptr = NULL;
spastor 0:1c358ea10753 46 connector_ptr->edp_data.send_packet.complete_cb = NULL;
spastor 0:1c358ea10753 47
spastor 0:1c358ea10753 48 connector_ptr->edp_data.receive_packet.total_length = 0;
spastor 0:1c358ea10753 49 connector_ptr->edp_data.receive_packet.bytes_received = 0;
spastor 0:1c358ea10753 50 connector_ptr->edp_data.receive_packet.index = 0;
spastor 0:1c358ea10753 51 connector_ptr->edp_data.receive_packet.ptr = NULL;
spastor 0:1c358ea10753 52 connector_ptr->edp_data.receive_packet.data_packet = NULL;
spastor 0:1c358ea10753 53 connector_ptr->edp_data.receive_packet.timeout = MAX_RECEIVE_TIMEOUT_IN_SECONDS;
spastor 0:1c358ea10753 54 connector_ptr->edp_data.close_status = (connector_close_status_t)0;
spastor 0:1c358ea10753 55
spastor 0:1c358ea10753 56 edp_set_stop_condition(connector_ptr, connector_stop_immediately);
spastor 0:1c358ea10753 57
spastor 0:1c358ea10753 58 }
spastor 0:1c358ea10753 59
spastor 0:1c358ea10753 60 static connector_bool_t is_valid_timing_limit(connector_data_t * const connector_ptr, unsigned long const start, unsigned long const limit)
spastor 0:1c358ea10753 61 {
spastor 0:1c358ea10753 62 unsigned long elapsed = start;
spastor 0:1c358ea10753 63 connector_bool_t rc = connector_false;
spastor 0:1c358ea10753 64
spastor 0:1c358ea10753 65 if (get_system_time(connector_ptr, &elapsed) == connector_working)
spastor 0:1c358ea10753 66 {
spastor 0:1c358ea10753 67 elapsed -= start;
spastor 0:1c358ea10753 68 rc = (elapsed < limit) ? connector_true : connector_false;
spastor 0:1c358ea10753 69 }
spastor 0:1c358ea10753 70
spastor 0:1c358ea10753 71 return rc;
spastor 0:1c358ea10753 72 }
spastor 0:1c358ea10753 73
spastor 0:1c358ea10753 74 static void * get_facility_data(connector_data_t * const connector_ptr, uint16_t const facility_num)
spastor 0:1c358ea10753 75 {
spastor 0:1c358ea10753 76 connector_facility_t * fac_ptr;
spastor 0:1c358ea10753 77 void * ptr = NULL;
spastor 0:1c358ea10753 78
spastor 0:1c358ea10753 79 /* search and return the facility data which allocated from add_facility_data() */
spastor 0:1c358ea10753 80 for (fac_ptr = connector_ptr->edp_data.facilities.list; fac_ptr != NULL; fac_ptr = fac_ptr->next)
spastor 0:1c358ea10753 81 {
spastor 0:1c358ea10753 82 if (fac_ptr->facility_num == facility_num)
spastor 0:1c358ea10753 83 {
spastor 0:1c358ea10753 84 ptr = fac_ptr->facility_data;
spastor 0:1c358ea10753 85 break;
spastor 0:1c358ea10753 86 }
spastor 0:1c358ea10753 87 }
spastor 0:1c358ea10753 88
spastor 0:1c358ea10753 89 return ptr;
spastor 0:1c358ea10753 90 }
spastor 0:1c358ea10753 91
spastor 0:1c358ea10753 92 static connector_static_buffer_id_t get_facility_buffer_id(uint16_t const facility_num)
spastor 0:1c358ea10753 93 {
spastor 0:1c358ea10753 94 connector_static_buffer_id_t id;
spastor 0:1c358ea10753 95
spastor 0:1c358ea10753 96 switch(facility_num)
spastor 0:1c358ea10753 97 {
spastor 0:1c358ea10753 98 case E_MSG_FAC_CC_NUM:
spastor 0:1c358ea10753 99 id = named_buffer_id(cc_facility);
spastor 0:1c358ea10753 100 break;
spastor 0:1c358ea10753 101 case E_MSG_FAC_FW_NUM:
spastor 0:1c358ea10753 102 id = named_buffer_id(fw_facility);
spastor 0:1c358ea10753 103 break;
spastor 0:1c358ea10753 104 case E_MSG_FAC_MSG_NUM:
spastor 0:1c358ea10753 105 id = named_buffer_id(msg_facility);
spastor 0:1c358ea10753 106 break;
spastor 0:1c358ea10753 107 default:
spastor 0:1c358ea10753 108 id = named_buffer_id(none);
spastor 0:1c358ea10753 109 }
spastor 0:1c358ea10753 110 return id;
spastor 0:1c358ea10753 111 }
spastor 0:1c358ea10753 112
spastor 0:1c358ea10753 113 static connector_status_t add_facility_data(connector_data_t * const connector_ptr, unsigned int const service_index,
spastor 0:1c358ea10753 114 uint16_t const facility_num, void ** fac_ptr, size_t const size)
spastor 0:1c358ea10753 115 {
spastor 0:1c358ea10753 116 connector_status_t status;
spastor 0:1c358ea10753 117 connector_facility_t * facility;
spastor 0:1c358ea10753 118 void * ptr;
spastor 0:1c358ea10753 119 size_t const facility_size = sizeof *facility;
spastor 0:1c358ea10753 120
spastor 0:1c358ea10753 121 /* allocate facility data and buffer*/
spastor 0:1c358ea10753 122
spastor 0:1c358ea10753 123 *fac_ptr = NULL;
spastor 0:1c358ea10753 124 status = malloc_data_buffer(connector_ptr, size + facility_size, get_facility_buffer_id(facility_num), &ptr);
spastor 0:1c358ea10753 125 if (status == connector_working)
spastor 0:1c358ea10753 126 {
spastor 0:1c358ea10753 127 /* add facility to the facility list */
spastor 0:1c358ea10753 128 facility = ptr;
spastor 0:1c358ea10753 129 facility->facility_num = facility_num;
spastor 0:1c358ea10753 130 facility->size = size;
spastor 0:1c358ea10753 131 facility->service_index = service_index;
spastor 0:1c358ea10753 132
spastor 0:1c358ea10753 133 add_node(&connector_ptr->edp_data.facilities.list, facility);
spastor 0:1c358ea10753 134
spastor 0:1c358ea10753 135 /* setup facility data which is at the end of connector_facility_t */
spastor 0:1c358ea10753 136 facility->facility_data = facility + 1;
spastor 0:1c358ea10753 137 *fac_ptr = facility->facility_data;
spastor 0:1c358ea10753 138 }
spastor 0:1c358ea10753 139
spastor 0:1c358ea10753 140 return status;
spastor 0:1c358ea10753 141 }
spastor 0:1c358ea10753 142
spastor 0:1c358ea10753 143 static connector_status_t del_facility_data(connector_data_t * const connector_ptr, uint16_t const facility_num)
spastor 0:1c358ea10753 144 {
spastor 0:1c358ea10753 145 connector_status_t status = connector_working;
spastor 0:1c358ea10753 146 connector_facility_t * fac_ptr;
spastor 0:1c358ea10753 147
spastor 0:1c358ea10753 148 /* find and free the facility */
spastor 0:1c358ea10753 149 for (fac_ptr = connector_ptr->edp_data.facilities.list; fac_ptr != NULL; fac_ptr = fac_ptr->next)
spastor 0:1c358ea10753 150 {
spastor 0:1c358ea10753 151 if (fac_ptr->facility_num == facility_num)
spastor 0:1c358ea10753 152 {
spastor 0:1c358ea10753 153
spastor 0:1c358ea10753 154 remove_node(&connector_ptr->edp_data.facilities.list, fac_ptr);
spastor 0:1c358ea10753 155 /* Ignore the return status. Just continue freeing next facility */
spastor 0:1c358ea10753 156 free_data_buffer(connector_ptr, get_facility_buffer_id(facility_num), fac_ptr);
spastor 0:1c358ea10753 157 break;
spastor 0:1c358ea10753 158 }
spastor 0:1c358ea10753 159 }
spastor 0:1c358ea10753 160 return status;
spastor 0:1c358ea10753 161 }
spastor 0:1c358ea10753 162
spastor 0:1c358ea10753 163 static connector_status_t notify_status(connector_callback_t const callback, connector_tcp_status_t const status)
spastor 0:1c358ea10753 164 {
spastor 0:1c358ea10753 165 connector_status_t result;
spastor 0:1c358ea10753 166 connector_request_id_t request_id;
spastor 0:1c358ea10753 167 connector_status_tcp_event_t tcp_event;
spastor 0:1c358ea10753 168
spastor 0:1c358ea10753 169 tcp_event.status = status;
spastor 0:1c358ea10753 170
spastor 0:1c358ea10753 171 request_id.status_request = connector_request_id_status_tcp;
spastor 0:1c358ea10753 172
spastor 0:1c358ea10753 173 {
spastor 0:1c358ea10753 174 connector_callback_status_t const callback_status = connector_callback(callback, connector_class_id_status, request_id, &tcp_event);
spastor 0:1c358ea10753 175
spastor 0:1c358ea10753 176 switch (callback_status)
spastor 0:1c358ea10753 177 {
spastor 0:1c358ea10753 178 case connector_callback_continue:
spastor 0:1c358ea10753 179 case connector_callback_unrecognized:
spastor 0:1c358ea10753 180 result = connector_working;
spastor 0:1c358ea10753 181 break;
spastor 0:1c358ea10753 182 default:
spastor 0:1c358ea10753 183 result = connector_abort;
spastor 0:1c358ea10753 184 break;
spastor 0:1c358ea10753 185 }
spastor 0:1c358ea10753 186 }
spastor 0:1c358ea10753 187
spastor 0:1c358ea10753 188 return result;
spastor 0:1c358ea10753 189 }
spastor 0:1c358ea10753 190
spastor 0:1c358ea10753 191 static void edp_get_device_cloud(connector_data_t * const connector_ptr)
spastor 0:1c358ea10753 192 {
spastor 0:1c358ea10753 193 memcpy(connector_ptr->edp_data.config.cloud_url, connector_ptr->device_cloud_url, connector_ptr->device_cloud_url_length);
spastor 0:1c358ea10753 194 connector_ptr->edp_data.config.cloud_url[connector_ptr->device_cloud_url_length] = 0x0;
spastor 0:1c358ea10753 195 connector_ptr->edp_data.config.cloud_url_length = connector_ptr->device_cloud_url_length;
spastor 0:1c358ea10753 196 }
spastor 0:1c358ea10753 197
spastor 0:1c358ea10753 198