//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"); //} }
/** 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; }
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); }
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."); } }
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; }
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; }