Commanders
Arduino buttons/bus library
I2CCommander.cpp
1 /*************************************************************
2 project: <Commanders>
3 author: <Thierry PARIS>
4 description: <I2C Commander>
5 *************************************************************/
6 
7 #include <Commanders.h>
8 
9 #ifdef NO_I2CCOMMANDER
10 #pragma message ("Commanders : No I2C commander !")
11 #else
12 I2CCommanderClass *I2CCommanderClass::pI2cCommander;
13 
14 #define I2C_BUFFERLENGTH (sizeof(unsigned long) + 1 + sizeof(int) + 5)
15 
16 // Just here and not in the class, because this value must be updated by a 'C' style function, and should be declared public in the class....
17 static unsigned long I2CLastEventId;
18 
19 void OnReceiveHandler(int inNbBytes)
20 {
21  I2CLastEventId = UNDEFINED_ID;
22 
23  unsigned char buf[I2C_BUFFERLENGTH];
24  uint8_t count = 0;
25 
26  while (Wire.available() && count < I2C_BUFFERLENGTH)
27  buf[count++] = Wire.read();
28 
29 #ifdef COMMANDERS_DEBUG_MODE
30  Serial.print(F("I2CCommander::ReceiveHandler: chars read : "));
31  Serial.println(count, DEC);
32 #endif
33 
34  long four = buf[0];
35  long three = buf[1];
36  long two = buf[2];
37  long one = buf[3];
38 
39  //Rebuild the recomposed long by using bit-shift.
40  unsigned long foundID = ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
41 
42  COMMANDERS_EVENT_TYPE lastEventType = (COMMANDERS_EVENT_TYPE)buf[4];
43 
44  int foundData = buf[6];
45  foundData = foundData << 8;
46  foundData |= buf[5];
47 
48  Commanders::RaiseEvent(foundID, lastEventType, foundData);
49 
50  Commanders::SetLastEventType(lastEventType);
52  I2CLastEventId = foundID;
53 }
54 
55 void I2CCommanderClass::begin(uint8_t inSlaveID)
56 {
57  Wire.begin(inSlaveID);
58  Wire.onReceive(OnReceiveHandler);
59  this->I2CSlaveId = inSlaveID;
60  I2CLastEventId = UNDEFINED_ID;
61 }
62 
63 unsigned long I2CCommanderClass::loop()
64 {
65  if (I2CLastEventId != UNDEFINED_ID)
66  {
67  unsigned long id = I2CLastEventId;
68  I2CLastEventId = UNDEFINED_ID;
69  return id;
70  }
71 
72  return UNDEFINED_ID;
73 }
74 
75 #ifdef COMMANDERS_PRINT_COMMANDERS
77 {
78  Serial.print(F("Commander: I2CCommander - slave ID: "));
79  Serial.println(this->I2CSlaveId);
80 }
81 #endif
82 
83 #endif
84 
85 
void begin(uint8_t inI2CSlaveID)
static void SetLastEventData(int inData)
Definition: Commanders.hpp:93
static void SetLastEventType(COMMANDERS_EVENT_TYPE inEvent)
Definition: Commanders.hpp:89
COMMANDERS_EVENT_TYPE
Definition: Events.h:25
unsigned long loop()
static unsigned long RaiseEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEvent = COMMANDERS_EVENT_MOVEPOSITIONID, int inData = 0)
Definition: Commanders.cpp:27
#define UNDEFINED_ID
Definition: Events.h:38