From 8d2b664149b32da90bcb283c16cf1e19f9fa56cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Wed, 28 Jun 2017 20:40:01 +0200 Subject: [PATCH] Abgabe --- kawaii/CMakeLists.txt | 36 + kawaii/MFRC522.cpp | 1755 +++++++++++++++++ kawaii/MFRC522.h | 323 +++ kawaii/bcm2835.h | 1129 +++++++++++ kawaii/emergency_stop.cpp | 29 + kawaii/emergency_stop.h | 24 + kawaii/engine.cpp | 79 + kawaii/engine.hpp | 31 + kawaii/gpio.cpp | 109 + kawaii/gpio.hpp | 34 + kawaii/kawaii-rs/.gitignore | 4 + kawaii/kawaii-rs/CMakeLists.txt | 21 + kawaii/kawaii-rs/Cargo.toml | 19 + .../dependencies/emergency-stop/.gitignore | 8 + .../dependencies/emergency-stop/Cargo.toml | 10 + .../dependencies/emergency-stop/src/lib.rs | 96 + .../dependencies/emergency-stop/src/main.rs | 21 + .../dependencies/kawaii-rs/.gitignore | 4 + .../dependencies/kawaii-rs/Cargo.toml | 13 + .../dependencies/kawaii-rs/src/gpio.rs | 288 +++ .../dependencies/kawaii-rs/src/lib.rs | 7 + .../dependencies/kawaii-rs/src/main.rs | 35 + .../dependencies/kawaii-rs/src/measure.rs | 111 ++ .../dependencies/ultrasonic-irq/.gitignore | 7 + .../dependencies/ultrasonic-irq/Cargo.toml | 12 + .../dependencies/ultrasonic-irq/src/lib.rs | 194 ++ .../dependencies/ultrasonic-irq/src/main.rs | 21 + kawaii/kawaii-rs/src/emergency_stop.rs | 27 + kawaii/kawaii-rs/src/lib.rs | 13 + kawaii/kawaii-rs/src/measure.rs | 48 + kawaii/kawaii-rs/src/ultrasonic_irq.rs | 27 + kawaii/main.cpp | 262 +++ kawaii/measure.cpp | 50 + kawaii/measure.hpp | 22 + kawaii/remote.cpp | 123 ++ kawaii/rfid_reader.cpp | 61 + kawaii/rfid_reader.hpp | 31 + kawaii/test.cpp | 97 + kawaii/ultrasound_sensor.cpp | 25 + kawaii/ultrasound_sensor.hpp | 19 + realzeitnachweis.pdf | Bin 0 -> 329609 bytes 41 files changed, 5225 insertions(+) create mode 100644 kawaii/CMakeLists.txt create mode 100644 kawaii/MFRC522.cpp create mode 100644 kawaii/MFRC522.h create mode 100644 kawaii/bcm2835.h create mode 100644 kawaii/emergency_stop.cpp create mode 100644 kawaii/emergency_stop.h create mode 100644 kawaii/engine.cpp create mode 100644 kawaii/engine.hpp create mode 100644 kawaii/gpio.cpp create mode 100644 kawaii/gpio.hpp create mode 100644 kawaii/kawaii-rs/.gitignore create mode 100644 kawaii/kawaii-rs/CMakeLists.txt create mode 100644 kawaii/kawaii-rs/Cargo.toml create mode 100644 kawaii/kawaii-rs/dependencies/emergency-stop/.gitignore create mode 100644 kawaii/kawaii-rs/dependencies/emergency-stop/Cargo.toml create mode 100644 kawaii/kawaii-rs/dependencies/emergency-stop/src/lib.rs create mode 100644 kawaii/kawaii-rs/dependencies/emergency-stop/src/main.rs create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/.gitignore create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/Cargo.toml create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/src/gpio.rs create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/src/lib.rs create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/src/main.rs create mode 100644 kawaii/kawaii-rs/dependencies/kawaii-rs/src/measure.rs create mode 100644 kawaii/kawaii-rs/dependencies/ultrasonic-irq/.gitignore create mode 100644 kawaii/kawaii-rs/dependencies/ultrasonic-irq/Cargo.toml create mode 100644 kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/lib.rs create mode 100644 kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/main.rs create mode 100644 kawaii/kawaii-rs/src/emergency_stop.rs create mode 100644 kawaii/kawaii-rs/src/lib.rs create mode 100644 kawaii/kawaii-rs/src/measure.rs create mode 100644 kawaii/kawaii-rs/src/ultrasonic_irq.rs create mode 100644 kawaii/main.cpp create mode 100644 kawaii/measure.cpp create mode 100644 kawaii/measure.hpp create mode 100644 kawaii/remote.cpp create mode 100644 kawaii/rfid_reader.cpp create mode 100644 kawaii/rfid_reader.hpp create mode 100644 kawaii/test.cpp create mode 100644 kawaii/ultrasound_sensor.cpp create mode 100644 kawaii/ultrasound_sensor.hpp create mode 100644 realzeitnachweis.pdf diff --git a/kawaii/CMakeLists.txt b/kawaii/CMakeLists.txt new file mode 100644 index 0000000..1a1543f --- /dev/null +++ b/kawaii/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 3.7) +project(kawaii-engine) + +add_subdirectory(kawaii-rs) + +set(CMAKE_CXX_STANDARD 14) + +set(SOURCE_FILES gpio.cpp engine.cpp measure.cpp) + +if (MEASURE) + add_definitions("-DMEASURE") +endif (MEASURE) + +#add_executable(engine ${SOURCE_FILES} test.cpp ultrasound_sensor.cpp) +#add_executable(remote ${SOURCE_FILES} remote.cpp) +add_executable(kawaii ${SOURCE_FILES} main.cpp ultrasound_sensor.cpp rfid_reader.cpp MFRC522.cpp rfid_reader.cpp emergency_stop.cpp) + +#add_dependencies(engine kawaii-rs) +#add_dependencies(remote kawaii-rs) +add_dependencies(kawaii kawaii-rs) + +#target_link_libraries(engine +# debug "${CMAKE_SOURCE_DIR}/kawaii-rs/target/debug/libkawaii.a" +# optimized "${CMAKE_SOURCE_DIR}/kawaii-rs/target/release/libkawaii.a" +# util dl rt pthread gcc_s c m rt pthread util +# pthread) +#target_link_libraries(remote +# debug "${CMAKE_SOURCE_DIR}/kawaii-rs/target/debug/libkawaii.a" +# optimized "${CMAKE_SOURCE_DIR}/kawaii-rs/target/release/libkawaii.a" +# util dl rt pthread gcc_s c m rt pthread util +# boost_system pthread) +target_link_libraries(kawaii + debug "${CMAKE_SOURCE_DIR}/kawaii-rs/target/debug/libkawaii.a" + optimized "${CMAKE_SOURCE_DIR}/kawaii-rs/target/release/libkawaii.a" + util dl rt pthread gcc_s c m rt pthread util + pthread bcm2835) diff --git a/kawaii/MFRC522.cpp b/kawaii/MFRC522.cpp new file mode 100644 index 0000000..8d4c39b --- /dev/null +++ b/kawaii/MFRC522.cpp @@ -0,0 +1,1755 @@ +/* + * MFRC522.cpp - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. + * NOTE: Please also check the comments in MFRC522.h - they provide useful hints and background information. + * Released into the public domain. + */ + +#include "MFRC522.h" +#include "bcm2835.h" +#include +#include +#include +#include +#include + +#define RSTPIN RPI_V2_GPIO_P1_11 + +using namespace std; + +/** + * Constructor. + * Prepares the output pins. + */ +MFRC522::MFRC522(){ + + if (!bcm2835_init()) { + printf("Failed to initialize. This tool needs root access, use sudo.\n"); + } + bcm2835_gpio_fsel(RSTPIN, BCM2835_GPIO_FSEL_OUTP); + bcm2835_gpio_write(RSTPIN, LOW); + // Set SPI bus to work with MFRC522 chip. + setSPIConfig(); +} // End constructor + +/** + * Set SPI bus to work with MFRC522 chip. + * Please call this function if you have changed the SPI config since the MFRC522 constructor was run. + */ +void MFRC522::setSPIConfig() { + + bcm2835_spi_begin(); + bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default + bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default + bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64); // ~ 4 MHz + bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default + bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default + +} // End setSPIConfig() + +///////////////////////////////////////////////////////////////////////////////////// +// Basic interface functions for communicating with the MFRC522 +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Writes a byte to the specified register in the MFRC522 chip. + * The interface is described in the datasheet section 8.1.2. + */ +void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One of the PCD_Register enums. + byte value ///< The value to write. + ) { + + char data[2]; + data[0] = reg & 0x7E; + data[1] = value; + bcm2835_spi_transfern(data, 2); + +} // End PCD_WriteRegister() + +/** + * Writes a number of bytes to the specified register in the MFRC522 chip. + * The interface is described in the datasheet section 8.1.2. + */ +void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One of the PCD_Register enums. + byte count, ///< The number of bytes to write to the register + byte *values ///< The values to write. Byte array. + ) { + for (byte index = 0; index < count; index++) { + PCD_WriteRegister(reg, values[index]); + } + +} // End PCD_WriteRegister() + +/** + * Reads a byte from the specified register in the MFRC522 chip. + * The interface is described in the datasheet section 8.1.2. + */ +byte MFRC522::PCD_ReadRegister( byte reg ///< The register to read from. One of the PCD_Register enums. + ) { + + char data[2]; + data[0] = 0x80 | ((reg) & 0x7E); + bcm2835_spi_transfern(data,2); + return (byte)data[1]; +} // End PCD_ReadRegister() + +/** + * Reads a number of bytes from the specified register in the MFRC522 chip. + * The interface is described in the datasheet section 8.1.2. + */ +void MFRC522::PCD_ReadRegister( byte reg, ///< The register to read from. One of the PCD_Register enums. + byte count, ///< The number of bytes to read + byte *values, ///< Byte array to store the values in. + byte rxAlign ///< Only bit positions rxAlign..7 in values[0] are updated. + ) { + if (count == 0) { + return; + } + //Serial.print(F("Reading ")); Serial.print(count); Serial.println(F(" bytes from register.")); + byte address = 0x80 | (reg & 0x7E); // MSB == 1 is for reading. LSB is not used in address. Datasheet section 8.1.2.3. + byte index = 0; // Index in values array. + count--; // One read is performed outside of the loop + bcm2835_spi_transfer(address); + while (index < count) { + if (index == 0 && rxAlign) { // Only update bit positions rxAlign..7 in values[0] + // Create bit mask for bit positions rxAlign..7 + byte mask = 0; + for (byte i = rxAlign; i <= 7; i++) { + mask |= (1 << i); + } + // Read value and tell that we want to read the same address again. + byte value = bcm2835_spi_transfer(address); + // Apply mask to both current value of values[0] and the new data in value. + values[0] = (values[index] & ~mask) | (value & mask); + } + else { // Normal case + values[index] = bcm2835_spi_transfer(address); + } + index++; + } + values[index] = bcm2835_spi_transfer(0); // Read the final byte. Send 0 to stop reading. +} // End PCD_ReadRegister() + +/** + * Sets the bits given in mask in register reg. + */ +void MFRC522::PCD_SetRegisterBitMask( byte reg, ///< The register to update. One of the PCD_Register enums. + byte mask ///< The bits to set. + ) { + byte tmp; + tmp = PCD_ReadRegister(reg); + PCD_WriteRegister(reg, tmp | mask); // set bit mask +} // End PCD_SetRegisterBitMask() + +/** + * Clears the bits given in mask from register reg. + */ +void MFRC522::PCD_ClearRegisterBitMask( byte reg, ///< The register to update. One of the PCD_Register enums. + byte mask ///< The bits to clear. + ) { + byte tmp; + tmp = PCD_ReadRegister(reg); + PCD_WriteRegister(reg, tmp & (~mask)); // clear bit mask +} // End PCD_ClearRegisterBitMask() + + +/** + * Use the CRC coprocessor in the MFRC522 to calculate a CRC_A. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PCD_CalculateCRC( byte *data, ///< In: Pointer to the data to transfer to the FIFO for CRC calculation. + byte length, ///< In: The number of bytes to transfer. + byte *result ///< Out: Pointer to result buffer. Result is written to result[0..1], low byte first. + ) { + PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command. + PCD_WriteRegister(DivIrqReg, 0x04); // Clear the CRCIRq interrupt request bit + PCD_SetRegisterBitMask(FIFOLevelReg, 0x80); // FlushBuffer = 1, FIFO initialization + PCD_WriteRegister(FIFODataReg, length, data); // Write data to the FIFO + PCD_WriteRegister(CommandReg, PCD_CalcCRC); // Start the calculation + + // Wait for the CRC calculation to complete. Each iteration of the while-loop takes 17.73�s. + word i = 5000; + byte n; + while (1) { + n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved + if (n & 0x04) { // CRCIRq bit set - calculation done + break; + } + if (--i == 0) { // The emergency break. We will eventually terminate on this one after 89ms. Communication with the MFRC522 might be down. + return STATUS_TIMEOUT; + } + } + PCD_WriteRegister(CommandReg, PCD_Idle); // Stop calculating CRC for new content in the FIFO. + + // Transfer the result from the registers to the result buffer + result[0] = PCD_ReadRegister(CRCResultRegL); + result[1] = PCD_ReadRegister(CRCResultRegH); + return STATUS_OK; +} // End PCD_CalculateCRC() + + +///////////////////////////////////////////////////////////////////////////////////// +// Functions for manipulating the MFRC522 +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Initializes the MFRC522 chip. + */ +void MFRC522::PCD_Init() { + if (bcm2835_gpio_lev(RSTPIN) == LOW) { //The MFRC522 chip is in power down mode. + bcm2835_gpio_write(RSTPIN, HIGH); // Exit power down mode. This triggers a hard reset. + // Section 8.8.2 in the datasheet says the oscillator start-up time is the start up time of the crystal + 37,74�s. Let us be generous: 50ms. + delay(50); + } + else { // Perform a soft reset + PCD_Reset(); + } + + // When communicating with a PICC we need a timeout if something goes wrong. + // f_timer = 13.56 MHz / (2*TPreScaler+1) where TPreScaler = [TPrescaler_Hi:TPrescaler_Lo]. + // TPrescaler_Hi are the four low bits in TModeReg. TPrescaler_Lo is TPrescalerReg. + PCD_WriteRegister(TModeReg, 0x80); // TAuto=1; timer starts automatically at the end of the transmission in all communication modes at all speeds + PCD_WriteRegister(TPrescalerReg, 0xA9); // TPreScaler = TModeReg[3..0]:TPrescalerReg, ie 0x0A9 = 169 => f_timer=40kHz, ie a timer period of 25�s. + PCD_WriteRegister(TReloadRegH, 0x03); // Reload timer with 0x3E8 = 1000, ie 25ms before timeout. + PCD_WriteRegister(TReloadRegL, 0xE8); + + PCD_WriteRegister(TxASKReg, 0x40); // Default 0x00. Force a 100 % ASK modulation independent of the ModGsPReg register setting + PCD_WriteRegister(ModeReg, 0x3D); // Default 0x3F. Set the preset value for the CRC coprocessor for the CalcCRC command to 0x6363 (ISO 14443-3 part 6.2.4) + PCD_AntennaOn(); // Enable the antenna driver pins TX1 and TX2 (they were disabled by the reset) +} // End PCD_Init() + +/** + * Performs a soft reset on the MFRC522 chip and waits for it to be ready again. + */ +void MFRC522::PCD_Reset() { + PCD_WriteRegister(CommandReg, PCD_SoftReset); // Issue the SoftReset command. + // The datasheet does not mention how long the SoftRest command takes to complete. + // But the MFRC522 might have been in soft power-down mode (triggered by bit 4 of CommandReg) + // Section 8.8.2 in the datasheet says the oscillator start-up time is the start up time of the crystal + 37,74�s. Let us be generous: 50ms. + delay(50); + // Wait for the PowerDown bit in CommandReg to be cleared + while (PCD_ReadRegister(CommandReg) & (1<<4)) { + // PCD still restarting - unlikely after waiting 50ms, but better safe than sorry. + } +} // End PCD_Reset() + +/** + * Turns the antenna on by enabling pins TX1 and TX2. + * After a reset these pins are disabled. + */ +void MFRC522::PCD_AntennaOn() { + byte value = PCD_ReadRegister(TxControlReg); + if ((value & 0x03) != 0x03) { + PCD_WriteRegister(TxControlReg, value | 0x03); + } +} // End PCD_AntennaOn() + +/** + * Turns the antenna off by disabling pins TX1 and TX2. + */ +void MFRC522::PCD_AntennaOff() { + PCD_ClearRegisterBitMask(TxControlReg, 0x03); +} // End PCD_AntennaOff() + +/** + * Get the current MFRC522 Receiver Gain (RxGain[2:0]) value. + * See 9.3.3.6 / table 98 in http://www.nxp.com/documents/data_sheet/MFRC522.pdf + * NOTE: Return value scrubbed with (0x07<<4)=01110000b as RCFfgReg may use reserved bits. + * + * @return Value of the RxGain, scrubbed to the 3 bits used. + */ +byte MFRC522::PCD_GetAntennaGain() { + return PCD_ReadRegister(RFCfgReg) & (0x07<<4); +} // End PCD_GetAntennaGain() + +/** + * Set the MFRC522 Receiver Gain (RxGain) to value specified by given mask. + * See 9.3.3.6 / table 98 in http://www.nxp.com/documents/data_sheet/MFRC522.pdf + * NOTE: Given mask is scrubbed with (0x07<<4)=01110000b as RCFfgReg may use reserved bits. + */ +void MFRC522::PCD_SetAntennaGain(byte mask) { + if (PCD_GetAntennaGain() != mask) { // only bother if there is a change + PCD_ClearRegisterBitMask(RFCfgReg, (0x07<<4)); // clear needed to allow 000 pattern + PCD_SetRegisterBitMask(RFCfgReg, mask & (0x07<<4)); // only set RxGain[2:0] bits + } +} // End PCD_SetAntennaGain() + +/** + * Performs a self-test of the MFRC522 + * See 16.1.1 in http://www.nxp.com/documents/data_sheet/MFRC522.pdf + * + * @return Whether or not the test passed. + */ +bool MFRC522::PCD_PerformSelfTest() { + // This follows directly the steps outlined in 16.1.1 + // 1. Perform a soft reset. + PCD_Reset(); + + // 2. Clear the internal buffer by writing 25 bytes of 00h + byte ZEROES[25] = {0x00}; + PCD_SetRegisterBitMask(FIFOLevelReg, 0x80); // flush the FIFO buffer + PCD_WriteRegister(FIFODataReg, 25, ZEROES); // write 25 bytes of 00h to FIFO + PCD_WriteRegister(CommandReg, PCD_Mem); // transfer to internal buffer + + // 3. Enable self-test + PCD_WriteRegister(AutoTestReg, 0x09); + + // 4. Write 00h to FIFO buffer + PCD_WriteRegister(FIFODataReg, 0x00); + + // 5. Start self-test by issuing the CalcCRC command + PCD_WriteRegister(CommandReg, PCD_CalcCRC); + + // 6. Wait for self-test to complete + word i; + byte n; + for (i = 0; i < 0xFF; i++) { + n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved + if (n & 0x04) { // CRCIRq bit set - calculation done + break; + } + } + PCD_WriteRegister(CommandReg, PCD_Idle); // Stop calculating CRC for new content in the FIFO. + + // 7. Read out resulting 64 bytes from the FIFO buffer. + byte result[64]; + PCD_ReadRegister(FIFODataReg, 64, result, 0); + + // Auto self-test done + // Reset AutoTestReg register to be 0 again. Required for normal operation. + PCD_WriteRegister(AutoTestReg, 0x00); + + // Determine firmware version (see section 9.3.4.8 in spec) + byte version = PCD_ReadRegister(VersionReg); + + // Pick the appropriate reference values + const byte *reference; + switch (version) { + case 0x91: // Version 1.0 + reference = MFRC522_firmware_referenceV1_0; + break; + case 0x92: // Version 2.0 + reference = MFRC522_firmware_referenceV2_0; + break; + default: // Unknown version + return false; + } + + // Verify that the results match up to our expectations + for (i = 0; i < 64; i++) { + if (result[i] != reference[i]) { + return false; + } + } + // Test passed; all is good. + return true; +} // End PCD_PerformSelfTest() + +///////////////////////////////////////////////////////////////////////////////////// +// Functions for communicating with PICCs +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Executes the Transceive command. + * CRC validation can only be done if backData and backLen are specified. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PCD_TransceiveData( byte *sendData, ///< Pointer to the data to transfer to the FIFO. + byte sendLen, ///< Number of bytes to transfer to the FIFO. + byte *backData, ///< NULL or pointer to buffer if data should be read back after executing the command. + byte *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned. + byte *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits. Default NULL. + byte rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0. + bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated. + ) { + byte waitIRq = 0x30; // RxIRq and IdleIRq + return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign, checkCRC); +} // End PCD_TransceiveData() + +/** + * Transfers data to the MFRC522 FIFO, executes a command, waits for completion and transfers data back from the FIFO. + * CRC validation can only be done if backData and backLen are specified. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PCD_CommunicateWithPICC( byte command, ///< The command to execute. One of the PCD_Command enums. + byte waitIRq, ///< The bits in the ComIrqReg register that signals successful completion of the command. + byte *sendData, ///< Pointer to the data to transfer to the FIFO. + byte sendLen, ///< Number of bytes to transfer to the FIFO. + byte *backData, ///< NULL or pointer to buffer if data should be read back after executing the command. + byte *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned. + byte *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits. + byte rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0. + bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated. + ) { + byte n, _validBits; + unsigned int i; + + // Prepare values for BitFramingReg + byte txLastBits = validBits ? *validBits : 0; + byte bitFraming = (rxAlign << 4) + txLastBits; // RxAlign = BitFramingReg[6..4]. TxLastBits = BitFramingReg[2..0] + + PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command. + PCD_WriteRegister(ComIrqReg, 0x7F); // Clear all seven interrupt request bits + PCD_SetRegisterBitMask(FIFOLevelReg, 0x80); // FlushBuffer = 1, FIFO initialization + PCD_WriteRegister(FIFODataReg, sendLen, sendData); // Write sendData to the FIFO + PCD_WriteRegister(BitFramingReg, bitFraming); // Bit adjustments + PCD_WriteRegister(CommandReg, command); // Execute the command + if (command == PCD_Transceive) { + PCD_SetRegisterBitMask(BitFramingReg, 0x80); // StartSend=1, transmission of data starts + } + + // Wait for the command to complete. + // In PCD_Init() we set the TAuto flag in TModeReg. This means the timer automatically starts when the PCD stops transmitting. + // Each iteration of the do-while-loop takes 17.86�s. + i = 2000; + while (1) { + n = PCD_ReadRegister(ComIrqReg); // ComIrqReg[7..0] bits are: Set1 TxIRq RxIRq IdleIRq HiAlertIRq LoAlertIRq ErrIRq TimerIRq + if (n & waitIRq) { // One of the interrupts that signal success has been set. + break; + } + if (n & 0x01) { // Timer interrupt - nothing received in 25ms + return STATUS_TIMEOUT; + } + if (--i == 0) { // The emergency break. If all other condions fail we will eventually terminate on this one after 35.7ms. Communication with the MFRC522 might be down. + return STATUS_TIMEOUT; + } + } + + // Stop now if any errors except collisions were detected. + byte errorRegValue = PCD_ReadRegister(ErrorReg); // ErrorReg[7..0] bits are: WrErr TempErr reserved BufferOvfl CollErr CRCErr ParityErr ProtocolErr + if (errorRegValue & 0x13) { // BufferOvfl ParityErr ProtocolErr + return STATUS_ERROR; + } + + // If the caller wants data back, get it from the MFRC522. + if (backData && backLen) { + n = PCD_ReadRegister(FIFOLevelReg); // Number of bytes in the FIFO + if (n > *backLen) { + return STATUS_NO_ROOM; + } + *backLen = n; // Number of bytes returned + PCD_ReadRegister(FIFODataReg, n, backData, rxAlign); // Get received data from FIFO + _validBits = PCD_ReadRegister(ControlReg) & 0x07; // RxLastBits[2:0] indicates the number of valid bits in the last received byte. If this value is 000b, the whole byte is valid. + if (validBits) { + *validBits = _validBits; + } + } + + // Tell about collisions + if (errorRegValue & 0x08) { // CollErr + return STATUS_COLLISION; + } + + // Perform CRC_A validation if requested. + if (backData && backLen && checkCRC) { + // In this case a MIFARE Classic NAK is not OK. + if (*backLen == 1 && _validBits == 4) { + return STATUS_MIFARE_NACK; + } + // We need at least the CRC_A value and all 8 bits of the last byte must be received. + if (*backLen < 2 || _validBits != 0) { + return STATUS_CRC_WRONG; + } + // Verify CRC_A - do our own calculation and store the control in controlBuffer. + byte controlBuffer[2]; + n = PCD_CalculateCRC(&backData[0], *backLen - 2, &controlBuffer[0]); + if (n != STATUS_OK) { + return n; + } + if ((backData[*backLen - 2] != controlBuffer[0]) || (backData[*backLen - 1] != controlBuffer[1])) { + return STATUS_CRC_WRONG; + } + } + + return STATUS_OK; +} // End PCD_CommunicateWithPICC() + +/** + * Transmits a REQuest command, Type A. Invites PICCs in state IDLE to go to READY and prepare for anticollision or selection. 7 bit frame. + * Beware: When two PICCs are in the field at the same time I often get STATUS_TIMEOUT - probably due do bad antenna design. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PICC_RequestA(byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in + byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK. + ) { + return PICC_REQA_or_WUPA(PICC_CMD_REQA, bufferATQA, bufferSize); +} // End PICC_RequestA() + +/** + * Transmits a Wake-UP command, Type A. Invites PICCs in state IDLE and HALT to go to READY(*) and prepare for anticollision or selection. 7 bit frame. + * Beware: When two PICCs are in the field at the same time I often get STATUS_TIMEOUT - probably due do bad antenna design. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PICC_WakeupA( byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in + byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK. + ) { + return PICC_REQA_or_WUPA(PICC_CMD_WUPA, bufferATQA, bufferSize); +} // End PICC_WakeupA() + +/** + * Transmits REQA or WUPA commands. + * Beware: When two PICCs are in the field at the same time I often get STATUS_TIMEOUT - probably due do bad antenna design. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PICC_REQA_or_WUPA( byte command, ///< The command to send - PICC_CMD_REQA or PICC_CMD_WUPA + byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in + byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK. + ) { + byte validBits; + byte status; + + if (bufferATQA == NULL || *bufferSize < 2) { // The ATQA response is 2 bytes long. + return STATUS_NO_ROOM; + } + PCD_ClearRegisterBitMask(CollReg, 0x80); // ValuesAfterColl=1 => Bits received after collision are cleared. + validBits = 7; // For REQA and WUPA we need the short frame format - transmit only 7 bits of the last (and only) byte. TxLastBits = BitFramingReg[2..0] + status = PCD_TransceiveData(&command, 1, bufferATQA, bufferSize, &validBits); + if (status != STATUS_OK) { + return status; + } + if (*bufferSize != 2 || validBits != 0) { // ATQA must be exactly 16 bits. + return STATUS_ERROR; + } + return STATUS_OK; +} // End PICC_REQA_or_WUPA() + +/** + * Transmits SELECT/ANTICOLLISION commands to select a single PICC. + * Before calling this function the PICCs must be placed in the READY(*) state by calling PICC_RequestA() or PICC_WakeupA(). + * On success: + * - The chosen PICC is in state ACTIVE(*) and all other PICCs have returned to state IDLE/HALT. (Figure 7 of the ISO/IEC 14443-3 draft.) + * - The UID size and value of the chosen PICC is returned in *uid along with the SAK. + * + * A PICC UID consists of 4, 7 or 10 bytes. + * Only 4 bytes can be specified in a SELECT command, so for the longer UIDs two or three iterations are used: + * UID size Number of UID bytes Cascade levels Example of PICC + * ======== =================== ============== =============== + * single 4 1 MIFARE Classic + * double 7 2 MIFARE Ultralight + * triple 10 3 Not currently in use? + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally output, but can also be used to supply a known UID. + byte validBits ///< The number of known UID bits supplied in *uid. Normally 0. If set you must also supply uid->size. + ) { + bool uidComplete; + bool selectDone; + bool useCascadeTag; + byte cascadeLevel = 1; + byte result; + byte count; + byte index; + byte uidIndex; // The first index in uid->uidByte[] that is used in the current Cascade Level. + char currentLevelKnownBits; // The number of known UID bits in the current Cascade Level. + byte buffer[9]; // The SELECT/ANTICOLLISION commands uses a 7 byte standard frame + 2 bytes CRC_A + byte bufferUsed; // The number of bytes used in the buffer, ie the number of bytes to transfer to the FIFO. + byte rxAlign; // Used in BitFramingReg. Defines the bit position for the first bit received. + byte txLastBits; // Used in BitFramingReg. The number of valid bits in the last transmitted byte. + byte *responseBuffer; + byte responseLength; + + // Description of buffer structure: + // Byte 0: SEL Indicates the Cascade Level: PICC_CMD_SEL_CL1, PICC_CMD_SEL_CL2 or PICC_CMD_SEL_CL3 + // Byte 1: NVB Number of Valid Bits (in complete command, not just the UID): High nibble: complete bytes, Low nibble: Extra bits. + // Byte 2: UID-data or CT See explanation below. CT means Cascade Tag. + // Byte 3: UID-data + // Byte 4: UID-data + // Byte 5: UID-data + // Byte 6: BCC Block Check Character - XOR of bytes 2-5 + // Byte 7: CRC_A + // Byte 8: CRC_A + // The BCC and CRC_A is only transmitted if we know all the UID bits of the current Cascade Level. + // + // Description of bytes 2-5: (Section 6.5.4 of the ISO/IEC 14443-3 draft: UID contents and cascade levels) + // UID size Cascade level Byte2 Byte3 Byte4 Byte5 + // ======== ============= ===== ===== ===== ===== + // 4 bytes 1 uid0 uid1 uid2 uid3 + // 7 bytes 1 CT uid0 uid1 uid2 + // 2 uid3 uid4 uid5 uid6 + // 10 bytes 1 CT uid0 uid1 uid2 + // 2 CT uid3 uid4 uid5 + // 3 uid6 uid7 uid8 uid9 + + // Sanity checks + if (validBits > 80) { + return STATUS_INVALID; + } + + // Prepare MFRC522 + PCD_ClearRegisterBitMask(CollReg, 0x80); // ValuesAfterColl=1 => Bits received after collision are cleared. + + // Repeat Cascade Level loop until we have a complete UID. + uidComplete = false; + while (!uidComplete) { + // Set the Cascade Level in the SEL byte, find out if we need to use the Cascade Tag in byte 2. + switch (cascadeLevel) { + case 1: + buffer[0] = PICC_CMD_SEL_CL1; + uidIndex = 0; + useCascadeTag = validBits && uid->size > 4; // When we know that the UID has more than 4 bytes + break; + + case 2: + buffer[0] = PICC_CMD_SEL_CL2; + uidIndex = 3; + useCascadeTag = validBits && uid->size > 7; // When we know that the UID has more than 7 bytes + break; + + case 3: + buffer[0] = PICC_CMD_SEL_CL3; + uidIndex = 6; + useCascadeTag = false; // Never used in CL3. + break; + + default: + return STATUS_INTERNAL_ERROR; + break; + } + + // How many UID bits are known in this Cascade Level? + currentLevelKnownBits = validBits - (8 * uidIndex); + if (currentLevelKnownBits < 0) { + currentLevelKnownBits = 0; + } + // Copy the known bits from uid->uidByte[] to buffer[] + index = 2; // destination index in buffer[] + if (useCascadeTag) { + buffer[index++] = PICC_CMD_CT; + } + byte bytesToCopy = currentLevelKnownBits / 8 + (currentLevelKnownBits % 8 ? 1 : 0); // The number of bytes needed to represent the known bits for this level. + if (bytesToCopy) { + byte maxBytes = useCascadeTag ? 3 : 4; // Max 4 bytes in each Cascade Level. Only 3 left if we use the Cascade Tag + if (bytesToCopy > maxBytes) { + bytesToCopy = maxBytes; + } + for (count = 0; count < bytesToCopy; count++) { + buffer[index++] = uid->uidByte[uidIndex + count]; + } + } + // Now that the data has been copied we need to include the 8 bits in CT in currentLevelKnownBits + if (useCascadeTag) { + currentLevelKnownBits += 8; + } + + // Repeat anti collision loop until we can transmit all UID bits + BCC and receive a SAK - max 32 iterations. + selectDone = false; + while (!selectDone) { + // Find out how many bits and bytes to send and receive. + if (currentLevelKnownBits >= 32) { // All UID bits in this Cascade Level are known. This is a SELECT. + //Serial.print(F("SELECT: currentLevelKnownBits=")); Serial.println(currentLevelKnownBits, DEC); + buffer[1] = 0x70; // NVB - Number of Valid Bits: Seven whole bytes + // Calculate BCC - Block Check Character + buffer[6] = buffer[2] ^ buffer[3] ^ buffer[4] ^ buffer[5]; + // Calculate CRC_A + result = PCD_CalculateCRC(buffer, 7, &buffer[7]); + if (result != STATUS_OK) { + return result; + } + txLastBits = 0; // 0 => All 8 bits are valid. + bufferUsed = 9; + // Store response in the last 3 bytes of buffer (BCC and CRC_A - not needed after tx) + responseBuffer = &buffer[6]; + responseLength = 3; + } + else { // This is an ANTICOLLISION. + //Serial.print(F("ANTICOLLISION: currentLevelKnownBits=")); Serial.println(currentLevelKnownBits, DEC); + txLastBits = currentLevelKnownBits % 8; + count = currentLevelKnownBits / 8; // Number of whole bytes in the UID part. + index = 2 + count; // Number of whole bytes: SEL + NVB + UIDs + buffer[1] = (index << 4) + txLastBits; // NVB - Number of Valid Bits + bufferUsed = index + (txLastBits ? 1 : 0); + // Store response in the unused part of buffer + responseBuffer = &buffer[index]; + responseLength = sizeof(buffer) - index; + } + + // Set bit adjustments + rxAlign = txLastBits; // Having a seperate variable is overkill. But it makes the next line easier to read. + PCD_WriteRegister(BitFramingReg, (rxAlign << 4) + txLastBits); // RxAlign = BitFramingReg[6..4]. TxLastBits = BitFramingReg[2..0] + + // Transmit the buffer and receive the response. + result = PCD_TransceiveData(buffer, bufferUsed, responseBuffer, &responseLength, &txLastBits, rxAlign); + if (result == STATUS_COLLISION) { // More than one PICC in the field => collision. + result = PCD_ReadRegister(CollReg); // CollReg[7..0] bits are: ValuesAfterColl reserved CollPosNotValid CollPos[4:0] + if (result & 0x20) { // CollPosNotValid + return STATUS_COLLISION; // Without a valid collision position we cannot continue + } + byte collisionPos = result & 0x1F; // Values 0-31, 0 means bit 32. + if (collisionPos == 0) { + collisionPos = 32; + } + if (collisionPos <= currentLevelKnownBits) { // No progress - should not happen + return STATUS_INTERNAL_ERROR; + } + // Choose the PICC with the bit set. + currentLevelKnownBits = collisionPos; + count = (currentLevelKnownBits - 1) % 8; // The bit to modify + index = 1 + (currentLevelKnownBits / 8) + (count ? 1 : 0); // First byte is index 0. + buffer[index] |= (1 << count); + } + else if (result != STATUS_OK) { + return result; + } + else { // STATUS_OK + if (currentLevelKnownBits >= 32) { // This was a SELECT. + selectDone = true; // No more anticollision + // We continue below outside the while. + } + else { // This was an ANTICOLLISION. + // We now have all 32 bits of the UID in this Cascade Level + currentLevelKnownBits = 32; + // Run loop again to do the SELECT. + } + } + } // End of while (!selectDone) + + // We do not check the CBB - it was constructed by us above. + + // Copy the found UID bytes from buffer[] to uid->uidByte[] + index = (buffer[2] == PICC_CMD_CT) ? 3 : 2; // source index in buffer[] + bytesToCopy = (buffer[2] == PICC_CMD_CT) ? 3 : 4; + for (count = 0; count < bytesToCopy; count++) { + uid->uidByte[uidIndex + count] = buffer[index++]; + } + + // Check response SAK (Select Acknowledge) + if (responseLength != 3 || txLastBits != 0) { // SAK must be exactly 24 bits (1 byte + CRC_A). + return STATUS_ERROR; + } + // Verify CRC_A - do our own calculation and store the control in buffer[2..3] - those bytes are not needed anymore. + result = PCD_CalculateCRC(responseBuffer, 1, &buffer[2]); + if (result != STATUS_OK) { + return result; + } + if ((buffer[2] != responseBuffer[1]) || (buffer[3] != responseBuffer[2])) { + return STATUS_CRC_WRONG; + } + if (responseBuffer[0] & 0x04) { // Cascade bit set - UID not complete yes + cascadeLevel++; + } + else { + uidComplete = true; + uid->sak = responseBuffer[0]; + } + } // End of while (!uidComplete) + + // Set correct uid->size + uid->size = 3 * cascadeLevel + 1; + + return STATUS_OK; +} // End PICC_Select() + +/** + * Instructs a PICC in state ACTIVE(*) to go to state HALT. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PICC_HaltA() { + byte result; + byte buffer[4]; + + // Build command buffer + buffer[0] = PICC_CMD_HLTA; + buffer[1] = 0; + // Calculate CRC_A + result = PCD_CalculateCRC(buffer, 2, &buffer[2]); + if (result != STATUS_OK) { + return result; + } + + // Send the command. + // The standard says: + // If the PICC responds with any modulation during a period of 1 ms after the end of the frame containing the + // HLTA command, this response shall be interpreted as 'not acknowledge'. + // We interpret that this way: Only STATUS_TIMEOUT is an success. + result = PCD_TransceiveData(buffer, sizeof(buffer), NULL, 0); + if (result == STATUS_TIMEOUT) { + return STATUS_OK; + } + if (result == STATUS_OK) { // That is ironically NOT ok in this case ;-) + return STATUS_ERROR; + } + return result; +} // End PICC_HaltA() + + +///////////////////////////////////////////////////////////////////////////////////// +// Functions for communicating with MIFARE PICCs +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Executes the MFRC522 MFAuthent command. + * This command manages MIFARE authentication to enable a secure communication to any MIFARE Mini, MIFARE 1K and MIFARE 4K card. + * The authentication is described in the MFRC522 datasheet section 10.3.1.9 and http://www.nxp.com/documents/data_sheet/MF1S503x.pdf section 10.1. + * For use with MIFARE Classic PICCs. + * The PICC must be selected - ie in state ACTIVE(*) - before calling this function. + * Remember to call PCD_StopCrypto1() after communicating with the authenticated PICC - otherwise no new communications can start. + * + * All keys are set to FFFFFFFFFFFFh at chip delivery. + * + * @return STATUS_OK on success, STATUS_??? otherwise. Probably STATUS_TIMEOUT if you supply the wrong key. + */ +byte MFRC522::PCD_Authenticate(byte command, ///< PICC_CMD_MF_AUTH_KEY_A or PICC_CMD_MF_AUTH_KEY_B + byte blockAddr, ///< The block number. See numbering in the comments in the .h file. + MIFARE_Key *key, ///< Pointer to the Crypteo1 key to use (6 bytes) + Uid *uid ///< Pointer to Uid struct. The first 4 bytes of the UID is used. + ) { + byte waitIRq = 0x10; // IdleIRq + + // Build command buffer + byte sendData[12]; + sendData[0] = command; + sendData[1] = blockAddr; + for (byte i = 0; i < MF_KEY_SIZE; i++) { // 6 key bytes + sendData[2+i] = key->keyByte[i]; + } + for (byte i = 0; i < 4; i++) { // The first 4 bytes of the UID + sendData[8+i] = uid->uidByte[i]; + } + + // Start the authentication. + return PCD_CommunicateWithPICC(PCD_MFAuthent, waitIRq, &sendData[0], sizeof(sendData)); +} // End PCD_Authenticate() + +/** + * Used to exit the PCD from its authenticated state. + * Remember to call this function after communicating with an authenticated PICC - otherwise no new communications can start. + */ +void MFRC522::PCD_StopCrypto1() { + // Clear MFCrypto1On bit + PCD_ClearRegisterBitMask(Status2Reg, 0x08); // Status2Reg[7..0] bits are: TempSensClear I2CForceHS reserved reserved MFCrypto1On ModemState[2:0] +} // End PCD_StopCrypto1() + +/** + * Reads 16 bytes (+ 2 bytes CRC_A) from the active PICC. + * + * For MIFARE Classic the sector containing the block must be authenticated before calling this function. + * + * For MIFARE Ultralight only addresses 00h to 0Fh are decoded. + * The MF0ICU1 returns a NAK for higher addresses. + * The MF0ICU1 responds to the READ command by sending 16 bytes starting from the page address defined by the command argument. + * For example; if blockAddr is 03h then pages 03h, 04h, 05h, 06h are returned. + * A roll-back is implemented: If blockAddr is 0Eh, then the contents of pages 0Eh, 0Fh, 00h and 01h are returned. + * + * The buffer must be at least 18 bytes because a CRC_A is also returned. + * Checks the CRC_A before returning STATUS_OK. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Read( byte blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The first page to return data from. + byte *buffer, ///< The buffer to store the data in + byte *bufferSize ///< Buffer size, at least 18 bytes. Also number of bytes returned if STATUS_OK. + ) { + byte result; + + // Sanity check + if (buffer == NULL || *bufferSize < 18) { + return STATUS_NO_ROOM; + } + + // Build command buffer + buffer[0] = PICC_CMD_MF_READ; + buffer[1] = blockAddr; + // Calculate CRC_A + result = PCD_CalculateCRC(buffer, 2, &buffer[2]); + if (result != STATUS_OK) { + return result; + } + + // Transmit the buffer and receive the response, validate CRC_A. + return PCD_TransceiveData(buffer, 4, buffer, bufferSize, NULL, 0, true); +} // End MIFARE_Read() + +/** + * Writes 16 bytes to the active PICC. + * + * For MIFARE Classic the sector containing the block must be authenticated before calling this function. + * + * For MIFARE Ultralight the operation is called "COMPATIBILITY WRITE". + * Even though 16 bytes are transferred to the Ultralight PICC, only the least significant 4 bytes (bytes 0 to 3) + * are written to the specified address. It is recommended to set the remaining bytes 04h to 0Fh to all logic 0. + * * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Write( byte blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The page (2-15) to write to. + byte *buffer, ///< The 16 bytes to write to the PICC + byte bufferSize ///< Buffer size, must be at least 16 bytes. Exactly 16 bytes are written. + ) { + byte result; + + // Sanity check + if (buffer == NULL || bufferSize < 16) { + return STATUS_INVALID; + } + + // Mifare Classic protocol requires two communications to perform a write. + // Step 1: Tell the PICC we want to write to block blockAddr. + byte cmdBuffer[2]; + cmdBuffer[0] = PICC_CMD_MF_WRITE; + cmdBuffer[1] = blockAddr; + result = PCD_MIFARE_Transceive(cmdBuffer, 2); // Adds CRC_A and checks that the response is MF_ACK. + if (result != STATUS_OK) { + return result; + } + + // Step 2: Transfer the data + result = PCD_MIFARE_Transceive(buffer, bufferSize); // Adds CRC_A and checks that the response is MF_ACK. + if (result != STATUS_OK) { + return result; + } + + return STATUS_OK; +} // End MIFARE_Write() + +/** + * Writes a 4 byte page to the active MIFARE Ultralight PICC. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Ultralight_Write( byte page, ///< The page (2-15) to write to. + byte *buffer, ///< The 4 bytes to write to the PICC + byte bufferSize ///< Buffer size, must be at least 4 bytes. Exactly 4 bytes are written. + ) { + byte result; + + // Sanity check + if (buffer == NULL || bufferSize < 4) { + return STATUS_INVALID; + } + + // Build commmand buffer + byte cmdBuffer[6]; + cmdBuffer[0] = PICC_CMD_UL_WRITE; + cmdBuffer[1] = page; + memcpy(&cmdBuffer[2], buffer, 4); + + // Perform the write + result = PCD_MIFARE_Transceive(cmdBuffer, 6); // Adds CRC_A and checks that the response is MF_ACK. + if (result != STATUS_OK) { + return result; + } + return STATUS_OK; +} // End MIFARE_Ultralight_Write() + +/** + * MIFARE Decrement subtracts the delta from the value of the addressed block, and stores the result in a volatile memory. + * For MIFARE Classic only. The sector containing the block must be authenticated before calling this function. + * Only for blocks in "value block" mode, ie with access bits [C1 C2 C3] = [110] or [001]. + * Use MIFARE_Transfer() to store the result in a block. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Decrement( byte blockAddr, ///< The block (0-0xff) number. + long delta ///< This number is subtracted from the value of block blockAddr. + ) { + return MIFARE_TwoStepHelper(PICC_CMD_MF_DECREMENT, blockAddr, delta); +} // End MIFARE_Decrement() + +/** + * MIFARE Increment adds the delta to the value of the addressed block, and stores the result in a volatile memory. + * For MIFARE Classic only. The sector containing the block must be authenticated before calling this function. + * Only for blocks in "value block" mode, ie with access bits [C1 C2 C3] = [110] or [001]. + * Use MIFARE_Transfer() to store the result in a block. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Increment( byte blockAddr, ///< The block (0-0xff) number. + long delta ///< This number is added to the value of block blockAddr. + ) { + return MIFARE_TwoStepHelper(PICC_CMD_MF_INCREMENT, blockAddr, delta); +} // End MIFARE_Increment() + +/** + * MIFARE Restore copies the value of the addressed block into a volatile memory. + * For MIFARE Classic only. The sector containing the block must be authenticated before calling this function. + * Only for blocks in "value block" mode, ie with access bits [C1 C2 C3] = [110] or [001]. + * Use MIFARE_Transfer() to store the result in a block. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Restore( byte blockAddr ///< The block (0-0xff) number. + ) { + // The datasheet describes Restore as a two step operation, but does not explain what data to transfer in step 2. + // Doing only a single step does not work, so I chose to transfer 0L in step two. + return MIFARE_TwoStepHelper(PICC_CMD_MF_RESTORE, blockAddr, 0L); +} // End MIFARE_Restore() + +/** + * Helper function for the two-step MIFARE Classic protocol operations Decrement, Increment and Restore. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_TwoStepHelper( byte command, ///< The command to use + byte blockAddr, ///< The block (0-0xff) number. + long data ///< The data to transfer in step 2 + ) { + byte result; + byte cmdBuffer[2]; // We only need room for 2 bytes. + + // Step 1: Tell the PICC the command and block address + cmdBuffer[0] = command; + cmdBuffer[1] = blockAddr; + result = PCD_MIFARE_Transceive( cmdBuffer, 2); // Adds CRC_A and checks that the response is MF_ACK. + if (result != STATUS_OK) { + return result; + } + + // Step 2: Transfer the data + result = PCD_MIFARE_Transceive( (byte *)&data, 4, true); // Adds CRC_A and accept timeout as success. + if (result != STATUS_OK) { + return result; + } + + return STATUS_OK; +} // End MIFARE_TwoStepHelper() + +/** + * MIFARE Transfer writes the value stored in the volatile memory into one MIFARE Classic block. + * For MIFARE Classic only. The sector containing the block must be authenticated before calling this function. + * Only for blocks in "value block" mode, ie with access bits [C1 C2 C3] = [110] or [001]. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_Transfer( byte blockAddr ///< The block (0-0xff) number. + ) { + byte result; + byte cmdBuffer[2]; // We only need room for 2 bytes. + + // Tell the PICC we want to transfer the result into block blockAddr. + cmdBuffer[0] = PICC_CMD_MF_TRANSFER; + cmdBuffer[1] = blockAddr; + result = PCD_MIFARE_Transceive( cmdBuffer, 2); // Adds CRC_A and checks that the response is MF_ACK. + if (result != STATUS_OK) { + return result; + } + return STATUS_OK; +} // End MIFARE_Transfer() + +/** + * Helper routine to read the current value from a Value Block. + * + * Only for MIFARE Classic and only for blocks in "value block" mode, that + * is: with access bits [C1 C2 C3] = [110] or [001]. The sector containing + * the block must be authenticated before calling this function. + * + * @param[in] blockAddr The block (0x00-0xff) number. + * @param[out] value Current value of the Value Block. + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_GetValue(byte blockAddr, long *value) { + byte status; + byte buffer[18]; + byte size = sizeof(buffer); + + // Read the block + status = MIFARE_Read(blockAddr, buffer, &size); + if (status == STATUS_OK) { + // Extract the value + *value = (long(buffer[3])<<24) | (long(buffer[2])<<16) | (long(buffer[1])<<8) | long(buffer[0]); + } + return status; +} // End MIFARE_GetValue() + +/** + * Helper routine to write a specific value into a Value Block. + * + * Only for MIFARE Classic and only for blocks in "value block" mode, that + * is: with access bits [C1 C2 C3] = [110] or [001]. The sector containing + * the block must be authenticated before calling this function. + * + * @param[in] blockAddr The block (0x00-0xff) number. + * @param[in] value New value of the Value Block. + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_SetValue(byte blockAddr, long value) { + byte buffer[18]; + + // Translate the long into 4 bytes; repeated 2x in value block + buffer[0] = buffer[ 8] = (value & 0xFF); + buffer[1] = buffer[ 9] = (value & 0xFF00) >> 8; + buffer[2] = buffer[10] = (value & 0xFF0000) >> 16; + buffer[3] = buffer[11] = (value & 0xFF000000) >> 24; + // Inverse 4 bytes also found in value block + buffer[4] = ~buffer[0]; + buffer[5] = ~buffer[1]; + buffer[6] = ~buffer[2]; + buffer[7] = ~buffer[3]; + // Address 2x with inverse address 2x + buffer[12] = buffer[14] = blockAddr; + buffer[13] = buffer[15] = ~blockAddr; + + // Write the whole data block + return MIFARE_Write(blockAddr, buffer, 16); +} // End MIFARE_SetValue() + +///////////////////////////////////////////////////////////////////////////////////// +// Support functions +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Wrapper for MIFARE protocol communication. + * Adds CRC_A, executes the Transceive command and checks that the response is MF_ACK or a timeout. + * + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::PCD_MIFARE_Transceive( byte *sendData, ///< Pointer to the data to transfer to the FIFO. Do NOT include the CRC_A. + byte sendLen, ///< Number of bytes in sendData. + bool acceptTimeout ///< True => A timeout is also success + ) { + byte result; + byte cmdBuffer[18]; // We need room for 16 bytes data and 2 bytes CRC_A. + + // Sanity check + if (sendData == NULL || sendLen > 16) { + return STATUS_INVALID; + } + + // Copy sendData[] to cmdBuffer[] and add CRC_A + memcpy(cmdBuffer, sendData, sendLen); + result = PCD_CalculateCRC(cmdBuffer, sendLen, &cmdBuffer[sendLen]); + if (result != STATUS_OK) { + return result; + } + sendLen += 2; + + // Transceive the data, store the reply in cmdBuffer[] + byte waitIRq = 0x30; // RxIRq and IdleIRq + byte cmdBufferSize = sizeof(cmdBuffer); + byte validBits = 0; + result = PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, cmdBuffer, sendLen, cmdBuffer, &cmdBufferSize, &validBits); + if (acceptTimeout && result == STATUS_TIMEOUT) { + return STATUS_OK; + } + if (result != STATUS_OK) { + return result; + } + // The PICC must reply with a 4 bit ACK + if (cmdBufferSize != 1 || validBits != 4) { + return STATUS_ERROR; + } + if (cmdBuffer[0] != MF_ACK) { + return STATUS_MIFARE_NACK; + } + return STATUS_OK; +} // End PCD_MIFARE_Transceive() + +/** + * Returns a __FlashStringHelper pointer to a status code name. + * + */ +const string MFRC522::GetStatusCodeName(byte code ///< One of the StatusCode enums. + ) { + switch (code) { + case STATUS_OK: return ("Success."); break; + case STATUS_ERROR: return ("Error in communication."); break; + case STATUS_COLLISION: return ("Collission detected."); break; + case STATUS_TIMEOUT: return ("Timeout in communication."); break; + case STATUS_NO_ROOM: return ("A buffer is not big enough."); break; + case STATUS_INTERNAL_ERROR: return ("Internal error in the code. Should not happen."); break; + case STATUS_INVALID: return ("Invalid argument."); break; + case STATUS_CRC_WRONG: return ("The CRC_A does not match."); break; + case STATUS_MIFARE_NACK: return ("A MIFARE PICC responded with NAK."); break; + default: return ("Unknown error"); break; + } +} // End GetStatusCodeName() + +/** + * Translates the SAK (Select Acknowledge) to a PICC type. + * + * @return PICC_Type + */ +byte MFRC522::PICC_GetType(byte sak ///< The SAK byte returned from PICC_Select(). + ) { + if (sak & 0x04) { // UID not complete + return PICC_TYPE_NOT_COMPLETE; + } + + switch (sak) { + case 0x09: return PICC_TYPE_MIFARE_MINI; break; + case 0x08: return PICC_TYPE_MIFARE_1K; break; + case 0x18: return PICC_TYPE_MIFARE_4K; break; + case 0x00: return PICC_TYPE_MIFARE_UL; break; + case 0x10: + case 0x11: return PICC_TYPE_MIFARE_PLUS; break; + case 0x01: return PICC_TYPE_TNP3XXX; break; + default: break; + } + + if (sak & 0x20) { + return PICC_TYPE_ISO_14443_4; + } + + if (sak & 0x40) { + return PICC_TYPE_ISO_18092; + } + + return PICC_TYPE_UNKNOWN; +} // End PICC_GetType() + +/** + * Returns a String pointer to the PICC type name. + * + */ +const string MFRC522::PICC_GetTypeName(byte piccType ///< One of the PICC_Type enums. + ) { + switch (piccType) { + case PICC_TYPE_ISO_14443_4: return ("PICC compliant with ISO/IEC 14443-4"); break; + case PICC_TYPE_ISO_18092: return ("PICC compliant with ISO/IEC 18092 (NFC)");break; + case PICC_TYPE_MIFARE_MINI: return ("MIFARE Mini, 320 bytes"); break; + case PICC_TYPE_MIFARE_1K: return ("MIFARE 1KB"); break; + case PICC_TYPE_MIFARE_4K: return ("MIFARE 4KB"); break; + case PICC_TYPE_MIFARE_UL: return ("MIFARE Ultralight or Ultralight C"); break; + case PICC_TYPE_MIFARE_PLUS: return ("MIFARE Plus"); break; + case PICC_TYPE_TNP3XXX: return ("MIFARE TNP3XXX"); break; + case PICC_TYPE_NOT_COMPLETE: return ("SAK indicates UID is not complete."); break; + case PICC_TYPE_UNKNOWN: + default: return ("Unknown type"); break; + } +} // End PICC_GetTypeName() + +/** + * Dumps debug info about the selected PICC to Serial. + * On success the PICC is halted after dumping the data. + * For MIFARE Classic the factory default key of 0xFFFFFFFFFFFF is tried. + */ +void MFRC522::PICC_DumpToSerial(Uid *uid ///< Pointer to Uid struct returned from a successful PICC_Select(). + ) { + MIFARE_Key key; + + // UID + printf("Card UID:"); + for (byte i = 0; i < uid->size; i++) { + if(uid->uidByte[i] < 0x10) + printf(" 0"); + else + printf(" "); + printf("%X", uid->uidByte[i]); + } + printf("\n"); + + // PICC type + byte piccType = PICC_GetType(uid->sak); + printf("PICC type: "); + //Serial.println(PICC_GetTypeName(piccType)); + printf("%s", PICC_GetTypeName(piccType).c_str()); + + // Dump contents + switch (piccType) { + case PICC_TYPE_MIFARE_MINI: + case PICC_TYPE_MIFARE_1K: + case PICC_TYPE_MIFARE_4K: + // All keys are set to FFFFFFFFFFFFh at chip delivery from the factory. + for (byte i = 0; i < 6; i++) { + key.keyByte[i] = 0xFF; + } + PICC_DumpMifareClassicToSerial(uid, piccType, &key); + break; + + case PICC_TYPE_MIFARE_UL: + PICC_DumpMifareUltralightToSerial(); + break; + + case PICC_TYPE_ISO_14443_4: + case PICC_TYPE_ISO_18092: + case PICC_TYPE_MIFARE_PLUS: + case PICC_TYPE_TNP3XXX: + printf("Dumping memory contents not implemented for that PICC type."); + break; + + case PICC_TYPE_UNKNOWN: + case PICC_TYPE_NOT_COMPLETE: + default: + break; // No memory dump here + } + + printf("\n"); + PICC_HaltA(); // Already done if it was a MIFARE Classic PICC. +} // End PICC_DumpToSerial() + +/** + * Dumps memory contents of a MIFARE Classic PICC. + * On success the PICC is halted after dumping the data. + */ +void MFRC522::PICC_DumpMifareClassicToSerial( Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select(). + byte piccType, ///< One of the PICC_Type enums. + MIFARE_Key *key ///< Key A used for all sectors. + ) { + byte no_of_sectors = 0; + switch (piccType) { + case PICC_TYPE_MIFARE_MINI: + // Has 5 sectors * 4 blocks/sector * 16 bytes/block = 320 bytes. + no_of_sectors = 5; + break; + + case PICC_TYPE_MIFARE_1K: + // Has 16 sectors * 4 blocks/sector * 16 bytes/block = 1024 bytes. + no_of_sectors = 16; + break; + + case PICC_TYPE_MIFARE_4K: + // Has (32 sectors * 4 blocks/sector + 8 sectors * 16 blocks/sector) * 16 bytes/block = 4096 bytes. + no_of_sectors = 40; + break; + + default: // Should not happen. Ignore. + break; + } + + // Dump sectors, highest address first. + if (no_of_sectors) { + printf("Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AccessBits\n"); + for (char i = no_of_sectors - 1; i >= 0; i--) { + PICC_DumpMifareClassicSectorToSerial(uid, key, i); + } + } + PICC_HaltA(); // Halt the PICC before stopping the encrypted session. + PCD_StopCrypto1(); +} // End PICC_DumpMifareClassicToSerial() + +/** + * Dumps memory contents of a sector of a MIFARE Classic PICC. + * Uses PCD_Authenticate(), MIFARE_Read() and PCD_StopCrypto1. + * Always uses PICC_CMD_MF_AUTH_KEY_A because only Key A can always read the sector trailer access bits. + */ +void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select(). + MIFARE_Key *key, ///< Key A for the sector. + byte sector ///< The sector to dump, 0..39. + ) { + byte status; + byte firstBlock; // Address of lowest address to dump actually last block dumped) + byte no_of_blocks; // Number of blocks in sector + bool isSectorTrailer; // Set to true while handling the "last" (ie highest address) in the sector. + + // The access bits are stored in a peculiar fashion. + // There are four groups: + // g[3] Access bits for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39) + // g[2] Access bits for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39) + // g[1] Access bits for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39) + // g[0] Access bits for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39) + // Each group has access bits [C1 C2 C3]. In this code C1 is MSB and C3 is LSB. + // The four CX bits are stored together in a nible cx and an inverted nible cx_. + byte c1, c2, c3; // Nibbles + byte c1_, c2_, c3_; // Inverted nibbles + bool invertedError; // True if one of the inverted nibbles did not match + byte g[4]; // Access bits for each of the four groups. + byte group; // 0-3 - active group for access bits + bool firstInGroup; // True for the first block dumped in the group + + // Determine position and size of sector. + if (sector < 32) { // Sectors 0..31 has 4 blocks each + no_of_blocks = 4; + firstBlock = sector * no_of_blocks; + } + else if (sector < 40) { // Sectors 32-39 has 16 blocks each + no_of_blocks = 16; + firstBlock = 128 + (sector - 32) * no_of_blocks; + } + else { // Illegal input, no MIFARE Classic PICC has more than 40 sectors. + return; + } + + // Dump blocks, highest address first. + byte byteCount; + byte buffer[18]; + byte blockAddr; + isSectorTrailer = true; + for (char blockOffset = no_of_blocks - 1; blockOffset >= 0; blockOffset--) { + blockAddr = firstBlock + blockOffset; + // Sector number - only on first line + if (isSectorTrailer) { + if(sector < 10) + printf(" "); // Pad with spaces + else + printf(" "); // Pad with spaces + printf("%02X",sector); + printf(" "); + } + else { + printf(" "); + } + // Block number + if(blockAddr < 10) + printf(" "); // Pad with spaces + else { + if(blockAddr < 100) + printf(" "); // Pad with spaces + else + printf(" "); // Pad with spaces + } + printf("%02X",blockAddr); + printf(" "); + // Establish encrypted communications before reading the first block + if (isSectorTrailer) { + status = PCD_Authenticate(PICC_CMD_MF_AUTH_KEY_A, firstBlock, key, uid); + if (status != STATUS_OK) { + printf("PCD_Authenticate() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + return; + } + } + // Read block + byteCount = sizeof(buffer); + status = MIFARE_Read(blockAddr, buffer, &byteCount); + if (status != STATUS_OK) { + printf("MIFARE_Read() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + continue; + } + // Dump data + for (byte index = 0; index < 16; index++) { + if(buffer[index] < 0x10) + printf(" 0"); + else + printf(" "); + printf("9x%02X",buffer[index]); + if ((index % 4) == 3) { + printf(" "); + } + } + // Parse sector trailer data + if (isSectorTrailer) { + c1 = buffer[7] >> 4; + c2 = buffer[8] & 0xF; + c3 = buffer[8] >> 4; + c1_ = buffer[6] & 0xF; + c2_ = buffer[6] >> 4; + c3_ = buffer[7] & 0xF; + invertedError = (c1 != (~c1_ & 0xF)) || (c2 != (~c2_ & 0xF)) || (c3 != (~c3_ & 0xF)); + g[0] = ((c1 & 1) << 2) | ((c2 & 1) << 1) | ((c3 & 1) << 0); + g[1] = ((c1 & 2) << 1) | ((c2 & 2) << 0) | ((c3 & 2) >> 1); + g[2] = ((c1 & 4) << 0) | ((c2 & 4) >> 1) | ((c3 & 4) >> 2); + g[3] = ((c1 & 8) >> 1) | ((c2 & 8) >> 2) | ((c3 & 8) >> 3); + isSectorTrailer = false; + } + + // Which access group is this block in? + if (no_of_blocks == 4) { + group = blockOffset; + firstInGroup = true; + } + else { + group = blockOffset / 5; + firstInGroup = (group == 3) || (group != (blockOffset + 1) / 5); + } + + if (firstInGroup) { + // Print access bits + printf(" [ "); + printf("%02X" ,(g[group] >> 2) & 1); printf(" "); + printf("%02X", (g[group] >> 1) & 1); printf(" "); + printf("%02X", (g[group] >> 0) & 1); + printf(" ] "); + + if (invertedError) { + printf(" Inverted access bits did not match! "); + } + } + + if (group != 3 && (g[group] == 1 || g[group] == 6)) { // Not a sector trailer, a value block + long value = (long(buffer[3])<<24) | (long(buffer[2])<<16) | (long(buffer[1])<<8) | long(buffer[0]); + printf(" Value="); printf("0x%02X", value); + printf(" Adr="); printf("0x%02X", buffer[12]); + } + printf("\n"); + } + + return; +} // End PICC_DumpMifareClassicSectorToSerial() + +/** + * Dumps memory contents of a MIFARE Ultralight PICC. + */ +void MFRC522::PICC_DumpMifareUltralightToSerial() { + byte status; + byte byteCount; + byte buffer[18]; + byte i; + + printf("Page 0 1 2 3"); + // Try the mpages of the original Ultralight. Ultralight C has more pages. + for (byte page = 0; page < 16; page +=4) { // Read returns data for 4 pages at a time. + // Read pages + byteCount = sizeof(buffer); + status = MIFARE_Read(page, buffer, &byteCount); + if (status != STATUS_OK) { + printf("MIFARE_Read() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + break; + } + // Dump data + for (byte offset = 0; offset < 4; offset++) { + i = page + offset; + if(i < 10) + printf(" "); // Pad with spaces + else + printf(" "); // Pad with spaces + printf("%02X",i); + printf(" "); + for (byte index = 0; index < 4; index++) { + i = 4 * offset + index; + if(buffer[i] < 0x10) + printf(" 0"); + else + printf(" "); + printf("%0x%02X",buffer[i]); + } + printf("\n"); + } + } +} // End PICC_DumpMifareUltralightToSerial() + +/** + * Calculates the bit pattern needed for the specified access bits. In the [C1 C2 C3] tupples C1 is MSB (=4) and C3 is LSB (=1). + */ +void MFRC522::MIFARE_SetAccessBits( byte *accessBitBuffer, ///< Pointer to byte 6, 7 and 8 in the sector trailer. Bytes [0..2] will be set. + byte g0, ///< Access bits [C1 C2 C3] for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39) + byte g1, ///< Access bits C1 C2 C3] for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39) + byte g2, ///< Access bits C1 C2 C3] for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39) + byte g3 ///< Access bits C1 C2 C3] for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39) + ) { + byte c1 = ((g3 & 4) << 1) | ((g2 & 4) << 0) | ((g1 & 4) >> 1) | ((g0 & 4) >> 2); + byte c2 = ((g3 & 2) << 2) | ((g2 & 2) << 1) | ((g1 & 2) << 0) | ((g0 & 2) >> 1); + byte c3 = ((g3 & 1) << 3) | ((g2 & 1) << 2) | ((g1 & 1) << 1) | ((g0 & 1) << 0); + + accessBitBuffer[0] = (~c2 & 0xF) << 4 | (~c1 & 0xF); + accessBitBuffer[1] = c1 << 4 | (~c3 & 0xF); + accessBitBuffer[2] = c3 << 4 | c2; +} // End MIFARE_SetAccessBits() + + +/** + * Performs the "magic sequence" needed to get Chinese UID changeable + * Mifare cards to allow writing to sector 0, where the card UID is stored. + * + * Note that you do not need to have selected the card through REQA or WUPA, + * this sequence works immediately when the card is in the reader vicinity. + * This means you can use this method even on "bricked" cards that your reader does + * not recognise anymore (see MFRC522::MIFARE_UnbrickUidSector). + * + * Of course with non-bricked devices, you're free to select them before calling this function. + */ +bool MFRC522::MIFARE_OpenUidBackdoor(bool logErrors) { + // Magic sequence: + // > 50 00 57 CD (HALT + CRC) + // > 40 (7 bits only) + // < A (4 bits only) + // > 43 + // < A (4 bits only) + // Then you can write to sector 0 without authenticating + + PICC_HaltA(); // 50 00 57 CD + + byte cmd = 0x40; + byte validBits = 7; /* Our command is only 7 bits. After receiving card response, + this will contain amount of valid response bits. */ + byte response[32]; // Card's response is written here + byte received; + byte status = PCD_TransceiveData(&cmd, (byte)1, response, &received, &validBits, (byte)0, false); // 40 + if(status != STATUS_OK) { + if(logErrors) { + printf("Card did not respond to 0x40 after HALT command. Are you sure it is a UID changeable one?"); + printf("Error name: "); + printf("%s",GetStatusCodeName(status).c_str()); + } + return false; + } + if (received != 1 || response[0] != 0x0A) { + if(logErrors) { + + printf("Got bad response on backdoor 0x40 command: "); + printf("0x%02X", response[0]); + printf(" ("); + printf("%02X", validBits); + printf(" valid bits)\r\n"); + } + return false; + } + + cmd = 0x43; + validBits = 8; + status = PCD_TransceiveData(&cmd, (byte)1, response, &received, &validBits, (byte)0, false); // 43 + if(status != STATUS_OK) { + if(logErrors) { + printf("Error in communication at command 0x43, after successfully executing 0x40"); + printf("Error name: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + } + return false; + } + if (received != 1 || response[0] != 0x0A) { + if (logErrors) { + printf("Got bad response on backdoor 0x43 command: "); + printf("%02X",response[0]); + printf(" ("); + printf("%02X",validBits); + printf(" valid bits)\r\n"); + } + return false; + } + + // You can now write to sector 0 without authenticating! + return true; +} // End MIFARE_OpenUidBackdoor() + +/** + * Reads entire block 0, including all manufacturer data, and overwrites + * that block with the new UID, a freshly calculated BCC, and the original + * manufacturer data. + * + * It assumes a default KEY A of 0xFFFFFFFFFFFF. + * Make sure to have selected the card before this function is called. + */ +bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) { + + // UID + BCC byte can not be larger than 16 together + if (!newUid || !uidSize || uidSize > 15) { + if (logErrors) { + printf("New UID buffer empty, size 0, or size > 15 given"); + } + return false; + } + + // Authenticate for reading + MIFARE_Key key = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + byte status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (byte)1, &key, &uid); + if (status != STATUS_OK) { + + if (status == STATUS_TIMEOUT) { + // We get a read timeout if no card is selected yet, so let's select one + + // Wake the card up again if sleeping + // byte atqa_answer[2]; + // byte atqa_size = 2; + // PICC_WakeupA(atqa_answer, &atqa_size); + + if (!PICC_IsNewCardPresent() || !PICC_ReadCardSerial()) { + printf("No card was previously selected, and none are available. Failed to set UID."); + return false; + } + + status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (byte)1, &key, &uid); + if (status != STATUS_OK) { + // We tried, time to give up + if (logErrors) { + printf("Failed to authenticate to card for reading, could not set UID: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + } + return false; + } + } + else { + if (logErrors) { + printf("PCD_Authenticate() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + } + return false; + } + } + + // Read block 0 + byte block0_buffer[18]; + byte byteCount = sizeof(block0_buffer); + status = MIFARE_Read((byte)0, block0_buffer, &byteCount); + if (status != STATUS_OK) { + if (logErrors) { + printf("MIFARE_Read() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + printf("Are you sure your KEY A for sector 0 is 0xFFFFFFFFFFFF?"); + } + return false; + } + + // Write new UID to the data we just read, and calculate BCC byte + byte bcc = 0; + for (int i = 0; i < uidSize; i++) { + block0_buffer[i] = newUid[i]; + bcc ^= newUid[i]; + } + + // Write BCC byte to buffer + block0_buffer[uidSize] = bcc; + + // Stop encrypted traffic so we can send raw bytes + PCD_StopCrypto1(); + + // Activate UID backdoor + if (!MIFARE_OpenUidBackdoor(logErrors)) { + if (logErrors) { + printf("Activating the UID backdoor failed."); + } + return false; + } + + // Write modified block 0 back to card + status = MIFARE_Write((byte)0, block0_buffer, (byte)16); + if (status != STATUS_OK) { + if (logErrors) { + printf("MIFARE_Write() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + } + return false; + } + + // Wake the card up again + byte atqa_answer[2]; + byte atqa_size = 2; + PICC_WakeupA(atqa_answer, &atqa_size); + + return true; +} + +/** + * Resets entire sector 0 to zeroes, so the card can be read again by readers. + */ +bool MFRC522::MIFARE_UnbrickUidSector(bool logErrors) { + MIFARE_OpenUidBackdoor(logErrors); + + byte block0_buffer[] = {0x01, 0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + // Write modified block 0 back to card + byte status = MIFARE_Write((byte)0, block0_buffer, (byte)16); + if (status != STATUS_OK) { + if (logErrors) { + printf("MIFARE_Write() failed: "); + printf("%s\n",GetStatusCodeName(status).c_str()); + } + return false; + } +} + +///////////////////////////////////////////////////////////////////////////////////// +// Convenience functions - does not add extra functionality +///////////////////////////////////////////////////////////////////////////////////// + +/** + * Returns true if a PICC responds to PICC_CMD_REQA. + * Only "new" cards in state IDLE are invited. Sleeping cards in state HALT are ignored. + * + * @return bool + */ +bool MFRC522::PICC_IsNewCardPresent() { + byte bufferATQA[2]; + byte bufferSize = sizeof(bufferATQA); + byte result = PICC_RequestA(bufferATQA, &bufferSize); + return (result == STATUS_OK || result == STATUS_COLLISION); +} // End PICC_IsNewCardPresent() + +/** + * Simple wrapper around PICC_Select. + * Returns true if a UID could be read. + * Remember to call PICC_IsNewCardPresent(), PICC_RequestA() or PICC_WakeupA() first. + * The read UID is available in the class variable uid. + * + * @return bool + */ +bool MFRC522::PICC_ReadCardSerial() { + byte result = PICC_Select(&uid); + return (result == STATUS_OK); +} // End PICC_ReadCardSerial() + diff --git a/kawaii/MFRC522.h b/kawaii/MFRC522.h new file mode 100644 index 0000000..8205b11 --- /dev/null +++ b/kawaii/MFRC522.h @@ -0,0 +1,323 @@ +/** + * MFRC522.h - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. + * Based on code Dr.Leong ( WWW.B2CQSHOP.COM ) + * Created by Miguel Balboa (circuitito.com), Jan, 2012. + * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.) + * Extended by Tom Clement with functionality to write to sector 0 of UID changeable Mifare cards. + * Released into the public domain. + * + + +-- Repurposed to fit Raspberry Pi --- + + */ +#ifndef MFRC522_h +#define MFRC522_h + +#include +#include +#include +using namespace std; + +typedef uint8_t byte; +typedef uint16_t word; + +// Firmware data for self-test +// Reference values based on firmware version; taken from 16.1.1 in spec. +// Version 1.0 + +const byte MFRC522_firmware_referenceV1_0[] = { + 0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C, + 0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73, + 0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A, + 0x14, 0xAF, 0x30, 0x61, 0xC9, 0x70, 0xDB, 0x2E, + 0x64, 0x22, 0x72, 0xB5, 0xBD, 0x65, 0xF4, 0xEC, + 0x22, 0xBC, 0xD3, 0x72, 0x35, 0xCD, 0xAA, 0x41, + 0x1F, 0xA7, 0xF3, 0x53, 0x14, 0xDE, 0x7E, 0x02, + 0xD9, 0x0F, 0xB5, 0x5E, 0x25, 0x1D, 0x29, 0x79 +}; + +// Version 2.0 +const byte MFRC522_firmware_referenceV2_0[] = { + 0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95, + 0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE, + 0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82, + 0x51, 0x3A, 0xEB, 0x02, 0x0C, 0xA5, 0x00, 0x49, + 0x7C, 0x84, 0x4D, 0xB3, 0xCC, 0xD2, 0x1B, 0x81, + 0x5D, 0x48, 0x76, 0xD5, 0x71, 0x61, 0x21, 0xA9, + 0x86, 0x96, 0x83, 0x38, 0xCF, 0x9D, 0x5B, 0x6D, + 0xDC, 0x15, 0xBA, 0x3E, 0x7D, 0x95, 0x3B, 0x2F +}; + + + +class MFRC522 { +public: + // MFRC522 registers. Described in chapter 9 of the datasheet. + // When using SPI all addresses are shifted one bit left in the "SPI address byte" (section 8.1.2.3) + enum PCD_Register { + // Page 0: Command and status + // 0x00 // reserved for future use + CommandReg = 0x01 << 1, // starts and stops command execution + ComIEnReg = 0x02 << 1, // enable and disable interrupt request control bits + DivIEnReg = 0x03 << 1, // enable and disable interrupt request control bits + ComIrqReg = 0x04 << 1, // interrupt request bits + DivIrqReg = 0x05 << 1, // interrupt request bits + ErrorReg = 0x06 << 1, // error bits showing the error status of the last command executed + Status1Reg = 0x07 << 1, // communication status bits + Status2Reg = 0x08 << 1, // receiver and transmitter status bits + FIFODataReg = 0x09 << 1, // input and output of 64 byte FIFO buffer + FIFOLevelReg = 0x0A << 1, // number of bytes stored in the FIFO buffer + WaterLevelReg = 0x0B << 1, // level for FIFO underflow and overflow warning + ControlReg = 0x0C << 1, // miscellaneous control registers + BitFramingReg = 0x0D << 1, // adjustments for bit-oriented frames + CollReg = 0x0E << 1, // bit position of the first bit-collision detected on the RF interface + // 0x0F // reserved for future use + + // Page 1: Command + // 0x10 // reserved for future use + ModeReg = 0x11 << 1, // defines general modes for transmitting and receiving + TxModeReg = 0x12 << 1, // defines transmission data rate and framing + RxModeReg = 0x13 << 1, // defines reception data rate and framing + TxControlReg = 0x14 << 1, // controls the logical behavior of the antenna driver pins TX1 and TX2 + TxASKReg = 0x15 << 1, // controls the setting of the transmission modulation + TxSelReg = 0x16 << 1, // selects the internal sources for the antenna driver + RxSelReg = 0x17 << 1, // selects internal receiver settings + RxThresholdReg = 0x18 << 1, // selects thresholds for the bit decoder + DemodReg = 0x19 << 1, // defines demodulator settings + // 0x1A // reserved for future use + // 0x1B // reserved for future use + MfTxReg = 0x1C << 1, // controls some MIFARE communication transmit parameters + MfRxReg = 0x1D << 1, // controls some MIFARE communication receive parameters + // 0x1E // reserved for future use + SerialSpeedReg = 0x1F << 1, // selects the speed of the serial UART interface + + // Page 2: Configuration + // 0x20 // reserved for future use + CRCResultRegH = 0x21 << 1, // shows the MSB and LSB values of the CRC calculation + CRCResultRegL = 0x22 << 1, + // 0x23 // reserved for future use + ModWidthReg = 0x24 << 1, // controls the ModWidth setting? + // 0x25 // reserved for future use + RFCfgReg = 0x26 << 1, // configures the receiver gain + GsNReg = 0x27 << 1, // selects the conductance of the antenna driver pins TX1 and TX2 for modulation + CWGsPReg = 0x28 << 1, // defines the conductance of the p-driver output during periods of no modulation + ModGsPReg = 0x29 << 1, // defines the conductance of the p-driver output during periods of modulation + TModeReg = 0x2A << 1, // defines settings for the internal timer + TPrescalerReg = 0x2B << 1, // the lower 8 bits of the TPrescaler value. The 4 high bits are in TModeReg. + TReloadRegH = 0x2C << 1, // defines the 16-bit timer reload value + TReloadRegL = 0x2D << 1, + TCounterValueRegH = 0x2E << 1, // shows the 16-bit timer value + TCounterValueRegL = 0x2F << 1, + + // Page 3: Test Registers + // 0x30 // reserved for future use + TestSel1Reg = 0x31 << 1, // general test signal configuration + TestSel2Reg = 0x32 << 1, // general test signal configuration + TestPinEnReg = 0x33 << 1, // enables pin output driver on pins D1 to D7 + TestPinValueReg = 0x34 << 1, // defines the values for D1 to D7 when it is used as an I/O bus + TestBusReg = 0x35 << 1, // shows the status of the internal test bus + AutoTestReg = 0x36 << 1, // controls the digital self test + VersionReg = 0x37 << 1, // shows the software version + AnalogTestReg = 0x38 << 1, // controls the pins AUX1 and AUX2 + TestDAC1Reg = 0x39 << 1, // defines the test value for TestDAC1 + TestDAC2Reg = 0x3A << 1, // defines the test value for TestDAC2 + TestADCReg = 0x3B << 1 // shows the value of ADC I and Q channels + // 0x3C // reserved for production tests + // 0x3D // reserved for production tests + // 0x3E // reserved for production tests + // 0x3F // reserved for production tests + }; + + // MFRC522 commands. Described in chapter 10 of the datasheet. + enum PCD_Command { + PCD_Idle = 0x00, // no action, cancels current command execution + PCD_Mem = 0x01, // stores 25 bytes into the internal buffer + PCD_GenerateRandomID = 0x02, // generates a 10-byte random ID number + PCD_CalcCRC = 0x03, // activates the CRC coprocessor or performs a self test + PCD_Transmit = 0x04, // transmits data from the FIFO buffer + PCD_NoCmdChange = 0x07, // no command change, can be used to modify the CommandReg register bits without affecting the command, for example, the PowerDown bit + PCD_Receive = 0x08, // activates the receiver circuits + PCD_Transceive = 0x0C, // transmits data from FIFO buffer to antenna and automatically activates the receiver after transmission + PCD_MFAuthent = 0x0E, // performs the MIFARE standard authentication as a reader + PCD_SoftReset = 0x0F // resets the MFRC522 + }; + + // MFRC522 RxGain[2:0] masks, defines the receiver's signal voltage gain factor (on the PCD). + // Described in 9.3.3.6 / table 98 of the datasheet at http://www.nxp.com/documents/data_sheet/MFRC522.pdf + enum PCD_RxGain { + RxGain_18dB = 0x00 << 4, // 000b - 18 dB, minimum + RxGain_23dB = 0x01 << 4, // 001b - 23 dB + RxGain_18dB_2 = 0x02 << 4, // 010b - 18 dB, it seems 010b is a duplicate for 000b + RxGain_23dB_2 = 0x03 << 4, // 011b - 23 dB, it seems 011b is a duplicate for 001b + RxGain_33dB = 0x04 << 4, // 100b - 33 dB, average, and typical default + RxGain_38dB = 0x05 << 4, // 101b - 38 dB + RxGain_43dB = 0x06 << 4, // 110b - 43 dB + RxGain_48dB = 0x07 << 4, // 111b - 48 dB, maximum + RxGain_min = 0x00 << 4, // 000b - 18 dB, minimum, convenience for RxGain_18dB + RxGain_avg = 0x04 << 4, // 100b - 33 dB, average, convenience for RxGain_33dB + RxGain_max = 0x07 << 4 // 111b - 48 dB, maximum, convenience for RxGain_48dB + }; + + // Commands sent to the PICC. + enum PICC_Command { + // The commands used by the PCD to manage communication with several PICCs (ISO 14443-3, Type A, section 6.4) + PICC_CMD_REQA = 0x26, // REQuest command, Type A. Invites PICCs in state IDLE to go to READY and prepare for anticollision or selection. 7 bit frame. + PICC_CMD_WUPA = 0x52, // Wake-UP command, Type A. Invites PICCs in state IDLE and HALT to go to READY(*) and prepare for anticollision or selection. 7 bit frame. + PICC_CMD_CT = 0x88, // Cascade Tag. Not really a command, but used during anti collision. + PICC_CMD_SEL_CL1 = 0x93, // Anti collision/Select, Cascade Level 1 + PICC_CMD_SEL_CL2 = 0x95, // Anti collision/Select, Cascade Level 2 + PICC_CMD_SEL_CL3 = 0x97, // Anti collision/Select, Cascade Level 3 + PICC_CMD_HLTA = 0x50, // HaLT command, Type A. Instructs an ACTIVE PICC to go to state HALT. + // The commands used for MIFARE Classic (from http://www.nxp.com/documents/data_sheet/MF1S503x.pdf, Section 9) + // Use PCD_MFAuthent to authenticate access to a sector, then use these commands to read/write/modify the blocks on the sector. + // The read/write commands can also be used for MIFARE Ultralight. + PICC_CMD_MF_AUTH_KEY_A = 0x60, // Perform authentication with Key A + PICC_CMD_MF_AUTH_KEY_B = 0x61, // Perform authentication with Key B + PICC_CMD_MF_READ = 0x30, // Reads one 16 byte block from the authenticated sector of the PICC. Also used for MIFARE Ultralight. + PICC_CMD_MF_WRITE = 0xA0, // Writes one 16 byte block to the authenticated sector of the PICC. Called "COMPATIBILITY WRITE" for MIFARE Ultralight. + PICC_CMD_MF_DECREMENT = 0xC0, // Decrements the contents of a block and stores the result in the internal data register. + PICC_CMD_MF_INCREMENT = 0xC1, // Increments the contents of a block and stores the result in the internal data register. + PICC_CMD_MF_RESTORE = 0xC2, // Reads the contents of a block into the internal data register. + PICC_CMD_MF_TRANSFER = 0xB0, // Writes the contents of the internal data register to a block. + // The commands used for MIFARE Ultralight (from http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf, Section 8.6) + // The PICC_CMD_MF_READ and PICC_CMD_MF_WRITE can also be used for MIFARE Ultralight. + PICC_CMD_UL_WRITE = 0xA2 // Writes one 4 byte page to the PICC. + }; + + // MIFARE constants that does not fit anywhere else + enum MIFARE_Misc { + MF_ACK = 0xA, // The MIFARE Classic uses a 4 bit ACK/NAK. Any other value than 0xA is NAK. + MF_KEY_SIZE = 6 // A Mifare Crypto1 key is 6 bytes. + }; + + // PICC types we can detect. Remember to update PICC_GetTypeName() if you add more. + enum PICC_Type { + PICC_TYPE_UNKNOWN = 0, + PICC_TYPE_ISO_14443_4 = 1, // PICC compliant with ISO/IEC 14443-4 + PICC_TYPE_ISO_18092 = 2, // PICC compliant with ISO/IEC 18092 (NFC) + PICC_TYPE_MIFARE_MINI = 3, // MIFARE Classic protocol, 320 bytes + PICC_TYPE_MIFARE_1K = 4, // MIFARE Classic protocol, 1KB + PICC_TYPE_MIFARE_4K = 5, // MIFARE Classic protocol, 4KB + PICC_TYPE_MIFARE_UL = 6, // MIFARE Ultralight or Ultralight C + PICC_TYPE_MIFARE_PLUS = 7, // MIFARE Plus + PICC_TYPE_TNP3XXX = 8, // Only mentioned in NXP AN 10833 MIFARE Type Identification Procedure + PICC_TYPE_NOT_COMPLETE = 255 // SAK indicates UID is not complete. + }; + + // Return codes from the functions in this class. Remember to update GetStatusCodeName() if you add more. + enum StatusCode { + STATUS_OK = 1, // Success + STATUS_ERROR = 2, // Error in communication + STATUS_COLLISION = 3, // Collission detected + STATUS_TIMEOUT = 4, // Timeout in communication. + STATUS_NO_ROOM = 5, // A buffer is not big enough. + STATUS_INTERNAL_ERROR = 6, // Internal error in the code. Should not happen ;-) + STATUS_INVALID = 7, // Invalid argument. + STATUS_CRC_WRONG = 8, // The CRC_A does not match + STATUS_MIFARE_NACK = 9 // A MIFARE PICC responded with NAK. + }; + + // A struct used for passing the UID of a PICC. + typedef struct { + byte size; // Number of bytes in the UID. 4, 7 or 10. + byte uidByte[10]; + byte sak; // The SAK (Select acknowledge) byte returned from the PICC after successful selection. + } Uid; + + // A struct used for passing a MIFARE Crypto1 key + typedef struct { + byte keyByte[MF_KEY_SIZE]; + } MIFARE_Key; + + // Member variables + Uid uid; // Used by PICC_ReadCardSerial(). + + // Size of the MFRC522 FIFO + static const byte FIFO_SIZE = 64; // The FIFO is 64 bytes. + + ///////////////////////////////////////////////////////////////////////////////////// + // Functions for setting up the Raspberry Pi + ///////////////////////////////////////////////////////////////////////////////////// + MFRC522(); + void setSPIConfig(); + ///////////////////////////////////////////////////////////////////////////////////// + // Basic interface functions for communicating with the MFRC522 + ///////////////////////////////////////////////////////////////////////////////////// + void PCD_WriteRegister(byte reg, byte value); + void PCD_WriteRegister(byte reg, byte count, byte *values); + byte PCD_ReadRegister(byte reg); + void PCD_ReadRegister(byte reg, byte count, byte *values, byte rxAlign = 0); + void setBitMask(unsigned char reg, unsigned char mask); + void PCD_SetRegisterBitMask(byte reg, byte mask); + void PCD_ClearRegisterBitMask(byte reg, byte mask); + byte PCD_CalculateCRC(byte *data, byte length, byte *result); + + ///////////////////////////////////////////////////////////////////////////////////// + // Functions for manipulating the MFRC522 + ///////////////////////////////////////////////////////////////////////////////////// + void PCD_Init(); + void PCD_Reset(); + void PCD_AntennaOn(); + void PCD_AntennaOff(); + byte PCD_GetAntennaGain(); + void PCD_SetAntennaGain(byte mask); + bool PCD_PerformSelfTest(); + + ///////////////////////////////////////////////////////////////////////////////////// + // Functions for communicating with PICCs + ///////////////////////////////////////////////////////////////////////////////////// + byte PCD_TransceiveData(byte *sendData, byte sendLen, byte *backData, byte *backLen, byte *validBits = NULL, byte rxAlign = 0, bool checkCRC = false); + byte PCD_CommunicateWithPICC(byte command, byte waitIRq, byte *sendData, byte sendLen, byte *backData = NULL, byte *backLen = NULL, byte *validBits = NULL, byte rxAlign = 0, bool checkCRC = false); + byte PICC_RequestA(byte *bufferATQA, byte *bufferSize); + byte PICC_WakeupA(byte *bufferATQA, byte *bufferSize); + byte PICC_REQA_or_WUPA(byte command, byte *bufferATQA, byte *bufferSize); + byte PICC_Select(Uid *uid, byte validBits = 0); + byte PICC_HaltA(); + + ///////////////////////////////////////////////////////////////////////////////////// + // Functions for communicating with MIFARE PICCs + ///////////////////////////////////////////////////////////////////////////////////// + byte PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid); + void PCD_StopCrypto1(); + byte MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize); + byte MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize); + byte MIFARE_Decrement(byte blockAddr, long delta); + byte MIFARE_Increment(byte blockAddr, long delta); + byte MIFARE_Restore(byte blockAddr); + byte MIFARE_Transfer(byte blockAddr); + byte MIFARE_Ultralight_Write(byte page, byte *buffer, byte bufferSize); + byte MIFARE_GetValue(byte blockAddr, long *value); + byte MIFARE_SetValue(byte blockAddr, long value); + + ///////////////////////////////////////////////////////////////////////////////////// + // Support functions + ///////////////////////////////////////////////////////////////////////////////////// + byte PCD_MIFARE_Transceive(byte *sendData, byte sendLen, bool acceptTimeout = false); + // old function used too much memory, now name moved to flash; if you need char, copy from flash to memory + //const char *GetStatusCodeName(byte code); + const string GetStatusCodeName(byte code); + byte PICC_GetType(byte sak); + // old function used too much memory, now name moved to flash; if you need char, copy from flash to memory + //const char *PICC_GetTypeName(byte type); + const string PICC_GetTypeName(byte type); + void PICC_DumpToSerial(Uid *uid); + void PICC_DumpMifareClassicToSerial(Uid *uid, byte piccType, MIFARE_Key *key); + void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, byte sector); + void PICC_DumpMifareUltralightToSerial(); + void MIFARE_SetAccessBits(byte *accessBitBuffer, byte g0, byte g1, byte g2, byte g3); + bool MIFARE_OpenUidBackdoor(bool logErrors); + bool MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors); + bool MIFARE_UnbrickUidSector(bool logErrors); + + ///////////////////////////////////////////////////////////////////////////////////// + // Convenience functions - does not add extra functionality + ///////////////////////////////////////////////////////////////////////////////////// + bool PICC_IsNewCardPresent(); + bool PICC_ReadCardSerial(); + +private: + byte MIFARE_TwoStepHelper(byte command, byte blockAddr, long data); +}; + +#endif diff --git a/kawaii/bcm2835.h b/kawaii/bcm2835.h new file mode 100644 index 0000000..e533093 --- /dev/null +++ b/kawaii/bcm2835.h @@ -0,0 +1,1129 @@ +// bcm2835.h +// +// C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi +// +// Author: Mike McCauley +// Copyright (C) 2011-2013 Mike McCauley +// $Id: bcm2835.h,v 1.8 2013/02/15 22:06:09 mikem Exp mikem $ +// +/// \mainpage C library for Broadcom BCM 2835 as used in Raspberry Pi +/// +/// This is a C library for Raspberry Pi (RPi). It provides access to +/// GPIO and other IO functions on the Broadcom BCM 2835 chip, +/// allowing access to the GPIO pins on the +/// 26 pin IDE plug on the RPi board so you can control and interface with various external devices. +/// +/// It provides functions for reading digital inputs and setting digital outputs, using SPI and I2C, +/// and for accessing the system timers. +/// Pin event detection is supported by polling (interrupts are not supported). +/// +/// It is C++ compatible, and installs as a header file and non-shared library on +/// any Linux-based distro (but clearly is no use except on Raspberry Pi or another board with +/// BCM 2835). +/// +/// The version of the package that this documentation refers to can be downloaded +/// from http://www.airspayce.com/mikem/bcm2835/bcm2835-1.26.tar.gz +/// You can find the latest version at http://www.airspayce.com/mikem/bcm2835 +/// +/// Several example programs are provided. +/// +/// Based on data in http://elinux.org/RPi_Low-level_peripherals and +/// http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf +/// and http://www.scribd.com/doc/101830961/GPIO-Pads-Control2 +/// +/// You can also find online help and discussion at http://groups.google.com/group/bcm2835 +/// Please use that group for all questions and discussions on this topic. +/// Do not contact the author directly, unless it is to discuss commercial licensing. +/// +/// Tested on debian6-19-04-2012, 2012-07-15-wheezy-raspbian and Occidentalisv01 +/// CAUTION: it has been observed that when detect enables such as bcm2835_gpio_len() +/// are used and the pin is pulled LOW +/// it can cause temporary hangs on 2012-07-15-wheezy-raspbian and Occidentalisv01. +/// Reason for this is not yet determined, but suspect that an interrupt handler is +/// hitting a hard loop on those OSs. +/// If you must use bcm2835_gpio_len() and friends, make sure you disable the pins with +/// bcm2835_gpio_cler_len() and friends after use. +/// +/// \par Installation +/// +/// This library consists of a single non-shared library and header file, which will be +/// installed in the usual places by make install +/// +/// \code +/// # download the latest version of the library, say bcm2835-1.xx.tar.gz, then: +/// tar zxvf bcm2835-1.xx.tar.gz +/// cd bcm2835-1.xx +/// ./configure +/// make +/// sudo make check +/// sudo make install +/// \endcode +/// +/// \par Physical Addresses +/// +/// The functions bcm2835_peri_read(), bcm2835_peri_write() and bcm2835_peri_set_bits() +/// are low level peripheral register access functions. They are designed to use +/// physical addresses as described in section 1.2.3 ARM physical addresses +/// of the BCM2835 ARM Peripherals manual. +/// Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals. The bus +/// addresses for peripherals are set up to map onto the peripheral bus address range starting at +/// 0x7E000000. Thus a peripheral advertised in the manual at bus address 0x7Ennnnnn is available at +/// physical address 0x20nnnnnn. +/// +/// The base address of the various peripheral registers are available with the following +/// externals: +/// bcm2835_gpio +/// bcm2835_pwm +/// bcm2835_clk +/// bcm2835_pads +/// bcm2835_spio0 +/// bcm2835_st +/// bcm2835_bsc0 +/// bcm2835_bsc1 +/// +/// \par Pin Numbering +/// +/// The GPIO pin numbering as used by RPi is different to and inconsistent with the underlying +/// BCM 2835 chip pin numbering. http://elinux.org/RPi_BCM2835_GPIOs +/// +/// RPi has a 26 pin IDE header that provides access to some of the GPIO pins on the BCM 2835, +/// as well as power and ground pins. Not all GPIO pins on the BCM 2835 are available on the +/// IDE header. +/// +/// RPi Version 2 also has a P5 connector with 4 GPIO pins, 5V, 3.3V and Gnd. +/// +/// The functions in this library are designed to be passed the BCM 2835 GPIO pin number and _not_ +/// the RPi pin number. There are symbolic definitions for each of the available pins +/// that you should use for convenience. See \ref RPiGPIOPin. +/// +/// \par SPI Pins +/// +/// The bcm2835_spi_* functions allow you to control the BCM 2835 SPI0 interface, +/// allowing you to send and received data by SPI (Serial Peripheral Interface). +/// For more information about SPI, see http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus +/// +/// When bcm2835_spi_begin() is called it changes the bahaviour of the SPI interface pins from their +/// default GPIO behaviour in order to support SPI. While SPI is in use, you will not be able +/// to control the state of the SPI pins through the usual bcm2835_spi_gpio_write(). +/// When bcm2835_spi_end() is called, the SPI pins will all revert to inputs, and can then be +/// configured and controled with the usual bcm2835_gpio_* calls. +/// +/// The Raspberry Pi GPIO pins used for SPI are: +/// +/// - P1-19 (MOSI) +/// - P1-21 (MISO) +/// - P1-23 (CLK) +/// - P1-24 (CE0) +/// - P1-26 (CE1) +/// +/// \par I2C Pins +/// +/// The bcm2835_i2c_* functions allow you to control the BCM 2835 BSC interface, +/// allowing you to send and received data by I2C ("eye-squared cee"; generically referred to as "two-wire interface") . +/// For more information about I?C, see http://en.wikipedia.org/wiki/I%C2%B2C +/// +/// The Raspberry Pi V2 GPIO pins used for I2C are: +/// +/// - P1-03 (SDA) +/// - P1-05 (SLC) +/// +/// \par Real Time performance constraints +/// +/// The bcm2835 is a library for user programs (i.e. they run in 'userland'). +/// Such programs are not part of the kernel and are usually +/// subject to paging and swapping by the kernel while it does other things besides running your program. +/// This means that you should not expect to get real-time performance or +/// real-time timing constraints from such programs. In particular, there is no guarantee that the +/// bcm2835_delay() and bcm2835_delayMicroseconds() will return after exactly the time requested. +/// In fact, depending on other activity on the host, IO etc, you might get significantly longer delay times +/// than the one you asked for. So please dont expect to get exactly the time delay you request. +/// +/// Arjan reports that you can prevent swapping on Linux with the following code fragment: +/// +/// \code +/// struct sched_param sp; +/// memset(&sp, 0, sizeof(sp)); +/// sp.sched_priority = sched_get_priority_max(SCHED_FIFO); +/// sched_setscheduler(0, SCHED_FIFO, &sp); +/// mlockall(MCL_CURRENT | MCL_FUTURE); +/// \endcode +/// +/// \par Open Source Licensing GPL V2 +/// +/// This is the appropriate option if you want to share the source code of your +/// application with everyone you distribute it to, and you also want to give them +/// the right to share who uses it. If you wish to use this software under Open +/// Source Licensing, you must contribute all your source code to the open source +/// community in accordance with the GPL Version 2 when your application is +/// distributed. See http://www.gnu.org/copyleft/gpl.html and COPYING +/// +/// \par Acknowledgements +/// +/// Some of this code has been inspired by Dom and Gert. +/// The I2C code has been inspired by Alan Barr. +/// +/// \par Revision History +/// +/// \version 1.0 Initial release +/// \version 1.1 Minor bug fixes +/// \version 1.2 Added support for SPI +/// \version 1.3 Added bcm2835_spi_transfern() +/// \version 1.4 Fixed a problem that prevented SPI CE1 being used. Reported by David Robinson. +/// \version 1.5 Added bcm2835_close() to deinit the library. Suggested by C?sar Ortiz +/// \version 1.6 Document testing on 2012-07-15-wheezy-raspbian and Occidentalisv01 +/// Functions bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen() +/// bcm2835_gpio_len(), bcm2835_gpio_aren() and bcm2835_gpio_afen() now +/// changes only the pin specified. Other pins that were already previously +/// enabled stay enabled. +/// Added bcm2835_gpio_clr_ren(), bcm2835_gpio_clr_fen(), bcm2835_gpio_clr_hen() +/// bcm2835_gpio_clr_len(), bcm2835_gpio_clr_aren(), bcm2835_gpio_clr_afen() +/// to clear the enable for individual pins, suggested by Andreas Sundstrom. +/// \version 1.7 Added bcm2835_spi_transfernb to support different buffers for read and write. +/// \version 1.8 Improvements to read barrier, as suggested by maddin. +/// \version 1.9 Improvements contributed by mikew: +/// I noticed that it was mallocing memory for the mmaps on /dev/mem. +/// It's not necessary to do that, you can just mmap the file directly, +/// so I've removed the mallocs (and frees). +/// I've also modified delayMicroseconds() to use nanosleep() for long waits, +/// and a busy wait on a high resolution timer for the rest. This is because +/// I've found that calling nanosleep() takes at least 100-200 us. +/// You need to link using '-lrt' using this version. +/// I've added some unsigned casts to the debug prints to silence compiler +/// warnings I was getting, fixed some typos, and changed the value of +/// BCM2835_PAD_HYSTERESIS_ENABLED to 0x08 as per Gert van Loo's doc at +/// http://www.scribd.com/doc/101830961/GPIO-Pads-Control2 +/// Also added a define for the passwrd value that Gert says is needed to +/// change pad control settings. +/// \version 1.10 Changed the names of the delay functions to bcm2835_delay() +/// and bcm2835_delayMicroseconds() to prevent collisions with wiringPi. +/// Macros to map delay()-> bcm2835_delay() and +/// Macros to map delayMicroseconds()-> bcm2835_delayMicroseconds(), which +/// can be disabled by defining BCM2835_NO_DELAY_COMPATIBILITY +/// \version 1.11 Fixed incorrect link to download file +/// \version 1.12 New GPIO pin definitions for RPi version 2 (which has a different GPIO mapping) +/// \version 1.13 New GPIO pin definitions for RPi version 2 plug P5 +/// Hardware base pointers are now available (after initialisation) externally as bcm2835_gpio +/// bcm2835_pwm bcm2835_clk bcm2835_pads bcm2835_spi0. +/// \version 1.14 Now compiles even if CLOCK_MONOTONIC_RAW is not available, uses CLOCK_MONOTONIC instead. +/// Fixed errors in documentation of SPI divider frequencies based on 250MHz clock. +/// Reported by Ben Simpson. +/// \version 1.15 Added bcm2835_close() to end of examples as suggested by Mark Wolfe. +/// \version 1.16 Added bcm2835_gpio_set_multi, bcm2835_gpio_clr_multi and bcm2835_gpio_write_multi +/// to allow a mask of pins to be set all at once. Requested by Sebastian Loncar. +/// \version 1.17 Added bcm2835_gpio_write_mask. Requested by Sebastian Loncar. +/// \version 1.18 Added bcm2835_i2c_* functions. Changes to bcm2835_delayMicroseconds: +/// now uses the RPi system timer counter, instead of clock_gettime, for improved accuracy. +/// No need to link with -lrt now. Contributed by Arjan van Vught. +/// \version 1.19 Removed inlines added by previous patch since they don't seem to work everywhere. +/// Reported by olly. +/// \version 1.20 Patch from Mark Dootson to close /dev/mem after access to the peripherals has been granted. +/// \version 1.21 delayMicroseconds is now not susceptible to 32 bit timer overruns. +/// Patch courtesy Jeremy Mortis. +/// \version 1.22 Fixed incorrect definition of BCM2835_GPFEN0 which broke the ability to set +/// falling edge events. Reported by Mark Dootson. +/// \version 1.23 Added bcm2835_i2c_set_baudrate and bcm2835_i2c_read_register_rs. +/// Improvements to bcm2835_i2c_read and bcm2835_i2c_write functions +/// to fix ocasional reads not completing. Patched by Mark Dootson. +/// \version 1.24 Mark Dootson p[atched a problem with his previously submitted code +/// under high load from other processes. +/// \version 1.25 Updated author and distribution location details to airspayce.com +/// \version 1.26 Added missing unmapmem for pads in bcm2835_close to prevent a memory leak. +/// Reported by Hartmut Henkel. +/// \author Mike McCauley (mikem@airspayce.com) DO NOT CONTACT THE AUTHOR DIRECTLY: USE THE LISTS + + + +// Defines for BCM2835 +#ifndef BCM2835_H +#define BCM2835_H + +#include + +/// \defgroup constants Constants for passing to and from library functions +/// The values here are designed to be passed to various functions in the bcm2835 library. +/// @{ + + +/// This means pin HIGH, true, 3.3volts on a pin. +#define HIGH 0x1 +/// This means pin LOW, false, 0volts on a pin. +#define LOW 0x0 + +/// Speed of the core clock core_clk +#define BCM2835_CORE_CLK_HZ 250000000 ///< 250 MHz + +// Physical addresses for various peripheral register sets +/// Base Physical Address of the BCM 2835 peripheral registers +#define BCM2835_PERI_BASE 0x20000000 +/// Base Physical Address of the System Timer registers +#define BCM2835_ST_BASE (BCM2835_PERI_BASE + 0x3000) +/// Base Physical Address of the Pads registers +#define BCM2835_GPIO_PADS (BCM2835_PERI_BASE + 0x100000) +/// Base Physical Address of the Clock/timer registers +#define BCM2835_CLOCK_BASE (BCM2835_PERI_BASE + 0x101000) +/// Base Physical Address of the GPIO registers +#define BCM2835_GPIO_BASE (BCM2835_PERI_BASE + 0x200000) +/// Base Physical Address of the SPI0 registers +#define BCM2835_SPI0_BASE (BCM2835_PERI_BASE + 0x204000) +/// Base Physical Address of the BSC0 registers +#define BCM2835_BSC0_BASE (BCM2835_PERI_BASE + 0x205000) +/// Base Physical Address of the PWM registers +#define BCM2835_GPIO_PWM (BCM2835_PERI_BASE + 0x20C000) + /// Base Physical Address of the BSC1 registers +#define BCM2835_BSC1_BASE (BCM2835_PERI_BASE + 0x804000) + + +/// Base of the ST (System Timer) registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_st; + +/// Base of the GPIO registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_gpio; + +/// Base of the PWM registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_pwm; + +/// Base of the CLK registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_clk; + +/// Base of the PADS registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_pads; + +/// Base of the SPI0 registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_spi0; + +/// Base of the BSC0 registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_bsc0; + +/// Base of the BSC1 registers. +/// Available after bcm2835_init has been called +extern volatile uint32_t *bcm2835_bsc1; + +/// Size of memory page on RPi +#define BCM2835_PAGE_SIZE (4*1024) +/// Size of memory block on RPi +#define BCM2835_BLOCK_SIZE (4*1024) + + +// Defines for GPIO +// The BCM2835 has 54 GPIO pins. +// BCM2835 data sheet, Page 90 onwards. +/// GPIO register offsets from BCM2835_GPIO_BASE. Offsets into the GPIO Peripheral block in bytes per 6.1 Register View +#define BCM2835_GPFSEL0 0x0000 ///< GPIO Function Select 0 +#define BCM2835_GPFSEL1 0x0004 ///< GPIO Function Select 1 +#define BCM2835_GPFSEL2 0x0008 ///< GPIO Function Select 2 +#define BCM2835_GPFSEL3 0x000c ///< GPIO Function Select 3 +#define BCM2835_GPFSEL4 0x0010 ///< GPIO Function Select 4 +#define BCM2835_GPFSEL5 0x0014 ///< GPIO Function Select 5 +#define BCM2835_GPSET0 0x001c ///< GPIO Pin Output Set 0 +#define BCM2835_GPSET1 0x0020 ///< GPIO Pin Output Set 1 +#define BCM2835_GPCLR0 0x0028 ///< GPIO Pin Output Clear 0 +#define BCM2835_GPCLR1 0x002c ///< GPIO Pin Output Clear 1 +#define BCM2835_GPLEV0 0x0034 ///< GPIO Pin Level 0 +#define BCM2835_GPLEV1 0x0038 ///< GPIO Pin Level 1 +#define BCM2835_GPEDS0 0x0040 ///< GPIO Pin Event Detect Status 0 +#define BCM2835_GPEDS1 0x0044 ///< GPIO Pin Event Detect Status 1 +#define BCM2835_GPREN0 0x004c ///< GPIO Pin Rising Edge Detect Enable 0 +#define BCM2835_GPREN1 0x0050 ///< GPIO Pin Rising Edge Detect Enable 1 +#define BCM2835_GPFEN0 0x0058 ///< GPIO Pin Falling Edge Detect Enable 0 +#define BCM2835_GPFEN1 0x005c ///< GPIO Pin Falling Edge Detect Enable 1 +#define BCM2835_GPHEN0 0x0064 ///< GPIO Pin High Detect Enable 0 +#define BCM2835_GPHEN1 0x0068 ///< GPIO Pin High Detect Enable 1 +#define BCM2835_GPLEN0 0x0070 ///< GPIO Pin Low Detect Enable 0 +#define BCM2835_GPLEN1 0x0074 ///< GPIO Pin Low Detect Enable 1 +#define BCM2835_GPAREN0 0x007c ///< GPIO Pin Async. Rising Edge Detect 0 +#define BCM2835_GPAREN1 0x0080 ///< GPIO Pin Async. Rising Edge Detect 1 +#define BCM2835_GPAFEN0 0x0088 ///< GPIO Pin Async. Falling Edge Detect 0 +#define BCM2835_GPAFEN1 0x008c ///< GPIO Pin Async. Falling Edge Detect 1 +#define BCM2835_GPPUD 0x0094 ///< GPIO Pin Pull-up/down Enable +#define BCM2835_GPPUDCLK0 0x0098 ///< GPIO Pin Pull-up/down Enable Clock 0 +#define BCM2835_GPPUDCLK1 0x009c ///< GPIO Pin Pull-up/down Enable Clock 1 + +/// \brief bcm2835PortFunction +/// Port function select modes for bcm2835_gpio_fsel() +typedef enum +{ + BCM2835_GPIO_FSEL_INPT = 0b000, ///< Input + BCM2835_GPIO_FSEL_OUTP = 0b001, ///< Output + BCM2835_GPIO_FSEL_ALT0 = 0b100, ///< Alternate function 0 + BCM2835_GPIO_FSEL_ALT1 = 0b101, ///< Alternate function 1 + BCM2835_GPIO_FSEL_ALT2 = 0b110, ///< Alternate function 2 + BCM2835_GPIO_FSEL_ALT3 = 0b111, ///< Alternate function 3 + BCM2835_GPIO_FSEL_ALT4 = 0b011, ///< Alternate function 4 + BCM2835_GPIO_FSEL_ALT5 = 0b010, ///< Alternate function 5 + BCM2835_GPIO_FSEL_MASK = 0b111 ///< Function select bits mask +} bcm2835FunctionSelect; + +/// \brief bcm2835PUDControl +/// Pullup/Pulldown defines for bcm2835_gpio_pud() +typedef enum +{ + BCM2835_GPIO_PUD_OFF = 0b00, ///< Off ? disable pull-up/down + BCM2835_GPIO_PUD_DOWN = 0b01, ///< Enable Pull Down control + BCM2835_GPIO_PUD_UP = 0b10 ///< Enable Pull Up control +} bcm2835PUDControl; + +/// Pad control register offsets from BCM2835_GPIO_PADS +#define BCM2835_PADS_GPIO_0_27 0x002c ///< Pad control register for pads 0 to 27 +#define BCM2835_PADS_GPIO_28_45 0x0030 ///< Pad control register for pads 28 to 45 +#define BCM2835_PADS_GPIO_46_53 0x0034 ///< Pad control register for pads 46 to 53 + +/// Pad Control masks +#define BCM2835_PAD_PASSWRD (0x5A << 24) ///< Password to enable setting pad mask +#define BCM2835_PAD_SLEW_RATE_UNLIMITED 0x10 ///< Slew rate unlimited +#define BCM2835_PAD_HYSTERESIS_ENABLED 0x08 ///< Hysteresis enabled +#define BCM2835_PAD_DRIVE_2mA 0x00 ///< 2mA drive current +#define BCM2835_PAD_DRIVE_4mA 0x01 ///< 4mA drive current +#define BCM2835_PAD_DRIVE_6mA 0x02 ///< 6mA drive current +#define BCM2835_PAD_DRIVE_8mA 0x03 ///< 8mA drive current +#define BCM2835_PAD_DRIVE_10mA 0x04 ///< 10mA drive current +#define BCM2835_PAD_DRIVE_12mA 0x05 ///< 12mA drive current +#define BCM2835_PAD_DRIVE_14mA 0x06 ///< 14mA drive current +#define BCM2835_PAD_DRIVE_16mA 0x07 ///< 16mA drive current + +/// \brief bcm2835PadGroup +/// Pad group specification for bcm2835_gpio_pad() +typedef enum +{ + BCM2835_PAD_GROUP_GPIO_0_27 = 0, ///< Pad group for GPIO pads 0 to 27 + BCM2835_PAD_GROUP_GPIO_28_45 = 1, ///< Pad group for GPIO pads 28 to 45 + BCM2835_PAD_GROUP_GPIO_46_53 = 2 ///< Pad group for GPIO pads 46 to 53 +} bcm2835PadGroup; + +/// \brief GPIO Pin Numbers +/// +/// Here we define Raspberry Pin GPIO pins on P1 in terms of the underlying BCM GPIO pin numbers. +/// These can be passed as a pin number to any function requiring a pin. +/// Not all pins on the RPi 26 bin IDE plug are connected to GPIO pins +/// and some can adopt an alternate function. +/// RPi version 2 has some slightly different pinouts, and these are values RPI_V2_*. +/// At bootup, pins 8 and 10 are set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively +/// When SPI0 is in use (ie after bcm2835_spi_begin()), pins 19, 21, 23, 24, 26 are dedicated to SPI +/// and cant be controlled independently +typedef enum +{ + RPI_GPIO_P1_03 = 0, ///< Version 1, Pin P1-03 + RPI_GPIO_P1_05 = 1, ///< Version 1, Pin P1-05 + RPI_GPIO_P1_07 = 4, ///< Version 1, Pin P1-07 + RPI_GPIO_P1_08 = 14, ///< Version 1, Pin P1-08, defaults to alt function 0 UART0_TXD + RPI_GPIO_P1_10 = 15, ///< Version 1, Pin P1-10, defaults to alt function 0 UART0_RXD + RPI_GPIO_P1_11 = 17, ///< Version 1, Pin P1-11 + RPI_GPIO_P1_12 = 18, ///< Version 1, Pin P1-12 + RPI_GPIO_P1_13 = 21, ///< Version 1, Pin P1-13 + RPI_GPIO_P1_15 = 22, ///< Version 1, Pin P1-15 + RPI_GPIO_P1_16 = 23, ///< Version 1, Pin P1-16 + RPI_GPIO_P1_18 = 24, ///< Version 1, Pin P1-18 + RPI_GPIO_P1_19 = 10, ///< Version 1, Pin P1-19, MOSI when SPI0 in use + RPI_GPIO_P1_21 = 9, ///< Version 1, Pin P1-21, MISO when SPI0 in use + RPI_GPIO_P1_22 = 25, ///< Version 1, Pin P1-22 + RPI_GPIO_P1_23 = 11, ///< Version 1, Pin P1-23, CLK when SPI0 in use + RPI_GPIO_P1_24 = 8, ///< Version 1, Pin P1-24, CE0 when SPI0 in use + RPI_GPIO_P1_26 = 7, ///< Version 1, Pin P1-26, CE1 when SPI0 in use + + // RPi Version 2 + RPI_V2_GPIO_P1_03 = 2, ///< Version 2, Pin P1-03 + RPI_V2_GPIO_P1_05 = 3, ///< Version 2, Pin P1-05 + RPI_V2_GPIO_P1_07 = 4, ///< Version 2, Pin P1-07 + RPI_V2_GPIO_P1_08 = 14, ///< Version 2, Pin P1-08, defaults to alt function 0 UART0_TXD + RPI_V2_GPIO_P1_10 = 15, ///< Version 2, Pin P1-10, defaults to alt function 0 UART0_RXD + RPI_V2_GPIO_P1_11 = 17, ///< Version 2, Pin P1-11 + RPI_V2_GPIO_P1_12 = 18, ///< Version 2, Pin P1-12 + RPI_V2_GPIO_P1_13 = 27, ///< Version 2, Pin P1-13 + RPI_V2_GPIO_P1_15 = 22, ///< Version 2, Pin P1-15 + RPI_V2_GPIO_P1_16 = 23, ///< Version 2, Pin P1-16 + RPI_V2_GPIO_P1_18 = 24, ///< Version 2, Pin P1-18 + RPI_V2_GPIO_P1_19 = 10, ///< Version 2, Pin P1-19, MOSI when SPI0 in use + RPI_V2_GPIO_P1_21 = 9, ///< Version 2, Pin P1-21, MISO when SPI0 in use + RPI_V2_GPIO_P1_22 = 25, ///< Version 2, Pin P1-22 + RPI_V2_GPIO_P1_23 = 11, ///< Version 2, Pin P1-23, CLK when SPI0 in use + RPI_V2_GPIO_P1_24 = 8, ///< Version 2, Pin P1-24, CE0 when SPI0 in use + RPI_V2_GPIO_P1_26 = 7, ///< Version 2, Pin P1-26, CE1 when SPI0 in use + + // RPi Version 2, new plug P5 + RPI_V2_GPIO_P5_03 = 28, ///< Version 2, Pin P5-03 + RPI_V2_GPIO_P5_04 = 29, ///< Version 2, Pin P5-04 + RPI_V2_GPIO_P5_05 = 30, ///< Version 2, Pin P5-05 + RPI_V2_GPIO_P5_06 = 31, ///< Version 2, Pin P5-06 + +} RPiGPIOPin; + +// Defines for SPI +// GPIO register offsets from BCM2835_SPI0_BASE. +// Offsets into the SPI Peripheral block in bytes per 10.5 SPI Register Map +#define BCM2835_SPI0_CS 0x0000 ///< SPI Master Control and Status +#define BCM2835_SPI0_FIFO 0x0004 ///< SPI Master TX and RX FIFOs +#define BCM2835_SPI0_CLK 0x0008 ///< SPI Master Clock Divider +#define BCM2835_SPI0_DLEN 0x000c ///< SPI Master Data Length +#define BCM2835_SPI0_LTOH 0x0010 ///< SPI LOSSI mode TOH +#define BCM2835_SPI0_DC 0x0014 ///< SPI DMA DREQ Controls + +// Register masks for SPI0_CS +#define BCM2835_SPI0_CS_LEN_LONG 0x02000000 ///< Enable Long data word in Lossi mode if DMA_LEN is set +#define BCM2835_SPI0_CS_DMA_LEN 0x01000000 ///< Enable DMA mode in Lossi mode +#define BCM2835_SPI0_CS_CSPOL2 0x00800000 ///< Chip Select 2 Polarity +#define BCM2835_SPI0_CS_CSPOL1 0x00400000 ///< Chip Select 1 Polarity +#define BCM2835_SPI0_CS_CSPOL0 0x00200000 ///< Chip Select 0 Polarity +#define BCM2835_SPI0_CS_RXF 0x00100000 ///< RXF - RX FIFO Full +#define BCM2835_SPI0_CS_RXR 0x00080000 ///< RXR RX FIFO needs Reading ( full) +#define BCM2835_SPI0_CS_TXD 0x00040000 ///< TXD TX FIFO can accept Data +#define BCM2835_SPI0_CS_RXD 0x00020000 ///< RXD RX FIFO contains Data +#define BCM2835_SPI0_CS_DONE 0x00010000 ///< Done transfer Done +#define BCM2835_SPI0_CS_TE_EN 0x00008000 ///< Unused +#define BCM2835_SPI0_CS_LMONO 0x00004000 ///< Unused +#define BCM2835_SPI0_CS_LEN 0x00002000 ///< LEN LoSSI enable +#define BCM2835_SPI0_CS_REN 0x00001000 ///< REN Read Enable +#define BCM2835_SPI0_CS_ADCS 0x00000800 ///< ADCS Automatically Deassert Chip Select +#define BCM2835_SPI0_CS_INTR 0x00000400 ///< INTR Interrupt on RXR +#define BCM2835_SPI0_CS_INTD 0x00000200 ///< INTD Interrupt on Done +#define BCM2835_SPI0_CS_DMAEN 0x00000100 ///< DMAEN DMA Enable +#define BCM2835_SPI0_CS_TA 0x00000080 ///< Transfer Active +#define BCM2835_SPI0_CS_CSPOL 0x00000040 ///< Chip Select Polarity +#define BCM2835_SPI0_CS_CLEAR 0x00000030 ///< Clear FIFO Clear RX and TX +#define BCM2835_SPI0_CS_CLEAR_RX 0x00000020 ///< Clear FIFO Clear RX +#define BCM2835_SPI0_CS_CLEAR_TX 0x00000010 ///< Clear FIFO Clear TX +#define BCM2835_SPI0_CS_CPOL 0x00000008 ///< Clock Polarity +#define BCM2835_SPI0_CS_CPHA 0x00000004 ///< Clock Phase +#define BCM2835_SPI0_CS_CS 0x00000003 ///< Chip Select + +/// \brief bcm2835SPIBitOrder SPI Bit order +/// Specifies the SPI data bit ordering for bcm2835_spi_setBitOrder() +typedef enum +{ + BCM2835_SPI_BIT_ORDER_LSBFIRST = 0, ///< LSB First + BCM2835_SPI_BIT_ORDER_MSBFIRST = 1 ///< MSB First +}bcm2835SPIBitOrder; + +/// \brief SPI Data mode +/// Specify the SPI data mode to be passed to bcm2835_spi_setDataMode() +typedef enum +{ + BCM2835_SPI_MODE0 = 0, ///< CPOL = 0, CPHA = 0 + BCM2835_SPI_MODE1 = 1, ///< CPOL = 0, CPHA = 1 + BCM2835_SPI_MODE2 = 2, ///< CPOL = 1, CPHA = 0 + BCM2835_SPI_MODE3 = 3, ///< CPOL = 1, CPHA = 1 +}bcm2835SPIMode; + +/// \brief bcm2835SPIChipSelect +/// Specify the SPI chip select pin(s) +typedef enum +{ + BCM2835_SPI_CS0 = 0, ///< Chip Select 0 + BCM2835_SPI_CS1 = 1, ///< Chip Select 1 + BCM2835_SPI_CS2 = 2, ///< Chip Select 2 (ie pins CS1 and CS2 are asserted) + BCM2835_SPI_CS_NONE = 3, ///< No CS, control it yourself +} bcm2835SPIChipSelect; + +/// \brief bcm2835SPIClockDivider +/// Specifies the divider used to generate the SPI clock from the system clock. +/// Figures below give the divider, clock period and clock frequency. +/// Clock divided is based on nominal base clock rate of 250MHz +/// It is reported that (contrary to the documentation) any even divider may used. +/// The frequencies shown for each divider have been confirmed by measurement +typedef enum +{ + BCM2835_SPI_CLOCK_DIVIDER_65536 = 0, ///< 65536 = 262.144us = 3.814697260kHz + BCM2835_SPI_CLOCK_DIVIDER_32768 = 32768, ///< 32768 = 131.072us = 7.629394531kHz + BCM2835_SPI_CLOCK_DIVIDER_16384 = 16384, ///< 16384 = 65.536us = 15.25878906kHz + BCM2835_SPI_CLOCK_DIVIDER_8192 = 8192, ///< 8192 = 32.768us = 30/51757813kHz + BCM2835_SPI_CLOCK_DIVIDER_4096 = 4096, ///< 4096 = 16.384us = 61.03515625kHz + BCM2835_SPI_CLOCK_DIVIDER_2048 = 2048, ///< 2048 = 8.192us = 122.0703125kHz + BCM2835_SPI_CLOCK_DIVIDER_1024 = 1024, ///< 1024 = 4.096us = 244.140625kHz + BCM2835_SPI_CLOCK_DIVIDER_512 = 512, ///< 512 = 2.048us = 488.28125kHz + BCM2835_SPI_CLOCK_DIVIDER_256 = 256, ///< 256 = 1.024us = 976.5625MHz + BCM2835_SPI_CLOCK_DIVIDER_128 = 128, ///< 128 = 512ns = = 1.953125MHz + BCM2835_SPI_CLOCK_DIVIDER_64 = 64, ///< 64 = 256ns = 3.90625MHz + BCM2835_SPI_CLOCK_DIVIDER_32 = 32, ///< 32 = 128ns = 7.8125MHz + BCM2835_SPI_CLOCK_DIVIDER_16 = 16, ///< 16 = 64ns = 15.625MHz + BCM2835_SPI_CLOCK_DIVIDER_8 = 8, ///< 8 = 32ns = 31.25MHz + BCM2835_SPI_CLOCK_DIVIDER_4 = 4, ///< 4 = 16ns = 62.5MHz + BCM2835_SPI_CLOCK_DIVIDER_2 = 2, ///< 2 = 8ns = 125MHz, fastest you can get + BCM2835_SPI_CLOCK_DIVIDER_1 = 1, ///< 0 = 262.144us = 3.814697260kHz, same as 0/65536 +} bcm2835SPIClockDivider; + +// Defines for I2C +// GPIO register offsets from BCM2835_BSC*_BASE. +// Offsets into the BSC Peripheral block in bytes per 3.1 BSC Register Map +#define BCM2835_BSC_C 0x0000 ///< BSC Master Control +#define BCM2835_BSC_S 0x0004 ///< BSC Master Status +#define BCM2835_BSC_DLEN 0x0008 ///< BSC Master Data Length +#define BCM2835_BSC_A 0x000c ///< BSC Master Slave Address +#define BCM2835_BSC_FIFO 0x0010 ///< BSC Master Data FIFO +#define BCM2835_BSC_DIV 0x0014 ///< BSC Master Clock Divider +#define BCM2835_BSC_DEL 0x0018 ///< BSC Master Data Delay +#define BCM2835_BSC_CLKT 0x001c ///< BSC Master Clock Stretch Timeout + +// Register masks for BSC_C +#define BCM2835_BSC_C_I2CEN 0x00008000 ///< I2C Enable, 0 = disabled, 1 = enabled +#define BCM2835_BSC_C_INTR 0x00000400 ///< Interrupt on RX +#define BCM2835_BSC_C_INTT 0x00000200 ///< Interrupt on TX +#define BCM2835_BSC_C_INTD 0x00000100 ///< Interrupt on DONE +#define BCM2835_BSC_C_ST 0x00000080 ///< Start transfer, 1 = Start a new transfer +#define BCM2835_BSC_C_CLEAR_1 0x00000020 ///< Clear FIFO Clear +#define BCM2835_BSC_C_CLEAR_2 0x00000010 ///< Clear FIFO Clear +#define BCM2835_BSC_C_READ 0x00000001 ///< Read transfer + +// Register masks for BSC_S +#define BCM2835_BSC_S_CLKT 0x00000200 ///< Clock stretch timeout +#define BCM2835_BSC_S_ERR 0x00000100 ///< ACK error +#define BCM2835_BSC_S_RXF 0x00000080 ///< RXF FIFO full, 0 = FIFO is not full, 1 = FIFO is full +#define BCM2835_BSC_S_TXE 0x00000040 ///< TXE FIFO full, 0 = FIFO is not full, 1 = FIFO is full +#define BCM2835_BSC_S_RXD 0x00000020 ///< RXD FIFO contains data +#define BCM2835_BSC_S_TXD 0x00000010 ///< TXD FIFO can accept data +#define BCM2835_BSC_S_RXR 0x00000008 ///< RXR FIFO needs reading (full) +#define BCM2835_BSC_S_TXW 0x00000004 ///< TXW FIFO needs writing (full) +#define BCM2835_BSC_S_DONE 0x00000002 ///< Transfer DONE +#define BCM2835_BSC_S_TA 0x00000001 ///< Transfer Active + +#define BCM2835_BSC_FIFO_SIZE 16 ///< BSC FIFO size + +/// \brief bcm2835I2CClockDivider +/// Specifies the divider used to generate the I2C clock from the system clock. +/// Clock divided is based on nominal base clock rate of 250MHz +typedef enum +{ + BCM2835_I2C_CLOCK_DIVIDER_2500 = 2500, ///< 2500 = 10us = 100 kHz + BCM2835_I2C_CLOCK_DIVIDER_626 = 626, ///< 622 = 2.504us = 399.3610 kHz + BCM2835_I2C_CLOCK_DIVIDER_150 = 150, ///< 150 = 60ns = 1.666 MHz (default at reset) + BCM2835_I2C_CLOCK_DIVIDER_148 = 148, ///< 148 = 59ns = 1.689 MHz +} bcm2835I2CClockDivider; + +/// \brief bcm2835I2CReasonCodes +/// Specifies the reason codes for the bcm2835_i2c_write and bcm2835_i2c_read functions. +typedef enum +{ + BCM2835_I2C_REASON_OK = 0x00, ///< Success + BCM2835_I2C_REASON_ERROR_NACK = 0x01, ///< Received a NACK + BCM2835_I2C_REASON_ERROR_CLKT = 0x02, ///< Received Clock Stretch Timeout + BCM2835_I2C_REASON_ERROR_DATA = 0x04, ///< Not all data is sent / received +} bcm2835I2CReasonCodes; + +// Defines for ST +// GPIO register offsets from BCM2835_ST_BASE. +// Offsets into the ST Peripheral block in bytes per 12.1 System Timer Registers +// The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter. +// BCM2835_ST_CLO is the System Timer Counter Lower bits register. +// The system timer free-running counter lower register is a read-only register that returns the current value +// of the lower 32-bits of the free running counter. +// BCM2835_ST_CHI is the System Timer Counter Upper bits register. +// The system timer free-running counter upper register is a read-only register that returns the current value +// of the upper 32-bits of the free running counter. +#define BCM2835_ST_CS 0x0000 ///< System Timer Control/Status +#define BCM2835_ST_CLO 0x0004 ///< System Timer Counter Lower 32 bits +#define BCM2835_ST_CHI 0x0008 ///< System Timer Counter Upper 32 bits + +/// @} + + +// Defines for PWM +#define BCM2835_PWM_CONTROL 0 +#define BCM2835_PWM_STATUS 1 +#define BCM2835_PWM0_RANGE 4 +#define BCM2835_PWM0_DATA 5 +#define BCM2835_PWM1_RANGE 8 +#define BCM2835_PWM1_DATA 9 + +#define BCM2835_PWMCLK_CNTL 40 +#define BCM2835_PWMCLK_DIV 41 + +#define BCM2835_PWM1_MS_MODE 0x8000 /// Run in MS mode +#define BCM2835_PWM1_USEFIFO 0x2000 /// Data from FIFO +#define BCM2835_PWM1_REVPOLAR 0x1000 /// Reverse polarity +#define BCM2835_PWM1_OFFSTATE 0x0800 /// Ouput Off state +#define BCM2835_PWM1_REPEATFF 0x0400 /// Repeat last value if FIFO empty +#define BCM2835_PWM1_SERIAL 0x0200 /// Run in serial mode +#define BCM2835_PWM1_ENABLE 0x0100 /// Channel Enable + +#define BCM2835_PWM0_MS_MODE 0x0080 /// Run in MS mode +#define BCM2835_PWM0_USEFIFO 0x0020 /// Data from FIFO +#define BCM2835_PWM0_REVPOLAR 0x0010 /// Reverse polarity +#define BCM2835_PWM0_OFFSTATE 0x0008 /// Ouput Off state +#define BCM2835_PWM0_REPEATFF 0x0004 /// Repeat last value if FIFO empty +#define BCM2835_PWM0_SERIAL 0x0002 /// Run in serial mode +#define BCM2835_PWM0_ENABLE 0x0001 /// Channel Enable + +// Historical name compatibility +#ifndef BCM2835_NO_DELAY_COMPATIBILITY +#define delay(x) bcm2835_delay(x) +#define delayMicroseconds(x) bcm2835_delayMicroseconds(x) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + /// \defgroup init Library initialisation and management + /// These functions allow you to intialise and control the bcm2835 library + /// @{ + + /// Initialise the library by opening /dev/mem and getting pointers to the + /// internal memory for BCM 2835 device registers. You must call this (successfully) + /// before calling any other + /// functions in this library (except bcm2835_set_debug). + /// If bcm2835_init() fails by returning 0, + /// calling any other function may result in crashes or other failures. + /// Prints messages to stderr in case of errors. + /// \return 1 if successful else 0 + extern int bcm2835_init(void); + + /// Close the library, deallocating any allocated memory and closing /dev/mem + /// \return 1 if successful else 0 + extern int bcm2835_close(void); + + /// Sets the debug level of the library. + /// A value of 1 prevents mapping to /dev/mem, and makes the library print out + /// what it would do, rather than accessing the GPIO registers. + /// A value of 0, the default, causes normal operation. + /// Call this before calling bcm2835_init(); + /// \param[in] debug The new debug level. 1 means debug + extern void bcm2835_set_debug(uint8_t debug); + + /// @} // end of init + + /// \defgroup lowlevel Low level register access + /// These functions provide low level register access, and should not generally + /// need to be used + /// + /// @{ + + /// Reads 32 bit value from a peripheral address + /// The read is done twice, and is therefore always safe in terms of + /// manual section 1.3 Peripheral access precautions for correct memory ordering + /// \param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc. + /// \return the value read from the 32 bit register + /// \sa Physical Addresses + extern uint32_t bcm2835_peri_read(volatile uint32_t* paddr); + + + /// Reads 32 bit value from a peripheral address without the read barrier + /// You should only use this when your code has previously called bcm2835_peri_read() + /// within the same peripheral, and no other peripheral access has occurred since. + /// \param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc. + /// \return the value read from the 32 bit register + /// \sa Physical Addresses + extern uint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr); + + + /// Writes 32 bit value from a peripheral address + /// The write is done twice, and is therefore always safe in terms of + /// manual section 1.3 Peripheral access precautions for correct memory ordering + /// \param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc. + /// \param[in] value The 32 bit value to write + /// \sa Physical Addresses + extern void bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value); + + /// Writes 32 bit value from a peripheral address without the write barrier + /// You should only use this when your code has previously called bcm2835_peri_write() + /// within the same peripheral, and no other peripheral access has occurred since. + /// \param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc. + /// \param[in] value The 32 bit value to write + /// \sa Physical Addresses + extern void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value); + + /// Alters a number of bits in a 32 peripheral regsiter. + /// It reads the current valu and then alters the bits deines as 1 in mask, + /// according to the bit value in value. + /// All other bits that are 0 in the mask are unaffected. + /// Use this to alter a subset of the bits in a register. + /// The write is done twice, and is therefore always safe in terms of + /// manual section 1.3 Peripheral access precautions for correct memory ordering + /// \param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc. + /// \param[in] value The 32 bit value to write, masked in by mask. + /// \param[in] mask Bitmask that defines the bits that will be altered in the register. + /// \sa Physical Addresses + extern void bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask); + /// @} // end of lowlevel + + /// \defgroup gpio GPIO register access + /// These functions allow you to control the GPIO interface. You can set the + /// function of each GPIO pin, read the input state and set the output state. + /// @{ + + /// Sets the Function Select register for the given pin, which configures + /// the pin as Input, Output or one of the 6 alternate functions. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from RPiGPIOPin. + /// \param[in] mode Mode to set the pin to, one of BCM2835_GPIO_FSEL_* from \ref bcm2835FunctionSelect + extern void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode); + + /// Sets the specified pin output to + /// HIGH. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \sa bcm2835_gpio_write() + extern void bcm2835_gpio_set(uint8_t pin); + + /// Sets the specified pin output to + /// LOW. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \sa bcm2835_gpio_write() + extern void bcm2835_gpio_clr(uint8_t pin); + + /// Sets any of the first 32 GPIO output pins specified in the mask to + /// HIGH. + /// \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) + /// \sa bcm2835_gpio_write_multi() + extern void bcm2835_gpio_set_multi(uint32_t mask); + + /// Sets any of the first 32 GPIO output pins specified in the mask to + /// LOW. + /// \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) + /// \sa bcm2835_gpio_write_multi() + extern void bcm2835_gpio_clr_multi(uint32_t mask); + + /// Reads the current level on the specified + /// pin and returns either HIGH or LOW. Works whether or not the pin + /// is an input or an output. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \return the current level either HIGH or LOW + extern uint8_t bcm2835_gpio_lev(uint8_t pin); + + /// Event Detect Status. + /// Tests whether the specified pin has detected a level or edge + /// as requested by bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen(), + /// bcm2835_gpio_len(), bcm2835_gpio_aren(), bcm2835_gpio_afen(). + /// Clear the flag for a given pin by calling bcm2835_gpio_set_eds(pin); + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \return HIGH if the event detect status for th given pin is true. + extern uint8_t bcm2835_gpio_eds(uint8_t pin); + + /// Sets the Event Detect Status register for a given pin to 1, + /// which has the effect of clearing the flag. Use this afer seeing + /// an Event Detect Status on the pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_set_eds(uint8_t pin); + + /// Enable Rising Edge Detect Enable for the specified pin. + /// When a rising edge is detected, sets the appropriate pin in Event Detect Status. + /// The GPRENn registers use + /// synchronous edge detection. This means the input signal is sampled using the + /// system clock and then it is looking for a ?011? pattern on the sampled signal. This + /// has the effect of suppressing glitches. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_ren(uint8_t pin); + + /// Disable Rising Edge Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_ren(uint8_t pin); + + /// Enable Falling Edge Detect Enable for the specified pin. + /// When a falling edge is detected, sets the appropriate pin in Event Detect Status. + /// The GPRENn registers use + /// synchronous edge detection. This means the input signal is sampled using the + /// system clock and then it is looking for a ?100? pattern on the sampled signal. This + /// has the effect of suppressing glitches. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_fen(uint8_t pin); + + /// Disable Falling Edge Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_fen(uint8_t pin); + + /// Enable High Detect Enable for the specified pin. + /// When a HIGH level is detected on the pin, sets the appropriate pin in Event Detect Status. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_hen(uint8_t pin); + + /// Disable High Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_hen(uint8_t pin); + + /// Enable Low Detect Enable for the specified pin. + /// When a LOW level is detected on the pin, sets the appropriate pin in Event Detect Status. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_len(uint8_t pin); + + /// Disable Low Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_len(uint8_t pin); + + /// Enable Asynchronous Rising Edge Detect Enable for the specified pin. + /// When a rising edge is detected, sets the appropriate pin in Event Detect Status. + /// Asynchronous means the incoming signal is not sampled by the system clock. As such + /// rising edges of very short duration can be detected. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_aren(uint8_t pin); + + /// Disable Asynchronous Rising Edge Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_aren(uint8_t pin); + + /// Enable Asynchronous Falling Edge Detect Enable for the specified pin. + /// When a falling edge is detected, sets the appropriate pin in Event Detect Status. + /// Asynchronous means the incoming signal is not sampled by the system clock. As such + /// falling edges of very short duration can be detected. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_afen(uint8_t pin); + + /// Disable Asynchronous Falling Edge Detect Enable for the specified pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + extern void bcm2835_gpio_clr_afen(uint8_t pin); + + /// Sets the Pull-up/down register for the given pin. This is + /// used with bcm2835_gpio_pudclk() to set the Pull-up/down resistor for the given pin. + /// However, it is usually more convenient to use bcm2835_gpio_set_pud(). + /// \param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl + /// \sa bcm2835_gpio_set_pud() + extern void bcm2835_gpio_pud(uint8_t pud); + + /// Clocks the Pull-up/down value set earlier by bcm2835_gpio_pud() into the pin. + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \param[in] on HIGH to clock the value from bcm2835_gpio_pud() into the pin. + /// LOW to remove the clock. + /// \sa bcm2835_gpio_set_pud() + extern void bcm2835_gpio_pudclk(uint8_t pin, uint8_t on); + + /// Reads and returns the Pad Control for the given GPIO group. + /// \param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_* + /// \return Mask of bits from BCM2835_PAD_* from \ref bcm2835PadGroup + extern uint32_t bcm2835_gpio_pad(uint8_t group); + + /// Sets the Pad Control for the given GPIO group. + /// \param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_* + /// \param[in] control Mask of bits from BCM2835_PAD_* from \ref bcm2835PadGroup + extern void bcm2835_gpio_set_pad(uint8_t group, uint32_t control); + + /// Delays for the specified number of milliseconds. + /// Uses nanosleep(), and therefore does not use CPU until the time is up. + /// However, you are at the mercy of nanosleep(). From the manual for nanosleep(): + /// If the interval specified in req is not an exact multiple of the granularity + /// underlying clock (see time(7)), then the interval will be + /// rounded up to the next multiple. Furthermore, after the sleep completes, + /// there may still be a delay before the CPU becomes free to once + /// again execute the calling thread. + /// \param[in] millis Delay in milliseconds + extern void bcm2835_delay (unsigned int millis); + + /// Delays for the specified number of microseconds. + /// Uses a combination of nanosleep() and a busy wait loop on the BCM2835 system timers, + /// However, you are at the mercy of nanosleep(). From the manual for nanosleep(): + /// If the interval specified in req is not an exact multiple of the granularity + /// underlying clock (see time(7)), then the interval will be + /// rounded up to the next multiple. Furthermore, after the sleep completes, + /// there may still be a delay before the CPU becomes free to once + /// again execute the calling thread. + /// For times less than about 450 microseconds, uses a busy wait on the System Timer. + /// It is reported that a delay of 0 microseconds on RaspberryPi will in fact + /// result in a delay of about 80 microseconds. Your mileage may vary. + /// \param[in] micros Delay in microseconds + extern void bcm2835_delayMicroseconds (uint64_t micros); + + /// Sets the output state of the specified pin + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \param[in] on HIGH sets the output to HIGH and LOW to LOW. + extern void bcm2835_gpio_write(uint8_t pin, uint8_t on); + + /// Sets any of the first 32 GPIO output pins specified in the mask to the state given by on + /// \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) + /// \param[in] on HIGH sets the output to HIGH and LOW to LOW. + extern void bcm2835_gpio_write_multi(uint32_t mask, uint8_t on); + + /// Sets the first 32 GPIO output pins specified in the mask to the value given by value + /// \param[in] value values required for each bit masked in by mask, eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) + /// \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) + extern void bcm2835_gpio_write_mask(uint32_t value, uint32_t mask); + + /// Sets the Pull-up/down mode for the specified pin. This is more convenient than + /// clocking the mode in with bcm2835_gpio_pud() and bcm2835_gpio_pudclk(). + /// \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. + /// \param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl + extern void bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud); + + /// @} + + /// \defgroup spi SPI access + /// These functions let you use SPI0 (Serial Peripheral Interface) to + /// interface with an external SPI device. + /// @{ + + /// Start SPI operations. + /// Forces RPi SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1) + /// to alternate function ALT0, which enables those pins for SPI interface. + /// You should call bcm2835_spi_end() when all SPI funcitons are complete to return the pins to + /// their default functions + /// \sa bcm2835_spi_end() + extern void bcm2835_spi_begin(void); + + /// End SPI operations. + /// SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1) + /// are returned to their default INPUT behaviour. + extern void bcm2835_spi_end(void); + + /// Sets the SPI bit order + /// NOTE: has no effect. Not supported by SPI0. + /// Defaults to + /// \param[in] order The desired bit order, one of BCM2835_SPI_BIT_ORDER_*, + /// see \ref bcm2835SPIBitOrder + extern void bcm2835_spi_setBitOrder(uint8_t order); + + /// Sets the SPI clock divider and therefore the + /// SPI clock speed. + /// \param[in] divider The desired SPI clock divider, one of BCM2835_SPI_CLOCK_DIVIDER_*, + /// see \ref bcm2835SPIClockDivider + extern void bcm2835_spi_setClockDivider(uint16_t divider); + + /// Sets the SPI data mode + /// Sets the clock polariy and phase + /// \param[in] mode The desired data mode, one of BCM2835_SPI_MODE*, + /// see \ref bcm2835SPIMode + extern void bcm2835_spi_setDataMode(uint8_t mode); + + /// Sets the chip select pin(s) + /// When an bcm2835_spi_transfer() is made, the selected pin(s) will be asserted during the + /// transfer. + /// \param[in] cs Specifies the CS pins(s) that are used to activate the desired slave. + /// One of BCM2835_SPI_CS*, see \ref bcm2835SPIChipSelect + extern void bcm2835_spi_chipSelect(uint8_t cs); + + /// Sets the chip select pin polarity for a given pin + /// When an bcm2835_spi_transfer() occurs, the currently selected chip select pin(s) + /// will be asserted to the + /// value given by active. When transfers are not happening, the chip select pin(s) + /// return to the complement (inactive) value. + /// \param[in] cs The chip select pin to affect + /// \param[in] active Whether the chip select pin is to be active HIGH + extern void bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active); + + /// Transfers one byte to and from the currently selected SPI slave. + /// Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) + /// during the transfer. + /// Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. + /// Returns the read data byte from the slave. + /// Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual + /// \param[in] value The 8 bit data byte to write to MOSI + /// \return The 8 bit byte simultaneously read from MISO + /// \sa bcm2835_spi_transfern() + extern uint8_t bcm2835_spi_transfer(uint8_t value); + + /// Transfers any number of bytes to and from the currently selected SPI slave. + /// Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) + /// during the transfer. + /// Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO. + /// The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long + /// Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual + /// \param[in] tbuf Buffer of bytes to send. + /// \param[out] rbuf Received bytes will by put in this buffer + /// \param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received + /// \sa bcm2835_spi_transfer() + extern void bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len); + + /// Transfers any number of bytes to and from the currently selected SPI slave + /// using bcm2835_spi_transfernb. + /// The returned data from the slave replaces the transmitted data in the buffer. + /// \param[in,out] buf Buffer of bytes to send. Received bytes will replace the contents + /// \param[in] len Number of bytes int eh buffer, and the number of bytes to send/received + /// \sa bcm2835_spi_transfer() + extern void bcm2835_spi_transfern(char* buf, uint32_t len); + + /// Transfers any number of bytes to the currently selected SPI slave. + /// Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) + /// during the transfer. + /// \param[in] buf Buffer of bytes to send. + /// \param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send + extern void bcm2835_spi_writenb(char* buf, uint32_t len); + + /// @} + + /// \defgroup i2c I2C access + /// These functions let you use I2C (The Broadcom Serial Control bus with the Philips + /// I2C bus/interface version 2.1 January 2000.) to interface with an external I2C device. + /// @{ + + /// Start I2C operations. + /// Forces RPi I2C pins P1-03 (SDA) and P1-05 (SCL) + /// to alternate function ALT0, which enables those pins for I2C interface. + /// You should call bcm2835_i2c_end() when all I2C functions are complete to return the pins to + /// their default functions + /// \sa bcm2835_i2c_end() + extern void bcm2835_i2c_begin(void); + + /// End I2C operations. + /// I2C pins P1-03 (SDA) and P1-05 (SCL) + /// are returned to their default INPUT behaviour. + extern void bcm2835_i2c_end(void); + + /// Sets the I2C slave address. + /// \param[in] addr The I2C slave address. + extern void bcm2835_i2c_setSlaveAddress(uint8_t addr); + + /// Sets the I2C clock divider and therefore the I2C clock speed. + /// \param[in] divider The desired I2C clock divider, one of BCM2835_I2C_CLOCK_DIVIDER_*, + /// see \ref bcm2835I2CClockDivider + extern void bcm2835_i2c_setClockDivider(uint16_t divider); + + /// Sets the I2C clock divider by converting the baudrate parameter to + /// the equivalent I2C clock divider. ( see \sa bcm2835_i2c_setClockDivider) + /// For the I2C standard 100khz you would set baudrate to 100000 + /// The use of baudrate corresponds to its use in the I2C kernel device + /// driver. (Of course, bcm2835 has nothing to do with the kernel driver) + extern void bcm2835_i2c_set_baudrate(uint32_t baudrate); + + /// Transfers any number of bytes to the currently selected I2C slave. + /// (as previously set by \sa bcm2835_i2c_setSlaveAddress) + /// \param[in] buf Buffer of bytes to send. + /// \param[in] len Number of bytes in the buf buffer, and the number of bytes to send. + /// \return reason see \ref bcm2835I2CReasonCodes + extern uint8_t bcm2835_i2c_write(const char * buf, uint32_t len); + + /// Transfers any number of bytes from the currently selected I2C slave. + /// (as previously set by \sa bcm2835_i2c_setSlaveAddress) + /// \param[in] buf Buffer of bytes to receive. + /// \param[in] len Number of bytes in the buf buffer, and the number of bytes to received. + /// \return reason see \ref bcm2835I2CReasonCodes + extern uint8_t bcm2835_i2c_read(char* buf, uint32_t len); + + /// Allows reading from I2C slaves that require a repeated start (without any prior stop) + /// to read after the required slave register has been set. For example, the popular + /// MPL3115A2 pressure and temperature sensor. Note that your device must support or + /// require this mode. If your device does not require this mode then the standard + /// combined: + /// \sa bcm2835_i2c_write + /// \sa bcm2835_i2c_read + /// are a better choice. + /// Will read from the slave previously set by \sa bcm2835_i2c_setSlaveAddress + /// \param[in] regaddr Buffer containing the slave register you wish to read from. + /// \param[in] buf Buffer of bytes to receive. + /// \param[in] len Number of bytes in the buf buffer, and the number of bytes to received. + /// \return reason see \ref bcm2835I2CReasonCodes + extern uint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len); + + /// @} + + /// \defgroup st System Timer access + /// Allows access to and delays using the System Timer Counter. + /// @{ + + /// Read the System Timer Counter register. + /// \return the value read from the System Timer Counter Lower 32 bits register + uint64_t bcm2835_st_read(void); + + /// Delays for the specified number of microseconds with offset. + /// \param[in] offset_micros Offset in microseconds + /// \param[in] micros Delay in microseconds + extern void bcm2835_st_delay(uint64_t offset_micros, uint64_t micros); + + /// @} + +#ifdef __cplusplus +} +#endif + +#endif // BCM2835_H + +/// @example blink.c +/// Blinks RPi GPIO pin 11 on and off + +/// @example input.c +/// Reads the state of an RPi input pin + +/// @example event.c +/// Shows how to use event detection on an input pin + +/// @example spi.c +/// Shows how to use SPI interface to transfer a byte to and from an SPI device + +/// @example spin.c +/// Shows how to use SPI interface to transfer a number of bytes to and from an SPI device diff --git a/kawaii/emergency_stop.cpp b/kawaii/emergency_stop.cpp new file mode 100644 index 0000000..b35b266 --- /dev/null +++ b/kawaii/emergency_stop.cpp @@ -0,0 +1,29 @@ +// +// Created by Simon Wörner on 16.06.17. +// + +#include "emergency_stop.h" + +#include + +extern "C" { +void *emergency_stop_init(uint8_t port); +void emergency_stop_clean(void *emergency_stop); +bool emergency_stop_get_state(void *emergency_stop); +} + +emergency_stop::emergency_stop(uint8_t port) +{ + rust_emergency_stop = emergency_stop_init(port); +} + +emergency_stop::~emergency_stop() +{ + emergency_stop_clean(rust_emergency_stop); + rust_emergency_stop = NULL; +} + +bool emergency_stop::get_state() const +{ + return emergency_stop_get_state(rust_emergency_stop); +} \ No newline at end of file diff --git a/kawaii/emergency_stop.h b/kawaii/emergency_stop.h new file mode 100644 index 0000000..41dda6b --- /dev/null +++ b/kawaii/emergency_stop.h @@ -0,0 +1,24 @@ +// +// Created by Simon Wörner on 16.06.17. +// + +#ifndef KAWAII_ENGINE_EMERGENCY_STOP_H +#define KAWAII_ENGINE_EMERGENCY_STOP_H + + +#include + +class emergency_stop +{ +private: + void *rust_emergency_stop; +public: + emergency_stop(uint8_t port); + emergency_stop(const emergency_stop &) = delete; + emergency_stop(const emergency_stop &&) = delete; + bool get_state() const; + ~emergency_stop(); +}; + + +#endif //KAWAII_ENGINE_EMERGENCY_STOP_H diff --git a/kawaii/engine.cpp b/kawaii/engine.cpp new file mode 100644 index 0000000..329a940 --- /dev/null +++ b/kawaii/engine.cpp @@ -0,0 +1,79 @@ +#include "engine.hpp" + +#include +#include + +using namespace std; +using namespace std::chrono; + +engine::engine(gpio&& pin_forward, gpio&& pin_reverse) + : speed(0), + pin_forward(move(pin_forward)), + pin_reverse(move(pin_reverse)), + stop_thread(false), + measurement(string("engine") + to_string(this->pin_forward.get_pin())) +{ + this->pin_forward.set_value(false); + this->pin_reverse.set_value(false); + pwm_thread = thread(&engine::pwm_loop, this); +} + +engine::~engine() +{ + stop_thread = true; + pwm_thread.join(); +} + +void engine::set_speed(int speed) +{ + this->speed.store(speed, memory_order_relaxed); +} + +void engine::pwm_loop() +{ + this_thread::sleep_for(milliseconds(100)); + const int sleep_msec = 1; + int counter = 0; + high_resolution_clock::time_point next_sleep_target = high_resolution_clock::now(); + while (!stop_thread) + { + measurement.start(); + direction target_direction; + int speed_val = speed.load(memory_order_relaxed); + if (speed_val < 0) + { + target_direction = direction::REVERSE; + speed_val *= -1; + } + else + { + target_direction = direction::FORWARD; + } + counter += sleep_msec; + if (counter >= 100) + counter = 0; + if (counter < speed_val) + { + if (target_direction == direction::FORWARD) + { + pin_reverse.set_value(false); + pin_forward.set_value(true); + } + else + { + pin_forward.set_value(false); + pin_reverse.set_value(true); + } + } + else + { + pin_forward.set_value(false); + pin_reverse.set_value(false); + } + measurement.stop(); + next_sleep_target += 500us; + this_thread::sleep_until(next_sleep_target); + } + pin_forward.set_value(false); + pin_reverse.set_value(false); +} diff --git a/kawaii/engine.hpp b/kawaii/engine.hpp new file mode 100644 index 0000000..e02a52e --- /dev/null +++ b/kawaii/engine.hpp @@ -0,0 +1,31 @@ +#ifndef ENGINE_HPP_ +#define ENGINE_HPP_ + +#include +#include +#include "gpio.hpp" +#include "measure.hpp" + +class engine +{ +public: + enum class direction + { + FORWARD, + REVERSE + }; +private: + std::atomic speed; + gpio pin_forward; + gpio pin_reverse; + std::atomic stop_thread; + std::thread pwm_thread; + measure measurement; + void pwm_loop(); +public: + engine(gpio&& pin_forward, gpio&& pin_reverse); + ~engine(); + void set_speed(int speed); +}; + +#endif diff --git a/kawaii/gpio.cpp b/kawaii/gpio.cpp new file mode 100644 index 0000000..5e4d73a --- /dev/null +++ b/kawaii/gpio.cpp @@ -0,0 +1,109 @@ +#include "gpio.hpp" + +#include +#include +#include +#include + +using namespace std; + +static string construct_filename(const string &prefix, int pin, const string &suffix) +{ + stringstream filename; + filename << prefix << pin << suffix; + return filename.str(); +} + +gpio::gpio(int pin, pin_direction direction, pin_type type, bool default_state) + : pin(pin), + direction(direction), + type(type), + current_state(false) +{ + ofstream export_file("/sys/class/gpio/export"); + export_file << pin; + export_file.close(); + ofstream direction_file(construct_filename("/sys/class/gpio/gpio", pin, "/direction").c_str()); + if (direction == pin_direction::INPUT) + { + direction_file << "in"; + } + else + { + direction_file << "out"; + } + direction_file.close(); + if (direction == pin_direction::OUTPUT) + { + set_value(default_state, false); + } +} + +gpio::gpio(gpio&& old) + : pin(old.pin), + direction(old.direction), + type(old.type), + current_state(old.current_state) +{ + old.pin = -1; +} + +gpio::~gpio() +{ + if (pin != -1) + { + ofstream unexport_file("/sys/class/gpio/unexport"); + unexport_file << pin; + } +} + +void gpio::set_value(bool on, bool use_cache) +{ + if (pin == -1) + throw logic_error("Usage of moved gpio"); + if (direction == pin_direction::INPUT) + { + stringstream errormsg; + errormsg << "Cannot write to input pin " << pin; + throw logic_error(errormsg.str()); + } + if (!use_cache || current_state != on) + { + bool value; + if (type == pin_type::HIGH_ON) + value = on; + else + value = !on; + ofstream value_file(construct_filename("/sys/class/gpio/gpio", pin, "/value")); + value_file << value; + } + current_state = on; +} + +void gpio::set_value(bool on) +{ + set_value(on, true); +} + +bool gpio::get_value() +{ + if (pin == -1) + throw logic_error("Usage of moved gpio"); + if (direction == pin_direction::OUTPUT) + return current_state; + ifstream value_file(construct_filename("/sys/class/gpio/gpio", pin, "/value")); + bool value; + value_file >> value; + bool on; + if (type == pin_type::HIGH_ON) + on = value; + else + on = !value; + return on; +} + +int gpio::get_pin() const +{ + return pin; +} + diff --git a/kawaii/gpio.hpp b/kawaii/gpio.hpp new file mode 100644 index 0000000..900c087 --- /dev/null +++ b/kawaii/gpio.hpp @@ -0,0 +1,34 @@ +#ifndef GPIO_HPP_ +#define GPIO_HPP_ + +class gpio +{ +public: + enum class pin_direction + { + INPUT, + OUTPUT + }; + enum class pin_type + { + HIGH_ON, + LOW_ON + }; + +private: + int pin; + pin_direction direction; + pin_type type; + bool current_state; + void set_value(bool on, bool use_cache); +public: + gpio(int pin, pin_direction, pin_type=pin_type::HIGH_ON, bool default_state=false); + gpio(const gpio&) = delete; + gpio(gpio&&); + ~gpio(); + void set_value(bool on); + bool get_value(); + int get_pin() const; +}; + +#endif diff --git a/kawaii/kawaii-rs/.gitignore b/kawaii/kawaii-rs/.gitignore new file mode 100644 index 0000000..03e759d --- /dev/null +++ b/kawaii/kawaii-rs/.gitignore @@ -0,0 +1,4 @@ +Cargo.lock +target/ +**/*.rs.bk +*.iml \ No newline at end of file diff --git a/kawaii/kawaii-rs/CMakeLists.txt b/kawaii/kawaii-rs/CMakeLists.txt new file mode 100644 index 0000000..122db1b --- /dev/null +++ b/kawaii/kawaii-rs/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.0) +project(kawaii-rs) + +include(ExternalProject) + +if (MEASURE) + set(CARGO_FEATURES "${CARGO_FEATURES} measure") +endif (MEASURE) + +if (CARGO_FEATURES) + set(CARGO_ARGUMENTS --features "${CARGO_FEATURES}") +endif(CARGO_FEATURES) + +file(GLOB RUST_SOURCE_FILES "${PROJECT_SOURCE_DIR}/src" *.rs) +add_custom_target(${PROJECT_NAME} + COMMAND cargo build --color=never ${CARGO_ARGUMENTS} + COMMAND cargo build --color=never ${CARGO_ARGUMENTS} --release + DEPENDS ${RUST_SOURCE_FILES} + BYPRODUCTS target/debug/libkawaii.a target/release/libkawaii.a + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + SOURCES ${RUST_SOURCE_FILES}) \ No newline at end of file diff --git a/kawaii/kawaii-rs/Cargo.toml b/kawaii/kawaii-rs/Cargo.toml new file mode 100644 index 0000000..e766209 --- /dev/null +++ b/kawaii/kawaii-rs/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "kawaii-rs-api" +version = "0.1.0" +authors = ["Simon Wörner "] + +[lib] +name = "kawaii" +crate-type = ["staticlib"] + +[features] +measure = [ + "kawaii/measure", + "emergency_stop/measure", + "ultrasonic_irq/measure" ] + +[dependencies] +emergency_stop = { git = "https://git.brn.li/kawaii-robotto/emergency-stop.git" } +kawaii = { git = "https://git.brn.li/kawaii-robotto/kawaii-rs.git" } +ultrasonic_irq = { git = "https://git.brn.li/kawaii-robotto/ultrasonic-irq.git" } \ No newline at end of file diff --git a/kawaii/kawaii-rs/dependencies/emergency-stop/.gitignore b/kawaii/kawaii-rs/dependencies/emergency-stop/.gitignore new file mode 100644 index 0000000..b7b0017 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/emergency-stop/.gitignore @@ -0,0 +1,8 @@ +CMakeFiles/ +Makefile +cmake_install.cmake +emergency-stop-prefix/ +emergency-stop.cbp +target/ +**/*.rs.bk +*.iml \ No newline at end of file diff --git a/kawaii/kawaii-rs/dependencies/emergency-stop/Cargo.toml b/kawaii/kawaii-rs/dependencies/emergency-stop/Cargo.toml new file mode 100644 index 0000000..5e19070 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/emergency-stop/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "emergency_stop" +version = "0.1.0" +authors = ["Simon Wörner "] + +[features] +measure = ["kawaii/measure"] + +[dependencies] +kawaii = { git = "https://git.brn.li/kawaii-robotto/kawaii-rs.git" } \ No newline at end of file diff --git a/kawaii/kawaii-rs/dependencies/emergency-stop/src/lib.rs b/kawaii/kawaii-rs/dependencies/emergency-stop/src/lib.rs new file mode 100644 index 0000000..3a9afe7 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/emergency-stop/src/lib.rs @@ -0,0 +1,96 @@ +extern crate kawaii; + +use std::time::Duration; +use std::thread; +use std::thread::JoinHandle; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; + +use self::kawaii::gpio::{AsyncPort, Edge, Value}; + +#[cfg(feature = "measure")] +use self::kawaii::Measure; + +#[derive(Debug)] +pub struct EmergencyStop { + thread: Option>, + pub state: Arc, +} + +impl EmergencyStop { + pub fn new(stop_port: u8) -> std::io::Result { + let name = format!("EmergencyStop(port = {})", stop_port); + let state = Arc::new(AtomicBool::new(false)); + let mut port = AsyncPort::new(stop_port, Edge::Both)?; + + let state_clone = state.clone(); + let thread = thread::Builder::new() + .name(name) + .spawn(move || EmergencyStop::thread(&mut port, state_clone))?; + + Ok(EmergencyStop { + thread: Some(thread), + state: state, + }) + } + + fn thread(port: &mut AsyncPort, state: Arc) { + #[cfg(feature = "measure")] + let mut measure = Measure::new(format!("EmergencyStop(port = {})", port.port.number)); + + // clear first value + port.poll(Some(Duration::new(0, 0))).is_ok(); + + while !state.load(Ordering::Relaxed) { + #[cfg(feature = "measure")] + measure.start(); + + let timeout = Some(Duration::new(1, 0)); + + #[cfg(not(feature = "measure"))] + let value = port.poll(timeout); + + #[cfg(feature = "measure")] + let value = port.poll_measure(timeout, &mut measure); + + // continue on timeout + match value { + Ok(value) => { + if let Some(value) = value { + match value { + Value::High => { + #[cfg(debug_assertions)] + println!("EmergencyStop! ({:?})", value); + + state.store(true, Ordering::Relaxed); + } + _ => { + #[cfg(debug_assertions)] + println!("EmergencyStop ignored: ({:?})", value); + } + } + } + } + Err(e) => { + #[cfg(debug_assertions)] + println!("EmergencyStop! ({:?})", e); + + state.store(true, Ordering::Relaxed); + } + } + + #[cfg(feature = "measure")] + measure.stop(); + } + } +} + +impl Drop for EmergencyStop { + fn drop(&mut self) { + self.state.store(true, Ordering::Relaxed); + + if let Some(thread) = self.thread.take() { + thread.join().is_ok(); + } + } +} diff --git a/kawaii/kawaii-rs/dependencies/emergency-stop/src/main.rs b/kawaii/kawaii-rs/dependencies/emergency-stop/src/main.rs new file mode 100644 index 0000000..e5226d6 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/emergency-stop/src/main.rs @@ -0,0 +1,21 @@ +extern crate emergency_stop; + +use emergency_stop::EmergencyStop; + +use std::time::Duration; +use std::thread::sleep; +use std::sync::atomic::Ordering; + +static GPIO_PORT_STOP: u8 = 25; + +fn main() { + let emergency_stop = EmergencyStop::new(GPIO_PORT_STOP).expect("Create Emergency Stop failed"); + + println!("{:?}", emergency_stop); + + while !emergency_stop.state.load(Ordering::Relaxed) { + sleep(Duration::new(1, 0)); + } + + println!("Stopped."); +} diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/.gitignore b/kawaii/kawaii-rs/dependencies/kawaii-rs/.gitignore new file mode 100644 index 0000000..03e759d --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/.gitignore @@ -0,0 +1,4 @@ +Cargo.lock +target/ +**/*.rs.bk +*.iml \ No newline at end of file diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/Cargo.toml b/kawaii/kawaii-rs/dependencies/kawaii-rs/Cargo.toml new file mode 100644 index 0000000..ee55705 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "kawaii" +version = "0.1.0" +authors = ["Simon Wörner "] + +[features] +measure = [] + +[dependencies] +nix = "0.8.1" +regex = "^0.2" +separator = "^0.3.1" +time = "^0.1.36" diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/src/gpio.rs b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/gpio.rs new file mode 100644 index 0000000..dbae7be --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/gpio.rs @@ -0,0 +1,288 @@ +extern crate std; +extern crate nix; + +use std::fmt; +use std::time::Duration; +use std::io::prelude::*; +use std::io::{Error, ErrorKind, SeekFrom}; +use std::fs::File; +use std::path::Path; + +use std::os::unix::io::RawFd; + +#[cfg(feature = "measure")] +use measure::Measure; + +fn duration_to_ms(duration: Duration) -> u64 { + duration.as_secs() * 1_000u64 + duration.subsec_nanos() as u64 / 1_000_000u64 +} + +#[derive(Clone, Copy, Debug)] +pub enum Direction { + Out, + In, +} +impl Direction { + pub fn from_str(s: &str) -> Option { + match s { + "out" => Some(Direction::Out), + "in" => Some(Direction::In), + _ => None, + } + } + + pub fn as_str(&self) -> &'static str { + match *self { + Direction::Out => "out", + Direction::In => "in", + } + } +} + +#[derive(Clone, Copy, Debug)] +pub enum Edge { + None, + Rising, + Falling, + Both, +} +impl Edge { + pub fn from_str(s: &str) -> Option { + match s { + "none" => Some(Edge::None), + "rising" => Some(Edge::Rising), + "falling" => Some(Edge::Falling), + "both" => Some(Edge::Both), + _ => None, + } + } + + pub fn as_str(&self) -> &'static str { + match *self { + Edge::None => "none", + Edge::Rising => "rising", + Edge::Falling => "falling", + Edge::Both => "both", + } + } +} + +#[derive(Clone, Copy, Debug)] +pub enum Value { + High, + Low, +} +impl Value { + pub fn from_str(s: &str) -> Option { + match s { + "1" => Some(Value::High), + "0" => Some(Value::Low), + _ => None, + } + } + + pub fn from_buffer(b: &[u8; 1]) -> Option { + Value::from_char(b[0]) + } + + pub fn from_char(c: u8) -> Option { + match c { + 48 => Some(Value::Low), // '0' + 49 => Some(Value::High), // '1' + _ => None, + } + } + + pub fn as_str(&self) -> &'static str { + match *self { + Value::High => "1", + Value::Low => "0", + } + } +} + +#[derive(Debug)] +pub struct Port { + pub number: u8, + pub direction: Direction, +} + +#[derive(Debug)] +pub struct SyncPort { + pub port: Port, + file: File, + buffer: [u8; 1], +} +pub struct AsyncPort { + pub port: Port, + pub edge: Edge, + file: RawFd, + fds: [nix::poll::PollFd; 1], + buffer: [u8; 1], +} + +impl fmt::Debug for AsyncPort { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, + "AsyncPort {{ port: {:?}, edge: {:?}, file: {:?}, fds: [?], buffer: {:?} }}", + self.port, + self.edge, + self.file, + self.buffer) + } +} + +impl Port { + pub fn new(number: u8, direction: Direction) -> std::io::Result { + let port = Port { + number: number, + direction: direction, + }; + + port.init()?; + Ok(port) + } + + fn init(&self) -> std::io::Result<()> { + self.export().ok(); + self.set_direction()?; + + Ok(()) + } + + pub fn drop(&mut self) { + self.unexport().ok(); + } + + fn write_path(path: &str, value: &str) -> std::io::Result<()> { + File::create(Path::new(path))? + .write_all(value.as_bytes()) + } + + fn export(&self) -> std::io::Result<()> { + Port::write_path("/sys/class/gpio/export", self.number.to_string().as_str()) + } + fn unexport(&self) -> std::io::Result<()> { + Port::write_path("/sys/class/gpio/unexport", self.number.to_string().as_str()) + } + + fn set_direction(&self) -> std::io::Result<()> { + Port::write_path(format!("/sys/class/gpio/gpio{}/direction", self.number).as_str(), + self.direction.as_str()) + } +} + +impl SyncPort { + pub fn new(number: u8, direction: Direction) -> std::io::Result { + Ok(SyncPort { + port: Port::new(number, direction)?, + file: SyncPort::open(number, direction)?, + buffer: [0; 1], + }) + } + + fn open(number: u8, direction: Direction) -> std::io::Result { + let path = format!("/sys/class/gpio/gpio{}/value", number); + let path = Path::new(path.as_str()); + + Ok(match direction { + Direction::Out => File::create(path)?, + Direction::In => File::open(path)?, + }) + } + + pub fn read(&mut self) -> std::io::Result { + self.file.seek(SeekFrom::Start(0))?; + self.file.read_exact(&mut self.buffer)?; + + Value::from_buffer(&self.buffer).ok_or(Error::new(ErrorKind::InvalidData, + "Unrecognized GPIO Value")) + } + + pub fn write(&mut self, value: Value) -> std::io::Result<()> { + self.file.write_all(value.as_str().as_bytes()) + } +} + +impl AsyncPort { + pub fn new(number: u8, edge: Edge) -> std::io::Result { + let port = Port::new(number, Direction::In)?; + let file = AsyncPort::open(number)?; + let port = AsyncPort { + port: port, + edge: edge, + file: file, + fds: [nix::poll::PollFd::new(file, nix::poll::POLLPRI, nix::poll::EventFlags::empty())], + buffer: [0; 1], + }; + + port.init()?; + Ok(port) + } + fn init(&self) -> std::io::Result<()> { + self.set_edge()?; + + Ok(()) + } + + fn open(number: u8) -> std::io::Result { + nix::fcntl::open(format!("/sys/class/gpio/gpio{}/value", number).as_str(), + nix::fcntl::O_RDONLY, + nix::sys::stat::Mode::empty()) + .or(Err(Error::new(ErrorKind::Other, "open failed"))) + } + + fn get_timeout(timeout: Option) -> i32 { + match timeout { + None => -1, + Some(t) => duration_to_ms(t) as i32, + } + } + + fn nix_poll(&mut self, timeout: i32) -> nix::Result { + nix::poll::poll(&mut self.fds, timeout) + } + + fn poll_read(&mut self, poll: nix::Result) -> std::io::Result> { + let poll = poll.or(Err(Error::new(ErrorKind::Other, "poll failed")))?; + + if poll == 0 { + return Ok(None); + } + + nix::unistd::lseek(self.file, 0, nix::unistd::Whence::SeekSet) + .or(Err(Error::new(ErrorKind::Other, "lseek failed")))?; + + nix::unistd::read(self.file, &mut self.buffer) + .or(Err(Error::new(ErrorKind::Other, "read failed")))?; + + Value::from_buffer(&self.buffer).map_or(Err(Error::new(ErrorKind::InvalidData, + "Unrecognized GPIO Value")), + |v| Ok(Some(v))) + } + + pub fn poll(&mut self, timeout: Option) -> std::io::Result> { + let poll = self.nix_poll(Self::get_timeout(timeout)); + + self.poll_read(poll) + } + + #[cfg(feature = "measure")] + pub fn poll_measure(&mut self, + timeout: Option, + measure: &mut Measure) + -> std::io::Result> { + let timeout = Self::get_timeout(timeout); + + measure.pause(); + let poll = self.nix_poll(timeout); + measure.start(); + + self.poll_read(poll) + } + + fn set_edge(&self) -> std::io::Result<()> { + Port::write_path(format!("/sys/class/gpio/gpio{}/edge", self.port.number).as_str(), + self.edge.as_str()) + } +} diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/src/lib.rs b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/lib.rs new file mode 100644 index 0000000..37d3de6 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/lib.rs @@ -0,0 +1,7 @@ +pub mod gpio; + +#[cfg(feature = "measure")] +mod measure; + +#[cfg(feature = "measure")] +pub use measure::Measure; \ No newline at end of file diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/src/main.rs b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/main.rs new file mode 100644 index 0000000..268618e --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/main.rs @@ -0,0 +1,35 @@ +extern crate kawaii; + +use std::time::Duration; + +use kawaii::gpio::{SyncPort, AsyncPort, Direction, Edge, Value}; + +#[cfg(feature = "measure")] +use kawaii::measure::Measure; + +fn main() { + println!("Hello, world!"); + + #[cfg(feature = "measure")] + { + let mut measure = Measure::new(String::from("main({test: 1})")); + + for _ in 0..5 { + measure.start(); + std::thread::sleep(Duration::new(0, 1_000_000)); + measure.stop(); + } + + println!("{:?}", measure); + } + + let mut trigger = SyncPort::new(27, Direction::Out).expect("Create Trigger GPIO failed"); + let mut echo = AsyncPort::new(28, Edge::Both).expect("Create Echo GPIO failed"); + + println!("trigger = {:?}", trigger.read()); + trigger.write(Value::High).expect("write failed"); + println!("trigger = {:?}", trigger.read()); + trigger.write(Value::Low).expect("write failed"); + println!("trigger = {:?}", trigger.read()); + println!("echo = {:?}", echo.poll(Some(Duration::new(1, 0)))); +} diff --git a/kawaii/kawaii-rs/dependencies/kawaii-rs/src/measure.rs b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/measure.rs new file mode 100644 index 0000000..11efd20 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/kawaii-rs/src/measure.rs @@ -0,0 +1,111 @@ +extern crate regex; +extern crate separator; +extern crate time; + +use std; +use std::fs::File; +use std::io::prelude::*; +use std::io::{Error, ErrorKind}; + +use self::regex::Regex; +use self::separator::Separatable; +use self::time::precise_time_ns; + +#[derive(Debug)] +pub struct Measure { + pub min: u64, + pub max: u64, + time: u64, + last: u64, + data: Vec, + pub name: String, +} + +impl Measure { + pub fn new(name: String) -> Self { + Measure { + min: u64::max_value(), + max: 0u64, + time: 0u64, + last: 0u64, + data: Vec::with_capacity(1_000_000), + name: name, + } + } + + pub fn start(&mut self) { + self.last = precise_time_ns(); + } + + pub fn pause(&mut self) { + if self.last == 0 { + #[cfg(debug_assertions)] + println!("WARNING: {:?} pause called without start!", self); + + return; + } + + self.time += self.time_diff(); + } + + pub fn stop(&mut self) { + if self.last == 0 { + #[cfg(debug_assertions)] + println!("WARNING: {:?} stop called without start!", self); + + return; + } + + self.time += self.time_diff(); + self.data.push(self.time); + + if self.time < self.min { + self.min = self.time; + } + + if self.time > self.max { + self.max = self.time; + } + + self.time = 0u64; + self.last = 0u64; + } + + fn time_diff(&mut self) -> u64 { + let current_time = precise_time_ns(); + let time_diff = current_time - self.last; + self.last = current_time; + + time_diff + } + + fn write_data(&self) -> std::io::Result<()> { + let re = Regex::new(r"[^\w\-.]") + .or(Err(Error::new(ErrorKind::Other, "Create filename regex failed.")))?; + + let file_name = format!("measure_{}.txt", self.name); + let file_name = re.replace_all(file_name.as_str(), "_").to_string(); + println!("{}: Write data to {}", self.name, file_name); + + let mut file = File::create(file_name)?; + + for value in &self.data { + file.write_fmt(format_args!("{}\n", value))?; + } + + Ok(()) + } +} + +impl Drop for Measure { + fn drop(&mut self) { + println!("{}:\n\tmin: {} ns\n\tmax: {} ns", + self.name, + self.min.separated_string(), + self.max.separated_string()); + + if let Err(e) = self.write_data() { + println!("{}: Write measure data failed: {}", self.name, e); + } + } +} diff --git a/kawaii/kawaii-rs/dependencies/ultrasonic-irq/.gitignore b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/.gitignore new file mode 100644 index 0000000..d0f4ebb --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/.gitignore @@ -0,0 +1,7 @@ +CMakeFiles/ +Makefile +cmake_install.cmake +ultrasonic-irq-prefix/ +ultrasonic-irq.cbp +target/ +**/*.rs.bk diff --git a/kawaii/kawaii-rs/dependencies/ultrasonic-irq/Cargo.toml b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/Cargo.toml new file mode 100644 index 0000000..45f029a --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ultrasonic_irq" +version = "0.1.0" +authors = ["kawaii "] + +[features] +measure = ["kawaii/measure"] + +[dependencies] +time = "^0.1.36" +shuteye = "^0.3.2" +kawaii = { git = "https://git.brn.li/kawaii-robotto/kawaii-rs.git" } diff --git a/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/lib.rs b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/lib.rs new file mode 100644 index 0000000..aa6db09 --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/lib.rs @@ -0,0 +1,194 @@ +#![feature(integer_atomics)] + +extern crate time; +extern crate shuteye; +extern crate kawaii; + +use std::time::Duration; +use std::thread; +use std::thread::JoinHandle; +use std::sync::mpsc::{Sender, Receiver}; +use std::sync::mpsc; +use std::sync::Arc; +use std::sync::atomic::{AtomicU32, Ordering}; + +use self::kawaii::gpio::{SyncPort, AsyncPort, Direction, Edge, Value}; + +#[cfg(feature = "measure")] +use self::kawaii::Measure; + +use self::time::precise_time_ns; +use self::shuteye::sleep; + +#[derive(Debug)] +struct ThreadData { + thread: JoinHandle, + tx: Sender<()>, +} + +#[derive(Debug)] +pub struct UltrasonicEcho { + echo: AsyncPort, + temperature: u8, + timestamp: u64, + distance: Arc, +} + +#[derive(Debug)] +pub struct UltrasonicTrigger { + trigger: SyncPort, +} + +#[derive(Debug)] +pub struct Ultrasonic { + trigger: Option>, + echo: Option>, + pub distance: Arc, +} + +impl Ultrasonic { + pub fn new(trigger_port: u8, echo_port: u8, temperature: u8) -> std::io::Result { + let distance = Arc::new(AtomicU32::new(u32::max_value())); + let echo = UltrasonicEcho { + echo: AsyncPort::new(echo_port, Edge::Both)?, + temperature: temperature, + timestamp: 0, + distance: distance.clone(), + }; + let (tx, rx): (Sender<()>, Receiver<()>) = mpsc::channel(); + let name = format!("Ultrasonic::echo(port = {})", echo_port); + let echo = ThreadData::<()> { + thread: thread::Builder::new() + .name(name) + .spawn(move || echo.thread(rx))?, + tx: tx, + }; + + let trigger = UltrasonicTrigger { trigger: SyncPort::new(trigger_port, Direction::Out)? }; + let (tx, rx): (Sender<()>, Receiver<()>) = mpsc::channel(); + let name = format!("Ultrasonic::trigger(port = {})", trigger_port); + let trigger = ThreadData::<()> { + thread: thread::Builder::new() + .name(name) + .spawn(move || trigger.thread(rx))?, + tx: tx, + }; + + Ok(Ultrasonic { + trigger: Some(trigger), + echo: Some(echo), + distance: distance, + }) + } +} + +impl Drop for Ultrasonic { + fn drop(&mut self) { + if let Some(echo) = self.echo.take() { + echo.tx.send(()).is_ok(); + echo.thread.join().is_ok(); + } + + if let Some(trigger) = self.trigger.take() { + trigger.tx.send(()).is_ok(); + trigger.thread.join().is_ok(); + } + } +} + +impl UltrasonicTrigger { + fn thread(mut self, stop_rx: Receiver<()>) { + #[cfg(feature = "measure")] + let mut measure = Measure::new(format!("Ultrasonic::trigger(port = {})", self.trigger.port.number)); + + while stop_rx.try_recv().is_err() { + #[cfg(feature = "measure")] + measure.start(); + self.trigger.write(Value::Low).is_ok(); + #[cfg(feature = "measure")] + measure.pause(); + + // sleep 10us (min length to trigger) + sleep(Duration::new(0, 10_000)); + + #[cfg(feature = "measure")] + measure.start(); + self.trigger.write(Value::High).is_ok(); + #[cfg(feature = "measure")] + measure.stop(); + + // sleep 20ms (max trigger frequency) + sleep(Duration::new(0, 20_000_000)); + } + } +} + +impl UltrasonicEcho { + fn thread(mut self, stop_rx: Receiver<()>) { + #[cfg(feature = "measure")] + let mut measure = Measure::new(format!("Ultrasonic::echo(port = {})", self.echo.port.number)); + + while stop_rx.try_recv().is_err() { + #[cfg(feature = "measure")] + measure.start(); + + #[cfg(not(feature = "measure"))] + let value = self.echo.poll(Some(Duration::new(1, 0))); + + #[cfg(feature = "measure")] + let value = self.echo.poll_measure(Some(Duration::new(1, 0)), &mut measure); + + match value { + Ok(value) => { + if let Some(value) = value { + self.on_value_changed(value); + } + } + Err(_e) => { + #[cfg(debug_assertions)] + println!("POLL failed: e = {:?}", _e); + } + } + + #[cfg(feature = "measure")] + measure.stop(); + } + } + + fn on_value_changed(&mut self, value: Value) { + match value { + Value::High => { + // Switched from Value::High to Value::High + // possibly because of trigger after timeout and slow reading + if self.timestamp > 0 { + #[cfg(debug_assertions)] + println!("{:?}", self); + + self.calc_distance(); + } + + self.timestamp = precise_time_ns() + } + Value::Low => { + // Switched from Value::Low to Value::Low + if self.timestamp == 0 { + #[cfg(debug_assertions)] + println!("{:?}", self); + } + + self.calc_distance(); + } + } + } + + fn calc_distance(&mut self) { + let time_diff = precise_time_ns() - self.timestamp; + let distance = (3315 + self.temperature as u64 * 6) * time_diff / 20_000_000; + self.distance.store(distance as u32, Ordering::Relaxed); + + #[cfg(debug_assertions)] + println!("time diff: {}\tdistance: {}mm", time_diff, distance); + + self.timestamp = 0u64; + } +} diff --git a/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/main.rs b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/main.rs new file mode 100644 index 0000000..c19a4cd --- /dev/null +++ b/kawaii/kawaii-rs/dependencies/ultrasonic-irq/src/main.rs @@ -0,0 +1,21 @@ +extern crate shuteye; + +extern crate ultrasonic_irq; + +use std::time::Duration; +use std::thread::sleep; + +use ultrasonic_irq::Ultrasonic; + +static GPIO_PORT_TRIG: u8 = 23; +static GPIO_PORT_ECHO: u8 = 24; +static TEMPERATURE: u8 = 20; + +fn main() { + let ultrasonic = Ultrasonic::new(GPIO_PORT_TRIG, GPIO_PORT_ECHO, TEMPERATURE) + .expect("Create Ultrasonic failed"); + + println!("{:?}", ultrasonic); + + sleep(Duration::new(10, 0)); +} diff --git a/kawaii/kawaii-rs/src/emergency_stop.rs b/kawaii/kawaii-rs/src/emergency_stop.rs new file mode 100644 index 0000000..4b254d6 --- /dev/null +++ b/kawaii/kawaii-rs/src/emergency_stop.rs @@ -0,0 +1,27 @@ +extern crate emergency_stop; + +use self::emergency_stop::EmergencyStop; + +use std::mem::transmute; +use std::ptr::null_mut; +use std::sync::atomic::Ordering; + +#[no_mangle] +pub extern "C" fn emergency_stop_init(stop: u8) -> *mut EmergencyStop { + match EmergencyStop::new(stop) { + Err(_) => null_mut(), + Ok(emergency_stop) => unsafe { transmute(Box::new(emergency_stop)) }, + } +} + +#[no_mangle] +pub extern "C" fn emergency_stop_clean(emergency_stop: *mut EmergencyStop) { + let _emergency_stop: Box = unsafe { transmute(emergency_stop) }; +} + +#[no_mangle] +pub extern "C" fn emergency_stop_get_state(emergency_stop: *mut EmergencyStop) -> bool { + let emergency_stop = unsafe { &mut *emergency_stop }; + + emergency_stop.state.load(Ordering::Relaxed) +} diff --git a/kawaii/kawaii-rs/src/lib.rs b/kawaii/kawaii-rs/src/lib.rs new file mode 100644 index 0000000..1c2c31c --- /dev/null +++ b/kawaii/kawaii-rs/src/lib.rs @@ -0,0 +1,13 @@ +#![feature(integer_atomics)] + +mod emergency_stop; +mod ultrasonic_irq; + +#[cfg(feature = "measure")] +mod measure; + +pub use emergency_stop::*; +pub use ultrasonic_irq::*; + +#[cfg(feature = "measure")] +pub use measure::*; diff --git a/kawaii/kawaii-rs/src/measure.rs b/kawaii/kawaii-rs/src/measure.rs new file mode 100644 index 0000000..0f3b231 --- /dev/null +++ b/kawaii/kawaii-rs/src/measure.rs @@ -0,0 +1,48 @@ +extern crate kawaii; + +use self::kawaii::Measure; + +use std::ffi::CStr; +use std::ptr::null_mut; +use std::mem::transmute; +use std::os::raw::c_char; + +#[no_mangle] +pub extern "C" fn measure_init(name: *const c_char) -> *mut Measure { + if name.is_null() { + return null_mut(); + } + + unsafe { + match CStr::from_ptr(name).to_str() { + Err(_) => null_mut(), + Ok(name) => transmute(Box::new(Measure::new(String::from(name)))), + } + } +} + +#[no_mangle] +pub extern "C" fn measure_clean(measure: *mut Measure) { + let _measure: Box = unsafe { transmute(measure) }; +} + +#[no_mangle] +pub extern "C" fn measure_start(measure: *mut Measure) { + let measure = unsafe { &mut *measure }; + + measure.start(); +} + +#[no_mangle] +pub extern "C" fn measure_pause(measure: *mut Measure) { + let measure = unsafe { &mut *measure }; + + measure.pause(); +} + +#[no_mangle] +pub extern "C" fn measure_stop(measure: *mut Measure) { + let measure = unsafe { &mut *measure }; + + measure.stop(); +} \ No newline at end of file diff --git a/kawaii/kawaii-rs/src/ultrasonic_irq.rs b/kawaii/kawaii-rs/src/ultrasonic_irq.rs new file mode 100644 index 0000000..dbf8c37 --- /dev/null +++ b/kawaii/kawaii-rs/src/ultrasonic_irq.rs @@ -0,0 +1,27 @@ +extern crate ultrasonic_irq; + +use std::mem::transmute; +use std::ptr::null_mut; +use std::sync::atomic::Ordering; + +use self::ultrasonic_irq::Ultrasonic; + +#[no_mangle] +pub extern "C" fn ultrasonic_init(trigger: u8, echo: u8, temperature: u8) -> *mut Ultrasonic { + match Ultrasonic::new(trigger, echo, temperature) { + Err(_) => null_mut(), + Ok(ultrasonic) => unsafe { transmute(Box::new(ultrasonic)) }, + } +} + +#[no_mangle] +pub extern "C" fn ultrasonic_clean(ultrasonic: *mut Ultrasonic) { + let _ultrasonic: Box = unsafe { transmute(ultrasonic) }; +} + +#[no_mangle] +pub extern "C" fn ultrasonic_get_distance(ultrasonic: *mut Ultrasonic) -> u32 { + let ultrasonic = unsafe { &mut *ultrasonic }; + + ultrasonic.distance.load(Ordering::Relaxed) +} diff --git a/kawaii/main.cpp b/kawaii/main.cpp new file mode 100644 index 0000000..541e330 --- /dev/null +++ b/kawaii/main.cpp @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "engine.hpp" +#include "measure.hpp" +#include "rfid_reader.hpp" +#include "ultrasound_sensor.hpp" +#include "emergency_stop.h" + +using namespace std; + +typedef chrono::high_resolution_clock clocktype; + +const int tickrate = 100; +const chrono::milliseconds tick_delay = 1000ms / tickrate; +const uint32_t exit_tag = 0xAE0B1E2B; +const int no_tags = 3; +const uint32_t distance_until_turn = 180; +chrono::milliseconds backoff_time = 100ms; +chrono::milliseconds turn_right_follow_time = 150ms; +chrono::milliseconds turn_right_backoff_time = 500ms; + +bool stop = false; + +enum class mmode +{ + STOP, + LABYRINTH_FIND_WALL, + LABYRINTH_BACKOFF, + LABYRINTH_TURN_RIGHT, + LABYRINTH_TURN_AWAY, + LABYRINTH_FOLLOW, + SEARCH_STRAIGHT, + SEARCH_TURN_RIGHT, + SEARCH_TURN_LEFT, + SEARCH_TAG_STOP, + HAPPY +}; + +void signal_handler(int sig) +{ + stop = true; +} + +int main() +{ + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + engine right( + gpio(13, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(20, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + engine left( + gpio(19, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(26, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + gpio bwleftleft(18, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bwleftright(4, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bwrightleft(3, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bwrightright(2, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + emergency_stop stop_button(25); + ultrasound_sensor ultrasoundright(23, 24); + ultrasound_sensor ultrasoundleft(12, 6); + rfid_reader rfid; + // TODO This random is unseeded + minstd_rand random; + + clocktype::time_point mmode_end = clocktype::now(); + mmode mode = mmode::STOP; + mmode target_mode = mmode::LABYRINTH_FIND_WALL; + clocktype::time_point mode_reset_time; + + int last_tag = 0x00000000; + vector found_tags; + found_tags.reserve(no_tags); + + measure measurement("main"); + + clocktype::time_point next_tick = clocktype::now(); + while (!stop) + { + measurement.start(); + clocktype::time_point tick_start = clocktype::now(); + switch (mode) + { + case mmode::LABYRINTH_FOLLOW: + case mmode::LABYRINTH_BACKOFF: + case mmode::LABYRINTH_TURN_RIGHT: + case mmode::LABYRINTH_TURN_AWAY: + case mmode::LABYRINTH_FIND_WALL: + { + if (tick_start >= mode_reset_time) + { + switch (mode) + { + case mmode::LABYRINTH_BACKOFF: + target_mode = mmode::LABYRINTH_TURN_AWAY; + mode_reset_time = tick_start + turn_right_backoff_time; + break; + case mmode::LABYRINTH_TURN_AWAY: + target_mode = mmode::LABYRINTH_FIND_WALL; + break; + case mmode::LABYRINTH_TURN_RIGHT: + target_mode = mmode::LABYRINTH_FOLLOW; + break; + } + } + if (bwrightleft.get_value() || bwrightright.get_value()) + { + target_mode = mmode::LABYRINTH_BACKOFF; + mode_reset_time = tick_start + backoff_time; + } + else if (bwleftleft.get_value() || bwleftright.get_value()) + { + if (mode != mmode::LABYRINTH_BACKOFF) + { + target_mode = mmode::LABYRINTH_TURN_RIGHT; + mode_reset_time = tick_start + turn_right_follow_time; + } + } + int last_id = rfid.last_id(); + if (last_id == exit_tag) + { + target_mode = mmode::SEARCH_STRAIGHT; + last_tag = last_id; + } + } + break; + case mmode::SEARCH_STRAIGHT: + { + auto usoundright = ultrasoundright.get_value(); + auto usoundleft = ultrasoundleft.get_value(); + if (min(usoundright, usoundleft) < distance_until_turn) + { + if (std::abs((long long int) usoundright - usoundleft) < 50) + { + int angle = random() % 180 + 90; + if (angle <= 180) + { + target_mode = mmode::SEARCH_TURN_RIGHT; + } + else + { + target_mode = mmode::SEARCH_TURN_LEFT; + angle = 360 - angle; + } + mode_reset_time = tick_start + 3ms * angle; + } + else + { + int angle = random() % 90 + 90; + mode_reset_time = tick_start + 3ms * angle; + if (usoundright < usoundleft) + target_mode = mmode::SEARCH_TURN_LEFT; + else + target_mode = mmode::SEARCH_TURN_RIGHT; + } + } + int last_id = rfid.last_id(); + if (last_id != last_tag && last_id != exit_tag) + { + last_tag = last_id; + if (find(found_tags.begin(), found_tags.end(), last_tag) == found_tags.end()) + { + found_tags.push_back(last_tag); + target_mode = mmode::SEARCH_TAG_STOP; + mode_reset_time = tick_start + 200ms; + if (found_tags.size() == no_tags) + { + target_mode = mmode::HAPPY; + mode_reset_time = tick_start + 2s; + } + } + } + } + break; + case mmode::SEARCH_TURN_LEFT: + case mmode::SEARCH_TURN_RIGHT: + case mmode::SEARCH_TAG_STOP: + if (tick_start >= mode_reset_time) + { + target_mode = mmode::SEARCH_STRAIGHT; + } + break; + case mmode::HAPPY: + if (tick_start >= mode_reset_time) + { + target_mode = mmode::STOP; + stop = true; + } + break; + } + + if (stop_button.get_state()) + { + target_mode = mmode::STOP; + stop = true; + } + + if (target_mode != mode) + { + mode = target_mode; + switch (mode) + { + case mmode::STOP: + left.set_speed(0); + right.set_speed(0); + break; + case mmode::LABYRINTH_FIND_WALL: + left.set_speed(60); + right.set_speed(60); + break; + case mmode::LABYRINTH_BACKOFF: + left.set_speed(-100); + right.set_speed(-100); + break; + case mmode::LABYRINTH_TURN_AWAY: + case mmode::LABYRINTH_TURN_RIGHT: + left.set_speed(100); + right.set_speed(-60); + break; + case mmode::LABYRINTH_FOLLOW: + left.set_speed(0); + right.set_speed(100); + break; + case mmode::SEARCH_STRAIGHT: + left.set_speed(100); + right.set_speed(100); + break; + case mmode::HAPPY: + case mmode::SEARCH_TURN_LEFT: + left.set_speed(-100); + right.set_speed(100); + break; + case mmode::SEARCH_TURN_RIGHT: + left.set_speed(100); + right.set_speed(-100); + break; + case mmode::SEARCH_TAG_STOP: + left.set_speed(-100); + right.set_speed(-100); + break; + } + } + + measurement.stop(); + + if (!stop) + { + next_tick += tick_delay; + this_thread::sleep_until(next_tick); + } + } + + return 0; +} diff --git a/kawaii/measure.cpp b/kawaii/measure.cpp new file mode 100644 index 0000000..5ae0437 --- /dev/null +++ b/kawaii/measure.cpp @@ -0,0 +1,50 @@ +#include "measure.hpp" + +#include + +#ifdef MEASURE +extern "C" { + void *measure_init(const char *name); + void measure_clean(void *measure); + void measure_start(void *measure); + void measure_pause(void *measure); + void measure_stop(void *measure); +} +#endif + +measure::measure(const std::string &name) +{ +#ifdef MEASURE + measure_ptr = measure_init(name.c_str()); +#endif +} + +measure::~measure() +{ +#ifdef MEASURE + measure_clean(measure_ptr); + measure_ptr = NULL; +#endif + +} + +void measure::start() +{ +#ifdef MEASURE + measure_start(measure_ptr); +#endif +} + +void measure::pause() +{ +#ifdef MEASURE + measure_pause(measure_ptr); +#endif +} + +void measure::stop() +{ +#ifdef MEASURE + measure_stop(measure_ptr); +#endif +} \ No newline at end of file diff --git a/kawaii/measure.hpp b/kawaii/measure.hpp new file mode 100644 index 0000000..5dd5ff1 --- /dev/null +++ b/kawaii/measure.hpp @@ -0,0 +1,22 @@ +#ifndef MEASURE_HPP_ +#define MEASURE_HPP_ + +#include + +class measure +{ +private: +#ifdef MEASURE + void *measure_ptr; +#endif +public: + measure(const std::string &); + measure(const measure &) = delete; + measure(measure &&) = delete; + ~measure(); + void start(); + void stop(); + void pause(); +}; + +#endif diff --git a/kawaii/remote.cpp b/kawaii/remote.cpp new file mode 100644 index 0000000..de134bf --- /dev/null +++ b/kawaii/remote.cpp @@ -0,0 +1,123 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "engine.hpp" + +using namespace std; +using boost::asio::ip::tcp; +using boost::asio::io_service; + +template +class prodcon +{ +private: + mutex mut; + condition_variable condition; + queue q; +public: + void push(T data) + { + unique_lock lock(mut); + q.push(data); + condition.notify_one(); + } + template + bool pop(T &result, const chrono::duration<_Rep, _Period> __rtime) + { + unique_lock lock(mut); + bool success = condition.wait_for(lock, __rtime, [this] {return !this->q.empty();}); + if (!success) + return false; + result = q.front(); + q.pop(); + return true; + } +}; + +class remote_server +{ +private: + tcp::acceptor acceptor; + io_service &io; + thread engine_thread; + atomic stop_thread; + prodcon> commands; +public: + remote_server(io_service &io_service); + void run(); + void engine_loop(); +}; + +int main() +{ + io_service io; + remote_server server(io); + server.run(); + return 0; +} + +remote_server::remote_server(io_service &io_service) + : acceptor(io_service), + io(io_service), + stop_thread(false) +{ + // Nothing to do +} + +void remote_server::run() +{ + tcp::endpoint endpoint(tcp::v4(), 1337); + acceptor.open(endpoint.protocol()); + acceptor.set_option(tcp::acceptor::reuse_address(true)); + acceptor.bind(endpoint); + acceptor.listen(1); + while (true) + { + tcp::socket socket(io); + acceptor.accept(socket); + stop_thread = false; + engine_thread = thread(&remote_server::engine_loop, this); + while (true) + { + int8_t speed_left, speed_right; + socket.read_some(boost::asio::buffer(&speed_left, 1)); + socket.read_some(boost::asio::buffer(&speed_right, 1)); + commands.push(pair(speed_left, speed_right)); + } + } +} + +void remote_server::engine_loop() +{ + engine left( + gpio(13, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(20, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + engine right( + gpio(19, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(26, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + while (!stop_thread) + { + pair command; + if (commands.pop(command, 1s)) + { + left.set_speed(command.first); + right.set_speed(command.second); + } + else + { + left.set_speed(0); + right.set_speed(0); + } + } +} diff --git a/kawaii/rfid_reader.cpp b/kawaii/rfid_reader.cpp new file mode 100644 index 0000000..f276e84 --- /dev/null +++ b/kawaii/rfid_reader.cpp @@ -0,0 +1,61 @@ +#include "rfid_reader.hpp" +#include +#include +#include +#include +#include + +rfid_reader::rfid_reader() + : measurement("rfid_reader") +{ + mfrc.PCD_Init(); + stop_thread = false; + uid = 0; + thread = std::thread(&rfid_reader::loop, this); +} + +rfid_reader::~rfid_reader() +{ + using namespace std; + stop_thread = true; + thread.join(); +} + +uint32_t rfid_reader::last_id() const +{ + return uid.load(std::memory_order::memory_order_relaxed); +} + +void rfid_reader::loop() +{ + using namespace std::chrono; + + stop_thread = false; + while(!stop_thread) + { + std::this_thread::sleep_for(50ms); + measurement.start(); + if(!mfrc.PICC_IsNewCardPresent()) + { + continue; + } + if(!mfrc.PICC_ReadCardSerial()) + { + continue; + } + + + uid.store(int((unsigned char)(mfrc.uid.uidByte[0]) << 24 | + (unsigned char)(mfrc.uid.uidByte[1]) << 16 | + (unsigned char)(mfrc.uid.uidByte[2]) << 8 | + (unsigned char)(mfrc.uid.uidByte[3])), std::memory_order::memory_order_relaxed); + +#ifndef NDEBUG + printf("\n"); + std::time_t result = std::time(nullptr); + std::cout << std::asctime(std::localtime(&result)); + printf("%X\n", last_id()); +#endif + measurement.stop(); + } +} diff --git a/kawaii/rfid_reader.hpp b/kawaii/rfid_reader.hpp new file mode 100644 index 0000000..6e56434 --- /dev/null +++ b/kawaii/rfid_reader.hpp @@ -0,0 +1,31 @@ +#ifndef RFIDREADER_HPP_ +#define RFIDREADER_HPP_ + +#include +#include +#include +#include + +#include "measure.hpp" +#include "MFRC522.h" + +class rfid_reader +{ +public: + uint32_t last_id() const; + rfid_reader(); + rfid_reader(const rfid_reader &) = delete; + rfid_reader(const rfid_reader &&) = delete; + ~rfid_reader(); + void loop(); +private: + MFRC522 mfrc; + std::atomic uid; + std::thread thread; + bool stop_thread; + measure measurement; +}; + + + +#endif diff --git a/kawaii/test.cpp b/kawaii/test.cpp new file mode 100644 index 0000000..df3074e --- /dev/null +++ b/kawaii/test.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +#include "engine.hpp" +#include "ultrasound_sensor.hpp" + +using namespace std; + +enum class drive_mode +{ + LEFT, + RIGHT, + FIND_TURN, +}; + +int main() +{ + engine right( + gpio(13, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(20, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + engine left( + gpio(19, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON), + gpio(26, gpio::pin_direction::OUTPUT, gpio::pin_type::LOW_ON) + ); + gpio bwright(2, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bw1(3, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bw2(4, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + gpio bwleft(17, gpio::pin_direction::INPUT, gpio::pin_type::HIGH_ON); + + ultrasound_sensor ultrasound(23, 24); + + left.set_speed(-50); + right.set_speed(-50); + while (ultrasound.get_value() > 200000) + { + cout << ultrasound.get_value() << endl; + this_thread::sleep_for(500ms); + } + left.set_speed(0); + right.set_speed(0); + +/* auto stop_time = chrono::high_resolution_clock::now() + 1min; + drive_mode mode = drive_mode::LEFT; + right.set_speed(50); + left.set_speed(10); + while (stop_time > chrono::high_resolution_clock::now()) + { + int found_corners = bwright.get_value() + bwleft.get_value() + bw1.get_value() + bw2.get_value(); + if (mode == drive_mode::FIND_TURN) + { + if (!bwright.get_value()) + { + right.set_speed(100); + left.set_speed(0); + mode = drive_mode::LEFT; + } + else if (!bwleft.get_value()) + { + right.set_speed(0); + left.set_speed(100); + mode = drive_mode::RIGHT; + } + } + else if (found_corners >= 3 || (bwright.get_value() && bwleft.get_value())) + { + left.set_speed(100); + right.set_speed(100); + mode = drive_mode::FIND_TURN; + } + else if (mode == drive_mode::LEFT) + { + if (bwright.get_value()) + { + left.set_speed(100); + right.set_speed(0); + mode = drive_mode::RIGHT; + } + } + else if (mode == drive_mode::RIGHT) + { + if (bwleft.get_value()) + { + left.set_speed(0); + right.set_speed(100); + mode = drive_mode::LEFT; + } + } + this_thread::sleep_for(1ms); + } + right.set_speed(0); + left.set_speed(0); +*/ + return 0; +} diff --git a/kawaii/ultrasound_sensor.cpp b/kawaii/ultrasound_sensor.cpp new file mode 100644 index 0000000..f704e26 --- /dev/null +++ b/kawaii/ultrasound_sensor.cpp @@ -0,0 +1,25 @@ +#include "ultrasound_sensor.hpp" + +#include + +extern "C" { + void *ultrasonic_init(uint8_t trigger, uint8_t echo, uint8_t temperature); + void ultrasonic_clean(void *ultrasonic); + uint32_t ultrasonic_get_distance(void *ultrasonic); +} + +ultrasound_sensor::ultrasound_sensor(uint8_t trigger, uint8_t echo, uint8_t temprature) +{ + ultrasonic = ultrasonic_init(trigger, echo, temprature); +} + +ultrasound_sensor::~ultrasound_sensor() +{ + ultrasonic_clean(ultrasonic); + ultrasonic = NULL; +} + +uint32_t ultrasound_sensor::get_value() const +{ + return ultrasonic_get_distance(ultrasonic); +} \ No newline at end of file diff --git a/kawaii/ultrasound_sensor.hpp b/kawaii/ultrasound_sensor.hpp new file mode 100644 index 0000000..aa0871e --- /dev/null +++ b/kawaii/ultrasound_sensor.hpp @@ -0,0 +1,19 @@ +#ifndef ULTRASOUND_SENSOR_HPP_ +#define ULTRASOUND_SENSOR_HPP_ + +#include + +class ultrasound_sensor +{ +private: + void *ultrasonic; +public: + ultrasound_sensor(uint8_t trigger, uint8_t echo, uint8_t temprature = 20); + ultrasound_sensor(const ultrasound_sensor &) = delete; + ultrasound_sensor(ultrasound_sensor &&) = delete; + uint32_t get_value() const; + ~ultrasound_sensor(); +}; + + +#endif diff --git a/realzeitnachweis.pdf b/realzeitnachweis.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df5017bc20a1e419b13c7f8c770edf7f3fc91b17 GIT binary patch literal 329609 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�>oZSw*Vly*Q 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 O!qSvWRn^tsjSB$mRgW0} literal 0 HcmV?d00001