Files
FireAlarmCtrlCn/MyCode/Gui/PmsIntervene.cpp
2026-04-06 19:02:09 +08:00

526 lines
12 KiB
C++

#include "PmsIntervene.h"
#include "Runtime.h"
#include "server.h"
extern "C"{
#include "user_norflash.h"
#include "user_eeprom.h"
#include "uart_key_drv.h"
}
static const unsigned char SavePassWord[32] = "9910232250266023\0";
void TPmsIntervene::Init(int aX, int aY, int aW, int aH, int OwnerX, int OwnerY, u32 aColor, TBvStyle aBevelOuter){
unsigned short Left,Right,Top,Bottom,i;
Bound.SetBySize(aX+OwnerX, aY+OwnerY, aW, aH);
Color = aColor;
BevelOuter = aBevelOuter;
if(BevelOuter == bvRaised){
Left = Bound.Left + 1;
Right = Bound.Right - 2;
Top = Bound.Top + 1;
Bottom = Bound.Bottom - 2;
}else{
Left = Bound.Left + 2;
Right = Bound.Right - 2;
Top = Bound.Top + 2;
Bottom = Bound.Bottom - 2;
}
Caption.Init(Left, Top, Right-Left+1, 32, 0, 0, clNearWhite, clMedBlue);
Content.Set(Left,Top+32,Right,Bottom);
TextColor = clNearBlack;
SelectedColor = clBlue;
SelectedTextColor = clNearWhite;
Caption.Visible = 0;
Edit.Visible = 0;
Edit.SetMaxLen(16);
Edit.SetTextShowMaskByAsterisk();
STextDown.Visible = 1;
CountDownTick =0;
}
void TPmsIntervene::DelayMs(unsigned int aMs)
{
volatile unsigned int mTick;
volatile unsigned int Tick;
for(Tick=0; Tick<aMs; Tick++){
for(mTick=0; mTick<160000; mTick++);
sys_error_led_task();
}
}
void TPmsIntervene::DrawSelf(void)
{
unsigned int i;
if (BevelOuter == bvLowered){
VertLineRender(Bound.Left, Bound.Top, Bound.Height-1, 0xFF808080);
HorizLineRender(Bound.Left, Bound.Top, Bound.Width-1, 0xFF808080);
VertLineRender(Bound.Left+1, Bound.Top+1, Bound.Height-2, 0xFF404040);
HorizLineRender(Bound.Left+1, Bound.Top+1, Bound.Width-2, 0xFF404040);
VertLineRender(Bound.Right-1, Bound.Top+1, Bound.Height-2, 0xFFD4D0C8);
HorizLineRender(Bound.Left+1, Bound.Bottom-1, Bound.Width-2, 0xFFD4D0C8);
VertLineRender(Bound.Right, Bound.Top, Bound.Height, 0xFFFFFFFF);
HorizLineRender(Bound.Left, Bound.Bottom, Bound.Width, 0xFFFFFFFF);
}else
if(BevelOuter == bvRaised){
VertLineRender(Bound.Left, Bound.Top, Bound.Height -1, 0xFFFFFFFF);
VertLineRender(Bound.Right -1, Bound.Top +1, Bound.Height -2, 0xFF808080);
VertLineRender(Bound.Right, Bound.Top, Bound.Height, 0xFF404040);
HorizLineRender(Bound.Left, Bound.Top, Bound.Width - 1, 0xFFFFFFFF);
HorizLineRender(Bound.Left +1, Bound.Bottom -1, Bound.Width - 2, 0xFF808080);
HorizLineRender(Bound.Left, Bound.Bottom, Bound.Width, 0xFF404040);
}
//Fill Rect Box
RectFillRender(Content.Left, Content.Top, Content.Right, Content.Bottom, Color);
RectFillRender(Bound.Left-6, Bound.Top-8, Bound.Left-1, Bound.Bottom+6, clGray);
RectFillRender(Bound.Left-6, Bound.Top-8, Bound.Right+6, Bound.Top-1, clGray);
RectFillRender(Bound.Right+1, Bound.Top-8, Bound.Right+6, Bound.Bottom+6, clGray);
RectFillRender(Bound.Left-6, Bound.Bottom+1, Bound.Right+6, Bound.Bottom+6, clGray);
//if(Caption.Visible)Caption.Show();
}
void TPmsIntervene::Show(void)
{
DrawSelf();
}
void TPmsIntervene::Show4Reset()
{
Init(180, 110, 440, 120, 0, 0, clFrmFace, bvRaised);
Caption.Visible = 1;
if(LanguageEnCn==0)Caption.SetText("执行复位,请输入II级或III级密码", 24);
else Caption.SetText("Reset,Level 2 or 3 Permission", 24);
STextDown.Init(Content.Left+ 20, Content.Top + 50, Content.Width - 40, 30, 0,0,2,clFrmFace);
if(LanguageEnCn==0)STextDown.SetText("输入密码按确认键执行,或返回", 24);
else STextDown.SetText("Input Password", 24);
Caption.TextColor = clNearWhite;
//BackScreen();
Edit.Init(Content.Left+ 20, Content.Top + 10, Content.Width - 40, 32, 0, 0, 2 , clFrmFace);
Edit.Str.Clear();
Edit.SetMaxLen(16);
Edit.SetTextShowMaskByAsterisk();
Edit.Pst = -1;
Edit.SetSelect();
DrawSelf();
Caption.Show();
Edit.Show();
STextDown.Show();
IsShow = 1;
GoWhat = 1;
CountDownTick =15;
IsHotKeyCheckingPermission =1;
}
void TPmsIntervene::Show4Alram()
{
DelayMs(50);
Init(180, 110, 440, 120, 0, 0, clFrmFace, bvRaised);
Caption.Visible = 1;
if(LanguageEnCn==0)Caption.SetText("启停声光警报,请输入II级或III级密码", 24);
else Caption.SetText("Acoustooptic,Level 2 or 3 Permission", 24);
STextDown.Init(Content.Left+ 20, Content.Top + 50, Content.Width - 40, 30, 0,0,2,clFrmFace);
if(LanguageEnCn==0)STextDown.SetText("输入密码按确认键执行,或返回", 24);
else STextDown.SetText("Input Password", 24);
Caption.TextColor = clNearWhite;
//BackScreen();
Edit.Init(Content.Left+ 20, Content.Top + 10, Content.Width - 40, 32, 0, 0, 2 , clFrmFace);
Edit.Str.Clear();
Edit.SetMaxLen(16);
Edit.SetTextShowMaskByAsterisk();
Edit.Pst = -1;
Edit.SetSelect();
DrawSelf();
Caption.Show();
Edit.Show();
STextDown.Show();
IsShow =1;
GoWhat = 2;
CountDownTick =15;
IsHotKeyCheckingPermission = 1;
}
void TPmsIntervene::Show4SelfCheck()
{
Init(180, 110, 440, 120, 0, 0, clFrmFace, bvRaised);
Caption.Visible = 1;
if(LanguageEnCn==0)Caption.SetText("自检,请输入II级或III级密码", 24);
else Caption.SetText("Self-Check,Level 2 or 3 Permission", 24);
STextDown.Init(Content.Left+ 20, Content.Top + 50, Content.Width - 40, 30, 0,0,2,clFrmFace);
if(LanguageEnCn==0)STextDown.SetText("输入密码按确认键执行,或返回", 24);
else STextDown.SetText("Input Password", 24);
Caption.TextColor = clNearWhite;
//BackScreen();
Edit.Init(Content.Left+ 20, Content.Top + 10, Content.Width - 40, 32, 0, 0, 2 , clFrmFace);
Edit.Str.Clear();
Edit.SetMaxLen(16);
Edit.SetTextShowMaskByAsterisk();
Edit.Pst = -1;
Edit.SetSelect();
DrawSelf();
Caption.Show();
Edit.Show();
STextDown.Show();
IsShow =1;
GoWhat = 3;
CountDownTick =15;
IsHotKeyCheckingPermission = 1;
}
void TPmsIntervene::Show4Gui(int aX, int aY, int aW, int aH, int aReqLevel)
{
DelayMs(50);
Init(aX, aY, aW, aH, 0, 0, clFrmFace, bvRaised);
Caption.Visible = 1;
if(aReqLevel == 2){
if(LanguageEnCn==0)Caption.SetText("请输入II级或III级密码", 24);
else Caption.SetText("Level 2 or 3 Permission", 24);
}else{
if(LanguageEnCn==0)Caption.SetText("请输入III级密码 ", 24);
else Caption.SetText("Level 3 Permission ", 24);
}
STextDown.Init(Content.Left+ 20, Content.Top + 50, Content.Width - 40, 30, 0,0,2,clFrmFace);
if(LanguageEnCn==0)STextDown.SetText("输入密码按确认键执行,或返回", 24);
else STextDown.SetText("Input Password", 24);
Caption.TextColor = clNearWhite;
//BackScreen();
Edit.Init(Content.Left+ 20, Content.Top + 10, Content.Width - 80, 32, 0, 0, 2 , clFrmFace);
Edit.Str.Clear();
Edit.SetMaxLen(16);
Edit.SetTextShowMaskByAsterisk();
Edit.Pst = -1;
Edit.SetSelect();
DrawSelf();
Caption.Show();
Edit.Show();
STextDown.Show();
IsShow =1;
GoWhat = 4;
ReqLevel = aReqLevel;
CountDownTick =15;
}
void TPmsIntervene::ReDraw4GuiRecall()
{
DelayMs(50);
DrawSelf();
Caption.Show();
Edit.Show();
STextDown.Show();
CountDownTick =15;
}
void TPmsIntervene::CheckEnterLvl()
{
unsigned int Len,i, Cok, Cing;
Len = Edit.Str.GetLength();
if(Len <6)return;
if(Len >16)return;
Cok = 0;
Cing = 1;
if(Len == CtlCenter.PassWordII.Len){
for(i=0; i<Len; i++){
if(Edit.Str.Text[i] != CtlCenter.PassWordII.Content[i]){
Cing = 0;
}
}
if(Cing){
Cok = 1;
SystemPermission = 2;
SystemPermissionTick = 0;
}
}
if(Cok)return;
Cing = 1;
if(Len == CtlCenter.PassWordIII.Len){
for(i=0; i<Len; i++){
if(Edit.Str.Text[i] != CtlCenter.PassWordIII.Content[i]){
Cing = 0;
}
}
if(Cing){
Cok = 1;
SystemPermission = 3;
SystemPermissionTick = 0;
}
}
if(Cok)return;
if(Len == 16){
Cok =0;
for(i=0; i<16; i++){
if(SavePassWord[i] == Edit.Str.Text[i])Cok++;
}
if(Cok == 16){
SystemPermission = 3;
SystemPermissionTick = 0;
}
return;
}
}
void TPmsIntervene::CheckEnterLv2()
{
unsigned int Len,i, Cok, Cing;
Len = Edit.Str.GetLength();
if(Len <6)return;
if(Len >16)return;
Cok = 0;
Cing = 1;
if(Len == CtlCenter.PassWordIII.Len){
for(i=0; i<Len; i++){
if(Edit.Str.Text[i] != CtlCenter.PassWordIII.Content[i]){
Cing = 0;
}
}
if(Cing){
Cok = 1;
SystemPermission = 3;
SystemPermissionTick = 0;
}
}
if(Cok)return;
if(Len == 16){
Cok =0;
for(i=0; i<16; i++){
if(SavePassWord[i] == Edit.Str.Text[i])Cok++;
}
if(Cok == 16){
SystemPermission = 3;
SystemPermissionTick = 0;
}
return;
}
}
TGuiMsgReturn TPmsIntervene::KeyIn(unsigned char aKey)
{
TGuiMsgReturn aMsg = guiMsgNone;
int uKey, Len;
unsigned char aIndex;
char LastChr;
const char *p;
int i;
switch(aKey){
case VK_DELETE:
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case VK_LEFT:
case VK_RIGHT:
Edit.KeyIn(aKey);
Edit.CorrectPst();
Edit.Show();
Edit.ShowCursor();
CountDownTick = 15;
break;
}
if(aKey == VK_EXECUTE){
if(GoWhat == 1){
CheckEnterLvl();
if(SystemPermission >1){
HotKeyResetCallBack();
IsShow = 0;
aMsg = guiMsgReturn;
}else{
if(LanguageEnCn==0)STextDown.SetText("密码错误 !", 24);
else STextDown.SetText("Incorrect Password", 24);
STextDown.TextColor = clRed;
STextDown.Show();
CountDownTick = 15;
}
}else
if(GoWhat == 2){
CheckEnterLvl();
if(SystemPermission >1){
RedrawScreen();
HotKeyAlramCallBack();
IsShow = 0;
aMsg = guiMsgReturn;
}else{
if(LanguageEnCn==0)STextDown.SetText("密码错误 !", 24);
else STextDown.SetText("Incorrect Password", 24);
STextDown.TextColor = clRed;
STextDown.Show();
CountDownTick = 15;
}
}else
if(GoWhat == 3){
CheckEnterLvl();
if(SystemPermission >1){
HotKeySelfCheckCallBack();
IsShow = 0;
aMsg = guiMsgReturn;
}else{
if(LanguageEnCn==0)STextDown.SetText("密码错误 !", 24);
else STextDown.SetText("Incorrect Password", 24);
STextDown.TextColor = clRed;
STextDown.Show();
CountDownTick = 15;
}
}else
if(GoWhat == 4){
if(ReqLevel == 2){
CheckEnterLvl();
if(SystemPermission >1){
IsShow = 0;
aMsg = guiMsgOkAndReturn;
}else{
if(LanguageEnCn==0)STextDown.SetText("密码错误 !", 24);
else STextDown.SetText("Incorrect Password", 24);
STextDown.TextColor = clRed;
STextDown.Show();
CountDownTick = 15;
}
}else
if(ReqLevel == 3){
CheckEnterLv2();
if(SystemPermission >2){
IsShow = 0;
aMsg = guiMsgOkAndReturn;
}else{
if(LanguageEnCn==0)STextDown.SetText("密码错误 !", 24);
else STextDown.SetText("Incorrect Password", 24);
STextDown.TextColor = clRed;
STextDown.Show();
CountDownTick = 15;
}
}
}
}else
if(aKey == VK_RETURN){
IsShow = 0;
if(GoWhat < 4)
RedrawScreen();
aMsg = guiMsgReturn;
}
if( (aMsg == guiMsgReturn) || (aMsg == guiMsgOkAndReturn) ){
IsHotKeyCheckingPermission = 0;
}
return aMsg;
}
void TPmsIntervene::BackScreen()
{
volatile unsigned int aAddrs, aAddrt;
int x,y;
aAddrs = LcdBaseAddr;
aAddrt = dAddrSdRam_BackScreen;
for(y=100; y<260; y++){
for(x=170; x<630; x++){
PxData[x-170] = *(volatile unsigned int *)(aAddrs + ((y*800 + x) *4));
}
for(x=170; x<630; x++){
*(volatile unsigned int *)aAddrt = PxData[x-170];
aAddrt+=4;
}
}
}
void TPmsIntervene::RedrawScreen()
{
volatile unsigned int aAddr;
int x,y;
GuiRedraw(1);
return;
aAddr = dAddrSdRam_BackScreen;
for(y=100; y<260; y++){
for(x=170; x<630; x++){
PxData[x-170] = *(volatile unsigned int *)aAddr;
aAddr+=4;
}
for(x=170; x<630; x++){
*(volatile unsigned int *)(LcdBaseAddr + ((y*800 + x) *4)) = PxData[x-170];
}
}
}
void TPmsIntervene::DrawTip()
{
unsigned int aClr;
if(CountDownTick & 0x01){
aClr = clNearWhite;
}else{
aClr = clNearBlack;
}
RectFillRender(Bound.Left-6, Bound.Top-8, Bound.Left-1, Bound.Bottom+6, aClr);
RectFillRender(Bound.Left-6, Bound.Top-8, Bound.Right+6, Bound.Top-1, aClr);
RectFillRender(Bound.Right+1, Bound.Top-8, Bound.Right+6, Bound.Bottom+6, aClr);
RectFillRender(Bound.Left-6, Bound.Bottom+1, Bound.Right+6, Bound.Bottom+6, aClr);
if(CountDownTick < 10)
TextDigitRender2_24(STextDown.Bound.Left+ 360, STextDown.Bound.Top+2, clNearBlack, clFrmFace, CountDownTick);
else
TextRender_string24(STextDown.Bound.Left+ 360, STextDown.Bound.Top+2, clNearBlack, clFrmFace, " ");
}
void TPmsIntervene::Task1000Ms()
{
if(IsShow == 0)return;
if(CountDownTick){
CountDownTick--;
if(CountDownTick){
DrawTip();
}else{
IsShow = 0;
GoWhat = 0;
RedrawScreen();
}
}
}
int TPmsIntervene::ExtRequst(unsigned char Prm)
{
IsShow = 0;
IsHotKeyCheckingPermission =0;
return 0;
}