278 lines
7.5 KiB
C
278 lines
7.5 KiB
C
|
/*
|
|||
|
* File: wf200s_rtcc_app.c
|
|||
|
* Author: KingRay
|
|||
|
*
|
|||
|
* Created on June 14, 2016, 4:22 PM
|
|||
|
*/
|
|||
|
#include "sys_config.h"
|
|||
|
#if CARD_USED
|
|||
|
#include "UWater_timer1uS_driver.h"
|
|||
|
#include "UWater_card_5557_driver.h"
|
|||
|
#include "UWater_Valve_driver.h"
|
|||
|
|
|||
|
#include "UWater_rtcc_app.h"
|
|||
|
#include "UWater_key_app.h"
|
|||
|
#include "UWater_gp22_app.h"
|
|||
|
#include "UWater_Valve_app.h"
|
|||
|
#include "UWater_card_5557_app.h"
|
|||
|
|
|||
|
#include "libbase.h"
|
|||
|
|
|||
|
Card_Data card_source_data;
|
|||
|
S_Card_Type1_Data card_source_data_congigue1_use;
|
|||
|
BOOL card_in = FALSE;
|
|||
|
BOOL card_read_sucess = FALSE;
|
|||
|
static u8 card_output_msg = CARD_NONE_MSG; //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
//Meter_Event_Para card_use_meter_state;
|
|||
|
//S_Flash_Data_Processor_Para flash_data_processor_temp_para;
|
|||
|
u8 card_key_machine_state = CARD_KEY_M_S0;
|
|||
|
u8 card_key_check_num = 0;
|
|||
|
BOOL card_key_flag = FALSE;
|
|||
|
|
|||
|
void card_generate_key(u8* buf, u8* key);
|
|||
|
|
|||
|
void SearchCardApp(void)
|
|||
|
{
|
|||
|
if(RtccCheckTimer(RTCC_CARD_SEARCH_TIME) == 0)//<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>GP30<33><30><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>,2s<32><73><EFBFBD><EFBFBD>һ<EFBFBD>ο<EFBFBD>Ƭ,<2C><><EFBFBD><EFBFBD>״̬1s<31><73><EFBFBD><EFBFBD>һ<EFBFBD>ο<EFBFBD>Ƭ
|
|||
|
{
|
|||
|
RtccSetTimer(RTCC_CARD_SEARCH_TIME, CARD_SEACHR_TIME_SECOND);
|
|||
|
RtccSetMsgApp(RtccMsg_Search_Card);
|
|||
|
}
|
|||
|
if(Gp30IfSleepApp() == TRUE)
|
|||
|
{
|
|||
|
if(RtccCheckMsgApp(RtccMsg_Search_Card))
|
|||
|
{
|
|||
|
RtccClearMsgApp(RtccMsg_Search_Card);
|
|||
|
|
|||
|
if(card_search())
|
|||
|
{
|
|||
|
card_output_msg |= CARD_IN;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ClearCardMsg(CARD_IN);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CardDataProcessorApp()
|
|||
|
{
|
|||
|
u8 i = 0;
|
|||
|
u8 j = 0;
|
|||
|
// u32 temp = 0;
|
|||
|
// s32 tmpdata;
|
|||
|
u8 card_key_result[4] = {0};
|
|||
|
// card_read_sucess = FALSE;
|
|||
|
|
|||
|
if(CheckCardMsg() & CARD_IN)
|
|||
|
{
|
|||
|
ClearCardMsg(CARD_IN);
|
|||
|
card_enable();
|
|||
|
|
|||
|
for(j = 0; j < 6; j++)
|
|||
|
{
|
|||
|
memset(card_source_data.data, 0, 28);
|
|||
|
Card5557ClrIntCnt();
|
|||
|
|
|||
|
if(card_read_all(card_source_data.data))
|
|||
|
{
|
|||
|
nop();
|
|||
|
|
|||
|
for(i = 0; i < 28; i++)
|
|||
|
{
|
|||
|
card_source_data.data [i] = (u8)( card_source_data.data [i] ^ i ^ 0xB9); // Card_Data. dataΪ<61><CEAA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>28<32>ֽ<EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
card_generate_key(card_source_data.data, card_key_result);
|
|||
|
|
|||
|
if(0 == memcmp(card_source_data.code, card_key_result, 4))
|
|||
|
{
|
|||
|
card_read_sucess = TRUE;
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
card_read_sucess = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ClearCardSta();
|
|||
|
card_read_sucess = FALSE;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
card_disable();
|
|||
|
|
|||
|
if(card_read_sucess == FALSE)
|
|||
|
{
|
|||
|
//// LcdAppDpUserCard2(51); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
card_read_sucess = FALSE;
|
|||
|
KeySetLcdMsgApp(MENU_TWO);
|
|||
|
if(card_source_data.check == (add_check(card_source_data.data, 15) + add_check(&card_source_data.data[16], 8)) % 256)
|
|||
|
{
|
|||
|
switch(card_source_data.card_flag)
|
|||
|
{
|
|||
|
case OPEN_VALVE_CARD:
|
|||
|
{
|
|||
|
card_key_flag = TRUE;
|
|||
|
FrameSetMsgApp(Msg_ValveOpenEmergency);//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case CLOSE_VALVE_CARD:
|
|||
|
{
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/*************************************************
|
|||
|
Function: u8 ChecPulsekMsg(void)
|
|||
|
Description: <EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>¼<EFBFBD>Msg
|
|||
|
Input: None
|
|||
|
Return:
|
|||
|
Others: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MainSpace<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڡ<EFBFBD>
|
|||
|
*************************************************/
|
|||
|
u8 CheckCardMsg(void)
|
|||
|
{
|
|||
|
return card_output_msg;
|
|||
|
}
|
|||
|
|
|||
|
/*************************************************
|
|||
|
Function: void ClearCardMsg(u8 msg)
|
|||
|
Description: <EFBFBD><EFBFBD>MSG
|
|||
|
Input:
|
|||
|
Return: None
|
|||
|
Others: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MainSpace<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڡ<EFBFBD>
|
|||
|
*************************************************/
|
|||
|
void ClearCardMsg(u8 msg)
|
|||
|
{
|
|||
|
card_output_msg = card_output_msg & (~msg);
|
|||
|
}
|
|||
|
|
|||
|
const u8 const_data[24] = { 0xDF, 0x39, 0x9D, 0xC5, 0x40, 0x86, 0x18, 0xB3, 0x67, 0xF1, 0x5A, 0x72, 0x24, 0xEC, 0xAE, 0x0B
|
|||
|
, 0xA3, 0XA5, 0X09, 0XC3, 0XAD, 0XEE, 0XAC, 0X08
|
|||
|
};
|
|||
|
void card_generate_key(u8* buf, u8* key)
|
|||
|
{
|
|||
|
u8 p[24]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
u8 p_num = 0, d_num = 0;
|
|||
|
p[p_num++] = const_data[(buf[0x0A] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x04] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x06] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x01] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x09] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x05] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x02] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x07] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x08] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x03] ^ const_data[d_num++]) % 24];
|
|||
|
|
|||
|
p[p_num++] = const_data[(buf[0x0C] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x10] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x0E] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x12] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x14] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x0B] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x13] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x0F] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x11] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x0D] ^ const_data[d_num++]) % 24];
|
|||
|
|
|||
|
p[p_num++] = const_data[(buf[0x00] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x16] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x15] ^ const_data[d_num++]) % 24];
|
|||
|
p[p_num++] = const_data[(buf[0x17] ^ const_data[d_num++]) % 24];
|
|||
|
memset(key, 0, 4);
|
|||
|
|
|||
|
for(int i = 0; i < 24; i++)
|
|||
|
{
|
|||
|
if(i % 2 == 0) // 0/2/4/6/8/10/12/14/16/18/20/22/
|
|||
|
{
|
|||
|
*key = (u8)(key[0] + p[i]);
|
|||
|
}
|
|||
|
|
|||
|
if(i % 2 == 1) // 1/3/5/7/9/11/13/15/17/19/21/23/
|
|||
|
{
|
|||
|
*(key + 1) = (u8)(key[1] + p[i]);
|
|||
|
}
|
|||
|
|
|||
|
if(i % 3 == 0) // 0/3/6/9/12/15/18/21/
|
|||
|
{
|
|||
|
*(key + 2) = (u8)(key[2] + p[i]);
|
|||
|
}
|
|||
|
|
|||
|
if(i % 3 == 1) // 1/4/7/10/13/16/19/22
|
|||
|
{
|
|||
|
*(key + 3) = (u8)(key[3] + p[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
void CardKeyMsgMachine()
|
|||
|
{
|
|||
|
switch (card_key_machine_state)
|
|||
|
{
|
|||
|
case CARD_KEY_M_S0:
|
|||
|
{
|
|||
|
if(card_key_flag && (card_key_check_num == 0))
|
|||
|
{
|
|||
|
card_key_flag = FALSE;
|
|||
|
card_key_check_num++;
|
|||
|
RtccSetTimer(RTCC_CARD_KEY_TIME, CARD_KEY_TIME_SECOND); //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>30S
|
|||
|
}
|
|||
|
|
|||
|
if(RtccCheckTimer(RTCC_CARD_KEY_TIME) > 0)
|
|||
|
{
|
|||
|
if(card_key_flag)
|
|||
|
{
|
|||
|
card_key_flag = FALSE;
|
|||
|
card_key_check_num++;
|
|||
|
}
|
|||
|
|
|||
|
if(card_key_check_num >= 2)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>Ϣ
|
|||
|
card_key_check_num = 0;
|
|||
|
KeySetLcdMsgApp(MENU_ACTIVE_RF);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
card_key_flag = FALSE;
|
|||
|
card_key_check_num = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
{
|
|||
|
card_key_flag = FALSE;
|
|||
|
card_key_check_num = 0;
|
|||
|
card_key_machine_state = CARD_KEY_M_S0;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
void CardMachine()
|
|||
|
{
|
|||
|
SearchCardApp();
|
|||
|
CardDataProcessorApp();
|
|||
|
CardKeyMsgMachine();
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|