add pause to PIBaseTransfer
need test git-svn-id: svn://db.shs.com.ru/pip@79 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -7,7 +7,7 @@ PIBaseTransfer::PIBaseTransfer(): crc(standardCRC_16()), diag(false) {
|
|||||||
header.session_id = 0;
|
header.session_id = 0;
|
||||||
packet_header_size = sizeof(PacketHeader) + customHeader().size();
|
packet_header_size = sizeof(PacketHeader) + customHeader().size();
|
||||||
part_header_size = sizeof(Part) + sizeof(int);
|
part_header_size = sizeof(Part) + sizeof(int);
|
||||||
is_sending = is_receiving = false;
|
is_sending = is_receiving = is_pause = false;
|
||||||
break_ = true;
|
break_ = true;
|
||||||
bytes_all = bytes_cur = 0;
|
bytes_all = bytes_cur = 0;
|
||||||
replies_cnt = send_queue = 0;
|
replies_cnt = send_queue = 0;
|
||||||
@@ -41,6 +41,15 @@ void PIBaseTransfer::stopReceive() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PIBaseTransfer::setPause(bool pause_) {
|
||||||
|
if (is_pause == pause_) return;
|
||||||
|
pause_tm.reset();
|
||||||
|
is_pause = pause_;
|
||||||
|
if (pause_) paused();
|
||||||
|
else resumed();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIBaseTransfer::received(PIByteArray data) {
|
void PIBaseTransfer::received(PIByteArray data) {
|
||||||
packet_header_size = sizeof(PacketHeader) + customHeader().size();
|
packet_header_size = sizeof(PacketHeader) + customHeader().size();
|
||||||
if (data.size() < sizeof(PacketHeader)) {
|
if (data.size() < sizeof(PacketHeader)) {
|
||||||
@@ -71,11 +80,13 @@ void PIBaseTransfer::received(PIByteArray data) {
|
|||||||
} else {
|
} else {
|
||||||
processData(h.id, data);
|
processData(h.id, data);
|
||||||
}
|
}
|
||||||
|
if (is_pause) sendReply(pt_Pause);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case pt_ReplySuccess:
|
case pt_ReplySuccess:
|
||||||
case pt_ReplyInvalid:
|
case pt_ReplyInvalid:
|
||||||
if (h.session_id != header.session_id) return;
|
if (h.session_id != header.session_id) return;
|
||||||
|
if (is_pause) sendReply(pt_Pause);
|
||||||
if (pt == pt_ReplySuccess) {
|
if (pt == pt_ReplySuccess) {
|
||||||
send_queue--;
|
send_queue--;
|
||||||
if (send_queue < 0) send_queue = 0;
|
if (send_queue < 0) send_queue = 0;
|
||||||
@@ -104,7 +115,14 @@ void PIBaseTransfer::received(PIByteArray data) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case pt_Start:
|
case pt_Start:
|
||||||
if (is_sending) {
|
if (is_pause && (is_sending || is_receiving)) {
|
||||||
|
if (header.session_id == h.session_id) {
|
||||||
|
resumed();
|
||||||
|
is_pause = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_sending && header.session_id != h.session_id) {
|
||||||
sendBreak(h.session_id);
|
sendBreak(h.session_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -141,6 +159,18 @@ void PIBaseTransfer::received(PIByteArray data) {
|
|||||||
sendReply(pt_ReplySuccess);
|
sendReply(pt_ReplySuccess);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case pt_Pause:
|
||||||
|
if (header.session_id == h.session_id) {
|
||||||
|
if (!is_pause && pause_tm.elapsed_s() < timeout_) {
|
||||||
|
sendReply(pt_Start);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (is_pause && pause_tm.elapsed_s() > timeout_/10) sendReply(pt_Pause);
|
||||||
|
pause_tm.reset();
|
||||||
|
if (!is_pause) paused();
|
||||||
|
is_pause = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,9 +193,10 @@ bool PIBaseTransfer::send_process() {
|
|||||||
send_tm.reset();
|
send_tm.reset();
|
||||||
//int ltm = 0;
|
//int ltm = 0;
|
||||||
for (int i = 0; i < session.size_s(); i++) {
|
for (int i = 0; i < session.size_s(); i++) {
|
||||||
if (send_queue >= packets_count) {
|
if (send_queue >= packets_count || is_pause) {
|
||||||
--i;
|
--i;
|
||||||
piMSleep(1);
|
piMSleep(1);
|
||||||
|
if (is_pause && pause_tm.elapsed_s() > timeout())return finish_send(false);
|
||||||
if (send_tm.elapsed_s() > timeout_) return finish_send(false);
|
if (send_tm.elapsed_s() > timeout_) return finish_send(false);
|
||||||
if (stm.elapsed_s() > timeout_ / 10.)
|
if (stm.elapsed_s() > timeout_ / 10.)
|
||||||
send_queue = 0;
|
send_queue = 0;
|
||||||
@@ -189,6 +220,11 @@ bool PIBaseTransfer::send_process() {
|
|||||||
piMSleep(1);
|
piMSleep(1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (is_pause) {
|
||||||
|
piMSleep(10);
|
||||||
|
if (pause_tm.elapsed_s() > timeout())return finish_send(false);
|
||||||
|
else continue;
|
||||||
|
}
|
||||||
prev_chk = chk;
|
prev_chk = chk;
|
||||||
if (chk > 0) {
|
if (chk > 0) {
|
||||||
if (tm2.elapsed_s() > timeout_ / 10.) {
|
if (tm2.elapsed_s() > timeout_ / 10.) {
|
||||||
@@ -348,7 +384,8 @@ void PIBaseTransfer::processData(int id, PIByteArray & data) {
|
|||||||
while (!data.isEmpty()) {
|
while (!data.isEmpty()) {
|
||||||
ba.clear();
|
ba.clear();
|
||||||
data >> fi;
|
data >> fi;
|
||||||
/*if (fi.size > 0) */data >> ba;
|
//if (fi.size > 0)
|
||||||
|
data >> ba;
|
||||||
//fi.fsize = ba.size();
|
//fi.fsize = ba.size();
|
||||||
bytes_cur += fi.size;
|
bytes_cur += fi.size;
|
||||||
//piCoutObj << "recv" << fi;
|
//piCoutObj << "recv" << fi;
|
||||||
@@ -418,7 +455,7 @@ void PIBaseTransfer::finish_receive(bool ok, bool quet) {
|
|||||||
void PIBaseTransfer::diagChanged(PIDiagnostics::Quality new_quality, PIDiagnostics::Quality old_quality) {
|
void PIBaseTransfer::diagChanged(PIDiagnostics::Quality new_quality, PIDiagnostics::Quality old_quality) {
|
||||||
if (is_receiving) {
|
if (is_receiving) {
|
||||||
if (new_quality == PIDiagnostics::Failure) {
|
if (new_quality == PIDiagnostics::Failure) {
|
||||||
piCout << "disconnected!";
|
//piCout << "disconnected!";
|
||||||
stopReceive();
|
stopReceive();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ public:
|
|||||||
|
|
||||||
bool isSending() const {return is_sending;}
|
bool isSending() const {return is_sending;}
|
||||||
bool isReceiving() const {return is_receiving;}
|
bool isReceiving() const {return is_receiving;}
|
||||||
|
bool isPause() const {return is_pause;}
|
||||||
|
void setPause(bool pause_);
|
||||||
|
|
||||||
void setPacketSize(int size) {packet_size = size;}
|
void setPacketSize(int size) {packet_size = size;}
|
||||||
int packetSize() const {return packet_size;}
|
int packetSize() const {return packet_size;}
|
||||||
@@ -51,15 +53,19 @@ public:
|
|||||||
const PIDiagnostics &diagnostic() {return diag;}
|
const PIDiagnostics &diagnostic() {return diag;}
|
||||||
|
|
||||||
EVENT(receiveStarted)
|
EVENT(receiveStarted)
|
||||||
|
EVENT(paused)
|
||||||
|
EVENT(resumed)
|
||||||
EVENT1(receiveFinished, bool, ok)
|
EVENT1(receiveFinished, bool, ok)
|
||||||
EVENT(sendStarted)
|
EVENT(sendStarted)
|
||||||
EVENT1(sendFinished, bool, ok)
|
EVENT1(sendFinished, bool, ok)
|
||||||
EVENT1(sendRequest, PIByteArray &, data)
|
EVENT1(sendRequest, PIByteArray &, data)
|
||||||
EVENT_HANDLER1(void, received, PIByteArray, data);
|
EVENT_HANDLER1(void, received, PIByteArray, data);
|
||||||
|
EVENT_HANDLER(void, pause) {setPause(true);}
|
||||||
|
EVENT_HANDLER(void, resume) {setPause(false);}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint packet_header_size, part_header_size;
|
uint packet_header_size, part_header_size;
|
||||||
bool break_, is_sending, is_receiving;
|
bool break_, is_sending, is_receiving, is_pause;
|
||||||
PIString state_string;
|
PIString state_string;
|
||||||
llong bytes_all, bytes_cur;
|
llong bytes_all, bytes_cur;
|
||||||
|
|
||||||
@@ -71,7 +77,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
enum PacketType {pt_Unknown, pt_Data, pt_ReplySuccess, pt_ReplyInvalid, pt_Break, pt_Start};
|
enum PacketType {pt_Unknown, pt_Data, pt_ReplySuccess, pt_ReplyInvalid, pt_Break, pt_Start, pt_Pause};
|
||||||
|
|
||||||
# pragma pack(push,1)
|
# pragma pack(push,1)
|
||||||
struct StartRequest {
|
struct StartRequest {
|
||||||
@@ -88,7 +94,7 @@ private:
|
|||||||
double timeout_;
|
double timeout_;
|
||||||
PIVector<PIVector<Part> > session;
|
PIVector<PIVector<Part> > session;
|
||||||
PIVector<PacketType> replies;
|
PIVector<PacketType> replies;
|
||||||
PITimeMeasurer send_tm;
|
PITimeMeasurer send_tm, pause_tm;
|
||||||
PacketHeader header;
|
PacketHeader header;
|
||||||
CRC_16 crc;
|
CRC_16 crc;
|
||||||
int replies_cnt, send_queue;
|
int replies_cnt, send_queue;
|
||||||
|
|||||||
Reference in New Issue
Block a user