K74B/app_Indie/usr/common/pdsTask.c

253 lines
8.5 KiB
C
Raw Normal View History

2024-01-16 10:46:17 +08:00
/**
* @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;
}
}