Xbee s2b for lpc11u24

Dependencies:   DigiLogger

Dependents:  

Fork of XBeeLib by Digi International Inc.

Committer:
renanbmx123
Date:
Mon Jul 16 23:38:42 2018 +0000
Revision:
10:2c0de6919c2d
Parent:
4:629712865107
DigiLogger is delete after updating library and you need to import it again to get thinks work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spastor 0:fcaad0dfa051 1 /**
spastor 0:fcaad0dfa051 2 * Copyright (c) 2015 Digi International Inc.,
spastor 0:fcaad0dfa051 3 * All rights not expressly granted are reserved.
spastor 0:fcaad0dfa051 4 *
spastor 0:fcaad0dfa051 5 * This Source Code Form is subject to the terms of the Mozilla Public
spastor 0:fcaad0dfa051 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
spastor 0:fcaad0dfa051 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
spastor 0:fcaad0dfa051 8 *
spastor 0:fcaad0dfa051 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
spastor 0:fcaad0dfa051 10 * =======================================================================
spastor 0:fcaad0dfa051 11 */
spastor 4:629712865107 12
spastor 0:fcaad0dfa051 13 #include "FrameBuffer.h"
spastor 4:629712865107 14 #include "Utils/Debug.h"
spastor 0:fcaad0dfa051 15
spastor 0:fcaad0dfa051 16 #if !(defined AVOID_DISABLE_IRQS)
spastor 0:fcaad0dfa051 17 #define disable_irq() __disable_irq()
spastor 0:fcaad0dfa051 18 #define enable_irq() __enable_irq()
spastor 0:fcaad0dfa051 19 #else
spastor 0:fcaad0dfa051 20 #define disable_irq()
spastor 0:fcaad0dfa051 21 #define enable_irq()
spastor 0:fcaad0dfa051 22 #endif
spastor 0:fcaad0dfa051 23
spastor 4:629712865107 24 FrameBuffer::FrameBuffer(uint8_t size, uint16_t max_payload_len) : _size(size), _head(0), _tail(0), _dropped_frames(0)
spastor 0:fcaad0dfa051 25 {
spastor 4:629712865107 26 _frm_buf = new buf_element_t[_size];
spastor 4:629712865107 27
spastor 4:629712865107 28 assert(_frm_buf != NULL);
spastor 4:629712865107 29
spastor 4:629712865107 30 for (int i = 0; i < _size; i++) {
spastor 4:629712865107 31 _frm_buf[i].frame = new ApiFrame(max_payload_len - 1);
spastor 0:fcaad0dfa051 32 _frm_buf[i].status = FrameStatusFree;
spastor 0:fcaad0dfa051 33 }
spastor 0:fcaad0dfa051 34 }
spastor 0:fcaad0dfa051 35
spastor 0:fcaad0dfa051 36 FrameBuffer::~FrameBuffer()
spastor 0:fcaad0dfa051 37 {
spastor 4:629712865107 38 for (int i = 0; i < _size; i++) {
spastor 0:fcaad0dfa051 39 delete _frm_buf[i].frame;
spastor 0:fcaad0dfa051 40 }
spastor 4:629712865107 41
spastor 4:629712865107 42 delete _frm_buf;
spastor 0:fcaad0dfa051 43 }
spastor 4:629712865107 44
spastor 0:fcaad0dfa051 45 ApiFrame *FrameBuffer::get_next_free_frame(void)
spastor 0:fcaad0dfa051 46 {
spastor 0:fcaad0dfa051 47 uint8_t i = _head;
spastor 0:fcaad0dfa051 48 ApiFrame *ret = NULL;
spastor 4:629712865107 49
spastor 0:fcaad0dfa051 50 do {
spastor 0:fcaad0dfa051 51 if (_frm_buf[i].status == FrameStatusFree || _frm_buf[i].status == FrameStatusComplete) {
spastor 4:629712865107 52 if (_frm_buf[i].status == FrameStatusComplete) {
spastor 0:fcaad0dfa051 53 _dropped_frames++;
spastor 4:629712865107 54 }
spastor 0:fcaad0dfa051 55 _frm_buf[i].status = FrameStatusAssigned;
spastor 0:fcaad0dfa051 56 ret = _frm_buf[i].frame;
spastor 4:629712865107 57 _head = ++i % _size;
spastor 0:fcaad0dfa051 58 break;
spastor 0:fcaad0dfa051 59 }
spastor 0:fcaad0dfa051 60 i++;
spastor 4:629712865107 61 i = i % _size;
spastor 0:fcaad0dfa051 62 } while (i != _head);
spastor 0:fcaad0dfa051 63
spastor 4:629712865107 64 return ret;
spastor 0:fcaad0dfa051 65 }
spastor 0:fcaad0dfa051 66
spastor 0:fcaad0dfa051 67 bool FrameBuffer::complete_frame(ApiFrame *frame)
spastor 0:fcaad0dfa051 68 {
spastor 0:fcaad0dfa051 69 bool ret = false;
spastor 4:629712865107 70
spastor 4:629712865107 71 for (int i = 0; i < _size; i++) {
spastor 0:fcaad0dfa051 72 if (_frm_buf[i].frame == frame) {
spastor 0:fcaad0dfa051 73 _frm_buf[i].status = FrameStatusComplete;
spastor 0:fcaad0dfa051 74 ret = true;
spastor 0:fcaad0dfa051 75 break;
spastor 0:fcaad0dfa051 76 }
spastor 0:fcaad0dfa051 77 }
spastor 0:fcaad0dfa051 78
spastor 0:fcaad0dfa051 79 return ret;
spastor 0:fcaad0dfa051 80 }
spastor 0:fcaad0dfa051 81
spastor 4:629712865107 82 ApiFrame *FrameBuffer::get_next_complete_frame(void)
spastor 0:fcaad0dfa051 83 {
spastor 4:629712865107 84 uint8_t i = _tail;
spastor 0:fcaad0dfa051 85 ApiFrame *ret = NULL;
spastor 4:629712865107 86
spastor 0:fcaad0dfa051 87 do {
spastor 0:fcaad0dfa051 88 disable_irq();
spastor 0:fcaad0dfa051 89 if (_frm_buf[i].status == FrameStatusComplete) {
spastor 0:fcaad0dfa051 90 _frm_buf[i].status = FrameStatusAssigned;
spastor 0:fcaad0dfa051 91 enable_irq();
spastor 0:fcaad0dfa051 92 ret = _frm_buf[i].frame;
spastor 4:629712865107 93 _tail = ++i % _size;
spastor 0:fcaad0dfa051 94 break;
spastor 0:fcaad0dfa051 95 }
spastor 0:fcaad0dfa051 96 enable_irq();
spastor 0:fcaad0dfa051 97 i++;
spastor 4:629712865107 98 i = i % _size;
spastor 4:629712865107 99 } while (i != _tail);
spastor 0:fcaad0dfa051 100
spastor 4:629712865107 101 return ret;
spastor 0:fcaad0dfa051 102 }
spastor 0:fcaad0dfa051 103
spastor 0:fcaad0dfa051 104 bool FrameBuffer::free_frame(ApiFrame *frame)
spastor 0:fcaad0dfa051 105 {
spastor 0:fcaad0dfa051 106 bool ret = false;
spastor 4:629712865107 107
spastor 4:629712865107 108 for (int i = 0; i < _size; i++) {
spastor 0:fcaad0dfa051 109 if (_frm_buf[i].frame == frame) {
spastor 0:fcaad0dfa051 110 _frm_buf[i].status = FrameStatusFree;
spastor 0:fcaad0dfa051 111 ret = true;
spastor 0:fcaad0dfa051 112 break;
spastor 0:fcaad0dfa051 113 }
spastor 0:fcaad0dfa051 114 }
spastor 0:fcaad0dfa051 115
spastor 0:fcaad0dfa051 116 return ret;
spastor 0:fcaad0dfa051 117 }
spastor 0:fcaad0dfa051 118
spastor 0:fcaad0dfa051 119 uint32_t FrameBuffer::get_dropped_frames_count(void)
spastor 0:fcaad0dfa051 120 {
spastor 0:fcaad0dfa051 121 const uint32_t dropped_frames = _dropped_frames;
spastor 0:fcaad0dfa051 122
spastor 0:fcaad0dfa051 123 _dropped_frames = 0;
spastor 0:fcaad0dfa051 124
spastor 0:fcaad0dfa051 125 return dropped_frames;
spastor 0:fcaad0dfa051 126 }