Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
33151652
Commit
33151652
authored
Dec 14, 2010
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
UDP: "причесал код" UDPReceiver-а...
parent
d431ed77
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
57 additions
and
38 deletions
+57
-38
UDPReceiver.cc
extensions/UDPExchange/UDPReceiver.cc
+38
-22
UDPReceiver.h
extensions/UDPExchange/UDPReceiver.h
+19
-16
No files found.
extensions/UDPExchange/UDPReceiver.cc
View file @
33151652
...
...
@@ -69,9 +69,11 @@ activated(false)
thr
=
new
ThreadCreator
<
UDPReceiver
>
(
this
,
&
UDPReceiver
::
poll
);
recvTimeout
=
conf
->
getArgPInt
(
"--udp-recv-timeout"
,
it
.
getProp
(
"recvTimeout"
),
5000
);
polltime
=
conf
->
getArgPInt
(
"--udp-polltime"
,
it
.
getProp
(
"polltime"
),
100
);
ptUpdate
.
setTiming
(
100
);
polltime
=
conf
->
getArgPInt
(
"--udp-polltime"
,
it
.
getProp
(
"polltime"
),
10
);
updatetime
=
conf
->
getArgPInt
(
"--udp-updatetime"
,
it
.
getProp
(
"updatetime"
),
100
);
steptime
=
conf
->
getArgPInt
(
"--udp-steptime"
,
it
.
getProp
(
"steptime"
),
100
);
minBufSize
=
conf
->
getArgPInt
(
"--udp-minbufsize"
,
it
.
getProp
(
"minBufSize"
),
30
);
maxProcessingCount
=
conf
->
getArgPInt
(
"--udp-maxprocessingcount"
,
it
.
getProp
(
"maxProcessingCount"
),
100
);
// -------------------------------
// ********** HEARTBEAT *************
...
...
@@ -144,8 +146,13 @@ void UDPReceiver::waitSMReady()
// -----------------------------------------------------------------------------
void
UDPReceiver
::
timerInfo
(
TimerMessage
*
tm
)
{
if
(
tm
->
id
==
tmExchange
)
if
(
!
activated
)
return
;
if
(
tm
->
id
==
tmStep
)
step
();
else
if
(
tm
->
id
==
tmUpdate
)
update
();
}
// -----------------------------------------------------------------------------
void
UDPReceiver
::
step
()
...
...
@@ -153,12 +160,6 @@ void UDPReceiver::step()
if
(
!
activated
)
return
;
// if( ptUpdate.checkTime() )
// {
update_data
();
ptUpdate
.
reset
();
// }
if
(
sidHeartBeat
!=
DefaultObjectId
&&
ptHeartBeat
.
checkTime
()
)
{
try
...
...
@@ -168,29 +169,26 @@ void UDPReceiver::step()
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (hb) "
<<
ex
<<
std
::
endl
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (hb) "
<<
ex
<<
std
::
endl
;
}
}
}
// -----------------------------------------------------------------------------
void
UDPReceiver
::
update
_data
()
void
UDPReceiver
::
update
()
{
if
(
!
activated
)
return
;
UniSetUDP
::
UDPMessage
p
;
bool
buf_ok
=
false
;
{
uniset_mutex_lock
l
(
packMutex
);
if
(
qpack
.
size
()
<=
m
ax_buf_s
ize
)
if
(
qpack
.
size
()
<=
m
inBufS
ize
)
return
;
buf_ok
=
true
;
}
while
(
buf_ok
)
int
k
=
maxProcessingCount
;
while
(
buf_ok
&&
k
>
0
)
{
{
uniset_mutex_lock
l
(
packMutex
);
...
...
@@ -200,18 +198,35 @@ void UDPReceiver::update_data()
if
(
labs
(
p
.
msg
.
header
.
num
-
pnum
)
>
1
)
{
cerr
<<
"************ FAILED! ORDER PACKETS! recv.num="
<<
pack
.
msg
.
header
.
num
dlog
[
Debug
::
CRIT
]
<<
"************ FAILED! ORDER PACKETS! recv.num="
<<
pack
.
msg
.
header
.
num
<<
" num="
<<
pnum
<<
endl
;
}
pnum
=
p
.
msg
.
header
.
num
;
k
--
;
{
uniset_mutex_lock
l
(
packMutex
);
buf_ok
=
(
qpack
.
size
()
>
m
ax_buf_s
ize
);
buf_ok
=
(
qpack
.
size
()
>
m
inBufS
ize
);
}
cerr
<<
myname
<<
"(step): recv DATA OK. header: "
<<
p
.
msg
.
header
<<
endl
;
// cerr << myname << "(step): recv DATA OK. header: " << p.msg.header << endl;
for
(
int
i
=
0
;
i
<
p
.
msg
.
header
.
dcount
;
i
++
)
{
try
{
UniSetUDP
::
UDPData
&
d
=
p
.
msg
.
dat
[
i
];
shm
->
setValue
(
d
.
id
,
d
.
val
);
}
catch
(
UniSetTypes
::
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(update): "
<<
ex
<<
std
::
endl
;
}
catch
(...)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(update): catch ..."
<<
std
::
endl
;
}
}
}
}
...
...
@@ -360,7 +375,8 @@ void UDPReceiver::sysCommand( UniSetTypes::SystemMessage *sm )
askSensors
(
UniversalIO
::
UIONotify
);
}
thr
->
start
();
askTimer
(
tmExchange
,
1000
);
askTimer
(
tmUpdate
,
updatetime
);
askTimer
(
tmStep
,
steptime
);
}
case
SystemMessage
:
:
FoldUp
:
...
...
extensions/UDPExchange/UDPReceiver.h
View file @
33151652
...
...
@@ -3,7 +3,6 @@
// -----------------------------------------------------------------------------
#include <ostream>
#include <string>
#include <map>
#include <queue>
#include <cc++/socket.h>
#include "UniSetObject_LT.h"
...
...
@@ -37,8 +36,8 @@ class UDPReceiver:
void
poll
();
void
recv
();
v
irtual
v
oid
step
();
void
update
_data
();
void
step
();
void
update
();
virtual
void
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
);
void
sysCommand
(
UniSetTypes
::
SystemMessage
*
msg
);
...
...
@@ -56,7 +55,8 @@ class UDPReceiver:
enum
Timer
{
tmExchange
tmUpdate
,
tmStep
};
private
:
...
...
@@ -70,7 +70,9 @@ class UDPReceiver:
IOController
::
AIOStateList
::
iterator
aitHeartBeat
;
UniSetTypes
::
ObjectId
test_id
;
int
polltime
;
/*!< переодичность обновления данных, [мсек] */
int
polltime
;
/*!< пауза меджду приёмами пакетов, [мсек] */
int
updatetime
;
/*!< переодичность обновления данных в SM, [мсек] */
int
steptime
;
/*!< периодичность вызова step, [мсек] */
ost
::
UDPDuplex
*
udp
;
ost
::
IPV4Host
host
;
...
...
@@ -83,15 +85,8 @@ class UDPReceiver:
bool
activated
;
int
activateTimeout
;
long
pnum
;
ThreadCreator
<
UDPReceiver
>*
thr
;
// typedef std::map<unsigned long,UniSetUDP::UDPMessage> QueuePacket;
// QueuePacket qpack;
UniSetUDP
::
UDPMessage
pack
;
UniSetTypes
::
uniset_mutex
packMutex
;
// функция определения приоритетного сообщения для обработки
struct
PacketCompare
:
public
std
::
binary_function
<
UniSetUDP
::
UDPMessage
,
UniSetUDP
::
UDPMessage
,
bool
>
...
...
@@ -100,10 +95,18 @@ class UDPReceiver:
const
UniSetUDP
::
UDPMessage
&
rhs
)
const
;
};
typedef
std
::
priority_queue
<
UniSetUDP
::
UDPMessage
,
std
::
vector
<
UniSetUDP
::
UDPMessage
>
,
PacketCompare
>
PacketQueue
;
PacketQueue
qpack
;
static
const
int
max_buf_size
=
20
;
PassiveTimer
ptUpdate
;
PacketQueue
qpack
;
/*!< очередь принятых пакетов (отсортированных по возрастанию номера пакета) */
UniSetUDP
::
UDPMessage
pack
;
/*!< прсто буфер для получения очерещного сообщения */
UniSetTypes
::
uniset_mutex
packMutex
;
/*!< mutex для работы с очередью */
long
pnum
;
/*!< текущий номер обработанного сообщения, для проверки непрерывности последовательности пакетов */
/*! Минимальный размер очереди.
* Предназначен для создания буфера, чтобы обработка сообщений шла
* в порядке возрастания номеров пакетов. Даже если при приёме последовательность нарушалась
*/
int
minBufSize
;
int
maxProcessingCount
;
/*! максимальное число обрабатываемых за один раз сообщений */
};
// -----------------------------------------------------------------------------
#endif // UDPReceiver_H_
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment