Browse Source

同步主线修改

master
Lizongdi 3 weeks ago
parent
commit
cfd9d3c92d
  1. 1
      library/common/CMakeLists.txt
  2. 5
      library/common/common.c
  3. 16
      library/common/include/common.h
  4. 3
      library/common/rd_mempool.c
  5. 7
      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. 129
      peripheral/com.c
  14. 1
      peripheral/include/com.h

1
library/common/CMakeLists.txt

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.10) 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") set(COMMON_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
if(EXISTS ${COMMON_CMAKE_PATH}) if(EXISTS ${COMMON_CMAKE_PATH})

5
library/common/common.c

@ -1,12 +1,9 @@
#include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdarg.h> #include <stdarg.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "common.h" #include "common.h"
WEAK void elog_output(uint8_t level, const char *tag, const char *file, const char *func, long line, const char *format, ...) WEAK void elog_output(uint8_t level, const char *tag, const char *file, const char *func, long line, const char *format, ...)
{ {
RD_PRINTF("[%u/%s] [%s] (%s:%ld) %s\r\n", level, tag, func, file, line, format); RD_PRINTF("[%u/%s] [%s] (%s:%ld) %s\r\n", level, tag, func, file, line, format);
} }

16
library/common/include/common.h

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

3
library/common/rd_mempool.c

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

7
library/common/rd_thread.c

@ -44,6 +44,7 @@
/*----------------------------------------------* /*----------------------------------------------*
* * * *
*----------------------------------------------*/ *----------------------------------------------*/
WEAK int Rd_SemInit(void *_sem, int _iPshared, int _iValue) WEAK int Rd_SemInit(void *_sem, int _iPshared, int _iValue)
{ {
return RD_FAILURE; return RD_FAILURE;
@ -84,17 +85,17 @@ WEAK int Rd_MutexDestroy(void *_pMutex)
return RD_FAILURE; return RD_FAILURE;
} }
WEAK int Rd_ShmOpen(rd_shm_t *_ptShm, const char *_psName, int _iSize, int _iIsCreator, rd_shm_mode_t _eMode) WEAK int Rd_ShmOpen(rd_shm_t *_ptShm, const char *_psName, int _iSize, int _iIsCreator, rd_shm_mode_t _eMode)
{ {
return RD_FAILURE; return RD_FAILURE;
} }
WEAK int Rd_ShmClose(rd_shm_t *_ptShm) WEAK int Rd_ShmClose(rd_shm_t *_ptShm)
{ {
return RD_SUCCESS; return RD_SUCCESS;
} }
WEAK int Rd_ShmUnlink(rd_shm_t *_ptShm) WEAK int Rd_ShmUnlink(rd_shm_t *_ptShm)
{ {
return RD_SUCCESS; return RD_SUCCESS;
} }

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) WEAK time_t rd_time(time_t *tloc)
{ {
if (tloc != NULL) if (tloc != NULL)
@ -89,3 +89,4 @@ WEAK void Rd_Delay(uint32_t Delay)
void HAL_Delay(uint32_t Delay); void HAL_Delay(uint32_t Delay);
HAL_Delay(Delay); HAL_Delay(Delay);
} }
#endif

9
library/list/CMakeLists.txt

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

5
library/log/CMakeLists.txt

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

5
library/ringbuffer/CMakeLists.txt

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

8
library/ringbuffer/include/ringbuffer.h

