diff options
Diffstat (limited to 'Projects/Magstripe/Lib')
-rw-r--r-- | Projects/Magstripe/Lib/CircularBitBuffer.c | 226 | ||||
-rw-r--r-- | Projects/Magstripe/Lib/CircularBitBuffer.h | 190 | ||||
-rw-r--r-- | Projects/Magstripe/Lib/MagstripeHW.h | 200 |
3 files changed, 308 insertions, 308 deletions
diff --git a/Projects/Magstripe/Lib/CircularBitBuffer.c b/Projects/Magstripe/Lib/CircularBitBuffer.c index 128639413..8be527b4d 100644 --- a/Projects/Magstripe/Lib/CircularBitBuffer.c +++ b/Projects/Magstripe/Lib/CircularBitBuffer.c @@ -1,113 +1,113 @@ -/*
- LUFA Library
- Copyright (C) Dean Camera, 2010.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
-*/
-
-/** Circular bit buffer library. This will allow for individual bits
- * to be stored in packed form inside circular buffers, to reduce
- * overall RAM usage.
- */
-
-#include "CircularBitBuffer.h"
-
-/** Function to initialize or reset a bit buffer, ready for data to be stored into it. */
-void BitBuffer_Init(BitBuffer_t* const Buffer)
-{
- /* Reset the number of stored bits in the buffer */
- Buffer->Elements = 0;
-
- /* Reset the data in and out pointer structures in the buffer to the first buffer bit */
- Buffer->In.CurrentByte = Buffer->Data;
- Buffer->In.ByteMask = (1 << 0);
- Buffer->Out.CurrentByte = Buffer->Data;
- Buffer->Out.ByteMask = (1 << 0);
-}
-
-/** Function to store the given bit into the given bit buffer. */
-void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer, const bool Bit)
-{
- /* If the bit to store is true, set the next bit in the buffer */
- if (Bit)
- *Buffer->In.CurrentByte |= Buffer->In.ByteMask;
-
- /* Increment the number of stored bits in the buffer counter */
- Buffer->Elements++;
-
- /* Check if the current buffer byte is full of stored bits */
- if (Buffer->In.ByteMask == (1 << 7))
- {
- /* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */
- if (Buffer->In.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1])
- Buffer->In.CurrentByte++;
- else
- Buffer->In.CurrentByte = Buffer->Data;
-
- /* Reset the storage bit mask in the current buffer byte to the first bit */
- Buffer->In.ByteMask = (1 << 0);
- }
- else
- {
- /* Shift the current storage bit mask to the next bit in the current byte */
- Buffer->In.ByteMask <<= 1;
- }
-}
-
-/** Function to retrieve the next bit stored in the given bit buffer. */
-bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer)
-{
- /* Retrieve the value of the next bit stored in the buffer */
- bool Bit = ((*Buffer->Out.CurrentByte & Buffer->Out.ByteMask) != 0);
-
- /* Clear the buffer bit */
- *Buffer->Out.CurrentByte &= ~Buffer->Out.ByteMask;
-
- /* Decrement the number of stored bits in the buffer counter */
- Buffer->Elements--;
-
- /* Check if the current buffer byte is empty of stored bits */
- if (Buffer->Out.ByteMask == (1 << 7))
- {
- /* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */
- if (Buffer->Out.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1])
- Buffer->Out.CurrentByte++;
- else
- Buffer->Out.CurrentByte = Buffer->Data;
-
- /* Reset the retrieval bit mask in the current buffer byte to the first bit */
- Buffer->Out.ByteMask = (1 << 0);
- }
- else
- {
- /* Shift the current retrieval bit mask to the next bit in the current byte */
- Buffer->Out.ByteMask <<= 1;
- }
-
- /* Return the retrieved bit from the buffer */
- return Bit;
-}
+/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** Circular bit buffer library. This will allow for individual bits + * to be stored in packed form inside circular buffers, to reduce + * overall RAM usage. + */ + +#include "CircularBitBuffer.h" + +/** Function to initialize or reset a bit buffer, ready for data to be stored into it. */ +void BitBuffer_Init(BitBuffer_t* const Buffer) +{ + /* Reset the number of stored bits in the buffer */ + Buffer->Elements = 0; + + /* Reset the data in and out pointer structures in the buffer to the first buffer bit */ + Buffer->In.CurrentByte = Buffer->Data; + Buffer->In.ByteMask = (1 << 0); + Buffer->Out.CurrentByte = Buffer->Data; + Buffer->Out.ByteMask = (1 << 0); +} + +/** Function to store the given bit into the given bit buffer. */ +void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer, const bool Bit) +{ + /* If the bit to store is true, set the next bit in the buffer */ + if (Bit) + *Buffer->In.CurrentByte |= Buffer->In.ByteMask; + + /* Increment the number of stored bits in the buffer counter */ + Buffer->Elements++; + + /* Check if the current buffer byte is full of stored bits */ + if (Buffer->In.ByteMask == (1 << 7)) + { + /* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */ + if (Buffer->In.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1]) + Buffer->In.CurrentByte++; + else + Buffer->In.CurrentByte = Buffer->Data; + + /* Reset the storage bit mask in the current buffer byte to the first bit */ + Buffer->In.ByteMask = (1 << 0); + } + else + { + /* Shift the current storage bit mask to the next bit in the current byte */ + Buffer->In.ByteMask <<= 1; + } +} + +/** Function to retrieve the next bit stored in the given bit buffer. */ +bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer) +{ + /* Retrieve the value of the next bit stored in the buffer */ + bool Bit = ((*Buffer->Out.CurrentByte & Buffer->Out.ByteMask) != 0); + + /* Clear the buffer bit */ + *Buffer->Out.CurrentByte &= ~Buffer->Out.ByteMask; + + /* Decrement the number of stored bits in the buffer counter */ + Buffer->Elements--; + + /* Check if the current buffer byte is empty of stored bits */ + if (Buffer->Out.ByteMask == (1 << 7)) + { + /* Check if the end of the buffer has been reached, if so reset to start of buffer, otherwise advance to next bit */ + if (Buffer->Out.CurrentByte != &Buffer->Data[sizeof(Buffer->Data) - 1]) + Buffer->Out.CurrentByte++; + else + Buffer->Out.CurrentByte = Buffer->Data; + + /* Reset the retrieval bit mask in the current buffer byte to the first bit */ + Buffer->Out.ByteMask = (1 << 0); + } + else + { + /* Shift the current retrieval bit mask to the next bit in the current byte */ + Buffer->Out.ByteMask <<= 1; + } + + /* Return the retrieved bit from the buffer */ + return Bit; +} diff --git a/Projects/Magstripe/Lib/CircularBitBuffer.h b/Projects/Magstripe/Lib/CircularBitBuffer.h index 05496f62d..dff4d2e5d 100644 --- a/Projects/Magstripe/Lib/CircularBitBuffer.h +++ b/Projects/Magstripe/Lib/CircularBitBuffer.h @@ -1,95 +1,95 @@ -/*
- LUFA Library
- Copyright (C) Dean Camera, 2010.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
-*/
-
-/** \file
- *
- * Header file for CircularBitBuffer.c.
- */
-
-#ifndef _CIRCULARBITBUFFER_H_
-#define _CIRCULARBITBUFFER_H_
-
- /* Includes: */
- #include <avr/io.h>
- #include <stdbool.h>
-
- #include <LUFA/Common/Common.h>
-
- /* Macros: */
- #if (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
- defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)) || defined(__DOXYGEN__)
- /** Maximum number of bits which can be stored into a bit buffer. The memory usage is one eighth of this value per buffer. */
- #define MAX_BITS 8192
- #else
- #define MAX_BITS 1024
- #endif
-
- /* Type Defines: */
- /** Type define for a pointer to a bit in a bit buffer. */
- typedef struct
- {
- uint8_t* CurrentByte; /**< Pointer to the current byte in the buffer */
- uint8_t ByteMask; /**< Mask of the current bit in the buffer */
- } BitBufferPointer_t;
-
- /** Type define for a circular packet bit buffer. */
- typedef struct
- {
- uint8_t Data[MAX_BITS / 8]; /**< Buffer to hold the stored bits in packed form */
- uint16_t Elements; /**< Number of stored bits in the bit buffer */
-
- BitBufferPointer_t In; /**< Bit pointer to the next storage location in the buffer */
- BitBufferPointer_t Out; /**< Bit pointer to the next retrieval location in the buffer */
- } BitBuffer_t;
-
- /* Function Prototypes: */
- /** Initializes or resets a given bit buffer, ready to store new bits.
- *
- * \param[in,out] Buffer Bit buffer to initialize
- */
- void BitBuffer_Init(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Stores a bit into the next location inside a given bit buffer.
- *
- * \param[in,out] Buffer Bit buffer to store a bit into
- * \param[in] Bit Bit to store into the buffer
- */
- void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer, const bool Bit) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Retrieves a bit from the next location inside a given bit buffer.
- *
- * \param[in,out] Buffer Bit buffer to store a bit into
- *
- * \return Next bit from the buffer
- */
- bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1);
-
-#endif
+/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for CircularBitBuffer.c. + */ + +#ifndef _CIRCULARBITBUFFER_H_ +#define _CIRCULARBITBUFFER_H_ + + /* Includes: */ + #include <avr/io.h> + #include <stdbool.h> + + #include <LUFA/Common/Common.h> + + /* Macros: */ + #if (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ + defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)) || defined(__DOXYGEN__) + /** Maximum number of bits which can be stored into a bit buffer. The memory usage is one eighth of this value per buffer. */ + #define MAX_BITS 8192 + #else + #define MAX_BITS 1024 + #endif + + /* Type Defines: */ + /** Type define for a pointer to a bit in a bit buffer. */ + typedef struct + { + uint8_t* CurrentByte; /**< Pointer to the current byte in the buffer */ + uint8_t ByteMask; /**< Mask of the current bit in the buffer */ + } BitBufferPointer_t; + + /** Type define for a circular packet bit buffer. */ + typedef struct + { + uint8_t Data[MAX_BITS / 8]; /**< Buffer to hold the stored bits in packed form */ + uint16_t Elements; /**< Number of stored bits in the bit buffer */ + + BitBufferPointer_t In; /**< Bit pointer to the next storage location in the buffer */ + BitBufferPointer_t Out; /**< Bit pointer to the next retrieval location in the buffer */ + } BitBuffer_t; + + /* Function Prototypes: */ + /** Initializes or resets a given bit buffer, ready to store new bits. + * + * \param[in,out] Buffer Bit buffer to initialize + */ + void BitBuffer_Init(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1); + + /** Stores a bit into the next location inside a given bit buffer. + * + * \param[in,out] Buffer Bit buffer to store a bit into + * \param[in] Bit Bit to store into the buffer + */ + void BitBuffer_StoreNextBit(BitBuffer_t* const Buffer, const bool Bit) ATTR_NON_NULL_PTR_ARG(1); + + /** Retrieves a bit from the next location inside a given bit buffer. + * + * \param[in,out] Buffer Bit buffer to store a bit into + * + * \return Next bit from the buffer + */ + bool BitBuffer_GetNextBit(BitBuffer_t* const Buffer) ATTR_NON_NULL_PTR_ARG(1); + +#endif diff --git a/Projects/Magstripe/Lib/MagstripeHW.h b/Projects/Magstripe/Lib/MagstripeHW.h index 915144819..7afde48e8 100644 --- a/Projects/Magstripe/Lib/MagstripeHW.h +++ b/Projects/Magstripe/Lib/MagstripeHW.h @@ -1,100 +1,100 @@ -/*
- Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
-*/
-
-/*
- NOTE: The user of this include file MUST define the following macros
- prior to including the file:
-
- MAG_T1_CLOCK_PIN Pin connected to Track 1 clock wire (i.e.. PORTC1)
- MAG_T1_DATA_PIN Pin connected to Track 1 data wire (i.e.. PORTC2)
- MAG_T2_CLOCK_PIN Pin connected to Track 2 clock wire (i.e.. PORTC3)
- MAG_T2_DATA_PIN Pin connected to Track 2 data wire (i.e.. PORTC0)
- MAG_T3_CLOCK_PIN Pin connected to Track 3 clock wire (i.e.. PORTC5)
- MAG_T3_DATA_PIN Pin connected to Track 3 data wire (i.e.. PORTC6)
- MAG_CLS_PIN Pin connected to card loaded wire (i.e.. PORTC4)
- MAG_PIN PIN macro for the reader's port (i.e.. PINC)
- MAG_DDR DDR macro for the reader's port (i.e.. DDRC)
- MAG_PORT PORT macro for the reader's port (i.e.. PORTC)
-
- The example macros listed above assume that the Track 2 data wire is
- connected to pin 0 on port C, the Track 2 clock wire is connected to
- pin 3 on port C (similarly for Tracks 1 and 3), and the card loaded
- wire is connected to pin 4 on port C.
-
- If the mag-stripe reader you are using only reads one or two tracks,
- then set the clock and data pins for the tracks it doesn't read to a
- pin that is unused. For example, on the AT90USBKey, any of the pins on
- port C that do not have wires attached will be unused since they are
- not connected to any onboard devices (such as the joystick or
- temperature sensor).
-
- Connecting wires to pins on different ports (i.e.. a data wire to pin 0
- on port C and a clock wire to pin 0 on port D) is currently
- unsupported. All pins specified above must be on the same port.
-*/
-
-/** \file
- *
- * Driver header for a TTL Magnetic Card reader device (such as the Omron V3B-4K).
- */
-
-#ifndef _MAGSTRIPEHW_H_
-#define _MAGSTRIPEHW_H_
-
- /* Includes: */
- #include <avr/io.h>
-
- #include <LUFA/Common/Common.h>
-
- /* Private Interface - For use in library only: */
- /* Macros: */
- /** Mask of the track data, clock and card detection pins. */
- #define MAG_MASK (MAG_T1_DATA | MAG_T1_CLOCK | \
- MAG_T2_DATA | MAG_T2_CLOCK | \
- MAG_T3_DATA | MAG_T3_CLOCK | \
- MAG_CARDPRESENT)
-
- /* Public Interface - May be used in end-application: */
- /* Inline Functions: */
- /** Initializes the magnetic stripe card reader ports and pins so that the card reader
- * device can be controlled and read by the card reader driver. This must be called before
- * trying to read any of the card reader's status lines.
- */
- static inline void Magstripe_Init(void)
- {
- MAG_DDR &= ~MAG_MASK;
- MAG_PORT |= MAG_MASK;
- };
-
- /** Returns the status of all the magnetic card reader's outputs.
- *
- * \return A mask indicating which card lines are high or low
- */
- static inline uint8_t Magstripe_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Magstripe_GetStatus(void)
- {
- /* Mag-stripe IOs are active low and must be inverted when read */
- return ((uint8_t)~MAG_PIN & MAG_MASK);
- }
-
-#endif
+/* + Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + NOTE: The user of this include file MUST define the following macros + prior to including the file: + + MAG_T1_CLOCK_PIN Pin connected to Track 1 clock wire (i.e.. PORTC1) + MAG_T1_DATA_PIN Pin connected to Track 1 data wire (i.e.. PORTC2) + MAG_T2_CLOCK_PIN Pin connected to Track 2 clock wire (i.e.. PORTC3) + MAG_T2_DATA_PIN Pin connected to Track 2 data wire (i.e.. PORTC0) + MAG_T3_CLOCK_PIN Pin connected to Track 3 clock wire (i.e.. PORTC5) + MAG_T3_DATA_PIN Pin connected to Track 3 data wire (i.e.. PORTC6) + MAG_CLS_PIN Pin connected to card loaded wire (i.e.. PORTC4) + MAG_PIN PIN macro for the reader's port (i.e.. PINC) + MAG_DDR DDR macro for the reader's port (i.e.. DDRC) + MAG_PORT PORT macro for the reader's port (i.e.. PORTC) + + The example macros listed above assume that the Track 2 data wire is + connected to pin 0 on port C, the Track 2 clock wire is connected to + pin 3 on port C (similarly for Tracks 1 and 3), and the card loaded + wire is connected to pin 4 on port C. + + If the mag-stripe reader you are using only reads one or two tracks, + then set the clock and data pins for the tracks it doesn't read to a + pin that is unused. For example, on the AT90USBKey, any of the pins on + port C that do not have wires attached will be unused since they are + not connected to any onboard devices (such as the joystick or + temperature sensor). + + Connecting wires to pins on different ports (i.e.. a data wire to pin 0 + on port C and a clock wire to pin 0 on port D) is currently + unsupported. All pins specified above must be on the same port. +*/ + +/** \file + * + * Driver header for a TTL Magnetic Card reader device (such as the Omron V3B-4K). + */ + +#ifndef _MAGSTRIPEHW_H_ +#define _MAGSTRIPEHW_H_ + + /* Includes: */ + #include <avr/io.h> + + #include <LUFA/Common/Common.h> + + /* Private Interface - For use in library only: */ + /* Macros: */ + /** Mask of the track data, clock and card detection pins. */ + #define MAG_MASK (MAG_T1_DATA | MAG_T1_CLOCK | \ + MAG_T2_DATA | MAG_T2_CLOCK | \ + MAG_T3_DATA | MAG_T3_CLOCK | \ + MAG_CARDPRESENT) + + /* Public Interface - May be used in end-application: */ + /* Inline Functions: */ + /** Initializes the magnetic stripe card reader ports and pins so that the card reader + * device can be controlled and read by the card reader driver. This must be called before + * trying to read any of the card reader's status lines. + */ + static inline void Magstripe_Init(void) + { + MAG_DDR &= ~MAG_MASK; + MAG_PORT |= MAG_MASK; + }; + + /** Returns the status of all the magnetic card reader's outputs. + * + * \return A mask indicating which card lines are high or low + */ + static inline uint8_t Magstripe_GetStatus(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t Magstripe_GetStatus(void) + { + /* Mag-stripe IOs are active low and must be inverted when read */ + return ((uint8_t)~MAG_PIN & MAG_MASK); + } + +#endif |