pinebuds/services/tota/tota_buffer_manager.cpp

127 lines
4.3 KiB
C++

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#include "tota_buffer_manager.h"
#include "app_tota_cmd_code.h"
#include "cmsis_os.h"
#include "string.h"
osMutexDef(stream_buf_mutex);
osMutexId stream_buf_mutex_id;
static stream_buf_t stream_buf;
static osThreadId father_thread_tid;
void tota_stream_buffer_init(osThreadId tid) {
stream_buf.dataSize = 0;
stream_buf.availableSpace = TOTA_STREAM_BUF_SIZE;
stream_buf.readPos = 0;
stream_buf.writePos = 0;
stream_buf.flushBytes = 0;
stream_buf_mutex_id = osMutexCreate(osMutex(stream_buf_mutex));
father_thread_tid = tid;
}
bool tota_stream_buffer_write(uint8_t *buf, uint32_t bufLen) {
osMutexWait(stream_buf_mutex_id, osWaitForever);
if (stream_buf.availableSpace > bufLen) {
// write to stream buf
if (stream_buf.writePos + bufLen <= TOTA_STREAM_BUF_SIZE) {
memcpy(stream_buf.buf + stream_buf.writePos, buf, bufLen);
stream_buf.writePos += bufLen;
if (stream_buf.writePos == TOTA_STREAM_BUF_SIZE)
stream_buf.writePos = 0;
} else {
uint32_t part1 = TOTA_STREAM_BUF_SIZE - stream_buf.writePos;
memcpy(stream_buf.buf + stream_buf.writePos, buf, part1);
memcpy(stream_buf.buf, buf + part1, bufLen - part1);
stream_buf.writePos = bufLen - part1;
}
stream_buf.dataSize += bufLen;
stream_buf.availableSpace -= bufLen;
TOTA_LOG_DBG(1, "buffer> after write: %5u bytes", bufLen);
TOTA_LOG_DBG(4, "buffer> size:%5u available:%5u writepos:%5u readpos:%5u:",
stream_buf.dataSize, stream_buf.availableSpace,
stream_buf.writePos, stream_buf.readPos);
osMutexRelease(stream_buf_mutex_id);
/* set signal to father thread, has data */
osSignalSet(father_thread_tid, 0x0001);
return true;
} else {
osMutexRelease(stream_buf_mutex_id);
return false;
}
}
bool tota_stream_buffer_read(uint8_t *rbuf, uint32_t readSize,
uint32_t *flushbytes) {
osMutexWait(stream_buf_mutex_id, osWaitForever);
if (readSize < stream_buf.dataSize) {
if (stream_buf.readPos + readSize <= TOTA_STREAM_BUF_SIZE) {
memcpy(rbuf, stream_buf.buf + stream_buf.readPos, readSize);
stream_buf.readPos += readSize;
if (stream_buf.readPos == TOTA_STREAM_BUF_SIZE)
stream_buf.readPos = 0;
} else {
uint32_t part1 = TOTA_STREAM_BUF_SIZE - stream_buf.readPos;
memcpy(rbuf, stream_buf.buf + stream_buf.readPos, part1);
memcpy(rbuf + part1, stream_buf.buf, readSize - part1);
stream_buf.readPos = readSize - part1;
}
stream_buf.dataSize -= readSize;
stream_buf.availableSpace += readSize;
/* debug */
TOTA_LOG_DBG(1, "buffer> after read: %5u bytes", readSize);
TOTA_LOG_DBG(4, "buffer> size:%5u available:%5u writepos:%5u readpos:%5u:",
stream_buf.dataSize, stream_buf.availableSpace,
stream_buf.writePos, stream_buf.readPos);
if (flushbytes != NULL) {
*flushbytes = stream_buf.flushBytes;
stream_buf.flushBytes = 0;
}
osMutexRelease(stream_buf_mutex_id);
return true;
} else {
osMutexRelease(stream_buf_mutex_id);
return false;
}
}
void tota_stream_buffer_flush(void) {
osMutexWait(stream_buf_mutex_id, osWaitForever);
stream_buf.flushBytes = stream_buf.dataSize;
stream_buf.availableSpace = TOTA_STREAM_BUF_SIZE;
stream_buf.dataSize = 0;
stream_buf.readPos = 0;
stream_buf.writePos = 0;
osMutexRelease(stream_buf_mutex_id);
}
void tota_stream_buffer_clean(void) {
osMutexWait(stream_buf_mutex_id, osWaitForever);
stream_buf.flushBytes = 0;
stream_buf.availableSpace = TOTA_STREAM_BUF_SIZE;
stream_buf.dataSize = 0;
stream_buf.readPos = 0;
stream_buf.writePos = 0;
osMutexRelease(stream_buf_mutex_id);
}