Skip to content

Commit 25dc2f1

Browse files
committed
correcting encoding for unsigned values
1 parent f1d0032 commit 25dc2f1

File tree

4 files changed

+167
-79
lines changed

4 files changed

+167
-79
lines changed

src/dds.net-connector-cpp.app/test-app.cpp

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,21 @@ using namespace dds::net::connector;
1111

1212

1313
void wait_for_exit_key();
14-
void circle_values_consumer(std::string& variableName, double variableValue);
14+
15+
void circle_values_consumer(string& variableName, double variableValue);
16+
17+
string test_string_producer(string& variableName);
18+
bool test_boolean_producer(string& variableName);
19+
char test_byte_producer(string& variableName);
20+
short test_word_producer(string& variableName);
21+
long test_dword_producer(string& variableName);
22+
long long test_qword_producer(string& variableName);
23+
unsigned char test_unsigned_byte_producer(string& variableName);
24+
unsigned short test_unsigned_word_producer(string& variableName);
25+
unsigned long test_unsigned_dword_producer(string& variableName);
26+
unsigned long long test_unsigned_qword_producer(string& variableName);
27+
float test_single_producer(string& variableName);
28+
double test_double_producer(string& variableName);
1529

1630

1731
int main()
@@ -34,6 +48,19 @@ int main()
3448
connector.registerDoubleConsumer("Circle-X", circle_values_consumer, ON_CHANGE);
3549
connector.registerDoubleConsumer("Circle-Y", circle_values_consumer, ON_CHANGE);
3650

51+
connector.registerStringProvider("Test-String", test_string_producer, ON_CHANGE);
52+
connector.registerBooleanProvider("Test-Boolean", test_boolean_producer, ON_CHANGE);
53+
connector.registerByteProvider("Test-Byte", test_byte_producer, ON_CHANGE);
54+
connector.registerWordProvider("Test-Word", test_word_producer, ON_CHANGE);
55+
connector.registerDWordProvider("Test-DWord", test_dword_producer, ON_CHANGE);
56+
connector.registerQWordProvider("Test-QWord", test_qword_producer, ON_CHANGE);
57+
connector.registerUnsignedByteProvider("Test-UnsignedByte", test_unsigned_byte_producer, ON_CHANGE);
58+
connector.registerUnsignedWordProvider("Test-UnsignedWord", test_unsigned_word_producer, ON_CHANGE);
59+
connector.registerUnsignedDWordProvider("Test-UnsignedDWord", test_unsigned_dword_producer, ON_CHANGE);
60+
connector.registerUnsignedQWordProvider("Test-UnsignedQWord", test_unsigned_qword_producer, ON_CHANGE);
61+
connector.registerSingleProvider("Test-Single", test_single_producer, ON_CHANGE);
62+
connector.registerDoubleProvider("Test-Double", test_double_producer, ON_CHANGE);
63+
3764
connector.start();
3865

3966
wait_for_exit_key();
@@ -49,16 +76,18 @@ int main()
4976
}
5077

5178

79+
5280
void wait_for_exit_key()
5381
{
5482
char ch;
5583
while ((ch = getc(stdin)) != 'C');
5684
}
5785

5886

87+
5988
static double x, y;
6089

61-
void circle_values_consumer(std::string& variableName, double variableValue)
90+
void circle_values_consumer(string& variableName, double variableValue)
6291
{
6392
if (variableName == "Circle-X")
6493
{
@@ -72,3 +101,71 @@ void circle_values_consumer(std::string& variableName, double variableValue)
72101
}
73102
}
74103

104+
105+
106+
bool test_boolean = false;
107+
double test_value = -100.5;
108+
109+
string test_string_producer(string& variableName)
110+
{
111+
string s = "Test Value = ";
112+
s += to_string(test_value);
113+
return s;
114+
}
115+
bool test_boolean_producer(string& variableName)
116+
{
117+
test_boolean != test_boolean;
118+
return test_boolean;
119+
}
120+
char test_byte_producer(string& variableName)
121+
{
122+
return (char)test_value;
123+
}
124+
short test_word_producer(string& variableName)
125+
{
126+
return (short)test_value;
127+
}
128+
long test_dword_producer(string& variableName)
129+
{
130+
return (long)test_value;
131+
}
132+
long long test_qword_producer(string& variableName)
133+
{
134+
return (long long)test_value;
135+
}
136+
unsigned char test_unsigned_byte_producer(string& variableName)
137+
{
138+
return (unsigned char)test_value;
139+
}
140+
unsigned short test_unsigned_word_producer(string& variableName)
141+
{
142+
return (unsigned short)test_value;
143+
}
144+
unsigned long test_unsigned_dword_producer(string& variableName)
145+
{
146+
return (unsigned long)test_value;
147+
}
148+
unsigned long long test_unsigned_qword_producer(string& variableName)
149+
{
150+
return (unsigned long long)test_value;
151+
}
152+
float test_single_producer(string& variableName)
153+
{
154+
return (float)test_value;
155+
}
156+
double test_double_producer(string& variableName)
157+
{
158+
if (test_value <= -100.0)
159+
{
160+
test_value = 100.5;
161+
}
162+
else
163+
{
164+
test_value = -100.5;
165+
}
166+
167+
return test_value;
168+
}
169+
170+
171+

