From 50035f4d34cbee86e4a5cb6da6030ab65d8a97f1 Mon Sep 17 00:00:00 2001 From: Tenocha Date: Wed, 20 Nov 2024 11:39:47 +0300 Subject: [PATCH] Entering a message buffer for CAN. The code has been restructured to import the library prototype into other projects --- Core/Inc/requester.h | 125 +++++-- Core/Src/requester.c | 776 +++++++++++++++++++++++++++---------------- 2 files changed, 583 insertions(+), 318 deletions(-) diff --git a/Core/Inc/requester.h b/Core/Inc/requester.h index 80ad773..4a7b84c 100644 --- a/Core/Inc/requester.h +++ b/Core/Inc/requester.h @@ -10,6 +10,8 @@ #define ONLINE 1; #define OFFLINE 0; + +// TIM defines #define TIM_REQUESTER_Prescaler 64000 //CAN Filter @@ -22,19 +24,6 @@ #define CAN_SENSOR_TYPE_FILTER 0x00F80000 #define CAN_SENSOR_ID_FILTER 0x0007FF00 - -void REQUESTER_Init(void); -void REQUESTER_MainWhile(void); -void Boot_SystemClock_Config(void); -void REQUESTER_AnalogProcessing(void); -void REQUESTER_BroadcastProcessing(void); -void REQUESTER_DiscreticProcessing(void); -void REQUESTER_ModbusProcessing(void); -void REQUESTER_RTC_SYNC(uint8_t *data); -void REQUESTER_Pulse_TIM_Handler(void); -void Boot_SystemClock_Config(void); -void REQUESTER_CAN_FILTERS(void); - union Byte{ struct bitfield{ unsigned bit0:1; @@ -75,24 +64,26 @@ _Bool IsLeapYear(uint8_t year); #define DATA_TYPE_PULSE 0b1111 //Sensor Types for DATA_TYPE_BROADCAST -#define SENSOR_TYPE_STATUS 0b00000 -#define SENSOR_TYPE_ONOFF 0b00001 -#define SENSOR_TYPE_RTCSETUP 0b00010 +#define SENSOR_TYPE_BROADCAST_STATUS 0b00000 +#define SENSOR_TYPE_BROADCAST_ONOFF 0b00001 +#define SENSOR_TYPE_BROADCAST_RESTARTDEVICE 0b00010 +#define SENSOR_TYPE_BROADCAST_RTCSETUP 0b00011 //Sensor Types for DATA_TYPE_DISCRETE -#define SENSOR_TYPE_ACCIDENT 0b00000 -#define SENSOR_TYPE_WARNING 0b00001 -#define SENSOR_TYPE_CONTROL_SIGNALS 0b00010 -#define SENSOR_TYPE_FLAGS 0b00011 -#define SENSOR_TYPE_RESET 0b00100 -#define SENSOR_TYPE_CHANGE_MODE 0b00101 -#define SENSOR_TYPE_REQUEST_LIST_OF_PARAMETERS 0b00110 +#define SENSOR_TYPE_DISCRETE_ACCIDENT 0b00000 +#define SENSOR_TYPE_DISCRETE_WARNING 0b00001 +#define SENSOR_TYPE_DISCRETE_CONTROL_SIGNALS 0b00010 +#define SENSOR_TYPE_DISCRETE_FLAGS 0b00011 +#define SENSOR_TYPE_DISCRETE_RESET 0b00100 +#define SENSOR_TYPE_DISCRETE_CHANGE_MODE 0b00101 +#define SENSOR_TYPE_DISCRETE_REQUEST_LIST_OF_PARAMETERS 0b00110 //Sensor Types for DATA_TYPE_ANALOG -#define SENSOR_TYPE_UNIVERSAL 0b00000 -#define SENSOR_TYPE_U 0b00001 -#define SENSOR_TYPE_I 0b00010 -#define SENSOR_TYPE_T 0b00011 +#define SENSOR_TYPE_ANALOG_UNIVERSAL 0b00000 +#define SENSOR_TYPE_ANALOG_USTAVKI 0b00001 +#define SENSOR_TYPE_ANALOG_U 0b00010 +#define SENSOR_TYPE_ANALOG_I 0b00011 +#define SENSOR_TYPE_ANALOG_T 0b00100 //Error Code #define NONEXISTENT_ELEMENT 0x01 @@ -106,7 +97,7 @@ struct controlflags{ }; //Device settings -union ext_ID{ +/*union ext_ID{ struct ext_ID_fields{ unsigned DeviceID:8; unsigned SensorID:11; @@ -123,15 +114,33 @@ union ext_ID_Modbus{ unsigned CountReg:8; unsigned StrAdr:8; unsigned DataType:4; - unsigned Route; + unsigned Route:1; }Fields; unsigned int BitAll:29; -}; +};*/ + +typedef union _extID{ + struct extID_Standard_Fields{ + unsigned DeviceID:8; + unsigned SensorID:11; + unsigned SensorType:5; + unsigned DataType:4; + unsigned Route:1; + }StandardFields; + struct extID_Modbus_Fields{ + unsigned DeviceID:8; + unsigned CountReg:8; + unsigned StrAdr:8; + unsigned DataType:4; + unsigned Route:1; + }ModbusFields; + unsigned int BitAll:29; +}extID; struct device { unsigned Status:1; - union ext_ID ExtID; + extID ExtID; unsigned TimeFromLastPulse; unsigned LastPulseStep; }; @@ -161,7 +170,7 @@ struct data }; struct received_request{ - union ext_ID RequestedExtID; + extID RequestedExtID; unsigned RequestedDLC; uint8_t RxData[8]; @@ -221,4 +230,56 @@ struct received_request{ unsigned ModbusFlag:1; }; + +#define CAN_RX_BUFFER_SIZE 128 + +struct RXMsg{ + struct INFO{ + unsigned EXT:1; + unsigned RTR:1; + }info; + extID eID; + uint16_t DLC; + uint8_t Data[8]; +}; + +uint16_t AvailableCanRxMsg(void); + + +void REQUESTER_Init(void); +void REQUESTER_MainWhile(void); +void Boot_SystemClock_Config(void); + +void REQUESTER_AnalogProcessing(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToAnalogUSTAVKI(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToAnalogUSens(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToAnalogISens(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToAnalogTSens(struct RXMsg _rxMsg); + +void REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg); +void CanRequestToBroadcastOnOff(struct RXMsg _rxMsg); +void CanRequestToBroadcastRestart(struct RXMsg _rxMsg); +void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg); + +void REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg); +void CanRequestToDiscreteAccident(struct RXMsg _rxMsg); +void CanRequestToDiscreteWarning(struct RXMsg _rxMsg); +void CanRequestToDiscreteControlSignals(struct RXMsg _rxMsg); +void CanRequestToDiscreteFlags(struct RXMsg _rxMsg); +void CanRequestToDiscreteReset(struct RXMsg _rxMsg); +void CanRequestToDiscreteChangeMode(struct RXMsg _rxMsg); +void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg); + +void REQUESTER_ModbusProcessing(struct RXMsg _rxMsg); +void CanRequestToModbusCoil(struct RXMsg _rxMsg); +void CanRequestToModbusDiscrete(struct RXMsg _rxMsg); +void CanRequestToModbusHolding(struct RXMsg _rxMsg); +void CanRequestToModbusInput(struct RXMsg _rxMsg); + +void REQUESTER_RTC_SYNC(uint8_t *data); +void REQUESTER_Pulse_TIM_Handler(void); +void Boot_SystemClock_Config(void); +void REQUESTER_CAN_FILTERS(void); #endif diff --git a/Core/Src/requester.c b/Core/Src/requester.c index ab3a52e..834aa24 100644 --- a/Core/Src/requester.c +++ b/Core/Src/requester.c @@ -13,6 +13,10 @@ struct data Data; struct controlflags ControlFlags; struct received_request ReceivedRequest; +uint8_t CurrentStep = 0; +uint8_t LastStep = 0; +struct RXMsg rxMsg[CAN_RX_BUFFER_SIZE]; + #define MAX_NUM_OF_DEVICES_PER_LINE 4 #define MAX_NUM_OF_REGISTERS_IN_DEVICE 255 @@ -26,6 +30,11 @@ _Bool IsLeapYear(uint8_t year) return (year%400==0)||((year%4==0)&&(year%100!=0)); } +uint16_t AvailableCanRxMsg(void) +{ + return ((uint16_t)(CAN_RX_BUFFER_SIZE + LastStep - CurrentStep))%CAN_RX_BUFFER_SIZE; +} + /** * @brief Инициализация переферии * @details Инициализация HAL, CAN, TIM7, RTC. @@ -77,45 +86,59 @@ void REQUESTER_MainWhile(void) CAN_TxHeaderTypeDef TxHeader; uint32_t TxMailBox = 0; uint8_t data[8]; - union ext_ID eID; - eID.Fields.DeviceID = 16; - eID.Fields.DataType = DATA_TYPE_ANALOG; - eID.Fields.SensorType = 0x1F; - eID.Fields.SensorID = 0; - eID.Fields.Route = ROUTE_SLAVE; + extID eID; + eID.BitAll = 0; + eID.StandardFields.DeviceID = 2; + eID.StandardFields.DataType = DATA_TYPE_ANALOG; + eID.StandardFields.SensorType = 0x1F; + eID.StandardFields.SensorID = 0; + eID.StandardFields.Route = ROUTE_SLAVE; + + TxHeader.IDE = CAN_ID_EXT; TxHeader.TransmitGlobalTime = DISABLE; TxHeader.RTR = CAN_RTR_DATA; + TxHeader.ExtId = eID.BitAll; int TxTest = 0; HAL_TIM_Base_Start_IT(&htim7); + while(1) { - if(ReceivedRequest.AnalogFlags.AllFlags) + if(AvailableCanRxMsg()) { - REQUESTER_AnalogProcessing(); + if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_ANALOG) + { + REQUESTER_AnalogProcessing(rxMsg[CurrentStep]); + } + else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_BROADCAST) + { + REQUESTER_BroadcastProcessing(rxMsg[CurrentStep]); + } + else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_DISCRETE) + { + REQUESTER_DiscreticProcessing(rxMsg[CurrentStep]); + } + else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_COIL || + rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_DISCRETE || + rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_HOLDING || + rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_INPUT) + { + REQUESTER_ModbusProcessing(rxMsg[CurrentStep]); + } + CurrentStep = (uint16_t)(CurrentStep + 1) % CAN_RX_BUFFER_SIZE; } - if(ReceivedRequest.BroadcastFlags.AllFlags) - { - REQUESTER_BroadcastProcessing(); - } - if(ReceivedRequest.DiscreticFlags.AllFlags) - { - REQUESTER_DiscreticProcessing(); - } - if(ReceivedRequest.ModbusFlags.AllFlags) - { - REQUESTER_ModbusProcessing(); - } + /* while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0); - TxHeader.ExtId = eID.BitAll; + if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox)!= HAL_OK) { ProverkaArbitors++; } - eID.Fields.SensorID++; - if(eID.Fields.SensorID>100) - { - eID.Fields.SensorID = 0; - } + */ +// eID.Fields.SensorID++; +// if(eID.Fields.SensorID>10) + //{ +// eID.Fields.SensorID = 0; +// } } } @@ -123,92 +146,250 @@ void REQUESTER_MainWhile(void) * @brief Функция обработки аналоговых запросов. * @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Универсальный, Уставки, Напряжение, Ток, Температура */ -void REQUESTER_AnalogProcessing() +void REQUESTER_AnalogProcessing(struct RXMsg _rxMsg) +{ + switch (_rxMsg.eID.StandardFields.SensorType) + { + case SENSOR_TYPE_ANALOG_UNIVERSAL: + { + CanRequestToAnalogUniversal(_rxMsg); + break; + } + case SENSOR_TYPE_ANALOG_USTAVKI: + { + CanRequestToAnalogUSTAVKI(_rxMsg); + break; + } + case SENSOR_TYPE_ANALOG_U: + { + CanRequestToAnalogUSens(_rxMsg); + break; + } + case SENSOR_TYPE_ANALOG_I: + { + CanRequestToAnalogISens(_rxMsg); + break; + } + case SENSOR_TYPE_ANALOG_T: + { + CanRequestToAnalogTSens(_rxMsg); + break; + } + default: + //RESERVE SENSOR TYPE + break; + } +} + +__weak HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg) { CAN_TxHeaderTypeDef TxHeader; uint32_t TxMailBox = 0; uint8_t data[8]; - if(ReceivedRequest.AnalogFlags.AnalogType.Request_Universal_Sens) - { - ReceivedRequest.AnalogFlags.AnalogType.Request_Universal_Sens = 0; - } - if(ReceivedRequest.AnalogFlags.AnalogType.Request_U_Sens) - { - //Запрос на данные датчика напряжения. - //В дальнейшем реализовать отправку настоящих данных. - //А пока - тестовое сообщение, нужное для отладки. - //Расширенный ID - TxHeader.IDE=CAN_ID_EXT; - //Ответ на запрос осуществляется по тому-же ID, - //с которым был отправлен запрос. - union ext_ID eID; - eID.BitAll = ReceivedRequest.RequestedExtID.BitAll; - eID.Fields.Route = ROUTE_SLAVE; - TxHeader.ExtId = eID.BitAll; - //Выставляется количество передаваемых байтов. (Макс. 8) - TxHeader.DLC = 6; - data[0] = 'U'; - data[1] = ' '; - data[2] = 's'; - data[3] = 'e'; - data[4] = 'n'; - data[5] = 's'; - HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); - ReceivedRequest.AnalogFlags.AnalogType.Request_U_Sens=0; - } - if(ReceivedRequest.AnalogFlags.AnalogType.Request_I_Sens) - { - TxHeader.IDE=CAN_ID_EXT; - union ext_ID eID; - eID.BitAll = ReceivedRequest.RequestedExtID.BitAll; - eID.Fields.Route = ROUTE_SLAVE; - TxHeader.ExtId = eID.BitAll; - TxHeader.DLC = 6; - data[0] = 'I'; - data[1] = ' '; - data[2] = 's'; - data[3] = 'e'; - data[4] = 'n'; - data[5] = 's'; - HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); - ReceivedRequest.AnalogFlags.AnalogType.Request_I_Sens=0; - } - if(ReceivedRequest.AnalogFlags.AnalogType.Request_T_Sens) - { - TxHeader.IDE=CAN_ID_EXT; - union ext_ID eID; - eID.BitAll = ReceivedRequest.RequestedExtID.BitAll; - eID.Fields.Route = ROUTE_SLAVE; - TxHeader.ExtId = eID.BitAll; - TxHeader.DLC = 6; - data[0] = 'T'; - data[1] = ' '; - data[2] = 's'; - data[3] = 'e'; - data[4] = 'n'; - data[5] = 's'; - HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); - ReceivedRequest.AnalogFlags.AnalogType.Request_T_Sens=0; - } + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 6; + data[0] = 'U'; + data[1] = 'N'; + data[2] = 'I'; + data[3] = 'V'; + data[4] = 'E'; + data[5] = 'R'; + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); +} + +__weak HAL_StatusTypeDef CanRequestToAnalogUSTAVKI(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 7; + data[0] = 'U'; + data[1] = 'S'; + data[2] = 'T'; + data[3] = 'A'; + data[4] = 'V'; + data[5] = 'K'; + data[6] = 'I'; + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); +} + +__weak HAL_StatusTypeDef CanRequestToAnalogUSens(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 6; + data[0] = 'U'; + data[1] = ' '; + data[2] = 's'; + data[3] = 'e'; + data[4] = 'n'; + data[5] = 's'; + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); +} + +__weak HAL_StatusTypeDef CanRequestToAnalogISens(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 6; + data[0] = 'I'; + data[1] = ' '; + data[2] = 's'; + data[3] = 'e'; + data[4] = 'n'; + data[5] = 's'; + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); +} + +__weak HAL_StatusTypeDef CanRequestToAnalogTSens(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 6; + data[0] = 'T'; + data[1] = ' '; + data[2] = 's'; + data[3] = 'e'; + data[4] = 'n'; + data[5] = 's'; + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); } /** * @brief Функция обработки широковещательных запросов. * @details Функция, выполняющая команды, переданные в широковещательном формате с головного (master) устройства. Типы команд: Запрос статуса, запрос на включение или выключение, рестарт устройств, установка времени. */ -void REQUESTER_BroadcastProcessing() -{ - if(ReceivedRequest.BroadcastFlags.BroadcastType.Request_OnOff) +void REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg) +{ + switch(_rxMsg.eID.StandardFields.SensorType) { - //Обработка запроса на вкл/выкл - ControlFlags.IsPulse = !ControlFlags.IsPulse; - ReceivedRequest.BroadcastFlags.BroadcastType.Request_OnOff = 0; + case SENSOR_TYPE_BROADCAST_STATUS: + { + //Обработка запроса статуса устройства + CanRequestToBroadcastStatus(_rxMsg); + break; + } + case SENSOR_TYPE_BROADCAST_ONOFF: + { + //Обработка запроса на вкл/выкл + CanRequestToBroadcastOnOff(_rxMsg); + break; + } + case SENSOR_TYPE_BROADCAST_RESTARTDEVICE: + { + CanRequestToBroadcastRestart(_rxMsg); + break; + } + case SENSOR_TYPE_BROADCAST_RTCSETUP: + { + //Обработка запроса на синхронизацию времени + //С головным устройством + CanRequestToBroadcastRtcSetup(_rxMsg); + break;; + } + default: + //RESERVE SENSOR TYPE. + break; } - if(ReceivedRequest.BroadcastFlags.BroadcastType.Request_RTC_Setup) +} + +__weak HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.DLC = 7; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.StandardFields.Route = ROUTE_SLAVE; + tmp_eID.StandardFields.DeviceID = CURRENT_ID_DEVICE; + TxHeader.ExtId = tmp_eID.BitAll; + + RTC_TimeTypeDef sTime = {0}; + HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); + data[0] = sTime.Hours; + data[1] = sTime.Minutes; + data[2] = sTime.Seconds; + + RTC_DateTypeDef DateToUpdate = {0}; + HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN); + data[3] = DateToUpdate.Year; + data[4] = DateToUpdate.Month; + data[5] = DateToUpdate.Date; + data[6] = DateToUpdate.WeekDay; + + return HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); +} + +__weak void CanRequestToBroadcastOnOff(struct RXMsg _rxMsg) +{ + ControlFlags.IsPulse = !ControlFlags.IsPulse; +} + +__weak void CanRequestToBroadcastRestart(struct RXMsg _rxMsg) +{ + if(_rxMsg.DLC == 0) { - //Обработка запроса на синхронизацию времени - //С головным устройством - if(ReceivedRequest.RequestedDLC > 7) + return; + } + if(_rxMsg.eID.StandardFields.SensorID == (CURRENT_ID_DEVICE / (_rxMsg.DLC*8))) + { + uint64_t page = 0; + for(int i = 0; i < _rxMsg.DLC; i++) + { + page+=(_rxMsg.Data[i]<<(i*8)); + } + if((page>>CURRENT_ID_DEVICE)&0b1) + { + NVIC_SystemReset(); + } + } + return; +} + +__weak void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg) +{ + if(_rxMsg.DLC > 7) { //ERROR } @@ -216,52 +397,21 @@ void REQUESTER_BroadcastProcessing() { int DaysCount_Normal[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; - if (ReceivedRequest.RxData[0]>23 || - ReceivedRequest.RxData[1]>59 || - ReceivedRequest.RxData[2]>59 || - ReceivedRequest.RxData[3]>99 || - ReceivedRequest.RxData[4]>12 || - ReceivedRequest.RxData[5] > DaysCount_Normal[IsLeapYear(ReceivedRequest.RxData[3])][ReceivedRequest.RxData[4]] || - ReceivedRequest.RxData[6]>6) + if (_rxMsg.Data[0]>23 || + _rxMsg.Data[1]>59 || + _rxMsg.Data[2]>59 || + _rxMsg.Data[3]>99 || + _rxMsg.Data[4]>12 || + _rxMsg.Data[5] > DaysCount_Normal[IsLeapYear(_rxMsg.Data[3])][_rxMsg.Data[4]] || + _rxMsg.Data[6]>6) { //ERROR } else { - REQUESTER_RTC_SYNC(ReceivedRequest.RxData); + REQUESTER_RTC_SYNC(_rxMsg.Data); } } - ReceivedRequest.BroadcastFlags.BroadcastType.Request_RTC_Setup = 0; - } - if(ReceivedRequest.BroadcastFlags.BroadcastType.Request_Status) - { - //Обработка запроса статуса устройства - RTC_TimeTypeDef sTime = {0}; - RTC_DateTypeDef DateToUpdate = {0}; - HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); - CAN_TxHeaderTypeDef TxHeader; - uint32_t TxMailBox = 0; - uint8_t data[8]; - TxHeader.IDE=CAN_ID_EXT; - union ext_ID eID; - eID.BitAll = ReceivedRequest.RequestedExtID.BitAll; - eID.Fields.Route = ROUTE_SLAVE; - TxHeader.ExtId = eID.BitAll; - TxHeader.DLC = 7; - data[0] = sTime.Hours; - data[1] = sTime.Minutes; - data[2] = sTime.Seconds; - HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN); - - data[3] = DateToUpdate.Year; - data[4] = DateToUpdate.Month; - data[5] = DateToUpdate.Date; - data[6] = DateToUpdate.WeekDay; - - HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); - ReceivedRequest.AnalogFlags.AnalogType.Request_T_Sens=0; - ReceivedRequest.BroadcastFlags.BroadcastType.Request_Status = 0; - } } /** @@ -269,51 +419,136 @@ void REQUESTER_BroadcastProcessing() * @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Аварии, Предупреждения, Управляющие сигналы, Флаги, Рестарт устройства, Изменение режима работы устройства, Запрос на устройство. * @note Запрос на устройство. Головное (master) устройство запрашивает некоторое колличество параметров. В Data - 64 битовых адресса параметров, тип которых задаётся в Sensor ID. Имеется возможность запрашивать непоследовательные параметры. */ -void REQUESTER_DiscreticProcessing() +void REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg) { - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_Accident) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_Accident = 0; - } - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_Control_Signals) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_Control_Signals = 0; - } - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_Flags) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_Flags = 0; - } - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_Warning) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_Warning = 0; - } - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_Reset) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_Reset = 0; - NVIC_SystemReset(); - } - if(ReceivedRequest.DiscreticFlags.DiscreticType.Request_List_of_Parameters) - { - ReceivedRequest.DiscreticFlags.DiscreticType.Request_List_of_Parameters = 0; - for(int Current_byte = 0; Current_byte < 8; Current_byte++) + switch(_rxMsg.eID.StandardFields.SensorType){ + case SENSOR_TYPE_DISCRETE_ACCIDENT: { - for(int Current_bit = 0; Current_bit < 8; Current_bit++) - { - if((ReceivedRequest.RxData[Current_byte]>>Current_bit)&0b1) - { - _GET_MODBUS_ADR(ReceivedRequest.RequestedExtID.Fields.SensorID, Current_byte, Current_bit); - } - } + CanRequestToDiscreteAccident(_rxMsg); + break; } + case SENSOR_TYPE_DISCRETE_WARNING: + { + CanRequestToDiscreteWarning(_rxMsg); + break; + } + case SENSOR_TYPE_DISCRETE_CONTROL_SIGNALS: + { + CanRequestToDiscreteControlSignals(_rxMsg); + break; + } + case SENSOR_TYPE_DISCRETE_FLAGS: + { + CanRequestToDiscreteFlags(_rxMsg); + break; + } + case SENSOR_TYPE_DISCRETE_RESET: + { + CanRequestToDiscreteReset(_rxMsg); + break; + } + case SENSOR_TYPE_DISCRETE_CHANGE_MODE: + { + CanRequestToDiscreteChangeMode(_rxMsg); + break; + } + case SENSOR_TYPE_DISCRETE_REQUEST_LIST_OF_PARAMETERS: + { + CanRequestToDiscreteRequestListOfParameters(_rxMsg); + break; + } + default: + //RESERVE SENSOR TYPE. + break; } } +__weak void CanRequestToDiscreteAccident(struct RXMsg _rxMsg) +{ + return; +} + +__weak void CanRequestToDiscreteWarning(struct RXMsg _rxMsg) +{ + return; +} + +__weak void CanRequestToDiscreteControlSignals(struct RXMsg _rxMsg) +{ + return; +} + +__weak void CanRequestToDiscreteFlags(struct RXMsg _rxMsg) +{ + return; +} + +__weak void CanRequestToDiscreteReset(struct RXMsg _rxMsg) +{ + NVIC_SystemReset(); +} + +__weak void CanRequestToDiscreteChangeMode(struct RXMsg _rxMsg) +{ + return; +} +__weak void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg) +{ + return; +} + /** * @brief Функция обработки Modbus запросов. * @details Функция, формирующая и отправляющая ответ на запросы. */ -void REQUESTER_ModbusProcessing() +void REQUESTER_ModbusProcessing(struct RXMsg _rxMsg) { + switch(_rxMsg.eID.ModbusFields.DataType) + { + case DATA_TYPE_MODBUS_COIL: + { + CanRequestToModbusCoil(_rxMsg); + break; + } + case DATA_TYPE_MODBUS_DISCRETE: + { + CanRequestToModbusDiscrete(_rxMsg); + break; + } + case DATA_TYPE_MODBUS_HOLDING: + { + CanRequestToModbusHolding(_rxMsg); + break; + } + case DATA_TYPE_MODBUS_INPUT: + { + CanRequestToModbusInput(_rxMsg); + break; + } + default: + //ERROR + break; + } +} + +__weak void CanRequestToModbusCoil(struct RXMsg _rxMsg) +{ + return; +} +__weak void CanRequestToModbusDiscrete(struct RXMsg _rxMsg) +{ + return; +} +__weak void CanRequestToModbusHolding(struct RXMsg _rxMsg) +{ + return; +} +__weak void CanRequestToModbusInput(struct RXMsg _rxMsg) +{ + return; +} + +/* СТАРЫЙ УЖАСНЫЙ МОДБАС if((ReceivedRequest.SensorToModbus.Modbus.StrAdr>=0) && (ReceivedRequest.SensorToModbus.Modbus.StrAdr<=127)) { //Обращение к существующему в устройстве модбас регистру @@ -332,11 +567,11 @@ void REQUESTER_ModbusProcessing() ) { TxHeader.DLC = 0; - union ext_ID eID; + extID eID; eID.BitAll = ReceivedRequest.RequestedExtID.BitAll; - eID.Fields.Route = ROUTE_SLAVE; - eID.Fields.SensorType = RequestFromDLC>>11; - eID.Fields.SensorID = RequestFromDLC; + eID.StandardFields.Route = ROUTE_SLAVE; + eID.StandardFields.SensorType = RequestFromDLC>>11; + eID.StandardFields.SensorID = RequestFromDLC; TxHeader.ExtId = eID.BitAll; for(int DataFor = 0; DataFor < 8; DataFor+=2) { @@ -353,16 +588,17 @@ void REQUESTER_ModbusProcessing() while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0); HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox); } - union ext_ID_Modbus extID; - extID.Fields.DeviceID = CURRENT_ID_DEVICE; - extID.Fields.DataType = DATA_TYPE_ERROR; - extID.Fields.CountReg = NONEXISTENT_ELEMENT; - extID.Fields.Route = ROUTE_SLAVE; + extID emID; + emID.BitAll = 0; + emID.ModbusFields.DeviceID = CURRENT_ID_DEVICE; + emID.ModbusFields.DataType = DATA_TYPE_ERROR; + emID.ModbusFields.CountReg = NONEXISTENT_ELEMENT; + emID.ModbusFields.Route = ROUTE_SLAVE; TxHeader.DLC = 0; for(;(RequestFromDLC-ReceivedRequest.SensorToModbus.Modbus.StrAdr)>13); + canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(0)<<5) | CAN_IDE_32; + canFilterConfig.FilterMaskIdHigh = (uint16_t)(0>>13); // we're checking only high 13 bits, that contained "key" + canFilterConfig.FilterMaskIdLow = (uint16_t)(0<<3) | CAN_IDE_32; // 1<<2 - set IDE bit + if(HAL_CAN_ConfigFilter(&hcan, &canFilterConfig) != HAL_OK) + { + Error_Handler(); + } }