#include "Gauges.h" #include "g_includes.h" #define Motor_Amendment 24 #define MOTOR_PHYSICAL_ZERO_INDEX 0 typedef struct { INT8U MoveEn; } Gauges_Control_st_t; #pragma ghs section bss = ".myNonInitArea" _GaugesInfo GaugesInfo[Num_Of_Piecewise_Linear_App]; Gauges_Control_st_t stGaugesControl[4U]; INT8U Gauges_IG_Status = 0; INT8U Gauges_IG_Status_Last = 0; #pragma ghs section bss = default INT8U Gauges_App_FindSector(INT16U Physical_Data, INT8U Index) { INT8U i, Order, SectorID = 0; if (GaugesInfo[Index].Physical_Quantity[0] > GaugesInfo[Index].Physical_Quantity[GaugesInfo[Index].Parameter_Num - 1]) { Order = 0; } else { Order = 1; } for (i = 0; i < (GaugesInfo[Index].Parameter_Num - 1); i++) { if (Order == 1) { if (Physical_Data >= GaugesInfo[Index].Physical_Quantity[i]) { SectorID++; } } if (Order == 0) { if (Physical_Data <= GaugesInfo[Index].Physical_Quantity[i]) { SectorID++; } } } return SectorID; } INT16U Motor_CalMicroStep(INT16U Physical_Data, INT8U Index) { INT8U SectorID = 0; INT32U PerCentum = 0; INT32U StepCn = 0; INT8U ASCF = 0; INT32U wTemp = 0; if (Index >= Num_Of_Piecewise_Linear_App) { return 0; } if ((GaugesInfo[Index].Parameter_Num < 2) || (GaugesInfo[Index].Parameter_Num > 8)) { return 0; } if (GaugesInfo[Index].Physical_Quantity[1] > GaugesInfo[Index].Physical_Quantity[0]) { ASCF = 1; } else if (GaugesInfo[Index].Physical_Quantity[1] < GaugesInfo[Index].Physical_Quantity[0]) { ASCF = 2; } else { return 0; } if (ASCF == 1) { if (Physical_Data > GaugesInfo[Index].Physical_Quantity[GaugesInfo[Index].Parameter_Num - 1]) { Physical_Data = GaugesInfo[Index].Physical_Quantity[GaugesInfo[Index].Parameter_Num - 1]; } if (Physical_Data < GaugesInfo[Index].Physical_Quantity[0]) { Physical_Data = GaugesInfo[Index].Physical_Quantity[0]; } } if (ASCF == 2) { if (Physical_Data < GaugesInfo[Index].Physical_Quantity[GaugesInfo[Index].Parameter_Num - 1]) { Physical_Data = GaugesInfo[Index].Physical_Quantity[GaugesInfo[Index].Parameter_Num - 1]; } if (Physical_Data > GaugesInfo[Index].Physical_Quantity[0]) { Physical_Data = GaugesInfo[Index].Physical_Quantity[0]; } } SectorID = Gauges_App_FindSector(Physical_Data, Index); if (SectorID > (GaugesInfo[Index].Parameter_Num - 1)) { return 0; } if (ASCF == 1) { wTemp = Physical_Data - GaugesInfo[Index].Physical_Quantity[SectorID - 1]; PerCentum = wTemp * 1000; PerCentum = PerCentum / (GaugesInfo[Index].Physical_Quantity[SectorID] - GaugesInfo[Index].Physical_Quantity[SectorID - 1]); } if (ASCF == 2) { wTemp = GaugesInfo[Index].Physical_Quantity[SectorID - 1] - Physical_Data; PerCentum = wTemp * 1000; PerCentum = PerCentum / (GaugesInfo[Index].Physical_Quantity[SectorID - 1] - GaugesInfo[Index].Physical_Quantity[SectorID]); } wTemp = GaugesInfo[Index].MicroStep[SectorID] - GaugesInfo[Index].MicroStep[SectorID - 1]; wTemp = wTemp * PerCentum; if ((wTemp % 1000) >= 500) { wTemp += 500; } StepCn = wTemp / 1000 + GaugesInfo[Index].MicroStep[SectorID - 1]; return (INT16U)(StepCn); } INT16U Gauges_Parameter_Set_Motor(INT8U Index, INT16U Physical_Data) { INT16U Step_buf = 0U; if (Index >= 4) { return 0; } if (Normal != bsp_GetMotorState(Index)) { return 0; } if ((1 == Gauges_IG_Status) && (1 == Gauges_IG_Status_Last)) { Step_buf = Motor_CalMicroStep(Physical_Data, Index); if (MeterPostion[Index].curPosition >= (GaugesInfo[Index].MicroStep[MOTOR_PHYSICAL_ZERO_INDEX] + Motor_Amendment)) { stGaugesControl[Index].MoveEn = 1; } if ((1 == stGaugesControl[Index].MoveEn) && (Physical_Data <= GaugesInfo[Index].Physical_Quantity[MOTOR_PHYSICAL_ZERO_INDEX])) { if (Step_buf >= Motor_Amendment) { Step_buf -= Motor_Amendment; } } MeterPostion[Index].destPosition = Step_buf; return 1u; } else { return 0u; } } void Gauges_IGStatus_Set(INT8U IG_Status) { //OFF-->ON if ((Gauges_IG_Status == 0) && (IG_Status == 1)) { stGaugesControl[0].MoveEn = 0; stGaugesControl[1].MoveEn = 0; stGaugesControl[2].MoveEn = 0; stGaugesControl[3].MoveEn = 0; } Gauges_IG_Status = IG_Status; } void Gauges_Zero_Severces(void) { if (Gauges_IG_Status_Last != Gauges_IG_Status) { if ((((Normal == bsp_GetMotorState(VehMotorNum)) && (GaugesInfo[VehMotorNum].Parameter_Num)) || (0 == GaugesInfo[VehMotorNum].Parameter_Num)) && (((Normal == bsp_GetMotorState(RevMotorNum)) && (GaugesInfo[RevMotorNum].Parameter_Num)) || (0 == GaugesInfo[RevMotorNum].Parameter_Num))) { if (1 == Gauges_IG_Status) { if ((MeterPostion[VehMotorNum].curPosition == MeterPostion[VehMotorNum].destPosition) && (MeterPostion[RevMotorNum].curPosition == MeterPostion[RevMotorNum].destPosition)) { bsp_SetMotorMode(VehMotorNum, MinReset); bsp_SetMotorMode(RevMotorNum, MinReset); Gauges_IG_Status_Last = Gauges_IG_Status; } } else if (0 == Gauges_IG_Status) //ON-->OFF { MeterPostion[VehMotorNum].destPosition = 0; MeterPostion[RevMotorNum].destPosition = 0; Gauges_IG_Status_Last = Gauges_IG_Status; } } } } void Gauges_Variate_Init_Once(void) { Gauges_IG_Status_Last = 0xFF; Gauges_IG_Status = 0; }