127 lines
4.3 KiB
C++
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);
|
|
} |