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.
Dependencies: DigiLogger
Dependents: WaterLogger XbeeGateway XBee_Cooker ProjetReceiver ... more
Diff: FrameBuffer/FrameBuffer.cpp
- Revision:
- 4:629712865107
- Parent:
- 3:8662ebe83570
diff -r 8662ebe83570 -r 629712865107 FrameBuffer/FrameBuffer.cpp
--- a/FrameBuffer/FrameBuffer.cpp Mon May 18 13:16:55 2015 +0200
+++ b/FrameBuffer/FrameBuffer.cpp Mon Jun 01 18:59:43 2015 +0200
@@ -9,8 +9,9 @@
* Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
* =======================================================================
*/
-
+
#include "FrameBuffer.h"
+#include "Utils/Debug.h"
#if !(defined AVOID_DISABLE_IRQS)
#define disable_irq() __disable_irq()
@@ -20,47 +21,54 @@
#define enable_irq()
#endif
-FrameBuffer::FrameBuffer() : _head(0), _tail_app(0), _tail_syncr(0), _dropped_frames(0)
+FrameBuffer::FrameBuffer(uint8_t size, uint16_t max_payload_len) : _size(size), _head(0), _tail(0), _dropped_frames(0)
{
- for (int i = 0; i < FRAME_BUFFER_SIZE; i++) {
- _frm_buf[i].frame = new ApiFrame(MAX_FRAME_PAYLOAD_LEN - 1);
+ _frm_buf = new buf_element_t[_size];
+
+ assert(_frm_buf != NULL);
+
+ for (int i = 0; i < _size; i++) {
+ _frm_buf[i].frame = new ApiFrame(max_payload_len - 1);
_frm_buf[i].status = FrameStatusFree;
}
}
FrameBuffer::~FrameBuffer()
{
- for (int i = 0; i < FRAME_BUFFER_SIZE; i++) {
+ for (int i = 0; i < _size; i++) {
delete _frm_buf[i].frame;
}
+
+ delete _frm_buf;
}
-
+
ApiFrame *FrameBuffer::get_next_free_frame(void)
{
uint8_t i = _head;
ApiFrame *ret = NULL;
-
+
do {
if (_frm_buf[i].status == FrameStatusFree || _frm_buf[i].status == FrameStatusComplete) {
- if (_frm_buf[i].status == FrameStatusComplete)
+ if (_frm_buf[i].status == FrameStatusComplete) {
_dropped_frames++;
+ }
_frm_buf[i].status = FrameStatusAssigned;
ret = _frm_buf[i].frame;
- _head = ++i % FRAME_BUFFER_SIZE;
+ _head = ++i % _size;
break;
}
i++;
- i = i % FRAME_BUFFER_SIZE;
+ i = i % _size;
} while (i != _head);
- return ret;
+ return ret;
}
bool FrameBuffer::complete_frame(ApiFrame *frame)
{
bool ret = false;
-
- for (int i = 0; i < FRAME_BUFFER_SIZE; i++) {
+
+ for (int i = 0; i < _size; i++) {
if (_frm_buf[i].frame == frame) {
_frm_buf[i].status = FrameStatusComplete;
ret = true;
@@ -71,43 +79,33 @@
return ret;
}
-ApiFrame *FrameBuffer::get_next_complete_frame(uint8_t* tail)
+ApiFrame *FrameBuffer::get_next_complete_frame(void)
{
- uint8_t i = *tail;
+ uint8_t i = _tail;
ApiFrame *ret = NULL;
-
+
do {
disable_irq();
if (_frm_buf[i].status == FrameStatusComplete) {
_frm_buf[i].status = FrameStatusAssigned;
enable_irq();
ret = _frm_buf[i].frame;
- *tail = ++i % FRAME_BUFFER_SIZE;
+ _tail = ++i % _size;
break;
}
enable_irq();
i++;
- i = i % FRAME_BUFFER_SIZE;
- } while (i != *tail);
-
- return ret;
-}
+ i = i % _size;
+ } while (i != _tail);
-ApiFrame *FrameBuffer::get_next_complete_frame_syncr(void)
-{
- return get_next_complete_frame(&_tail_syncr);
-}
-
-ApiFrame *FrameBuffer::get_next_complete_frame_app(void)
-{
- return get_next_complete_frame(&_tail_app);
+ return ret;
}
bool FrameBuffer::free_frame(ApiFrame *frame)
{
bool ret = false;
-
- for (int i = 0; i < FRAME_BUFFER_SIZE; i++) {
+
+ for (int i = 0; i < _size; i++) {
if (_frm_buf[i].frame == frame) {
_frm_buf[i].status = FrameStatusFree;
ret = true;