📄 fc.cpp
字号:
// FingerDrv.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <ceddk.h>
#include <xllp_gpio.h>
#include <i2cpdd.h>
#pragma comment(lib,"ceddk.lib")
#pragma comment(lib,"pxa27x_xllp.lib")
//pxa270
#define adrFCDATA 0x04000000
volatile unsigned char *g_pReg;
//BULVERDE_GPIO_REG *g_pGPIORegs = NULL;
//XLLP_UINT32_T g_aGpioPin[4] = {3,82,84,85};
//XLLP_UINT32_T g_aTPEGpioPin[2] = {1, 82};
//XLLP_UINT32_T g_aRSTGpioPin[2] = {1, 85};
//XLLP_UINT32_T g_aCLKGpioPin[2] = {1, 84};
//声明的函数
#define __CHECK_OVERFLOW
#define slicewidth 280
#define sliceheigh 8
#define slicesize (slicewidth*sliceheigh)
static float defaultminvalue = 300000.0;
static int ciSliceThreshold = 2000;
static int maxslicenum = 1000;
static int minslicenum = 100;
static int topslice = maxslicenum - 1;//999
static int endcount = 10;
static int clWidth = 280;
static int clHeight = 350;
static long clImageSize = clWidth * clHeight;
int iRebuildHeight = 0;
int bottomslice = 999 ;
unsigned char ucBackGround = 0;
unsigned char *pImage;
unsigned char *mapEMS1;
class PCF8574
{
public:
PCF8574()
: m_Addr(0x20)
, m_dwSpeed(100 * 1000)
, m_pI2cBus(NULL)
{
}
~PCF8574()
{
if(m_pI2cBus)
m_pI2cBus->Delete();
}
BOOL Init(LPCTSTR pContext)
{
DWORD dwAddr;
BYTE data = 0xAD;
BYTE dataOut;
CRegistryEdit key(pContext);
if(!key.IsKeyOpened())
return FALSE;
if(key.GetRegValue(_T("SlaveAddr"), (LPBYTE)&dwAddr, sizeof(dwAddr)))
m_Addr = (BYTE)dwAddr;
key.GetRegValue(_T("Speed"), (LPBYTE)&m_dwSpeed, sizeof(m_dwSpeed));
m_pI2cBus = CI2CBusInterface::CreateObject(pContext);
if(m_pI2cBus)
{
m_pI2cBus->Lock();
m_pI2cBus->SetSpeed(m_dwSpeed);
m_pI2cBus->Write(m_Addr, &data, sizeof(data), FALSE);
m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
RETAILMSG(1, (TEXT("dataOut %x \r\n"),dataOut));
m_pI2cBus->Unlock();
}
return (m_pI2cBus ? TRUE : FALSE);
}
BOOL SetData1(BYTE data) //置1
{
BYTE dataOut;
if(m_pI2cBus == NULL)
{RETAILMSG(1, (TEXT("set1 cuowu\r\n")));
return FALSE;}
if(m_pI2cBus)
{
m_pI2cBus->Lock();
m_pI2cBus->SetSpeed(m_dwSpeed); // 100kbps
m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
data|=dataOut;
m_pI2cBus->Write(m_Addr,&data,sizeof(data),FALSE);
m_pI2cBus->Unlock();
}
return TRUE;
}
BOOL SetData0(BYTE data) //置0
{
BYTE dataOut;
if(m_pI2cBus == NULL)
{RETAILMSG(1, (TEXT("set0 cuowu\r\n")));
return FALSE;}
if(m_pI2cBus)
{
m_pI2cBus->Lock();
m_pI2cBus->SetSpeed(m_dwSpeed); // 400kbps
m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
data&=dataOut;
//RETAILMSG(1, (TEXT("data %x\r\n"),data));
m_pI2cBus->Write(m_Addr,&data,sizeof(data),FALSE);
//RETAILMSG(1, (TEXT("write0\r\n")));
m_pI2cBus->Unlock();
}
return TRUE;
}
private:
BYTE m_Addr;
DWORD m_dwSpeed;
CI2CBusInterface *m_pI2cBus;
};
PCF8574 *pcf;
//PS82 GPSR2--18
void FC_TPEON(PCF8574 *pPcf8574)
{
//int i;
BYTE data = 0x10;
//for( i =1;i <5000;i++)
//{
pPcf8574->SetData1(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPN\r\n")));}
//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPEON\r\n")));
//*g_pI2CRegs = 0x08|;
//XllpGpioSetOutputState1(g_pGPIORegs, g_aTPEGpioPin);
}
void FC_TPEOFF(PCF8574 *pPcf8574)
{
BYTE data = 0xEF;
pPcf8574->SetData0(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPEOFF\r\n")));
//*g_pI2CRegs = 0;
//XllpGpioSetOutput0(g_pGPIORegs, g_aTPEGpioPin);
}
//PS85 GPSR2--21
void FC_RESETON(PCF8574 *pPcf8574)
{
BYTE data = 0x40;
pPcf8574->SetData1(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_RESETON\r\n")));
//*g_pI2CRegs = 0x02;
//XllpGpioSetOutputState1(g_pGPIORegs,g_aRSTGpioPin);
}
void FC_RESETOFF(PCF8574 *pPcf8574)
{
BYTE data = 0xBF;
pPcf8574->SetData0(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_RESETOFF\r\n")));
//*g_pI2CRegs = 0;
//XllpGpioSetOutput0(g_pGPIORegs, g_aRSTGpioPin);
}
//PS84 GPSR2--20
void FC_PCLKON(PCF8574 *pPcf8574)
{
BYTE data = 0x02;
pPcf8574->SetData1(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_PCLKON\r\n")));
//*g_pI2CRegs = 0x40;
//XllpGpioSetOutputState1(g_pGPIORegs,g_aCLKGpioPin);
}
void FC_PCLKOFF(PCF8574 *pPcf8574)
{
BYTE data = 0xFD;
pPcf8574->SetData0(data);
//RETAILMSG(1, (TEXT("***FingerDrv: FC_PCLKOFF\r\n")));
//*g_pI2CRegs = 0;
//XllpGpioSetOutput0(g_pGPIORegs, g_aCLKGpioPin);
}
int EvaluateSlice(unsigned char *slice, int threshold);
void ImgSet3(unsigned char *pImage, unsigned char ucValue, int lLenth);
void ImgCpy3(unsigned char *pDst, unsigned char *pSrc, int lLenth);
void ImgSet4(unsigned char *pImage, unsigned char ucValue, long lWidth, long lHeight);
void ImgCpy4(unsigned char *pDst, unsigned char *pSrc, long lWidth, long lHeight);
float Average2(unsigned char *pData, long lLenth);
float Variance2(unsigned char *pData, long lLenth);
float CoVariance3(unsigned char *pData1, unsigned char *pData2, long lLenth);
float Average7(unsigned char *pImage, long lWidth, long lHeight,
int iLeft, int iTop, int iRight, int iBottom);
float Variance7(unsigned char *pImage, long lWidth, long lHeight,
int iLeft, int iTop, int iRight, int iBottom);
float CoVariance8(unsigned char *pImage1, unsigned char *pImage2, long lWidth, long lHeight,
int iLeft, int iTop, int iRight, int iBottom);
unsigned char Swing(unsigned char *pImage, long iWidth, long iHeight,
int iLeft, int iTop, int iRight, int iBottom);
float ucAverage(unsigned char *data, unsigned int lenth);
float ucVariance(unsigned char *data, unsigned int lenth);
float ucCoVariance(unsigned char *data1, unsigned char *data2, unsigned int lenth);
float uc2dAverage(unsigned char *data, unsigned int width, unsigned int heigh,
unsigned int x, unsigned int y, unsigned int w, unsigned int h);
float uc2dVariance(unsigned char *data, unsigned int width, unsigned int heigh,
unsigned int x, unsigned int y, unsigned int w, unsigned int h);
float uc2dCoVariance(unsigned char *data1, unsigned char *data2, unsigned int width, unsigned int heigh,
unsigned int x, unsigned int y, unsigned int w, unsigned int h);
void FIG_Gpio_Init(void);
void HeatChip(int flag);
void EnableChip(int flag);
int ResetChip(void);
int SearchSynch(void);
int SkipOneSlice(void);
int ReadOneSlice(unsigned char *slice);
static int framesize = 1124;
unsigned char *framebuffer;
int GetSlice(void);
void Capture(void);
int Rebuild(void);
BOOL APIENTRY DllMain( HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpReserved
)
{
return TRUE;
}
DWORD FIG_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init\r\n")));
PHYSICAL_ADDRESS PA;
//IO
//PA.QuadPart = BULVERDE_BASE_REG_PA_GPIO;
//g_pGPIORegs = (BULVERDE_GPIO_REG *) MmMapIoSpace(PA, 0x400, FALSE);
PCF8574 *pPcf8574;
pPcf8574 = new PCF8574;
if(pPcf8574 && !pPcf8574->Init(pContext))
{
delete pPcf8574;
pPcf8574 = NULL;
}
pcf = pPcf8574;
RETAILMSG(1, (L"PCF8574: Init() 0x%x\r\n", pPcf8574) );
//FC DATA
PA.QuadPart = adrFCDATA;
g_pReg = (unsigned char *)MmMapIoSpace(PA,sizeof(unsigned char),FALSE);
//判断是否申请内存成功
//if(g_pGPIORegs && g_pReg)
if(g_pReg)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init Sucess\r\n")));
framebuffer = new unsigned char[framesize] ;
pImage = new unsigned char [280*350];
mapEMS1 = new unsigned char [1024*32*128];
return (DWORD)pContext;
}
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init fail\r\n")));
return FALSE;
}
BOOL FIG_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Deinit\r\n")));
//MmUnmapIoSpace(g_pGPIORegs, 0x400);
PCF8574 *pPcf8574;
pPcf8574 = (PCF8574 *)hDeviceContext;
if(pPcf8574 != NULL) delete pPcf8574;
// MmUnmapIoSpace((PVOID)g_pMEMCtrlregs,sizeof(S3C2410X_MEMCTRL_REG));
MmUnmapIoSpace((PVOID)g_pReg,sizeof(unsigned char));
delete [] framebuffer;
delete [] pImage;
delete [] mapEMS1;
delete pcf;
return TRUE;
}
DWORD FIG_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Open\r\n")));
//保存以下IO口的原来设置
//初始化IO口
//FIG_Gpio_Init();
HeatChip(1);
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Open HeatChip\r\n")));
return hDeviceContext;
}
BOOL FIG_Close(DWORD hOpenContext)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Close\r\n")));
//还原IO口的设置
//还原BWSCON等
return TRUE;
}
BOOL FIG_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
return TRUE;
}
void FIG_PowerDown(DWORD hDeviceContext)
{
}
void FIG_PowerUp(DWORD hDeviceContext)
{
}
DWORD FIG_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
unsigned char *POut= (unsigned char*)(pBuffer);
for(int i = 0;i<280*350;i++)
{
POut[i] = pImage[i];
}
return sizeof(unsigned char);
}
DWORD FIG_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
DWORD FIG_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Write!\r\n")));
RETAILMSG(1, (TEXT("clWidth 111 %d !\r\n"),clWidth));
RETAILMSG(1, (TEXT("clHeight 111 %d !\r\n"),clHeight));
Capture();
//for( i = 0;i<100;i++)
//{RETAILMSG(1, (TEXT("data %d !\r\n"),pImage[i]));}
RETAILMSG(1, (TEXT("***FingerDrv: FIG_Write finished!\r\n")));
return hOpenContext;
}
//void FIG_Gpio_Init(void)
//{
// //set as output
// XllpGpioSetDirectionOut(g_pGPIORegs, g_aGpioPin);
// XllpGpioClearAlternateFn(g_pGPIORegs, g_aGpioPin);
//}
void HeatChip(int flag)
{
if(flag)
{
RETAILMSG(1, (TEXT("***FingerDrv: HeatChip1\r\n")));
//g_pIOPregs->GPBDAT=g_pIOPregs->GPBDAT|(0x01<<9);
FC_TPEON(pcf);
}
else
{
RETAILMSG(1, (TEXT("***FingerDrv: HeatChip0\r\n")));
//g_pIOPregs->GPBDAT=g_pIOPregs->GPBDAT&~(0x01<<9);
FC_TPEOFF(pcf);
}
}
void EnableChip(int flag)
{
if(flag)
{
RETAILMSG(1, (TEXT("***FingerDrv: EnableChip1\r\n")));
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<6);
FC_RESETOFF(pcf);
}
else
{
RETAILMSG(1, (TEXT("***FingerDrv: EnableChip0\r\n")));
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<6);
FC_RESETON(pcf);
}
}
int ResetChip()
{
register unsigned int i;
HeatChip(1);
EnableChip(1);
Sleep(1);
EnableChip(0);
Sleep(1);
EnableChip(1);
Sleep(1);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKON(pcf);
SkipOneSlice();
if(!SearchSynch())
{
return 0;
}
for(i = 0; i < 5; i++)
{
if(!SkipOneSlice())
{
return 0;
}
}
return 1;
}
int SearchSynch()
{
const int num = 2000;
unsigned char v, oldv;
register int i;
v = 0;
oldv = 0;
for(i = 0; i < num; i++)
{
//RETAILMSG(1, (TEXT("***FingerDrv: SearchSynch\r\n")));
oldv = v;
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
v = *g_pReg;
if(v == 0x0f && oldv == 0x0f)
{
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
return 1;
}
}
return 0;
}
int SkipOneSlice()
{
RETAILMSG(1, (TEXT("***FingerDrv: SkipOneSlice\r\n")));
unsigned char s1, s2;
register int i;
for(i = 0; i < 1124; i++)
{
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
}
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
s1 = *g_pReg;
RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
s2 = *g_pReg;
RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
if(s1 != 0x0f || s2 != 0x0f) return 0;
return 1;
}
int ReadOneSlice(unsigned char *slice)
{
unsigned char *p;
unsigned char *q;
unsigned char v0;
register int i,j;
register unsigned char v;
p = framebuffer;
RETAILMSG(1, (TEXT("***FingerDrv: ReadOneSlice\r\n")));
for(i = 0; i < framesize; i++)
{
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
FC_PCLKOFF(pcf);
FC_PCLKON(pcf);
*p++ = *g_pReg;
//RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
}
p = framebuffer;
if(p[1120] != 0x0f || p[1121] != 0x0f)
{
return 0;
}
p = framebuffer;
for(i = 0; i < slicewidth; i++)
{
q = slice + i;
for(j = 0; j < sliceheigh; j += 2)
{
v0 = *p++;
v = (v0 & 0x0f)<<4;
*q = v;
q += 280;
v = v0 & 0xf0;
*q = v;
q += 280;
}
}
return 1;
}
/////////////////////////////////
// 计算序列固定长度的平均值ave= sum /num
float ucAverage(unsigned char *data, unsigned int lenth)
{
register unsigned int i;
unsigned char *p = data;
unsigned long sum = 0;
if(lenth <= 0)
return 0;
for(i = 0; i < lenth; i++)
sum += *p++;
return (float)sum/lenth;
}
//计算序列固定长度的方差
float ucVariance(unsigned char *data, unsigned int lenth)
{
register unsigned int i,v;
unsigned char *p = data;
unsigned long sum1 = 0;
unsigned long sum2 = 0;
if(lenth <= 0)
return 0;
for(i = 0; i < lenth; i++)
{
v = *p++;
sum1 += v;
sum2 += v*v;
}
sum1 /= lenth;
sum2 /= lenth;
sum2 -= sum1*sum1;
return (float)sum2;
}
//计算俩个序列固定长度的协方差
float ucCoVariance(unsigned char *data1, unsigned char *data2, unsigned int lenth)
{
register int v1,v2;
register unsigned int i,v;
unsigned char *p1 = data1;
unsigned char *p2 = data2;
unsigned long sum1 = 0;
unsigned long sum2 = 0;
if(lenth <= 0)
return 0;
for(i = 0; i < lenth; i++)
{
v1 = *p1++;
v2 = *p2++;
v = v1 > v2 ? v1 - v2 : v2 - v1;
sum1 += v;
sum2 += v*v;
}
sum1 /= lenth;
sum2 /= lenth;
sum2 -= sum1*sum1;
return (float)sum2;
}
//计算二维序列平均值
float uc2dAverage(unsigned char *data, unsigned int width, unsigned int heigh,
unsigned int x, unsigned int y, unsigned int w, unsigned int h)
{
register unsigned int i,j;
unsigned char *p;
unsigned long sum = 0;
if(width < x + w || heigh < y + h)
return 0;
for(i = 0; i < h; i++)
{
p = data + (y+i)*width + x;
for(j = 0; j < w; j++)
{
sum += *p++;
}
}
return (float)sum/w/h;
}
//计算2维方差
float uc2dVariance(unsigned char *data, unsigned int width, unsigned int heigh,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -