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; //脉冲模块输出消息
|
||
//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)//休眠状态与GP30唤醒同步,2s检测一次卡片,唤醒状态1s检测一次卡片
|
||
{
|
||
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为接收到的28字节
|
||
}
|
||
|
||
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); //密码错误
|
||
}
|
||
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);//应急开阀消息
|
||
}
|
||
break;
|
||
|
||
case CLOSE_VALVE_CARD:
|
||
{
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/*************************************************
|
||
Function: u8 ChecPulsekMsg(void)
|
||
Description: 检测当前事件Msg
|
||
Input: None
|
||
Return:
|
||
Others: 处于MainSpace,第二类接口:工作接口。
|
||
*************************************************/
|
||
u8 CheckCardMsg(void)
|
||
{
|
||
return card_output_msg;
|
||
}
|
||
|
||
/*************************************************
|
||
Function: void ClearCardMsg(u8 msg)
|
||
Description: 清MSG
|
||
Input:
|
||
Return: None
|
||
Others: 处于MainSpace,第二类接口:工作接口。
|
||
*************************************************/
|
||
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]; //存放临时数据
|
||
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); //检测时间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)
|
||
{
|
||
//抛上报消息
|
||
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
|
||
|