Browse Source

同步主线修改

master
Lizongdi 3 weeks ago
parent
commit
cfd9d3c92d
  1. 1
      library/common/CMakeLists.txt
  2. 3
      library/common/common.c
  3. 14
      library/common/include/common.h
  4. 3
      library/common/rd_mempool.c
  5. 1
      library/common/rd_thread.c
  6. 3
      library/common/rd_time.c
  7. 9
      library/list/CMakeLists.txt
  8. 5
      library/log/CMakeLists.txt
  9. 5
      library/ringbuffer/CMakeLists.txt
  10. 8
      library/ringbuffer/include/ringbuffer.h
  11. 18
      library/ringbuffer/ringbuffer.c
  12. 17
      peripheral/CMakeLists.txt
  13. 127
      peripheral/com.c
  14. 1
      peripheral/include/com.h

1
library/common/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10)
get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH})

3
library/common/common.c

@ -1,7 +1,4 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdarg.h>
#include <sys/stat.h>
#include "common.h"

14
library/common/include/common.h

@ -12,9 +12,10 @@
#define RD_INVALUE -3 //非法参数
/* 跨平台弱符号宏定义 */
#if defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C)
/* GCC, Clang, SunPro 系列 */
#define WEAK __attribute__((weak))
#if defined(_MSC_VER) || defined(WIN32)
/* Microsoft Visual C++ */
/* 或者干脆定义为空,但需要确保不会重复定义 */
#define WEAK
#elif defined(__IAR_SYSTEMS_ICC__)
/* IAR Embedded Workbench */
@ -24,10 +25,9 @@
/* Keil MDK / ARM Compiler */
#define WEAK __weak
#elif defined(_MSC_VER)
/* Microsoft Visual C++ */
/* 或者干脆定义为空,但需要确保不会重复定义 */
#define WEAK
#elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C)
/* GCC, Clang, SunPro 系列 */
#define WEAK __attribute__((weak))
#else
/* 其他未知编译器,保守处理 */

3
library/common/rd_mempool.c

@ -182,7 +182,7 @@ static void merge_free_blocks(MemBlockHeader_t* block)
prev_block = prev_block->next_free;
}
}
#if !WIN32
WEAK void Rd_MemDoInit(void)
{
if (g_initialized) return;
@ -393,6 +393,7 @@ WEAK size_t Rd_MemPoolGetTotalCount(void)
{
return (size_t)MEM_POOL_TOTAL_SIZE;
}
#endif
void Rd_MemPoolInit_Auto(void)
{

1
library/common/rd_thread.c

@ -44,6 +44,7 @@
/*----------------------------------------------*
* *
*----------------------------------------------*/
WEAK int Rd_SemInit(void *_sem, int _iPshared, int _iValue)
{
return RD_FAILURE;

3
library/common/rd_time.c

@ -46,7 +46,7 @@ WEAK unsigned int g_uiRandSeed = 12345;
/*----------------------------------------------*
* *
*----------------------------------------------*/
#if !WIN32 && !defined(__ANDROID__)
WEAK time_t rd_time(time_t *tloc)
{
if (tloc != NULL)
@ -89,3 +89,4 @@ WEAK void Rd_Delay(uint32_t Delay)
void HAL_Delay(uint32_t Delay);
HAL_Delay(Delay);
}
#endif

9
library/list/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10)
get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH})
@ -9,13 +10,13 @@ else()
endif()
if(TARGET common)
target_link_libraries(list INTERFACE common)
target_link_libraries(${TARGET_NAME} INTERFACE common)
else()
message(WARNING "[list] Dependency 'common' not found.")
message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.")
endif()
if(TARGET log)
target_link_libraries(list INTERFACE log)
target_link_libraries(${TARGET_NAME} INTERFACE log)
else()
message(WARNING "[list] Dependency 'log' not found.")
message(WARNING "[${TARGET_NAME}] Dependency 'log' not found.")
endif()

5
library/log/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10)
get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH})
@ -9,7 +10,7 @@ else()
endif()
if(TARGET common)
target_link_libraries(log PUBLIC common)
target_link_libraries(${TARGET_NAME} PUBLIC common)
else()
message(WARNING "[log] Dependency 'common' not found.")
message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.")
endif()

