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.