@ -70,10 +70,10 @@ typedef struct TRingBuffer rd_ringbuf_t;
struct TRingBuffer struct TRingBuffer
{ {
unsigned short m_bReadMirror : 1; unsigned char m_bReadMirror;
unsigned short m_sReadIndex : 15; unsigned short m_sReadIndex;
unsigned short m_bWriteMirror : 1; unsigned char m_bWriteMirror;
unsigned short m_sWriteIndex : 15; unsigned short m_sWriteIndex;
int m_iBufsize; int m_iBufsize;
char *m_pcBufPtr; 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)); length - (rb->m_iBufsize - rb->m_sWriteIndex));
/* we are going into the other side of the mirror */ /* 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); rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex);
return length; 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)); length - (rb->m_iBufsize - rb->m_sWriteIndex));
/* we are going into the other side of the mirror */ /* 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); rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex);
if (length > space_length) if (length > space_length)
{ {
if (rb->m_sWriteIndex <= rb->m_sReadIndex) if (rb->m_sWriteIndex <= rb->m_sReadIndex)
rb->m_bReadMirror = ~rb->m_bReadMirror; rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex; 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)); length - (rb->m_iBufsize - rb->m_sReadIndex));
/* we are going into the other side of the mirror */ /* 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); rb->m_sReadIndex = length - (rb->m_iBufsize - rb->m_sReadIndex);
return length; return length;
@ -290,7 +290,7 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr)
size = rb->m_iBufsize - rb->m_sReadIndex; size = rb->m_iBufsize - rb->m_sReadIndex;
/* we are going into the other side of the mirror */ /* we are going into the other side of the mirror */
//rb->m_bReadMirror = ~rb->m_bReadMirror; //rb->m_bReadMirror ^= 1;
//rb->m_sReadIndex = 0; //rb->m_sReadIndex = 0;
return size; return size;
@ -322,7 +322,7 @@ int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch)
/* flip mirror */ /* flip mirror */
if (rb->m_sWriteIndex == rb->m_iBufsize-1) if (rb->m_sWriteIndex == rb->m_iBufsize-1)
{ {
rb->m_bWriteMirror = ~rb->m_bWriteMirror; rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = 0; rb->m_sWriteIndex = 0;
} }
else else
@ -357,11 +357,11 @@ int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch)
/* flip mirror */ /* flip mirror */
if (rb->m_sWriteIndex == rb->m_iBufsize-1) if (rb->m_sWriteIndex == rb->m_iBufsize-1)
{ {
rb->m_bWriteMirror = ~rb->m_bWriteMirror; rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = 0; rb->m_sWriteIndex = 0;
if (old_state == RINGBUFFER_FULL) if (old_state == RINGBUFFER_FULL)
{ {
rb->m_bReadMirror = ~rb->m_bReadMirror; rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex; 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) if (rb->m_sReadIndex == rb->m_iBufsize-1)
{ {
rb->m_bReadMirror = ~rb->m_bReadMirror; rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = 0; rb->m_sReadIndex = 0;
} }
else else

17
peripheral/CMakeLists.txt

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

129
peripheral/com.c

@ -72,7 +72,8 @@ TComCtrl *rd_ComCreate(cbk_ComCheck _pfCheck, cbk_ComDecode _pfDecode, cbk_ComSe
if (NULL == ptComCtrl) return NULL; if (NULL == ptComCtrl) return NULL;
ptComCtrl->m_iBufferSize = _iSize; ptComCtrl->m_iBufferSize = _iSize;
ptComCtrl->m_pUserData = _pUserData; 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); Rd_SemInit(&ptComCtrl->m_stComBuf.m_sem_Send, 0, 0);
ptComCtrl->m_stComBuf.m_ptRecv = rd_RingbufferCreate(_iSize); ptComCtrl->m_stComBuf.m_ptRecv = rd_RingbufferCreate(_iSize);
rd_RingbufferReset(ptComCtrl->m_stComBuf.m_ptRecv); rd_RingbufferReset(ptComCtrl->m_stComBuf.m_ptRecv);
@ -117,7 +118,8 @@ int rd_ComDelete(TComCtrl *_ptComCtrl)
utarray_free(_ptComCtrl->m_pMutiDevArray); 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_SemDestroy(&_ptComCtrl->m_stComBuf.m_sem_Send);
rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptRecv); rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptRecv);
rd_RingbufferDestroy(_ptComCtrl->m_stComBuf.m_ptSend); 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) void rd_ComSendProc(TComCtrl *_ptComCtrl)
{ {
if (NULL == _ptComCtrl) return; if (NULL == _ptComCtrl) return;
char *pcBuffer = RD_CALLOC(1, _ptComCtrl->m_iBufferSize);;
int iRet = 0; int iRet = 0;
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL); 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) 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) void rd_ComRecvProc(TComCtrl *_ptComCtrl, const char *_pBuffer, uint32_t _iSize)
{ {
if (NULL == _ptComCtrl) return; 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) if (iRet > 0)
{ {
Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); 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) int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
{ {
if (NULL == _ptComCtrl) return RD_INVALUE; 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) if (iRet > 0)
{ {
Rd_SemPost(&_ptComCtrl->m_stComBuf.m_sem_Send, __func__, NULL); 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; 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 : rd_ComRead
: buffer实际大小 : buffer实际大小
@ -245,9 +226,6 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return RD_INVALUE; return RD_INVALUE;
} }
uint32_t u32CurrentTime = Rd_GetTime();
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL);
char *pPeakData = NULL; char *pPeakData = NULL;
int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); 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) 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 iPackLen = 1;
int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray); int iArrlen = utarray_len(_ptComCtrl->m_pMutiDevArray);
int bChecked = 0;
if (_ptComCtrl->m_iDevIndex < 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 **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, i);
TMutiDev *ptMutiDev = *ppMutiDev; TMutiDev *ptMutiDev = *ppMutiDev;
iPackLen = 1;
if (NULL != ptMutiDev->m_pfCheck) if (NULL != ptMutiDev->m_pfCheck)
{ {
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen);
} }
if (iPackLen > 0 && iPackLen <= iPeakLen) if (iPackLen > 0)
{ {
_ptComCtrl->m_iDevIndex = i; _ptComCtrl->m_iDevIndex = i;
bFound = 1; bFound = 1;
bDataValid = 1; bDataValid = 1;
bChecked = 1;
break; // 找到了就退出循环,去下面处理 break; // 找到了就退出循环,去下面处理
} }
else if(0 == iPackLen) else if(0 == iPackLen)
@ -302,6 +296,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
ptMutiDev->m_uiLastRecvTime = 0; ptMutiDev->m_uiLastRecvTime = 0;
bDataValid = 0; bDataValid = 0;
return RD_FAILURE;
} }
else 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 **ppMutiDev = (TMutiDev**)utarray_eltptr(_ptComCtrl->m_pMutiDevArray, _ptComCtrl->m_iDevIndex);
TMutiDev *ptMutiDev = *ppMutiDev; 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) if (iPackLen > 0 && iPackLen <= iPeakLen)
{ {
int iLen = (_iSize > iPackLen) ? iPackLen : _iSize; if (_iSize < (uint32_t)iPackLen)
int iRet = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, _pBuffer, iLen); {
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) if (iRet > 0)
{ {
_ptComCtrl->m_iDevIndex = -1; _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, iRet);
ptMutiDev->m_pfDecode(_pBuffer, iLen);
} }
return iRet; return iRet;
} }
@ -374,11 +388,30 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return RD_FAILURE; 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 else
{ {
// 长度错误或异常 // 长度错误或异常
char temp[1]; char temp[1];
rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1);
ptMutiDev->m_uiLastRecvTime = 0;
_ptComCtrl->m_iDevIndex = -1; _ptComCtrl->m_iDevIndex = -1;
return RD_FAILURE; return RD_FAILURE;
} }

1
peripheral/include/com.h

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

Loading…
Cancel
Save