5
library/ringbuffer/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10)
get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH})
@ -9,7 +10,7 @@ else()
endif()
if(TARGET common)
target_link_libraries(ringbuffer PUBLIC common)
target_link_libraries(${TARGET_NAME} PUBLIC common)
else()
message(WARNING "[ringbuffer] Dependency 'common' not found.")
message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'common' not found.")
endif()

8
library/ringbuffer/include/ringbuffer.h

@ -70,10 +70,10 @@ typedef struct TRingBuffer rd_ringbuf_t;
struct TRingBuffer
{
unsigned short m_bReadMirror : 1;
unsigned short m_sReadIndex : 15;
unsigned short m_bWriteMirror : 1;
unsigned short m_sWriteIndex : 15;
unsigned char m_bReadMirror;
unsigned short m_sReadIndex;
unsigned char m_bWriteMirror;
unsigned short m_sWriteIndex;
int m_iBufsize;
char *m_pcBufPtr;
};

18
library/ringbuffer/ringbuffer.c

@ -126,7 +126,7 @@ int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length)
length - (rb->m_iBufsize - rb->m_sWriteIndex));
/* we are going into the other side of the mirror */
rb->m_bWriteMirror = ~rb->m_bWriteMirror;
rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex);
return length;
@ -180,13 +180,13 @@ int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length)
length - (rb->m_iBufsize - rb->m_sWriteIndex));
/* we are going into the other side of the mirror */
rb->m_bWriteMirror = ~rb->m_bWriteMirror;
rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex);
if (length > space_length)
{
if (rb->m_sWriteIndex <= rb->m_sReadIndex)
rb->m_bReadMirror = ~rb->m_bReadMirror;
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex;
}
@ -244,7 +244,7 @@ int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length)
length - (rb->m_iBufsize - rb->m_sReadIndex));
/* we are going into the other side of the mirror */
rb->m_bReadMirror = ~rb->m_bReadMirror;
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = length - (rb->m_iBufsize - rb->m_sReadIndex);
return length;
@ -290,7 +290,7 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr)
size = rb->m_iBufsize - rb->m_sReadIndex;
/* we are going into the other side of the mirror */
//rb->m_bReadMirror = ~rb->m_bReadMirror;
//rb->m_bReadMirror ^= 1;
//rb->m_sReadIndex = 0;
return size;
@ -322,7 +322,7 @@ int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch)
/* flip mirror */
if (rb->m_sWriteIndex == rb->m_iBufsize-1)
{
rb->m_bWriteMirror = ~rb->m_bWriteMirror;
rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = 0;
}
else
@ -357,11 +357,11 @@ int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch)
/* flip mirror */
if (rb->m_sWriteIndex == rb->m_iBufsize-1)
{
rb->m_bWriteMirror = ~rb->m_bWriteMirror;
rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = 0;
if (old_state == RINGBUFFER_FULL)
{
rb->m_bReadMirror = ~rb->m_bReadMirror;
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex;
}
}
@ -404,7 +404,7 @@ int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch)
if (rb->m_sReadIndex == rb->m_iBufsize-1)
{
rb->m_bReadMirror = ~rb->m_bReadMirror;
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = 0;
}
else

17
peripheral/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10)
get_filename_component(TARGET_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../library/CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH})
@ -9,25 +10,25 @@ else()
endif()
if(TARGET list)
target_link_libraries(peripheral PUBLIC list)
target_link_libraries(${TARGET_NAME} PUBLIC list)
else()
message(WARNING "[peripheral] Dependency 'list' not found.")
message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'list' not found.")
endif()
if(TARGET platform_Linux)
target_link_libraries(peripheral PUBLIC platform_Linux)
target_link_libraries(${TARGET_NAME} PUBLIC platform_Linux)
else()
message(WARNING "[peripheral] Dependency 'platform_Linux' not found.")
message(STATUS "[${TARGET_NAME}] Dependency 'platform_Linux' not found.")
endif()
if(TARGET log)
target_link_libraries(peripheral PUBLIC log)
target_link_libraries(${TARGET_NAME} PUBLIC log)
else()
message(WARNING "[peripheral] Dependency 'log' not found.")
message(WARNING "[${TARGET_NAME}] Dependency 'log' not found.")
endif()
if(TARGET ringbuffer)
target_link_libraries(peripheral PUBLIC ringbuffer)
target_link_libraries(${TARGET_NAME} PUBLIC ringbuffer)
else()
message(WARNING "[peripheral] Dependency 'ringbuffer' not found.")
message(FATAL_ERROR "[${TARGET_NAME}] Dependency 'ringbuffer' not found.")
endif()

