if OSTYPE_WINDOWS
win32-installer: all install
make -C win32 installer
+--- chronojump-1.7.1/rfid.orig/chronojump_rfid_capture.py 1970-01-01 01:00:00.000000000 +0100
++++ chronojump-1.7.1/rfid/chronojump_rfid_capture.py 2017-07-29 17:56:43.304012163 +0200
+@@ -0,0 +1,65 @@
++#!/usr/bin/env python
++# -*- coding: utf8 -*-
++
++import RPi.GPIO as GPIO
++import MFRC522
++import signal
++
++continue_reading = True
++
++# Capture SIGINT for cleanup when the script is aborted
++def end_read(signal,frame):
++ global continue_reading
++ print "Ctrl+C captured, ending read."
++ continue_reading = False
++ GPIO.cleanup()
++
++# Hook the SIGINT
++signal.signal(signal.SIGINT, end_read)
++
++# Create an object of the class MFRC522
++MIFAREReader = MFRC522.MFRC522()
++
++# Welcome message
++print "Welcome to the MFRC522 data read example"
++print "Press Ctrl-C to stop."
++
++# This loop keeps checking for chips. If one is near it will get the UID and authenticate
++while continue_reading:
++
++ # Scan for cards
++ (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
++
++ # If a card is found
++ if status == MIFAREReader.MI_OK:
++ print "Card detected"
++
++ # Get the UID of the card
++ (status,uid) = MIFAREReader.MFRC522_Anticoll()
++
++ # If we have the UID, continue
++ if status == MIFAREReader.MI_OK:
++
++ # Print UID
++ print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
++
++ file = open("/tmp/chronojump_rfid.txt", "w")
++ file.write(str(uid[0]) + "," + str(uid[1]) + "," + str(uid[2]) + "," + str(uid[3]))
++ file.close()
++
++ # This is the default key for authentication
++ key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
++
++ # Select the scanned tag
++ MIFAREReader.MFRC522_SelectTag(uid)
++
++ # Authenticate
++ status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
++
++ # Check if authenticated
++ if status == MIFAREReader.MI_OK:
++ MIFAREReader.MFRC522_Read(8)
++ MIFAREReader.MFRC522_StopCrypto1()
++ else:
++ print "Authentication error"
++
+--- chronojump-1.7.1/rfid.orig/MFRC522.py 1970-01-01 01:00:00.000000000 +0100
++++ chronojump-1.7.1/rfid/MFRC522.py 2017-07-29 17:56:35.870678915 +0200
+@@ -0,0 +1,397 @@
++#!/usr/bin/env python\r
++# -*- coding: utf8 -*-\r
++\r
++import RPi.GPIO as GPIO\r
++import spi\r
++import signal\r
++import time\r
++ \r
++class MFRC522:\r
++ NRSTPD = 22\r
++ \r
++ MAX_LEN = 16\r
++ \r
++ PCD_IDLE = 0x00\r
++ PCD_AUTHENT = 0x0E\r
++ PCD_RECEIVE = 0x08\r
++ PCD_TRANSMIT = 0x04\r
++ PCD_TRANSCEIVE = 0x0C\r
++ PCD_RESETPHASE = 0x0F\r
++ PCD_CALCCRC = 0x03\r
++ \r
++ PICC_REQIDL = 0x26\r
++ PICC_REQALL = 0x52\r
++ PICC_ANTICOLL = 0x93\r
++ PICC_SElECTTAG = 0x93\r
++ PICC_AUTHENT1A = 0x60\r
++ PICC_AUTHENT1B = 0x61\r
++ PICC_READ = 0x30\r
++ PICC_WRITE = 0xA0\r
++ PICC_DECREMENT = 0xC0\r
++ PICC_INCREMENT = 0xC1\r
++ PICC_RESTORE = 0xC2\r
++ PICC_TRANSFER = 0xB0\r
++ PICC_HALT = 0x50\r
++ \r
++ MI_OK = 0\r
++ MI_NOTAGERR = 1\r
++ MI_ERR = 2\r
++ \r
++ Reserved00 = 0x00\r
++ CommandReg = 0x01\r
++ CommIEnReg = 0x02\r
++ DivlEnReg = 0x03\r
++ CommIrqReg = 0x04\r
++ DivIrqReg = 0x05\r
++ ErrorReg = 0x06\r
++ Status1Reg = 0x07\r
++ Status2Reg = 0x08\r
++ FIFODataReg = 0x09\r
++ FIFOLevelReg = 0x0A\r
++ WaterLevelReg = 0x0B\r
++ ControlReg = 0x0C\r
++ BitFramingReg = 0x0D\r
++ CollReg = 0x0E\r
++ Reserved01 = 0x0F\r
++ \r
++ Reserved10 = 0x10\r
++ ModeReg = 0x11\r
++ TxModeReg = 0x12\r
++ RxModeReg = 0x13\r
++ TxControlReg = 0x14\r
++ TxAutoReg = 0x15\r
++ TxSelReg = 0x16\r
++ RxSelReg = 0x17\r
++ RxThresholdReg = 0x18\r
++ DemodReg = 0x19\r
++ Reserved11 = 0x1A\r
++ Reserved12 = 0x1B\r
++ MifareReg = 0x1C\r
++ Reserved13 = 0x1D\r
++ Reserved14 = 0x1E\r
++ SerialSpeedReg = 0x1F\r
++ \r
++ Reserved20 = 0x20 \r
++ CRCResultRegM = 0x21\r
++ CRCResultRegL = 0x22\r
++ Reserved21 = 0x23\r
++ ModWidthReg = 0x24\r
++ Reserved22 = 0x25\r
++ RFCfgReg = 0x26\r
++ GsNReg = 0x27\r
++ CWGsPReg = 0x28\r
++ ModGsPReg = 0x29\r
++ TModeReg = 0x2A\r
++ TPrescalerReg = 0x2B\r
++ TReloadRegH = 0x2C\r
++ TReloadRegL = 0x2D\r
++ TCounterValueRegH = 0x2E\r
++ TCounterValueRegL = 0x2F\r
++ \r
++ Reserved30 = 0x30\r
++ TestSel1Reg = 0x31\r
++ TestSel2Reg = 0x32\r
++ TestPinEnReg = 0x33\r
++ TestPinValueReg = 0x34\r
++ TestBusReg = 0x35\r
++ AutoTestReg = 0x36\r
++ VersionReg = 0x37\r
++ AnalogTestReg = 0x38\r
++ TestDAC1Reg = 0x39\r
++ TestDAC2Reg = 0x3A\r
++ TestADCReg = 0x3B\r
++ Reserved31 = 0x3C\r
++ Reserved32 = 0x3D\r
++ Reserved33 = 0x3E\r
++ Reserved34 = 0x3F\r
++ \r
++ serNum = []\r
++ \r
++ def __init__(self, dev='/dev/spidev0.0', spd=1000000):\r
++ spi.openSPI(device=dev,speed=spd)\r
++ GPIO.setmode(GPIO.BOARD)\r
++ GPIO.setup(22, GPIO.OUT)\r
++ GPIO.output(self.NRSTPD, 1)\r
++ self.MFRC522_Init()\r
++ \r
++ def MFRC522_Reset(self):\r
++ self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)\r
++ \r
++ def Write_MFRC522(self, addr, val):\r
++ spi.transfer(((addr<<1)&0x7E,val))\r
++ \r
++ def Read_MFRC522(self, addr):\r
++ val = spi.transfer((((addr<<1)&0x7E) | 0x80,0))\r
++ return val[1]\r
++ \r
++ def SetBitMask(self, reg, mask):\r
++ tmp = self.Read_MFRC522(reg)\r
++ self.Write_MFRC522(reg, tmp | mask)\r
++ \r
++ def ClearBitMask(self, reg, mask):\r
++ tmp = self.Read_MFRC522(reg);\r
++ self.Write_MFRC522(reg, tmp & (~mask))\r
++ \r
++ def AntennaOn(self):\r
++ temp = self.Read_MFRC522(self.TxControlReg)\r
++ if(~(temp & 0x03)):\r
++ self.SetBitMask(self.TxControlReg, 0x03)\r
++ \r
++ def AntennaOff(self):\r
++ self.ClearBitMask(self.TxControlReg, 0x03)\r
++ \r
++ def MFRC522_ToCard(self,command,sendData):\r
++ backData = []\r
++ backLen = 0\r
++ status = self.MI_ERR\r
++ irqEn = 0x00\r
++ waitIRq = 0x00\r
++ lastBits = None\r
++ n = 0\r
++ i = 0\r
++ \r
++ if command == self.PCD_AUTHENT:\r
++ irqEn = 0x12\r
++ waitIRq = 0x10\r
++ if command == self.PCD_TRANSCEIVE:\r
++ irqEn = 0x77\r
++ waitIRq = 0x30\r
++ \r
++ self.Write_MFRC522(self.CommIEnReg, irqEn|0x80)\r
++ self.ClearBitMask(self.CommIrqReg, 0x80)\r
++ self.SetBitMask(self.FIFOLevelReg, 0x80)\r
++ \r
++ self.Write_MFRC522(self.CommandReg, self.PCD_IDLE); \r
++ \r
++ while(i<len(sendData)):\r
++ self.Write_MFRC522(self.FIFODataReg, sendData[i])\r
++ i = i+1\r
++ \r
++ self.Write_MFRC522(self.CommandReg, command)\r
++ \r
++ if command == self.PCD_TRANSCEIVE:\r
++ self.SetBitMask(self.BitFramingReg, 0x80)\r
++ \r
++ i = 2000\r
++ while True:\r
++ n = self.Read_MFRC522(self.CommIrqReg)\r
++ i = i - 1\r
++ if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)):\r
++ break\r
++ \r
++ self.ClearBitMask(self.BitFramingReg, 0x80)\r
++ \r
++ if i != 0:\r
++ if (self.Read_MFRC522(self.ErrorReg) & 0x1B)==0x00:\r
++ status = self.MI_OK\r
++\r
++ if n & irqEn & 0x01:\r
++ status = self.MI_NOTAGERR\r
++ \r
++ if command == self.PCD_TRANSCEIVE:\r
++ n = self.Read_MFRC522(self.FIFOLevelReg)\r
++ lastBits = self.Read_MFRC522(self.ControlReg) & 0x07\r
++ if lastBits != 0:\r
++ backLen = (n-1)*8 + lastBits\r
++ else:\r
++ backLen = n*8\r
++ \r
++ if n == 0:\r
++ n = 1\r
++ if n > self.MAX_LEN:\r
++ n = self.MAX_LEN\r
++ \r
++ i = 0\r
++ while i<n:\r
++ backData.append(self.Read_MFRC522(self.FIFODataReg))\r
++ i = i + 1;\r
++ else:\r
++ status = self.MI_ERR\r
++\r
++ return (status,backData,backLen)\r
++ \r
++ \r
++ def MFRC522_Request(self, reqMode):\r
++ status = None\r
++ backBits = None\r
++ TagType = []\r
++ \r
++ self.Write_MFRC522(self.BitFramingReg, 0x07)\r
++ \r
++ TagType.append(reqMode);\r
++ (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, TagType)\r
++ \r
++ if ((status != self.MI_OK) | (backBits != 0x10)):\r
++ status = self.MI_ERR\r
++ \r
++ return (status,backBits)\r
++ \r
++ \r
++ def MFRC522_Anticoll(self):\r
++ backData = []\r
++ serNumCheck = 0\r
++ \r
++ serNum = []\r
++ \r
++ self.Write_MFRC522(self.BitFramingReg, 0x00)\r
++ \r
++ serNum.append(self.PICC_ANTICOLL)\r
++ serNum.append(0x20)\r
++ \r
++ (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,serNum)\r
++ \r
++ if(status == self.MI_OK):\r
++ i = 0\r
++ if len(backData)==5:\r
++ while i<4:\r
++ serNumCheck = serNumCheck ^ backData[i]\r
++ i = i + 1\r
++ if serNumCheck != backData[i]:\r
++ status = self.MI_ERR\r
++ else:\r
++ status = self.MI_ERR\r
++ \r
++ return (status,backData)\r
++ \r
++ def CalulateCRC(self, pIndata):\r
++ self.ClearBitMask(self.DivIrqReg, 0x04)\r
++ self.SetBitMask(self.FIFOLevelReg, 0x80);\r
++ i = 0\r
++ while i<len(pIndata):\r
++ self.Write_MFRC522(self.FIFODataReg, pIndata[i])\r
++ i = i + 1\r
++ self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC)\r
++ i = 0xFF\r
++ while True:\r
++ n = self.Read_MFRC522(self.DivIrqReg)\r
++ i = i - 1\r
++ if not ((i != 0) and not (n&0x04)):\r
++ break\r
++ pOutData = []\r
++ pOutData.append(self.Read_MFRC522(self.CRCResultRegL))\r
++ pOutData.append(self.Read_MFRC522(self.CRCResultRegM))\r
++ return pOutData\r
++ \r
++ def MFRC522_SelectTag(self, serNum):\r
++ backData = []\r
++ buf = []\r
++ buf.append(self.PICC_SElECTTAG)\r
++ buf.append(0x70)\r
++ i = 0\r
++ while i<5:\r
++ buf.append(serNum[i])\r
++ i = i + 1\r
++ pOut = self.CalulateCRC(buf)\r
++ buf.append(pOut[0])\r
++ buf.append(pOut[1])\r
++ (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)\r
++ \r
++ if (status == self.MI_OK) and (backLen == 0x18):\r
++ print "Size: " + str(backData[0])\r
++ return backData[0]\r
++ else:\r
++ return 0\r
++ \r
++ def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):\r
++ buff = []\r
++\r
++ # First byte should be the authMode (A or B)\r
++ buff.append(authMode)\r
++\r
++ # Second byte is the trailerBlock (usually 7)\r
++ buff.append(BlockAddr)\r
++\r
++ # Now we need to append the authKey which usually is 6 bytes of 0xFF\r
++ i = 0\r
++ while(i < len(Sectorkey)):\r
++ buff.append(Sectorkey[i])\r
++ i = i + 1\r
++ i = 0\r
++\r
++ # Next we append the first 4 bytes of the UID\r
++ while(i < 4):\r
++ buff.append(serNum[i])\r
++ i = i +1\r
++\r
++ # Now we start the authentication itself\r
++ (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff)\r
++\r
++ # Check if an error occurred\r
++ if not(status == self.MI_OK):\r
++ print "AUTH ERROR!!"\r
++ if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0:\r
++ print "AUTH ERROR(status2reg & 0x08) != 0"\r
++\r
++ # Return the status\r
++ return status\r
++ \r
++ def MFRC522_StopCrypto1(self):\r
++ self.ClearBitMask(self.Status2Reg, 0x08)\r
++\r
++ def MFRC522_Read(self, blockAddr):\r
++ recvData = []\r
++ recvData.append(self.PICC_READ)\r
++ recvData.append(blockAddr)\r
++ pOut = self.CalulateCRC(recvData)\r
++ recvData.append(pOut[0])\r
++ recvData.append(pOut[1])\r
++ (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)\r
++ if not(status == self.MI_OK):\r
++ print "Error while reading!"\r
++ i = 0\r
++ #xavi: not needed\r
++ #if len(backData) == 16:\r
++ # print "Sector "+str(blockAddr)+" "+str(backData)\r
++ \r
++ def MFRC522_Write(self, blockAddr, writeData):\r
++ buff = []\r
++ buff.append(self.PICC_WRITE)\r
++ buff.append(blockAddr)\r
++ crc = self.CalulateCRC(buff)\r
++ buff.append(crc[0])\r
++ buff.append(crc[1])\r
++ (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff)\r
++ if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):\r
++ status = self.MI_ERR\r
++ \r
++ print str(backLen)+" backdata &0x0F == 0x0A "+str(backData[0]&0x0F)\r
++ if status == self.MI_OK:\r
++ i = 0\r
++ buf = []\r
++ while i < 16:\r
++ buf.append(writeData[i])\r
++ i = i + 1\r
++ crc = self.CalulateCRC(buf)\r
++ buf.append(crc[0])\r
++ buf.append(crc[1])\r
++ (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,buf)\r
++ if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):\r
++ print "Error while writing"\r
++ if status == self.MI_OK:\r
++ print "Data written"\r
++\r
++ def MFRC522_DumpClassic1K(self, key, uid):\r
++ i = 0\r
++ while i < 64:\r
++ status = self.MFRC522_Auth(self.PICC_AUTHENT1A, i, key, uid)\r
++ # Check if authenticated\r
++ if status == self.MI_OK:\r
++ self.MFRC522_Read(i)\r
++ else:\r
++ print "Authentication error"\r
++ i = i+1\r
++\r
++ def MFRC522_Init(self):\r
++ GPIO.output(self.NRSTPD, 1)\r
++ \r
++ self.MFRC522_Reset();\r
++ \r
++ \r
++ self.Write_MFRC522(self.TModeReg, 0x8D)\r
++ self.Write_MFRC522(self.TPrescalerReg, 0x3E)\r
++ self.Write_MFRC522(self.TReloadRegL, 30)\r
++ self.Write_MFRC522(self.TReloadRegH, 0)\r
++ \r
++ self.Write_MFRC522(self.TxAutoReg, 0x40)\r
++ self.Write_MFRC522(self.ModeReg, 0x3D)\r
++ self.AntennaOn()\r