-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunit.cpp
151 lines (129 loc) · 2.93 KB
/
unit.cpp
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
/*
* unit.cpp
* vConnect
*
* Created by Frank Nobis on 11.12.11.
* Copyright 2011 Radio-DO.de. All rights reserved.
*
*/
#include "unit.h"
#pragma mark public functions
void vito_unit::decodeBuffer(unsigned char *buffer, int bufferLen)
{
switch (m_eUnitType) {
case CycleTime:
//
decodeAsCycleTime(buffer, bufferLen);
break;
case Temperature:
//
decodeAsTemperature(buffer);
break;
case Raw:
//
decodeAsRaw(buffer, bufferLen);
break;
case Integer1:
//
decodeAsInteger(buffer, 1);
break;
case Integer2:
//
decodeAsInteger(buffer, 2);
break;
case Integer4:
//
decodeAsInteger(buffer, 4);
break;
default:
// D.h. Unknown Type
break;
}
}
#pragma mark private functions
void vito_unit::decodeAsCycleTime(unsigned char *buffer, int bufferLen)
{
// the buffer contains up to 8 bytes in pais of on/off CycleTime Units
std::stringstream *decodedClearText;
int h,m;
decodedClearText = new std::stringstream;
for (int i=0; i<bufferLen; i+=2) {
if (buffer[i] == 0xff) {
*decodedClearText << i/2+1 << ":An:-- :Aus:--" << std::endl;
} else {
h = (buffer[i] & 0xF8) >> 3;
m = (buffer[i] & 0x07) * 10;
*decodedClearText
<< i/2+1
<< ":An:"
<< std::setw(2) << std::setfill('0')
<< h << ":"
<< std::setw(2) << std::setfill('0')
<< m;
h = (buffer[i+1] & 0xF8) >> 3;
m = (buffer[i+1] & 0x07) * 10;
*decodedClearText
<< " :Aus:"
<< std::setw(2) << std::setfill('0')
<< h << ":"
<< std::setw(2) << std::setfill('0')
<< m
<< std::endl;
}
}
setValue(decodedClearText->str());
}
void vito_unit::decodeAsTemperature(unsigned char *buffer)
{
std::stringstream *decodedClearText;
float f;
decodedClearText = new std::stringstream;
f = decode2BytesWithSign(buffer[1], buffer[0]) * m_fReadMultiplier;
*decodedClearText << std::setprecision(1) << std::fixed
<< f;
setValue(decodedClearText->str());
}
int vito_unit::decode2BytesWithSign(unsigned char hByte, unsigned char lByte)
{
short int ival = 0;
ival = (hByte & 0xff) << 8;
ival += lByte;
if (ival >= 1<<15) {
ival ^= 0xffff;
ival++;
ival = -ival;
}
return ival;
}
void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen)
{
std::stringstream *decodedClearText;
decodedClearText = new std::stringstream;
*decodedClearText << "0x" << std::hex;// << std::setw(8);
// for (int i=0; i<bufferLen; i++) {
// *decodedClearText << buffer[i];
// }
*decodedClearText << buffer;
setValue(decodedClearText->str());
}
void vito_unit::decodeAsInteger(unsigned char *buffer, int bufferLen)
{
std::stringstream *decodedClearText;
decodedClearText = new std::stringstream;
int ival=0;
switch (bufferLen) {
case 1:
ival = buffer[0];
break;
case 2:
case 4:
default:
for (int i=bufferLen-1; i>0; i--) {
ival += buffer[i];
ival <<= 8;
}
ival += buffer[0];
}
*decodedClearText << ival;
setValue(decodedClearText->str());
}