подправлены внешний вид и коменты
This commit is contained in:
120
rs_message.cpp
120
rs_message.cpp
@@ -35,7 +35,7 @@
|
||||
*
|
||||
* @note
|
||||
* - В режиме Arduino loop необходимо вызывать RS_Process() в основном цикле.
|
||||
* - В режиме FreeRTOS требуется определить макрос RS_IN_FREERTOS,
|
||||
* - В режиме FreeRTOS требуется определить макрос RS_IN_RTOS,
|
||||
* создать задачу RS_Task и подключить RS_UART_RX_Handler() к ISR UART.
|
||||
* - UART используется через стандартный Arduino Stream API (write, read, available).
|
||||
*
|
||||
@@ -50,7 +50,7 @@ void loop() {
|
||||
RS_Process(&hRS);
|
||||
}
|
||||
* @endverbatim
|
||||
* Пример использования с FreeRTOS:
|
||||
* Пример использования с RTOS:
|
||||
* @verbatim
|
||||
RS_HandleTypeDef hRS;
|
||||
RS_MsgTypeDef msg;
|
||||
@@ -65,24 +65,20 @@ void eventSerial() {
|
||||
* @endverbatim
|
||||
**************************************************************************/
|
||||
|
||||
#include "rs_message.h"
|
||||
|
||||
#ifdef RS_IN_FREERTOS
|
||||
#include <FreeRTOS.h>
|
||||
#endif
|
||||
#include "modbus/rs_message.h"
|
||||
|
||||
uint8_t RS_Buffer[MSG_SIZE_MAX]; // uart buffer
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//-------------------------GENERAL FUNCTIONS-------------------------
|
||||
/**
|
||||
* @brief Initialize UART and handle RS stucture.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param SerialPort - указатель на структуру с настройками UART.
|
||||
* @param pRS_BufferPtr - указатель на буффер для приема-передачи по UART. Если он NULL, то поставиться библиотечный буфер.
|
||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
||||
* @note Инициализация периферии и структуры для приема-передачи по RS.
|
||||
*/
|
||||
* @brief Initialize UART and handle RS stucture.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param SerialPort - указатель на структуру с настройками UART.
|
||||
* @param pRS_BufferPtr - указатель на буффер для приема-передачи по UART. Если он NULL, то поставиться библиотечный буфер.
|
||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
||||
* @note Инициализация периферии и структуры для приема-передачи по RS.
|
||||
*/
|
||||
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, HUART_TypeDef *SerialPort, uint32_t baudRate, uint8_t *pRS_BufferPtr) {
|
||||
if (!hRS || !SerialPort) {
|
||||
RS_DEBUG_PRINT("[RS] Init error: null handler or port");
|
||||
@@ -100,9 +96,9 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, HUART_TypeDef *SerialPort, uint3
|
||||
hRS->f.RX_Half = 0;
|
||||
hRS->lastByteTime = 0;
|
||||
|
||||
RS_EnableReceive();
|
||||
RS_Set_Busy(hRS);
|
||||
RS_Set_RX_Flags(hRS);
|
||||
RS_EnableReceive();
|
||||
RS_Set_Busy(hRS);
|
||||
RS_Set_RX_Flags(hRS);
|
||||
|
||||
hRS->huart->begin(hRS->baudRate, SERIAL_8N1, hRS->rx_pin, hRS->tx_pin);
|
||||
|
||||
@@ -111,14 +107,14 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, HUART_TypeDef *SerialPort, uint3
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Abort RS/UART.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param AbortMode - выбор, что надо отменить.
|
||||
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
|
||||
- ABORT_RX: Отмена приема по ЮАРТ, с очищением флагов RX,
|
||||
- ABORT_RX_TX: Отмена приема и передачи по ЮАРТ,
|
||||
- ABORT_RS: Отмена приема-передачи RS, с очищением всей структуры.
|
||||
* @return RS_RES - статус о состоянии RS после аборта.
|
||||
* @brief Abort RS/UART.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param AbortMode - выбор, что надо отменить.
|
||||
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
|
||||
- ABORT_RX: Отмена приема по ЮАРТ, с очищением флагов RX,
|
||||
- ABORT_RX_TX: Отмена приема и передачи по ЮАРТ,
|
||||
- ABORT_RS: Отмена приема-передачи RS, с очищением всей структуры.
|
||||
* @return RS_RES - статус о состоянии RS после аборта.
|
||||
* @details В Arduino аппаратный UART (Serial) не отключается физически,
|
||||
* т.к. стандартный API HardwareSerial не даёт прямого доступа
|
||||
* к регистрах UART. RS_Abort лишь очищает внутренние флаги
|
||||
@@ -149,12 +145,12 @@ RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle for starting transmit.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
||||
* @details Определяет отвечать ли на команду или нет.
|
||||
*/
|
||||
* @brief Handle for starting transmit.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
||||
* @details Определяет отвечать ли на команду или нет.
|
||||
*/
|
||||
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
||||
{
|
||||
if (hRS == nullptr || RS_msg == nullptr) {
|
||||
@@ -180,14 +176,14 @@ RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *
|
||||
hRS->huart->write(hRS->pBufferPtr, hRS->RS_Message_Size);
|
||||
RS_Set_TX_End(hRS);
|
||||
|
||||
RS_Set_RX_Flags(hRS);
|
||||
RS_Set_RX_Flags(hRS);
|
||||
RS_Set_RX_Flags(hRS);
|
||||
RS_Set_RX_Flags(hRS);
|
||||
|
||||
RS_DEBUG_PRINT("[RS] TX finished");
|
||||
return RS_OK;
|
||||
}
|
||||
|
||||
#ifdef RS_IN_FREERTOS
|
||||
#ifdef RS_IN_RTOS
|
||||
|
||||
/**
|
||||
* @brief Задача обработки UART приёма (FreeRTOS).
|
||||
@@ -203,7 +199,7 @@ void RS_Task(void *pvParameters) {
|
||||
vTaskDelay(pdMS_TO_TICKS(hRS->taskDelay));
|
||||
}
|
||||
}
|
||||
#endif // RS_IN_FREERTOS
|
||||
#endif // RS_IN_RTOS
|
||||
|
||||
|
||||
/**
|
||||
@@ -256,7 +252,7 @@ void RS_Process(RS_HandleTypeDef *hRS)
|
||||
|
||||
// Если достигнут размер первой части пакета — определяем полный размер
|
||||
if (rx_index == RX_FIRST_PART_SIZE && (hRS->f.RX_Half == 0) && hRS->sRS_RX_Size_Mode == RS_RX_Size_NotConst) {
|
||||
hRS->f.RX_Half = 1;
|
||||
hRS->f.RX_Half = 1;
|
||||
uint32_t data_size;
|
||||
RS_DEBUG_PRINT("[RS] Defining size...");
|
||||
RS_Define_Size_of_RX_Message(hRS, &data_size);
|
||||
@@ -292,39 +288,39 @@ void RS_Process(RS_HandleTypeDef *hRS)
|
||||
//-------------------------------------------------------------------
|
||||
//--------------WEAK PROTOTYPES FOR PROCESSING MESSAGE---------------
|
||||
/**
|
||||
* @brief Respond accord to received message.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @return RS_RES - статус о результате ответа на комманду.
|
||||
* @details Обработка принятой комманды и ответ на неё.
|
||||
*/
|
||||
* @brief Respond accord to received message.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @return RS_RES - статус о результате ответа на комманду.
|
||||
* @details Обработка принятой комманды и ответ на неё.
|
||||
*/
|
||||
__attribute__((weak)) RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg) { return RS_ERR; }
|
||||
|
||||
/**
|
||||
* @brief Collect message in buffer to transmit it.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @param msg_uart_buff - указатель на буффер UART.
|
||||
* @return RS_RES - статус о результате заполнения буфера.
|
||||
* @details Заполнение буффера UART из структуры сообщения.
|
||||
*/
|
||||
* @brief Collect message in buffer to transmit it.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @param msg_uart_buff - указатель на буффер UART.
|
||||
* @return RS_RES - статус о результате заполнения буфера.
|
||||
* @details Заполнение буффера UART из структуры сообщения.
|
||||
*/
|
||||
__attribute__((weak)) RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff) { return RS_ERR; }
|
||||
|
||||
/**
|
||||
* @brief Parse message from buffer to process it.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @param msg_uart_buff - указатель на буффер UART.
|
||||
* @return RS_RES - статус о результате заполнения структуры.
|
||||
* @details Заполнение структуры сообщения из буффера UART.
|
||||
*/
|
||||
* @brief Parse message from buffer to process it.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param RS_msg - указатель на структуру сообщения.
|
||||
* @param msg_uart_buff - указатель на буффер UART.
|
||||
* @return RS_RES - статус о результате заполнения структуры.
|
||||
* @details Заполнение структуры сообщения из буффера UART.
|
||||
*/
|
||||
__attribute__((weak)) RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff) { return RS_ERR; }
|
||||
|
||||
/**
|
||||
* @brief Define size of RX Message that need to be received.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param rx_data_size - указатель на переменную для записи кол-ва байт для принятия.
|
||||
* @return RS_RES - статус о корректности рассчета кол-ва байт для принятия.
|
||||
* @details Определение сколько байтов надо принять по протоколу.
|
||||
*/
|
||||
* @brief Define size of RX Message that need to be received.
|
||||
* @param hRS - указатель на хендлер RS.
|
||||
* @param rx_data_size - указатель на переменную для записи кол-ва байт для принятия.
|
||||
* @return RS_RES - статус о корректности рассчета кол-ва байт для принятия.
|
||||
* @details Определение сколько байтов надо принять по протоколу.
|
||||
*/
|
||||
__attribute__((weak)) RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hRS, uint32_t *rx_data_size) { return RS_ERR; }
|
||||
|
||||
Reference in New Issue
Block a user