#define TAILLE_MEMOIRE_I2C 256
#define TAILLE_MESSAGE_ENVOI_MAX 32
byte memoire_I2C[TAILLE_MEMOIRE_I2C];
byte memoire_I2C_index=0;

bool nouveau_message=false;

uint8_t * get_i2c_data(){
  return memoire_I2C;
}
void onRequest(){
  uint32_t taille_envoi;
  taille_envoi = min (TAILLE_MEMOIRE_I2C-memoire_I2C_index, TAILLE_MESSAGE_ENVOI_MAX);
  
  Wire.write(&memoire_I2C[memoire_I2C_index], taille_envoi);
  memoire_I2C_index += taille_envoi;
  if(memoire_I2C_index>=TAILLE_MEMOIRE_I2C){
    Serial.printf("memoire_I2C_index>=TAILLE_MEMOIRE_I2C\n");
  }
}

void onReceive(int len){
  memoire_I2C_index = Wire.read();
  while(Wire.available()){
    nouveau_message=true;
    memoire_I2C[memoire_I2C_index] = Wire.read();
    memoire_I2C_index++;
  }
  //Serial.printf("I2C reg: %d, val %d\n", memoire_I2C_index, memoire_I2C[memoire_I2C_index]);
}

void I2C_Slave_init(int addr){
  Wire.onReceive(onReceive);
  Wire.onRequest(onRequest);
  Wire.begin(addr);
}

bool I2C_Slave_nouveau_message(){
  if(nouveau_message){
    nouveau_message=false;
    return true;
  }
  return false;
}

void I2C_envoi_8bits(byte value, char adresse){
  //printf("I2C_envoi_8bits a:%d v:%d %x %b\n",adresse, value, value, value);
  memoire_I2C[adresse] = value;
}

void I2C_envoi_16bits(int16_t value, char adresse){
  memoire_I2C[adresse] = (value >> 8) & 0xFF;
  memoire_I2C[adresse+1] = value & 0xFF;
}

void I2C_envoi_32bits(int32_t value, char adresse){
  memoire_I2C[adresse] = value >> 24;
  memoire_I2C[adresse+1] = (value >> 16) & 0xFF;
  memoire_I2C[adresse+2] = (value >> 8) & 0xFF;
  memoire_I2C[adresse+3] = value & 0xFF;
}