Files
CHJ/user/Interface/StdKeyEdit.c
2026-03-20 21:19:04 +08:00

1743 lines
58 KiB
C
Raw Permalink 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"
//##############################################################################
#ifndef ENABLE_KEY_FUNCTION
#pragma message("[undefined] ENABLE_KEY_FUNCTION")
#elif(ENABLE_KEY_FUNCTION)
//##############################################################################
//==============================================================================
unsigned int keyDealFlag;
bool keySetPoint; // 键响应程序进入标志
unsigned int timerTar;
unsigned int keyFlag, menuIndex; // 键处理标志及菜单索引
unsigned int setKeyType, setIndex; // 二级菜单处理嵌套
unsigned long int PassWord; // 密码
unsigned int keyValue, keyBuff, funKeyTime, decKeyTime, incKeyTime, keyEffectiveTime; // 键值判断
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;
struct KeyGroup{
const unsigned char *Prompt; // 提示符
unsigned long int Value; // 设置参数
unsigned int Gain;
unsigned long int Max; // 设置参数最大值
unsigned long int Min; // 设置参数最小值
unsigned int Addr;
unsigned int Width;
unsigned long int Password;
unsigned int Type;
};
struct KeyGroup KeyStruct;
/*******************************************************************************
* line 1: Key function code (4byte)
* line 2: Key function prompt (5byte)
* line 3: Optional key value byte number
* line 4: Optional key value 1 (5byte)
* line 5: Optional key value 2 (5byte)
*
*******************************************************************************/
const unsigned char PRTCL_Prompt[]={ // F1 通讯协议 PRTCL
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
//------------------------------------------------------------------------------
// 0-4800 1-9600 2-19200 3-38400 4-57600 5-115200
const unsigned char BPS_Prompt[]={ // F3 波特率 BPS
WORD_F, 3, WORD_NULL, WORD_NULL,
WORD_B, WORD_P, WORD_S, WORD_NULL, WORD_NULL,
WORD_NULL, WORD_4, WORD_8, WORD_0, WORD_0,
WORD_NULL, WORD_9, WORD_6, WORD_0, WORD_0,
WORD_1, WORD_9, WORD_2, WORD_0, WORD_0,
WORD_3, WORD_8, WORD_4, WORD_0, WORD_0,
WORD_5, WORD_7, WORD_6, WORD_0, WORD_0
};
//------------------------------------------------------------------------------
// 流量类F11-F30
const unsigned char OFFST_Prompt[]={
WORD_F, 1, 1, WORD_NULL, // F11 校准零点 OFFST
WORD_O, WORD_F, WORD_F, WORD_S, WORD_T,
WORD_S, WORD_E, WORD_T, WORD_NULL, WORD_NULL
}; // Prompt 提示符
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[]={ // F16 响应时间 RESPS
WORD_F, 1, 6, WORD_NULL,
WORD_R, WORD_E, WORD_S, WORD_P, WORD_S,
// WORD_NULL, WORD_NULL, WORD_1, WORD_2, WORD_5,
// WORD_NULL, WORD_NULL, WORD_2, WORD_5, WORD_0,
// WORD_NULL, WORD_NULL, WORD_5, WORD_0, WORD_0,
// WORD_NULL, WORD_1, WORD_0, WORD_0, WORD_0,
// WORD_NULL, WORD_2, WORD_0, WORD_0, WORD_0,
// WORD_NULL, WORD_4, WORD_0, WORD_0, WORD_0 };
WORD_NULL, WORD_NULL, WORD_1, WORD_2, WORD_5,
WORD_NULL, WORD_NULL, WORD_2, WORD_5, WORD_0,
WORD_NULL, WORD_NULL, WORD_5, WORD_0, WORD_0,
WORD_NULL, WORD_1, WORD_0, WORD_0, WORD_0,
WORD_NULL, WORD_2, WORD_0, WORD_0, WORD_0,
WORD_NULL, WORD_4, WORD_0, WORD_0, WORD_0 };
//------------------------------------------------------------------------------
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
// for acc
const unsigned char UNTA_Prompt[]={ // F31 累积流量单位 UNT-A
WORD_F, 3, 1, WORD_NULL,
WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_A,
WORD_M, WORD_L, WORD_NULL, WORD_NULL, WORD_NULL, // ML
WORD_S, WORD_L, WORD_NULL, WORD_NULL, WORD_NULL, // SL
WORD_M, WORD_3, WORD_NULL, WORD_NULL, WORD_NULL, // NM3
WORD_S, WORD_C, WORD_F, WORD_NULL, WORD_NULL, // SCF
WORD_K, WORD_G, WORD_NULL, WORD_NULL, WORD_NULL // KG
};
const unsigned char UNTF_Prompt[]={ // F32 实时流量单位 UNT-F
WORD_F, 3, 2, WORD_NULL,
WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_F,
WORD_S, WORD_C, WORD_C, WORD_M, WORD_NULL, // SCCM
WORD_S, WORD_L, WORD_P, WORD_M, WORD_NULL, // SLPM
WORD_M, WORD_3, WORD_P, WORD_H, WORD_NULL, // NM3/H,M3PH
WORD_S, WORD_C, WORD_F, WORD_M, WORD_NULL, // SCFM
WORD_K, WORD_G, WORD_H, WORD_NULL, WORD_NULL, // KGH
WORD_S, WORD_C, WORD_F, WORD_H, WORD_NULL, // SCFH
};
const unsigned char UNTP_Prompt[]={
WORD_F, 3, 3, WORD_NULL,
WORD_U, WORD_N, WORD_T, WORD_LINE, WORD_P }; // F33 压力单位 UNT-P
#define KEY_DISP_LIST_ALL 0
#define KEY_DISP_LIST_ACC 1
#define KEY_DISP_LIST_PRESS 2
const unsigned char DISP_Prompt[]={ // F38 显示模式 DISP
WORD_F, 3, 8, WORD_NULL,
WORD_D, WORD_I, WORD_S, WORD_P, WORD_NULL,
WORD_C, WORD_Y, WORD_C, WORD_L, WORD_E, // CYCLE
WORD_F, WORD_I, WORD_X, WORD_E, WORD_D, // FIXED
};
//------------------------------------------------------------------------------
const unsigned char LANG_Prompt[]={ // F39 显示语言模式 LANG
WORD_F, 3, 9, WORD_NULL,
WORD_L, WORD_A, WORD_N, WORD_G, WORD_NULL,
WORD_NULL, WORD_NULL, WORD_C, WORD_H, WORD_N, // CHN
WORD_NULL, WORD_NULL, WORD_E, WORD_N, WORD_G, // ENG
WORD_NULL, WORD_NULL, WORD_A, WORD_L, WORD_L, // ALL
};
//------------------------------------------------------------------------------
// 模拟接口类F31-F40
const unsigned char PULSE_Prompt[]={ // F41 脉冲当量 PULSE
WORD_F, 4, 1, WORD_NULL,
WORD_P, WORD_U, WORD_L, WORD_S, WORD_E,
//for MF52 M56 MF5000
WORD_NULL, WORD_1, WORD_0, WORD_LINE, WORD_4, // 0.0001L, -0
WORD_NULL, WORD_1, WORD_0, WORD_LINE, WORD_3, // 0.001L, -1
WORD_NULL, WORD_1, WORD_0, WORD_LINE, WORD_2, // 0.01L, -2
WORD_NULL, WORD_1, WORD_0, WORD_LINE, WORD_1, // 0.1L, -3
WORD_NULL, WORD_NULL, WORD_NULL, WORD_NULL, WORD_1, // 1L -4
WORD_NULL, WORD_NULL, WORD_NULL, WORD_1, WORD_0, // 10L -5
WORD_NULL, WORD_NULL, WORD_1, WORD_0, WORD_0, // 100L -6
WORD_NULL, WORD_1, WORD_0, WORD_0, WORD_0, // 1000L -7
};
//------------------------------------------------------------------------------
// 报警类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[]={ // F92 清除总流量 CLR-A
WORD_F, 9, 2, WORD_NULL,
WORD_C, WORD_L, WORD_R, WORD_LINE, WORD_A,
WORD_C, WORD_L, WORD_R, WORD_NULL,
};
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[]={ // F94 恢复二次修正 RS2ND
WORD_F, 9, 4, WORD_NULL,
WORD_R, WORD_S, WORD_2, WORD_N, WORD_D,
WORD_R, WORD_S, WORD_T, WORD_NULL,
};
//------------------------------------------------------------------------------
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_0, 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 charRS2ND_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)
{
HWState.KeyPressed = 1;
systemProcessing |= KEY_HANDLE;
LPM1_EXIT;
}
}
/******************************************************************************/
void KeyReturn(void)
{
keyFlag = DIS_SET_OFF;
keyBuff = 0;
HWState.KeyPressed = 0;
keyValue = 0;
menuIndex = 0;
}
/******************************************************************************/
void KeyReset(void)
{
KEY_INPUT();
//keyFlag = DIS_PARA_INT;
keyFlag = DIS_SET_OFF;
HWState.KeyPressed = 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;
// else display_data[I] = 0;
// //LcdWriteDisplayFirst();
// LcdWriteDisplay();
unsigned char tempT, I;
keyFlashTime++;
if(keyFlag != FLASH_BIT) return;
if(keyFlashTime < FLASH_500mS) return;
keyFlashTime = 0;
I = DisOffset[modifyBit];
tempT = display_data[I];
tempT &= ~BIT0;
if(tempT == 0) display_data[I] |= CodeACC[Dis1[modifyBit]];
else display_data[I] = 0;
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;
// }
//}
/******************************************************************************/
bool ReadFunKey(void)
{
KEY_PULLUP();
KEY_INPUT();
SET_KEY();
if((KEY_IN & M_KEY) == M_KEY) return 1;
else return 0;
}
/******************************************************************************/
bool ReadDecKey(void)
{
KEY_PULLUP();
KEY_INPUT();
SET_KEY();
if((KEY_IN & DEC_KEY) == DEC_KEY) return 1;
else return 0;
}
/******************************************************************************/
bool ReadIncKey(void)
{
KEY_PULLUP();
KEY_INPUT();
SET_KEY();
if((KEY_IN & INC_KEY) == INC_KEY) return 1;
else return 0;
}
/******************************************************************************/
void ReadKeyValue(void)
{
unsigned int keyInput = 0;
//============================================================================
if(!ReadFunKey())
{
keyInput |= M_KEY;
funKeyTime++;
if(funKeyTime >= KEY_MAX_TIME) funKeyTime = KEY_MAX_TIME;
}
if(!ReadDecKey())
{
keyInput |= DEC_KEY;
decKeyTime++;
if(decKeyTime >= KEY_MAX_TIME) decKeyTime = KEY_MAX_TIME;
}
if(!ReadIncKey())
{
keyInput |= INC_KEY;
incKeyTime++;
if(incKeyTime >= KEY_MAX_TIME) incKeyTime = KEY_MAX_TIME;
}
//============================================================================
switch(keyInput)
{
case 0:
keyBuff = 0;
if((funKeyTime > KEY_RESPONSE_TIME) && (funKeyTime < KEY_MAX_TIME)) keyBuff |= M_KEY;
if((decKeyTime > KEY_RESPONSE_TIME) && (decKeyTime < KEY_MAX_TIME)) keyBuff |= DEC_KEY;
if((incKeyTime > KEY_RESPONSE_TIME) && (incKeyTime < KEY_MAX_TIME)) keyBuff |= INC_KEY;
keyValue = 0;
// 判断按键时间及键值判断
switch(keyBuff)
{
case M_KEY: // 判断按键时间及键值判断
if(funKeyTime < LONG_KEY_TIME) keyValue = M_KEY;
else keyValue = LONG_M_KEY;
break;
case INC_KEY: keyValue = INC_KEY; break;
case DEC_KEY: keyValue = DEC_KEY; break;
default:
keyValue = 0;
if(keyFlag == DIS_SET_OFF) KeyReset();
break;
}
keyBuff = 0;
funKeyTime = 0;
decKeyTime = 0;
incKeyTime = 0;
break;
case M_KEY:
if(funKeyTime == KEY_MAX_TIME) return;
if(funKeyTime < LONG_KEY_TIME) return;
keyValue = LONG_M_KEY;
funKeyTime = KEY_MAX_TIME;
break;
case DEC_KEY:
if(keyFlag != DIS_SET_OFF) return;
if(decKeyTime == KEY_MAX_TIME) return;
if(decKeyTime < LONG_KEY_TIME) return;
keyValue = LONG_DEC_KEY;
decKeyTime = KEY_MAX_TIME;
break;
case INC_KEY:
if(keyFlag != DIS_SET_OFF) return;
if(incKeyTime == KEY_MAX_TIME) return;
if(incKeyTime < LONG_KEY_TIME) return;
keyValue = LONG_INC_KEY;
incKeyTime = KEY_MAX_TIME;
break;
case COMBO_KEY:
if(incKeyTime == KEY_MAX_TIME) return;
else if(decKeyTime == KEY_MAX_TIME) return;
if(incKeyTime < LONG_KEY_TIME) return;
if(decKeyTime < LONG_KEY_TIME) return;
if(keyFlag != DIS_SET_OFF) return;
keyValue = COMBO_KEY;
incKeyTime = KEY_MAX_TIME;
decKeyTime = KEY_MAX_TIME;
break;
}
}
/******************************************************************************/
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) Dis1[modifyBit] = 0;
else Dis1[modifyBit]++;
break;
case DEC_KEY:
if(Dis1[modifyBit] == 0) Dis1[modifyBit] = 9;
else 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 selectMax, unsigned int selectMin)
{
unsigned int I;
//selectMax--;
switch(keyValue)
{
case LONG_M_KEY: keyDealFlag = STD_RETURN;
case M_KEY:
keyFlag = DIS_PARA_INT;
return 1;
case INC_KEY:
if(setKeyBuffer < (unsigned long int)selectMax) setKeyBuffer++;
else setKeyBuffer = (unsigned long int)selectMin;
Prompt += setKeyBuffer*5;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
break;
case DEC_KEY:
if(setKeyBuffer > selectMin) setKeyBuffer--;
else setKeyBuffer = selectMax;
Prompt += setKeyBuffer*5;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
break;
}
keyValue = 0;
return 0;
}
/******************************************************************************/
bool KeyValueOperateForArray(unsigned char *Prompt, unsigned int selectMax)
{
unsigned int I;
selectMax--;
switch(keyValue)
{
case LONG_M_KEY: keyDealFlag = STD_RETURN;
case M_KEY:
keyFlag = DIS_PARA_INT;
return 1;
case INC_KEY:
if(setKeyBuffer < (unsigned long int)selectMax) setKeyBuffer++;
else setKeyBuffer = 0;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
break;
case DEC_KEY:
if(setKeyBuffer > 0) setKeyBuffer--;
else setKeyBuffer = (unsigned long int)selectMax;
for(I = FUN_PROMPT1; I <= FUN_PROMPT5; I++) Dis1[I] = *Prompt++;
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;
keyFlag = NO_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, YESNO_VALUE);
setKeyBuffer = 0;
}
if(KeyValueOperateForPrompt(YESNO_VALUE, 1, 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 = 3;
}
/******************************************************************************/
bool KeyPasswordInput(void)
{
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
modifyBit = FUN_PROMPT1;
keyFlag = FLASH_BIT;
ClearDisplay();
SettingKeyPrompt(&PassWord_Prompt[0]);
ConvertHEXToBCDArray((unsigned long int)99999, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)0, &setMin[0], 5, HIGH_FIRST);
}
keyFlag = FLASH_BIT;
if(KeyValueOperation(FUN_PROMPT1, FUN_PROMPT5))
{
PassWord = (unsigned long int)setKeyBuffer;
return 1;
}
else return 0;
}
/******************************************************************************/
void JudgePasswordInput(unsigned long 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;
}
/******************************************************************************/
// 设置仪表系数
bool ParameterSetup(void)
{
// display key function code
if(setKeyType == 0)
{
if(keyFlag == DISPLAY_MENU)
{
SettingKeyPrompt(KeyStruct.Prompt);
setKeyBuffer = 0;
return 0;
}
else if(keyFlag == DIS_PARA_INT) setKeyType = 1;
}
// display password
if(setKeyType == 1)
{
if((KeyStruct.Type & NEED_PASSWORD) == NEED_PASSWORD) JudgePasswordInput(KeyStruct.Password);
else setKeyType = 2;
}
// setup key value
if(setKeyType == 2)
{
//列表参数初始化
if((KeyStruct.Type & PARM_LIST_SEL) == PARM_LIST_SEL)
{
if(keyFlag == DIS_PARA_INT)
{
InitOfSettingPrompt(KeyStruct.Prompt, KeyStruct.Prompt+LIST_VALUE_BASE + KeyStruct.Value*5);
keyFlag = NO_FLASH_BIT;
setKeyBuffer = KeyStruct.Value;
}
else if(KeyValueOperateForPrompt(KeyStruct.Prompt+LIST_VALUE_BASE, KeyStruct.Max, KeyStruct.Min)) setKeyType = 3;
}
// 操作类设置
else if((KeyStruct.Type & OPERATION_CLASS) == OPERATION_CLASS)
{
if(keyFlag == DIS_PARA_INT)
{
InitOfSettingPrompt(KeyStruct.Prompt + LIST_PROMPT_BASE, YESNO_VALUE + KeyStruct.Value*5);
keyFlag = NO_FLASH_BIT;
setKeyBuffer = KeyStruct.Value;
}
else if(KeyValueOperateForPrompt(YESNO_VALUE, KeyStruct.Max, KeyStruct.Min))
{
KeyStruct.Value = setKeyBuffer;
PassWord = 0;
setKeyType = 0;
keyFlag = DISPLAY_MENU;
keyValue = 0xff;
if(keyDealFlag == STD_RETURN) ReturnKeySetup();
return 1;
}
}
// 参数可任意设置类
else
{
unsigned int startPrompt;
startPrompt = FUN_PROMPT5 - (KeyStruct.Type & 0x000f) + 1;
if(keyFlag == DIS_PARA_INT)
{
ConvertHEXToBCDArray(KeyStruct.Max, &setMax[0], KeyStruct.Type, HIGH_FIRST);
ConvertHEXToBCDArray(KeyStruct.Min, &setMin[0], KeyStruct.Type, HIGH_FIRST);
InitOfSettingArea(KeyStruct.Value/KeyStruct.Gain, startPrompt, KeyStruct.Type); // 初始化参数设置区域
}
else if(KeyValueOperation(startPrompt, FUN_PROMPT5)) JudgeSaveAndReturn(KeyStruct.Value, KeyStruct.Gain);
}
}
//===========================================================================
// 保存设置参数
if(setKeyType != 3) return 0;
if(!ExitCurrentSetup()) return 0;
KeyStruct.Value = setKeyBuffer;
if((KeyStruct.Type & NO_SAVE) == NO_SAVE) return 1;
tempDev.DWord[0] = (unsigned long int)setKeyBuffer;
KeyStruct.Value = WriteLongParameterToEEPROM(KeyStruct.Addr, KeyStruct.Width);
return 1;
}
/******************************************************************************/
//修改二次修正点数
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 inttemp;
if(keyFlag == DIS_PARA_INT)
{
SetDisplayArray(0);
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_F;
//键值处理
#ifndef ENABLE_LED_DISPLAY
#pragma message("[undefined] ENABLE_LED_DISPLAY")
#elif(ENABLE_LED_DISPLAY)
modifyBit = FUN_PROMPT1;
ConvertHEXToBCDArray(dcoefNode[setIndex]/100, &Dis1[FUN_PROMPT1], 5, HIGH_FIRST);
#else
Dis1[FUN_PROMPT1] = WORD_NULL;
modifyBit = FUN_PROMPT2;
ConvertHEXToBCDArray(dcoefNode[setIndex]/100, &Dis1[FUN_PROMPT2], 5, HIGH_FIRST);
#endif
ConvertHEXToBCDArray((unsigned long int)99999, &setMax[0], 5, HIGH_FIRST);
ConvertHEXToBCDArray((unsigned long int)0, &setMin[0], 5, HIGH_FIRST);
keySetPoint = 1;
}
//键值处理
#ifndef ENABLE_LED_DISPLAY
#pragma message("[undefined] ENABLE_LED_DISPLAY")
#elif(ENABLE_LED_DISPLAY)
if(KeyValueOperation(FUN_PROMPT1, FUN_PROMPT5))
#else
if(KeyValueOperation(FUN_PROMPT2, FUN_DECIMAL))
#endif
{
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_V;
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 KeyInputProcessing(void)
{
FlashBitForSetup();
ReadKeyValue();
while(keyValue != 0)
{
IDvalidTime = 0;
DisplaySetIndex();
switch(menuIndex)
{
case STD_INIT_PASSWORD: // input password
if(keyFlag == DIS_SET_OFF)
{
switch(keyValue)
{
case LONG_M_KEY: keyFlag = DIS_PARA_INT; break;
//====================================================================
#ifndef ENABLE_ALTERNATE_DISPLAY
#pragma message("[undefined] ENABLE_ALTERNATE_DISPLAY")
#elif(ENABLE_ALTERNATE_DISPLAY)
case M_KEY:
displayNow++;
displayCNT = 0;
if(displayNow > (unsigned int)DISPLAY_MAX) displayNow = 0;
if(displayType == (u8)DISPLAY_FIXED)
{
tempDev.DWord[0] = (unsigned long int)displayNow;
displayNow = (u8)WriteParameterToEEPROM(DIS_MOD, DIS_MOD_WIDTH);
}
menuIndex = STD_RETURN;
continue;
#endif
//====================================================================
#ifndef ENABLE_LEAK_DETECT
#pragma message("[undefined] ENABLE_LEAK_DETECT")
#elif(ENABLE_LEAK_DETECT)
case LONG_INC_KEY:
keyValue = 0;
alarmState1 &= ~LEAK_ALARM;
alarmState1 &= ~VALVE_OFF_ALARM; // TURN ON
leakDetectCounter = 0;
DisplayValveState();
IDvalidTime = COUNTDOWN_3S;
return;
case LONG_DEC_KEY:
keyValue = 0;
alarmState1 &= ~LEAK_ALARM;
alarmState1 |= VALVE_OFF_ALARM; // TURN OFF
leakDetectCounter = 0;
DisplayValveState();
IDvalidTime = COUNTDOWN_3S;
return;
#endif
//====================================================================
#ifndef ENABLE_KEY_FOR_FAST_OFFSET
#pragma message("[undefined] ENABLE_KEY_FOR_FAST_OFFSET")
#elif(ENABLE_KEY_FOR_FAST_OFFSET)
case COMBO_KEY:
keyValue = 0;
if(flowRate > (maxFlowRate>>4)) continue;
tempDev.Word[0] = (unsigned int)voltageDetected[NIDX];
offsetGas = (unsigned int)WriteLongParameterToEEPROM(OFFSET_GAS, OFFSET_GAS_WIDTH);
FullScreenFlashing();
IDvalidTime = COUNTDOWN_3S;
return;
#endif
//===================================================================
default:
KeyReturn();
return;
}
}
if(!KeyPasswordInput()) break;
keyValue = 0xff;
keyFlag = DISPLAY_MENU;
if((PassWord != LEVEL_1_PASSWORD) && (PassWord != keyPassWord)) menuIndex = STD_RETURN;
else menuIndex = STD_KEY_ADDR;
continue;
//=====================================================================
// 接口类F1-F9
//case STD_KEY_PRTCL // F1 通讯协议 PRTCL
case STD_KEY_ADDR: // F2 从机地址 ADDR
KeyStruct.Prompt = ADDR_Prompt;
KeyStruct.Value = (unsigned long int)localAddress;
KeyStruct.Type = 3;
KeyStruct.Gain = 1;
KeyStruct.Max = (unsigned long int)SLAVER_ADDR_MAX;
KeyStruct.Min = (unsigned long int)SLAVER_ADDR_MIN;
KeyStruct.Addr = (unsigned int)SLAVER_ADDR;
KeyStruct.Width = (unsigned int)SLAVER_ADDR_WIDTH;
ParameterSetup();
localAddress = (unsigned int)KeyStruct.Value;
break;
//=====================================================================
#ifndef ENABLE_KEY_FOR_BPS
#pragma message("[undefined] ENABLE_KEY_FOR_BPS")
#elif(ENABLE_KEY_FOR_BPS)
case STD_KEY_BPS: // F3 波特率 BPS
KeyStruct.Prompt = BPS_Prompt;
KeyStruct.Value = (unsigned long int)baudRate;
KeyStruct.Max = 4;
KeyStruct.Min = 0;
KeyStruct.Type = PARM_LIST_SEL;
KeyStruct.Addr = (unsigned int)BAUD_RATE;
KeyStruct.Width = (unsigned int)BAUD_RATE_WIDTH;
ParameterSetup();
if(baudRate != (unsigned int)KeyStruct.Value)
{
baudRate = (unsigned int)KeyStruct.Value;
RS485UartInit(BPS[baudRate]);
}
break;
#endif
//=====================================================================
// 流量类F11-F30
#ifndef ENABLE_KEY_FOR_OFFSET
#pragma message("[undefined] ENABLE_KEY_FOR_OFFSET")
#elif(ENABLE_KEY_FOR_OFFSET)
case STD_KEY_OFFST: //CalibrateOffsetC(); break; // F11 校准零点 OFFST (0520)
KeyStruct.Prompt = OFFST_Prompt;
KeyStruct.Value = NO;
KeyStruct.Max = YES;
KeyStruct.Min = NO;
#if(ENABLE_KEY_FOR_OFFSET_NEED_PASSWORD)
KeyStruct.Password = 520;
KeyStruct.Type = OPERATION_CLASS | NO_SAVE | NEED_PASSWORD;
#else
KeyStruct.Type = OPERATION_CLASS | NO_SAVE;
#endif
ParameterSetup();
if(KeyStruct.Value == YES)
{
tempDev.Word[0] = (unsigned int)voltageDetected[NIDX];
offsetGas = (unsigned int)WriteLongParameterToEEPROM(OFFSET_GAS, OFFSET_GAS_WIDTH);
}
break;
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_GCF
#pragma message("[undefined] ENABLE_KEY_FOR_GCF")
#elif(ENABLE_KEY_FOR_GCF)
case STD_KEY_GCF: // F12 GCF GCF
KeyStruct.Prompt = GCF_Prompt;
KeyStruct.Value = (unsigned long int)GDCFactor;
KeyStruct.Type = 4;
KeyStruct.Gain = 1;
KeyStruct.Max = (unsigned int)GCF_PARAMETER_MAX;
KeyStruct.Min = (unsigned int)GCF_PARAMETER_MIN;
KeyStruct.Addr = (unsigned int)GCF_B;
KeyStruct.Width = (unsigned int)GCF_B_WIDTH;
ParameterSetup();
GDCFactor = (unsigned int)KeyStruct.Value;
break;
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_METERFACTOR
#pragma message("[undefined] ENABLE_KEY_FOR_METERFACTOR")
#elif(ENABLE_KEY_FOR_METERFACTOR)
case STD_KEY_FACTR: // F13 仪表系数 FACTR
KeyStruct.Prompt = FACTR_Prompt;
KeyStruct.Value = (unsigned long int)MeterFactor;
KeyStruct.Type = 5;
KeyStruct.Gain = 1;
KeyStruct.Max = (unsigned int)METER_PARAMETER_MAX;
KeyStruct.Min = (unsigned int)METER_PARAMETER_MIN;
KeyStruct.Addr = (unsigned int)METER_FACTOR;
KeyStruct.Width = (unsigned int)METER_FACTOR_WIDTH;
ParameterSetup();
MeterFactor = (unsigned int)KeyStruct.Value;
break;
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_DCOEF
#pragma message("[undefined] ENABLE_KEY_FOR_DCOEF")
#elif(ENABLE_KEY_FOR_DCOEF)
case STD_KEY_CORR: ModifyDcoefNodeAndValue(); break; // F14 二次修正系数 CORR
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_MAXFLOWRATE
#pragma message("[undefined] ENABLE_KEY_FOR_MAXFLOWRATE")
#elif(ENABLE_KEY_FOR_MAXFLOWRATE)
case STD_KEY_FS: // F15 量程设置 FS
KeyStruct.Prompt = FS_Prompt;
KeyStruct.Value = maxFlowRate;
KeyStruct.Type = 5;
KeyStruct.Gain = 1000;
KeyStruct.Max = 99999;
KeyStruct.Min = 0;
KeyStruct.Addr = MAX_FLOW;
KeyStruct.Width = MAX_FLOW_WIDTH;
ParameterSetup();
maxFlowRate = KeyStruct.Value;
break;
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_RESPONSE
#pragma message("[undefined] ENABLE_KEY_FOR_RESPONSE")
#elif(ENABLE_KEY_FOR_RESPONSE)
case STD_KEY_RESPS: // F16 响应时间 RESPS
KeyStruct.Prompt = RESPS_Prompt;
KeyStruct.Value = responseTimeIndex; //factoryInterval; SetupResponseTime(responseTime)
KeyStruct.Type = PARM_LIST_SEL;
KeyStruct.Max = 5;
KeyStruct.Min = 0;
KeyStruct.Addr = SAMPLE_PERIOD;
KeyStruct.Width = SAMPLE_PERIOD_WIDTH;
ParameterSetup();
//factoryInterval = KeyStruct.Value;
//responseTime = Timing[KeyStruct.Value];
responseTimeIndex = KeyStruct.Value;
responseTime = SetupResponseTime(responseTimeIndex, RESPONSE_TIME_DEFAULT);
break;
#endif
//=====================================================================
//case STD_KEY_CUT_F // F28 小流量切除 CUT-F
//=====================================================================
#if(ENABLE_KEY_FOR_PLUG_IN_FLOWRATE)
case STD_KEY_DIAM: // F29 管径设置 DIAM
KeyStruct.Prompt = DIAM_Prompt;
KeyStruct.Value = workDiameter;
KeyStruct.Type = 5;
KeyStruct.Gain = 1;
KeyStruct.Max = 5000;
KeyStruct.Min = 25;
KeyStruct.Addr = WORK_DIAMETER;
KeyStruct.Width = WORK_DIAMETER_WIDTH;
ParameterSetup();
workDiameter = KeyStruct.Value;
break;
#endif
//=======================================================================
// 显示类F31-F40
#ifndef ENABLE_KEY_FOR_ACC_UNIT
#pragma message("[undefined] ENABLE_KEY_FOR_ACC_UNIT")
#elif(ENABLE_KEY_FOR_ACC_UNIT)
case STD_KEY_UNT_A: // F31 累积流量单位 UNT-A
KeyStruct.Prompt = UNTA_Prompt;
KeyStruct.Value = (unsigned long int)AccDisUnit;
KeyStruct.Max = KG;
KeyStruct.Min = ML;
KeyStruct.Type = PARM_LIST_SEL | NO_SAVE;
// if(ParameterSetup())
// {
// AccUnit = (unsigned int)KeyStruct.Value;
// CombinedUnit();
// tempDev.Word[0] = (unsigned int)flowUnit;
// flowUnit = (unsigned int)WriteParameterToEEPROM(WORK_UNIT, WORK_UNIT_WIDTH);
// JudgeFlowRateUnit(flowUnit);
// }
if(ParameterSetup())
{
AccDisUnit = (u16)KeyStruct.Value;
CombinedUnitByACC();
ConvertAllFlowRateAndSave(flowUnit);
break;
}
if(setKeyType != 2) break;
if(JudgeflowAccUnit(setKeyBuffer)) break;
keyValue = keyLastValue;
continue;
break;
#endif
//=======================================================================
#ifndef ENABLE_KEY_FOR_FLOWRATE_UNIT
#pragma message("[undefined] ENABLE_KEY_FOR_FLOWRATE_UNIT")
#elif(ENABLE_KEY_FOR_FLOWRATE_UNIT)
case STD_KEY_UNT_F: // F32 实时流量单位 UNT-F
KeyStruct.Prompt = UNTF_Prompt;
KeyStruct.Value = (unsigned long int)flowDisUnit;
KeyStruct.Max = SCFH; //NCMH;
KeyStruct.Min = SLPM;
KeyStruct.Type = PARM_LIST_SEL | NO_SAVE;
// if(ParameterSetup())
// {
// flowDisUnit = (unsigned int)KeyStruct.Value;
// CombinedUnit();
// tempDev.Word[0] = (unsigned int)flowUnit;
// flowUnit = (unsigned int)WriteParameterToEEPROM(WORK_UNIT, WORK_UNIT_WIDTH);
// JudgeFlowRateUnit(flowUnit);
// }
if(ParameterSetup())
{
flowDisUnit = (u16)KeyStruct.Value;
CombinedUnitByFlowRate();
ConvertAllFlowRateAndSave(flowUnit);
break;
}
if(setKeyType != 2) break;
if(JudgeflowUserUnit(setKeyBuffer)) break;
keyValue = keyLastValue;
continue;
break;
#endif
//case STD_KEY_UNT_P // F33 压力单位 UNT-P
//=======================================================================
#ifndef ENABLE_ALTERNATE_DISPLAY
#pragma message("[undefined] ENABLE_ALTERNATE_DISPLAY")
#elif(ENABLE_ALTERNATE_DISPLAY)
case STD_KEY_DISP: // F38 显示模式 DISP
if(SysPressure == 0) continue;
KeyStruct.Prompt = DISP_Prompt;
KeyStruct.Type = PARM_LIST_SEL;
KeyStruct.Value = (unsigned long int)displayType;
KeyStruct.Max = 1;
KeyStruct.Min = 0;
KeyStruct.Addr = DIS_MOD;
KeyStruct.Width = DIS_MOD_WIDTH;
ParameterSetup();
displayType = (unsigned char)KeyStruct.Value;
break;
#endif
//=======================================================================
#ifndef ENABLE_KEY_FOR_LANGUAGE
#pragma message("[undefined] ENABLE_KEY_FOR_LANGUAGE")
#elif(ENABLE_KEY_FOR_LANGUAGE)
case STD_KEY_DIS_LANGUAGE: // F39 显示语言模式 LANG
KeyStruct.Prompt = LANG_Prompt;
KeyStruct.Type = PARM_LIST_SEL;
KeyStruct.Max = 2;
KeyStruct.Min = 0;
KeyStruct.Value = (unsigned long int)language;
KeyStruct.Addr = DIS_LANGUAGE;
KeyStruct.Width = DIS_LANGUAGE_WIDTH;
ParameterSetup();
language = (unsigned char)KeyStruct.Value;
break;
#endif
//=======================================================================
// 模拟接口类F31-F40
#ifndef ENABLE_KEY_FOR_PULSE
#pragma message("[undefined] ENABLE_KEY_FOR_PULSE")
#elif(ENABLE_KEY_FOR_PULSE)
case STD_KEY_PULSE: // F41 脉冲当量 PULSE
//------------------------------------------------------------------------
#ifndef ENABLE_PULSE_USE_CALIB_SETUP
#pragma message("[undefined] ENABLE_PULSE_USE_CALIB_SETUP")
#elif(ENABLE_PULSE_USE_CALIB_SETUP)
KeyStruct.Prompt = PULSE_Prompt;
KeyStruct.Value = maxFlowRate;
KeyStruct.Type = 5;
KeyStruct.Gain = 1;
KeyStruct.Max = 10000;
KeyStruct.Min = 100;
KeyStruct.Addr = PULSE_UNIT;
KeyStruct.Width = PULSE_UNIT_WIDTH;
ParameterSetup();
maxFlowRate = KeyStruct.Value;
//------------------------------------------------------------------------
#else
//------------------------------------------------------------------------
KeyStruct.Prompt = PULSE_Prompt;
KeyStruct.Type = PARM_LIST_SEL | NO_SAVE;
KeyStruct.Value = (unsigned long int)(factoryUnitPerPulse-PULSE_MIN_UNIT);
KeyStruct.Max = (unsigned long int)PULSE_UNIT_INDEX_MAX;
KeyStruct.Min = (unsigned long int)PULSE_UNIT_INDEX_MIN;
if(ParameterSetup())
{
factoryUnitPerPulse = KeyStruct.Value;
factoryUnitPerPulse += PULSE_MIN_UNIT;
//InitPulseUnit();
tempDev.DWord[0] = (unsigned long int)factoryUnitPerPulse;
factoryUnitPerPulse = WriteLongParameterToEEPROM(PULSE_UNIT, PULSE_UNIT_WIDTH);
}
#endif
//------------------------------------------------------------------------
break;
#endif
//=======================================================================
// 报警类F41-F50
//=======================================================================
#ifndef ENABLE_KEY_FOR_ALARM_FR
#pragma message("[undefined] ENABLE_KEY_FOR_ALARM_FR")
#elif(ENABLE_KEY_FOR_ALARM_FR)
// 报警类F41-F50
case STD_KEY_ALM_H: // F51 高流量报警 ALM-H
KeyStruct.Prompt = ALMH_Prompt;
KeyStruct.Value = alarmUpperFlowRate;
KeyStruct.Type = 5;
KeyStruct.Gain = 1000;
KeyStruct.Max = 99999;
KeyStruct.Min = 0;
KeyStruct.Addr = HIGH_FLOW_ALARM;
KeyStruct.Width = HIGH_FLOW_ALARM_WIDTH;
ParameterSetup();
alarmUpperFlowRate = KeyStruct.Value;
break;
//=======================================================================
case STD_KEY_ALM_L: // F52 低流量报警 ALM-L
KeyStruct.Prompt = ALML_Prompt;
KeyStruct.Value = alarmLowerFlowRate;
KeyStruct.Type = 5;
KeyStruct.Gain = 1000;
KeyStruct.Max = 99999;
KeyStruct.Min = 0;
KeyStruct.Addr = LOW_FLOW_ALARM;
KeyStruct.Width = LOW_FLOW_ALARM_WIDTH;
ParameterSetup();
alarmLowerFlowRate = KeyStruct.Value;
break;
#endif
//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
#ifndef ENABLE_KEY_FOR_PASSWORD
#pragma message("[undefined] ENABLE_KEY_FOR_PASSWORD")
#elif(ENABLE_KEY_FOR_PASSWORD)
case STD_KEY_PASS: // F91 设置密码 PASS
KeyStruct.Prompt = PASS_Prompt;
KeyStruct.Value = keyPassWord;
KeyStruct.Type = 5;
KeyStruct.Gain = 1;
KeyStruct.Max = 99999;
KeyStruct.Min = 0;
KeyStruct.Addr = KEY_PASSWORD;
KeyStruct.Width = KEY_PASSWORD_WIDTH;
ParameterSetup();
keyPassWord = KeyStruct.Value;
break;
#endif
//=====================================================================
#ifndef ENABLE_KEY_FOR_CLR_ACC
#pragma message("[undefined] ENABLE_KEY_FOR_CLR_ACC")
#elif(ENABLE_KEY_FOR_CLR_ACC)
case STD_KEY_CLR_A: // F92 清除总流量 CLR-A
KeyStruct.Prompt = CLRA_Prompt;
KeyStruct.Value = NO;
KeyStruct.Max = YES;
KeyStruct.Min = NO;
KeyStruct.Type = OPERATION_CLASS | NO_SAVE| NEED_PASSWORD;
KeyStruct.Password = 22222;
if(ParameterSetup() && (KeyStruct.Value == YES)) ClearACC();
break;
#endif
//=====================================================================
//case STD_KEY_CLR_T // F93 清除时间 CLR-T
//=====================================================================
#ifndef ENABLE_KEY_FOR_RESET_DCOEF
#pragma message("[undefined] ENABLE_KEY_FOR_RESET_DCOEF")
#elif(ENABLE_KEY_FOR_RESET_DCOEF)
case STD_KEY_RESET_DCOEF: // F94 恢复二次修正 RS2ND
KeyStruct.Prompt = RS2ND_Prompt;
KeyStruct.Value = NO;
KeyStruct.Max = YES;
KeyStruct.Min = NO;
KeyStruct.Type = OPERATION_CLASS | NO_SAVE | NEED_PASSWORD;
KeyStruct.Password = 22222;
//ParameterSetup();
if(ParameterSetup() && (KeyStruct.Value == YES)) DefaultDevCoef();
break;
#endif
//========================================================================
// 退出
case STD_KEY_QUIT: ExitKeyOperation(); break; // F99 退出设置 QUIT
case STD_RETURN:
KeyReset();
//DisableKeyInterrupt();
NumericPrepForOutputAndDisplay();
return;
default: continue;
}
DisplayForKeyOperation();
}
}
//##############################################################################
#endif
//##############################################################################