127
peripheral/com.c

@ -72,7 +72,8 @@ TComCtrl *rd_ComCreate(cbk_ComCheck _pfCheck, cbk_ComDecode _pfDecode, cbk_ComSe
if (NULL == ptComCtrl) return NULL;
ptComCtrl->m_iBufferSize = _iSize;
ptComCtrl->m_pUserData = _pUserData;
//Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Recv, 0, 0);
ptComCtrl->m_pSendTempBuffer = RD_CALLOC(1, _iSize);
Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Recv, 0, 0);
Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Send, 0, 0);
ptComCtrl->m_stComBuf.m_ptRecv = rd_RingbufferCreate(_iSize);
rd_RingbufferReset(ptComCtrl->m_stComBuf.m_ptRecv);
@ -117,7 +118,8 @@ int rd_ComDelete(TComCtrl *_ptComCtrl)
utarray_free(_ptComCtrl->m_pMutiDevArray);
}
//Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Recv);
RD_FREE(_ptComCtrl->m_pSendTempBuffer);
Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Recv);
Rd_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Send);
rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptRecv);
rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptSend);
@ -167,22 +169,20 @@ int rd_ComSend(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
void rd_ComSendProc(TComCtrl *_ptComCtrl)
{
if (NULL == _ptComCtrl) return;
char *pcBuffer = RD_CALLOC(1, _ptComCtrl->m_iBufferSize);;
int iRet = 0;
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL);
iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptSend, pcBuffer, _ptComCtrl->m_iBufferSize);
iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptSend, _ptComCtrl->m_pSendTempBuffer, _ptComCtrl->m_iBufferSize);
if (iRet > 0)
{
rd_ComSend(_ptComCtrl, pcBuffer, iRet);
rd_ComSend(_ptComCtrl, _ptComCtrl->m_pSendTempBuffer, iRet);
}
RD_FREE(pcBuffer);
}
void rd_ComRecvProc(TComCtrl *_ptComCtrl, const char *_pBuffer, uint32_t _iSize)
{
if (NULL == _ptComCtrl) return;
int iRet = rd_RingbufferPutForce(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, _iSize);
int iRet = rd_RingbufferPut(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, _iSize);
if (iRet > 0)
{
Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL);
@ -192,7 +192,7 @@ void rd_ComRecvProc(TComCtrl *_ptComCtrl, const char *_pBuffer, uint32_t _iSize)
int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
{
if (NULL == _ptComCtrl) return RD_INVALUE;
int iRet = rd_RingbufferPutForce(_ptComCtrl->m_stComBuf.m_ptSend, _pBuffer, _iSize);
int iRet = rd_RingbufferPut(_ptComCtrl->m_stComBuf.m_ptSend, _pBuffer, _iSize);
if (iRet > 0)
{
Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL);
@ -200,25 +200,6 @@ int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return iRet;
}
//static int rd_MutiDevIsconflict(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize, int _MyIdx)
//{
// int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray);
// for(int i = 0; i < iArrlen; i++)
// {
// TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, i);
// TMutiDev *ptMutiDev = *ppMutiDev;
// if (i == _MyIdx) continue;
//
// int result = ptMutiDev->m_pfCheck(_pBuffer, _iSize);
// if (result > 0)
// {
// return i;
// }
// }
// return RD_NULL;
//}
/*****************************************************************************
: rd_ComRead
: buffer实际大小
@ -245,9 +226,6 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return RD_INVALUE;
}
uint32_t u32CurrentTime = Rd_GetTime();
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL);
char *pPeakData = NULL;
int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData);
@ -258,11 +236,25 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
}
else if (0 == iPeakLen)
{
return 0;
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL);
iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData);
if (iPeakLen < 0)
{
return RD_FAILURE;
}
else if (0 == iPeakLen)
{
return 0;
}
}
uint32_t u32CurrentTime = Rd_GetTime();
int iPackLen = 1;
int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray);
int bChecked = 0;
if (_ptComCtrl->m_iDevIndex < 0)
{
@ -274,16 +266,18 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, i);
TMutiDev *ptMutiDev = *ppMutiDev;
iPackLen = 1;
if (NULL != ptMutiDev->m_pfCheck)
{
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen);
}
if (iPackLen > 0 && iPackLen <= iPeakLen)
if (iPackLen > 0)
{
_ptComCtrl->m_iDevIndex = i;
bFound = 1;
bDataValid = 1;
bChecked = 1;
break; // 找到了就退出循环,去下面处理
}
else if(0 == iPackLen)
@ -302,6 +296,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
ptMutiDev->m_uiLastRecvTime = 0;
bDataValid = 0;
return RD_FAILURE;
}
else
{
@ -340,31 +336,49 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
TMutiDev **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, _ptComCtrl->m_iDevIndex);
TMutiDev *ptMutiDev = *ppMutiDev;
if (NULL != ptMutiDev->m_pfCheck)
if (!bChecked)
{
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen);
iPackLen = 1;
if (NULL != ptMutiDev->m_pfCheck)
{
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen);
}
}
// if (rd_MutiDevIsconflict(_ptComCtrl, pPeakData, iPeakLen, _ptComCtrl->m_iDevIndex) >= 0)
// {
// _ptComCtrl->m_iDevIndex = -1;
// char temp[1];
// rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1);
// return RD_FAILURE;
// }
if (iPackLen > 0 && iPackLen <= iPeakLen)
{
int iLen = (_iSize > iPackLen) ? iPackLen : _iSize;
int iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, iLen);
if (_iSize < (uint32_t)iPackLen)
{
int remain = iPackLen;
char dropBuf[16];
while (remain > 0)
{
int once = (remain > (int)sizeof(dropBuf)) ? (int)sizeof(dropBuf) : remain;
int ret = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, dropBuf, once);
if (ret <= 0)
{
break;
}
remain -= ret;
}
_ptComCtrl->m_iDevIndex = -1;
ptMutiDev->m_uiLastRecvTime = 0;
return RD_INVALUE;
}
int iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, iPackLen);
if (iRet > 0)
{
_ptComCtrl->m_iDevIndex = -1;
if(NULL != ptMutiDev->m_pfDecode)
ptMutiDev->m_uiLastRecvTime = 0;
if (NULL != ptMutiDev->m_pfDecode)
{
ptMutiDev->m_uiLastRecvTime = 0;
ptMutiDev->m_pfDecode(_pBuffer, iLen);
ptMutiDev->m_pfDecode(_pBuffer, iRet);
}
return iRet;
}
@ -374,11 +388,30 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return RD_FAILURE;
}
}
else if (iPackLen == 0 || iPackLen > iPeakLen)
{
if (ptMutiDev->m_uiLastRecvTime == 0)
{
ptMutiDev->m_uiLastRecvTime = u32CurrentTime;
}
if ((u32CurrentTime - ptMutiDev->m_uiLastRecvTime) > RECV_TIMEOUT)
{
char temp[1];
rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1);
ptMutiDev->m_uiLastRecvTime = 0;
_ptComCtrl->m_iDevIndex = -1;
return RD_FAILURE;
}
return 0;
}
else
{
// 长度错误或异常
char temp[1];
rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1);
ptMutiDev->m_uiLastRecvTime = 0;
_ptComCtrl->m_iDevIndex = -1;
return RD_FAILURE;
}

1
peripheral/include/com.h

@ -95,6 +95,7 @@ typedef struct
typedef struct
{
TComBuffer m_stComBuf;
char *m_pSendTempBuffer;
int m_iBufferSize;
int m_iDevIndex; // 表示当前正在接收的设备索引,-1表示当前无设备在处理
UT_array *m_pMutiDevArray;

Loading…
Cancel
Save