/*#include <Wire.h>
#define I2C_ADDR 0x40

volatile bool i2c_newData, i2c_recStat;
uint8_t i2c_recbuf[50], i2c_recbuf_count,i2c_rectem;

void onI2CReceive() {
  if(Wire.available()>0){
    i2c_rectem=(uint8_t)Wire.read();
    
  }
  if(i2c_rectem=='M'){
    i2c_recStat=true;
    i2c_recbuf_count=0;
  }
  if(i2c_recStat == true){
    i2c_recbuf[i2c_recbuf_count]=i2c_rectem;
    i2c_recbuf_count++;
  }
  if(i2c_recbuf_count==34){
    i2c_newData = true;
  }
}

void setup() {
  SerialUSB.begin(500000);
  Wire.begin(I2C_ADDR);
  i2c_recbuf_count=0;
  i2c_newData = false;
  i2c_recStat = false;
  Wire.onReceive();
  while(!SerialUSB);
  SerialUSB.println("READY");
}

void loop() {
  if (i2c_newData) {
    noInterrupts();
    for(int i=0;i<34;i++){
      SerialUSB.print(i2c_recbuf[i],HEX);
      SerialUSB.write(' ');
    }
    SerialUSB.println();
    i2c_newData = false;
    interrupts();
  }
  delay(4);
}*/

// check first incoming data
// Start counting until last data
// Keep loop program

#include <Wire.h>
#define I2C_ADDR 0x40

volatile bool i2c_newData = false;
volatile bool i2c_recStat = false;

volatile uint8_t i2c_recbuf[34];
volatile uint8_t i2c_recbuf_count = 0;

void onI2CReceive(int howMany)
{
  if (Wire.available() == 0) return;

  uint8_t b = Wire.read();   // ONLY ONE BYTE EXPECTED

  // Start byte
  if (b == 'M')
  {
    i2c_recStat = true;
    i2c_recbuf_count = 0;
  }

  if (i2c_recStat)
  {
    if (i2c_recbuf_count < 34)
    {
      i2c_recbuf[i2c_recbuf_count++] = b;

      if (i2c_recbuf_count == 34)
      {
        i2c_newData = true;
        i2c_recStat = false;   // reset for next packet
      }
    }
  }
}

void setup()
{
  SerialUSB.begin(500000);
  Wire.begin(I2C_ADDR);
  Wire.onReceive(onI2CReceive);

  while (!SerialUSB);
  SerialUSB.println("READY");
}

void loop()
{
  if (i2c_newData)
  {
    for (int i = 0; i < 34; i++)
    {
      SerialUSB.print(i2c_recbuf[i], HEX);
      SerialUSB.write(' ');
    }
    SerialUSB.println();

    i2c_newData = false;
  }
}