src/dds.net-connector-cpp.lib/connector/src/internal/src/packet_preprocessor.cpp

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,16 @@ void
7171
}
7272

7373
//-
74-
//- Compacting the buffer
74+
//- Compacting the data
7575
//-
76-
if (bufferNextWriteIndex != bufferStartIndex)
76+
if (bufferStartIndex > 0)
7777
{
78-
int timesShifted = 0;
79-
8078
for (int i = 0; i < (bufferNextWriteIndex - bufferStartIndex); i++)
8179
{
8280
buffer[i] = buffer[bufferStartIndex + i];
83-
timesShifted++;
8481
}
8582

86-
bufferStartIndex = 0;
87-
bufferNextWriteIndex -= timesShifted;
88-
}
89-
else
90-
{
91-
bufferNextWriteIndex = 0;
83+
bufferNextWriteIndex -= bufferStartIndex;
9284
bufferStartIndex = 0;
9385
}
9486

@@ -156,38 +148,39 @@ BufferAddress
156148
//-
157149
if (previousData != nullptr)
158150
{
159-
BufferAddress buffer = previousData;
160-
int bufferStartIndex = previousDataStartIndex;
161-
int bufferNextWriteIndex = previousNextWriteIndex;
151+
BufferAddress data = previousData;
152+
int dataStartIndex = previousDataStartIndex;
153+
int dataEndIndex = previousNextWriteIndex;
162154

163155
//-
164156
//- Do we have full header?
165157
//-
166158

167-
int index = bufferStartIndex;
159+
int index = dataStartIndex;
168160

169-
while (index < (bufferNextWriteIndex - 1))
161+
while (index < (dataEndIndex - 1))
170162
{
171163
// Finding '##'
172164

173-
if (buffer[index] == '#' &&
174-
buffer[index + 1] == '#')
165+
if (data[index] == '#' &&
166+
data[index + 1] == '#')
175167
{
176-
bufferStartIndex = index;
177-
int readableBytes = bufferNextWriteIndex - index;
168+
dataStartIndex = index;
169+
170+
int readableBytes = dataEndIndex - index;
178171

179172
if (readableBytes >= EncDecHeader::MESSAGE_HEADER_SIZE_ON_BUFFER)
180173
{
181-
int dataBytes = EncDecHeader::readTotalBytesInMessage(buffer, index);
182-
int availableBytes = bufferNextWriteIndex - index;
174+
int dataBytes = EncDecHeader::readTotalBytesInMessage(data, index);
175+
int availableBytes = dataEndIndex - index;
183176

184177
if (availableBytes >= dataBytes)
185178
{
186179
BufferAddress packet = bufferManager->getBufferWithClosestSize(dataBytes);
187180

188181
for (int i = 0; i < dataBytes; i++)
189182
{
190-
packet[i] = buffer[index++];
183+
packet[i] = data[index++];
191184
}
192185

193186
previousDataStartIndex = index;
@@ -205,8 +198,6 @@ BufferAddress
205198
index++;
206199
}
207200

208-
previousDataStartIndex = bufferStartIndex;
209-
210201
dataLock.unlock();
211202

212203
size = 0;

src/dds.net-connector-cpp.lib/connector/src/internal/src/variables/enc_dec_header.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ int
2828
{
2929
offset += 2;
3030

31-
int v = buffer[offset++];
32-
v = (v << 8) | buffer[offset++];
33-
v = (v << 8) | buffer[offset++];
34-
v = (v << 8) | buffer[offset++];
31+
int v = (unsigned char)buffer[offset++];
32+
v = (v << 8) | (unsigned char)buffer[offset++];
33+
v = (v << 8) | (unsigned char)buffer[offset++];
34+
v = (v << 8) | (unsigned char)buffer[offset++];
3535

3636
return v;
3737
}
@@ -85,8 +85,8 @@ int
8585
dds::net::connector::_internal::variables::
8686
EncDecHeader::readVariableId(BufferAddress buffer, int& offset)
8787
{
88-
int value = buffer[offset++];
89-
value = (value << 8) | buffer[offset++];
88+
int value = (unsigned char)buffer[offset++];
89+
value = (value << 8) | (unsigned char)buffer[offset++];
9090

9191
return value;
9292
}
@@ -107,8 +107,8 @@ VariableType
107107
dds::net::connector::_internal::variables::
108108
EncDecHeader::readVariableType(BufferAddress buffer, int& offset)
109109
{
110-
int v = buffer[offset++];
111-
v = (v << 8) | buffer[offset++];
110+
int v = (unsigned char)buffer[offset++];
111+
v = (v << 8) | (unsigned char)buffer[offset++];
112112

113113
if (v >= 0 && v < VARIABLE_TYPE_UNKNOWN)
114114
{
@@ -131,7 +131,7 @@ Periodicity
131131
dds::net::connector::_internal::variables::
132132
EncDecHeader::readPeriodicity(BufferAddress buffer, int& offset)
133133
{
134-
int v = buffer[offset++];
134+
int v = (unsigned char)buffer[offset++];
135135

136136
if (v >= 0 && v <= LOWEST)
137137
{

0 commit comments

Comments
 (0)