/*************************************************************************** * * 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); }