@@ -1,7 +1,7 @@
#include "proto can.h"
#include "set can.h"
Proto CanDevice_t CurrentDevice;
Set CanDevice_t CurrentDevice;
Proto CanDevice_t Device_on_the_Network[8][16];
Set CanDevice_t Device_on_the_Network[8][16];
struct controlflags ControlFlags;
struct controlflags ControlFlags;
CAN_HandleTypeDef *_HCAN = 0;
CAN_HandleTypeDef *_HCAN = 0;
@@ -10,7 +10,7 @@ TIM_HandleTypeDef *_HTIM = 0;
uint8_t CurrentStep = 1;
uint8_t CurrentStep = 1;
uint8_t LastStep = 0;
uint8_t LastStep = 0;
struct RXMsg rxMsg[PROTO CAN_RX_BUFFER_SIZE];
struct RXMsg rxMsg[SET CAN_RX_BUFFER_SIZE];
/**
/**
* @brief Проверяет, является ли год високосным.
* @brief Проверяет, является ли год високосным.
@@ -33,10 +33,10 @@ _Bool IsLeapYear(uint8_t year)
*/
*/
uint16_t AvailableCanRxMsg(void)
uint16_t AvailableCanRxMsg(void)
{
{
return ((uint16_t)(PROTO CAN_RX_BUFFER_SIZE + (LastStep - CurrentStep + 1))) % PROTO CAN_RX_BUFFER_SIZE;
return ((uint16_t)(SET CAN_RX_BUFFER_SIZE + (LastStep - CurrentStep + 1))) % SET CAN_RX_BUFFER_SIZE;
}
}
void PROTO CAN_DEINIT(uint8_t stage)
void SET CAN_DEINIT(uint8_t stage)
{
{
switch(stage)
switch(stage)
{
{
@@ -56,25 +56,25 @@ void PROTOCAN_DEINIT(uint8_t stage)
/**
/**
* @brief Инициализация переферии
* @brief Инициализация переферии
* @details Инициализация указателей на HCAN, HRTC, установка фильтров CAN.
* @details Инициализация указателей на HCAN, HRTC, установка фильтров CAN.
* @note Фильтры CAN описаны в разделе PROTO CAN_CAN_FILTERS().
* @note Фильтры CAN описаны в разделе SET CAN_CAN_FILTERS().
*/
*/
PROTO CAN_INIT_StatusTypeDef PROTO CAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc, TIM_HandleTypeDef *tmp_tim)
SET CAN_INIT_StatusTypeDef SET CAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc, TIM_HandleTypeDef *tmp_tim)
{
{
unsigned initStage = 0;
unsigned initStage = 0;
if(tmp_hcan)
if(tmp_hcan)
{
{
_HCAN = tmp_hcan;
_HCAN = tmp_hcan;
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
HAL_StatusTypeDef CAN_RC_RESULT = HAL_CAN_RegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID, Proto CanRxFifo0MsgPendingCallback);
HAL_StatusTypeDef CAN_RC_RESULT = HAL_CAN_RegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID, Set CanRxFifo0MsgPendingCallback);
if(CAN_RC_RESULT != HAL_OK)
if(CAN_RC_RESULT != HAL_OK)
{
{
PROTO CAN_DEINIT(initStage);
SET CAN_DEINIT(initStage);
return PROTO CAN_INIT_HRTC_ERROR;
return SET CAN_INIT_HRTC_ERROR;
}
}
#endif
#endif
} else {
} else {
PROTO CAN_DEINIT(initStage);
SET CAN_DEINIT(initStage);
return PROTO CAN_INIT_HCAN_ERROR;
return SET CAN_INIT_HCAN_ERROR;
}
}
initStage++;
initStage++;
if(tmp_hrtc)
if(tmp_hrtc)
@@ -83,31 +83,31 @@ PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_Handl
}
}
else
else
{
{
PROTO CAN_DEINIT(initStage);
SET CAN_DEINIT(initStage);
return PROTO CAN_INIT_HRTC_ERROR;
return SET CAN_INIT_HRTC_ERROR;
}
}
initStage++;
initStage++;
if(tmp_tim)
if(tmp_tim)
{
{
_HTIM = tmp_tim;
_HTIM = tmp_tim;
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
HAL_StatusTypeDef TIM_RC_RESULT = HAL_TIM_RegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID, Proto CanPulseCallback);
HAL_StatusTypeDef TIM_RC_RESULT = HAL_TIM_RegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID, Set CanPulseCallback);
if(TIM_RC_RESULT != HAL_OK)
if(TIM_RC_RESULT != HAL_OK)
{
{
PROTO CAN_DEINIT(initStage);
SET CAN_DEINIT(initStage);
return PROTO CAN_INIT_HRTC_ERROR;
return SET CAN_INIT_HRTC_ERROR;
}
}
#endif
#endif
}
}
else
else
{
{
PROTO CAN_DEINIT(initStage);
SET CAN_DEINIT(initStage);
return PROTO CAN_INIT_TIM_ERROR;
return SET CAN_INIT_TIM_ERROR;
}
}
initStage++;
initStage++;
PROTO CAN_FILTERS();
SET CAN_FILTERS();
ControlFlags.IsPulse = 1;
ControlFlags.IsPulse = 1;
return PROTO CAN_INIT_OK;
return SET CAN_INIT_OK;
}
}
/**
/**
@@ -129,41 +129,41 @@ PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_Handl
* В конце каждого обработанного сообщения индекс текущего элемента буфера инкрементируется
* В конце каждого обработанного сообщения индекс текущего элемента буфера инкрементируется
* с учетом размера буфера через операцию по модулю.
* с учетом размера буфера через операцию по модулю.
*/
*/
void PROTO CAN_LoopProcessRxMsgs(void)
void SET CAN_LoopProcessRxMsgs(void)
{
{
while(1)
while(1)
{
{
if(AvailableCanRxMsg())
if(AvailableCanRxMsg())
{
{
if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ANALOG)
if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ANALOG)
{
{
PROTO CAN_AnalogProcessing(rxMsg[CurrentStep]);
SET CAN_AnalogProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_BROADCAST)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_BROADCAST)
{
{
PROTO CAN_BroadcastProcessing(rxMsg[CurrentStep]);
SET CAN_BroadcastProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_DISCRETE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_DISCRETE)
{
{
PROTO CAN_DiscreticProcessing(rxMsg[CurrentStep]);
SET CAN_DiscreticProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
{
{
Proto CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
Set CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_COIL ||
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_COIL ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_INPUT)
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_INPUT)
{
{
PROTO CAN_ModbusProcessing(rxMsg[CurrentStep]);
SET CAN_ModbusProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ERROR)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ERROR)
{
{
PROTO CAN_RequestError(rxMsg[CurrentStep]);
SET CAN_RequestError(rxMsg[CurrentStep]);
}
}
// Обновление индекса текущего сообщения с циклическим масштабированием
// Обновление индекса текущего сообщения с циклическим масштабированием
CurrentStep = (uint16_t)(CurrentStep + 1) % PROTO CAN_RX_BUFFER_SIZE;
CurrentStep = (uint16_t)(CurrentStep + 1) % SET CAN_RX_BUFFER_SIZE;
}
}
}
}
}
}
@@ -176,46 +176,46 @@ void PROTOCAN_LoopProcessRxMsgs(void)
* После обработки каждого сообщения индекс текущего элемента буфера обновляется
* После обработки каждого сообщения индекс текущего элемента буфера обновляется
* циклически.
* циклически.
*
*
* @return PROTO CAN_OK, если все сообщения были обработаны успешно.
* @return SET CAN_OK, если все сообщения были обработаны успешно.
* В противном случае возвращается код ошибки, полученный при обработке сообщения.
* В противном случае возвращается код ошибки, полученный при обработке сообщения.
*
*
* Обработка происходит до тех пор, пока есть доступные сообщения, полученные функцией
* Обработка происходит до тех пор, пока есть доступные сообщения, полученные функцией
* AvailableCanRxMsg().
* AvailableCanRxMsg().
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_ProcessAllRxMsgs(void)
SET CAN_StatusTypeDef SET CAN_ProcessAllRxMsgs(void)
{
{
PROTO CAN_StatusTypeDef result = PROTO CAN_TIMEOUT;
SET CAN_StatusTypeDef result = SET CAN_TIMEOUT;
while(AvailableCanRxMsg())
while(AvailableCanRxMsg())
{
{
if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ANALOG)
if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ANALOG)
{
{
result = PROTO CAN_AnalogProcessing(rxMsg[CurrentStep]);
result = SET CAN_AnalogProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_BROADCAST)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_BROADCAST)
{
{
result = PROTO CAN_BroadcastProcessing(rxMsg[CurrentStep]);
result = SET CAN_BroadcastProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_DISCRETE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_DISCRETE)
{
{
result = PROTO CAN_DiscreticProcessing(rxMsg[CurrentStep]);
result = SET CAN_DiscreticProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
{
{
result = Proto CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
result = Set CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_COIL ||
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_COIL ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_INPUT)
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_INPUT)
{
{
result = PROTO CAN_ModbusProcessing(rxMsg[CurrentStep]);
result = SET CAN_ModbusProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ERROR)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ERROR)
{
{
result = PROTO CAN_RequestError(rxMsg[CurrentStep]);
result = SET CAN_RequestError(rxMsg[CurrentStep]);
}
}
CurrentStep = (uint16_t)(CurrentStep + 1) % PROTO CAN_RX_BUFFER_SIZE;
CurrentStep = (uint16_t)(CurrentStep + 1) % SET CAN_RX_BUFFER_SIZE;
if(result != PROTO CAN_OK)
if(result != SET CAN_OK)
{
{
return result;
return result;
}
}
@@ -231,43 +231,43 @@ PROTOCAN_StatusTypeDef PROTOCAN_ProcessAllRxMsgs(void)
* индекс текущего сообщения обновляется циклически.
* индекс текущего сообщения обновляется циклически.
*
*
* @return Прошедший статус обработки:
* @return Прошедший статус обработки:
* - PROTO CAN_OK, если сообщение успешно обработано,
* - SET CAN_OK, если сообщение успешно обработано,
* - PROTO CAN_TIMEOUT, если сообщений не было,
* - SET CAN_TIMEOUT, если сообщений не было,
* - или код ошибки, возвращенный функцией обработки.
* - или код ошибки, возвращенный функцией обработки.
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_ProcessSingleRxMsg(void)
SET CAN_StatusTypeDef SET CAN_ProcessSingleRxMsg(void)
{
{
PROTO CAN_StatusTypeDef result = PROTO CAN_TIMEOUT;
SET CAN_StatusTypeDef result = SET CAN_TIMEOUT;
if(AvailableCanRxMsg())
if(AvailableCanRxMsg())
{
{
if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ANALOG)
if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ANALOG)
{
{
result = PROTO CAN_AnalogProcessing(rxMsg[CurrentStep]);
result = SET CAN_AnalogProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_BROADCAST)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_BROADCAST)
{
{
result = PROTO CAN_BroadcastProcessing(rxMsg[CurrentStep]);
result = SET CAN_BroadcastProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_DISCRETE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_DISCRETE)
{
{
result = PROTO CAN_DiscreticProcessing(rxMsg[CurrentStep]);
result = SET CAN_DiscreticProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_GENERAL_ADDRESS_SPACE)
{
{
result = Proto CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
result = Set CanMsgToGeneralAddressSpace(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_COIL ||
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_COIL ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_DISCRETE ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_HOLDING ||
rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_MODBUS_INPUT)
rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_MODBUS_INPUT)
{
{
result = PROTO CAN_ModbusProcessing(rxMsg[CurrentStep]);
result = SET CAN_ModbusProcessing(rxMsg[CurrentStep]);
}
}
else if(rxMsg[CurrentStep].eID.Fields.MsgType == PROTO CAN_MSGTYPE_ERROR)
else if(rxMsg[CurrentStep].eID.Fields.MsgType == SET CAN_MSGTYPE_ERROR)
{
{
result = PROTO CAN_RequestError(rxMsg[CurrentStep]);
result = SET CAN_RequestError(rxMsg[CurrentStep]);
}
}
CurrentStep = (uint16_t)(CurrentStep + 1) % PROTO CAN_RX_BUFFER_SIZE;
CurrentStep = (uint16_t)(CurrentStep + 1) % SET CAN_RX_BUFFER_SIZE;
}
}
return result;
return result;
}
}
@@ -278,41 +278,41 @@ PROTOCAN_StatusTypeDef PROTOCAN_ProcessSingleRxMsg(void)
* @details Функция, выполняющая команды, переданные в широковещательном формате с головного (master) устройства. Типы команд: Запрос статуса, запрос на включение или выключение, рестарт устройств, установка времени.
* @details Функция, выполняющая команды, переданные в широковещательном формате с головного (master) устройства. Типы команд: Запрос статуса, запрос на включение или выключение, рестарт устройств, установка времени.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_BroadcastProcessing(struct RXMsg _rxMsg)
SET CAN_StatusTypeDef SET CAN_BroadcastProcessing(struct RXMsg _rxMsg)
{
{
msgBodyBroadcastType msg;
msgBodyBroadcastType msg;
msg.Body = _rxMsg.eID.Fields.MsgBody;
msg.Body = _rxMsg.eID.Fields.MsgBody;
switch(msg.Fields.Type)
switch(msg.Fields.Type)
{
{
case PROTO CAN_BROADCAST_STATUS:
case SET CAN_BROADCAST_STATUS:
{
{
//Обработка запроса статуса устройства
//Обработка запроса статуса устройства
return Proto CanMsgToBroadcastStatus(_rxMsg);
return Set CanMsgToBroadcastStatus(_rxMsg);
}
}
case PROTO CAN_BROADCAST_ONOFF:
case SET CAN_BROADCAST_ONOFF:
{
{
//Обработка запроса на вкл/выкл
//Обработка запроса на вкл/выкл
Proto CanMsgToBroadcastOnOff(_rxMsg);
Set CanMsgToBroadcastOnOff(_rxMsg);
break;
break;
}
}
case PROTO CAN_BROADCAST_RESTARTDEVICE:
case SET CAN_BROADCAST_RESTARTDEVICE:
{
{
Proto CanMsgToBroadcastRestart(_rxMsg);
Set CanMsgToBroadcastRestart(_rxMsg);
break;
break;
}
}
case PROTO CAN_BROADCAST_RTCSETUP:
case SET CAN_BROADCAST_RTCSETUP:
{
{
//Обработка запроса на синхронизацию времени
//Обработка запроса на синхронизацию времени
//С головным устройством
//С головным устройством
Proto CanMsgToBroadcastRtcSetup(_rxMsg);
Set CanMsgToBroadcastRtcSetup(_rxMsg);
break;;
break;;
}
}
default:
default:
//RESERVE SENSOR TYPE.
//RESERVE SENSOR TYPE.
return PROTO CAN_ERROR;
return SET CAN_ERROR;
break;
break;
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -321,7 +321,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_BroadcastProcessing(struct RXMsg _rxMsg)
* @param _rxMsg Структура полученного по CAN запроса.
* @param _rxMsg Структура полученного по CAN запроса.
* @return HAL_StatusTypeDef Статус операции HAL, например HAL_OK при успехе.
* @return HAL_StatusTypeDef Статус операции HAL, например HAL_OK при успехе.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToBroadcastStatus(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToBroadcastStatus(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -330,9 +330,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastStatus(struct RXMsg _rxMsg)
TxHeader.DLC = 7;
TxHeader.DLC = 7;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
tmp_eID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
tmp_eID.Fields.DeviceID = CURRENT_ID_DEVICE;
tmp_eID.Fields.DeviceID = CURRENT_ID_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
@@ -347,7 +347,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastStatus(struct RXMsg _rxMsg)
data[4] = DateToUpdate.Month;
data[4] = DateToUpdate.Month;
data[5] = DateToUpdate.Date;
data[5] = DateToUpdate.Date;
data[6] = DateToUpdate.WeekDay;
data[6] = DateToUpdate.WeekDay;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -356,10 +356,10 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastStatus(struct RXMsg _rxMsg)
* В данном случае — просто инвертирует е г о логическое значение.
* В данном случае — просто инвертирует е г о логическое значение.
* @param _rxMsg Структура полученного CAN-сообщения (Пока не используется в функции).
* @param _rxMsg Структура полученного CAN-сообщения (Пока не используется в функции).
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToBroadcastOnOff(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToBroadcastOnOff(struct RXMsg _rxMsg)
{
{
ControlFlags.IsPulse = !ControlFlags.IsPulse;
ControlFlags.IsPulse = !ControlFlags.IsPulse;
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -368,11 +368,11 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastOnOff(struct RXMsg _rxMsg)
* вызывает системный перезапуск.
* вызывает системный перезапуск.
* @param _rxMsg Структура полученного CAN-сообщения с командой перезапуска.
* @param _rxMsg Структура полученного CAN-сообщения с командой перезапуска.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToBroadcastRestart(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToBroadcastRestart(struct RXMsg _rxMsg)
{
{
if(_rxMsg.DLC == 0)
if(_rxMsg.DLC == 0)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
msgBodyBroadcastType msg;
msgBodyBroadcastType msg;
msg.Body = _rxMsg.eID.Fields.MsgBody;
msg.Body = _rxMsg.eID.Fields.MsgBody;
@@ -388,7 +388,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastRestart(struct RXMsg _rxMsg)
NVIC_SystemReset();
NVIC_SystemReset();
}
}
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -397,11 +397,11 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastRestart(struct RXMsg _rxMsg)
* вызывает функцию синхронизации RTC.
* вызывает функцию синхронизации RTC.
* @param _rxMsg Структура полученного CAN-сообщения с данными для установки времени и даты.
* @param _rxMsg Структура полученного CAN-сообщения с данными для установки времени и даты.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToBroadcastRtcSetup(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToBroadcastRtcSetup(struct RXMsg _rxMsg)
{
{
if(_rxMsg.DLC > 7)
if(_rxMsg.DLC > 7)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
else
else
{
{
@@ -415,14 +415,14 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastRtcSetup(struct RXMsg _rxMsg
_rxMsg.Data[5] > DaysCount_Normal[IsLeapYear(_rxMsg.Data[3])][_rxMsg.Data[4]] ||
_rxMsg.Data[5] > DaysCount_Normal[IsLeapYear(_rxMsg.Data[3])][_rxMsg.Data[4]] ||
_rxMsg.Data[6] > 6)
_rxMsg.Data[6] > 6)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
else
else
{
{
PROTO CAN_RTC_SYNC(_rxMsg.Data);
SET CAN_RTC_SYNC(_rxMsg.Data);
}
}
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -432,53 +432,53 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToBroadcastRtcSetup(struct RXMsg _rxMsg
* @note Запрос на устройство. Головное (master) устройство запрашивает некоторое колличество параметров. В Data - 64 битовых адресса параметров, тип которых задаётся в Sensor ID. Имеется возможность запрашивать непоследовательные параметры.
* @note Запрос на устройство. Головное (master) устройство запрашивает некоторое колличество параметров. В Data - 64 битовых адресса параметров, тип которых задаётся в Sensor ID. Имеется возможность запрашивать непоследовательные параметры.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_DiscreticProcessing(struct RXMsg _rxMsg)
SET CAN_StatusTypeDef SET CAN_DiscreticProcessing(struct RXMsg _rxMsg)
{
{
msgBodyDiscreteType msg;
msgBodyDiscreteType msg;
msg.Body = _rxMsg.eID.Fields.MsgBody;
msg.Body = _rxMsg.eID.Fields.MsgBody;
switch(msg.Fields.Type)
switch(msg.Fields.Type)
{
{
case PROTO CAN_DISCRETE_ACCIDENT:
case SET CAN_DISCRETE_ACCIDENT:
{
{
Proto CanMsgToDiscreteAccident(_rxMsg);
Set CanMsgToDiscreteAccident(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_WARNING:
case SET CAN_DISCRETE_WARNING:
{
{
Proto CanMsgToDiscreteWarning(_rxMsg);
Set CanMsgToDiscreteWarning(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_CONTROL_SIGNALS:
case SET CAN_DISCRETE_CONTROL_SIGNALS:
{
{
Proto CanMsgToDiscreteControlSignals(_rxMsg);
Set CanMsgToDiscreteControlSignals(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_FLAGS:
case SET CAN_DISCRETE_FLAGS:
{
{
Proto CanMsgToDiscreteFlags(_rxMsg);
Set CanMsgToDiscreteFlags(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_RESET:
case SET CAN_DISCRETE_RESET:
{
{
Proto CanMsgToDiscreteReset(_rxMsg);
Set CanMsgToDiscreteReset(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_CHANGE_MODE:
case SET CAN_DISCRETE_CHANGE_MODE:
{
{
Proto CanMsgToDiscreteChangeMode(_rxMsg);
Set CanMsgToDiscreteChangeMode(_rxMsg);
break;
break;
}
}
case PROTO CAN_DISCRETE_REQUEST_LIST_OF_PARAMETERS:
case SET CAN_DISCRETE_REQUEST_LIST_OF_PARAMETERS:
{
{
Proto CanMsgToDiscreteRequestListOfParameters(_rxMsg);
Set CanMsgToDiscreteRequestListOfParameters(_rxMsg);
break;
break;
}
}
default:
default:
//RESERVE SENSOR TYPE.
//RESERVE SENSOR TYPE.
return PROTO CAN_ERROR;
return SET CAN_ERROR;
break;
break;
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -487,9 +487,9 @@ PROTOCAN_StatusTypeDef PROTOCAN_DiscreticProcessing(struct RXMsg _rxMsg)
* Можно реализовать отправку или обработку аварийных данных.
* Можно реализовать отправку или обработку аварийных данных.
* @param _rxMsg Входящее сообщение с данными запроса.
* @param _rxMsg Входящее сообщение с данными запроса.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteAccident(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteAccident(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -498,9 +498,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteAccident(struct RXMsg _rxMsg)
* Можно реализовать обработку или ответ на предупреждения.
* Можно реализовать обработку или ответ на предупреждения.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteWarning(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteWarning(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -509,9 +509,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteWarning(struct RXMsg _rxMsg)
* Можно реализовать управление сигналами.
* Можно реализовать управление сигналами.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteControlSignals(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteControlSignals(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -520,9 +520,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteControlSignals(struct RXMsg _
* Можно реализовать работу с флагами.
* Можно реализовать работу с флагами.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteFlags(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteFlags(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -530,10 +530,10 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteFlags(struct RXMsg _rxMsg)
* Выполняет программный рестарт системы.
* Выполняет программный рестарт системы.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteReset(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteReset(struct RXMsg _rxMsg)
{
{
NVIC_SystemReset();
NVIC_SystemReset();
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
/**
/**
@@ -542,9 +542,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteReset(struct RXMsg _rxMsg)
* Можно реализовать изменение режима работы.
* Можно реализовать изменение режима работы.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteChangeMode(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteChangeMode(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -553,9 +553,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteChangeMode(struct RXMsg _rxMs
* Можно реализовать отправку списка параметров.
* Можно реализовать отправку списка параметров.
* @param _rxMsg Входящее сообщение.
* @param _rxMsg Входящее сообщение.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToDiscreteRequestListOfParameters(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToDiscreteRequestListOfParameters(struct RXMsg _rxMsg)
{
{
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -564,43 +564,43 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToDiscreteRequestListOfParameters(struc
* @details Функция, сортирующая запросы по типам и вызывающая соответствующие функции. Типы запросов: Универсальный, Уставки, Напряжение, Ток, Температура.
* @details Функция, сортирующая запросы по типам и вызывающая соответствующие функции. Типы запросов: Универсальный, Уставки, Напряжение, Ток, Температура.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_AnalogProcessing(struct RXMsg _rxMsg)
SET CAN_StatusTypeDef SET CAN_AnalogProcessing(struct RXMsg _rxMsg)
{
{
msgBodyAnalogType msg;
msgBodyAnalogType msg;
msg.Body = _rxMsg.eID.Fields.MsgBody;
msg.Body = _rxMsg.eID.Fields.MsgBody;
switch (msg.Fields.Type)
switch (msg.Fields.Type)
{
{
case PROTO CAN_ANALOG_UNIVERSAL:
case SET CAN_ANALOG_UNIVERSAL:
{
{
return Proto CanMsgToAnalogUniversal(_rxMsg);
return Set CanMsgToAnalogUniversal(_rxMsg);
break;
break;
}
}
case PROTO CAN_ANALOG_SETTINGS:
case SET CAN_ANALOG_SETTINGS:
{
{
return Proto CanMsgToAnalogSettings(_rxMsg);
return Set CanMsgToAnalogSettings(_rxMsg);
break;
break;
}
}
case PROTO CAN_ANALOG_U:
case SET CAN_ANALOG_U:
{
{
return Proto CanMsgToAnalogUSens(_rxMsg);
return Set CanMsgToAnalogUSens(_rxMsg);
break;
break;
}
}
case PROTO CAN_ANALOG_I:
case SET CAN_ANALOG_I:
{
{
return Proto CanMsgToAnalogISens(_rxMsg);
return Set CanMsgToAnalogISens(_rxMsg);
break;
break;
}
}
case PROTO CAN_ANALOG_T:
case SET CAN_ANALOG_T:
{
{
return Proto CanMsgToAnalogTSens(_rxMsg);
return Set CanMsgToAnalogTSens(_rxMsg);
break;
break;
}
}
default:
default:
//RESERVE SENSOR TYPE
//RESERVE SENSOR TYPE
return PROTO CAN_ERROR;
return SET CAN_ERROR;
break;
break;
}
}
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
/**
/**
@@ -609,7 +609,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_AnalogProcessing(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения, используется для формирования ID.
* @param _rxMsg Структура входящего сообщения, используется для формирования ID.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToAnalogUniversal(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToAnalogUniversal(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -617,9 +617,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUniversal(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 6;
TxHeader.DLC = 6;
data[0] = 'U';
data[0] = 'U';
@@ -628,7 +628,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUniversal(struct RXMsg _rxMsg)
data[3] = 'V';
data[3] = 'V';
data[4] = 'E';
data[4] = 'E';
data[5] = 'R';
data[5] = 'R';
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -637,7 +637,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUniversal(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения, используется только для формирования ID.
* @param _rxMsg Структура входящего сообщения, используется только для формирования ID.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToAnalogSettings(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToAnalogSettings(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -645,9 +645,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogSettings(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 7;
TxHeader.DLC = 7;
data[0] = 'U';
data[0] = 'U';
@@ -657,7 +657,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogSettings(struct RXMsg _rxMsg)
data[4] = 'V';
data[4] = 'V';
data[5] = 'K';
data[5] = 'K';
data[6] = 'I';
data[6] = 'I';
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -666,7 +666,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogSettings(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения, используемая для формирования идентификатора и данных.
* @param _rxMsg Структура входящего сообщения, используемая для формирования идентификатора и данных.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK при успешной отправке.
* @return HAL_StatusTypeDef Статус выполнения операции HAL, например HAL_OK при успешной отправке.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToAnalogUSens(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToAnalogUSens(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -674,9 +674,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUSens(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 6;
TxHeader.DLC = 6;
msgBodyAnalogType msg;
msgBodyAnalogType msg;
@@ -687,7 +687,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUSens(struct RXMsg _rxMsg)
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -696,7 +696,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogUSens(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения, используется для формирования идентификатора и данных.
* @param _rxMsg Структура входящего сообщения, используется для формирования идентификатора и данных.
* @return HAL_StatusTypeDef Статус операции HAL, например HAL_OK при успешной отправке.
* @return HAL_StatusTypeDef Статус операции HAL, например HAL_OK при успешной отправке.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToAnalogISens(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToAnalogISens(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -704,9 +704,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogISens(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 6;
TxHeader.DLC = 6;
msgBodyAnalogType msg;
msgBodyAnalogType msg;
@@ -717,7 +717,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogISens(struct RXMsg _rxMsg)
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -726,7 +726,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogISens(struct RXMsg _rxMsg)
* @param _rxMsg Структура полученного сообщения, которая используется для формирования идентификатора.
* @param _rxMsg Структура полученного сообщения, которая используется для формирования идентификатора.
* @return HAL_StatusTypeDef Статус выполнения функции HAL, например HAL_OK при успехе.
* @return HAL_StatusTypeDef Статус выполнения функции HAL, например HAL_OK при успехе.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToAnalogTSens(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToAnalogTSens(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -734,9 +734,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogTSens(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 6;
TxHeader.DLC = 6;
msgBodyAnalogType msg;
msgBodyAnalogType msg;
@@ -747,7 +747,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogTSens(struct RXMsg _rxMsg)
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[3] = '0' + msg.Fields.SensorID / 100 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[4] = '0' + msg.Fields.SensorID / 10 % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
data[5] = '0' + msg.Fields.SensorID % 10;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -757,16 +757,16 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToAnalogTSens(struct RXMsg _rxMsg)
* и аналоговые.
* и аналоговые.
* @param id Идентификатор сообщения, содержащий тип сообщения и другую информацию.
* @param id Идентификатор сообщения, содержащий тип сообщения и другую информацию.
* @param coreData Структура данных, включающая тип, тело и данные для передачи.
* @param coreData Структура данных, включающая тип, тело и данные для передачи.
* @return PROTO CAN_StatusTypeDef Статус операции.
* @return SET CAN_StatusTypeDef Статус операции.
* @details
* @details
* В зависимости от типа сообщения (панель broadcast, discrete или analog),
* В зависимости от типа сообщения (панель broadcast, discrete или analog),
* формируется соответствующий пакет данных и отправляется на шину CAN.
* формируется соответствующий пакет данных и отправляется на шину CAN.
* Для сообщений, превышающих длину 8 байт, передача выполняется пакетами.
* Для сообщений, превышающих длину 8 байт, передача выполняется пакетами.
* В случае ошибок при добавлении сообщения в очередь передачи, возвращается ошибка.
* В случае ошибок при добавлении сообщения в очередь передачи, возвращается ошибка.
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_SEND_CORE(const Proto CanId_t id, const struct Proto CanCoreData coreData)
SET CAN_StatusTypeDef SET CAN_SEND_CORE(const Set CanId_t id, const struct Set CanCoreData coreData)
{
{
Proto CanId_t localId = id;
Set CanId_t localId = id;
uint8_t msgType = localId.Fields.MsgType;
uint8_t msgType = localId.Fields.MsgType;
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
@@ -776,7 +776,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
uint8_t canData[8];
uint8_t canData[8];
switch(id.Fields.MsgType)
switch(id.Fields.MsgType)
{
{
case PROTO CAN_MSGTYPE_BROADCAST:
case SET CAN_MSGTYPE_BROADCAST:
{
{
msgBodyBroadcastType body;
msgBodyBroadcastType body;
body.Fields.Type = coreData.Type;
body.Fields.Type = coreData.Type;
@@ -786,10 +786,10 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
TxHeader.DLC = 0;
TxHeader.DLC = 0;
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
}
}
case PROTO CAN_MSGTYPE_DISCRETE:
case SET CAN_MSGTYPE_DISCRETE:
{
{
msgBodyDiscreteType body;
msgBodyDiscreteType body;
body.Fields.Type = coreData.Type;
body.Fields.Type = coreData.Type;
@@ -809,14 +809,14 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox);
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox);
if(status != HAL_OK)
if(status != HAL_OK)
{
{
return (PROTO CAN_StatusTypeDef)status;
return (SET CAN_StatusTypeDef)status;
}
}
regsRemaining -= regsInPacket;
regsRemaining -= regsInPacket;
currentIndex += regsInPacket;
currentIndex += regsInPacket;
}
}
break;
break;
}
}
case PROTO CAN_MSGTYPE_ANALOG:
case SET CAN_MSGTYPE_ANALOG:
{
{
msgBodyAnalogType body;
msgBodyAnalogType body;
body.Fields.Type = coreData.Type;
body.Fields.Type = coreData.Type;
@@ -836,7 +836,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox);
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox);
if(status != HAL_OK)
if(status != HAL_OK)
{
{
return (PROTO CAN_StatusTypeDef)status;
return (SET CAN_StatusTypeDef)status;
}
}
regsRemaining -= regsInPacket;
regsRemaining -= regsInPacket;
currentIndex += regsInPacket;
currentIndex += regsInPacket;
@@ -845,10 +845,10 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
}
}
default:
default:
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -856,7 +856,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_CORE(const ProtoCanId_t id, const struct Pr
* Формирует и передает сообщение с данными о статусе "GAS-XXXX", где XXXX — значение из сообщения _rxMsg.
* Формирует и передает сообщение с данными о статусе "GAS-XXXX", где XXXX — значение из сообщения _rxMsg.
* @param _rxMsg Структура входящего сообщения, содержит идентификатор и тело сообщения.
* @param _rxMsg Структура входящего сообщения, содержит идентификатор и тело сообщения.
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToGeneralAddressSpace(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToGeneralAddressSpace(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -864,9 +864,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToGeneralAddressSpace(struct RXMsg _rxM
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 8;
TxHeader.DLC = 8;
data[0] = 'G';
data[0] = 'G';
@@ -885,20 +885,20 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToGeneralAddressSpace(struct RXMsg _rxM
data[4 + i] = sym + '0';
data[4 + i] = sym + '0';
}
}
}
}
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
* @brief Отправляет произвольный диапазон регистров в пакетах по, максимум, 4 регистра за раз через CAN.
* @brief Отправляет произвольный диапазон регистров в пакетах по, максимум, 4 регистра за раз через CAN.
* Функция разбивает передаваемый массив регистров на пакеты по 4 или меньше и отправляет их по отдельности.
* Функция разбивает передаваемый массив регистров на пакеты по 4 или меньше и отправляет их по отдельности.
* Для каждого пакета формируется уникальный MsgBody, равный адресу первого регистра в пакете.
* Для каждого пакета формируется уникальный MsgBody, равный адресу первого регистра в пакете.
* @param priority Приоритет сообщения CAN. ProtoCan _Priority_TypeDef
* @param priority Приоритет сообщения CAN. SETCAN _Priority_TypeDef
* @param regStartAdr Адрес первого регистра из всего массива.
* @param regStartAdr Адрес первого регистра из всего массива.
* @param data Указатель на массив регистров для отправки.
* @param data Указатель на массив регистров для отправки.
* @param regCount Общее количество регистров для отправки.
* @param regCount Общее количество регистров для отправки.
* @return Возвращает статус отправки: HAL_OK при успехе, или код ошибки HAL_StatusTypeDef при с б о е .
* @return Возвращает статус отправки: HAL_OK при успехе, или код ошибки HAL_StatusTypeDef при с б о е .
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_SEND_GENERAL_ADDRESS_SPACE(Proto CanId_t id, uint16_t regStartAdr, uint16_t *data, uint8_t regCount)
SET CAN_StatusTypeDef SET CAN_SEND_GENERAL_ADDRESS_SPACE(Set CanId_t id, uint16_t regStartAdr, uint16_t *data, uint8_t regCount)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -908,7 +908,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_GENERAL_ADDRESS_SPACE(ProtoCanId_t id, uint
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = id.BitAll;
tmp_eID.BitAll = id.BitAll;
uint8_t regsRemaining = regCount;
uint8_t regsRemaining = regCount;
@@ -932,13 +932,13 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_GENERAL_ADDRESS_SPACE(ProtoCanId_t id, uint
if(status != HAL_OK)
if(status != HAL_OK)
{
{
return (PROTO CAN_StatusTypeDef)status;
return (SET CAN_StatusTypeDef)status;
}
}
regsRemaining -= regsInPacket;
regsRemaining -= regsInPacket;
currentIndex += regsInPacket;
currentIndex += regsInPacket;
}
}
return (PROTO CAN_StatusTypeDef)HAL_OK;
return (SET CAN_StatusTypeDef)HAL_OK;
}
}
/**
/**
@@ -948,36 +948,36 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_GENERAL_ADDRESS_SPACE(ProtoCanId_t id, uint
* @param _rxMsg Структура входящего сообщения RXMsg.
* @param _rxMsg Структура входящего сообщения RXMsg.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_ModbusProcessing(struct RXMsg _rxMsg)
SET CAN_StatusTypeDef SET CAN_ModbusProcessing(struct RXMsg _rxMsg)
{
{
switch(_rxMsg.eID.Fields.MsgType)
switch(_rxMsg.eID.Fields.MsgType)
{
{
case PROTO CAN_MSGTYPE_MODBUS_COIL:
case SET CAN_MSGTYPE_MODBUS_COIL:
{
{
return Proto CanMsgToModbusCoil(_rxMsg);
return Set CanMsgToModbusCoil(_rxMsg);
break;
break;
}
}
case PROTO CAN_MSGTYPE_MODBUS_DISCRETE:
case SET CAN_MSGTYPE_MODBUS_DISCRETE:
{
{
return Proto CanMsgToModbusDiscrete(_rxMsg);
return Set CanMsgToModbusDiscrete(_rxMsg);
break;
break;
}
}
case PROTO CAN_MSGTYPE_MODBUS_HOLDING:
case SET CAN_MSGTYPE_MODBUS_HOLDING:
{
{
return Proto CanMsgToModbusHolding(_rxMsg);
return Set CanMsgToModbusHolding(_rxMsg);
break;
break;
}
}
case PROTO CAN_MSGTYPE_MODBUS_INPUT:
case SET CAN_MSGTYPE_MODBUS_INPUT:
{
{
return Proto CanMsgToModbusInput(_rxMsg);
return Set CanMsgToModbusInput(_rxMsg);
break;
break;
}
}
default:
default:
//ERROR
//ERROR
return PROTO CAN_ERROR;
return SET CAN_ERROR;
break;
break;
}
}
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
/**
/**
@@ -986,7 +986,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_ModbusProcessing(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения RXMsg.
* @param _rxMsg Структура входящего сообщения RXMsg.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToModbusCoil(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToModbusCoil(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -994,9 +994,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusCoil(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 8;
TxHeader.DLC = 8;
msgBodyModbusType msg;
msgBodyModbusType msg;
@@ -1009,7 +1009,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusCoil(struct RXMsg _rxMsg)
data[5] = ' ';
data[5] = ' ';
data[6] = 'C';
data[6] = 'C';
data[7] = msg.Fields.RegCount;
data[7] = msg.Fields.RegCount;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -1018,7 +1018,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusCoil(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения RXMsg.
* @param _rxMsg Структура входящего сообщения RXMsg.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToModbusDiscrete(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToModbusDiscrete(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -1026,9 +1026,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusDiscrete(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 8;
TxHeader.DLC = 8;
msgBodyModbusType msg;
msgBodyModbusType msg;
@@ -1041,7 +1041,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusDiscrete(struct RXMsg _rxMsg)
data[5] = ' ';
data[5] = ' ';
data[6] = 'C';
data[6] = 'C';
data[7] = msg.Fields.RegCount;
data[7] = msg.Fields.RegCount;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -1050,7 +1050,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusDiscrete(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения RXMsg.
* @param _rxMsg Структура входящего сообщения RXMsg.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToModbusHolding(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToModbusHolding(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -1058,9 +1058,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusHolding(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 8;
TxHeader.DLC = 8;
msgBodyModbusType msg;
msgBodyModbusType msg;
@@ -1073,7 +1073,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusHolding(struct RXMsg _rxMsg)
data[5] = ' ';
data[5] = ' ';
data[6] = 'C';
data[6] = 'C';
data[7] = msg.Fields.RegCount;
data[7] = msg.Fields.RegCount;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -1082,7 +1082,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusHolding(struct RXMsg _rxMsg)
* @param _rxMsg Структура входящего сообщения RXMsg.
* @param _rxMsg Структура входящего сообщения RXMsg.
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
* @return HAL_StatusTypeDef Статус выполнения команды CAN (успех или ошибка).
*/
*/
__weak PROTO CAN_StatusTypeDef Proto CanMsgToModbusInput(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef Set CanMsgToModbusInput(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -1090,9 +1090,9 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusInput(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 8;
TxHeader.DLC = 8;
msgBodyModbusType msg;
msgBodyModbusType msg;
@@ -1105,7 +1105,7 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusInput(struct RXMsg _rxMsg)
data[5] = ' ';
data[5] = ' ';
data[6] = 'C';
data[6] = 'C';
data[7] = msg.Fields.RegCount;
data[7] = msg.Fields.RegCount;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -1115,21 +1115,21 @@ __weak PROTOCAN_StatusTypeDef ProtoCanMsgToModbusInput(struct RXMsg _rxMsg)
* Для сообщений, превышающих 4 регистров, данные отправляются пакетами.
* Для сообщений, превышающих 4 регистров, данные отправляются пакетами.
* @param id Идентификатор сообщения, содержащий тип сообщения и другую информацию.
* @param id Идентификатор сообщения, содержащий тип сообщения и другую информацию.
* @param modbusData Структура с данными Modbus: адрес, количество регистров и сами данные.
* @param modbusData Структура с данными Modbus: адрес, количество регистров и сами данные.
* @return PROTO CAN_StatusTypeDef Статус операции.
* @return SET CAN_StatusTypeDef Статус операции.
* @details
* @details
* В зависимости от типа Modbus (coil/discrete или holding/input), формируется
* В зависимости от типа Modbus (coil/discrete или holding/input), формируется
* соответствующий CAN-пакет. Для coil/discrete отправляется один пакет, для holding/input —
* соответствующий CAN-пакет. Для coil/discrete отправляется один пакет, для holding/input —
* несколько, по 4 регистра в пакете. В случае ошибок при добавлении сообщения API HAL возвращается ошибка.
* несколько, по 4 регистра в пакете. В случае ошибок при добавлении сообщения API HAL возвращается ошибка.
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_SEND_MODBUS(const Proto CanId_t id, const struct Proto CanModbusData modbusData)
SET CAN_StatusTypeDef SET CAN_SEND_MODBUS(const Set CanId_t id, const struct Set CanModbusData modbusData)
{
{
Proto CanId_t localId = id;
Set CanId_t localId = id;
uint8_t msgType = localId.Fields.MsgType;
uint8_t msgType = localId.Fields.MsgType;
// Структура для отправки
// Структура для отправки
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
uint8_t canData[8];
uint8_t canData[8];
if(msgType == PROTO CAN_MSGTYPE_MODBUS_COIL || msgType == PROTO CAN_MSGTYPE_MODBUS_DISCRETE)
if(msgType == SET CAN_MSGTYPE_MODBUS_COIL || msgType == SET CAN_MSGTYPE_MODBUS_DISCRETE)
{
{
// Формируем body
// Формируем body
msgBodyModbusType body;
msgBodyModbusType body;
@@ -1149,10 +1149,10 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_MODBUS(const ProtoCanId_t id, const struct
canData[1] = HighByteOfWord(modbusData.Data[0]);
canData[1] = HighByteOfWord(modbusData.Data[0]);
if (HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
if (HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
}
}
else if(msgType == PROTO CAN_MSGTYPE_MODBUS_HOLDING || msgType == PROTO CAN_MSGTYPE_MODBUS_INPUT)
else if(msgType == SET CAN_MSGTYPE_MODBUS_HOLDING || msgType == SET CAN_MSGTYPE_MODBUS_INPUT)
{
{
uint16_t* dataPtr = modbusData.Data;
uint16_t* dataPtr = modbusData.Data;
unsigned totalRegs = modbusData.RegCount;
unsigned totalRegs = modbusData.RegCount;
@@ -1181,7 +1181,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_MODBUS(const ProtoCanId_t id, const struct
// Отправляем сообщение
// Отправляем сообщение
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
regsProcessed += regsInPacket;
regsProcessed += regsInPacket;
startAddress += regsInPacket;
startAddress += regsInPacket;
@@ -1189,9 +1189,9 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_MODBUS(const ProtoCanId_t id, const struct
}
}
else
else
{
{
return PROTO CAN_ERROR; // Неверный тип сообщения
return SET CAN_ERROR; // Неверный тип сообщения
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -1200,7 +1200,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_MODBUS(const ProtoCanId_t id, const struct
* @param _rxMsg Структура входящего сообщения RXMsg, данными которого формируется ответ-ошибка.
* @param _rxMsg Структура входящего сообщения RXMsg, данными которого формируется ответ-ошибка.
* @return HAL_StatusTypeDef Статус выполнения команды CAN.
* @return HAL_StatusTypeDef Статус выполнения команды CAN.
*/
*/
__weak PROTO CAN_StatusTypeDef PROTO CAN_RequestError(struct RXMsg _rxMsg)
__weak SET CAN_StatusTypeDef SET CAN_RequestError(struct RXMsg _rxMsg)
{
{
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
@@ -1208,17 +1208,17 @@ __weak PROTOCAN_StatusTypeDef PROTOCAN_RequestError(struct RXMsg _rxMsg)
TxHeader.IDE = CAN_ID_EXT;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.TransmitGlobalTime = DISABLE;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.RTR = CAN_RTR_DATA;
Proto CanId_t tmp_eID;
Set CanId_t tmp_eID;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.BitAll = _rxMsg.eID.BitAll;
tmp_eID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
tmp_eID.Fields.MsgType = PROTO CAN_MSGTYPE_ERROR;
tmp_eID.Fields.MsgType = SET CAN_MSGTYPE_ERROR;
msgBodyErrorType msg;
msgBodyErrorType msg;
msg.Fields.ErrorCode = 0xFF;
msg.Fields.ErrorCode = 0xFF;
msg.Fields.Info = 0;
msg.Fields.Info = 0;
tmp_eID.Fields.MsgBody = msg.Body;
tmp_eID.Fields.MsgBody = msg.Body;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.ExtId = tmp_eID.BitAll;
TxHeader.DLC = 0;
TxHeader.DLC = 0;
return (PROTO CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
return (SET CAN_StatusTypeDef)HAL_CAN_AddTxMessage(_HCAN, &TxHeader, data, &TxMailBox);
}
}
/**
/**
@@ -1227,14 +1227,14 @@ __weak PROTOCAN_StatusTypeDef PROTOCAN_RequestError(struct RXMsg _rxMsg)
* объединёнными в поле MsgBody идентификатора сообщения, и передаёт е г о через CAN.
* объединёнными в поле MsgBody идентификатора сообщения, и передаёт е г о через CAN.
* @param id Идентификатор сообщения, содержащий базовую информацию.
* @param id Идентификатор сообщения, содержащий базовую информацию.
* @param errorData Структура с данными ошибки: код и дополнительная информация.
* @param errorData Структура с данными ошибки: код и дополнительная информация.
* @return PROTO CAN_StatusTypeDef Статус операции.
* @return SET CAN_StatusTypeDef Статус операции.
* @details
* @details
* В качестве данных передаётся 2 байта: старшие биты — информация о б ошибке, младшие — код ошибки.
* В качестве данных передаётся 2 байта: старшие биты — информация о б ошибке, младшие — код ошибки.
* Размер данных в CANFrames устанавливается нулевым, так как все данные инкапсулированы в MsgBody.
* Размер данных в CANFrames устанавливается нулевым, так как все данные инкапсулированы в MsgBody.
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_SEND_ERROR(const Proto CanId_t id, const struct Proto CanErrorData errorData)
SET CAN_StatusTypeDef SET CAN_SEND_ERROR(const Set CanId_t id, const struct Set CanErrorData errorData)
{
{
Proto CanId_t localId = id;
Set CanId_t localId = id;
uint8_t msgType = localId.Fields.MsgType;
uint8_t msgType = localId.Fields.MsgType;
// Структура для отправки
// Структура для отправки
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
@@ -1250,9 +1250,9 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_ERROR(const ProtoCanId_t id, const struct P
TxHeader.DLC = 0;
TxHeader.DLC = 0;
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
if(HAL_CAN_AddTxMessage(_HCAN, &TxHeader, canData, &TxMailBox) != HAL_OK)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
return PROTO CAN_OK;
return SET CAN_OK;
}
}
/**
/**
@@ -1265,7 +1265,7 @@ PROTOCAN_StatusTypeDef PROTOCAN_SEND_ERROR(const ProtoCanId_t id, const struct P
* @param tmp_DATA Указатель на массив данных, полученных из CAN.
* @param tmp_DATA Указатель на массив данных, полученных из CAN.
* @param tmp_LastStep Индекс позиции в буфере, куда записывать сообщение.
* @param tmp_LastStep Индекс позиции в буфере, куда записывать сообщение.
*/
*/
void TakeRxMsgToBuffer(Proto CanId_t tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32_t tmp_DLC, uint8_t *tmp_DATA, uint16_t tmp_LastStep)
void TakeRxMsgToBuffer(Set CanId_t tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32_t tmp_DLC, uint8_t *tmp_DATA, uint16_t tmp_LastStep)
{
{
rxMsg[tmp_LastStep].eID.BitAll = tmp_eID.BitAll;
rxMsg[tmp_LastStep].eID.BitAll = tmp_eID.BitAll;
rxMsg[tmp_LastStep].info.EXT = tmp_IDE;
rxMsg[tmp_LastStep].info.EXT = tmp_IDE;
@@ -1283,7 +1283,7 @@ void TakeRxMsgToBuffer(ProtoCanId_t tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR,
* Читает все сообщения из FIFO, проверяет их тип, обновляет статус устройств сети или сохраняет сообщение в буфер.
* Читает все сообщения из FIFO, проверяет их тип, обновляет статус устройств сети или сохраняет сообщение в буфер.
* @param hcan Указатель на структуру управления CAN-Hardware.
* @param hcan Указатель на структуру управления CAN-Hardware.
*/
*/
void Proto CanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
void Set CanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
{
//Обработка всех сообщений в FIFO
//Обработка всех сообщений в FIFO
CAN_RxHeaderTypeDef RxHeader;
CAN_RxHeaderTypeDef RxHeader;
@@ -1293,16 +1293,16 @@ void ProtoCanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
//Расширенный ID
//Расширенный ID
if(RxHeader.IDE == CAN_ID_EXT)
if(RxHeader.IDE == CAN_ID_EXT)
{
{
if(!((PROTO CAN_RX_BUFFER_SIZE + LastStep - (CurrentStep - 1)) & PROTO CAN_RX_BUFFER_SIZE))
if(!((SET CAN_RX_BUFFER_SIZE + LastStep - (CurrentStep - 1)) & SET CAN_RX_BUFFER_SIZE))
{
{
//Буффер переполнен
//Буффер переполнен
return;
return;
}
}
uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % PROTO CAN_RX_BUFFER_SIZE;
uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % SET CAN_RX_BUFFER_SIZE;
Proto CanId_t ExtID_Of_RX_MSG;
Set CanId_t ExtID_Of_RX_MSG;
ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId;
ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId;
//Полученное сообщение - пульс устройств в сети
//Полученное сообщение - пульс устройств в сети
if(ExtID_Of_RX_MSG.Fields.MsgType == PROTO CAN_MSGTYPE_PULSE)
if(ExtID_Of_RX_MSG.Fields.MsgType == SET CAN_MSGTYPE_PULSE)
{
{
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].Status = ONLINE;
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].Status = ONLINE;
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].TimeFromLastPulse = 0;
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].TimeFromLastPulse = 0;
@@ -1317,20 +1317,20 @@ void ProtoCanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
* @brief Функция отправки пульса устройства.
* @brief Функция отправки пульса устройства.
* @details Пульс устройства. Есть возможность отключить пульс по запросу.
* @details Пульс устройства. Есть возможность отключить пульс по запросу.
*/
*/
void Proto CanPulseCallback(TIM_HandleTypeDef *htim)
void Set CanPulseCallback(TIM_HandleTypeDef *htim)
{
{
if(ControlFlags.IsPulse)
if(ControlFlags.IsPulse)
{
{
static unsigned PulseStage = 0;
static unsigned PulseStage = 0;
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailBox = 0;
uint32_t TxMailBox = 0;
Proto CanId_t currentID;
Set CanId_t currentID;
currentID.BitAll = 0;
currentID.BitAll = 0;
currentID.Fields.Priority = PROTO CAN_PRIORITY_STANDARD;
currentID.Fields.Priority = SET CAN_PRIORITY_STANDARD;
currentID.Fields.Route = PROTO CAN_ROUTE_FROM_DEVICE;
currentID.Fields.Route = SET CAN_ROUTE_FROM_DEVICE;
currentID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
currentID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
currentID.Fields.DeviceID = CURRENT_ID_DEVICE;
currentID.Fields.DeviceID = CURRENT_ID_DEVICE;
currentID.Fields.MsgType = PROTO CAN_MSGTYPE_PULSE;
currentID.Fields.MsgType = SET CAN_MSGTYPE_PULSE;
currentID.Fields.MsgBody = 0;
currentID.Fields.MsgBody = 0;
TxHeader.ExtId = currentID.BitAll;
TxHeader.ExtId = currentID.BitAll;
uint8_t data[8];
uint8_t data[8];
@@ -1354,7 +1354,7 @@ void ProtoCanPulseCallback(TIM_HandleTypeDef *htim)
* @brief Функция установки в RTC полученной даты/время из запроса.
* @brief Функция установки в RTC полученной даты/время из запроса.
* @param uint8_t *data - Байтовый массив, 7 элементов. [0] - Часы. [1] - Минуты. [2] - Секунды. [3] - Год. [4] - Месяц. [5] - Дата. [6] - День недели.
* @param uint8_t *data - Байтовый массив, 7 элементов. [0] - Часы. [1] - Минуты. [2] - Секунды. [3] - Год. [4] - Месяц. [5] - Дата. [6] - День недели.
*/
*/
void PROTO CAN_RTC_SYNC(uint8_t *data)
void SET CAN_RTC_SYNC(uint8_t *data)
{
{
__HAL_RTC_WRITEPROTECTION_DISABLE(_HRTC);
__HAL_RTC_WRITEPROTECTION_DISABLE(_HRTC);
RTC_TimeTypeDef sTime = {0};
RTC_TimeTypeDef sTime = {0};
@@ -1384,7 +1384,7 @@ void PROTOCAN_RTC_SYNC(uint8_t *data)
* @param idFilter 32-битный идентификатор, используемый для фильтрации.
* @param idFilter 32-битный идентификатор, используемый для фильтрации.
* @param idMask 32-битная маска, определяющая биты, проверяемые фильтром.
* @param idMask 32-битная маска, определяющая биты, проверяемые фильтром.
*/
*/
void PROTO CAN_CONFIG_FILTER(uint8_t filterBank, uint32_t idFilter, uint32_t idMask)
void SET CAN_CONFIG_FILTER(uint8_t filterBank, uint32_t idFilter, uint32_t idMask)
{
{
CAN_FilterTypeDef canFilterConfig;
CAN_FilterTypeDef canFilterConfig;
canFilterConfig.FilterBank = filterBank;
canFilterConfig.FilterBank = filterBank;
@@ -1408,7 +1408,7 @@ void PROTOCAN_CONFIG_FILTER(uint8_t filterBank, uint32_t idFilter, uint32_t idMa
/**
/**
* @brief Конфигурирует три фильтра CAN для различных типов сообщений.
* @brief Конфигурирует три фильтра CAN для различных типов сообщений.
*/
*/
void PROTO CAN_FILTERS()
void SET CAN_FILTERS()
{
{
#define BIT27 (1UL << 27)
#define BIT27 (1UL << 27)
#define BITS_20_23_MASK (0xFUL << 20) // 4 бита (20..23)
#define BITS_20_23_MASK (0xFUL << 20) // 4 бита (20..23)
@@ -1423,68 +1423,68 @@ void PROTOCAN_FILTERS()
#endif
#endif
#define BITS_16_19_MASK (0xFUL << 16)
#define BITS_16_19_MASK (0xFUL << 16)
uint32_t filter2_id = PROTO CAN_MSGTYPE_BROADCAST << 16;
uint32_t filter2_id = SET CAN_MSGTYPE_BROADCAST << 16;
uint32_t filter2_mask = BITS_16_19_MASK;
uint32_t filter2_mask = BITS_16_19_MASK;
uint32_t filter3_id = PROTO CAN_MSGTYPE_PULSE << 16;
uint32_t filter3_id = SET CAN_MSGTYPE_PULSE << 16;
uint32_t filter3_mask = BITS_16_19_MASK;
uint32_t filter3_mask = BITS_16_19_MASK;
// Первый фильтр: проверяем 20-27 биты, где 27-й всегда 1
// Первый фильтр: проверяем 20-27 биты, где 27-й всегда 1
PROTO CAN_CONFIG_FILTER(0, filter1_id, filter1_mask);
SET CAN_CONFIG_FILTER(0, filter1_id, filter1_mask);
// Второй фильтр: проверяем 16-19 биты, равны PROTO CAN_MSGTYPE_BROADCASTE
// Второй фильтр: проверяем 16-19 биты, равны SET CAN_MSGTYPE_BROADCASTE
PROTO CAN_CONFIG_FILTER(1, filter2_id, filter2_mask);
SET CAN_CONFIG_FILTER(1, filter2_id, filter2_mask);
// Третий фильтр: проверяем 16-19 биты, равны PROTO CAN_MSGTYPE_PULSE
// Третий фильтр: проверяем 16-19 биты, равны SET CAN_MSGTYPE_PULSE
PROTO CAN_CONFIG_FILTER(2, filter3_id, filter3_mask);
SET CAN_CONFIG_FILTER(2, filter3_id, filter3_mask);
}
}
/**
/**
* @brief Отправляет CAN-сообщение в зависимости от типа сообщения.
* @brief Отправляет CAN-сообщение в зависимости от типа сообщения.
* Эта функция анализирует тип сообщения в идентификаторе и вызывает
* Эта функция анализирует тип сообщения в идентификаторе и вызывает
* соответствующую функцию отправки. В текущей реализации поддерживается только
* соответствующую функцию отправки. В текущей реализации поддерживается только
* тип PROTO CAN_MSGTYPE_GENERAL_ADDRESS_SPACE.
* тип SET CAN_MSGTYPE_GENERAL_ADDRESS_SPACE.
* @param id Идентификатор CAN-сообщения, содержащий информацию о типе.
* @param id Идентификатор CAN-сообщения, содержащий информацию о типе.
* @param data Структура с данными, которые необходимо отправить. Зависит от типа сообщения.
* @param data Структура с данными, которые необходимо отправить. Зависит от типа сообщения.
* @return Статус выполнения операции.
* @return Статус выполнения операции.
*/
*/
PROTO CAN_StatusTypeDef PROTO CAN_SEND(Proto CanId_t id, Proto CanData_t data)
SET CAN_StatusTypeDef SET CAN_SEND(Set CanId_t id, Set CanData_t data)
{
{
switch(id.Fields.MsgType)
switch(id.Fields.MsgType)
{
{
case PROTO CAN_MSGTYPE_BROADCAST:
case SET CAN_MSGTYPE_BROADCAST:
case PROTO CAN_MSGTYPE_DISCRETE:
case SET CAN_MSGTYPE_DISCRETE:
case PROTO CAN_MSGTYPE_ANALOG:
case SET CAN_MSGTYPE_ANALOG:
{
{
return PROTO CAN_SEND_CORE(id, data.CoreData);
return SET CAN_SEND_CORE(id, data.CoreData);
break;
break;
}
}
case PROTO CAN_MSGTYPE_GENERAL_ADDRESS_SPACE:
case SET CAN_MSGTYPE_GENERAL_ADDRESS_SPACE:
{
{
/* Если есть регистры для отправки, указатель data должен быть валиден. */
/* Если есть регистры для отправки, указатель data должен быть валиден. */
if((data.GeneralAddressSpaceData.RegCount > 0U) && data.GeneralAddressSpaceData.Data == 0)
if((data.GeneralAddressSpaceData.RegCount > 0U) && data.GeneralAddressSpaceData.Data == 0)
{
{
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
return PROTO CAN_SEND_GENERAL_ADDRESS_SPACE(id, data.GeneralAddressSpaceData.RegStartAdr,
return SET CAN_SEND_GENERAL_ADDRESS_SPACE(id, data.GeneralAddressSpaceData.RegStartAdr,
data.GeneralAddressSpaceData.Data,
data.GeneralAddressSpaceData.Data,
data.GeneralAddressSpaceData.RegCount);
data.GeneralAddressSpaceData.RegCount);
}
}
case PROTO CAN_MSGTYPE_MODBUS_COIL:
case SET CAN_MSGTYPE_MODBUS_COIL:
case PROTO CAN_MSGTYPE_MODBUS_DISCRETE:
case SET CAN_MSGTYPE_MODBUS_DISCRETE:
case PROTO CAN_MSGTYPE_MODBUS_HOLDING:
case SET CAN_MSGTYPE_MODBUS_HOLDING:
case PROTO CAN_MSGTYPE_MODBUS_INPUT:
case SET CAN_MSGTYPE_MODBUS_INPUT:
{
{
return PROTO CAN_SEND_MODBUS(id, data.ModbusData);
return SET CAN_SEND_MODBUS(id, data.ModbusData);
break;
break;
}
}
case PROTO CAN_MSGTYPE_ERROR:
case SET CAN_MSGTYPE_ERROR:
{
{
return PROTO CAN_SEND_ERROR(id, data.ErrorData);
return SET CAN_SEND_ERROR(id, data.ErrorData);
break;
break;
}
}
default:
default:
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}
return PROTO CAN_ERROR;
return SET CAN_ERROR;
}
}