FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:35:07 2017 +0000
Revision:
0:a2cb7295a1f7
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:a2cb7295a1f7 1 /*
ram54288 0:a2cb7295a1f7 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
ram54288 0:a2cb7295a1f7 3 * SPDX-License-Identifier: Apache-2.0
ram54288 0:a2cb7295a1f7 4 * Licensed under the Apache License, Version 2.0 (the License); you may
ram54288 0:a2cb7295a1f7 5 * not use this file except in compliance with the License.
ram54288 0:a2cb7295a1f7 6 * You may obtain a copy of the License at
ram54288 0:a2cb7295a1f7 7 *
ram54288 0:a2cb7295a1f7 8 * http://www.apache.org/licenses/LICENSE-2.0
ram54288 0:a2cb7295a1f7 9 *
ram54288 0:a2cb7295a1f7 10 * Unless required by applicable law or agreed to in writing, software
ram54288 0:a2cb7295a1f7 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
ram54288 0:a2cb7295a1f7 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ram54288 0:a2cb7295a1f7 13 * See the License for the specific language governing permissions and
ram54288 0:a2cb7295a1f7 14 * limitations under the License.
ram54288 0:a2cb7295a1f7 15 */
ram54288 0:a2cb7295a1f7 16 #include "mbed-client/m2mblockmessage.h"
ram54288 0:a2cb7295a1f7 17 #include "mbed-client/m2mconfig.h"
ram54288 0:a2cb7295a1f7 18 #include <stdlib.h>
ram54288 0:a2cb7295a1f7 19 #include <string.h>
ram54288 0:a2cb7295a1f7 20
ram54288 0:a2cb7295a1f7 21 M2MBlockMessage::M2MBlockMessage() :
ram54288 0:a2cb7295a1f7 22 _block_data_ptr(NULL),
ram54288 0:a2cb7295a1f7 23 _total_message_size(0),
ram54288 0:a2cb7295a1f7 24 _block_data_len(0),
ram54288 0:a2cb7295a1f7 25 _block_number(0),
ram54288 0:a2cb7295a1f7 26 _error_code(M2MBlockMessage::ErrorNone),
ram54288 0:a2cb7295a1f7 27 _is_last_block(false),
ram54288 0:a2cb7295a1f7 28 _is_block_message(false)
ram54288 0:a2cb7295a1f7 29 {
ram54288 0:a2cb7295a1f7 30 }
ram54288 0:a2cb7295a1f7 31
ram54288 0:a2cb7295a1f7 32 M2MBlockMessage::~M2MBlockMessage()
ram54288 0:a2cb7295a1f7 33 {
ram54288 0:a2cb7295a1f7 34 free(_block_data_ptr);
ram54288 0:a2cb7295a1f7 35 _block_data_ptr = NULL;
ram54288 0:a2cb7295a1f7 36 }
ram54288 0:a2cb7295a1f7 37
ram54288 0:a2cb7295a1f7 38 void M2MBlockMessage::set_message_info(sn_coap_hdr_s *coap_header)
ram54288 0:a2cb7295a1f7 39 {
ram54288 0:a2cb7295a1f7 40 _is_block_message = (coap_header &&
ram54288 0:a2cb7295a1f7 41 coap_header->options_list_ptr &&
ram54288 0:a2cb7295a1f7 42 coap_header->options_list_ptr->block1 != -1) ? true : false;
ram54288 0:a2cb7295a1f7 43
ram54288 0:a2cb7295a1f7 44 if (coap_header && coap_header->options_list_ptr) {
ram54288 0:a2cb7295a1f7 45 // Check total size
ram54288 0:a2cb7295a1f7 46 if (coap_header->options_list_ptr->use_size1) {
ram54288 0:a2cb7295a1f7 47 _total_message_size = coap_header->options_list_ptr->size1;
ram54288 0:a2cb7295a1f7 48 }
ram54288 0:a2cb7295a1f7 49
ram54288 0:a2cb7295a1f7 50 // Default value in coap library is 65kb
ram54288 0:a2cb7295a1f7 51 uint32_t max_size = SN_COAP_MAX_INCOMING_MESSAGE_SIZE;
ram54288 0:a2cb7295a1f7 52 if (_total_message_size > max_size) {
ram54288 0:a2cb7295a1f7 53 _error_code = M2MBlockMessage::EntityTooLarge;
ram54288 0:a2cb7295a1f7 54 } else {
ram54288 0:a2cb7295a1f7 55 _error_code = M2MBlockMessage::ErrorNone;
ram54288 0:a2cb7295a1f7 56 }
ram54288 0:a2cb7295a1f7 57 if (M2MBlockMessage::ErrorNone == _error_code) {
ram54288 0:a2cb7295a1f7 58 // Is last block
ram54288 0:a2cb7295a1f7 59 if (coap_header->options_list_ptr->block1 != -1) {
ram54288 0:a2cb7295a1f7 60 // if (!(*(coap_header->options_list_ptr->block1_ptr + (coap_header->options_list_ptr->block1_len - 1)) & 0x08)) {
ram54288 0:a2cb7295a1f7 61 if (!((coap_header->options_list_ptr->block1) & 0x08)) {
ram54288 0:a2cb7295a1f7 62 _is_last_block = true;
ram54288 0:a2cb7295a1f7 63 } else {
ram54288 0:a2cb7295a1f7 64 _is_last_block = false;
ram54288 0:a2cb7295a1f7 65 }
ram54288 0:a2cb7295a1f7 66 }
ram54288 0:a2cb7295a1f7 67
ram54288 0:a2cb7295a1f7 68 _block_number = coap_header->options_list_ptr->block1 >> 4;
ram54288 0:a2cb7295a1f7 69 // Block number
ram54288 0:a2cb7295a1f7 70 // if (coap_header->options_list_ptr->block1_len == 3) {
ram54288 0:a2cb7295a1f7 71 // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 12;
ram54288 0:a2cb7295a1f7 72 // _block_number |= *(coap_header->options_list_ptr->block1_ptr + 1) << 4;
ram54288 0:a2cb7295a1f7 73 // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 2)) >> 4;
ram54288 0:a2cb7295a1f7 74 // }
ram54288 0:a2cb7295a1f7 75
ram54288 0:a2cb7295a1f7 76 // else if (coap_header->options_list_ptr->block1_len == 2) {
ram54288 0:a2cb7295a1f7 77 // _block_number = *(coap_header->options_list_ptr->block1_ptr) << 4;
ram54288 0:a2cb7295a1f7 78 // _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 1)) >> 4;
ram54288 0:a2cb7295a1f7 79 // }
ram54288 0:a2cb7295a1f7 80 // else if (coap_header->options_list_ptr->block1_len == 1) {
ram54288 0:a2cb7295a1f7 81 // _block_number = (*coap_header->options_list_ptr->block1_ptr) >> 4;
ram54288 0:a2cb7295a1f7 82 // }
ram54288 0:a2cb7295a1f7 83 // else {
ram54288 0:a2cb7295a1f7 84 // _block_number = 0;
ram54288 0:a2cb7295a1f7 85 // }
ram54288 0:a2cb7295a1f7 86
ram54288 0:a2cb7295a1f7 87 // Payload
ram54288 0:a2cb7295a1f7 88 free(_block_data_ptr);
ram54288 0:a2cb7295a1f7 89 _block_data_ptr = NULL;
ram54288 0:a2cb7295a1f7 90 _block_data_len = coap_header->payload_len;
ram54288 0:a2cb7295a1f7 91 if(_block_data_len > 0) {
ram54288 0:a2cb7295a1f7 92 _block_data_ptr = (uint8_t *)malloc(_block_data_len);
ram54288 0:a2cb7295a1f7 93 if (_block_data_ptr) {
ram54288 0:a2cb7295a1f7 94 memcpy(_block_data_ptr, coap_header->payload_ptr, _block_data_len);
ram54288 0:a2cb7295a1f7 95 }
ram54288 0:a2cb7295a1f7 96 }
ram54288 0:a2cb7295a1f7 97 }
ram54288 0:a2cb7295a1f7 98 }
ram54288 0:a2cb7295a1f7 99 }
ram54288 0:a2cb7295a1f7 100
ram54288 0:a2cb7295a1f7 101 void M2MBlockMessage::clear_values()
ram54288 0:a2cb7295a1f7 102 {
ram54288 0:a2cb7295a1f7 103 free(_block_data_ptr);
ram54288 0:a2cb7295a1f7 104 _block_data_ptr = NULL;
ram54288 0:a2cb7295a1f7 105 _block_data_len = 0;
ram54288 0:a2cb7295a1f7 106 _block_number = 0;
ram54288 0:a2cb7295a1f7 107 _total_message_size = 0;
ram54288 0:a2cb7295a1f7 108 _is_last_block = false;
ram54288 0:a2cb7295a1f7 109 _error_code = M2MBlockMessage::ErrorNone;
ram54288 0:a2cb7295a1f7 110 }
ram54288 0:a2cb7295a1f7 111
ram54288 0:a2cb7295a1f7 112 bool M2MBlockMessage::is_block_message() const
ram54288 0:a2cb7295a1f7 113 {
ram54288 0:a2cb7295a1f7 114 return _is_block_message;
ram54288 0:a2cb7295a1f7 115 }
ram54288 0:a2cb7295a1f7 116
ram54288 0:a2cb7295a1f7 117 uint16_t M2MBlockMessage::block_number() const
ram54288 0:a2cb7295a1f7 118 {
ram54288 0:a2cb7295a1f7 119 return _block_number;
ram54288 0:a2cb7295a1f7 120 }
ram54288 0:a2cb7295a1f7 121
ram54288 0:a2cb7295a1f7 122 uint32_t M2MBlockMessage::total_message_size() const
ram54288 0:a2cb7295a1f7 123 {
ram54288 0:a2cb7295a1f7 124 return _total_message_size;
ram54288 0:a2cb7295a1f7 125 }
ram54288 0:a2cb7295a1f7 126
ram54288 0:a2cb7295a1f7 127 bool M2MBlockMessage::is_last_block() const
ram54288 0:a2cb7295a1f7 128 {
ram54288 0:a2cb7295a1f7 129 return _is_last_block;
ram54288 0:a2cb7295a1f7 130 }
ram54288 0:a2cb7295a1f7 131
ram54288 0:a2cb7295a1f7 132 uint8_t* M2MBlockMessage::block_data() const
ram54288 0:a2cb7295a1f7 133 {
ram54288 0:a2cb7295a1f7 134 return _block_data_ptr;
ram54288 0:a2cb7295a1f7 135 }
ram54288 0:a2cb7295a1f7 136
ram54288 0:a2cb7295a1f7 137 uint32_t M2MBlockMessage::block_data_len() const
ram54288 0:a2cb7295a1f7 138 {
ram54288 0:a2cb7295a1f7 139 return _block_data_len;
ram54288 0:a2cb7295a1f7 140 }
ram54288 0:a2cb7295a1f7 141
ram54288 0:a2cb7295a1f7 142 M2MBlockMessage::Error M2MBlockMessage::error_code() const
ram54288 0:a2cb7295a1f7 143 {
ram54288 0:a2cb7295a1f7 144 return _error_code;
ram54288 0:a2cb7295a1f7 145 }