K74B/app_Indie/usr/common/pdsTask.c
2024-01-16 10:46:17 +08:00

253 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @copyright 2015 Indie Semiconductor.
*
* This file is proprietary to Indie Semiconductor.
* All rights reserved. Reproduction or distribution, in whole
* or in part, is forbidden except by express written permission
* of Indie Semiconductor.
*
* @file pdsTask.c
* @Author: Jack.Pan
* @E-mail:jack.pan@indiemicro.com
* @Date: 2020/09/10
*/
#include <applicationTask.h>
#include <pdsTask.h>
#include <crc32.h>
#include <meta.h>
#include <motorControlTask.h>
#include <flash_device.h>
#include <flash_sfrs.h>
#include <linsNodeCfgIdentify.h>
#include <linStackTask.h>
#include <linSlaveTask.h>
#include <crc_sfr.h>
uint8_t pds_store(uint8_t index);
static SystemParams_t systemParam;
static Userdata_t userdata;
static TaskState_t pdsState = TASK_STATE_INIT;
static PdsStatus_t pdsStatus = PDS_STATUS_USING_NORMAL;
#define PDS_ACTIVE_DATA_INDEX (0U)
#define PDS_ACTIVE_DATA_BACKUP_INDEX (1U)
void PDS_PowerONRead_MotorParamfromFlash(uint16_t *buff,uint16_t leng)
{
for (uint16_t i = 0U; i < leng; i++){
*buff = systemParam.info.motorParams.data16[i];
buff++;
}
}
void PDS_Init(void)
{
uint32_t crcValue;
uint32_t crcValueuserdata;
CRC32_Init();
Userdata_t *Motorstep= (Userdata_t *)FLASH_START_ADDRESS_USER_DATA;
crcValueuserdata = CRC32_GetRunTimeCRC32((uint8_t *)&Motorstep->info ,(uint16_t)sizeof(Motorstep->info));
if(crcValueuserdata == Motorstep->head.crc32){
userdata = *Motorstep;
}else{
userdata.info.data[0] = 0;
userdata.info.data[1] = 0;
}
CRC32_Init();
SystemParams_t *param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA;
crcValue = CRC32_GetRunTimeCRC32((uint8_t *)&param->info ,(uint16_t)sizeof(param->info));
if (crcValue == param->head.crc32){
systemParam = *param;
pdsStatus = PDS_STATUS_USING_NORMAL;
}else{
param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP;
crcValue = CRC32_GetRunTimeCRC32((uint8_t *)&param->info ,(uint16_t)sizeof(param->info));
if (crcValue == param->head.crc32){
systemParam = *param;
pdsStatus = PDS_STATUS_USING_BACKUP;
}else{
pdsStatus = PDS_STATUS_USING_DEFAULT;
}
}
pdsStatus = PDS_STATUS_USING_DEFAULT;
if (pdsStatus == PDS_STATUS_USING_DEFAULT){
/* **********************fix LIN configuration default value ************************************/
systemParam.head.index = 0U;
systemParam.info.linParams.nad = INIT_LINS_NAD_ADDR;
systemParam.info.linParams.supplierID = LINS_SUPPLIER_ID;
systemParam.info.linParams.functionID = LINS_FUNCTION_ID;
systemParam.info.linParams.variant = LINS_VARIANT;
systemParam.info.linParams.serialNo = LINS_SERIAL_NO;
systemParam.info.linParams.fwVersion = LINS_FW_VERSION;
systemParam.info.linParams.hwVersion = LINS_HW_VERSION;
systemParam.info.motorParams.Constantspeed = DEFAULT_CONSTANTSPEED;
systemParam.info.motorParams.startspeed = DEFAULT_STARTSPEED;
systemParam.info.motorParams.Slowspeed = DEFAULT_SLOWSPEED;
systemParam.info.motorParams.MotorlockAcoilvoltage = DEFAULT_ACOILVOLTAGE;
systemParam.info.motorParams.MotorlockBcoilvoltage = DEFAULT_BCOILVOLTAGE;
systemParam.info.motorParams.ClimbTime = DEFAULT_CLIMBTIME;
systemParam.info.motorParams.SlowTime = DEFAULT_SLOWTIME;
// GetMotorPhyParam[0] = systemParam.info.motorParams.Constantspeed;//Constantspeed us/step
// GetMotorPhyParam[1] = systemParam.info.motorParams.startspeed;//Motorlock startspeed us/step
// GetMotorPhyParam[2] = systemParam.info.motorParams.Slowspeed;//Motorlock Slowspeed us/step
// GetMotorPhyParam[3] = systemParam.info.motorParams.MotorlockAcoilvoltage;//Motorlock Acoil voltage
// GetMotorPhyParam[4] = systemParam.info.motorParams.MotorlockBcoilvoltage;//Motorlock Bcoil voltage
// GetMotorPhyParam[5] = systemParam.info.motorParams.ClimbTime + (uint16_t)systemParam.info.motorParams.SlowTime << 8;//ClimbTime: ms low8bit, SlowTime: ms high8bit
LIN_Device_Frame_t volatile *frame = LINS_GetUcndFramesTable(&systemParam.info.linParams.frameIDSize);
for (uint8_t i = 0; i < systemParam.info.linParams.frameIDSize; i++){
systemParam.info.linParams.frameInfo[i].frameId = frame[i].frame_id;
systemParam.info.linParams.frameInfo[i].frameIsValid = TRUE;
}
}
ls_set_initialNad(INIT_LINS_NAD_ADDR);
ls_set_nad(INIT_LINS_NAD_ADDR);
/* must be call here for init LIN param */
LNCI_Init();
}
uint8_t pds_store(uint8_t index)
{
/****************************************************************************************************************/
static uint16_t motorbuffdata[TransferCNT];
/*Take out new parameters for the motor through the 3C command*/
LINS_Transfer3CdataToPDS(motorbuffdata,TransferCNT);
for(uint8_t n=0;n<TransferCNT;n++){
systemParam.info.motorParams.data16[n] = motorbuffdata[n];
}
uint16_t wordLength;
uint32_t *pWord = (uint32_t *)((void *)&systemParam);
uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(&systemParam.info) ,(uint16_t)sizeof(systemParam.info));
systemParam.head.crc32 = crcValue;
systemParam.head.index ++;
/* sizeof(SystemParams_t) is the timers of word */
wordLength = ((uint16_t)sizeof(SystemParams_t) >> 2U);
pdsStatus = PDS_STATUS_USING_NORMAL;
if (index == PDS_ACTIVE_DATA_INDEX){
/*write sys data normal*/
f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA);
for (uint32_t i = 0; i < wordLength; i+=2){
f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA +i*4U, pWord[i],pWord[i+1]);
}
}else{
/*write sys data back up*/
f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP);
for (uint32_t i = 0; i < wordLength; i++){
f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP +i*4U, pWord[i],pWord[i+1]);
}
}
return 0U;
}
void userdatapds_store(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
{
/****************************************************************************************************************/
userdata.info.data[0] = Motor_GetCurrentPosition();
userdata.info.data[1] = Motor_GetCurrentPosition() >> 16U;
uint16_t wordLength;
uint32_t *pWord = (uint32_t *)((void *)&userdata);
uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(&userdata.info) ,(uint16_t)sizeof(userdata.info));
userdata.head.crc32 = crcValue;
userdata.head.index ++;
Flash_EraseSector(FLASH_START_ADDRESS_USER_DATA);
/* sizeof(Userdata_t) is the timers of word */
wordLength = ((uint32_t)sizeof(Userdata_t) >> 2U);
/*write sys data normal*/
for (uint32_t i = 0; i < wordLength; i++){
FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_USER_DATA+i*8U,pWord[i*2],pWord[i*2+1]);
}
// CRC32_Init();
// Userdata_t *Motorstep= (Userdata_t *)FLASH_START_ADDRESS_USER_DATA;
// uint32_t crcValueuserdata = CRC32_GetRunTimeCRC32((uint8_t *)&Motorstep->info ,(uint16_t)sizeof(Motorstep->info));
// if(crcValueuserdata == Motorstep->head.crc32){
// userdata = *Motorstep;
// }else{
// userdata.info.data[0] = 0;
// userdata.info.data[1] = 0;
// }
}
MotorClusterParams_t *PDS_GetMotorParam(void)
{
return &systemParam.info.motorParams;
}
LINClusterParams_t *PDS_GetLINParam(void)
{
return &systemParam.info.linParams;
}
PdsStatus_t PDS_GetPdsStatus(void)
{
return pdsStatus;
}
uint32_t PDS_GetMotorstepnfromflash(void)
{
uint32_t motorstepn = 0;
motorstepn = userdata.info.data[1];
motorstepn <<= 16U;
motorstepn += userdata.info.data[0];
return motorstepn;
}
void PDS_TaskHandler(void)
{
switch(pdsState){
case TASK_STATE_INIT:
pdsState = TASK_STATE_ACTIVE;
break;
case TASK_STATE_ACTIVE:
/* storage system parameters */
(void)pds_store(PDS_ACTIVE_DATA_INDEX);
pdsState = TASK_STATE_PROCESSING;
//TM_PostTask(TASK_ID_PDS);
break;
case TASK_STATE_PROCESSING:
/* storage system parameters backup*/
(void)pds_store(PDS_ACTIVE_DATA_BACKUP_INDEX);
/* set save parameters flag for lin stack*/
(void)ls_save_configuration();
pdsState = TASK_STATE_ACTIVE;
break;
default:
break;
}
}