Help with Mensaje classes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include "Mensaje.hpp"
#include <iomanip>
#include <sstream>


//devuelve representación del mensaje indicando numero de bytes y su valor hex

std::string Mensaje::toString() const {

  std::ostringstream oss;

  oss << "[(" << size() << ") ";
 
for (unsigned i=0; i < size(); i++) {
  oss << std::setw (2) << std::setfill ('0') << std::hex
    << (int) at(i) << " ";
}
  oss << "]";

  return oss.str();
}

//Calcula el código CRC-16 de los primeros 'len' bytes

Mensaje Mensaje::crc16 (Mensaje mensaje, int len) const {
#define POLY 0xA001
  int i;
  unsigned int crc = 0xFFFF;


  for(int ba = 0; ba < len; ba++) {
    crc ^= mensaje[ba];
    for(i = 0; i < 8; i++) {
      if(crc & 0x0001) {
        crc = (crc >> 1) ^ POLY;
      } else {
        crc >>= 1;
      }
    }
  }
  Mensaje crcOrdenado;
  crcOrdenado.push_back(crc & 0xff);
  crcOrdenado.push_back(crc >> 8);
  return crcOrdenado;
}
// vector de bytes de trabajo y lo devuelve en orden correcto, sin modificarlo
Mensaje Mensaje::crc16(Mensaje mensaje) const {
 
  return crc16(mensaje, mensaje.size());
}


//indicación de que el mensaje de CRC es correcto, sin modificarlo
bool Mensaje::crcOK() const{
 
  Mensaje crcCalculado = crc16(*this);
 
  return((crcCalculado[0] == 0) and (crcCalculado[1] == 0));
 
}


//Añade el resultado del CRC al mensaje
void Mensaje::aniadeCRC() {
 
  Mensaje crcCalculado = crc16(*this);
 
  (*this).push_back(crcCalculado[0]);
  (*this).push_back(crcCalculado[1]);
 
  }
 

//leemos el doble byte situado a partir de la posición ind, sin modificarlo
uint16_t Mensaje::getWordAt(unsigned ind) const {

  uint16_t resultado = at(ind);
  resultado = resultado << 8;

  uint16_t parteBaja = at(ind + 1);

  resultado = resultado | parteBaja;

return resultado;
}

//Colocamos doble byte a partir de la posición ind

void Mensaje::setWordAt(unsigned ind, uint16_t dato) {

  uint8_t parteInferior = (dato & 0xFF);
  uint8_t parteSuperior = (dato >> 8);

  at(ind) = parteSuperior;
  at(ind + 1) = parteInferior;


}
void Mensaje::pushWord_back(uint16_t dato) {
 
  // (*this).push_back(dato);
 
  uint8_t parteInf = (dato & 0xFF);
  uint8_t parteSup = (dato  >>  8);
 
  (*this).push_back(parteSup);
  (*this).push_back(parteInf);
 
 
}

//devuelve el ID

uint8_t Mensaje::getId() const{
 
  Mensaje crcCalculado = crc16(*this);
 
  return (*this)[0];
}

//consulta la función solicitada

uint8_t Mensaje::getFuncion() const{
 
  Mensaje crcCalculado = crc16(*this);
 
  return (*this)[1];
}

//consulta el offset del registro al que accede el mensaje


uint16_t Mensaje::getOffset() const {
 
  return (*this).getWordAt(2);
 
}



//consulta el numero de posiciones a las que pretende acceder el mensaje

uint16_t Mensaje::getNumPosiciones() const {
 
  return (*this).getWordAt(4);
}

//sobrecarga del operador
/*
std::ostream& operator <<(std::ostream &os, const Mensaje& men) {


os << men.toString();

return os;


}
*/
Last edited on
This guy is an idiot.
Topic archived. No new replies allowed.