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

1239 lines
35 KiB
C++

#include "UserCodeSet.h"
#include "Runtime.h"
extern "C"{
#include "user_norflash.h"
#include "user_eeprom.h"
#include "uart_key_drv.h"
#include "HW_config.h"
}
//#define dFlash4AreaChip (0)
//#define dFlash4Area (0x00BB'0000)
#define dWdClr clSkyBlue
#define dWdDisabelClr clNearWhite
#define dWWidth 24
#define dWHeigh 24
#define dRoundR 7
const int xInc = 84;
const int xDec = 180;
const int xModify = 84;
const int xSave = 180;
static const char CharBcdText[20]= {"0123456789*------\0"};
void TUserCodeSet::Init()
{
IsPermission =0;
CtlIndex = 0;
IsShow = 0;
ListPage = 0;
PortNum = 0;
AddrStart =0;
AddrEnd =0;
dType =0;
PortValid = 1;
AddrStartValid =1;
AddrEndValid =1;
dTypeValid =1;
IncDec = 0;
Sta =0;
}
void TUserCodeSet::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 TUserCodeSet::RenderBackGround(void)
{
RectFillRender(ContentGeometry.Left, ContentGeometry.Top, ContentGeometry.Right, ContentGeometry.Bottom, ContentColor);
}
void TUserCodeSet::RenderBackGround(unsigned int aClr)
{
RectFillRender(ContentGeometry.Left, ContentGeometry.Top, ContentGeometry.Right, ContentGeometry.Bottom, aClr);
}
void TUserCodeSet::DrawFixText()
{
if(LanguageEnCn==0){
TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "联动->二次码编辑");
TextRender_string24(Lv.Grid.Left[0] + 10, Lv.Grid.Top[0] +6, clNearWhite, "回路号");
TextRender_string24(Lv.Grid.Left[0] + 186, Lv.Grid.Top[0] +6, clNearWhite, "机器号");
TextRender_string24(Lv.Grid.Left[0] + 286, Lv.Grid.Top[0] +6, clNearWhite, "本机");
TextRender_string24(Lv.Grid.Left[0] + 10, Lv.Grid.Top[0] +44, clNearWhite, "地址段");
TextRender_string24(Lv.Grid.Left[0] + 136, Lv.Grid.Top[0] +44, clNearWhite, "-");
TextRender_string24(Lv.Grid.Left[0] + 240, Lv.Grid.Top[0] +44, clNearWhite, "起始地址指派类型");
TextRender_string24(Lv.Grid.Left[1] + 10, Lv.Grid.Top[1] +6, clNearWhite, "起始地址分区简称");
TextRender_string24(Lv.Grid.Left[2] + 10, Lv.Grid.Top[2] +6, clNearWhite, "通配二次码");
TextRender_string24(Lv.Grid.Left[3] + 10, Lv.Grid.Top[3] +6, clNearWhite, "置换二次码");
TextRender_string24(Lv.Grid.Left[4] + 10, Lv.Grid.Top[4] +6, clNearWhite, "模式");
TextRender_string24(Lv.Grid.Left[4] + xInc +30, Lv.Grid.Top[4] +8, clNearWhite, "递增");
TextRender_string24(Lv.Grid.Left[4] + xDec +30, Lv.Grid.Top[4] +8, clNearWhite, "递减");
TextRender_string24(Lv.Grid.Left[5] + 10, Lv.Grid.Top[5] +6, clNearWhite, "操作");
TRoundRect::sDrawBySize(xModify, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, "确认", 14, clNearBlack);
TRoundRect::sDrawBySize(xSave, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, "保存", 14, clNearBlack);
}else{
TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "Linkage->Aux ID Setting");
TextRender_string24(Lv.Grid.Left[0] + 10, Lv.Grid.Top[0] +6, clNearWhite, "LoopID");
TextRender_string24(Lv.Grid.Left[0] + 186, Lv.Grid.Top[0] +6, clNearWhite, "CtlID");
TextRender_string24(Lv.Grid.Left[0] + 286, Lv.Grid.Top[0] +6, clNearWhite, " Local");
TextRender_string24(Lv.Grid.Left[0] + 10, Lv.Grid.Top[0] +44, clNearWhite, "Range");
TextRender_string24(Lv.Grid.Left[0] + 136, Lv.Grid.Top[0] +44, clNearWhite, "-");
TextRender_string24(Lv.Grid.Left[0] + 240, Lv.Grid.Top[0] +44, clNearWhite, " Device Type");
TextRender_string24(Lv.Grid.Left[1] + 10, Lv.Grid.Top[1] +6, clNearWhite, "Zone Brief");
TextRender_string24(Lv.Grid.Left[2] + 10, Lv.Grid.Top[2] +6, clNearWhite, "ID With * ");
TextRender_string24(Lv.Grid.Left[3] + 10, Lv.Grid.Top[3] +6, clNearWhite, "ReplaceNum");
TextRender_string24(Lv.Grid.Left[4] + 10, Lv.Grid.Top[4] +6, clNearWhite, "Mode");
TextRender_string24(Lv.Grid.Left[4] + xInc +30, Lv.Grid.Top[4] +8, clNearWhite, "Inc ");
TextRender_string24(Lv.Grid.Left[4] + xDec +30, Lv.Grid.Top[4] +8, clNearWhite, "Dec ");
TextRender_string24(Lv.Grid.Left[5] + 10, Lv.Grid.Top[5] +6, clNearWhite, "Opera");
TRoundRect::sDrawBySize(xModify, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, "View", 14, clNearBlack);
TRoundRect::sDrawBySize(xSave, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, "Save", 14, clNearBlack);
}
}
void TUserCodeSet::DrawSelf(void)
{
RenderBackGround();
RectFillRender(Lv.Caption.Left, Lv.Caption.Top, Lv.Caption.Right, Lv.Caption.Bottom, CaptionColor);
for(int i=0; i<Lv.Grid.UsingCount; i++)RectFillRender(Lv.Grid.Left[i], Lv.Grid.Top[i], Lv.Grid.Right[i], Lv.Grid.Bottom[i], ItemColor);
if(Lv.Panel.Active)RectFillRender(Lv.Panel.Left, Lv.Panel.Top, Lv.Panel.Right, Lv.Panel.Bottom, PanelColor);
TextDigitRender2_24(Lv.Grid.Left[0] + 260, Lv.Grid.Top[0] +6, clNearWhite, MainCtl.fData.Split.MyNum);
IList->STextDType.Init(Lv.Grid.Left[0] + 492, Lv.Grid.Top[0] +44, 300, 32, 0,0, clNearWhite, ItemColor);
IList->STextDType.TextClear();
IList->STextDType.Visible = 1;
//Port Num
IList->EditPortNum.Init(Lv.Grid.Left[0] + 86, Lv.Grid.Top[0] +4, 48, 30, 0,0,1,clNearWhite);
IList->EditPortNum.Str.Clear();
IList->EditPortNum.SetMaxLen(2);
IList->EditPortNum.Enable =1;
//Start Addr
IList->EditAddrNum.Init(Lv.Grid.Left[0] + 86, Lv.Grid.Top[0] +40, 48, 30, 0,0,1,clNearWhite);
IList->EditAddrNum.Str.Clear();
IList->EditAddrNum.SetMaxLen(3);
IList->EditAddrNum.Enable =1;
//End Addr
IList->Edit[0].Init(Lv.Grid.Left[0] + 152, Lv.Grid.Top[0] +40, 48, 30, 0,0,1,clNearWhite);
IList->Edit[0].Str.Clear();
IList->Edit[0].SetMaxLen(3);
IList->Edit[0].Enable =1;
//Assign Type
IList->EditCtlNum.Init(Lv.Grid.Left[0] + 440, Lv.Grid.Top[0] +40, 48, 30, 0,0,1,clNearWhite);
IList->EditCtlNum.Str.Clear();
IList->EditCtlNum.SetMaxLen(3);
IList->EditCtlNum.Enable =0;
//Short Name
IList->Edit[1].Init(Lv.Grid.Left[1] + 10, Lv.Grid.Top[1] +36, 270, 30, 0,0,1,clNearWhite);
IList->Edit[1].Str.Clear();
IList->Edit[1].Enable =0;
//Descp
//mlEdit.Init(Lv.Grid.Left[2] +10, Lv.Grid.Top[2] +32, 270, 64, 0,0,1,clNearWhite);
//mlEdit.SetLineSpacing(4);
//mlEdit.Str.Clear();
//mlEdit.Enable =0;
//Prv UserCode
IList->Edit[2].Init(Lv.Grid.Left[2] + 132, Lv.Grid.Top[2] +4, 110, 30, 0,0,1,clNearWhite);
IList->Edit[2].SetMaxLen(8);
IList->Edit[2].Str.Clear();
IList->Edit[2].Enable =1;
//New UserCode
IList->Edit[3].Init(Lv.Grid.Left[3] + 132, Lv.Grid.Top[3] +4, 110, 30, 0,0,1,clNearWhite);
IList->Edit[3].SetMaxLen(8);
IList->Edit[3].Str.Clear();
IList->Edit[3].Enable =1;
IList->EditPortNum.Str.FromUInt2Dg(PortNum+1);
IList->EditAddrNum.Str.FromUInt3Dg(AddrStart+1);
IList->Edit[0].Str.FromUInt3Dg(AddrEnd+1);
IList->EditCtlNum.Str.FromUInt3Dg(dType);
IList->EditPortNum.SetPstTail();
IList->EditAddrNum.SetPstTail();
IList->Edit[0].SetPstTail();
IList->EditCtlNum.SetPstTail();
IList->EditPortNum.Show();
IList->EditAddrNum.Show();
IList->Edit[0].Show();
IList->EditCtlNum.Show();
IList->STextDType.Show();
IList->Edit[1].Show();
IList->Edit[2].Show();
IList->Edit[3].Show();
//IList->EditAreaAssign.Show();
//mlEdit.Show();
DrawFixText();
DrawIncDec();
Check4Selected();
}
void TUserCodeSet::Show(void)
{
IsShow = 1;
RenderBackGround();
DrawSelf();
DrawList();
}
void TUserCodeSet::DrawIncDec()
{
if(IncDec==0){
TRoundSquare::sDrawBySize(xInc, Lv.Grid.Top[4] + 8, dWWidth, dWHeigh, dRoundR, dWdClr , 1);
TRoundSquare::sDrawBySize(xDec, Lv.Grid.Top[4] + 8, dWWidth, dWHeigh, dRoundR, dWdDisabelClr , 0);
}else{
TRoundSquare::sDrawBySize(xInc, Lv.Grid.Top[4] + 8, dWWidth, dWHeigh, dRoundR, dWdDisabelClr , 0);
TRoundSquare::sDrawBySize(xDec, Lv.Grid.Top[4] + 8, dWWidth, dWHeigh, dRoundR, dWdClr , 1);
}
}
void TUserCodeSet::ShowSta()
{
if(LanguageEnCn==0){
if(Sta == 0){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, " ");
}else
if(Sta == 1){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "保存成功");
}else
if(Sta == -1){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "保存失败");
}else
if(Sta == -2){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "无效操作");
}
}else{
if(Sta == 0){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, " ");
}else
if(Sta == 1){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "Saved OK");
}else
if(Sta == -1){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "Failed ");
}else
if(Sta == -2){
TextRender_string24(ResultTipPoint.x, ResultTipPoint.y, clNearWhite, ItemColor, "Invalid ");
}
}
}
void TUserCodeSet::ShowSta(int aSta)
{
Sta = aSta;
ShowSta();
}
void TUserCodeSet::FullRedraw(int Prm)
{
if(Prm == 0){
RenderBackGround();
DrawSelf();
ShowSta();
}else
if(Prm == 1){
RectFillRender(GuiRedrawDataList[1][0], GuiRedrawDataList[1][1], GuiRedrawDataList[1][2], GuiRedrawDataList[1][3], ContentColor);
for(int i=0; i<3; i++)RectFillRender(Lv.Grid.Left[i], Lv.Grid.Top[i], Lv.Grid.Right[i], Lv.Grid.Bottom[i], ItemColor);
if(Lv.Panel.Active)RectFillRender(Lv.Panel.Left, Lv.Panel.Top, Lv.Panel.Right, Lv.Panel.Bottom, PanelColor);
TextDigitRender2_24(Lv.Grid.Left[0] + 260, Lv.Grid.Top[0] +6, clNearWhite, MainCtl.fData.Split.MyNum);
DrawFixText();
IList->STextDType.Show();
IList->EditPortNum.Show();
IList->EditAddrNum.Show();
IList->Edit[0].Show();
IList->EditCtlNum.Show();
IList->Edit[1].Show();
IList->Edit[2].Show();
Check4Selected();
if(IsPermission)PmsIntervene4Gui.ReDraw4GuiRecall();
}
}
//______________________________________________________________________________________________________________________________
void TUserCodeSet::ClearSelected(void)
{
char *tText;
switch(CtlIndex){
case 0:
IList->EditPortNum.Selected =0;
IList->EditPortNum.Show();
break;
case 1:
IList->EditAddrNum.Selected =0;
IList->EditAddrNum.Show();
break;
case 2:
IList->Edit[0].Selected =0;
IList->Edit[0].Show();
break;
case 3:
IList->Edit[2].Selected =0;
IList->Edit[2].Show();
break;
case 4:
IList->Edit[3].Selected =0;
IList->Edit[3].Show();
break;
case 5:
TRoundSquare::sSelected(xInc, Lv.Grid.Top[4]+8, dWWidth, dWHeigh, 4, ItemColor);
break;
case 6:
TRoundSquare::sSelected(xDec, Lv.Grid.Top[4]+8, dWWidth, dWHeigh, 4, ItemColor);
break;
case 7:
if(LanguageEnCn==0)tText="确定"; else tText="View";
TRoundRect::sDrawBySize(xModify, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, tText, 14, clNearBlack);
break;
case 8:
if(LanguageEnCn==0)tText="保存"; else tText="Save";
TRoundRect::sDrawBySize(xSave, Lv.Grid.Top[5] + 6, 76, 30, 7, clNearWhite, tText, 14, clNearBlack);
break;
default:
break;
}
}
void TUserCodeSet::Check4Selected(void)
{
char *tText;
switch(CtlIndex){
case 0:
IList->EditPortNum.Selected =1;
IList->EditPortNum.SetPstTail();
IList->EditPortNum.Show();
break;
case 1:
IList->EditAddrNum.Selected =1;
IList->EditAddrNum.SetPstTail();
IList->EditAddrNum.Show();
break;
case 2:
IList->Edit[0].Selected =1;
IList->Edit[0].SetPstTail();
IList->Edit[0].Show();
break;
case 3:
IList->Edit[2].Selected =1;
IList->Edit[2].SetPstTail();
IList->Edit[2].Show();
break;
case 4:
IList->Edit[3].Selected =1;
IList->Edit[3].SetPstTail();
IList->Edit[3].Show();
break;
case 5:
TRoundSquare::sSelected(xInc, Lv.Grid.Top[4]+8, dWWidth, dWHeigh, 4, clNearWhite);
//sDrawBySize(int x, int y, int aW, int aH, int RoundR, u32 aClr, int Active);
break;
case 6:
TRoundSquare::sSelected(xDec, Lv.Grid.Top[4]+8, dWWidth, dWHeigh, 4, clNearWhite);
break;
case 7:
if(LanguageEnCn==0)tText="确定"; else tText="View";
TRoundRect::sDrawBySize(xModify, Lv.Grid.Top[5] + 6, 76, 30, 7, clBlue, tText, 14, clNearWhite);
break;
case 8:
if(LanguageEnCn==0)tText="保存"; else tText="Save";
TRoundRect::sDrawBySize(xSave, Lv.Grid.Top[5] + 6, 76, 30, 7, clBlue, tText, 14, clNearWhite);
break;
default:
break;
}
}
void TUserCodeSet::PermissionCmdGO()
{
if((PermissionCmd == 1) || (PermissionCmd == 2)){
if(0 == DrawDetail()){
Write2Flash();
}else{
ShowSta(-2);
}
}
}
void TUserCodeSet::PermissionCmdReturnDraw()
{
if(Lv.Panel.Active)RectFillRender(Lv.Panel.Left, Lv.Panel.Top, Lv.Panel.Right, Lv.Panel.Bottom, PanelColor);
}
void TUserCodeSet::InitPanel()
{
int x,y,x2,y2, aW,aH,i;
x = 10;
y = 240;
x2 = 789;
y2 = 430;
aW = x2 - x +1;
aH = y2 -y +1;
aPanel->Init(x,y,aW,aH,0,0,clMoneyGreen, bvRaised);
aPanel->Caption.Init(1,1,aW-3,32,x,y,clNearWhite,clBlue);
if(LanguageEnCn==0)aPanel->Caption.SetText("按中/EN键切换输入法,设置键保存更改,返回键放弃更改并返回",24);
else aPanel->Caption.SetText("Key 中/EN To Switch Input Method,Key Set To Save",24);
aPanel->Caption.Enable = 1;
aPanel->Caption.Visible = 1;
aPanel->SText[0].Init(460,40,300,34,x,y,clNearBlack,clMoneyGreen);
if(LanguageEnCn==0)TMyString::sFromStr("当前快捷输入数字", aPanel->SText[0].Text);
else TMyString::sFromStr("Enter Numbers", aPanel->SText[0].Text);
aPanel->SText[0].Enable = 1;
aPanel->SText[0].Visible = 1;
aPanel->Edit[ 0].Init(10,40,420,30,x,y,1,clNearBlack);
aPanel->Edit[ 0].Str.FromStr(IList->EditDescpShow.Str.Text);
for(i=0; i<1;i++){
aPanel->Edit[i].Enable = 1;
aPanel->Edit[i].Visible = 1;
aPanel->Edit[i].SetMaxLen(32);
aPanel->Edit[i].SetPstTail();
aPanel->Edit[i].Selected = 1;
}
aPanel->Show();
aPanel->Caption.Show();
aPanel->SText[0].Show();
aPanel->Edit[0].Show();
aPanel->Edit[0].ShowCursor();
}
//_____________________________________________________________________________________________________________________________
TGuiMsgReturn TUserCodeSet::KeyIn(unsigned char aKey)
{
TGuiMsgReturn aMsg = guiMsgNone;
TGuiMsgReturn PmsRtnMsg = guiMsgNone;
int iVal;
int HadPrc;
if(IsPermission){
PmsRtnMsg = PmsIntervene4Gui.KeyIn(aKey);
if(PmsRtnMsg == guiMsgOkAndReturn){
//Enter And Run Go
IsPermission = 0;
PermissionCmdReturnDraw();
PermissionCmdGO();
}else
if(PmsRtnMsg == guiMsgReturn){
//Not Enter Redraw
IsPermission = 0;
PermissionCmdReturnDraw();
}
return aMsg;
}else{
switch(aKey){
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:
case VK_DELETE:
HadPrc =0;
if( (aKey == VK_LEFT) || (aKey == VK_RIGHT) ){
if(CtlIndex == 1){
if(aKey == VK_RIGHT){
if(IList->EditAddrNum.Pst >= IList->EditAddrNum.Str.GetEndPst()){
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) == 4){
ClearSelected();
CtlIndex++;
Check4Selected();
HadPrc =1;
}
}
}
}else
if(CtlIndex == 2){
if(aKey == VK_LEFT){
if(IList->Edit[0].Pst <0){
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) == 4){
ClearSelected();
CtlIndex--;
Check4Selected();
HadPrc =1;
}
}
}
}else
if(CtlIndex == 5){
if(aKey == VK_RIGHT){
ClearSelected();
CtlIndex++;
Check4Selected();
HadPrc =1;
}
}else
if(CtlIndex == 6){
if(aKey == VK_LEFT){
ClearSelected();
CtlIndex--;
Check4Selected();
HadPrc =1;
}
}else
if(CtlIndex == 7){
if(aKey == VK_RIGHT){
ClearSelected();
CtlIndex++;
Check4Selected();
HadPrc =1;
}
}else
if(CtlIndex == 8){
if(aKey == VK_LEFT){
ClearSelected();
CtlIndex--;
Check4Selected();
HadPrc =1;
}
}
}
if(HadPrc == 0){
if(CtlIndex == 0){
IList->EditPortNum.KeyIn(aKey);
int iVal;
iVal = IList->EditPortNum.Str.ToInteger();
if( (iVal <1) || (iVal > dPORT_MAX_COUNT) ){
PortValid =0;
IList->EditPortNum.SelectedColor = clRed;
}else{
PortValid =1;
IList->EditPortNum.SelectedColor = clBlue;
iVal--;
if(iVal != PortNum){
PortNum = iVal;
LoadData();
}
}
IList->EditPortNum.Show();
}else
if(CtlIndex == 1){
IList->EditAddrNum.KeyIn(aKey);
int iVal;
iVal = IList->EditAddrNum.Str.ToInteger();
if( (iVal <1) || (iVal > dEP_MAX_COUNT_PER_PORT) ){
AddrStartValid =0;
IList->EditAddrNum.SelectedColor = clRed;
}else{
AddrStartValid =1;
IList->EditAddrNum.SelectedColor = clBlue;
iVal--;
if(iVal != AddrStart){
AddrStart = iVal;
LoadData();
}
}
IList->EditAddrNum.Show();
}else
if(CtlIndex == 2){
IList->Edit[0].KeyIn(aKey);
int iVal;
iVal = IList->Edit[0].Str.ToInteger();
if( (iVal <1) || (iVal > dEP_MAX_COUNT_PER_PORT) ){
AddrEndValid =0;
IList->Edit[0].SelectedColor = clRed;
}else{
AddrEndValid =1;
IList->Edit[0].SelectedColor = clBlue;
iVal--;
if(iVal != AddrEnd){
AddrEnd = iVal;
}
}
IList->Edit[0].Show();
}else
if(CtlIndex == 3){
IList->Edit[2].KeyIn(aKey);
IList->Edit[2].Show();
}else
if(CtlIndex == 4){
IList->Edit[3].KeyIn(aKey);
IList->Edit[3].Show();
}
}
break;
case dfKEY_ASTERISK:
if(CtlIndex == 3){
IList->Edit[2].KeyIn(aKey);
IList->Edit[2].Show();
}
break;
case VK_UP:
if(CtlIndex >0){
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) == 4){
ClearSelected();
CtlIndex--;
Check4Selected();
}
}else{
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) == 4){
ClearSelected();
CtlIndex =8;
Check4Selected();
}
}
break;
case VK_DOWN:
if(CtlIndex <8){
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) == 4){
ClearSelected();
CtlIndex++;
Check4Selected();
}
}else{
ClearSelected();
CtlIndex=0;
Check4Selected();
}
break;
case VK_TAB:
//IsList = 1;
//DrawList();
//ClearSelected();
break;
case dfKEY_SETUP: //0x70 // Key value for SETUP
if( (CtlIndex == 5) || (CtlIndex == 6) ){
IncDec = IncDec ? 0 :1;
DrawIncDec();
}
break;
case VK_EXECUTE:
if( (CtlIndex == 5) || (CtlIndex == 6) ){
IncDec = IncDec ? 0 :1;
DrawIncDec();
}else
if(CtlIndex == 7){
DrawDetail();
}else
if(CtlIndex == 8){
//Save Data Here
PermissionCmd = 1;
if(SystemPermission > 2){
PermissionCmdGO();
}else{
IsPermission = 1;
ClearSelected();
PmsIntervene4Gui.Show4Gui(Lv.Panel.Left + 16, Lv.Panel.Top + 16, Lv.Panel.Width -36 , 140, 3);
}
}
break;
case VK_RETURN:
aMsg = guiMsgReturn;
break;
default :
break;
}
if(VK_EXECUTE != aKey){
ShowSta(0);
}
}
return aMsg;
}
void TUserCodeSet::LoadAssignType()
{
int i;
unsigned int Idf, aOrd, sAddr;
unsigned char AssignType;
if( (PortNum < dPORT_MAX_COUNT ) && (AddrStart < dEP_MAX_COUNT_PER_PORT) ){
AssignType = Port[PortNum].AssignType[AddrStart];
IList->EditCtlNum.Str.FromUInt3Dg(AssignType);
if(LanguageEnCn==0)IList->STextDType.SetText(StrTypeShortName[AssignType] ,24);
else IList->STextDType.SetText(StrTypeShortNameEn[AssignType] ,24);
}else{
IList->EditCtlNum.Str.FromStr("---");
IList->STextDType.SetText("----" ,24);
}
IList->EditCtlNum.Show();
IList->STextDType.Show();
}
void TUserCodeSet::LoadUcBcdText()
{
int i;
unsigned int Idf, aOrd, sAddr;
if( (PortNum < dPORT_MAX_COUNT ) && (AddrStart < dEP_MAX_COUNT_PER_PORT) ){
IList->Edit[2].Str.FromUInt8Dg(Port[PortNum].UcList[AddrStart].Full);
}else{
IList->Edit[2].Str.FromStr("00000000");
}
IList->Edit[2].Show();
}
void TUserCodeSet::LoadShortName()
{
unsigned int Idf, sAddr;
if( (PortNum < dPORT_MAX_COUNT ) && (AddrStart < dEP_MAX_COUNT_PER_PORT) ){
AreaNum = Port[PortNum].Area[AddrStart];
if(AreaNum){
AreaNum--;
}else{
AreaNum = dAreaCountMax +10;
}
}else{
AreaNum = dAreaCountMax +10;;
}
if(AreaNum >= dAreaCountMax ){
IList->Edit[1].Str.FromStr("------");
IList->Edit[1].Show();
return;
}
sAddr = dAddrSdRam_4Area + (AreaNum * 64);
Idf = *(volatile unsigned int *)(sAddr);
if(Idf == 0xA8A7A6A5){
sAddr = dAddrSdRam_4Area + (AreaNum * 64) + 16;
for(int i=0; i<16; i++){
IList->Edit[1].Str.Text[i] = *(volatile unsigned char *)(sAddr +i);
}
IList->Edit[1].Str.Text[16] = '\0';
}else{
IList->Edit[1].Str.Text[0] = '\0';
IList->Edit[1].Str.Text[1] = '\0';
}
IList->Edit[1].Show();
}
void TUserCodeSet::LoadData()
{
LoadAssignType();
LoadUcBcdText();
LoadShortName();
}
int TUserCodeSet::DrawDetail()
{
int x,y, Pst;
char tText[16];
unsigned int tUc, HadGotAsFinished;
int AstStartPoint, AstEndPoint, AstLength, InputLength, InputVal, Step;
x = Lv.Panel.Left +4;
y = Lv.Panel.Top +4;
if(Lv.Panel.Active)RectFillRender(Lv.Panel.Left, Lv.Panel.Top, Lv.Panel.Right, Lv.Panel.Bottom, PanelColor);
if(LanguageEnCn==0){
if(PortNum >= dPORT_MAX_COUNT){
TextRender_string24(x, y, clNearWhite, "回路号不正确");
return -1;
}else
if(AddrStart >= dEP_MAX_COUNT_PER_PORT){
TextRender_string24(x, y, clNearWhite, "起始地址不正确");
return -1;
}else
if(AddrEnd >= dEP_MAX_COUNT_PER_PORT){
TextRender_string24(x, y, clNearWhite, "结束地址不正确");
return -1;
}else
if(AddrStart > AddrEnd){
TextRender_string24(x, y, clNearWhite, "起始-结束 地址不正确");
return -1;
}
if(IList->Edit[2].Str.Text[8] != '\0'){
TextRender_string24(x, y, clNearWhite, "通配二次码超出长度");
return -1;
}
}else{
if(PortNum >= dPORT_MAX_COUNT){
TextRender_string24(x, y, clNearWhite, "Loop ID Invalid");
return -1;
}else
if(AddrStart >= dEP_MAX_COUNT_PER_PORT){
TextRender_string24(x, y, clNearWhite, "Begin Addr Invalid");
return -1;
}else
if(AddrEnd >= dEP_MAX_COUNT_PER_PORT){
TextRender_string24(x, y, clNearWhite, "End Addr Invalid");
return -1;
}else
if(AddrStart > AddrEnd){
TextRender_string24(x, y, clNearWhite, "Begin-End Addr Invalid");
return -1;
}
if(IList->Edit[2].Str.Text[8] != '\0'){
TextRender_string24(x, y, clNearWhite, "Aux ID Invalid");
return -1;
}
}
Step =0;
GotAst = 0;
HadGotAsFinished =0;
for(int i=0; i<16; i++)tText[i] = '\0';
for(Pst=0; Pst<8; Pst++){
if(IList->Edit[2].Str.Text[Pst] != '\0'){
if(HadGotAsFinished == 1){
if(IList->Edit[2].Str.Text[Pst] == '*'){
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "通配二次码存在两段或以上的通配字段");
else TextRender_string24(x, y, clNearWhite, "Invalid,Aux ID 2 Paragraphs Wildcard");
return -1;
}else{
tText[Pst] = IList->Edit[2].Str.Text[Pst];
Step++;
}
}else{
if(IList->Edit[2].Str.Text[Pst] == '*'){
tText[Pst] = '0';
if(GotAst == 0)AstStartPoint = Pst;
GotAst =1;
AstEndPoint = Pst;
}else{
tText[Pst] = IList->Edit[2].Str.Text[Pst];
if(GotAst){
HadGotAsFinished = 1;
Step++;
}
}
}
}else{
break;
}
}
UserCodeItv = 1;
for(int i=0; i< Step; i++){
UserCodeItv *= 10;
}
AstLength = AstEndPoint - AstStartPoint +1;
if(IList->Edit[3].Str.Text[8] != '\0'){
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "新二次码长度超出范围");
else TextRender_string24(x, y, clNearWhite, "New Aux ID Invalid"); //value out of range
return -1;
}
InputLength =0;
for(int i=0; i<8; i++){
if(IList->Edit[3].Str.Text[i] != '\0')InputLength++;
else break;
}
InputVal = IList->Edit[3].Str.ToInteger();
if(GotAst){
if(InputLength > AstLength){
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "新二次码长度超出通配字段长度");
else TextRender_string24(x, y, clNearWhite, "Replacing Num Out Of Wildcard");
return -1;
}
unsigned int tScope =1;
for(int i=0, z=0; (i<8) && (z<AstLength); i++, z++){
tScope = tScope * 10;
}
if(tScope < (AddrEnd - AddrStart)){
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "通配字段长度不足,需求:"); //Length Of Wildcard Field
else TextRender_string24(x, y, clNearWhite, "Invalid,Length Of Wildcard Field");
x += 264;
TextDigitRender3_24(x, y, clNearWhite, AddrEnd - AddrStart +1);
return -1;
}
InputVal = IList->Edit[3].Str.ToInteger();
if(IncDec == 0){
if( (InputVal + (AddrEnd - AddrStart) ) > tScope){
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "通配字段递增溢出");
else TextRender_string24(x, y, clNearWhite, "Invalid,Value Out Of Range");
return -1;
}
}else{
if( (InputVal - (AddrEnd - AddrStart) ) < 0){
if(LanguageEnCn)TextRender_string24(x, y, clNearWhite, "通配字段递减溢出");
else TextRender_string24(x, y, clNearWhite, "Invalid,Value Out Of Range");
return -1;
}
}
UserCodePrv = TMyString::sToInteger(tText);
if(UserCodePrv>99'999'999)UserCodePrv=99'999'999;
if(UserCodePrv==0)UserCodePrv=1;
UserCodeStart = UserCodePrv + (InputVal * UserCodeItv);
if(UserCodeStart>99'999'999)UserCodeStart=99'999'999;
else if(UserCodeStart==0)UserCodeStart=1;
if(LanguageEnCn==0){
TextRender_string24(x, y, clNearWhite, "使用通配字:");
x += 132;
TextDigitRender8_24(x, y, clNearWhite, UserCodePrv);
x += 110;
TextRender_string24(x, y, clNearWhite, "开始");
x += 48;
TextDigitRender8_24(x, y, clNearWhite, UserCodeStart);
x += 96;
TextRender_string24(x, y, clNearWhite, "+");
x += 12;
TextDigitRender8_24(x, y, clNearWhite, UserCodeItv);
}else{
TextRender_string24(x, y, clNearWhite, "With Wildcard");
x += 13 *12;
TextDigitRender8_24(x, y, clNearWhite, UserCodePrv);
x += 110;
TextRender_string24(x, y, clNearWhite, "Begin");
x += 5*12;
TextDigitRender8_24(x, y, clNearWhite, UserCodeStart);
x += 96;
TextRender_string24(x, y, clNearWhite, "+");
x += 12;
TextDigitRender8_24(x, y, clNearWhite, UserCodeItv);
}
}else{
UserCodeStart = IList->Edit[2].Str.ToInteger();
if(UserCodeStart>99'999'999)UserCodeStart=99'999'999;
else if(UserCodeStart==0)UserCodeStart=1;
if(LanguageEnCn==0){
TextRender_string24(x, y, clNearWhite, "无通配字 开始:");
x += 170;
TextDigitRender8_24(x, y, clNearWhite, UserCodeStart);
x += 96;
TextRender_string24(x, y, clNearWhite, "+");
x += 12;
TextDigitRender8_24(x, y, clNearWhite, 1);
}else{
TextRender_string24(x, y, clNearWhite, "Without Wildcard");
x += 16*12;
TextDigitRender8_24(x, y, clNearWhite, UserCodeStart);
x += 96;
TextRender_string24(x, y, clNearWhite, "+");
x += 12;
TextDigitRender8_24(x, y, clNearWhite, 1);
}
}
IList->RealtimeData.Reset();
x = Lv.Panel.Left +4;
y+=28;
if(LanguageEnCn==0){
TextRender_string24(x, y, clNearWhite, "写入条目数量:");
x += 156;
}else{
TextRender_string24(x, y, clNearWhite, "Numbers Of Items:");
x += 17*12;
}
TextDigitRender5_24(x, y, clNearWhite, AddrEnd-AddrStart+1);
x += 72;
TextDigitRender5_24(x, y, clNearWhite, AddrStart+1);
x += 72;
TextRender_string24(x, y, clNearWhite, "-");
x += 12;
TextDigitRender3_24(x, y, clNearWhite, AddrEnd+1);
const int Count = AddrEnd - AddrStart +1;
tUc = UserCodeStart;
int aAddr = AddrStart;
if(Count < 7){
for(int i=0; i<Count; i++){
x = Lv.Panel.Left +4;
y+=28;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "回路:");
else TextRender_string24(x, y, clNearWhite, "Loop:");
x += 60;
TextDigitRender2_24(x, y, clNearWhite, PortNum+1);
x += 36;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "地址:");
else TextRender_string24(x, y, clNearWhite, "Addr:");
x += 60;
TextDigitRender3_24(x, y, clNearWhite, aAddr+1);
x += 60;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "原:");
else TextRender_string24(x, y, clNearWhite, " ");
x += 36;
TextDigitRender8_24(x, y, clNearWhite, Port[PortNum].UcList[aAddr].Full );
x += 100;
TextRender_string24(x, y, clNearWhite, "-->");
x += 36;
TextDigitRender8_24(x, y, clNearWhite, tUc );
if(IncDec==0){
tUc += UserCodeItv;
if( (tUc>99'999'999) || (tUc==0) )tUc=1;
}else{
tUc -= UserCodeItv;
if( (tUc>99'999'999) || (tUc==0) )tUc=99'999'999;
}
aAddr ++;
}
}else{
for(int i=0; i<Count; i++){
if( (i<3) || (i>(Count-4)) ){
x = Lv.Panel.Left +4;
y+=28;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "回路:");
else TextRender_string24(x, y, clNearWhite, "Loop:");
x += 60;
TextDigitRender2_24(x, y, clNearWhite, PortNum+1);
x += 36;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "地址:");
else TextRender_string24(x, y, clNearWhite, "Addr:");
x += 60;
TextDigitRender3_24(x, y, clNearWhite, aAddr+1);
x += 60;
if(LanguageEnCn==0)TextRender_string24(x, y, clNearWhite, "原:");
else TextRender_string24(x, y, clNearWhite, " ");
x += 36;
TextDigitRender8_24(x, y, clNearWhite, Port[PortNum].UcList[aAddr].Full );
x += 100;
TextRender_string24(x, y, clNearWhite, "-->");
x += 36;
TextDigitRender8_24(x, y, clNearWhite, tUc );
}
if( i==3){
x = Lv.Panel.Left + 200;
y+=28;
TextRender_string24(x, y, clNearWhite, "............");
}
if(IncDec==0){
tUc += UserCodeItv;
if( (tUc>99'999'999) || (tUc==0) )tUc=1;
}else{
tUc -= UserCodeItv;
if( (tUc>99'999'999) || (tUc==0) )tUc=99'999'999;
}
aAddr ++;
}
}
return 0;
}
void TUserCodeSet::Write2Flash()
{
unsigned int fAddr;
unsigned int i,z;
unsigned int aUcFull;
volatile unsigned int x, GetSta;
unsigned char wP1;
TDMix tCrc;
if( (PortValid + dTypeValid + AddrStartValid + AddrEndValid) != 4){
return;
}
do{
DelayMs(3);
GetSta = nor_get_busy_state(dFlashAddrDevUserCodeChip);
}while(GetSta);
//Erase 1 * 4K Blocks
if( (PortNum < dPORT_MAX_COUNT) ){
fAddr = dFlashAddrDevUserCode + (PortNum * 4096);
nor_erase_sector_4k(dFlashAddrDevUserCodeChip,fAddr);
DelayMs(100);
do{
DelayMs(10);
GetSta = nor_get_busy_state(dFlashAddrDevUserCodeChip);
}while(GetSta);
aUcFull = UserCodeStart;
Crc32Reset();
for(i=0; i<64; i++)IList->ReadWriteData.D32[i] = 0;
for(i=0; i<4; i++){
for(x=0;x<64;x++){
IList->ReadWriteData.D32[x] = Port[PortNum].UcList[i*64 + x].Full;
if( ( (i*64 + x) >= AddrStart) && ((i*64 + x) <= AddrEnd) ){
IList->ReadWriteData.D32[x] = aUcFull;
if(IncDec == 0){
aUcFull += UserCodeItv;
if( (aUcFull >99999999) || (aUcFull==0) )aUcFull =1;
}else{
aUcFull -= UserCodeItv;
if( (aUcFull >99999999) || (aUcFull==0) )aUcFull =99999999;
}
}
if( (i<3) or (x< (dEP_MAX_COUNT_PER_PORT % 64 ) ) ){
Crc32Feed(IList->ReadWriteData.D32[x]);
}
}
if(i==3){
IList->ReadWriteData.D32[63] = Crc32GetResult();
}
fAddr = dFlashAddrDevUserCode + (PortNum * 4096) + (i * 256);
nor_write_page(dFlashAddrDevUserCodeChip, fAddr, IList->ReadWriteData.D8);
do{
DelayMs(5);
GetSta = nor_get_busy_state(dFlashAddrDevUserCodeChip);
}while(GetSta);
}
for(x=0;x<dEP_MAX_COUNT_PER_PORT;x++){
IList->ReadWriteData.D8[x] = Port[PortNum].AssignType[x];
if(dType !=0){
if( (x >= AddrStart) && (x <= AddrEnd) ){
IList->ReadWriteData.D8[x] = dType;
}
}
}
Crc32Reset();
for(x=0; x<dEP_MAX_COUNT_PER_PORT; x++)Crc32Feed(static_cast<unsigned int>(IList->ReadWriteData.D8[x]));
tCrc.D32 = Crc32GetResult();
IList->ReadWriteData.D8[252] = tCrc.D8[0];
IList->ReadWriteData.D8[253] = tCrc.D8[1];
IList->ReadWriteData.D8[254] = tCrc.D8[2];
IList->ReadWriteData.D8[255] = tCrc.D8[3];
fAddr = dFlashAddrDevUserCode + (PortNum * 4096) + (4 * 256);
nor_write_page(dFlashAddrDevUserCodeChip, fAddr, IList->ReadWriteData.D8);
do{
DelayMs(5);
GetSta = nor_get_busy_state(dFlashAddrDevUserCodeChip);
}while(GetSta);
//Signal Type
for(x=0;x<dEP_MAX_COUNT_PER_PORT;x++){
IList->ReadWriteData.D8[x] = Port[PortNum].FuncSetByte[x];
}
Crc32Reset();
for(x=0; x<dEP_MAX_COUNT_PER_PORT; x++)Crc32Feed(static_cast<unsigned int>(IList->ReadWriteData.D8[x]));
tCrc.D32 = Crc32GetResult();
IList->ReadWriteData.D8[252] = tCrc.D8[0];
IList->ReadWriteData.D8[253] = tCrc.D8[1];
IList->ReadWriteData.D8[254] = tCrc.D8[2];
IList->ReadWriteData.D8[255] = tCrc.D8[3];
fAddr = dFlashAddrDevUserCode + (PortNum * 4096) + (5 * 256);
nor_write_page(dFlashAddrDevUserCodeChip, fAddr, IList->ReadWriteData.D8);
do{
DelayMs(5);
GetSta = nor_get_busy_state(dFlashAddrDevUserCodeChip);
}while(GetSta);
}
Record.ReadDevUserSet();
int Count = AddrEnd -AddrEnd +1;
int NotEqOcc =0;
int aAddr = AddrStart;
aUcFull = UserCodeStart;
for(int Gz=0; Gz<Count; Gz++){
if(aUcFull != Port[PortNum].UcList[aAddr].Full){
NotEqOcc = 1;
break;
}
if(IncDec == 0){
aUcFull += UserCodeItv;
if( (aUcFull >99999999) || (aUcFull==0) )aUcFull =1;
}else{
aUcFull -= UserCodeItv;
if( (aUcFull >99999999) || (aUcFull==0) )aUcFull =99999999;
}
aAddr++;
}
if(NotEqOcc){
//Error
ShowSta(-1);
}else{
//OK
ShowSta(1);
}
}
void TUserCodeSet::DrawList()
{
int i, z, x, y;
unsigned int aClr, TopInx, sAddr, Idf;
return;
IsList ? aClr=clBlue : aClr=clMedGray;
RectFillRender(Lv.Panel.Left,Lv.Panel.Top,Lv.Panel.Right,Lv.Panel.Bottom,PanelColor);
RectFillRender(Lv.Panel.Left,Lv.Panel.Top,Lv.Panel.Left +4,Lv.Panel.Bottom,aClr);
RectFillRender(Lv.Panel.Left,Lv.Panel.Top,Lv.Panel.Right,Lv.Panel.Top +4,aClr);
RectFillRender(Lv.Panel.Right-4,Lv.Panel.Top,Lv.Panel.Right,Lv.Panel.Bottom,aClr);
RectFillRender(Lv.Panel.Left,Lv.Panel.Bottom -4,Lv.Panel.Right,Lv.Panel.Bottom,aClr);
const unsigned int PageCount = dAreaCountMax / 8;
if(ListPage >= PageCount) ListPage = 0;
x = Lv.Panel.Left+6;
y = Lv.Panel.Top +6;
TextRender_string24(x, y, clNearBlack, PanelColor, "区域号 配置 简称 二次码");
TopInx = ListPage * 8;
for(i=0,z=TopInx; (i<8) && (z<dAreaCountMax); i++, z++){
aClr = clNearWhite;
x = Lv.Panel.Left+6;
y+=28;
TextDigitRender4Right24(x, y, aClr, PanelColor, z+1);
x+=96;
sAddr = dAddrSdRam_4Area + (z * 64);
Idf = *(volatile unsigned int *)(sAddr);
if(Idf == 0xA8A7A6A5){
TextRender_string24(x, y, clNearBlack, PanelColor, "已配置");
//Show ShortName
for(int g=0; g<20;g++)ListText[g] =0;
sAddr = dAddrSdRam_4Area + (z * 64) + 16;
for(int g=0; g<16; g++){
ListText[g] = *(volatile unsigned char *)(sAddr +g);
}
x+=96;
TextRender_string24(x, y, clNearBlack, PanelColor, ListText);
//Show UserCode
for(int g=0; g<20;g++)ListText[g] =0;
sAddr = dAddrSdRam_4Area + (z * 64) + 4;
for(int g=0; g<8; g++){
ListText[g] = *(volatile unsigned char *)(sAddr +g);
}
x+=200;
TextRender_string24(x, y, clNearBlack, PanelColor, ListText);
}else{
TextRender_string24(x, y, clNearBlack, PanelColor, " ----");
}
}
}