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.
rci_binary_support.h
00001 /* 00002 * Copyright (c) 2013 Digi International Inc., 00003 * All rights not expressly granted are reserved. 00004 * 00005 * This Source Code Form is subject to the terms of the Mozilla Public 00006 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 00007 * You can obtain one at http://mozilla.org/MPL/2.0/. 00008 * 00009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 00010 * ======================================================================= 00011 */ 00012 00013 #include <stdarg.h> 00014 00015 #define BINARY_RCI_ATTRIBUTE_BIT UINT32_C(0x40) /* bit 6 */ 00016 00017 #define BINARY_RCI_NO_VALUE UINT32_C(0xE0) 00018 #define BINARY_RCI_TERMINATOR UINT32_C(0xE1) 00019 00020 #define BINARY_RCI_ERROR_INDICATOR_BIT UINT32_C(0x1000) /* bit 12 */ 00021 00022 #define BINARY_RCI_FIELD_TYPE_INDICATOR_BIT UINT32_C(0x40) /* bit 6 */ 00023 #define BINARY_RCI_FIELD_ATTRIBUTE_BIT UINT32_C(0x400) /* bit 10 */ 00024 /* #define BINARY_RCI_FIELD_ASCENDING_INDICATOR_BIT (0x1 << 6) */ 00025 00026 /* 00027 * 7 6 5 4 3 2 1 0 bit 00028 * 0 X X X X X X X (0 : 0x7F) 00029 * 1 0 0 X X X X X + 1 byte followed (0: 0x1FFF) 00030 * 1 0 1 0 0 0 0 0 + 2 bytes followed (0: 0xFFFF) 00031 * 1 0 1 0 0 0 0 1 + 4 bytes followed (0: 0xFFFFFFFF) 00032 * 1 0 1 0 0 0 1 0 + 8 bytes followed (0: 0xFFFFFFFFFFFFFFFF) 00033 * 1 1 0 0 - - - - Reserved 00034 * 1 1 1 0 0 0 0 0 NONUM (No Value) 00035 * 1 1 1 0 0 0 0 1 TRM (Terminator) 00036 */ 00037 #define BINARY_RCI_SIZE_ALTERNATE_FLAG UINT32_C(0x80) /* bit 7 */ 00038 #define BINARY_RCI_SIZE_MODIFIER_MASK UINT32_C(0x60) /* bits 6:5 */ 00039 #define BINARY_RCI_SIZE_MODIFIER(value) (rci_size_modifier_t)((value & BINARY_RCI_SIZE_MODIFIER_MASK) >> UINT32_C(5)) 00040 00041 typedef enum { 00042 binary_rci_one_follow_byte, 00043 binary_rci_multi_follow_byte, 00044 binary_rci_special_value = 3 00045 } rci_size_modifier_t; 00046 00047 00048 #define BINARY_RCI_MULTI_FOLLOW_BYTE_MASK UINT32_C(0x03) 00049 #define BINARY_RCI_MULTI_FOLLOW_BYTES(value) (value & BINARY_RCI_MULTI_FOLLOW_BYTE_MASK) 00050 #define BINARY_RCI_SET_MULTI_FOLLOW_BYTES(value) (BINARY_RCI_SIZE_ALTERNATE_FLAG | (binary_rci_multi_follow_byte << UINT32_C(5)) |value) 00051 00052 enum { 00053 binary_rci_two_follow_byte, 00054 binary_rci_four_follow_byte, 00055 binary_rci_eight_follow_byte 00056 }; 00057 00058 #define RCI_FLAG_GET_ALL_INSTANCES UINT32_C(0x01) 00059 00060 #define RCI_NO_HINT NULL 00061 #define INVALID_ID UINT_MAX 00062 #define INVALID_INDEX UINT_MAX 00063 #define INVALID_COUNT ((size_t)-1) 00064 00065 #define ROUND_UP(value, interval) ((value) + -(value) % (interval)) 00066 00067 #define UNHANDLED_CASES_ARE_INVALID default: ASSERT(connector_false); break; 00068 00069 static char const nul = '\0'; 00070 00071 enum rci_ber { 00072 field_define(rci_ber, value, uint8_t), 00073 record_end(rci_ber) 00074 }; 00075 00076 enum rci_ber_u8 { 00077 field_define(rci_ber_u8, opcode, uint8_t), 00078 field_define(rci_ber_u8, value, uint8_t), 00079 record_end(rci_ber_u8) 00080 }; 00081 00082 enum rci_ber_u16 { 00083 field_define(rci_ber_u16, opcode, uint8_t), 00084 field_define(rci_ber_u16, value, uint16_t), 00085 record_end(rci_ber_u16) 00086 }; 00087 00088 enum rci_ber_u32 { 00089 field_define(rci_ber_u32, opcode, uint8_t), 00090 field_define(rci_ber_u32, value, uint32_t), 00091 record_end(rci_ber_u32) 00092 }; 00093 00094 00095 enum 00096 { 00097 rci_field_type_none, 00098 rci_field_type_string, 00099 rci_field_type_multiline_string, 00100 rci_field_type_password, 00101 rci_field_type_int23, 00102 rci_field_type_uint32, 00103 rci_field_type_hex32, 00104 rci_field_type_0x_hex32, 00105 rci_field_type_float, 00106 rci_field_type_enum, 00107 rci_field_type_on_off = 0x0B, 00108 rci_field_type_boolean, 00109 rci_field_type_ip4, 00110 rci_field_type_fqdnv4, 00111 rci_field_type_fqdnv6, 00112 rci_field_type_datetime = 0x16 00113 }; 00114 00115 enum { 00116 rci_command_query_setting = 1, 00117 rci_command_set_setting, 00118 rci_command_query_state, 00119 rci_command_set_state 00120 }; 00121 00122 typedef enum 00123 { 00124 rci_session_start, 00125 rci_session_active, 00126 rci_session_lost 00127 } rci_session_t; 00128 00129 typedef enum 00130 { 00131 rci_status_internal_error, /* bad code path */ 00132 rci_status_complete, /* all done */ 00133 rci_status_busy, /* user callback returned busy */ 00134 rci_status_more_input, /* have output buffer space to process more input */ 00135 rci_status_flush_output, /* need more output space, so send out the current buffer */ 00136 rci_status_error /* error occurred, RCI service should inform messaging layer to cancel the session */ 00137 } rci_status_t; 00138 00139 typedef struct 00140 { 00141 uint8_t * data; 00142 size_t bytes; 00143 unsigned int flags; 00144 } rci_service_buffer_t; 00145 00146 typedef struct 00147 { 00148 connector_data_t * connector_ptr; 00149 rci_service_buffer_t input; 00150 rci_service_buffer_t output; 00151 } rci_service_data_t; 00152 00153 typedef struct 00154 { 00155 uint8_t * start; 00156 uint8_t * end; 00157 uint8_t * current; 00158 } rci_buffer_t; 00159 00160 typedef enum 00161 { 00162 rci_parser_state_input, 00163 rci_parser_state_output, 00164 rci_parser_state_traverse, 00165 rci_parser_state_error 00166 } rci_parser_state_t; 00167 00168 00169 typedef enum 00170 { 00171 rci_input_state_command_id, 00172 rci_input_state_command_attribute, 00173 rci_input_state_group_id, 00174 rci_input_state_group_attribute, 00175 rci_input_state_field_id, 00176 rci_input_state_field_type, 00177 rci_input_state_field_no_value, 00178 rci_input_state_field_value, 00179 rci_input_state_done 00180 } rci_input_state_t; 00181 00182 typedef enum 00183 { 00184 rci_output_state_command_id, 00185 rci_output_state_group_id, 00186 rci_output_state_group_attribute, 00187 rci_output_state_field_id, 00188 rci_output_state_field_value, 00189 rci_output_state_field_terminator, 00190 rci_output_state_group_terminator, 00191 rci_output_state_response_done, 00192 rci_output_state_done 00193 } rci_output_state_t; 00194 00195 typedef enum 00196 { 00197 rci_traverse_state_none, 00198 rci_traverse_state_command_id, 00199 rci_traverse_state_group_id, 00200 rci_traverse_state_element_id, 00201 rci_traverse_state_element_end, 00202 rci_traverse_state_group_end, 00203 rci_traverse_state_all_groups, 00204 rci_traverse_state_all_group_instances, 00205 rci_traverse_state_all_elements 00206 } rci_traverse_state_t; 00207 00208 typedef enum 00209 { 00210 rci_traverse_process_group, 00211 rci_traverse_process_element, 00212 rci_traverse_process_next_instance 00213 } rci_traverse_process_state_t; 00214 00215 typedef enum 00216 { 00217 rci_error_state_id, 00218 rci_error_state_description, 00219 rci_error_state_hint, 00220 rci_error_state_callback 00221 } rci_error_state_t; 00222 00223 typedef struct 00224 { 00225 uint8_t * data; 00226 size_t length; 00227 } rcistr_t; 00228 00229 typedef struct 00230 { 00231 rcistr_t name; 00232 rcistr_t value; 00233 } rci_attribute_t; 00234 00235 typedef struct 00236 { 00237 rci_service_data_t * service_data; 00238 rci_status_t status; 00239 struct { 00240 connector_request_id_t request; 00241 connector_callback_status_t status; 00242 } callback; 00243 00244 struct { 00245 rci_buffer_t input; 00246 rci_buffer_t output; 00247 } buffer; 00248 00249 struct { 00250 rci_parser_state_t state; 00251 } parser; 00252 00253 struct { 00254 rci_traverse_state_t state; 00255 rci_traverse_process_state_t process_state; 00256 } traverse; 00257 00258 struct { 00259 rci_input_state_t state; 00260 unsigned int flag; 00261 uint8_t * destination; 00262 uint8_t storage[CONNECTOR_RCI_MAXIMUM_CONTENT_LENGTH + sizeof nul + sizeof(uint32_t)]; 00263 } input; 00264 00265 struct { 00266 rcistr_t content; 00267 rci_output_state_t state; 00268 } output; 00269 00270 struct { 00271 rci_error_state_t state; 00272 connector_bool_t command_error; 00273 char const * description; 00274 } error; 00275 00276 struct { 00277 rcistr_t content; 00278 00279 struct { 00280 unsigned int id; 00281 unsigned int index; 00282 } group; 00283 00284 struct { 00285 unsigned int id; 00286 } element; 00287 00288 connector_element_value_t value; 00289 size_t string_value_length; 00290 00291 connector_remote_config_t callback_data; 00292 } shared; 00293 } rci_t; 00294 00295 #define set_rci_input_flag(rci, value) (rci)->input.flag |= (value) 00296 #define is_rci_input_flag(rci, value) (((rci)->input.flag & (value)) == (value)) 00297 #define clea_rci_input_flag(rci, value) (rci)->input.flag &= ~(value) 00298 00299 #define set_rci_input_state(rci, value) (rci)->input.state = (value) 00300 #define get_rci_input_state(rci) (rci)->input.state 00301 00302 #define set_rci_traverse_state(rci, value) (rci)->traverse.state = (value) 00303 #define get_rci_traverse_state(rci) (rci)->traverse.state 00304 00305 #define set_rci_output_state(rci, value) (rci)->output.state = (value) 00306 #define get_rci_output_state(rci) (rci)->output.state 00307 00308 #define set_rci_error_state(rci, value) (rci)->error.state = (value); 00309 #define get_rci_error_state(rci) (rci)->error.state; 00310 00311 #define set_rci_command_error(rci) (rci)->error.command_error = connector_true; 00312 #define clear_rci_command_error(rci) (rci)->error.command_error = connector_false; 00313 00314
Generated on Tue Jul 12 2022 19:18:38 by
1.7.2