Implemented queue for can packets

This commit is contained in:
Yury Shuvakin
2023-04-01 19:13:58 +03:00
parent 3fe2c86773
commit 51b12ac970
4 changed files with 168 additions and 45 deletions

View File

@@ -105,6 +105,7 @@ modPowerElectronicsPackStateTypedef packState;
uint16_t LED_Blink_Delay;
uint64_t TIM_Clock;
uint64_t TIM3_Clock;
uint64_t Led_Timer;
uint64_t HTTP_timer;
uint8_t service_sw;
@@ -265,6 +266,7 @@ SPI_HandleTypeDef hspi3;
UART_HandleTypeDef huart2;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim6;
uint8_t OVP_counter = 0;
@@ -280,6 +282,12 @@ uint64_t shunt_charging_contractor_clock = 0;
uint64_t can1_transmit_clock = 0;
uint64_t can2_transmit_clock = 0;
uint8_t* can1_transmit_queue = 0;
uint8_t* can2_transmit_queue = 0;
uint16_t can1_transmit_queue_size = 0;
uint16_t can2_transmit_queue_size = 0;
#define __MA_WIN_SIZE (500)
#define __MA_ARRAY_QTY 2
@@ -297,6 +305,7 @@ static void MX_SPI1_Init(void);
//static void MX_SPI3_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM6_Init(void);
static void MX_TIM3_Init(void);
static void MX_TIM2_Init(void);
uint8_t SS_status(uint8_t type, Time_Struct* Event_time);
@@ -305,6 +314,10 @@ void Status_Clear(uint8_t Type);
void Save_data_to_Backup();
void Restore_shutdown_data();
void updateLimitsFromMem();
void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize);
void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan);
void modem_init();
uint8_t SS_param(Battery_Data_Struct* Source_Data);
@@ -361,30 +374,30 @@ void usbTIM(uint8_t OnOff) {
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
// testsi++;
if (htim->Instance == TIM2)
{
TimeoutMng();
TIM_Clock++;
}
else if (htim->Instance == TIM3)
{
CAN_TransmitRTR(0x500, 8, &hcan2);
if (TIM3_Clock % 2)
{
transmitCanPacketFromQueue(&can1_transmit_queue, &can1_transmit_queue_size, &hcan1);
}
else
{
transmitCanPacketFromQueue(&can2_transmit_queue, &can2_transmit_queue_size, &hcan2);
}
if (htim->Instance == TIM2)
TIM3_Clock++;
}
else if (htim->Instance == TIM6)
{
TimeoutMng();
TIM_Clock++;
}
else if (htim->Instance == TIM6)
{
libPacketTimerFunc();
// HAL_TIM_Base_Stop_IT(&htim6);
// HAL_GPIO_TogglePin(HL3_GPIO_Port, HL3_Pin);
// if(USB_On_Flag){
// if(USB_On_Flag){
modUARTTask();
// }
// }
//TimeoutMng();
// HAL_TIM_Base_Start_IT(&htim6);
libPacketTimerFunc();
modUARTTask();
}
}
@@ -1270,30 +1283,41 @@ void transmitCan2Packet()
uint8_t buffer[8] = {0};
// sending heartbeat command
memset(buffer, 0xFF, sizeof(buffer));
CAN_Transmit(0x500, buffer, 8, &hcan2);
// sending common current and voltage command
memcpy(buffer, &packState.packCurrent, sizeof(packState.packCurrent));
memcpy(buffer + 4, &packState.packVoltage, sizeof(packState.packVoltage));
CAN_Transmit(0x501, buffer, 8, &hcan2);
addCanPacketToQueue(0x501, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
// sending charge voltages (start, end) command
memcpy(buffer, &generalConfig->cellLCSoftUnderVoltage, sizeof(generalConfig->cellLCSoftUnderVoltage));
memcpy(buffer + 4, &generalConfig->cellSoftOverVoltage, sizeof(generalConfig->cellSoftOverVoltage));
CAN_Transmit(0x502, buffer, 8, &hcan2);
const float startVoltage = generalConfig->cellHardUnderVoltage * generalConfig->noOfCellsSeries;
const float endVoltage = generalConfig->cellHardOverVoltage * generalConfig->noOfCellsSeries;
memcpy(buffer, &startVoltage, sizeof(startVoltage));
memcpy(buffer + 4, &endVoltage, sizeof(endVoltage));
addCanPacketToQueue(0x502, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
// sending fault voltages (under, over) command
memcpy(buffer, &generalConfig->cellHardUnderVoltage, sizeof(generalConfig->cellHardUnderVoltage));
memcpy(buffer + 4, &generalConfig->cellHardOverVoltage, sizeof(generalConfig->cellHardOverVoltage));
CAN_Transmit(0x503, buffer, 8, &hcan2);
const float startFaultVoltage = generalConfig->cellLCSoftUnderVoltage * generalConfig->noOfCellsSeries;
const float endFaultVoltage = generalConfig->cellSoftOverVoltage * generalConfig->noOfCellsSeries;
memcpy(buffer, &startFaultVoltage, sizeof(startFaultVoltage));
memcpy(buffer + 4, &endFaultVoltage, sizeof(endFaultVoltage));
addCanPacketToQueue(0x503, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
// sending charge starting and ending command
float chargeStartingCurrent = 15; // TODO move to generalConfig
float chargeEndingCurrent = 5; // TODO move to generalConfig
memcpy(buffer, &chargeStartingCurrent, sizeof(chargeStartingCurrent));
memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent));
addCanPacketToQueue(0x504, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
// sending charge permission, charge ending, charge/discharge state and table current command
const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00;
const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00;
const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00;
// sending charge current command
const int socIndex = getIndexBySoc();
const int temperatureIndex = getIndexByTemperature();
float tableCurrent = 0;
float chargeEndingCurrent = 5; // TODO move to generalConfig
if (socIndex != -1 && temperatureIndex != -1)
{
@@ -1302,20 +1326,38 @@ void transmitCan2Packet()
tableCurrent = pureCurrent ? tableValue : generalConfig->batteryCapacity * tableValue;
}
memcpy(buffer, &tableCurrent, sizeof(tableCurrent));
memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent));
CAN_Transmit(0x504, buffer, 8, &hcan2);
// sending charge permission, charge ending and charge/discharge state command
const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00;
const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00;
const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00;
memset(buffer, '\0', sizeof(buffer));
memcpy(buffer + 0, &chargeAllowed, sizeof(chargeAllowed));
memcpy(buffer + 1, &chargeEnding, sizeof(chargeEnding));
memcpy(buffer + 2, &chargeSwitchState, sizeof(chargeSwitchState));
CAN_Transmit(0x505, buffer, 8, &hcan2);
memcpy(buffer + 4, &tableCurrent, sizeof(tableCurrent));
addCanPacketToQueue(0x505, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
}
void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize)
{
*queueSize += 10;
*queue = (uint8_t*)realloc(*queue, *queueSize);
memcpy(*queue + *queueSize - 10, &id, 2);
memcpy(*queue + *queueSize - 8, data, 8);
}
void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan)
{
if (*queueSize < 10)
return;
uint16_t id = 0;
uint8_t data[8] = {};
memcpy(&id, *queue + *queueSize - 10, 2);
memcpy(data, *queue + *queueSize - 8, 8);
*queueSize -= 10;
*queue = (uint8_t*)realloc(*queue, *queueSize);
CAN_Transmit(id, data, 8, hcan);
}
void modem_init(){
@@ -2112,6 +2154,7 @@ void SD_Update_Filename(SD_CARD_Global_Struct* source ){
void Total_DeInit(){
MX_FATFS_DeInit();
HAL_TIM_Base_DeInit(&htim2);
HAL_TIM_Base_DeInit(&htim3);
HAL_TIM_Base_DeInit(&htim6);
MX_USB_DEVICE_DeInit();
HAL_UART_DeInit(&huart2);
@@ -2201,7 +2244,9 @@ int main(void)
// MX_SPI3_Init();
MX_USART2_UART_Init();
MX_USB_DEVICE_Init();
MX_TIM6_Init();
MX_TIM3_Init();
MX_TIM2_Init();
MX_FATFS_Init();
@@ -2228,6 +2273,7 @@ int main(void)
Battery_Serial = generalConfig->serialNumber;
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_Base_Start_IT(&htim2);
SimStatus_Struct.Status_flag[__STATUS_CHARGING_DISCONNECT]=1;
@@ -2545,6 +2591,40 @@ static void MX_TIM2_Init(void)
}
static void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
}
static void MX_TIM6_Init(void)
{

View File

@@ -132,6 +132,7 @@ static const uint32_t flash_addr[FLASH_PAGES] = {
};
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim6;
UART_HandleTypeDef huart2;
@@ -350,6 +351,7 @@ void deinitEverything()
{
//-- reset peripherals to guarantee flawless start of user application
HAL_TIM_Base_Stop_IT(&htim2);
HAL_TIM_Base_Stop_IT(&htim3);
HAL_TIM_Base_Stop_IT(&htim6);
MX_USB_DEVICE_DeInit();
MX_FATFS_DeInit();

View File

@@ -492,6 +492,22 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
/* USER CODE END TIM6_MspInit 1 */
}
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
}
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM6_MspInit 0 */
@@ -506,7 +522,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
/* USER CODE END TIM6_MspInit 1 */
}
}
/**
@@ -532,6 +547,21 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
/* USER CODE END TIM6_MspDeInit 1 */
}
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspDeInit 0 */
/* USER CODE END TIM3_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM3_CLK_DISABLE();
/* TIM6 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspDeInit 1 */
/* USER CODE END TIM3_MspDeInit 1 */
}
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM6_MspDeInit 0 */

View File

@@ -70,6 +70,7 @@ void USART2_IRQHandler(void)
/* External variables --------------------------------------------------------*/
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim6;
/* USER CODE BEGIN EV */
@@ -145,6 +146,16 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM6_IRQn 1 */
}
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_IRQn 0 */
/* USER CODE END TIM6_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM6_IRQn 1 */
/* USER CODE END TIM6_IRQn 1 */
}
void TIM6_IRQHandler(void)
{