package eg.ufe.codecorrecteur;

import java.util.Arrays;

/**
 * Bloc de données transmis. Composé de 3 octets censés représenter le même
 * octet. Cet octet est copié 2 fois au départ, ce qui permet à l'arrivée de
 * repérer et de corriger des erreurs de transmission.
 */
public class Bloc {
  private byte[] data = new byte[3];
  
  /**
   * Construit un bloc en dupliquant 2 fois un octet.
   * Il s'agit du codage de la donnée passée en paramètre.
   * 
   * @param donnee donnée codée par le bloc.
   */
  public Bloc(byte donnee) {
    data[0] = donnee;
    data[1] = donnee;
    data[2] = donnee;
  }

  //  public byte get(int i) {
  //    return data[i];
  //  }
  //
  //  /**
  //   * Retourne la valeur supposée être représentée par le bloc.
  //   * Version "détaillée", plus simple à trouver que getValeurDecodee().
  //   * 
  //   * @return la valeur supposée être représentée par le bloc.
  //   */
  //  public byte getValeurDecodee0() {
  //    if (data[0] == data[1]) {
  //      // on en a 2 égaux donc c'est la bonne valeur dans data[0]
  //      // on ne cherche pas à savoir s'il y a eu une erreur de transmission
  //      return data[0];
  //    } else {
  //      if (data[0] != data[2]) {
  //        if (data[1] == data[2]) {
  //          // on met cette valeur dans data[0]
  //          return data[1];
  //        } else {
  //          // 3 valeurs différentes ! On ne peut rien faire pour réparer
  //          // Pour ce 1er programme, on retourne la valeur de data[0]
  //          return data[0];
  //        }
  //      }
  //      // si data[0] == data[2], data[0] contient la bonne valeur
  //      return data[0];
  //    }
  //  }

/** * Retourne la valeur supposée être représentée par le bloc. * Pas de rapport de ce qui s'est passé pendant le décodage du bloc. * * @return la valeur du bloc décodé. */ public byte getValeurDecodee() { if (data[1] == data[2]) { // Le seul cas où on ne retourne pas data[0] return data[1]; } else { return data[0]; } } /** * Méthode utilitaire pour coder un tableau d'octets en * tableau de Bloc. * @param valeurs * @return */ public static Bloc[] coder(byte[] valeurs) { Bloc[] resultat = new Bloc[valeurs.length]; for (int i = 0; i < valeurs.length; i++) { resultat[i] = new Bloc(valeurs[i]); } return resultat; } /** * Méthode utilitaire pour décoder un tableau de blocs * en tableau d'octet. * @param valeursTransmises les blocs à décoder * @return les octets obtenus à partir des blocs */ public static byte[] decoder(Bloc[] valeursTransmises) { byte[] resultat = new byte[valeursTransmises.length]; for (int i = 0; i < valeursTransmises.length; i++) { resultat[i] = valeursTransmises[i].getValeurDecodee(); } return resultat; } /** * Simule une erreur de transmission du bloc. * @param i numéro de l'exemplaire de l'octet modifié. * @param valeur valeur modifiée */ public void simulationErreurTransmission(int i, byte valeur) { data[i] = valeur; } @Override public String toString() { return "Bloc {data=" + Arrays.toString(data) + "}"; } }