Refactoring des données

Tout ce qui est en rapport avec le développement du master
PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

Refactoring des données

Messagepar PtitKev » 02 Janvier 2016, 19:12

Bonjour à tous,

Je voulais refaire la partie "données" qui est mal organisée.

Dans le protocole Ydle on retrouve ces constantes :

Code : Tout sélectionner

#define YDLE_DATA_STATE     1 // On - OFF (4bits)
#define YDLE_DATA_DEGREEC   2 // Degrée Celsius ** -100.35 à 100.35 (12bits)
#define YDLE_DATA_DEGREEF   3 // Degrée Fahrenheit ** -100.35 à 100.35 (12bits)
#define YDLE_DATA_PERCENT   4 // Pourcentage ** -100% à 100% (12bits)
#define YDLE_DATA_DISTANCE   5 // Distance en Cm ** 0 à 4095 (12 bits)
#define YDLE_DATA_WATT      6 // Watt ** 0 à 1048575 (20bits)
#define YDLE_DATA_HUMIDITY   7 // Pourcentage humidité ** 0 à 100% (12bits)
#define YDLE_DATA_PRESSION   8 // Pression en hpa 0 à 4095 (12bits)
#define YDLE_DATA_TENSION   9 // Tension en Volt


et utilisé de la façon suivante :

Code : Tout sélectionner

//Ajout température
y.addData(&frame, YDLE_DATA_DEGREEC, temperature);
//Ajout humidité
y.addData(&frame, YDLE_DATA_HUMIDITY, humidity);

Comme on peut le constaté il y a une multitude de doublons dans les commentaires car les types de données sont représentés pas utilité et non leur format.

Du coup quand on veut ajouter un type d'information (ex : YDLE_DATA_TENSION) il faut ajouter le type dans Ydle : c'est pas normal.

Notre protocol doit permetre de véhiculer de l'information peut importe son type.
Je souhaite donc réorganiser le stockage par types basiques (int, float, bool et pourquoi pas string).

L'idée est qu'on remplace la méthode actuelle par des méthodes qui sont présente mais pas utilisées à savoir :

Code : Tout sélectionner

void ydle::addData(Frame_t *frame, int data);
void ydle::addData(Frame_t *frame, float data);

Comme vu précédemment le type de données est important. Il faut donc le conserver mais à travers des constantes propres à chaque node :

Code : Tout sélectionner

//Ajout température
y.addData(&frame, DATA_DEGREEC, temperature);
//Ajout humidité
y.addData(&frame, DATA_HUMIDITY, humidity);
(oui, j'ai juste supprimé YDLE_ mais ça change tout :D)

Du coup une information est identifiée par 3 paramètres :
  • le type
  • le format qui permetra au master de décoder les bits
  • la valeur
Actuellement chaque type a un algo de décryptage :

Code : Tout sélectionner

// 4 bits no signed
case YDLE_DATA_STATE :
// 12 bits signed
case YDLE_DATA_DEGREEC:
case YDLE_DATA_DEGREEF :
case YDLE_DATA_PERCENT :
// 12 bits no signed
case YDLE_DATA_HUMIDITY:
case YDLE_DATA_DISTANCE:
case YDLE_DATA_PRESSION:
// 20 bits no signed
case YDLE_DATA_WATT  :

On constate que la signature est importante : en binaire, le bit de poid fort (le plus à gauche) sert à définir si la valeur est négative (1) ou positive (0) pour un int signé.
Ex:
1111 1111 = 255 en non signé
1111 1111 = -1 en signé
ce qui veut dire que la valeur max est:
0111 1111 = 127

Il faudrait peut être ajouter la signature comme paramètre ?

Du coup une data qui était identifié dans le tableau m_data par minium 2 entrées deviendrait une structure :
Actuellement:

Code : Tout sélectionner

    // 4 bits no signed
    case YDLE_DATA_STATE :
          data = (int)fdata;
          frame->taille++;
          frame->data[current_index] = type << 4;
          frame->data[current_index] += data & 0x0F;

    // 12 bits signed
    case YDLE_DATA_TENSION :
          data = (int)(fdata * 20);
          frame->taille += 2;
          frame->data[current_index] = type << 4;
          if (data < 0)
          {
              data = data * (-1);
              frame->data[current_index] ^= 0x8;
          }
          frame->data[current_index] += (data >> 8) & 0x0F;
          frame->data[current_index + 1] = data;

    // 20 bits no signed
    case YDLE_DATA_WATT  :
        data = (int)(fdata);
        frame->taille += 3;
        frame->data[current_index] = type << 4;
        frame->data[current_index] += (data >> 16) & 0x0F;
        frame->data[current_index + 1] = (data >> 8) & 0xFF;
        frame->data[current_index + 2] = data;

On pourrait donc partir sur une structure comme celle ci :

Code : Tout sélectionner

struct data
{
  uint8_t format; // 4 bits
  uint8_t type; // 4 bits
  uint8_t data[8];
} ;


Actuellement, data peut contenir jusqu'à 30 octets : je pense qu'on peut s'amuser :)

PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

Re: Refactoring des données

Messagepar PtitKev » 02 Janvier 2016, 19:19

Bon déjà pour le booléen je me paye 1 octet en plus (8 bits) juste pour avoir une data qui vaut 1 ou 0... faut réduire le nbr de format ou le nbr de variable que la node peut utiliser...

Edit: en réduisant un des deux de 1 bit on peut du coup utiliser 1 bit pour le booléen mais dans le cas des autres types valeurs ce bit peut servir pour signer la data.


Revenir vers « Master »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 0 invité

cron