void sml_proc_par_value_write(sml_proc_par_value *value, sml_buffer *buf) { if (value == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2); sml_u8_write(value->tag, buf); switch (*(value->tag)) { case SML_PROC_PAR_VALUE_TAG_VALUE: sml_value_write(value->data.value, buf); break; case SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY: sml_period_entry_write(value->data.period_entry, buf); break; case SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY: sml_tupel_entry_write(value->data.tupel_entry, buf); break; case SML_PROC_PAR_VALUE_TAG_TIME: sml_time_write(value->data.time, buf); break; default: printf("error: unknown tag in %s\n", __FUNCTION__); } }
static void sml_value_entry_write_( void * p, sml_buffer *buf) { sml_value_entry * entry = p; sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2); sml_value_write(entry->value, buf); sml_signature_write(entry->value_signature, buf); }
void sml_set_proc_parameter_request_write(sml_set_proc_parameter_request *msg, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 5); sml_octet_string_write(msg->server_id, buf); sml_octet_string_write(msg->username, buf); sml_octet_string_write(msg->password, buf); sml_tree_path_write(msg->parameter_tree_path, buf); sml_tree_write(msg->parameter_tree, buf); }
void sml_attention_response_write(sml_attention_response *msg, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 4); sml_octet_string_write(msg->server_id, buf); sml_octet_string_write(msg->attention_number, buf); sml_octet_string_write(msg->attention_message, buf); sml_tree_write(msg->attention_details, buf); }
static void sml_prof_obj_header_entry_write_( void * p, sml_buffer *buf) { sml_prof_obj_header_entry * entry = p; sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 3); sml_octet_string_write(entry->obj_name, buf); sml_unit_write(entry->unit, buf); sml_i8_write(entry->scaler, buf); }
static void sml_prof_obj_period_entry_write_( void * p, sml_buffer *buf) { sml_prof_obj_period_entry * entry = p; sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 4); sml_time_write(entry->val_time, buf); sml_u64_write(entry->status, buf); sml_sequence_write(entry->value_list, buf, sml_value_entry_write_); sml_signature_write(entry->period_signature, buf); }
sml_time *sml_time_init() { sml_time *t = (sml_time *) malloc(sizeof(sml_time)); *t = ( sml_time ) { .tag = NULL, .data.sec_index = NULL }; return t; } sml_time *sml_time_parse(sml_buffer *buf) { if (sml_buf_optional_is_skipped(buf)) { return 0; } sml_time *tme = sml_time_init(); if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) { buf->error = 1; goto error; } if (sml_buf_get_next_length(buf) != 2) { buf->error = 1; goto error; } tme->tag = sml_u8_parse(buf); if (sml_buf_has_errors(buf)) goto error; tme->data.timestamp = sml_u32_parse(buf); if (sml_buf_has_errors(buf)) goto error; return tme; error: sml_time_free(tme); return 0; } void sml_time_write(sml_time *t, sml_buffer *buf) { if (t == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2); sml_u8_write(t->tag, buf); sml_u32_write(t->data.timestamp, buf); } void sml_time_free(sml_time *tme) { if (tme) { sml_number_free(tme->tag); sml_number_free(tme->data.timestamp); free(tme); } }
void sml_time_write(sml_time *t, sml_buffer *buf) { if (t == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2); sml_u8_write(t->tag, buf); sml_u32_write(t->data.timestamp, buf); }
void sml_open_response_write(sml_open_response *msg, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 6); sml_octet_string_write(msg->codepage, buf); sml_octet_string_write(msg->client_id, buf); sml_octet_string_write(msg->req_file_id, buf); sml_octet_string_write(msg->server_id, buf); sml_time_write(msg->ref_time, buf); sml_u8_write(msg->sml_version, buf); }
void sml_open_request_write(sml_open_request *msg, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 7); sml_octet_string_write(msg->codepage, buf); sml_octet_string_write(msg->client_id, buf); sml_octet_string_write(msg->req_file_id, buf); sml_octet_string_write(msg->server_id, buf); sml_octet_string_write(msg->username,buf); sml_octet_string_write(msg->password,buf); sml_u8_write(msg->sml_version, buf); }
void sml_get_profile_pack_response_write(sml_get_profile_pack_response *msg, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 8); sml_octet_string_write(msg->server_id, buf); sml_time_write(msg->act_time, buf); sml_u32_write(msg->reg_period, buf); sml_tree_path_write(msg->parameter_tree_path, buf); sml_sequence_write(msg->header_list, buf, sml_prof_obj_header_entry_write_); sml_sequence_write(msg->period_list, buf, sml_prof_obj_period_entry_write_); sml_octet_string_write(msg->rawdata, buf); sml_signature_write(msg->profile_signature, buf); }
void sml_message_body_write(sml_message_body *message_body, sml_buffer *buf) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2); sml_u16_write(message_body->tag, buf); switch (*(message_body->tag)) { case SML_MESSAGE_OPEN_REQUEST: sml_open_request_write((sml_open_request *) message_body->data, buf); break; case SML_MESSAGE_OPEN_RESPONSE: sml_open_response_write((sml_open_response *) message_body->data, buf); break; case SML_MESSAGE_CLOSE_REQUEST: sml_close_request_write((sml_close_request *) message_body->data, buf); break; case SML_MESSAGE_CLOSE_RESPONSE: sml_close_response_write((sml_close_response *) message_body->data, buf); break; case SML_MESSAGE_GET_PROFILE_PACK_REQUEST: sml_get_profile_pack_request_write((sml_get_profile_pack_request *) message_body->data, buf); break; case SML_MESSAGE_GET_PROFILE_PACK_RESPONSE: sml_get_profile_pack_response_write((sml_get_profile_pack_response *) message_body->data, buf); break; case SML_MESSAGE_GET_PROFILE_LIST_REQUEST: sml_get_profile_list_request_write((sml_get_profile_list_request *) message_body->data, buf); break; case SML_MESSAGE_GET_PROFILE_LIST_RESPONSE: sml_get_profile_list_response_write((sml_get_profile_list_response *) message_body->data, buf); break; case SML_MESSAGE_GET_PROC_PARAMETER_REQUEST: sml_get_proc_parameter_request_write((sml_get_proc_parameter_request *) message_body->data, buf); break; case SML_MESSAGE_GET_PROC_PARAMETER_RESPONSE: sml_get_proc_parameter_response_write((sml_get_proc_parameter_response *) message_body->data, buf); break; case SML_MESSAGE_SET_PROC_PARAMETER_REQUEST: sml_set_proc_parameter_request_write((sml_set_proc_parameter_request *) message_body->data, buf); break; case SML_MESSAGE_GET_LIST_REQUEST: sml_get_list_request_write((sml_get_list_request *)message_body->data, buf); break; case SML_MESSAGE_GET_LIST_RESPONSE: sml_get_list_response_write((sml_get_list_response *) message_body->data, buf); break; case SML_MESSAGE_ATTENTION_RESPONSE: sml_attention_response_write((sml_attention_response *) message_body->data, buf); break; default: printf("error: message type %04X not yet implemented\n", *(message_body->tag)); break; } }
void sml_period_entry_write(sml_period_entry *period, sml_buffer *buf) { if (period == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 5); sml_octet_string_write(period->obj_name, buf); sml_unit_write(period->unit, buf); sml_i8_write(period->scaler, buf); sml_value_write(period->value, buf); sml_octet_string_write(period->value_signature, buf); }
void sml_tree_write(sml_tree *tree, sml_buffer *buf) { if (tree == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 3); sml_octet_string_write(tree->parameter_name, buf); sml_proc_par_value_write(tree->parameter_value, buf); if (tree->child_list && tree->child_list_len > 0) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, tree->child_list_len); int i; for (i = 0; i < tree->child_list_len; i++) { sml_tree_write(tree->child_list[i], buf); } } else { sml_buf_optional_write(buf); } }
void sml_boolean_write(sml_boolean *boolean, sml_buffer *buf) { if (boolean == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_BOOLEAN, 1); if (*boolean == SML_BOOLEAN_FALSE) { buf->buffer[buf->cursor] = SML_BOOLEAN_FALSE; } else { buf->buffer[buf->cursor] = SML_BOOLEAN_TRUE; } buf->cursor++; }
void sml_tree_path_write(sml_tree_path *tree_path, sml_buffer *buf) { if (tree_path == 0) { sml_buf_optional_write(buf); return; } if (tree_path->path_entries && tree_path->path_entries_len > 0) { sml_buf_set_type_and_length(buf, SML_TYPE_LIST, tree_path->path_entries_len); int i; for (i = 0; i < tree_path->path_entries_len; i++) { sml_octet_string_write(tree_path->path_entries[i], buf); } } }
void sml_message_write(sml_message *msg, sml_buffer *buf) { int msg_start = buf->cursor; sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 6); sml_octet_string_write(msg->transaction_id, buf); sml_u8_write(msg->group_id, buf); sml_u8_write(msg->abort_on_error, buf); sml_message_body_write(msg->message_body, buf); msg->crc = sml_u16_init(sml_crc16_calculate(&(buf->buffer[msg_start]), buf->cursor - msg_start)); sml_u16_write(msg->crc, buf); // end of message buf->buffer[buf->cursor] = 0x0; buf->cursor++; }
void sml_tupel_entry_write(sml_tupel_entry *tupel, sml_buffer *buf) { if (tupel == 0) { sml_buf_optional_write(buf); return; } sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 23); sml_octet_string_write(tupel->server_id, buf); sml_time_write(tupel->sec_index, buf); sml_u64_write(tupel->status, buf); sml_unit_write(tupel->unit_pA, buf); sml_i8_write(tupel->scaler_pA, buf); sml_i64_write(tupel->value_pA, buf); sml_unit_write(tupel->unit_R1, buf); sml_i8_write(tupel->scaler_R1, buf); sml_i64_write(tupel->value_R1, buf); sml_unit_write(tupel->unit_R4, buf); sml_i8_write(tupel->scaler_R4, buf); sml_i64_write(tupel->value_R4, buf); sml_octet_string_write(tupel->signature_pA_R1_R4, buf); sml_unit_write(tupel->unit_mA, buf); sml_i8_write(tupel->scaler_mA, buf); sml_i64_write(tupel->value_mA, buf); sml_unit_write(tupel->unit_R2, buf); sml_i8_write(tupel->scaler_R2, buf); sml_i64_write(tupel->value_R2, buf); sml_unit_write(tupel->unit_R3, buf); sml_i8_write(tupel->scaler_R3, buf); sml_i64_write(tupel->value_R3, buf); sml_octet_string_write(tupel->signature_mA_R2_R3, buf); }