diff --git a/Core/Src/requester.c b/Core/Src/requester.c index c1a7db7..2e1fc3a 100644 --- a/Core/Src/requester.c +++ b/Core/Src/requester.c @@ -364,7 +364,7 @@ __weak void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg) { 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 (_rxMsg.Data[0]>23 || + if(_rxMsg.Data[0]>23 || _rxMsg.Data[1]>59 || _rxMsg.Data[2]>59 || _rxMsg.Data[3]>99 || @@ -686,64 +686,34 @@ void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32 */ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { + // Обработка всех сообщений в FIFO CAN_RxHeaderTypeDef RxHeader; uint8_t RCAN_Data[8]; - HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RCAN_Data); - //Расширенный ID - if(RxHeader.IDE == CAN_ID_EXT) - { - uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % CAN_RX_BUFFER_SIZE; - - //if(tmp_LastStep == CurrentStep) - if(!((CAN_RX_BUFFER_SIZE + LastStep - (CurrentStep-1))&CAN_RX_BUFFER_SIZE)) - { - //Буффер переполнен - return; - } - extID ExtID_Of_RX_MSG; - ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId; - //Полученное сообщение - широковещательное - if (ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_BROADCAST) + while(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RCAN_Data) == HAL_OK) + { + //Расширенный ID + if(RxHeader.IDE == CAN_ID_EXT) { + if(!((CAN_RX_BUFFER_SIZE + LastStep - (CurrentStep-1))&CAN_RX_BUFFER_SIZE)) + { + //Буффер переполнен + return; + } + + uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % CAN_RX_BUFFER_SIZE; + + extID ExtID_Of_RX_MSG; + ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId; + + //Полученное сообщение - пульс устройств в сети + if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_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].TimeFromLastPulse = 0; + return; + } + TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep); - return; - } - //Если ID запроса соответствует ID устройства - if((ExtID_Of_RX_MSG.Fields.DeviceType == CURRENT_TYPE_DEVICE) && (ExtID_Of_RX_MSG.Fields.DeviceID == CURRENT_ID_DEVICE)) - { - if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_DISCRETE) - { - TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep); - return; - } - if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_ANALOG) - { - //Является ли полученное сообщение - запросом - if(RxHeader.RTR) - { - TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep); - return; - } - } - if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_GENERAL_ADDRESS_SPACE) - { - TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep); - return; - } - if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_COIL || - ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_DISCRETE || - ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_HOLDING || - ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_INPUT) - { - TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep); - return; - } - } - //Полученное сообщение - пульс устройств в сети - if (ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_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].TimeFromLastPulse = 0; } } } @@ -798,7 +768,7 @@ void REQUESTER_RTC_SYNC(uint8_t *data) sTime.Minutes = data[1]; sTime.Seconds = data[2]; - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) + if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } @@ -807,7 +777,7 @@ void REQUESTER_RTC_SYNC(uint8_t *data) DateToUpdate.Month = data[4]; DateToUpdate.Date = data[5]; DateToUpdate.WeekDay = data[6]; - if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK) + if(HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } @@ -869,74 +839,3 @@ void REQUESTER_CAN_FILTERS() //CONFIG_CAN_FILTER(3, 0, 0); } - -//void REQUESTER_CAN_FILTERS() -//{ -// //MAIN DEVICE -// CAN_FilterTypeDef canFilterConfig; -// canFilterConfig.FilterBank = 0; -// canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; -// canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; -// /*Для ID устройства используются восемь младших битов. -// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/ -// canFilterConfig.FilterIdHigh = (uint16_t)(ID_MAIN_DEVICE>>13); -// canFilterConfig.FilterIdLow = (uint16_t)(ID_MAIN_DEVICE<<5) | CAN_IDE_32; -// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/ -// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13); -// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32; -// canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; -// canFilterConfig.FilterActivation = ENABLE; -// canFilterConfig.SlaveStartFilterBank = 14; -// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK) -// { -// Error_Handler(); -// } -// -// //CURRENT DEVICE -// canFilterConfig.FilterBank = 1; -// /*Для ID устройства используются восемь младших битов. -// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/ -// canFilterConfig.FilterIdHigh = (uint16_t)(CURRENT_ID_DEVICE>>13); -// canFilterConfig.FilterIdLow = (uint16_t)(CURRENT_ID_DEVICE<<5) | CAN_IDE_32; -// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/ -// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13); -// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32; -// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK) -// { -// Error_Handler(); -// } -// -// //MODBUS -// canFilterConfig.FilterBank = 2; -// canFilterConfig.FilterIdHigh = (uint16_t)(0x03000000>>13); -// canFilterConfig.FilterIdLow = (uint16_t)(0x03000000<<5) | CAN_IDE_32; -// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key" -// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit -// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK) -// { -// Error_Handler(); -// } -// -// //PULSE -// canFilterConfig.FilterBank = 3; -// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)>>13); -// canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)<<5) | CAN_IDE_32; -// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key" -// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit -// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK) -// { -// Error_Handler(); -// } -// -// //DEBUG FILTER "ALL IDE WELCOME" -// canFilterConfig.FilterBank = 4; -// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(0)>>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(); -// } -//} -