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)
...
@@ -69,9 +69,11 @@ activated(false)
thr
=
new
ThreadCreator
<
UDPReceiver
>
(
this
,
&
UDPReceiver
::
poll
);
thr
=
new
ThreadCreator
<
UDPReceiver
>
(
this
,
&
UDPReceiver
::
poll
);
recvTimeout
=
conf
->
getArgPInt
(
"--udp-recv-timeout"
,
it
.
getProp
(
"recvTimeout"
),
5000
);
recvTimeout
=
conf
->
getArgPInt
(
"--udp-recv-timeout"
,
it
.
getProp
(
"recvTimeout"
),
5000
);
polltime
=
conf
->
getArgPInt
(
"--udp-polltime"
,
it
.
getProp
(
"polltime"
),
100
);
polltime
=
conf
->
getArgPInt
(
"--udp-polltime"
,
it
.
getProp
(
"polltime"
),
10
);
updatetime
=
conf
->
getArgPInt
(
"--udp-updatetime"
,
it
.
getProp
(
"updatetime"
),
100
);
ptUpdate
.
setTiming
(
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 *************
// ********** HEARTBEAT *************
...
@@ -144,8 +146,13 @@ void UDPReceiver::waitSMReady()
...
@@ -144,8 +146,13 @@ void UDPReceiver::waitSMReady()
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
UDPReceiver
::
timerInfo
(
TimerMessage
*
tm
)
void
UDPReceiver
::
timerInfo
(
TimerMessage
*
tm
)
{
{
if
(
tm
->
id
==
tmExchange
)
if
(
!
activated
)
return
;
if
(
tm
->
id
==
tmStep
)
step
();
step
();
else
if
(
tm
->
id
==
tmUpdate
)
update
();
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
UDPReceiver
::
step
()
void
UDPReceiver
::
step
()
...
@@ -153,12 +160,6 @@ void UDPReceiver::step()
...
@@ -153,12 +160,6 @@ void UDPReceiver::step()
if
(
!
activated
)
if
(
!
activated
)
return
;
return
;
// if( ptUpdate.checkTime() )
// {
update_data
();
ptUpdate
.
reset
();
// }
if
(
sidHeartBeat
!=
DefaultObjectId
&&
ptHeartBeat
.
checkTime
()
)
if
(
sidHeartBeat
!=
DefaultObjectId
&&
ptHeartBeat
.
checkTime
()
)
{
{
try
try
...
@@ -168,29 +169,26 @@ void UDPReceiver::step()
...
@@ -168,29 +169,26 @@ void UDPReceiver::step()
}
}
catch
(
Exception
&
ex
)
catch
(
Exception
&
ex
)
{
{
dlog
[
Debug
::
CRIT
]
<<
myname
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (hb) "
<<
ex
<<
std
::
endl
;
<<
"(step): (hb) "
<<
ex
<<
std
::
endl
;
}
}
}
}
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
UDPReceiver
::
update
_data
()
void
UDPReceiver
::
update
()
{
{
if
(
!
activated
)
return
;
UniSetUDP
::
UDPMessage
p
;
UniSetUDP
::
UDPMessage
p
;
bool
buf_ok
=
false
;
bool
buf_ok
=
false
;
{
{
uniset_mutex_lock
l
(
packMutex
);
uniset_mutex_lock
l
(
packMutex
);
if
(
qpack
.
size
()
<=
m
ax_buf_s
ize
)
if
(
qpack
.
size
()
<=
m
inBufS
ize
)
return
;
return
;
buf_ok
=
true
;
buf_ok
=
true
;
}
}
while
(
buf_ok
)
int
k
=
maxProcessingCount
;
while
(
buf_ok
&&
k
>
0
)
{
{
{
{
uniset_mutex_lock
l
(
packMutex
);
uniset_mutex_lock
l
(
packMutex
);
...
@@ -200,18 +198,35 @@ void UDPReceiver::update_data()
...
@@ -200,18 +198,35 @@ void UDPReceiver::update_data()
if
(
labs
(
p
.
msg
.
header
.
num
-
pnum
)
>
1
)
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
;
<<
" num="
<<
pnum
<<
endl
;
}
}
pnum
=
p
.
msg
.
header
.
num
;
pnum
=
p
.
msg
.
header
.
num
;
k
--
;
{
{
uniset_mutex_lock
l
(
packMutex
);
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 )
...
@@ -360,7 +375,8 @@ void UDPReceiver::sysCommand( UniSetTypes::SystemMessage *sm )
askSensors
(
UniversalIO
::
UIONotify
);
askSensors
(
UniversalIO
::
UIONotify
);
}
}
thr
->
start
();
thr
->
start
();
askTimer
(
tmExchange
,
1000
);
askTimer
(
tmUpdate
,
updatetime
);
askTimer
(
tmStep
,
steptime
);
}
}
case
SystemMessage
:
:
FoldUp
:
case
SystemMessage
:
:
FoldUp
:
...
...
extensions/UDPExchange/UDPReceiver.h
View file @
33151652
...
@@ -3,7 +3,6 @@
...
@@ -3,7 +3,6 @@
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
#include <ostream>
#include <ostream>
#include <string>
#include <string>
#include <map>
#include <queue>
#include <queue>
#include <cc++/socket.h>
#include <cc++/socket.h>
#include "UniSetObject_LT.h"
#include "UniSetObject_LT.h"
...
@@ -37,8 +36,8 @@ class UDPReceiver:
...
@@ -37,8 +36,8 @@ class UDPReceiver:
void
poll
();
void
poll
();
void
recv
();
void
recv
();
v
irtual
v
oid
step
();
void
step
();
void
update
_data
();
void
update
();
virtual
void
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
);
virtual
void
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
);
void
sysCommand
(
UniSetTypes
::
SystemMessage
*
msg
);
void
sysCommand
(
UniSetTypes
::
SystemMessage
*
msg
);
...
@@ -56,7 +55,8 @@ class UDPReceiver:
...
@@ -56,7 +55,8 @@ class UDPReceiver:
enum
Timer
enum
Timer
{
{
tmExchange
tmUpdate
,
tmStep
};
};
private
:
private
:
...
@@ -70,7 +70,9 @@ class UDPReceiver:
...
@@ -70,7 +70,9 @@ class UDPReceiver:
IOController
::
AIOStateList
::
iterator
aitHeartBeat
;
IOController
::
AIOStateList
::
iterator
aitHeartBeat
;
UniSetTypes
::
ObjectId
test_id
;
UniSetTypes
::
ObjectId
test_id
;
int
polltime
;
/*!< переодичность обновления данных, [мсек] */
int
polltime
;
/*!< пауза меджду приёмами пакетов, [мсек] */
int
updatetime
;
/*!< переодичность обновления данных в SM, [мсек] */
int
steptime
;
/*!< периодичность вызова step, [мсек] */
ost
::
UDPDuplex
*
udp
;
ost
::
UDPDuplex
*
udp
;
ost
::
IPV4Host
host
;
ost
::
IPV4Host
host
;
...
@@ -83,15 +85,8 @@ class UDPReceiver:
...
@@ -83,15 +85,8 @@ class UDPReceiver:
bool
activated
;
bool
activated
;
int
activateTimeout
;
int
activateTimeout
;
long
pnum
;
ThreadCreator
<
UDPReceiver
>*
thr
;
ThreadCreator
<
UDPReceiver
>*
thr
;
// typedef std::map<unsigned long,UniSetUDP::UDPMessage> QueuePacket;
// QueuePacket qpack;
UniSetUDP
::
UDPMessage
pack
;
UniSetTypes
::
uniset_mutex
packMutex
;
// функция определения приоритетного сообщения для обработки
// функция определения приоритетного сообщения для обработки
struct
PacketCompare
:
struct
PacketCompare
:
public
std
::
binary_function
<
UniSetUDP
::
UDPMessage
,
UniSetUDP
::
UDPMessage
,
bool
>
public
std
::
binary_function
<
UniSetUDP
::
UDPMessage
,
UniSetUDP
::
UDPMessage
,
bool
>
...
@@ -100,10 +95,18 @@ class UDPReceiver:
...
@@ -100,10 +95,18 @@ class UDPReceiver:
const
UniSetUDP
::
UDPMessage
&
rhs
)
const
;
const
UniSetUDP
::
UDPMessage
&
rhs
)
const
;
};
};
typedef
std
::
priority_queue
<
UniSetUDP
::
UDPMessage
,
std
::
vector
<
UniSetUDP
::
UDPMessage
>
,
PacketCompare
>
PacketQueue
;
typedef
std
::
priority_queue
<
UniSetUDP
::
UDPMessage
,
std
::
vector
<
UniSetUDP
::
UDPMessage
>
,
PacketCompare
>
PacketQueue
;
PacketQueue
qpack
;
PacketQueue
qpack
;
/*!< очередь принятых пакетов (отсортированных по возрастанию номера пакета) */
static
const
int
max_buf_size
=
20
;
UniSetUDP
::
UDPMessage
pack
;
/*!< прсто буфер для получения очерещного сообщения */
UniSetTypes
::
uniset_mutex
packMutex
;
/*!< mutex для работы с очередью */
PassiveTimer
ptUpdate
;
long
pnum
;
/*!< текущий номер обработанного сообщения, для проверки непрерывности последовательности пакетов */
/*! Минимальный размер очереди.
* Предназначен для создания буфера, чтобы обработка сообщений шла
* в порядке возрастания номеров пакетов. Даже если при приёме последовательность нарушалась
*/
int
minBufSize
;
int
maxProcessingCount
;
/*! максимальное число обрабатываемых за один раз сообщений */
};
};
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
#endif // UDPReceiver_H_
#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