//Call to write out the bit buffer contents to a card reader over the electromagnet
void writeOutEMagBitBuffer(){
    //if(debugmode){
    //	Serial.println("Attempting to write data over electromagnet");
    //}
    
    //Calculate the LRC from the bit buffer data
    calculateLRC();
    //The card reader clock syncs up with 0 bit pulses until the sentinel bit is sent. Number can vvaryery, 22 is the minimum set in the standard.
    for(int i = 0; i < 22; i ++)
    {
        writeEMagBit(0);
    }
    //Write out the actual card data
    for(int i=0;i<magnetbitbufferlength;i++){
        writeEMagBit(magnetbitbuffer[i]);
    }
    //Write out the calculated Longitudinal Redundancy Check
    writeLRC();
    //Cards contain clocking bits on the end too, in case of reverse swiping
    for(int i = 0; i < 22; i ++)
    {
        writeEMagBit(0);
    }
    
    
    //Turn off the electromagnet
    LOW(pinEMAGN);
    LOW(pinEMAGS);
    
    //if(debugmode){
    //	Serial.println("Write attempt finished");
    //}
}
예제 #2
0
/** Crea mensaje con datos*/
QByteArray ModbusMessage::CreateMessageWithData(QByteArray &d){
    m_data.clear();
    SetSyn();
    m_data.append(d);
    In2Char z;
    unsigned char dummy=calculateLRC(d);
    unsigned char clrc1=(dummy&0xF0)>>4;
    unsigned char clrc2=(dummy&0x0F);
    unsigned char lrc1=z.fromHex(clrc1);
    unsigned char lrc2=z.fromHex(clrc2);
    m_data.append(lrc1);
    m_data.append(lrc2);
    m_data.append("\r");
    m_data.append("\n");
    return m_data;
}
예제 #3
0
    void FASCN200BitFormat::getLinearData(void* data, size_t dataLengthBytes) const
    {
        unsigned int pos = 0;

        convertField(data, dataLengthBytes, &pos, FASCN_SS, 4);
        convertField(data, dataLengthBytes, &pos, getAgencyCode(), 16);
        convertField(data, dataLengthBytes, &pos, FASCN_FS, 4);
        convertField(data, dataLengthBytes, &pos, getSystemCode(), 16);
        convertField(data, dataLengthBytes, &pos, FASCN_FS, 4);
        convertField(data, dataLengthBytes, &pos, getUid(), 24);
        convertField(data, dataLengthBytes, &pos, FASCN_FS, 4);
        convertField(data, dataLengthBytes, &pos, d_formatLinear.d_serieCode, 4);
        convertField(data, dataLengthBytes, &pos, FASCN_FS, 4);
        convertField(data, dataLengthBytes, &pos, d_formatLinear.d_credentialCode, 4);
        convertField(data, dataLengthBytes, &pos, FASCN_FS, 4);
        convertField(data, dataLengthBytes, &pos, getPersonIdentifier(), 40);
        convertField(data, dataLengthBytes, &pos, getOrganizationalCategory(), 4);
        convertField(data, dataLengthBytes, &pos, getOrganizationalIdentifier(), 16);
        convertField(data, dataLengthBytes, &pos, getPOACategory(), 4);
        convertField(data, dataLengthBytes, &pos, FASCN_ES, 4);
        unsigned char lrc = calculateLRC(data, pos);
        convertField(data, dataLengthBytes, &pos, lrc, 4);
    }
