141 lines
4.7 KiB
C++
141 lines
4.7 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);
|
||
|
}
|