111 lines
3.2 KiB
C#
111 lines
3.2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace Magnetic_Card_Reader
|
|||
|
{
|
|||
|
class MagneticCardReader
|
|||
|
{
|
|||
|
int lastTimeStamp = 0;
|
|||
|
double filteredInterval = 0;
|
|||
|
int dataPointIndex = 0;
|
|||
|
byte[] decodedData = new byte[1024];
|
|||
|
int currBitPos = 0;
|
|||
|
int lastPuls = 0;
|
|||
|
int startCountDown = 0;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private int getParity(byte byteValue)
|
|||
|
{
|
|||
|
int A = byteValue;
|
|||
|
|
|||
|
A ^= A >> 4;
|
|||
|
A ^= A >> 2;
|
|||
|
A ^= A >> 1;
|
|||
|
|
|||
|
return A & 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public string getDataString()
|
|||
|
{
|
|||
|
/*char[] charTableTrack1 = {' ', '!', '"', '#', '$', '%', '&', '´', '(', ')', '*', '+', ',', '-', '.', '/',
|
|||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
|
|||
|
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
|
|||
|
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_'};*/
|
|||
|
|
|||
|
char[] charTableTrack2 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?'};
|
|||
|
|
|||
|
char[] charsData = new char[64];
|
|||
|
|
|||
|
for (int i = 0; i < 64; i++ )
|
|||
|
{
|
|||
|
if (getParity(decodedData[i])==0)
|
|||
|
{
|
|||
|
charsData[i] = '_';
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
charsData[i] = charTableTrack2[(decodedData[i] % 16)];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
string outPstring = new String(charsData);
|
|||
|
|
|||
|
return outPstring;
|
|||
|
}
|
|||
|
|
|||
|
public void addNewSignalState(int timeStamp, int newState)
|
|||
|
{
|
|||
|
int shortPuls = 0;
|
|||
|
int timeInterv = (timeStamp - lastTimeStamp);
|
|||
|
|
|||
|
if (dataPointIndex < 18)
|
|||
|
{
|
|||
|
if (lastTimeStamp > 0)
|
|||
|
{
|
|||
|
filteredInterval = filteredInterval + (double)timeInterv / 16;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (timeInterv < filteredInterval * 3 / 4)
|
|||
|
{
|
|||
|
shortPuls = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
shortPuls = 0;
|
|||
|
}
|
|||
|
|
|||
|
filteredInterval = filteredInterval * 0.9 + (double)(timeInterv * (shortPuls + 1)) * 0.1;
|
|||
|
|
|||
|
if ((lastPuls & shortPuls) == 1)
|
|||
|
{
|
|||
|
startCountDown--;
|
|||
|
if (startCountDown < 0)
|
|||
|
{
|
|||
|
decodedData[currBitPos / 5] |= (byte)(1 << (currBitPos % 5));
|
|||
|
currBitPos++;
|
|||
|
shortPuls = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else if (shortPuls == 0)
|
|||
|
{
|
|||
|
if (startCountDown < 0)
|
|||
|
{
|
|||
|
currBitPos++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
lastPuls = shortPuls;
|
|||
|
lastTimeStamp = timeStamp;
|
|||
|
dataPointIndex++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|