P8UWaterPlasticIES4G/app/UWater_card_5557_app.c

278 lines
7.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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