#include "RuntimeData.h" #include "LinkageProgram.h" #include "InterLink.h" #include "DevMask.h" #include "Runtime.h" extern "C"{ #include "user_norflash.h" #include "user_eeprom.h" #include "uart_key_drv.h" #include "HW_config.h" } #define dWdClr clSkyBlue #define dWdDisabelClr clNearWhite #define dWWidth 24 #define dWHeigh 24 #define dRoundR 7 #define dAddrSdRam_LinkageInput (dAddrSdRam_Commom + 0xF0000) static const int GridX [5] = {4, 202, 400, 598, 796}; static const int GridTop [12] = {143, 173, 202, 231, 260, 294, 323, 352, 381, 410, 439, 468}; static const int GridBottom [12] = {172, 201, 230, 259, 288, 322, 351, 380, 409, 438, 467, 470}; //static const unsigned int clInput = clShallowGreen; //static const unsigned int clOutput = clShallowRed; const char NumText[10][4] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; static const int xCount = 10; static const int xEntry = 214; static const int xActiveBy = 300; static const int xMask = 450; static const int xSave = 560; static const int xDelete = 640; static const int xNew = 720; static const int xSelfActive = 560; static const int xEntryState = xEntry; static const int xOperatState = 450; void TLinkageProgram::Init() { IsShow = 0; IsPermission =0; PermissionCmd =0; EnterMethod =0; ItemsIndex =0; EditIndex =0; OnEditing =0; IsInputSymbol = 0; IsViewList = 0; IsNew = 0; ActX =0; Inx =0; eX =0; eY =0; eWhat = 0; ShouldBeClear = 0; ShouldBeLoad = 0; CurrentPath0 = 0; IsWhowingTip = 0; } void TLinkageProgram::RenderBackGround(void) { RectFillRender(ContentGeometry.Left, ContentGeometry.Top, ContentGeometry.Right, ContentGeometry.Bottom, ContentColor); } void TLinkageProgram::RenderBackGround(unsigned int aClr) { RectFillRender(ContentGeometry.Left, ContentGeometry.Top, ContentGeometry.Right, ContentGeometry.Bottom, aClr); } void TLinkageProgram::RenderContent(void) { #define FixColColor clMedGray #define OddColor clNearMoneyGreen unsigned int x,y, y2, clr; } void TLinkageProgram::DrawFixText() { if(LanguageEnCn==0){ if(EnterMethod){ TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "联动->编程查询->编程输入 "); }else{ TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "联动->编程输入 "); } TextRender_string24(Lv.Grid.Left[0] + 60, Lv.Grid.Top[0] +6, clNearWhite, "/"); TextRender_string24(Lv.Grid.Left[0] + 150, Lv.Grid.Top[0] +6, clNearWhite, "序号:"); TextRender_string24(Lv.Grid.Left[0] + xActiveBy, Lv.Grid.Top[0] +6, clNearWhite, "执行:"); TextRender_string24(Lv.Grid.Left[0] + xMask + 28, Lv.Grid.Top[0] +6, clNearWhite, "屏蔽"); TextRender_string24(Lv.Grid.Left[0] + xSelfActive + 28, Lv.Grid.Top[0] +6, clNearWhite, "强制自动执行"); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xSave, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "保存", 8, ItemColor); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xDelete, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "删除", 8, ItemColor); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xNew, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "新建", 8, ItemColor); }else{ if(EnterMethod){ TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "Linkage->Overview->Expression Edit"); }else{ TextRender_string24(Lv.Caption.Left + 10, Lv.Caption.Top +4, clNearWhite, CaptionColor, "Linkage->Expression Edit"); } TextRender_string24(Lv.Grid.Left[0] + 60, Lv.Grid.Top[0] +6, clNearWhite, "/"); TextRender_string24(Lv.Grid.Left[0] + 150, Lv.Grid.Top[0] +6, clNearWhite, "Index"); TextRender_string24(Lv.Grid.Left[0] + xActiveBy, Lv.Grid.Top[0] +6, clNearWhite, "Mode"); TextRender_string24(Lv.Grid.Left[0] + xMask + 28, Lv.Grid.Top[0] +6, clNearWhite, "Mask"); TextRender_string24(Lv.Grid.Left[0] + xSelfActive + 28, Lv.Grid.Top[0] +6, clNearWhite, "Force Auto Run"); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xSave, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "Save", 8, ItemColor); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xDelete, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "Del ", 8, ItemColor); TRoundRect::sDrawBySize(Lv.Grid.Left[0] +xNew, Lv.Grid.Top[1] + 4, 60, 30, 3, clNearWhite, "New ", 8, ItemColor); } } void TLinkageProgram::DrawSelf(void) { RenderBackGround(); RectFillRender(Lv.Caption.Left, Lv.Caption.Top, Lv.Caption.Right, Lv.Caption.Bottom, CaptionColor); for(int i=0; i= 10)break; } i = InputPageIndex * 10; TVScrollBar::sDrawByPoint(206, 116, 215, 428, aClr, clGray, InputCount, 10, i); } int TLinkageProgram::SearchPort(unsigned char aP0) { int y; unsigned int aAddr; unsigned char aType; unsigned char P0; unsigned char iCount = 0; P0 = aP0-1; if(MainCtl.fData.Split.PortCount == 0){ return iCount; } if(MainCtl.fData.Split.ExistTablePort[P0] == 0xA5){ for(y=0 ;y<256; y++){ if(Port[P0].ExistTable[y]){ aType = Port[P0].dTypeTable[y]; aAddr = dAddrSdRam_LinkageInput + (iCount * 4) ; *(volatile unsigned char *)(aAddr + 0) = 0; *(volatile unsigned char *)(aAddr + 1) = P0 +1; *(volatile unsigned char *)(aAddr + 2) = y +1; *(volatile unsigned char *)(aAddr + 3) = aType; iCount ++; } } return iCount; } return iCount; } int TLinkageProgram::TrySearchStartPort() { int i; for(i=1; i<(dPORT_MAX_COUNT+1); i++){ if(SearchPort(i)){ LoadInputList(i); CurrentPath0 = i; return i; } } return 0; } int TLinkageProgram::TrySearchPrePort() { unsigned char P0; int i; P0 = CurrentPath0-1; for(i=0; i= dPORT_MAX_COUNT){ P0 = dPORT_MAX_COUNT-1;; }else{ P0--; } if(MainCtl.fData.Split.ExistTablePort[P0] == 0xA5){ return P0+1; } } return 0; } int TLinkageProgram::TrySearchNextPort() { unsigned char P0; int i; P0 = CurrentPath0-1; for(i=0; i= dPORT_MAX_COUNT){ P0 = 0; }else{ P0++; } if(MainCtl.fData.Split.ExistTablePort[P0] == 0xA5){ return P0+1; } } return 0; } void TLinkageProgram::TryDecValue(int IsForce) { int aVal,i; unsigned int index; unsigned int Found; Found = 0; ShouldBeClear = 0; ShouldBeLoad = 0; if( (Inx == 0) || (IsForce) ){ if(ExpCount){ aVal = EEntry.Str.ToInteger(); if( (aVal > dLINKAGE_MAX_COUNT) || (aVal < 1) ){ aVal = 1; } index = aVal; for(i=0; i dLINKAGE_MAX_COUNT) || (aVal < 1) ){ aVal = 1; } index = aVal; for(i=0; i dLINKAGE_MAX_COUNT)index=1; if(ExistTabel[index -1]){ //RestoreFromEdit(EditingLinkageIndex); EditingLinkageIndex = index -1; EEntry.Str.FromUInt4Dg(EditingLinkageIndex +1); EEntry.SetPstTail(); EEntry.Show(); //EditML.Enable = 1; //SetEditStart(EditingLinkageIndex); EntryState = 1; Found = 1; ShouldBeLoad = 1; break; } } } if(Found == 0){ ExpCount = 0; EntryState = 2; EditingLinkageIndex = 0; TextDigitRender4_24(Lv.Grid.Left[0] + xCount, Lv.Grid.Top[0] +6, clNearWhite, ItemColor, ExpCount); EEntry.Str.FromStr("0001"); EEntry.SetPstTail(); EEntry.Show(); ShouldBeClear = 1; //EditML.Enable = 0; //EditML.Str.Clear(); //EditML.Show(); } } ShowEntryState(); } void TLinkageProgram::FindNextExp() { int aVal,i; unsigned int index; unsigned int Found; Found = 0; ShouldBeClear = 0; ShouldBeLoad = 0; if(ExpCount){ aVal = EEntry.Str.ToInteger(); if( (aVal > dLINKAGE_MAX_COUNT) || (aVal < 1) ){ aVal = 1; } index = aVal; for(i=0; i dLINKAGE_MAX_COUNT)index=1; if(ExistTabel[index -1]){ //RestoreFromEdit(EditingLinkageIndex); EditingLinkageIndex = index -1; EEntry.Str.FromUInt4Dg(EditingLinkageIndex +1); EEntry.SetPstTail(); EEntry.Show(); EntryState = 1; Found = 1; ShouldBeLoad = 1; break; } } } if(Found == 0){ ExpCount = 0; EntryState = 2; EditingLinkageIndex = 0; TextDigitRender4_24(Lv.Grid.Left[0] + xCount, Lv.Grid.Top[0] +6, clNearWhite, ItemColor, ExpCount); EEntry.Str.FromStr("----"); EEntry.SetPstTail(); EEntry.Show(); ShouldBeClear = 1; } } void TLinkageProgram::LoadExpCountFromRam() { unsigned int i,x; char Cz; unsigned int SysLinkAddr; TDMix Idf; ExpCount = 0; for(i=0; i= '0') && (EuCode.Str.Text[i] <= '9') ) || (EuCode.Str.Text[i] == '*') || (EuCode.Str.Text[i] == '#') ) { }else{ EuCode.Str.Text[i] = '\0'; EuCode.Str.Text[i+1] = '\0'; break; } } EuCode.Str.Text[8] = '\0'; EuCode.Str.Text[9] = '\0'; for(i=0; i<3; i++){ EdType.Str.Text[i] = tEntry[eY][eX][i + 8]; } for(i=0; i<3; i++){ if( (EdType.Str.Text[i] != '*') && ((EdType.Str.Text[i] < '0') || (EdType.Str.Text[i] > '9')) ){ EdType.Str.Text[i] = '\0'; EdType.Str.Text[i +1] = '\0'; } } EdType.Str.Text[3] = '\0'; EdType.Str.Text[4] = '\0'; if(eY < 4){ IsInput = 1; if( (tEntry[eY][eX][11] >= '1') && (tEntry[eY][eX][11] <= '9') ){ EInnerCount.Str.Text[0] = tEntry[eY][eX][11]; EInnerCount.Str.Text[1] = '\0'; }else{ EInnerCount.Str.Text[0] = '\0'; EInnerCount.Str.Text[1] = '\0'; } EInnerCount.SetPstTail(); if(tEntry[eY][eX][12] == 'X'){ tLogic = 'X'; ELogic.Str.FromStr("与"); }else if(tEntry[eY][eX][12] == '+'){ tLogic = '+'; ELogic.Str.FromStr("或"); }else{ tLogic = ' '; ELogic.Str.FromStr("xx"); } if( (tEntry[eY][eX][13] >= '1') && (tEntry[eY][eX][13] <= '9') ){ EInCount.Str.Text[0] = tEntry[eY][eX][13]; EInCount.Str.Text[1] = '\0'; }else{ EInCount.Str.Text[0] = '\0'; EInCount.Str.Text[1] = '\0'; } EInCount.SetPstTail(); }else if(eY < 8){ IsInput = 0; EDelay.Str.Text[0] = tEntry[eY][eX][11]; EDelay.Str.Text[1] = tEntry[eY][eX][12]; EDelay.Str.Text[2] = tEntry[eY][eX][13]; for(i=0; i<3; i++){ if( (EDelay.Str.Text[i] < '0') || (EDelay.Str.Text[i] > '9') ){ EDelay.Str.Text[i] = '\0'; EDelay.Str.Text[i +1] = '\0'; } } EDelay.Str.Text[3] = '\0'; EDelay.Str.Text[4] = '\0'; } } int TLinkageProgram::TryRestoreFromEdit() { //EntryChar unsigned int i; for(i=0; i<8; i++){ if( ( (EuCode.Str.Text[i] < '0') || (EuCode.Str.Text[i] > '9') ) && (EuCode.Str.Text[i] != '*') ){ return 1; } } if (EuCode.Str.Text[8] != 0){ return 1; } if(IsInput){ for(i=0; i<3; i++){ if( (EdType.Str.Text[i] < '0') || (EdType.Str.Text[i] > '9') ){ return 1; } } } if (EdType.Str.Text[3] != 0){ return 1; } if(IsInput){ }else{ if(EuCode.Str.Text[0] != '*'){ i = TMyString::sToInteger(EdType.Str.Text); if( (i <0) || ( i > 254) ){ return 1; } } } if(IsInput){ if( (EInnerCount.Str.Text[0] < '1') || (EInnerCount.Str.Text[0] > '9') || (EInnerCount.Str.Text[1] != 0 )){ return 1; } if( (tLogic != 'X') && (tLogic != '+') ){ return 1; } if(tLogic == 'X'){ if( (EInCount.Str.Text[0] < '1') || (EInCount.Str.Text[0] > '9') ){ return 1; } } }else{ if(EDelay.Str.Text[0] != 0){ if( (EDelay.Str.Text[0] < '0') || (EDelay.Str.Text[0] > '9') ){ return 1; } if(EDelay.Str.Text[1] != 0){ if( (EDelay.Str.Text[1] < '0') || (EDelay.Str.Text[1] > '9') ){ return 1; } if(EDelay.Str.Text[2] != 0){ if( (EDelay.Str.Text[2] < '0') || (EDelay.Str.Text[2] > '9') ){ return 1; } } } i = TMyString::sToInteger(EDelay.Str.Text); if( (i < 0) || ( i > 600 ) ){ return 1; } } } return 0; } void TLinkageProgram::RestoreFromEdit() { unsigned int i,x,y, NotUse, NewParCnt; ParCntHasChanged = 0; for(i=0; i<18; i++)tEntry[eY][eX][i] = '\0'; for(i=0; i<8; i++){ tEntry[eY][eX][i] = EuCode.Str.Text[i]; } TMyString::sFillFixLen(tEntry[eY][eX], 8); for(i=0; i<3; i++){ tEntry[eY][eX][i + 8] = EdType.Str.Text[i]; } TMyString::sFillFixLen(tEntry[eY][eX], 11); if(eY<4){ if( (EInnerCount.Str.Text[0] >= '1') && ((EInnerCount.Str.Text[0] <= '9')) ){ tEntry[eY][eX][11] = EInnerCount.Str.Text[0]; }else{ tEntry[eY][eX][11] = ' '; } if(tLogic == 'X'){ tEntry[eY][eX][12] = 'X'; }else if(tLogic == '+'){ tEntry[eY][eX][12] = '+'; }else{ tEntry[eY][eX][12] = ' '; } if(tLogic == 'X'){ if( (EInCount.Str.Text[0] >= '1') && ((EInCount.Str.Text[0] <= '9')) ){ tEntry[eY][eX][13] = EInCount.Str.Text[0]; NewParCnt = EInCount.Str.Text[0] -'0'; }else{ tEntry[eY][eX][13] = ' '; NewParCnt = 1; } if(NewParCnt != ParCnt){ ParCnt = NewParCnt; ParCntHasChanged = 1; } }else{ tEntry[eY][eX][13] = ' '; } if( (tEntry[eY][eX][0] != '*') && (tEntry[eY][eX][0] != '#') ){ if( (tEntry[eY][eX][0] < '0') || (tEntry[eY][eX][0] > '9') ){ tEntry[eY][eX][11] = ' '; tEntry[eY][eX][12] = ' '; tEntry[eY][eX][13] = ' '; } } TMyString::sFillFixLen(tEntry[eY][eX], 14); tEntry[eY][eX][14] = '\0'; tEntry[eY][eX][15] = '\0'; }else if(eY<8){ tEntry[eY][eX][11] = EDelay.Str.Text[0]; tEntry[eY][eX][12] = EDelay.Str.Text[1]; tEntry[eY][eX][13] = EDelay.Str.Text[2]; TMyString::sFillFixLen(tEntry[eY][eX], 14); tEntry[eY][eX][14] = '\0'; tEntry[eY][eX][15] = '\0'; } } void TLinkageProgram::RedrawParCnt() { unsigned int y, x; if(ParCntHasChanged == 0)return; for(y=0; y<4; y++){ for(x=0; x<4; x++){ if( ( (tEntry[y][x][0] >= '0') && (tEntry[y][x][0] <= '9') ) || (tEntry[y][x][0] == '*') || (tEntry[y][x][0] == '#') ) { if(tEntry[y][x][12] == 'X'){ if((ParCnt > 0) && (ParCnt < 10)){ tEntry[y][x][13] = ParCnt + '0'; }else{ tEntry[y][x][13] = ' '; } ShowOneGrid(x,y); } } } } } void TLinkageProgram::ClearGridSelected() { unsigned int x, y, aClr; int tWidth, tHeigth, InxY; if(eY < 4){ aClr = ItemColor; InxY = eY +1; }else{ aClr = ItemColor; InxY = eY +2; } x = GridX[eX] + 1; y = GridTop[InxY] +1; tWidth = GridX[eX+1] -GridX[eX] -2; tHeigth = GridBottom[InxY] - GridTop[InxY] -1; VertLineRender (x, y, tHeigth, aClr); VertLineRender (x+1, y, tHeigth, aClr); VertLineRender (x + tWidth -3, y, tHeigth, aClr); VertLineRender (x + tWidth -2, y, tHeigth, aClr); HorizLineRender (x, GridTop[InxY]+1, tWidth, aClr); HorizLineRender (x, GridTop[InxY]+2, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-1, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-0, tWidth, aClr); } void TLinkageProgram::DrawSelectedGrid(unsigned int oldX, unsigned int oldY, unsigned int NewX, unsigned int NewY) { unsigned int x, y, aClr; int tWidth, tHeigth, InxY; x = GridX[oldX] + 1; if(oldY < 4){ aClr = ItemColor; InxY = oldY +1; }else{ aClr = ItemColor; InxY = oldY +2; } x = GridX[oldX] + 1; y = GridTop[InxY] +1; tWidth = GridX[oldX+1] -GridX[oldX] -2; tHeigth = GridBottom[InxY] - GridTop[InxY] -1; VertLineRender (x, y, tHeigth, aClr); VertLineRender (x+1, y, tHeigth, aClr); VertLineRender (x + tWidth -3, y, tHeigth, aClr); VertLineRender (x + tWidth -2, y, tHeigth, aClr); HorizLineRender (x, GridTop[InxY]+1, tWidth, aClr); HorizLineRender (x, GridTop[InxY]+2, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-1, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-0, tWidth, aClr); x = GridX[NewX] + 1; if(NewY < 4){ InxY = NewY +1; }else{ InxY = NewY +2; } x = GridX[NewX] + 1; y = GridTop[InxY] +1; tWidth = GridX[NewX+1] -GridX[NewX] -2; tHeigth = GridBottom[InxY] - GridTop[InxY] -1; aClr = clBlue; VertLineRender (x, y, tHeigth, aClr); VertLineRender (x+1, y, tHeigth, aClr); VertLineRender (x + tWidth -3, y, tHeigth, aClr); VertLineRender (x + tWidth -2, y, tHeigth, aClr); HorizLineRender (x, GridTop[InxY]+1, tWidth, aClr); HorizLineRender (x, GridTop[InxY]+2, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-1, tWidth, aClr); HorizLineRender (x, GridBottom[InxY]-0, tWidth, aClr); } void TLinkageProgram::ShowOneGrid(unsigned int x, unsigned int y) { unsigned int pX, pY, i; int InxY; if(y<4){ InxY = y+1; }else{ InxY = y+2; } pX = GridX[x] + 4; pY = GridTop[InxY] + 2; for(i=0; i<18; i++)PathText[i] = '\0'; for(i=0; i<8; i++){ PathText[i] = tEntry[y][x][i]; } TMyString::sFillFixLen(PathText, 8); PathText[8] = ' '; for(i=0; i<3; i++){ PathText[i+9] = tEntry[y][x][i+8]; } TMyString::sFillFixLen(PathText, 12); if(y<4){ PathText[12] = ' '; PathText[13] = tEntry[y][x][11]; PathText[14] = tEntry[y][x][12]; PathText[15] = tEntry[y][x][13]; TMyString::sFillFixLen(PathText, 16); PathText[16] = '\0'; PathText[17] = '\0'; }else if(y<8){ PathText[12] = ' '; PathText[13] = tEntry[y][x][11]; PathText[14] = tEntry[y][x][12]; PathText[15] = tEntry[y][x][13]; PathText[16] = '\0'; PathText[17] = '\0'; } TMyString::sFillFixLen(PathText, 16); PathText[16] = '\0'; PathText[17] = '\0'; TextRender_string24(pX, pY ,clNearWhite, ItemColor, PathText); } void TLinkageProgram::ShowAllGrid() { unsigned int x, y; for(y=0; y<8; y++)for (x=0; x<4; x++)ShowOneGrid(x,y); } void TLinkageProgram::ShowEntryState() { if( EntryState == 0){ if(LanguageEnCn==0)TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "编号超限 "); else TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "Index Exceeds "); }else if( EntryState == 1){ if(LanguageEnCn==0)TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "已配置联动"); else TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "Valid Expression"); }else if( EntryState == 2){ if(LanguageEnCn==0)TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "新联动 "); else TextRender_string24(xEntryState, Lv.Grid.Top[1] +2, clNearWhite, ItemColor, "New Expression "); } } int TLinkageProgram::NewEntry() { int i, FoundEmpty; FoundEmpty = 0; for(i=0; i '9') ){ Uniquely = 0; break; } } Got = 0; iVal = EuCode.Str.ToInteger(); if(Uniquely && (iVal>0) ){ for(tP0=0; tP0= Port[tP0].UserCodeMin) && (iVal<= Port[tP0].UserCodeMax) ){ for(tP1=0; tP1<250; tP1++){ if(iVal == Port[tP0].UcList[tP1].Full){ if(Port[tP0].AssignType[tP1] != 0){ tType = Port[tP0].AssignType[tP1]; }else{ tType = Port[tP0].dTypeTable[tP1]; } Got = 1; } } } } if( (Got == 0) && (aIsInput == 0) ){ for(tP0=0; tP0 dLINKAGE_MAX_COUNT)return;; EditingLinkageIndex = aEntry -1; EEntry.Str.FromUInt4Dg(aEntry); EEntry.SetPstTail(); EEntry.Show(); if(ExistTabel[EditingLinkageIndex]){ EntryState = 1; LoadExp(EditingLinkageIndex); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); }else{ ShouldBeClear = 1; EntryState = 2; LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } ActX = 1; ClearPanelSelected(); DrawSelectedGrid(eX, eY, eX, eY); ShowEntryState(); } int TLinkageProgram::CheckUserCodeOk() { int iVal, IncludeAst; if(EuCode.Str.GetLength() != 8){ return 0; } for(int i=0;i<8;i++){ if( ((EuCode.Str.Text[i] < '0') || (EuCode.Str.Text[i] >'9')) && (EuCode.Str.Text[i] != '*') )return 0; } IncludeAst = 0; for(int i=0;i<8;i++){ if(EuCode.Str.Text[i] == '*')IncludeAst =1; } if(IncludeAst == 0){ iVal = EuCode.Str.ToInteger(); if(iVal == 0)return 0; } return 1; } int TLinkageProgram::CheckTypeOk() { int iVal; if(EdType.Str.GetLength() != 3)return 0; if(IsInput){ if( (EdType.Str.Text[0]=='*') or (EdType.Str.Text[1]=='*') or (EdType.Str.Text[2]=='*') )return 0; iVal = EdType.Str.ToInteger(); if( iVal>0 and iVal<256){ return 1; } }else{ if( (EdType.Str.Text[0]=='*') and (EdType.Str.Text[1]=='*') and (EdType.Str.Text[2]=='*'))return 1; if((EdType.Str.Text[0]=='*') or (EdType.Str.Text[1]=='*') or (EdType.Str.Text[2]=='*'))return 0; iVal = EdType.Str.ToInteger(); if(iVal>0 && iVal<256){ return 1; } } return 0; } TGuiMsgReturn TLinkageProgram::KeyIn(unsigned char aKey) { TGuiMsgReturn aMsg = guiMsgNone, PmsRtnMsg; int iVal; unsigned char NewPath0; unsigned char LoadKey; unsigned char tType; char LastChr; if(IsWhowingTip){ if(aKey == VK_EXECUTE){ Inx = 0; RenderGridBack(); InitPanel(); IsWhowingTip = 0; if(ShouldBeClear){ LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } if(ShouldBeLoad){ LoadExp(EditingLinkageIndex); ShowAllGrid(); } }else if(aKey == VK_RETURN){ return guiMsgReturn; } }else 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{ if(ActX >2){ ActX = 0; } if(ActX == 0){ 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: if(Inx == 0){ if(aKey == VK_RIGHT){ if( EEntry.Str.GetEndPst() <= EEntry.Pst){ ClearSelected(); Inx =1; Check4Selected(); } } if(Inx == 0){ EEntry.KeyIn(aKey); EEntry.ReDraw(); iVal = EEntry.Str.ToInteger(); if(iVal > dLINKAGE_MAX_COUNT){ EntryState = 0; }else if(iVal <1 ){ EntryState = 0; }else{ EditingLinkageIndex = iVal -1; if(ExistTabel[EditingLinkageIndex]){ ShouldBeLoad = 1; EntryState = 1; LoadExp(EditingLinkageIndex); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); }else{ ShouldBeClear = 1; EntryState = 2; LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } } ShowEntryState(); } }else{ if(aKey == VK_LEFT){ if( (Inx > 0) && (Inx<4) ){ ClearSelected(); Inx --; Check4Selected(); }else if( (Inx == 5) || ( Inx == 6) ){ ClearSelected(); Inx --; Check4Selected(); } }else if(aKey == VK_RIGHT){ if( (Inx==1) || (Inx==2) || (Inx==4) || (Inx==5) ){ ClearSelected(); Inx ++; Check4Selected(); } } } break; case VK_UP: if(Inx == 0){ TryIncValue(0); if(EntryState == 2){ LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } if(EntryState == 1){ LoadExp(EditingLinkageIndex); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } }else if(Inx > 3){ ClearSelected(); Inx =3; Check4Selected(); } break; case VK_DOWN: if(Inx==0){ TryDecValue(0); if(EntryState == 2){ LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); }else if(EntryState == 1){ LoadExp(EditingLinkageIndex); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } }else if( (Inx==4) || (Inx==5) || (Inx==6) ){ ActX = 1; ClearSelected(); DrawSelectedGrid(eX, eY, eX, eY); }else if( (Inx==1) || (Inx==2) || (Inx==3)){ ClearSelected(); Inx =4; Check4Selected(); } break; case dfKEY_SETUP: //0x70 // Key value for SETUP if(Inx == 0){ TryDecValue(0); if(EntryState == 2){ LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); }else if(EntryState == 1){ LoadExp(EditingLinkageIndex); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } }else if(Inx == 1){ if(DoStop){ DoStop = 0; }else{ DoStop = 1; } DrawActiveByStartStop(); }else if(Inx == 2){ if(IsMask){ IsMask = 0; }else{ IsMask = 1; } DrawIsMask(); }else if(Inx == 3){ if(IsSelfActive){ IsSelfActive = 0; }else{ IsSelfActive = 1; } DrawIsSelfActive(); } break; case dfKEY_QUERY: //0x71 // Key value for QUERY if(Inx == 0){ ClearSelected(); Inx =1; Check4Selected(); } break; case VK_TAB: ActX = 1; ClearSelected(); DrawSelectedGrid(eX, eY, eX, eY); break; case VK_EXECUTE: if(Inx == 1){ if(DoStop){ DoStop = 0; }else{ DoStop = 1; } DrawActiveByStartStop(); }else if(Inx == 2){ if(IsMask){ IsMask = 0; }else{ IsMask = 1; } DrawIsMask(); }else if(Inx == 3){ if(IsSelfActive){ IsSelfActive = 0; }else{ IsSelfActive = 1; } DrawIsSelfActive(); }else if(Inx == 4){ //Save if(EntryState){ PermissionCmd = 1; if(SystemPermission > 2){ PermissionCmdGO(); }else{ IsPermission = 1; ClearSelected(); PmsIntervene4Gui.Show4Gui(Lv.Grid.Left[2] + 200, Lv.Grid.Top[2] + 16, 400, 140, 3); } } }else if(Inx == 5){ //Delete if( EntryState ==1 ){ PermissionCmd = 0; if(SystemPermission > 2){ PermissionCmdGO(); }else{ IsPermission = 1; ClearSelected(); PmsIntervene4Gui.Show4Gui(Lv.Grid.Left[2] + 200, Lv.Grid.Top[2] + 16, 400, 140, 3); } }else if(EntryState == 2){ LoadExpVoid(); DrawIsMask(); DrawActiveByStartStop(); DrawIsSelfActive(); ShowAllGrid(); } }else if(Inx == 6){ //New if(NewEntry() == 0){ EntryState = 2; ActX = 1; ClearPanelSelected(); DrawSelectedGrid(eX, eY, eX, eY); } } break; case VK_RETURN: aMsg = guiMsgReturn; break; } }else if(ActX == 1){ switch(aKey){ case VK_LEFT: if (eX >0){ eX--; DrawSelectedGrid(eX+1, eY, eX, eY); } break; case VK_RIGHT: if (eX <3){ eX++; DrawSelectedGrid(eX-1, eY, eX, eY); } break; case VK_UP: if( eY >0){ eY--; DrawSelectedGrid(eX, eY+1, eX, eY); }else{ ActX = 0; Inx = 4; ClearGridSelected(); Check4Selected(); } break; case VK_DOWN: if( eY <7){ eY++; DrawSelectedGrid(eX, eY-1, eX, eY); } break; case dfKEY_SETUP: //0x70 // Key value for SETUP //Save Here break; case VK_TAB: ActX = 0; Inx = 4; ClearGridSelected(); Check4Selected(); break; case VK_DELETE: EntryClear(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case VK_DECIMAL: case VK_OEM_2: case VK_EXECUTE: ActX = 2; eWhat = 0; ShowItemEdit(); CheckEWhatWhoActive(); RedrawEEdit(); break; case VK_RETURN: aMsg = guiMsgReturn; break; } }else if(ActX == 2){ if(IsInput){ switch(aKey){ case dfKEY_ENCN: break; 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: case VK_DECIMAL: case VK_OEM_2: if(eWhat == 0){ EuCode.KeyIn(aKey); EuCode.Show(); CheckUserCodeUniquely(1); }else if(eWhat == 1){ if( (aKey != VK_DECIMAL) && (aKey != VK_OEM_2)){ EdType.KeyIn(aKey); CheckShowDevType(); } }else if(eWhat == 2){ if( (aKey != VK_DECIMAL) && (aKey != VK_OEM_2) ) { EInnerCount.KeyIn(aKey); EInnerCount.Show(); } }else if(eWhat == 3){ if(tLogic == '+')tLogic = 'X'; else tLogic = '+'; if(tLogic == '+')if(LanguageEnCn==0)ELogic.Str.FromStr("或"); else ELogic.Str.FromStr("or"); else if (tLogic == 'X')if(LanguageEnCn==0)ELogic.Str.FromStr("与"); else ELogic.Str.FromStr("And"); else ELogic.Str.FromStr(" "); ELogic.Show(); }else if(eWhat == 4){ if( (aKey != VK_DECIMAL) && (aKey != VK_OEM_2) ) { EInCount.KeyIn(aKey); EInCount.Show(); } } break; case VK_UP: if(eWhat >0){ eWhat--; CheckEWhatWhoActive(); RedrawEEdit(); } break; case VK_DOWN: if(eWhat <4){ eWhat++; CheckEWhatWhoActive(); RedrawEEdit(); } break; case dfKEY_SETUP: //0x70 // Key value for SETUP break; case dfKEY_QUERY: //0x71 // Key value for QUERY break; case VK_EXECUTE: if(TryRestoreFromEdit() == 0){ RestoreFromEdit(); RedrawParCnt(); } ActX = 1; RenderGridBack(); DrawGridLine(); ShowAllGrid(); DrawSelectedGrid(eX, eY, eX, eY); break; case VK_RETURN: ActX = 1; RenderGridBack(); DrawGridLine(); ShowAllGrid(); DrawSelectedGrid(eX, eY, eX, eY); break; } }else{ switch(aKey){ case dfKEY_ENCN: break; 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: case VK_DECIMAL: case VK_OEM_2: if(eWhat == 0){ EuCode.KeyIn(aKey); EuCode.Show(); CheckUserCodeUniquely(0); }else if(eWhat == 1){ if(aKey != VK_OEM_2){ EdType.KeyIn(aKey); CheckShowDevType(); } }else{ if( (aKey != VK_DECIMAL) && (aKey != VK_OEM_2) ){ EDelay.KeyIn(aKey); EDelay.Show(); } } break; case VK_UP: if(eWhat >0){ eWhat--; CheckEWhatWhoActive(); RedrawEEdit(); } break; case VK_DOWN: if(eWhat <2){ eWhat++; CheckEWhatWhoActive(); RedrawEEdit(); } break; case dfKEY_SETUP: //0x70 // Key value for SETUP break; case dfKEY_QUERY: //0x71 // Key value for QUERY break; case VK_EXECUTE: if(CheckUserCodeOk() && CheckTypeOk()){ if(TryRestoreFromEdit() == 0){ RestoreFromEdit(); } ActX = 1; RenderGridBack(); DrawGridLine(); ShowAllGrid(); DrawSelectedGrid(eX, eY, eX, eY); }else{ } break; case VK_RETURN: ActX = 1; RenderGridBack(); DrawGridLine(); ShowAllGrid(); DrawSelectedGrid(eX, eY, eX, eY); break; } } } } return aMsg; } void TLinkageProgram::CheckShowDevType() { int iVal; if(EdType.Str.GetLength() != 3){ EdType.SelectedColor = clRed; if(LanguageEnCn==0)STextDType.SetText("输入不完整",24); else STextDType.SetText("Dev Invalid",24); }else{ if(IsInput){ iVal = EdType.Str.ToInteger(); if( (iVal > 0) && (iVal < 256)){ EdType.SelectedColor = clBlue; if(LanguageEnCn==0){ STextDType.SetText(StrTypeShortName[iVal],24); }else{ STextDType.SetText(StrTypeShortNameEn[iVal],24); } }else{ EdType.SelectedColor = clRed; if(LanguageEnCn==0)STextDType.SetText( "类型超出范围",24); else STextDType.SetText( "Dev Type Invalid",24); } }else{ if(EdType.Str.Text[0] == '*' and EdType.Str.Text[1]=='*' and EdType.Str.Text[2]=='*' and EdType.Str.Text[3]=='\0'){ EdType.SelectedColor = clBlue; if(LanguageEnCn==0){ STextDType.SetText("所有输出类型",24); }else{ STextDType.SetText("All Out Type",24); } }else if(EdType.Str.Text[0]=='*' or EdType.Str.Text[1]=='*' or EdType.Str.Text[2]=='*'){ EdType.SelectedColor = clRed; if(LanguageEnCn==0)STextDType.SetText( "类型超出范围",24); else STextDType.SetText( "Dev Type Invalid",24); }else{ iVal = EdType.Str.ToInteger(); if( (iVal > -1) && (iVal < 256)){ EdType.SelectedColor = clBlue; if(LanguageEnCn==0){ if(iVal == 0){ EdType.SelectedColor = clRed; STextDType.SetText("无效类型",24); }else{ STextDType.SetText(StrTypeShortName[iVal],24); } }else{ if(iVal == 0){ EdType.SelectedColor = clRed; STextDType.SetText("Invalid Type",24); }else{ STextDType.SetText(StrTypeShortNameEn[iVal],24); } } }else{ EdType.SelectedColor = clRed; if(LanguageEnCn==0)STextDType.SetText( "类型超出范围",24); else STextDType.SetText( "Dev Type Invalid",24); } } } } EdType.Show(); STextDType.Show(); } void TLinkageProgram::ShowItemEdit() { #define FixColColor clMedGray #define OddColor clNearMoneyGreen unsigned int clr; unsigned int x, y, x2, y2, w, h; int iVal; if(eY <4)IsInput =1; else IsInput = 0; if(IsInput){ x = 200; x2 = 600; y = 150; y2 = 430; w = 400; h = 280; }else{ x = 200; x2 = 600; y = 150; y2 = 350; w = 400; h = 200; } VertLineRender(x, y, h -1, 0xFFFFFFFF); VertLineRender(x2 -1, y +1, h -2, 0xFF808080); VertLineRender(x2, y, h, 0xFF404040); HorizLineRender(x, y, w - 1, 0xFFFFFFFF); HorizLineRender(x +1, y2 -1, w- 2, 0xFF808080); HorizLineRender(x, y2, w, 0xFF404040); RectFillRender(x+1, y+2, x2-3, y+37, clNavy); RectFillRender(x+1, y+38, x2-3, y2-2, clFrmFace); if(LanguageEnCn==0){ if (IsInput) TextRender_string24(x +8, y + 6,clNearWhite, "编辑条目细节-输入"); else TextRender_string24(x +8, y + 6,clNearWhite, "编辑条目细节-输出"); TextRender_string24(x +8, y + 48,clNearBlack, "设备编码:"); TextRender_string24(x +8, y + 88,clNearBlack, "设备类型:"); if (IsInput){ TextRender_string24(x +8, y +168,clNearBlack, "逻辑关系:"); }else{ TextRender_string24(x +8, y +128,clNearBlack, "延时时间:"); } }else{ if (IsInput) TextRender_string24(x +8, y + 6,clNearWhite, "Edit-Input"); else TextRender_string24(x +8, y + 6,clNearWhite, "Edit-Output"); TextRender_string24(x +8, y + 48,clNearBlack, "AuxID:"); TextRender_string24(x +8, y + 88,clNearBlack, "Dev Type:"); if (IsInput){ TextRender_string24(x +8, y +168,clNearBlack, "Logical:"); }else{ TextRender_string24(x +8, y +128,clNearBlack, "Delay Sec:"); } } EuCode.Init(x+120,y+ 48,120,30,0,0,clNearBlack,clNearWhite); EuCode.SetMaxLen(8); EuCode.Str.FromStr("xxxxxxxx"); EuCode.Pst = 7; EdType.Init(x+120,y+ 88,46,30,0,0,clNearBlack,clNearWhite); EdType.SetMaxLen(3); EdType.Str.FromStr("xxx"); EdType.Pst = 2; EInnerCount.Init(x+120,y+128,46,30,0,0,clNearBlack,clNearWhite); if(IsInput){ ELogic.Init(x+120,y+168,46,30,0,0,clNearBlack,clNearWhite); ELogic.SetMaxLen(2); if(LanguageEnCn==0)ELogic.Str.FromStr("或"); else ELogic.Str.FromStr("or"); ELogic.IsShowCursor = 0; ELogic.Pst = 1; }else{ EDelay.Init(x+120,y+128,46,30,0,0,clNearBlack,clNearWhite); EDelay.SetMaxLen(3); EDelay.Str.FromStr("600"); EDelay.IsShowCursor = 1; EDelay.Pst = 2; } EInCount.Init(x+120,y+208,46,30,0,0,clNearBlack,clNearWhite); SetEditStart(); EuCode.SetPstTail(); EdType.SetPstTail(); EuCode.Show(); EdType.Show(); if(IsInput){ ELogic.SetPstTail(); ELogic.Show(); EInnerCount.SetMaxLen(1); EInCount.SetMaxLen(1); EInnerCount.SetPstTail(); EInCount.SetPstTail(); EInnerCount.Show(); EInCount.Show(); }else{ EDelay.SetPstTail(); EDelay.Show(); } STextDType.Init(x + 170, y+ 88, 200, 30,0,0,clNearBlack,clFrmFace); CheckShowDevType(); if(LanguageEnCn==0){ if(IsInput){ TextRender_string24(x +8, y +128,clNearBlack, "内部数量:"); TextRender_string24(x +168, y +128,clNearBlack, "范围:1~9"); TextRender_string24(x +8, y +208,clNearBlack, "输入数量:"); TextRender_string24(x +168, y +208,clNearBlack, "范围:1~9"); TextRender_string24(x +22, y +248,clNearBlack, "确认键执行修改,返回键放弃修改"); }else{ TextRender_string24(x +22, y +168,clNearBlack, "确认键执行修改,返回键放弃修改"); } }else{ if(IsInput){ TextRender_string24(x +8, y +128,clNearBlack, "Internal:"); TextRender_string24(x +168, y +128,clNearBlack, "Scope:1..9"); TextRender_string24(x +8, y +208,clNearBlack, "And Num:"); TextRender_string24(x +168, y +208,clNearBlack, "Scope:1..9"); TextRender_string24(x +22, y +248,clNearBlack, "Key OK Modify, Or Return"); }else{ TextRender_string24(x +22, y +168,clNearBlack, "Key OK Modify, Or Return"); } } if(IsInput){ x2 = x + 170; y2 = y + 168 + 6; y2 += 9; h =3; for(w=0; w<10; w++){ VertLineRender(x2, y2, h, clNearBlack); y2--; h += 2; x2++; } x2 = x + 170 + 14; y2 = y + 168 + 6; y2 += 0; h =21; for(w=0; w<10; w++){ VertLineRender(x2, y2, h, clNearBlack); x2++; h -= 2; y2++; } } } void TLinkageProgram::RedrawEEdit() { EuCode.Show(); EdType.Show(); if(IsInput){ EInnerCount.Show(); ELogic.Show(); EInCount.Show(); }else{ EDelay.Show(); } } void TLinkageProgram::CheckEWhatWhoActive() { EuCode.Selected = 0; EdType.Selected = 0; EInnerCount.Selected = 0; ELogic.Selected = 0; EInCount.Selected = 0; EDelay.Selected = 0; if(eWhat == 0) EuCode.Selected = 1; else if(eWhat == 1) EdType.Selected = 1; else{ if(IsInput){ if(eWhat == 2)EInnerCount.Selected = 1; else if(eWhat == 3)ELogic.Selected = 1; else if(eWhat == 4)EInCount.Selected = 1; }else{ EDelay.Selected = 1; } } } void TLinkageProgram::RedrawItemEdit() { } void TLinkageProgram::LoadExp(unsigned int aExp) { unsigned int x,y,i; unsigned int SysLinkAddr; unsigned int aAddr4Char; unsigned int aAddr4Int; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(*(volatile unsigned char *)(SysLinkAddr + 4) == 'M')IsMask =1; else IsMask=0; if(*(volatile unsigned char *)(SysLinkAddr + 5) == 'S')DoStop =1; else DoStop=0; if(*(volatile unsigned char *)(SysLinkAddr + 6) == 'F')IsSelfActive =1; else IsSelfActive=0; for(y=0; y<8; y++){ for(x=0; x<4; x++){ aAddr4Char = SysLinkAddr + (y * 4 * 16) + (x * 16) + 16; for(i=0; i<16; i++){ tEntry[y][x][i] = *(volatile unsigned char *)(aAddr4Char++); } tEntry[y][x][16] = '\0'; tEntry[y][x][17] = '\0'; } } } void TLinkageProgram::LoadExpVoid() { unsigned int x,y,i; for(y=0; y<8; y++){ for(x=0; x<4; x++){ for(i=0; i<16; i++){ tEntry[y][x][i] = '\0'; } tEntry[y][x][16] = '\0'; tEntry[y][x][17] = '\0'; } } IsMask = 0; DoStop = 0; IsSelfActive = 0; } void TLinkageProgram::RestoreExp(unsigned int aExp) { unsigned int x,y,i; unsigned int SysLinkAddr; unsigned int aAddr4Char; unsigned int aAddr4Int; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); aAddr4Char = SysLinkAddr; *(volatile unsigned char *)(aAddr4Char++) = 'T'; *(volatile unsigned char *)(aAddr4Char++) = 'R'; *(volatile unsigned char *)(aAddr4Char++) = 'U'; *(volatile unsigned char *)(aAddr4Char++) = 'E'; SetLnkMask(aExp); SetLnkDoStop(aExp); SetLnkSelfActive(aExp); for(y=0; y<8; y++){ for(x=0; x<4; x++){ aAddr4Char = SysLinkAddr + (y * 4 * 16) + (x * 16) + 16; for(i=0; i<16; i++){ *(volatile unsigned char *)(aAddr4Char++) = tEntry[y][x][i]; } } } } void TLinkageProgram::GetLnkMask(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(*(volatile unsigned char *)(SysLinkAddr + 4) == 'M'){ IsMask = 1; }else{ IsMask = 0; } } void TLinkageProgram::SetLnkMask(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(IsMask){ *(volatile unsigned char *)(SysLinkAddr + 4) = 'M'; }else{ *(volatile unsigned char *)(SysLinkAddr + 4) = ' '; } } void TLinkageProgram::GetLnkDoStop(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(*(volatile unsigned char *)(SysLinkAddr + 5) == 'S'){ DoStop = 1; }else{ DoStop = 0; } } void TLinkageProgram::GetLnkSelfActive(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(*(volatile unsigned char *)(SysLinkAddr + 6) == 'F'){ IsSelfActive = 1; }else{ IsSelfActive = 0; } } void TLinkageProgram::SetLnkDoStop(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(DoStop){ *(volatile unsigned char *)(SysLinkAddr + 5) = 'S'; }else{ *(volatile unsigned char *)(SysLinkAddr + 5) = ' '; } } void TLinkageProgram::SetLnkSelfActive(unsigned int aExp) { unsigned int SysLinkAddr; SysLinkAddr = dSdAddrLinkageExp + (aExp * 1024); if(IsSelfActive){ *(volatile unsigned char *)(SysLinkAddr + 6) = 'F'; }else{ *(volatile unsigned char *)(SysLinkAddr + 6) = ' '; } }