Files
CHJ/user/Interface/StdKeyEdit 0810.c
2026-03-20 21:16:58 +08:00

1306 lines
47 KiB
C
Executable File
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.

#include "../main/SystemInclude.h"
//##############################################################################
#if(ENABLE_KEY_FUNCTION)
//##############################################################################
//==============================================================================
unsigned int keyDealFlag;
bool isKeyPressed, keySetPoint; // 键响应程序进入标志
unsigned int timerTar;
unsigned int keyFlag, menuIndex; // 键处理标志及菜单索引
unsigned int setKeyType, setIndex; // 二级菜单处理嵌套
unsigned int PassWord; // 密码
unsigned int keyValue, keyBuff, totalTime; // 键值判断
unsigned int modifyBit, keyFlashTime; // 设置参数闪烁位及时间
unsigned long int setKeyBuffer; // 参数设置缓存单元
unsigned long int temp_dcoefNode[DCOEF_MAX];
unsigned int temp_dcoefNum, temp_dcoefVal[DCOEF_MAX];
unsigned char setMin[6], setMax[6];
unsigned int parameterSetError;
/******************************************************************************/
const unsigned char PRTCL_Prompt[]={WORD_F, 1, WORD_NULL, WORD_NULL, WORD_P, WORD_R, WORD_T, WORD_C, WORD_L}; // F1 通讯协议 PRTCL
const unsigned char ADDR_Prompt[]={WORD_F, 2, WORD_NULL, WORD_NULL, WORD_A, WORD_D, WORD_D, WORD_R, WORD_NULL}; // F2 从机地址 ADDR
const unsigned char BPS_Prompt[]={WORD_F, 3, WORD_NULL, WORD_NULL, WORD_B, WORD_P, WORD_S, WORD_NULL, WORD_NULL}; // F3 波特率 BPS
//------------------------------------------------------------------------------
// 流量类F11-F30
const unsigned char OFFST_Prompt[]={WORD_F, 1, 1, WORD_NULL, WORD_O, WORD_F, WORD_F, WORD_S, WORD_T}; // F11 校准零点 OFFST
const unsigned char GCF_Prompt[]={WORD_F, 1, 2, WORD_NULL, WORD_G, WORD_C, WORD_F, WORD_NULL, WORD_NULL}; // F12 GCF GCF
const unsigned char FACTR_Prompt[]={WORD_F, 1, 3, WORD_NULL, WORD_F, WORD_A, WORD_C, WORD_T, WORD_R}; // F13 仪表系数 FACTR
const unsigned char CORR_Prompt[]={WORD_F, 1, 4, WORD_NULL, WORD_C, WORD_O, WORD_R, WORD_R, WORD_NULL}; // F14 二次修正系数 CORR
const unsigned char FS_Prompt[]={WORD_F, 1, 5, WORD_NULL, WORD_F, WORD_S, WORD_NULL, WORD_NULL, WORD_NULL}; // F15 量程设置 FS
const unsigned char RESPS_Prompt[]={WORD_F, 1, 6, WORD_NULL, WORD_R, WORD_E, WORD_S, WORD_P, WORD_S}; // F16 响应时间 RESPS
//------------------------------------------------------------------------------
const unsigned char CUTF_Prompt[]={WORD_F, 2, 8, WORD_NULL, WORD_C, WORD_U, WORD_T, WORD_LINE, WORD_F}; // F28 小流量切除 CUT-F
const unsigned char DIAM_Prompt[]={WORD_F, 2, 9, WORD_NULL, WORD_D, WORD_I, WORD_A, WORD_M, WORD_NULL}; // F29 管径设置 DIAM
//------------------------------------------------------------------------------
// 显示类F31-F40
const unsigned char UNTA_Prompt[]={WORD_F, 3, 1, WORD_NULL, WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_A}; // F31 累积流量单位 UNT-A
const unsigned char UNTF_Prompt[]={WORD_F, 3, 2, WORD_NULL, WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_F}; // F32 实时流量单位 UNT-F
const unsigned char UNTP_Prompt[]={WORD_F, 3, 3, WORD_NULL, WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_P}; // F33 压力单位 UNT-P
const unsigned char DISP_Prompt[]={WORD_F, 3, 9, WORD_NULL, WORD_D, WORD_I, WORD_S, WORD_P, WORD_NULL}; // F39 显示模式 DISP
//------------------------------------------------------------------------------
// 模拟接口类F31-F40
const unsigned char PULSE_Prompt[]={WORD_F, 4, 1, WORD_NULL, WORD_P, WORD_U, WORD_L, WORD_S, WORD_E}; // F41 脉冲当量 PULSE
//------------------------------------------------------------------------------
// 报警类F41-F50
const unsigned char ALMH_Prompt[]={WORD_F, 5, 1, WORD_NULL, WORD_A, WORD_L, WORD_M, WORD_LINE, WORD_H}; // F51 高流量报警 ALM-H
const unsigned char ALML_Prompt[]={WORD_F, 5, 2, WORD_NULL, WORD_A, WORD_L, WORD_M, WORD_LINE, WORD_L}; // F52 低流量报警 ALM-L
const unsigned char ALMA_Prompt[]={WORD_F, 5, 3, WORD_NULL, WORD_A, WORD_L, WORD_M, WORD_LINE, WORD_A}; // F53 总量报警上限 ALM-A
const unsigned char ALMT_Prompt[]={WORD_F, 5, 4, WORD_NULL, WORD_A, WORD_L, WORD_M, WORD_LINE, WORD_T}; // F54 时间报警 ALM-T
//------------------------------------------------------------------------------
// 无线类F71-F90
const unsigned char LRID_Prompt[]={WORD_F, 7, 1, WORD_NULL, WORD_L, WORD_R, WORD_LINE, WORD_I, WORD_D}; // F71 LORA本机地址 LR-ID
const unsigned char NETID_Prompt[]={WORD_F, 7, 2, WORD_NULL, WORD_N, WORD_E, WORD_T, WORD_I, WORD_D}; // F72 LORA上级地址 NETID
const unsigned char LRCH_Prompt[]={WORD_F, 7, 3, WORD_NULL, WORD_L, WORD_R, WORD_LINE, WORD_C, WORD_H}; // F73 LORA信道 LR_CH
//------------------------------------------------------------------------------
// 操作类F91-F98
const unsigned char PASS_Prompt[]={WORD_F, 9, 1, WORD_NULL, WORD_P, WORD_A, WORD_S, WORD_S, WORD_NULL}; // F91 设置密码 PASS
const unsigned char CLRA_Prompt[]={WORD_F, 9, 2, WORD_NULL, WORD_C, WORD_L, WORD_R, WORD_LINE, WORD_A}; // F92 清除总流量 CLR-A
const unsigned char CLRT_Prompt[]={WORD_F, 9, 3, WORD_NULL, WORD_C, WORD_L, WORD_R, WORD_LINE, WORD_T}; // F93 清除时间 CLR-T
const unsigned char RS2ND_Prompt[]={WORD_F, 9, 4, WORD_NULL, WORD_R, WORD_S, WORD_2, WORD_N, WORD_D}; // F94 恢复二次修正 RS2ND
//------------------------------------------------------------------------------
const unsigned char QUIT_Prompt[]={WORD_F, 9, 9, WORD_NULL, WORD_Q, WORD_U, WORD_I, WORD_T, WORD_NULL}; // F99 退出设置 QUIT
//------------------------------------------------------------------------------
const unsigned char SAVE_Prompt[]={WORD_S, WORD_A, WORD_V, WORD_E, WORD_Y, WORD_E, WORD_S, WORD_NULL, WORD_NULL};
const unsigned char PassWord_Prompt[]={WORD_P, WORD_A, WORD_S, WORD_S, WORD_NULL, WORD_0, WORD_0, WORD_0, WORD_0};
//==============================================================================
// for key value
const unsigned char YESNO_VALUE[]={WORD_N, WORD_O, WORD_NULL, WORD_NULL, WORD_NULL, WORD_Y, WORD_E, WORD_S, WORD_NULL, WORD_NULL};
const unsigned char RS2ND_VALUE[]={WORD_R, WORD_T, WORD_N, WORD_NULL, WORD_NULL, WORD_R, WORD_E, WORD_S, WORD_E, WORD_T};
/******************************************************************************/
// for display buffer
const unsigned char DisOffset[] = {FUN_BUF_PROMPT1, FUN_BUF_PROMPT2, FUN_BUF_PROMPT3, FUN_BUF_PROMPT4, FUN_BUF_PROMPT5, FUN_BUF_DECIMAL};
/******************************************************************************/
void DisplayForKeyOperation(void)
{
display_data[FUN_BUF_PROMPT1] = CodeACC[Dis1[FUN_PROMPT1]];
display_data[FUN_BUF_PROMPT2] = CodeACC[Dis1[FUN_PROMPT2]];
display_data[FUN_BUF_PROMPT3] = CodeACC[Dis1[FUN_PROMPT3]];
display_data[FUN_BUF_PROMPT4] = CodeACC[Dis1[FUN_PROMPT4]];
display_data[FUN_BUF_PROMPT5] = CodeACC[Dis1[FUN_PROMPT5]];
display_data[FUN_BUF_DECIMAL] = CodeACC[Dis1[FUN_DECIMAL]];
display_data[FUN_BUF_CODE1] = CodeFlowRate[Dis1[FUN_CODE_1]];
display_data[FUN_BUF_CODE2] = CodeFlowRate[Dis1[FUN_CODE_2]];
display_data[FUN_BUF_CODE3] = CodeFlowRate[Dis1[FUN_CODE_3]];
display_data[FUN_BUF_CODE4] = CodeFlowRate[Dis1[FUN_CODE_4]];
if(keySetPoint) display_data[KEYSET_DOT] |= KEYSET_DOT_BIT;
LcdWriteDisplay();
}
/******************************************************************************/
#pragma vector = KEY_VECTOR
__interrupt void KeyInterrupt_isr(void)
{
intVector = KEY_IV;
intVector &= M_KEY_VECTOR+ INC_KEY_VECTOR + DEC_KEY_VECTOR;
if(intVector != 0)
{
isKeyPressed = 1;
systemProcessing |= KEY_HANDLE;
LPM1_EXIT;
}
}
/******************************************************************************/
void KeyReset(void)
{
KEY_INPUT();
keyFlag = DIS_PARA_INT;
isKeyPressed = 0;
keyValue = 0;
menuIndex = 0;
setKeyType = 0;
setIndex = 0;
PassWord = 0;
timerTar = 0;
keyDealFlag = 0;
systemProcessing &= ~KEY_HANDLE;
}
/******************************************************************************/
void DisableKeyInterrupt(void)
{
KEY_IE &= ~KEY_PIN;
KEY_IFG &= ~KEY_PIN; //清零中断标志
}
/******************************************************************************/
void EnableKeyInterrupt(void)
{
KEY_IES |= KEY_PIN;
KEY_IFG &= ~KEY_PIN; //清零中断标志
KEY_IE |= KEY_PIN;
}
/******************************************************************************/
void KeyEditInit(void)
{
// key intput interrupt
KEY_INPUT();
}
/******************************************************************************/
void FlashBitForSetup(void)
{
unsigned char tempT, I;
if(keyFlag != FLASH_BIT) return;
if(keyFlashTime == RTCSEC) return;
keyFlashTime = RTCSEC;
I = DisOffset[modifyBit];
tempT = display_data[I];
tempT &= ~BIT0;
if(tempT == 0) display_data[I] |= CodeACC[Dis1[modifyBit]];
else display_data[I] &= (unsigned char)BIT0;
//LcdWriteDisplayFirst();
LcdWriteDisplay();
}
/******************************************************************************/
void ComputeTime(void)
{
unsigned int timerTemp;
// main timer: 1s = 16384
// 50ms: 820
timerTemp = MAINTAR;
if(timerTar == 0) timerTar = timerTemp;
else
{
if(timerTar == 65535) return;
if(timerTar < timerTemp) timerTemp -= timerTar;
else timerTemp += 65535 - timerTar;
if(timerTemp >= KEY_RESPONSE_TIME) timerTar = 65535; //timerTar = KEY_RESPONSE_TIME;
}
}
/******************************************************************************/
void ReadKeyValue(void)
{
KeyEditInit();
keyValue = READ_KEY_VALUE();
if(keyValue != KEY_PIN)
{
// 按键初始化
if(keyBuff != keyValue)
{
timerTar = MAINTAR;
keyBuff = keyValue;
totalTime = RTCSEC;
}
else ComputeTime();
keyValue = 0;
}
else // 按键释放,判断按键
{
keyValue = 0;
DisableKeyInterrupt();
if((keyBuff == 0) || (keyBuff == KEY_PIN))
{
keyBuff = KEY_PIN;
if(IDvalidTime >= EXIT_30S) KeyReset();
EnableKeyInterrupt();
return;
}
// 判断按键时间及键值判断
// ComputeTime();
// if(totalTime > KEY_RESPONSE_TIME)
if(timerTar == 65535)
{
keyBuff = ~keyBuff;
keyBuff &= KEY_PIN;
if(keyBuff == M_KEY)
{
keyValue = RTCSEC;
if(totalTime > keyValue) totalTime = keyValue + 60 - totalTime;
else totalTime = keyValue - totalTime;
if(totalTime > 1) keyValue = LONG_M_KEY;
else keyValue = M_KEY;
//if(totalTime < KEY_HOLD_TIME) keyValue = M_KEY;
//else keyValue = LONG_M_KEY;
}
else if(keyBuff == INC_KEY) keyValue = INC_KEY;
else if(keyBuff == DEC_KEY) keyValue = DEC_KEY;
else keyValue = 0;
}
totalTime = 0;
keyBuff = KEY_PIN;
}
}
/******************************************************************************/
unsigned long int ComputeSumOfFiveDigits(unsigned int modifyFirstBit, unsigned int modifyLastBit)
{
unsigned long int computeSum = 0;
for(; modifyFirstBit <= modifyLastBit; modifyFirstBit++)
{
computeSum *= (unsigned long int)10;
computeSum += (unsigned long int)Dis1[modifyFirstBit];
}
return computeSum;
}
/******************************************************************************/
void JudgeKeySetMax(unsigned int setBit, unsigned int endBit)
{
unsigned int I;
for(I = 0; setBit <= endBit; setBit++, I++)
{
if(Dis1[setBit] < setMax[I]) return;
else if(Dis1[setBit] > setMax[I])
{
Dis1[setBit] = setMax[I];
parameterSetError = 1;
}
}
}
/******************************************************************************/
void JudgeKeySetMin(unsigned int setBit, unsigned int endBit)
{
unsigned int I;
for(I = 0; setBit <= endBit; setBit++, I++)
{
if(Dis1[setBit] > setMin[I]) return;
else if(Dis1[setBit] < setMin[I])
{
Dis1[setBit] = setMin[I];
parameterSetError = 1;
}
}
}
/******************************************************************************/
// 设置按键提示符
void SettingKeyPrompt(const unsigned char *Prompt)
{
unsigned int I;
for(I = FUN_CODE_1; I <= FUN_CODE_4; I++) Dis1[I] = *Prompt++;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
Dis1[FUN_DECIMAL] = WORD_NULL;
keyValue = 0;
keySetPoint = 0;
SetDisplayArray(0);
}
/******************************************************************************/
void InitOfSettingArea(unsigned long int setValue, unsigned int startBit, unsigned int setLen)
{
unsigned int I;
for(I = FUN_PROMPT1; I<=FUN_DECIMAL; I++) Dis1[I] = WORD_NULL;
modifyBit = startBit;
keyValue = 0;
keyFlag = FLASH_BIT;
setKeyBuffer = setValue;
ConvertHEXToBCDArray(setValue, &Dis1[startBit], setLen, HIGH_FIRST);
}
/******************************************************************************/
void InitOfSettingPrompt(const unsigned char *PromptF, const unsigned char *Prompt)
{
unsigned int I;
for(I = FUN_CODE_1; I <= FUN_CODE_4; I++) Dis1[I] = *PromptF++;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
Dis1[FUN_DECIMAL] = WORD_NULL;
setKeyBuffer = 0;
modifyBit = FUN_PROMPT1;
keyValue = 0;
keyFlag = FLASH_BIT;
}
/******************************************************************************/
void ReturnKeySetup(void)
{
menuIndex = STD_RETURN; // 长按键退出
keyFlag = DIS_PARA_INT;
keyValue = 0xff;
}
/******************************************************************************/
bool KeyValueOperation(unsigned int modifyFirstBit, unsigned int modifyLastBit)
{
switch(keyValue)
{
case LONG_M_KEY:
keyFlag = 0xff;
keyDealFlag = STD_RETURN; // 退出按键设置
// 菜单状态直接退出
// 参数设置直接跳至保存页面
parameterSetError = 0;
JudgeKeySetMax(modifyFirstBit, modifyLastBit);
JudgeKeySetMin(modifyFirstBit, modifyLastBit);
setKeyBuffer = (unsigned long int)ComputeSumOfFiveDigits(modifyFirstBit, modifyLastBit);
return 1;
case M_KEY:
modifyBit++;
keyValue = 0;
keyDealFlag = 0;
if((modifyBit <= modifyLastBit) && (modifyBit >= modifyFirstBit)) break;
parameterSetError = 0;
JudgeKeySetMax(modifyFirstBit, modifyLastBit);
JudgeKeySetMin(modifyFirstBit, modifyLastBit);
setKeyBuffer = (unsigned long int)ComputeSumOfFiveDigits(modifyFirstBit, modifyLastBit);
return 1;
case INC_KEY:
if(Dis1[modifyBit] >= 9) break;
Dis1[modifyBit]++;
break;
case DEC_KEY:
if(Dis1[modifyBit] == 0) break;
Dis1[modifyBit]--;
break;
default:
keyValue = 0;
return 0;
}
JudgeKeySetMax(modifyFirstBit, modifyBit);
JudgeKeySetMin(modifyFirstBit, modifyBit);
keyValue = 0;
return 0;
}
/******************************************************************************/
bool KeyValueOperateForPrompt(const unsigned char *Prompt)
{
unsigned int I;
switch(keyValue)
{
case LONG_M_KEY: keyDealFlag = STD_RETURN;
case M_KEY:
keyFlag = DIS_PARA_INT;
//setKeyType = 3;
return 1;
case INC_KEY:
Prompt += 5;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
setKeyBuffer = 1;
break;
case DEC_KEY:
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
setKeyBuffer = 0;
break;
}
keyValue = 0;
return 0;
}
/******************************************************************************/
void DisplaySetIndex(void)
{
if(keyFlag != DISPLAY_MENU) return;
setKeyType = 0;
switch(keyValue)
{
case LONG_M_KEY:
keyFlag = 0xff;
menuIndex = STD_RETURN; // 退出按键设置
break;
case M_KEY:
keyFlag = DIS_PARA_INT;
keyValue = 0;
break;
case DEC_KEY:
if(menuIndex > 1) menuIndex--;
else menuIndex = STD_KEY_QUIT;
break;
case INC_KEY:
menuIndex++;
if(menuIndex > STD_KEY_QUIT) menuIndex = 1;
break;
}
}
/******************************************************************************/
unsigned int SaveModifyValue(void)
{
if(keyFlag == DIS_PARA_INT)
{
modifyBit = FUN_PROMPT1;
keyFlag = FLASH_BIT;
SettingKeyPrompt(&SAVE_Prompt[0]);
}
switch(keyValue)
{
case LONG_M_KEY:
case M_KEY:
keyValue = 0;
if( Dis1[FUN_PROMPT1] == WORD_Y ) return SAVE;
return NO;
case INC_KEY:
case DEC_KEY:
if(Dis1[FUN_PROMPT1] == WORD_N)
{
Dis1[FUN_PROMPT1] = WORD_Y;
Dis1[FUN_PROMPT2] = WORD_E;
Dis1[FUN_PROMPT3] = WORD_S;
}
else
{
Dis1[FUN_PROMPT1] = WORD_N;
Dis1[FUN_PROMPT2] = WORD_O;
Dis1[FUN_PROMPT3] = WORD_NULL;
}
break;
default:
break;
}
keyValue = 0;
return NEXT;
}
/******************************************************************************/
void ExitKeyOperation(void)
{
if(keyFlag == DISPLAY_MENU)
{
SettingKeyPrompt(&QUIT_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingPrompt(&QUIT_Prompt[0], &YESNO_VALUE[0]);
setKeyBuffer = 0;
}
if(KeyValueOperateForPrompt(&YESNO_VALUE[0]))
{
keyValue = 0xFF;
if(setKeyBuffer == 1) menuIndex = STD_RETURN;
else keyFlag = DISPLAY_MENU;
}
}
/******************************************************************************/
void JudgeSaveAndReturn(unsigned long int judgeValue, unsigned int setGain)
{
setKeyBuffer *= (unsigned long int)setGain;
// 如果为退出标志,且参数未被修改直接退出
if(keyDealFlag == STD_RETURN)
{
if((parameterSetError != 0) || (setKeyBuffer == judgeValue))
{
ReturnKeySetup();
return;
}
}
else if(parameterSetError == 1)
{
setKeyType = 0;
keyFlag = DISPLAY_MENU;
return;
}
keyFlag = DIS_PARA_INT;
setKeyType = 1;
}
/******************************************************************************/
bool KeyPasswordInput(void)
{
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
modifyBit = FUN_PROMPT2;
keyFlag = FLASH_BIT;
ClearDisplay();
SettingKeyPrompt(&PassWord_Prompt[0]);
ConvertHEXToBCDArray((unsigned long int)9999, &setMax[0], 4, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)0, &setMin[0], 4, HIGH_FIRST);
}
keyFlag = FLASH_BIT;
if(KeyValueOperation(FUN_PROMPT2, FUN_PROMPT5))
{
PassWord = (unsigned int)setKeyBuffer;
return 1;
}
else return 0;
}
/******************************************************************************/
void JudgePasswordInput(unsigned int activePassword)
{
if(PassWord == activePassword)
{
setKeyType++;
keyFlag = DIS_PARA_INT;
return;
}
else if(!KeyPasswordInput()) return;
if(keyDealFlag == STD_RETURN)
{
keyFlag = 0xff;
menuIndex = STD_RETURN; // 退出按键设置
// 菜单状态直接退出
// 参数设置直接跳至保存页面
}
else if(PassWord == activePassword)
{
setKeyType++;
keyFlag = DIS_PARA_INT;
}
else
{
keyFlag = DISPLAY_MENU;
setKeyType = 0;
keyValue = 0xff;
}
}
/******************************************************************************/
bool ExitCurrentSetup(void)
{
unsigned int I;
I = SaveModifyValue();
keyValue = 0;
if(I == NEXT) return 0; // 继续选择是否保存?
PassWord = 0;
setKeyType = 0;
keyFlag = DISPLAY_MENU;
keyValue = 0xff;
if(keyDealFlag == STD_RETURN) menuIndex = STD_RETURN;
if(I != SAVE) return 0; // 执行保存或放弃保存操作,并返还菜单
return 1;
}
/******************************************************************************/
// 设置仪表系数
void ModifyMeterFactor(void)
{
if(setKeyType == 0)
{
// 键功能提示符
// F13 仪表系数 FACTR
if(keyFlag == DISPLAY_MENU)
{
SettingKeyPrompt(&FACTR_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT) // 键参数初始化
{
InitOfSettingArea((unsigned long int)MeterFactor, FUN_PROMPT1, 5); // 初始化参数设置区域
ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MAX, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MIN, &setMin[0], 5, HIGH_FIRST);
}
// 键值处理
if(KeyValueOperation(FUN_PROMPT1, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)MeterFactor, 1);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(MeterFactor == setKeyBuffer) return;
tempL.DWord = (unsigned long int)setKeyBuffer;
MeterFactor = WriteShortParameterToEEPROM(METER_FACTOR, METER_FACTOR_WIDTH);
}
/******************************************************************************/
//修改二次修正点数
void SelectDcoefNode(void)
{
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
modifyBit = FUN_PROMPT5;
keyValue = 0;
keySetPoint = 0;
keyFlag = FLASH_BIT;
//STD_KEY_CORR 14 // F14 二次修正系数 CORR
Dis1[FUN_CODE_1] = WORD_F;
Dis1[FUN_CODE_2] = 1;
Dis1[FUN_CODE_3] = 4;
Dis1[FUN_CODE_4] = WORD_NULL;
Dis1[FUN_PROMPT1] = WORD_C;
Dis1[FUN_PROMPT2] = WORD_O;
Dis1[FUN_PROMPT3] = WORD_R;
Dis1[FUN_PROMPT4] = WORD_LINE;
Dis1[FUN_PROMPT5] = setIndex+1;
Dis1[FUN_DECIMAL] = WORD_NULL;
setMax[0] = 9;
setMin[0] = 1;
//ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MAX, &setMax[0], 5, HIGH_FIRST);
//ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MIN, &setMin[0], 5, HIGH_FIRST);
}
if(KeyValueOperation(FUN_PROMPT5, FUN_PROMPT5))
{
if(keyDealFlag == STD_RETURN) ReturnKeySetup();
else
{
if(Dis1[FUN_PROMPT5] > dcoefNum)
{
//Dis1[FUN_PROMPT5] = dcoefNum;
setKeyType = 0;
keyValue = 0xff;
keyFlag = DISPLAY_MENU;
return;
}
setIndex = Dis1[FUN_PROMPT5]-1;
keyFlag = DIS_PARA_INT;
setKeyType++;
temp_dcoefNode[setIndex] = dcoefNode[setIndex];
temp_dcoefVal[setIndex] = dcoefVal[setIndex];
}
}
if(Dis1[FUN_PROMPT5] > dcoefNum)
{
//Dis1[FUN_PROMPT5] = dcoefNum;
setKeyType = 0;
keyValue = 0xff;
keyFlag = DISPLAY_MENU;
}
}
/******************************************************************************/
void ModifyDcoefNode(void)
{
//unsigned long int temp;
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
modifyBit = FUN_PROMPT2;
keyValue = 0;
keyFlag = FLASH_BIT;
Dis1[FUN_CODE_1] = WORD_P;
Dis1[FUN_CODE_2] = setIndex+1;
Dis1[FUN_CODE_3] = WORD_LINE;
Dis1[FUN_CODE_4] = WORD_LINE;
Dis1[FUN_PROMPT1] = WORD_NULL;
ConvertHEXToBCDArray(dcoefNode[setIndex]/100, &Dis1[FUN_PROMPT2], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)99999, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)0, &setMin[0], 5, HIGH_FIRST);
keySetPoint = 1;
}
//键值处理
if(KeyValueOperation(FUN_PROMPT2, FUN_DECIMAL))
{
temp_dcoefNode[setIndex] = setKeyBuffer * 100;
if(keyDealFlag == STD_RETURN) setKeyType = 5;
else setKeyType++;
keyFlag = DIS_PARA_INT;
}
keyValue = 0;
}
/******************************************************************************/
void ModifyDcoefVal(void)
{
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
modifyBit = FUN_PROMPT1;
keyValue = 0;
keyFlag = FLASH_BIT;
keySetPoint = 0;
Dis1[FUN_CODE_1] = WORD_P;
Dis1[FUN_CODE_2] = setIndex+1;
Dis1[FUN_CODE_3] = WORD_LINE;
Dis1[FUN_CODE_4] = WORD_LINE;
Dis1[FUN_PROMPT1] = WORD_NULL;
Dis1[FUN_DECIMAL] = WORD_NULL;
ConvertHEXToBCDArray(dcoefVal[setIndex], &Dis1[FUN_PROMPT1], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MAX, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)METER_PARAMETER_MIN, &setMin[0], 5, HIGH_FIRST);
}
//键值处理
if(KeyValueOperation(FUN_PROMPT1, FUN_PROMPT5))
{
temp_dcoefVal[setIndex] = (unsigned int)setKeyBuffer;
//if(menuIndex == STD_RETURN) setKeyType = 5;
if(keyDealFlag == STD_RETURN) setKeyType = 5;
else setKeyType++;
keyFlag = DIS_PARA_INT;
}
}
/******************************************************************************/
void ModifyDcoefNodeAndValue(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU)
{
//STD_KEY_CORR 14 // F14 二次修正系数 CORR
SettingKeyPrompt(&CORR_Prompt[0]);
setIndex = 0;
return;
}
else if(keyFlag == DIS_PARA_INT) setKeyType = 1;
}
if(setKeyType == 1) JudgePasswordInput(LEVEL_2_PASSWORD); //2222
if(setKeyType == 2) SelectDcoefNode();
if(setKeyType == 3) ModifyDcoefNode();
if(setKeyType == 4) ModifyDcoefVal();
//===========================================================================
// 保存设置参数
if(setKeyType != 5) return;
unsigned int keyState;
if(keyDealFlag == STD_RETURN)
{
if((dcoefNode[setIndex] == temp_dcoefNode[setIndex]) && (dcoefVal[setIndex] == temp_dcoefVal[setIndex]))
{
ReturnKeySetup();
return;
}
}
keyState = SaveModifyValue();
keyValue = 0;
if(keyState == NEXT) return; // 继续选择是否保存?
if(keyDealFlag == STD_RETURN) menuIndex = STD_RETURN; // 长按键退出
setKeyType = 2;
keyFlag = DIS_PARA_INT;
keyValue = 0xff;
if(keyState != SAVE) return; // 执行保存或放弃保存操作,并返还菜单
// 存储二次修正系数
dcoefNode[setIndex] = temp_dcoefNode[setIndex];
dcoefVal[setIndex] = temp_dcoefVal[setIndex];
StoreDevCoefNodeAndValue(setIndex);
// RetriveDevCoef();
}
/******************************************************************************/
void ModifyMaxFlowRate(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU) // 键功能提示符
{
// STD_KEY_ADDR 2 // F15 FS
SettingKeyPrompt(&FS_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingArea((unsigned long int)maxFlowRate/100, FUN_PROMPT2, 5); // 初始化参数设置区域
ConvertHEXToBCDArray((unsigned long int)99999, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)0, &setMin[0], 5, HIGH_FIRST);
display_data[ACC_POINT] |= (unsigned char)ACC_POINT_BIT;
}
// 键值处理
if(KeyValueOperation(FUN_PROMPT2, FUN_DECIMAL)) JudgeSaveAndReturn((unsigned long int)maxFlowRate, 100);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(maxFlowRate == setKeyBuffer) return;
tempDev.DWord[0] = (unsigned long int)setKeyBuffer;
maxFlowRate = WriteLongParameterToEEPROM(MAX_FLOW, MAX_FLOW_WIDTH);
}
/******************************************************************************/
void ModifyWorkDiameter(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU) // 键功能提示符
{
// F29 DIAM
SettingKeyPrompt(&DIAM_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingArea((unsigned long int)workDiameter, FUN_PROMPT2, 4); // 初始化参数设置区域
ConvertHEXToBCDArray((unsigned long int)1500, &setMax[0], 4, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)25, &setMin[0], 4, HIGH_FIRST);
}
// 键值处理
if(KeyValueOperation(FUN_PROMPT2, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)workDiameter, 1);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(workDiameter == setKeyBuffer) return;
tempL.DWord = (unsigned int)setKeyBuffer;
workDiameter = WriteShortParameterToEEPROM(WORK_DIAMETER, WORK_DIAMETER_WIDTH);
}
/******************************************************************************/
void ModifySamplingInterval(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU) // 键功能提示符
{
//F16 响应时间 RESPS
SettingKeyPrompt(&RESPS_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingArea((unsigned long int)factoryInterval, FUN_PROMPT5, 1); // 初始化参数设置区域
setMax[0] = SAMPLE_PERIOD_MAX;
setMin[0] = SAMPLE_PERIOD_MIN;
}
// 键值处理
if(KeyValueOperation(FUN_PROMPT5, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)factoryInterval, 1);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(factoryInterval == setKeyBuffer) return;
tempL.DWord = (unsigned int)setKeyBuffer;
factoryInterval = WriteShortParameterToEEPROM(SAMPLE_PERIOD, SAMPLE_PERIOD_WIDTH);
}
/*******************************************************************************
按键操作校准小传感器的燃气零点。
通过按键校准小传感器零点,操作者必须注意以下几个条件是否满足:
1、管道内气流静止
2、在气流静止的情况下流量计至少稳定工作1min
如以上条件任意一个不成立,有可能对校零的结果造成影响。
通过密码执行校零操作后,显示面板将显示校零操作前后的小传感器气体零点值,按下 SET按键后退出校零状态。
如操作者认为校零结果不满意,可重复执行此操作。
在退出菜单操作之前,如用户选择不存储修改值,则“键盘校零”操作结果无效。
*******************************************************************************/
void CalibrateOffsetC(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU)
{
//STD_KEY_OFFST 11 // F11 校准零点 OFFST
SettingKeyPrompt(&OFFST_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT) setKeyType++;
}
if(setKeyType == 1) JudgePasswordInput(LEVEL_3_PASSWORD); // 0520
if(setKeyType == 2)
{
if(keyFlag == DIS_PARA_INT)
{
modifyBit = FUN_PROMPT5;
keyValue = INC_KEY;
keyFlag = FLASH_BIT;
}
//键值处理
switch(keyValue)
{
case LONG_M_KEY:
if(offsetGas == setIndex)
{
keyValue = 0xff;
menuIndex = STD_RETURN;
return;
}
keyDealFlag = STD_RETURN;
case M_KEY:
keyValue = 0;
setKeyType++;
keyFlag = DIS_PARA_INT;
break;
case INC_KEY:
Dis1[FUN_CODE_1] = WORD_C;
Dis1[FUN_CODE_2] = WORD_U;
Dis1[FUN_CODE_3] = WORD_R;
Dis1[FUN_CODE_4] = WORD_NULL;
setKeyBuffer = voltageDetected[NIDX]; //ReadDataFromMovingAverage(NIDX);
ConvertHEXToBCDArray((unsigned long int)setKeyBuffer, &Dis1[FUN_PROMPT1], 5, HIGH_FIRST);
break;
case DEC_KEY:
Dis1[FUN_CODE_1] = WORD_O;
Dis1[FUN_CODE_2] = WORD_L;
Dis1[FUN_CODE_3] = WORD_D;
Dis1[FUN_CODE_4] = WORD_NULL;
ConvertHEXToBCDArray((unsigned long int)offsetGas, &Dis1[FUN_PROMPT1], 5, HIGH_FIRST);
break;
default: break;
}
keyValue = 0;
}
if(setKeyType != 3) return;
if(!ExitCurrentSetup()) return;
//if(offsetGas == (unsigned long int)setKeyBuffer)
tempL.DWord = (unsigned long int)setKeyBuffer;
offsetGas = WriteShortParameterToEEPROM(OFFSET_GAS, OFFSET_GAS_WIDTH);
#if(ENABLE_A_TYPE_FLOWRATE)
tempL.DWord = (unsigned long int)ReadDataFromMovingAverage(SDT);
offsetGasA = WriteShortParameterToEEPROM(OFFSET_A, OFFSET_A_WIDTH);
#endif
}
/*********************************************************************************/
//修改脉冲当量
void ModifyLPFactoryLiterPerPulse(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU)
{
// STD_KEY_PULSE 41 // F41 脉冲当量 PULSE
SettingKeyPrompt(&PULSE_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingArea((unsigned long int)factoryUnitPerPulse, FUN_PROMPT2, 5); // 初始化参数设置区域
ConvertHEXToBCDArray((unsigned long int)10000, &setMax[0], 5, HIGH_FIRST); // 参数最大值
ConvertHEXToBCDArray((unsigned long int)100, &setMin[0], 5, HIGH_FIRST); // 参数最小值
}
display_data[ACC_POINT] |= (unsigned char)ACC_POINT_BIT;
if(KeyValueOperation(FUN_PROMPT2, FUN_DECIMAL)) JudgeSaveAndReturn((unsigned long int)factoryUnitPerPulse, 1);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(factoryUnitPerPulse == (unsigned int)setKeyBuffer) return;
lastRemaining = 0;
tempL.DWord = (unsigned long int)setKeyBuffer;
factoryUnitPerPulse = WriteShortParameterToEEPROM(PULSE_UNIT, PULSE_UNIT_WIDTH);
}
/******************************************************************************/
void ModifyModBusAdr(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU) // 键功能提示符
{
// STD_KEY_ADDR 2 // F2 从机地址 ADDR
SettingKeyPrompt(&ADDR_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT)
{
InitOfSettingArea((unsigned long int)localAddress, FUN_PROMPT3, 3); // 初始化参数设置区域
ConvertHEXToBCDArray((unsigned long int)247, &setMax[0], 3, HIGH_FIRST); // 参数最大值
ConvertHEXToBCDArray((unsigned long int)1, &setMin[0], 3, HIGH_FIRST); // 参数最小值
}
// 键值处理
if(KeyValueOperation(FUN_PROMPT3, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)localAddress, 1);
}
//===========================================================================
// 保存设置参数
if(setKeyType != 1) return;
if(!ExitCurrentSetup()) return;
if(localAddress == (unsigned int)setKeyBuffer) return;
tempL.DWord = (unsigned long int)setKeyBuffer;
localAddress = WriteShortParameterToEEPROM(SLAVER_ADDR, SLAVER_ADDR_WIDTH);
}
/******************************************************************************/
//void ModifyDisplayMod(voiod)
//{
// if(setKeyType == 0)
// {
// if(keyFlag == DISPLAY_MENU) // 键功能提示符
// {
// // STD_KEY_ADDR 2 // F2 从机地址 ADDR
// SettingKeyPrompt(&DISMod_Prompt[0]);
// return;
// }
// else if(keyFlag == DIS_PARA_INT)
// {
// InitOfSettingArea((unsigned long int)SysLcd, FUN_PROMPT3, 3); // 初始化参数设置区域
// ConvertHEXToBCDArray((unsigned long int)247, &setMax[0], 3, HIGH_FIRST); // 参数最大值
// ConvertHEXToBCDArray((unsigned long int)1, &setMin[0], 3, HIGH_FIRST); // 参数最小值
// }
//
// // 键值处理
// if(KeyValueOperation(FUN_PROMPT3, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)localAddress, 1);
// }
//
// //===========================================================================
// // 保存设置参数
// if(setKeyType != 1) return;
// if(!ExitCurrentSetup()) return;
//
// if(localAddress == (unsigned int)setKeyBuffer) return;
// tempL.DWord = (unsigned long int)setKeyBuffer;
// localAddress = WriteShortParameterToEEPROM(SLAVER_ADDR, SLAVER_ADDR_WIDTH);
//}
/******************************************************************************/
void ModifyUartDecimalPoint(void)
{
// if(setKeyType == 0)
// {
// if(keyFlag == DISPLAY_MENU) // 键功能提示符
// {
// // STD_UART_Decimal 2 // F2 从机地址 ADDR
// SettingKeyPrompt(&DECI_Prompt[0]);
// return;
// }
// else if(keyFlag == DIS_PARA_INT)
// {
// modifyBit = FUN_PROMPT5;
// keyValue = 0;
// keyFlag = FLASH_BIT;
//
// setKeyBuffer = uartDecimalPoint;
// Dis1[FUN_PROMPT1] = WORD_NULL;
// Dis1[FUN_PROMPT2] = WORD_NULL;
// Dis1[FUN_PROMPT3] = WORD_NULL;
// Dis1[FUN_PROMPT4] = WORD_NULL;
// Dis1[FUN_PROMPT5] = (unsigned char)setKeyBuffer;
// Dis1[FUN_DECIMAL] = WORD_NULL;
// setMax[0] = 4;
// setMin[0] = 3;
// }
//
// if(KeyValueOperation(FUN_PROMPT5, FUN_PROMPT5)) JudgeSaveAndReturn((unsigned long int)uartDecimalPoint, 1);
// }
//
// //===========================================================================
// // 保存设置参数
// if(setKeyType != 1) return;
// if(!ExitCurrentSetup()) return;
//
// if(uartDecimalPoint == (unsigned int)setKeyBuffer) return;
// tempL.DWord = (unsigned long int)setKeyBuffer;
// uartDecimalPoint = WriteShortParameterToEEPROM(COM_DECIMAL_POINT, COM_DECIMAL_POINT_WIDTH);
}
/******************************************************************************/
void ResetDcoefNodeAndValue(void)
{
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU) // 键功能提示符
{
// F94 RS2ND
SettingKeyPrompt(&RS2ND_Prompt[0]);
return;
}
else if(keyFlag == DIS_PARA_INT) setKeyType = 1;
}
if(setKeyType == 1) JudgePasswordInput(LEVEL_2_PASSWORD); //2222
if(setKeyType == 2)
{
if(keyFlag == DIS_PARA_INT)
{
InitOfSettingPrompt(&RS2ND_Prompt[0], &RS2ND_VALUE[0]);
setKeyBuffer = 0;
}
if(KeyValueOperateForPrompt(&RS2ND_VALUE[0])) setKeyType = 3;
}
//===========================================================================
// 保存设置参数
if(setKeyType != 3) return;
if(!ExitCurrentSetup()) return;
if(setKeyBuffer == 0) return;
DefaultDevCoef();
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void KeyInputProcessing(void)
{
FlashBitForSetup();
ReadKeyValue();
while(keyValue != 0)
{
IDvalidTime = 0;
DisplaySetIndex();
switch(menuIndex)
{
case STD_INIT_PASSWORD: // input password
if(keyFlag == DIS_PARA_INT)
{
if(keyValue == SHIFT_KEY) { KeyReset(); return; }
if(keyValue == UPPER_KEY) { KeyReset(); return; }
}
if(!KeyPasswordInput()) break;
keyValue = 0xff;
keyFlag = DISPLAY_MENU;
if(PassWord != LEVEL_1_PASSWORD) menuIndex = STD_RETURN;
else menuIndex = STD_KEY_ADDR;
continue;
//=====================================================================
// 接口类F1-F9
//case STD_KEY_PRTCL // F1 通讯协议 PRTCL
case STD_KEY_ADDR: ModifyModBusAdr(); break; // F2 从机地址 ADDR
//case STD_KEY_BPS // F3 波特率 BPS
//=====================================================================
// 流量类F11-F30
case STD_KEY_OFFST: CalibrateOffsetC(); break; // F11 校准零点 OFFST (0520)
//-----------------------------------------------------------------------
// case STD_KEY_GCF: // F12 GCF GCF
case STD_KEY_FACTR: ModifyMeterFactor(); break; // F13 仪表系数 FACTR
case STD_KEY_CORR: ModifyDcoefNodeAndValue(); break; // F14 二次修正系数 CORR
//-----------------------------------------------------------------------
case STD_KEY_FS: ModifyMaxFlowRate(); break; // F15 量程设置 FS
case STD_KEY_RESPS: ModifySamplingInterval(); break; // F16 响应时间 RESPS
//case STD_KEY_CUT_F // F28 小流量切除 CUT-F
//=====================================================================
#if(ENABLE_PLUG_IN_FLOWRATE)
case STD_KEY_DIAM: ModifyWorkDiameter(); break; // F29 管径设置 DIAM
#endif
//=======================================================================
// 显示类F31-F40
//case STD_KEY_UNT_A // F31 累积流量单位 UNT-A
//case STD_KEY_UNT_F // F32 实时流量单位 UNT-F
//case STD_KEY_UNT_P // F33 压力单位 UNT-P
//case STD_KEY_DISP: ModifyDisplayMod(); break; // F39 显示模式 DISP
//=======================================================================
// 模拟接口类F31-F40
case STD_KEY_PULSE: ModifyLPFactoryLiterPerPulse(); break; // F41 脉冲当量 PULSE
//=======================================================================
// 报警类F41-F50
//case STD_KEY_ALM_H // F51 高流量报警 ALM-H
//case STD_KEY_ALM_L // F52 低流量报警 ALM-L
//case STD_KEY_ALM_A // F53 总量报警上限 ALM-A
//case STD_KEY_ALM_T // F54 时间报警 ALM-T
//=======================================================================
//case STD_KEY_LORA_ADDR: // F71 LORA本机地址 LR-ID
//case STD_KEY_LORA_ID: // F72 LORA上级地址 NETID
//case STD_KEY_LORA_CHAN: // F73 LORA信道 LR_CH
//=======================================================================
// 操作类F91-F98
//case STD_KEY_PASS // F91 设置密码 PASS
//case STD_KEY_CLR_A // F92 清除总流量 CLR-A
//case STD_KEY_CLR_T // F93 清除时间 CLR-T
case STD_KEY_RESET_DCOEF: ResetDcoefNodeAndValue(); break; // F94 恢复二次修正 RS2ND
//=======================================================================
// 退出
case STD_KEY_QUIT: ExitKeyOperation(); break; // F99 退出设置 QUIT
case STD_RETURN:
KeyReset();
DisableKeyInterrupt();
NumericPrepForOutputAndDisplay();
return;
default: continue;
}
DisplayForKeyOperation();
}
}
//##############################################################################
#endif
//##############################################################################