Arduino Libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
i2c.hpp
Go to the documentation of this file.
1 // Author: Mario S. Könz <mskoenz@gmx.net>
2 // Date: 09.06.2013 19:43:04 EDT
3 // File: i2c_io.hpp
4 
5 #ifndef __I2C_IO_HEADER
6 #define __I2C_IO_HEADER
7 
8 #include "serializer.hpp"
9 #include "../ustd/static_vector.hpp"
10 
11 #include <Wire.h>
12 
13 void requestEvent();
14 void receiveEvent(int);
15 
16 namespace com {
17  class i2cout_class {
18  public:
20 
21  i2cout_class(): target_(255) {
22  }
23  template<typename T>
25  return (*this) & t;
26  }
27  template<typename T>
28  i2cout_class & operator<<(T const & t) {
29  T t2(t); //TODO: super ugly, remove asap
30  return (*this) & t2;
31  }
32  template<typename T>
34  serialize(*this, t);
35  return (*this);
36  }
38  if(target_ != 255)
39  Wire.beginTransmission(target_);
40 
41  Wire.write(data_.data(), data_.size());
42  data_.clear();
43 
44  if(target_ != 255) {
45  Wire.endTransmission(endl_.end);
46  endl_(true);
47  }
48 
49  return (*this);
50  }
51  void write(byte const & in) {
52  data_.push_back(in);
53  }
54  i2cout_class & operator()(uint8_t const & adr_) {
55  target_ = adr_;
56  return (*this);
57  }
58 
59 
60  private:
61  uint8_t target_;
63  } i2cout;
64 
65  class i2cin_class {
66  public:
68 
69  i2cin_class(): target_(255) {
70  }
71 
72  template<typename T>
74  if(target_ != 255) {
75  #ifdef __TYPE_SIZE_CHECK
76  Wire.requestFrom(target_, sizeof(T) + 1);
77  while(Wire.available() != (sizeof(T)+1)) DEBUG_MSG("FAIL: To earley");
78  #else //__TYPE_SIZE_CHECK
79  Wire.requestFrom(target_, sizeof(T));
80  while(Wire.available() != sizeof(T)) DEBUG_MSG("FAIL: To earley");
81  #endif //__TYPE_SIZE_CHECK
82  }
83  return ((*this) & t);
84  }
85  template<typename T>
87  serialize(*this, t);
88  return (*this);
89  }
90 
91  byte read() {
92  return Wire.read();
93  }
94 
95  uint8_t available() {
96  return Wire.available();
97  }
98  i2cin_class & operator()(uint8_t const & adr_) {
99  target_ = adr_;
100  return (*this);
101  }
102  private:
103  uint8_t target_;
104  } i2cin;
105 
106  void i2c_begin() {
107  Wire.begin();
108  delay(5);
109  }
110  void i2c_begin(int const & adr, void (*rec)(int) = receiveEvent, void (*req)(void) = requestEvent) {
111  Wire.begin(adr);
112  Wire.onRequest(req); // register event
113  Wire.onReceive(rec);
114  }
115 }//end namespace com
116 #endif //__I2C_IO_HEADER
void receiveEvent(int)
void serialize(Archive &ar, T &t)
Definition: serializer.hpp:95
bool end
Definition: iostream.hpp:31
void push_back(T const &in)
Definition: static_vector.hpp:40
i2cin_class()
Definition: i2c.hpp:69
i2cout_class & operator()(uint8_t const &adr_)
Definition: i2c.hpp:54
i2cin_class & operator&(T &t)
Definition: i2c.hpp:86
void requestEvent()
i2cout_class & operator<<(T &t)
Definition: i2c.hpp:24
i2cout_class & operator&(T &t)
Definition: i2c.hpp:33
class com::i2cout_class i2cout
i2cout_class()
Definition: i2c.hpp:21
Definition: i2c.hpp:65
static archive_enum const type
Definition: i2c.hpp:67
#define DEBUG_MSG(x)
Definition: ard_assert.hpp:32
archive_enum
Definition: archive_enum.hpp:14
Definition: i2c.hpp:17
i2cin_class & operator>>(T &t)
Definition: i2c.hpp:73
i2cin_class & operator()(uint8_t const &adr_)
Definition: i2c.hpp:98
void i2c_begin()
Definition: i2c.hpp:106
T * data()
Definition: static_vector.hpp:90
uint8_t available()
Definition: i2c.hpp:95
static archive_enum const type
Definition: i2c.hpp:19
byte read()
Definition: i2c.hpp:91
size_type const & size() const
Definition: static_vector.hpp:118
void write(byte const &in)
Definition: i2c.hpp:51
Definition: iostream.hpp:24
i2cout_class & operator<<(T const &t)
Definition: i2c.hpp:28
void clear()
Definition: static_vector.hpp:56
i2cout_class & operator<<(ustd::endl_class &endl_)
Definition: i2c.hpp:37
class com::i2cin_class i2cin