📄 main.c
字号:
TransmitCommand();
break;
case 0xC0: //GetResponse
if (Flag6F38 == 1) // 截获6F38,
{
SendSCommStr0(SIMServerRESPONSE,Header[4]+1,ME);
HookResp();
break;
}
TransmitCommand();
break;
case 0xB0: //ReadBinary
if (Flag6F38 == 1) // 截获6F38,
{
SendSCommStr0(SIMServerTable,Header[4]+1,ME);
SendSCommChar0(0x91,ME);
SendSCommChar0(MENULENGTH/*0x40*/,ME);
break;
}
if (Flag6FAE == 1) // 截获6FAE,发送自己的 支持STK
{
SendSCommStr0(PhaseID,2,ME);//PhaseID
AnswerNoData();
break;
}
TransmitCommand();
break;
case 0xB2: //ReadRecord
TransmitCommand();
break;
//OUT
case 0xA4: //Select file
SelectFile();
break;
case 0xC2: //MenuENVELOPE
{
SendSCommChar0(Header[1],ME);
for (i=0; i<Header[4]; i++) //Header[4] - length
{
ch = GetSCommChar0(ME,0);
}
FetchMenuFlag = 1;
switch (ch)
{
case 1: //选择sim1
FlagToReset = 1;
SwitchFlag = 0;
SelectSimCard = SIM1;
break;
case 2: //选择sim2
FlagToReset = 1;
SwitchFlag = 0;
SelectSimCard = SIM2;
break;
case 3: //选择sim1与sim2切换
FlagToReset = 1;
SwitchFlag = 1;
break;
case 4: //快速切换
SwitchSpeed = EXPRESS;
HOOKFlag = 1;
break;
case 5: //正常切换
SwitchSpeed = NORMAL;
HOOKFlag = 1;
break;
case 6: //慢速切换
SwitchSpeed = SLOW;
HOOKFlag = 1;
break;
case 7: //切换菜单语言
if (MenuType == 1)
MenuType = 0;
else
MenuType = 1;
FlagToReset = 1;
break;
default:
break;
}
SaveData();
HookResp();
break;
}
case 0x10: //TerminalProfile
SendSCommChar0(Header[1],ME);
for (i=0; i<Header[4]; i++) //Header[4] - length
{
ch = GetSCommChar0(ME,0);
}
HOOKFlag = 1;
HookResp();
break;
case 0x14: //Terminal Response
SendSCommChar0(Header[1],ME);
for (i=0; i<Header[4]; i++) //Header[4] - length
{
ch = GetSCommChar0(ME,0);
}
FetchMenuFlag = 0;
/* if (FlagToReset == 0x55)
{
if (Header[4] != 0xc)
{
if (BeginSwitchFlag == 0x2) //??? !=
{
if (ch != 0x0)
{
if (SelectSimCard == SIM1)
{
SelectSimCard = SIM2;
}
else
{
SelectSimCard = SIM1;
}
SaveData();
}
}
else
{
FlagToReset = 0x1;
}
}
}
*/ AnswerNoData();
break;
case 0x44: //Invalidate
case 0xFA: //Invalidate
case 0x04: //Invalidate
case 0xD6:
case 0xDC:
case 0xA2:
case 0x32:
case 0x20:
case 0x24:
case 0x26:
case 0x28:
case 0x2C:
case 0x88:
if (SimType == 0xaa) //反向协议
{
SendSCommStr0V(Header,5,SelectSimCard);
i = GetSCommChar0(SelectSimCard,0);
SendSCommChar0V(i,ME); //i = GetSCommChar0(SelectSimCard,ME); //应答指令
FlagVFrist = 1; //反向传输时第一个字节标志,第一个字节不转发
for (i=0; i<Header[4]; i++) //Header[4] - length
{
GetChar = GetSCommChar0V(ME,SelectSimCard);
FlagVFrist = 0;
}
SendSCommChar0V(GetChar,SelectSimCard); //发送错后的字节
for (;;)
{
GetChar = GetSCommChar0(SelectSimCard,0); //应答1
if (GetChar == 0xF9) //0x60的倒序
SendSCommChar0V(i,ME);
else
break;
}
FlagVFrist = 0;
GetChar = GetSCommChar0V(SelectSimCard,ME);
SendSCommChar0V(GetChar,ME); //发送错后的字节
}
else
{
SendSCommStr0(Header,5,SelectSimCard);
i = GetSCommChar0(SelectSimCard,ME); //应答指令
for (i=0; i<Header[4]; i++) //Header[4] - length
{
GetSCommChar0(ME,SelectSimCard);
}
do
{
i = GetSCommChar0(SelectSimCard,ME); //应答1
} while (i == 0x60);
GetSCommChar0(SelectSimCard,ME); //应答2
}
break;
default:
SendSCommChar0(0x6d,ME);
SendSCommChar0(Header[1],ME);
break;
}
}
}
}
void TransmitCommand(void)
{
unsigned char i,ch;
if (SimType == 0xaa) //反向协议
{
SendSCommChar0(0x60,ME); // 令手机延时等待
SendSCommStr0V(Header,5,SelectSimCard);
FlagVFrist = 1;
retry0: GetChar = GetSCommChar0V(SelectSimCard,ME); //应答指令
FlagVFrist = 0;
if (GetChar == Reverse(Header[1]))
{
for (i=0; i<Header[4]; i++) //Header[4] - length
{
GetChar = GetSCommChar0V(SelectSimCard,ME);
}
do
{
GetChar = GetSCommChar0V(SelectSimCard,ME);
} while ( GetChar == 0xF9); //0x60的倒序
HookResp();
return;
}
if (GetChar == 0xF9) goto retry0;
GetChar = GetSCommChar0V(SelectSimCard,ME);
SendSCommChar0V(GetChar,ME); //发送错后的字节
}
else
{
SendSCommChar0(0x60,ME); // 令手机延时等待
SendSCommStr0(Header,5,SelectSimCard);
retry: DataBuffer[0] = GetSCommChar0(SelectSimCard,ME); //应答指令
if (DataBuffer[0] == Header[1])
{
for (i=0; i<Header[4]; i++) //Header[4] - length
{
if ( i> 31 )
{
GetSCommChar0(SelectSimCard,ME);
}
else
{
DataBuffer[i+1]=GetSCommChar0(SelectSimCard,ME);
}
}
while (GetSCommChar0(SelectSimCard,0) == 0x60);
HookResp();
return;
}
if (DataBuffer[0] == 0x60) goto retry;
ch = GetSCommChar0(SelectSimCard,ME);
}
}
void HookResp(void)
{
if (FetchMenuFlag)
{
if (ReadyToSendDataLength)
{
SendSCommChar0(0x91,ME);
SendSCommChar0(ReadyToSendDataLength,ME);
}
else
{
if (HOOKFlag == 0x1)
{
ReadyToSendDataLength = MENULENGTH;//0x40;
SendSCommChar0(0x91,ME);
SendSCommChar0(ReadyToSendDataLength,ME);
}
else
{
if (FlagToReset == 0x1)
{
// if (ResetFailFlag >= 1) return; //临时复位办法
ResetFailFlag ++;
ReadyToSendDataLength = 0x0b; //菜单选择复位
SendSCommChar0(0x91,ME);
SendSCommChar0(ReadyToSendDataLength,ME);
}
else
{
if (FlagCommandStatus <= 0x2) //刚刚设置菜单
{
FlagCommandStatus++;
ReadyToSendDataLength = 0x0f; //有设置Poll间隔要发送
SendSCommChar0(0x91,ME);
SendSCommChar0(ReadyToSendDataLength,ME);
}
else
{
if (BeginSwitchFlag == 0x1) //切换时间到
{
ReadyToSendDataLength = 0x0b; //SIM复位
SendSCommChar0(0x91,ME);
SendSCommChar0(ReadyToSendDataLength,ME);
}
else
{
AnswerNoData(); //不应答可强制复位
}
}
}
}
}
}
else
{
AnswerNoData();
}
}
void SelectFile(void)
{
unsigned char ch;
SendSCommChar0(0x60,ME); // 令手机延时等待
if (BootFlag)
{
for (ch =0;ch<40;ch++)
{
Test_Count = TESTCOUNTVALUE*20;
GetSCommChar0_Test(SelectSimCard,0); //去除卡初始化未发出的数据
if (Test_Count == 0) break;
}
BootFlag = 0;
}
if (SimType == 0xaa) //反向协议
{
SendSCommStr0V(Header,5,SelectSimCard);
FlagVFrist = 1;
do
{
GetChar = GetSCommChar0V(SelectSimCard,ME); //应答指令
FlagVFrist = 0;
if ((GetChar != Reverse(Header[1]))&&(GetChar != 0xF9))
{
GetChar = GetSCommChar0V(SelectSimCard,ME);
SendSCommChar0V(GetChar,ME); //发送错后的字节
return;
}
} while (GetChar == 0xF9);
SendSCommChar0V(GetChar,ME); //发送错后的字节
DataBuffer[6] = GetSCommChar0(ME,0);
DataBuffer[7] = GetSCommChar0(ME,0);
if (DataBuffer[6] == 0x6F)
{
if (DataBuffer[7] == 0xAE)
{
Flag6FAE = 1; // 截获6FAE,发送自己的 支持STK
}
else
{
if (DataBuffer[7] == 0x38)
Flag6F38 = 1;
else
{
Flag6F38 = 0;
Flag6FAE = 0;
}
}
}
else
{
Flag6F38 = 0;
Flag6FAE = 0;
}
SendSCommChar0V(DataBuffer[6],SelectSimCard);
SendSCommChar0V(DataBuffer[7],SelectSimCard);
FlagVFrist = 1;
GetChar = GetSCommChar0V(SelectSimCard,ME);
FlagVFrist = 0;
GetChar = GetSCommChar0V(SelectSimCard,ME);
SendSCommChar0V(GetChar,ME);
}
else
{
SendSCommStr0(Header,5,SelectSimCard);
do
{
DataBuffer[5] = GetSCommChar0(SelectSimCard,ME);
if ((DataBuffer[5] != Header[1])&&(DataBuffer[5] != 0x60))
{
GetSCommChar0(SelectSimCard,ME);
return;
}
} while (DataBuffer[5] == 0x60);
DataBuffer[6] = GetSCommChar0(ME,0);
DataBuffer[7] = GetSCommChar0(ME,0);
if (DataBuffer[6] == 0x6F)
{
if (DataBuffer[7] == 0xAE)
{
Flag6FAE = 1; // 截获6FAE,发送自己的 支持STK
}
else
{
if (DataBuffer[7] == 0x38)
Flag6F38 = 1;
else
{
Flag6F38 = 0;
Flag6FAE = 0;
}
}
}
else
{
Flag6F38 = 0;
Flag6FAE = 0;
}
SendSCommChar0(DataBuffer[6],SelectSimCard);
SendSCommChar0(DataBuffer[7],SelectSimCard);
DataBuffer[8] = GetSCommChar0(SelectSimCard,ME);
DataBuffer[9] = GetSCommChar0(SelectSimCard,ME);
}
}
void SendCount(void)
{
SCount ++;
if (SCount == 0xff)
SCount = 1;
SendSCommChar0(SCount,ME);
}
void AnswerNoData(void)
{
ReadyToSendDataLength = 0;
SendSCommChar0(0x90,ME);
SendSCommChar0(0x00,ME);
}
void SaveData(void)
{
if (CBYTE[SAVEADDRESS] != SelectSimCard)
goto Write;
if (CBYTE[SAVEADDRESS+1] != Sim1Type)
goto Write;
if (CBYTE[SAVEADDRESS+2] != Sim2Type)
goto Write;
if (CBYTE[SAVEADDRESS+3] != SwitchFlag)
goto Write;
if (CBYTE[SAVEADDRESS+4] != SwitchSpeed)
goto Write;
if (CBYTE[SAVEADDRESS+5] != MenuType)
{
Write: EraseFlash(SAVEADDRESS);
WriteCode(SAVEADDRESS,SelectSimCard);
WriteCode(SAVEADDRESS+1,Sim1Type);
WriteCode(SAVEADDRESS+2,Sim2Type);
WriteCode(SAVEADDRESS+3,SwitchFlag);
WriteCode(SAVEADDRESS+4,SwitchSpeed);
WriteCode(SAVEADDRESS+5,MenuType);
}
}
void WriteCode(unsigned char xdata * codePtr,unsigned char byte)
{
bit EA_state=EA;
EA = 0; // Disable interrupts
FLKEY=0xA5; // Input first key code
FLKEY=0xF1; // Input second key code,
// FLASH is now unlocked
PSCTL |= 0x01; // Enable FLASH Writes
*codePtr = byte;
PSCTL &= ~0x01; // disable FLASH Writes
EA = EA_state; // Restore interrupt state
}
void EraseFlash(unsigned char xdata * codePtr)
{
bit EA_state=EA;
EA = 0; // Disable interrupts
PSCTL |= 0x02; //allow erase and write
PSCTL |= 0x01; // Enable FLASH Writes
FLKEY=0xA5; // Input first key code
FLKEY=0xF1; // Input second key code,
// FLASH is now unlocked
*codePtr = 0xff;
PSCTL &= ~0x03; // disable FLASH Writes
EA = EA_state; // Restore interrupt state
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -