From 1882d6d9952dbec3e6ac9ca57440d40dcf4b1e01 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 21 Apr 2026 12:02:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/CanSerialPortFrameTP.h | 2 +- Src/CanSerialPortFrameTP.c | 174 ++++++++++++++++++------------------- 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/Inc/CanSerialPortFrameTP.h b/Inc/CanSerialPortFrameTP.h index b2b854f..42f9ae8 100644 --- a/Inc/CanSerialPortFrameTP.h +++ b/Inc/CanSerialPortFrameTP.h @@ -91,7 +91,7 @@ typedef struct { tSerialPortFrameIO *ioCanFrame; tLoggerInterface *logger; char hexString[LEN_DEBUG_TP_BUFF]; - volatile bool isFlowControl; + bool isFlowControl; uint32_t timeoutFF; diff --git a/Src/CanSerialPortFrameTP.c b/Src/CanSerialPortFrameTP.c index fecfc35..52ca9ac 100644 --- a/Src/CanSerialPortFrameTP.c +++ b/Src/CanSerialPortFrameTP.c @@ -70,7 +70,7 @@ char *sendLogCanTpHex(tCanSerialPortFrameTp *env, uint8_t *data, size_t size) { for (uint8_t i = 0; i < full; ++i) { PrintfDebug(&data[i * 8], 8); - if ((len + strlen(strPrintfDebug_TP)) < LEN_DEBUG_TP_BUFF) { + if ((len + strlen(strPrintfDebug_TP)) < LEN_DEBUG_TP_BUFF) { memcpy(&env->hexString[len], strPrintfDebug_TP, strlen(strPrintfDebug_TP)); len += strlen(strPrintfDebug_TP); } else { @@ -82,7 +82,7 @@ char *sendLogCanTpHex(tCanSerialPortFrameTp *env, uint8_t *data, size_t size) { if (tail > 0) { PrintfDebug(&data[full * 8], tail); - if ((len + strlen(strPrintfDebug_TP)) < LEN_DEBUG_TP_BUFF) { + if ((len + strlen(strPrintfDebug_TP)) < LEN_DEBUG_TP_BUFF) { memcpy(&env->hexString[len], strPrintfDebug_TP, strlen(strPrintfDebug_TP)); len += strlen(strPrintfDebug_TP); } else { @@ -152,85 +152,6 @@ uint16_t sendConsecutiveFrame(tCanSerialPortFrameTp *env, uint8_t *data, uint16_ } -bool waitFlowControl(tCanSerialPortFrameTp *env) { - env->isFlowControl = true; - - uint32_t timeEnd = SystemGetMs() + WAIT_FC_FRAME_TIMEOUT; - - while (timeEnd > SystemGetMs()) { - if (!env->isFlowControl) { - break; - } - } - - if (env->isFlowControl) { - LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Flow control frame timeout"); - return false; - } - - return true; -} - -bool sendFirstFrame(tCanSerialPortFrameTp *env, uint8_t *data, uint16_t size, uint32_t id, uint32_t timeout) { - uint8_t dataTpFrame[8]; - uint16_t pDataLen = 0; - - memset(dataTpFrame, TP_FRAME_PADDING, sizeof(dataTpFrame)); - - eTpFrameFF *frame = (eTpFrameFF *) dataTpFrame; - frame->typeFrame = TP_TYPE_FRAME_FF; - frame->dlL = size; - frame->dlM = (size >> 8); - - memcpy(&frame->data[0], &data[pDataLen], 6); - pDataLen += 6; - - uint16_t sent = env->ioCanFrame->transmit(env->ioCanFrame->env, (uint8_t *) frame, 8, id, - PROTOCOL_CAN_TYPE_UDS, timeout); - - bool result = waitFlowControl(env); - if (!result) - return false; - - uint16_t countPacketFull = (size - 6) / 7; - uint16_t sizePacketTail = (size - 6) % 7; - - uint8_t sn = 1; - - for (uint16_t i = 0; i < countPacketFull; ++i) { - - sendConsecutiveFrame(env, &data[pDataLen], 7, id, sn, timeout); - pDataLen += 7; - - ++sn; - if (sn > 15) { - sn = 0; - } - } - - if (sizePacketTail) { - sendConsecutiveFrame(env, &data[pDataLen], sizePacketTail, id, sn, timeout); - pDataLen += sizePacketTail; - } - - return true; - -} - -bool -CanSerialPortFrameTpTransmit(tCanSerialPortFrameTp *env, uint8_t *data, uint16_t size, uint32_t id, uint32_t timeout) { - bool result; - - // Single Frame SF - if (size <= 7) { - result = sendSingleFrame(env, data, size, id, timeout); - } else { - result = sendFirstFrame(env, data, size, id, timeout); - } - - return result; -} - eTpResult vCanSerialPortFrameTpReceive(tCanSerialPortFrameTp *env, uint32_t timeout) { can_rx_message_type canFrame; @@ -399,17 +320,96 @@ eTpResult vCanSerialPortFrameTpReceive(tCanSerialPortFrameTp *env, uint32_t time } +bool waitFlowControl(tCanSerialPortFrameTp *env) { + + env->isFlowControl = true; + + eTpResult result = vCanSerialPortFrameTpReceive(env, WAIT_FC_FRAME_TIMEOUT); + + if (result == TP_RECEIVED_FC_DATA) { + if (env->isFlowControl) { + env->isFlowControl = false; + LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Flow control frame accepted"); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Error: An unexpected Flow Control Frame was received"); + } + } + + if (env->isFlowControl) { + LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Flow control frame timeout"); + return false; + } + + return true; +} + +bool sendFirstFrame(tCanSerialPortFrameTp *env, uint8_t *data, uint16_t size, uint32_t id, uint32_t timeout) { + uint8_t dataTpFrame[8]; + uint16_t pDataLen = 0; + + memset(dataTpFrame, TP_FRAME_PADDING, sizeof(dataTpFrame)); + + eTpFrameFF *frame = (eTpFrameFF *) dataTpFrame; + frame->typeFrame = TP_TYPE_FRAME_FF; + frame->dlL = size; + frame->dlM = (size >> 8); + + memcpy(&frame->data[0], &data[pDataLen], 6); + pDataLen += 6; + + uint16_t sent = env->ioCanFrame->transmit(env->ioCanFrame->env, (uint8_t *) frame, 8, id, + PROTOCOL_CAN_TYPE_UDS, timeout); + + bool result = waitFlowControl(env); + if (!result) + return false; + + uint16_t countPacketFull = (size - 6) / 7; + uint16_t sizePacketTail = (size - 6) % 7; + + uint8_t sn = 1; + + for (uint16_t i = 0; i < countPacketFull; ++i) { + + sendConsecutiveFrame(env, &data[pDataLen], 7, id, sn, timeout); + pDataLen += 7; + + ++sn; + if (sn > 15) { + sn = 0; + } + } + + if (sizePacketTail) { + sendConsecutiveFrame(env, &data[pDataLen], sizePacketTail, id, sn, timeout); + pDataLen += sizePacketTail; + } + + return true; + +} + +bool +CanSerialPortFrameTpTransmit(tCanSerialPortFrameTp *env, uint8_t *data, uint16_t size, uint32_t id, uint32_t timeout) { + bool result; + + // Single Frame SF + if (size <= 7) { + result = sendSingleFrame(env, data, size, id, timeout); + } else { + result = sendFirstFrame(env, data, size, id, timeout); + } + + return result; +} + + _Noreturn void CanTpProcessing_ListenerTask(tCanSerialPortFrameTp *env) { while (1) { eTpResult result = vCanSerialPortFrameTpReceive(env, 1000); if (result == TP_RECEIVED_FC_DATA) { - if (env->isFlowControl) { - env->isFlowControl = false; - LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Flow control frame accepted"); - } else { - LoggerErrorStatic(LOGGER, LOG_SIGN, "Error: An unexpected Flow Control Frame was received"); - } + LoggerErrorStatic(LOGGER, LOG_SIGN, "Error: An unexpected Flow Control Frame was received (listener)"); } if (result == TP_RECEIVED_DATA) {