Files
CHJ/user/Main/MainCore.c
2026-03-20 21:16:58 +08:00

559 lines
19 KiB
C
Executable File

#include "../main/SystemInclude.h"
u16 systmeState;
//u16 UPGRADECammand ;
//u16 CodeCRC ;
u16 jumpError;
//******************************************************************************
// for internel modbus
//u32 securityID; //
//*****************************************************************************
//for modbus >16bit register define
u32 flowRate,flowAccumulationInteger;
s32 GASPressure;
u64 flowAccumulationHex;
u32 minFlowRate,maxFlowRate,minAnalogOutput,maxAnalogOutput;
u32 alarmAcc,alarmUpperFlowRate,alarmLowerFlowRate;
u32 reverseFlowRateMin, reverseFlowRateMax;
//*******************************************************************************
__SystemProcess_Union_TypeDef systemProcessing; //ÓÃÓÚϵͳ¹¤×÷״̬
__SystemState_Union_TypeDef currentMode;
__Hardware_Status_Bit_TypeDef HWState;
__Alarm_State_TypeDef systemAlarm;
//******************************************************************************
u16 curveMode;
u16 SysLcd, SysLoopChip;// currentSysState;
u16 testTypeCounter;//, MEMSErrorCounter;
u16 systemVoltage, batteryGrid;
u16 calibType;
// for code CRC
u16 APPCodeCRC;
u32 securityID;
u16 IDvalidTime, comCounter, comResetCounter, AutoOffsetCounter, timePeriod, autoTxdCounter, SysVolErrorCount;
u32 ModeExitTime;
__Display_Status_Bit_TypeDef displayMode;
// for save data
u16 timeCompute;
//for system
u16 lastState, syatemHardState;
//------------------------------------------------------------------------------
// for display
u8 Dis1[15], timer[8];
u16 displayUpdate, displayCNT;
//u8 flowRateUnit, AccUnit;
//------------------------------------------------------------------------------
// for flowRate
u32 currentFlowRate, factoryFlowRate;
//------------------------------------------------------------------------------
//u16 calibTemperature;
//------------------------------------------------------------------------------
// for acc pulse output
u16 samplingInterval, samplingIntervalTarget, responseTimeIndex;
u16 updatePulseTime;
//------------------------------------------------------------------------------
u16 tmpIA;
s32 tmpSLA, tmpSLB;
u32 tmpLA, tmpLB;
TypeWord tempWord;
TypeLong tempL;
TypeLongLong tempDev;
//------------------------------------------------------------------------------
const u8 ProductModel[12] = PRODUCT_MOD;
const u8 SoftVersion[12] = VERSION;
const u8 SoftBuildDate[10] = BUILD_DATE;
const u8 PulseOutGain[] ={32,16,8,4,2,1}; //
const u8 FilterMax[] ={1, 2, 4, 8, 16, 32}; // filter depth
const u16 Timing[] ={BASE_125MS, BASE_250MS, BASE_500MS, BASE_1000MS, BASE_2000MS, BASE_4000MS};
const u16 TimeVaule[] ={2048,4096, 8192, 16384, 32768, 65535}; //2048, 0.125s£¬0.25s, 0.5s, 1s, 2s, 4s
const u16 UpdateTimeVaule[] ={3000, 3850, 7372, 8192, 16384, 16384}; // 0.235s, 0.45s, 0.5s, 1s, 2s
const u16 FRUnitForHour[] ={28800, 14400, 7200, 3600, 1800, 900};
const u16 FRUnitForMinute[] ={480, 240, 120, 60, 30, 15};
//------------------------------------------------------------------------------
const u8 BuildDate[] = __DATE__; // "Oct 30 2010"
/******************************************************************************/
//******************************************************************************
void EnterUserMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 0;
ModeExitTime = 0;
}
//******************************************************************************
void EnterCalibMode(void)
{
currentMode.Bit.CalibMode = 1;
currentMode.Bit.IntCalibMode = 1;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
ModeExitTime = 0;
}
//******************************************************************************
void EnterZeroCalibMode(void)
{
currentMode.Bit.CalibMode = 1;
currentMode.Bit.IntCalibMode = 1;
currentMode.Bit.ZeroCalib = 1;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
ModeExitTime = 0;
}
//******************************************************************************
void EnterBatteryMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 0;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
currentMode.Bit.ExtPowerInput = 0;
ModeExitTime = 0;
}
//******************************************************************************
void EnterDebugMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.IntCalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 1;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
currentMode.Bit.ExtPowerInput = 1;
ModeExitTime = 0;
}
//******************************************************************************
void EnterGcfTestMode(void)
{
currentMode.Bit.CalibMode = 0;
currentMode.Bit.FactoryTestMode = 0;
currentMode.Bit.DebugMode = 0;
currentMode.Bit.ExtPowerInput = 1;
currentMode.Bit.DigitOutput = 1;
currentMode.Bit.ComModeOperate = 1;
ModeExitTime = 0;
}
/******************************************************************************/
void ModeExitCount(void)
{
//----------------------------------------------------------------------------
// ONE SENCOND
// 16384*30 / 128
IDvalidTime += timePeriod;
if(IDvalidTime >= ID_VALID_TIME) {
IDvalidTime = 0;
securityID = 0;
HWState.EnableCheckCorr = 1;
}
//----------------------------------------------------------------------------
// comm return counter
if(currentMode.Bit.CalibMode) {
comCounter += timePeriod;
if(comCounter >= comResetCounter) {
comCounter = 0;
comResetCounter = TIMING_500mS;
currentMode.Bit.DigitOutput = 1;
systemProcessing.Bit.WriteHandle = 0;
}
}
//----------------------------------------------------------------------------
// mode return counter
ModeExitTime += (u32)timePeriod;
if(ModeExitTime >= (u32)EXIT_7200S) {
ModeExitTime = 0;
EnterUserMode();
// currentMode.Bit.ComModeOperate = 0;
}
}
/******************************************************************************/
void ManagePrimaryTimeInterval(void)
{
u32 currentPerPulse;
//----------------------------------------------------------------------------
//ÖØÖÃÖ÷¶¨Ê±Æ÷
samplingIntervalForTotal = samplingInterval;
timePeriod = TimeVaule[samplingInterval];
timePeriod >>= 7;
samplingInterval = samplingIntervalTarget;
ResetPrimaryTimer(TimeVaule[samplingInterval]);
samplingIntervalTarget = factoryInterval;//
if(currentMode.Bit.CalibMode) samplingIntervalTarget = (u16)EXT_POWER_PERIOD_TIME;
else samplingIntervalTarget = factoryInterval;//
currentMode.Bit.TurnOffSystem = 0;
}
//Ö÷³ÌÐòÈë¿Ú------------------------------------------------------------
void EnterMainEntry(void)
{
// samplingInterval = 1;
// ×¢²áÖ÷¶¨Ê±Æ÷Öжϴ¦Àí³ÌÐòÈë¿Ú
StartPrimaryTimer(TimeVaule[samplingInterval]); //ÆôÓÃÖ÷¶¨Ê±Æ÷
lptimer_register_irq_callback(PrimaryTimer, PrimaryTimer_IRQ_Callback);
}
/******************************************************************************/
void BackupParameterToFlash(void)
{
//FY WriteShortParameterToBuffer(UPGRADECammand, UPGRADE_APP, UPGRADE_APP_WIDTH);
//FY WriteShortParameterToBuffer(localAddress, SLAVER_ADDR, SLAVER_ADDR_WIDTH);
//WriteShortParameterToBuffer(baudRate, BAUD_RATE, BAUD_RATE_WIDTH);
// Clear_WDT();
//
// disable_interrupts();
////FY WriteMultiByteToInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN);
// enable_interrupts();
//FY ReadMultiByteFromInfoSegment(PARAMETER_BASE, FlashBuf, PARA_LEN);
}
//******************************************************************************
//ϵͳ²ÎÊý³õʼ»¯£¬¶ÁÈ¡³ö³§²ÎÊý
void SystemParameterInit(void)
{
currentMode.Bit.ComModeOperate = 0;
//------------------------------------------------------------------------------
InternalShortParameterInit();
InternalLongParameterInit();
//------------------------------------------------------------------------------
// ÏȶÁȡζȣ¬ÅжÏģʽ
ManagePrimaryTimeInterval();
//------------------------------------------------------------------------------
Clear_WDT();
//------------------------------------------------------------------------------
ReadMultiByteFromMemory(SERIES_BASE, (u8 *)&meterSN1, SERIES_DEPTH);
//------------------------------------------------------------------------------
localAddress = (u16)ReadShortParameterFromMemory(SLAVER_ADDR, SLAVER_ADDR_DEFAULT);
#ifndef ENABLE_USER_I2C
#pragma message("[undefined] ENABLE_USER_I2C")
#elif(ENABLE_USER_I2C)
I2CAddr = localAddress;
#endif
// for GDCF
// GCFCoefA = (s32)ReadParameterFromEEPROM(GCF_A, GCF_A_WIDTH, (u32)GCF_A_DEFAULT);
GDCFactor = (u16)ReadShortParameterFromMemory(GCF_B, GCF_DEFAULT);
// GCFCoefC = (s32)ReadParameterFromEEPROM(GCF_C, GCF_C_WIDTH, GCF_C_DEFAULT);
ComputeGCFFactor();
Clear_WDT();
offsetGas = (u16)ReadShortParameterFromMemory(GAS_OFFSET, 32768);
//------------------------------------------------------------------------------
// offsetGCFX = (u16)ReadParameterFromEEPROM(OFFSET_GCFX, OFFSET_GCFX_WIDTH, 32768);
//------------------------------------------------------------------------------
samplingInterval = factoryInterval;
samplingTiming = SetupResponseTime(factoryInterval, SAMPLE_PERIOD_DEFAULT);
responseTimeIndex = (u16)ReadShortParameterFromMemory(RESPONSE_TIME, RESPONSE_TIME_DEFAULT);
responseTime = SetupResponseTime(responseTimeIndex, RESPONSE_TIME_DEFAULT);
// for max current Loop flowrate
maxFlowRate = ReadLongParameterFromMemory(OUT_MAX_FLOW, MAX_FR_DEFAULT);
tempL.DWord = maxFlowRate;
maxFlowRateH = tempL.Word[1];
maxFlowRateL = tempL.Word[0];
minFlowRate = ReadLongParameterFromMemory(OUT_MIN_FLOW, MIN_FR_DEFAULT); // V2004
tempL.DWord = minFlowRate;
minFlowRateH = tempL.Word[1];
minFlowRateL = tempL.Word[0];
Clear_WDT();
//read uart DecimalPoint
uartDecimalPoint = (u16)ReadShortParameterFromMemory(COM_DECIMAL, COM_DECIMAL_POINT_DEFAULT);
//============================================================================
// for AUTO TXD DATA
timingTxdStart = (u16)ReadShortParameterFromMemory(TIMING_TXD_START, TIMING_TXD_START_DEFAULT);
timingTxdLen = (u16)ReadShortParameterFromMemory(TIMING_TXD_LEN, TIMING_TXD_LEN_DEFAULT);
timingTxdTime = (u16)ReadShortParameterFromMemory(TIMING_TXD_TIME, TIMING_TXD_TIME_DEFAULT);
// key setup password
//============================================================================
#ifndef ENABLE_KEY_FUNCTION
#pragma message("[undefined] ENABLE_KEY_FUNCTION")
#elif(ENABLE_KEY_FUNCTION)
keyPassWord = ReadParameterFromEEPROM(KEY_PASSWORD, KEY_PASSWORD_WIDTH, KEY_PASSWORD_DEFAULT);
#endif
//============================================================================
UnitConverterInit();
//============================================================================
#ifndef ENABLE_ACCPULSE
#pragma message("[undefined] ENABLE_ACCPULSE")
#elif(ENABLE_ACCPULSE)
PulseParameterInit();
#endif
//============================================================================
GasAnalysisParameterInit();
//============================================================================
SaveParameterInit();
//==============================================================================
// retrieve device coefficients
#ifndef ENABLE_DCOEF
#pragma message("[undefined] ENABLE_DCOEF")
#elif(ENABLE_DCOEF)
RetriveDevCoef();
#endif
//============================================================================
// for Tempreature correct
RetriveTACurve();
//==============================================================================
#ifndef REC_ACC_PER
#pragma message("[undefined] REC_ACC_PER")
#elif(REC_ACC_PER)
RetrieveLastAccumulation();
#endif
SetHistoryRecordTime();
// for modbus
InitUseBusParameter();
//----------------------------------------------------------------------------
// V2004
#ifndef ENABLE_ALARM_ACC
#pragma message("[undefined] ENABLE_ALARM_ACC")
#elif(ENABLE_ALARM_ACC)
alarmAcc = ReadParameterFromEEPROM(ALARM_ACC, ALARM_ACC_WIDTH, ALARM_ACC_DEFAULT);
#endif
//----------------------------------------------------------------------------
#ifndef ENABLE_LEAK_DETECT
#pragma message("[undefined] ENABLE_LEAK_DETECT")
#elif(ENABLE_LEAK_DETECT)
minLeakFlowRate = (u16)ReadParameterFromEEPROM(MIN_LEAK_FLOW, MIN_LEAK_FLOW_WIDTH, MIN_LEAK_FLOW_DEFAULT);
maxLeakFlowRate = (u16)ReadParameterFromEEPROM(MAX_LEAK_FLOW, MAX_LEAK_FLOW_WIDTH, MAX_LEAK_FLOW_DEFAULT);
leakDetectTime = (u16)ReadParameterFromEEPROM(LEAK_TIME, LEAK_TIME_WIDTH, LEAK_TIME_DEFAULT);
#endif
//==============================================================================
#ifndef REC_ACC_PER
#pragma message("[undefined] REC_ACC_PER")
#elif(REC_ACC_PER)
RetrieveLastAccumulation();
#endif
}
//******************************************************************************
// Auto-check
void SystemHardWareAutoCheck(void)
{
u8 rand;
systemAlarm.Word = 0;
for(rand = 0; rand < 6; rand++) Dis1[rand] = 0;
// 1) check CRYSTAL
// if(AutoCheckCrystal())
// {
// Dis1[CHK_CRYSTAL] = 1;
// systemAlarm.Bit.CrystalAlarm = 1;
// }
// 2) Check calib memory
rand = ReadByteFromEEPROM(0, PARA_EEPROM);
rand++;
WriteByteToEEPROM(0, rand, PARA_EEPROM);
if(rand != ReadByteFromEEPROM(0, PARA_EEPROM))
{
systemAlarm.Bit.EEPROMAlarm = 1;
Dis1[CHK_PARA] = 1;
}
// 3) Check data memory
rand = ReadByteFromEEPROM(0, DATA_EEPROM);
rand++;
WriteByteToEEPROM(0, rand, DATA_EEPROM);
if(rand != ReadByteFromEEPROM(0, DATA_EEPROM))
{
systemAlarm.Bit.EEPROMAlarm = 1;
Dis1[CHK_DATA] = 1;
}
// // 4) Check acc memory
// rand = ReadByteFromFRAM(0);
// rand++;
// WriteByteToFRAM(0, rand);
// if(rand != ReadByteFromFRAM(0))
// {
// systemAlarm.Bit.EEPROMAlarm = 1;
// Dis1[CHK_ACC] = 1;
// }
// 7) Check external RTC and read current time
//FY SetRTCCurrentTime(); // set time to MCU RTC
// 7)Check external temprature
#ifndef ENABLE_USE_MCP9808
#pragma message("[undefined] ENABLE_USE_MCP9808")
#elif(ENABLE_USE_MCP9808)
if(ReadWordRegister(MID) != 0x0054)
{
systemAlarm.Bit.TempAlarm = 1;
Dis1[CHK_TEMP] = 1;
}
#endif
}
//******************************************************************************
void SystemHardWareInit(void)
{
/*SPI Bus Init=========================================================================*/
//TurnOffAnalogCircuit();
/*IIC Bus Init=========================================================================*/
// SI2C_Init();
/*Memory Init==========================================================================*/
EEPROMInit();
//if(REC_ACC_PER) FRAMInit();// Acc flowrate save enable bit
/*external tempreture Init============================================================*/
// HWState.EnableTempTest= 1;
// HWState.EnableTempInit=1;
// WriteWordRegister(CONFIG, SHUT_DOWN);//ÅäÖüĴæÆ÷³õʼ»¯
}
//******************************************************************************
void SystemInterfaceInit(void)
{
//uart init============================================================================
#ifndef ENABLE_USER_UART
#pragma message("[undefined] ENABLE_USER_UART")
#elif(ENABLE_USER_UART)
MainUartInit(baudRateVaule[baudRate]);
StartDMAForRxdMainUartData();
#endif
//iic init============================================================================
#ifndef ENABLE_USER_I2C
#pragma message("[undefined] ENABLE_USER_I2C")
#elif(ENABLE_USER_I2C)
I2C_Slave_Init(100000 , 0x02);
I2CAddr = localAddress;
#endif
}
//******************************************************************************
void InitGlobalVar(void)
{
u8 I;
jumpError = 0;
Clear_WDT();
//TXDMode = ENABLE_TXD_USE_DMA;
displayUpdate = 0;
flowRate = 0;
for(I=0; I<12; I++) Dis1[I] = 0;
for(I=0; I<ANX; I++) voltageDetected[I] = 0;
HWState.SampledOver = 0;
HWState.EnableCheck = 1;
currentMode.Bit.TurnOffSystem = 0;
//==============================================================================
// softVersion = (u16)SOFT_VERSION;
softVersion = (u16)VER_MV;
softVersion <<= 4;
softVersion |= (u16)VER_SV;
softVersion <<= 4;
softVersion |= (u16)VER_RV;
softVersion <<= 4;
softVersion |= (u16)VER_BV;
//=============================================================================
// 0x80~0xf0
protocol = 0;
localAddress = 1;
baudRate = BPS_38400; // BPS_9600 BPS_115200
minAnalogOutput = 0;
maxAnalogOutput = 0;
GDCFactorAType = 0;
filterTime = 0;
offsetGas = 0;
offsetGasA = 0;
flowUnit = 0;
alarmFunction = 0;
alarmOutDelay = 0;
alarmAcc = 0;
alarmUpperFlowRate = 0;
alarmLowerFlowRate = 0;
PulseLevel = 0;
//==============================================================================
// 0XF0~0XFF: write only (¹¦ÄÜÂë)
CMDComPassword = 0;
CMDCalOffset = 0;
CMDClrRecord = 0;
//==============================================================================
flowAccCumulationRemaining = 0;
flowAccumulationHex = 0;
//---------------------------------------------------------------------------
totalPulse = 0;
#ifndef ENABLE_DENSITY_DETECT
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
#elif(ENABLE_DENSITY_DETECT)
density = 0;
densityFSParameter = 0;
#endif
displayMode.NeedForInit = 1;
}
/*******************************************************************************/
void SystemInitProcess(void)
{
InitGlobalVar(); //È«¾Ö±äÁ¿³õʼ»¯
SystemHardWareInit(); //ϵͳӲ¼þ³õʼ»¯
SystemHardWareAutoCheck(); //
SystemParameterInit(); //ϵͳ²ÎÊý³õʼ»¯
SystemInterfaceInit(); //ϵͳ½Ó¿Ú³õʼ»¯ //USER_UART
systmeState = 0xAA55;
}