예제 #4
0
    void FASCN200BitFormat::setLinearData(const void* data, size_t dataLengthBytes)
    {
        unsigned int pos = 0;
        unsigned char c;

        if (dataLengthBytes * 8 < getDataLength())
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "Data length too small.");
        }

        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_SS)
        {
            char tmpmsg[64];
            sprintf(tmpmsg, "The FASC-N Start Sentinel doesn't match (%x).", c);
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, tmpmsg);
        }

        setAgencyCode((unsigned short)revertField(data, dataLengthBytes, &pos, 16));
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_FS)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N Field Separator doesn't match after the Agency Code.");
        }

        setSystemCode((unsigned short)revertField(data, dataLengthBytes, &pos, 16));
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_FS)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N Field Separator doesn't match after the System Code.");
        }

        setUid(revertField(data, dataLengthBytes, &pos, 24));
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_FS)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N Field Separator doesn't match after the Credential.");
        }

        setSerieCode((unsigned char)revertField(data, dataLengthBytes, &pos, 4));
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_FS)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N Field Separator doesn't match after the Credential Series.");
        }

        setCredentialCode((unsigned char)revertField(data, dataLengthBytes, &pos, 4));
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_FS)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N Field Separator doesn't match after the Credential Issue.");
        }

        setPersonIdentifier(revertField(data, dataLengthBytes, &pos, 40));

        setOrganizationalCategory((FASCNOrganizationalCategory)revertField(data, dataLengthBytes, &pos, 4));
        setOrganizationalIdentifier((unsigned char)revertField(data, dataLengthBytes, &pos, 16));
        setPOACategory((FASCNPOAssociationCategory)revertField(data, dataLengthBytes, &pos, 4));

        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);
        if (c != FASCN_ES)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The End Sentinel doesn't match.");
        }

        unsigned char lrc = calculateLRC(data, pos);
        c = (unsigned char)revertField(data, dataLengthBytes, &pos, 4);

        if (c != lrc)
        {
            THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The FASC-N LRC seems wrong.");
        }
    }
예제 #5
0
boolean Lakrits::processIBuffer() {
	byte dataLen = 0;
	
	if(iBufferLen > 0) {
	
		// look for a potential start of packet
		if(iBuffer[0] == STX) {
			// wait for at least length
			if(iBufferLen >= HEADER_LENGTH) {
				dataLen = iBuffer[PAYLOAD_LENGTH_OFFSET];
			
				//if whole packet is available
				if(iBufferLen > HEADER_LENGTH + dataLen + TRAILER_LENGTH) {
					if(iBuffer[HEADER_LENGTH + dataLen + TRAILER_LENGTH] == ETX) {
					
						// found potential packet
						// test checksum
				
						byte lrc = calculateLRC(iBuffer, dataLen);
					
						if(lrc == iBuffer[PAYLOAD_OFFSET + dataLen]) {
							// found packet!
							
							//Is it for me?
							if(iBuffer[RECIPIENT_ID_LOW_OFFSET] == id_low && iBuffer[RECIPIENT_ID_HIGH_OFFSET] == id_high) {
								
								///Serial.print(5, BYTE);	
								
								byte type_low = iBuffer[MESSAGE_TYPE_LOW_OFFSET];
								byte type_high = iBuffer[MESSAGE_TYPE_HIGH_OFFSET];
																
								int type = combine(type_low, type_high);
								//Remove the header
								shiftIBuffer(PAYLOAD_OFFSET);
								
								onMessage(type, iBuffer, dataLen);
								
							}else{
								///Serial.print(4, BYTE);
							}
							
							shiftIBuffer(iBufferLen);
						}else{
							///Serial.print(3, BYTE);
							shiftIBuffer(1);
						}
					}else{
						///Serial.print(2, BYTE);
						shiftIBuffer(1);
					}
				}else{
					//wait for more
				}
			}else{
				//wait for more
			}
		}else{
			///Serial.print(1, BYTE);
			shiftIBuffer(1);
		}
	
	}else{
		return false;
	}
	
	return true;
	
}
예제 #6
0
void Lakrits::setTrailer(int dataLen) {
	oBuffer[PAYLOAD_OFFSET + dataLen] = calculateLRC(oBuffer, dataLen);
	oBuffer[PAYLOAD_OFFSET + dataLen + 1] = ETX;	
	oBufferLen = HEADER_LENGTH + dataLen + TRAILER_LENGTH + 1;
}