/**
|
/**
|
* @file
|
* @file
|
* @copyright Copyright 2016 GNSS Sensor Ltd. All right reserved.
|
* @copyright Copyright 2016 GNSS Sensor Ltd. All right reserved.
|
* @author Sergey Khabarov - sergeykhbr@gmail.com
|
* @author Sergey Khabarov - sergeykhbr@gmail.com
|
* @brief Ringbuffer implementation.
|
* @brief Ringbuffer implementation.
|
*/
|
*/
|
|
|
#ifndef __DEBUGGER_RINGBUF_H__
|
#ifndef __DEBUGGER_RINGBUF_H__
|
#define __DEBUGGER_RINGBUF_H__
|
#define __DEBUGGER_RINGBUF_H__
|
|
|
#include <inttypes.h>
|
#include <inttypes.h>
|
#include <string>
|
#include <string>
|
|
|
namespace debugger {
|
namespace debugger {
|
|
|
class RingBufferType {
|
class RingBufferType {
|
public:
|
public:
|
explicit RingBufferType(int sz) {
|
explicit RingBufferType(int sz) {
|
size_ = sz + 1;
|
size_ = sz + 1;
|
rdpos_ = buf_ = new uint8_t[2 * size_];
|
rdpos_ = buf_ = new uint8_t[2 * size_];
|
wrpos_ = rdpos_ + 1;
|
wrpos_ = rdpos_ + 1;
|
}
|
}
|
~RingBufferType() {
|
~RingBufferType() {
|
delete buf_;
|
delete buf_;
|
}
|
}
|
|
|
uint8_t *put(uint8_t *buf, int sz) {
|
uint8_t *put(uint8_t *buf, int sz) {
|
uint8_t *ret = wrpos_;
|
uint8_t *ret = wrpos_;
|
if (&buf_[size_] >= wrpos_ + sz) {
|
if (&buf_[size_] >= wrpos_ + sz) {
|
memcpy(wrpos_, buf, sz);
|
memcpy(wrpos_, buf, sz);
|
memcpy(wrpos_ + size_, buf, sz);
|
memcpy(wrpos_ + size_, buf, sz);
|
wrpos_ += sz;
|
wrpos_ += sz;
|
} else {
|
} else {
|
int part = static_cast<int>(&buf_[size_] - wrpos_);
|
int part = static_cast<int>(&buf_[size_] - wrpos_);
|
memcpy(wrpos_, buf, part);
|
memcpy(wrpos_, buf, part);
|
memcpy(wrpos_ + size_, buf, part);
|
memcpy(wrpos_ + size_, buf, part);
|
int part2 = sz - part;
|
int part2 = sz - part;
|
memcpy(buf_, &buf[part], part2);
|
memcpy(buf_, &buf[part], part2);
|
memcpy(buf_+ size_, &buf[part], part2);
|
memcpy(buf_+ size_, &buf[part], part2);
|
wrpos_ += (sz - size_);
|
wrpos_ += (sz - size_);
|
}
|
}
|
return ret;
|
return ret;
|
}
|
}
|
|
|
int get(uint8_t *obuf, int sz) {
|
int get(uint8_t *obuf, int sz) {
|
int ret = sz;
|
int ret = sz;
|
if (ret > size()) {
|
if (ret > size()) {
|
ret = size();
|
ret = size();
|
}
|
}
|
/// do not modificate rdpos_ pointer before data reading complete.
|
/// do not modificate rdpos_ pointer before data reading complete.
|
if (rdpos_ == &buf_[size_ - 1]) {
|
if (rdpos_ == &buf_[size_ - 1]) {
|
memcpy(obuf, buf_, ret);
|
memcpy(obuf, buf_, ret);
|
} else {
|
} else {
|
memcpy(obuf, rdpos_ + 1, ret);
|
memcpy(obuf, rdpos_ + 1, ret);
|
}
|
}
|
rdpos_ += sz;
|
rdpos_ += sz;
|
if (rdpos_ >= &buf_[size_]) {
|
if (rdpos_ >= &buf_[size_]) {
|
rdpos_ -= size_;
|
rdpos_ -= size_;
|
}
|
}
|
return ret;
|
return ret;
|
}
|
}
|
|
|
int size() {
|
int size() {
|
int t1 = static_cast<int>(wrpos_ - rdpos_) - 1;
|
int t1 = static_cast<int>(wrpos_ - rdpos_) - 1;
|
if (t1 < 0) {
|
if (t1 < 0) {
|
t1 += size_;
|
t1 += size_;
|
}
|
}
|
return t1;
|
return t1;
|
}
|
}
|
|
|
private:
|
private:
|
uint8_t *buf_;
|
uint8_t *buf_;
|
uint8_t *wrpos_;
|
uint8_t *wrpos_;
|
uint8_t *rdpos_;
|
uint8_t *rdpos_;
|
int size_;
|
int size_;
|
};
|
};
|
|
|
} // namespace debugger
|
} // namespace debugger
|
|
|
#endif // __DEBUGGER_RINGBUF_H__
|
#endif // __DEBUGGER_RINGBUF_H__
|
|
|