// Copyright 2011 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // ----------------------------------------------------------------------------- // // Important: All buffer sizes are expected to be less than 256! (fit in 8 // bits), and must be powers of 2. #ifndef AVRLIBX_AVRLIBX_H_ #define AVRLIBX_AVRLIBX_H_ #include #ifndef NULL #define NULL 0 #endif #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) template inline void StaticAssertImplementation() { char static_assert_size_mismatch[b] = { 0 }; } #define STATIC_ASSERT(expression) StaticAssertImplementation<(expression)>() typedef union { uint16_t value; uint8_t bytes[2]; } Word; typedef union { uint32_t value; uint16_t words[2]; uint8_t bytes[4]; } LongWord; struct uint24_t { uint16_t integral; uint8_t fractional; }; struct uint24c_t { uint8_t carry; uint16_t integral; uint8_t fractional; }; template struct FourCC { static const uint32_t value = (((((d << 8) | c) << 8) | b) << 8) | a; }; namespace avrlibx { template struct DataTypeForSize { typedef uint16_t Type; }; template<> struct DataTypeForSize<1> { typedef uint8_t Type; }; template<> struct DataTypeForSize<2> { typedef uint8_t Type; }; template<> struct DataTypeForSize<3> { typedef uint8_t Type; }; template<> struct DataTypeForSize<4> { typedef uint8_t Type; }; template<> struct DataTypeForSize<5> { typedef uint8_t Type; }; template<> struct DataTypeForSize<6> { typedef uint8_t Type; }; template<> struct DataTypeForSize<7> { typedef uint8_t Type; }; template<> struct DataTypeForSize<8> { typedef uint8_t Type; }; enum DataOrder { MSB_FIRST = 0, LSB_FIRST = 1 }; enum DigitalValue { LOW = 0, HIGH = 1 }; // Some classes (SPI, shift register) have a notion of communication session - // Begin is called, several R/W are done, and then End is called to pull high // a chip select or latch line. This template ensures that any path leaving a // block of code will release the resource. template class scoped_resource { public: scoped_resource() { T::Begin(); } ~scoped_resource() { T::End(); } }; } // namespace avrlibx #endif // AVRLIBX_AVRLIBX_H_