git-svn-id: svn://db.shs.com.ru/libs@380 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2018-05-22 13:49:16 +00:00
parent d3e81d5efa
commit 7a8dd9efba
28 changed files with 1052 additions and 137 deletions

View File

@@ -64,6 +64,7 @@ CDCore::CDCore() {
/*PIString s(app_config);
connection.configureFromString(&s);
connection.start();*/
need_rebuild_x = x_pult_side = false;
k_.cd_type_ = CDType::cdK;
x_.cd_type_ = CDType::cdX;
c_.cd_type_ = CDType::cdC;
@@ -160,27 +161,44 @@ void CDCore::cd_send(CDSection * cd, CDPacketType pt, bool direct) {
void CDCore::initApp() {
init(appConfig());
init(appConfig(), false);
}
void CDCore::initPult() {
init(pultConfig());
init(pultConfig(), true);
}
void CDCore::init(const PIString & configuration) {
void CDCore::init(const PIString & configuration, bool pult) {
PIString c = configuration;
//piCoutObj << "init" << c;
connection.stop();
connection.removeAllDevices();
connection.configureFromString(&c);
connection.start();
x_pult_side = pult;
}
void CDCore::startPing() {
x_timer.start(1.0);
void CDCore::startX(double freq) {
x_timer.start(1000. / piMaxd(freq, 0.01));
}
void CDCore::sendCommand(const CDType & c) {
piCoutObj << "C_sendCommand" << c;
PIByteArray sba = makeHeader(CD_Command, 0);
sba << c.path();
sendDirect(sba);
}
void CDCore::registerCHandler(const CDType & c, PIObject * o, Handler h) {
PIString sp = pathToString(c.path());
if (sp.isEmpty() || !h) return;
piCout << "register" << sp;
c_handlers[sp] = OHPair(o, h);
}
@@ -237,6 +255,32 @@ void CDUtils::CDCore::K_DirectChange(PIDeque<int> path, PIString value) {
}
void CDCore::X_Send() {
piCoutObj << "X_Send";
cd_send(&x_, CD_XSend);
}
void CDCore::X_Request() {
piCoutObj << "X_Request";
PIByteArray sba = makeHeader(CD_XQuery, 0);
sendThreaded(sba);
}
void CDCore::C_Send() {
piCoutObj << "C_Send";
cd_send(&c_, CD_CSend);
}
void CDCore::C_Request() {
piCoutObj << "C_Request";
PIByteArray sba = makeHeader(CD_CQuery, 0);
sendThreaded(sba);
}
void CDCore::sendThread() {
if (send_data.size_s() < 4) return;
PacketHeader h;
@@ -250,17 +294,43 @@ void CDCore::sendThread() {
case CD_KQuery:
if (!ok) K_ReceiveFail();
break;
case CD_XSend:
if (ok) X_Sended();
else X_SendFail();
break;
case CD_XQuery:
if (!ok) X_ReceiveFail();
break;
case CD_CSend:
if (ok) C_Sended();
else C_SendFail();
break;
case CD_CQuery:
if (!ok) C_ReceiveFail();
break;
default: break;
}
}
void CDCore::xTimerTick() {
PacketHeader ph;
ph.type = CD_Ping;
ph.session_id = 0;
x_mutex.lock();
PIByteArray ba;
ba << ph;
if (x_pult_side) {
ba = makeHeader(CD_XRequest, 0);
if (need_rebuild_x) {
x_selected = x_.collectX();
need_rebuild_x = false;
}
ba << x_selected;
} else {
ba = makeHeader(CD_XValues, 0);
ba << x_selected;
piForeachC (PIDeque<int> & p, x_selected) {
x_[p].writeX(ba);
}
}
x_mutex.unlock();
connection.writeByName("cd", ba);
}
@@ -323,11 +393,72 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
ba >> p;
k_[p.path].setValue(p.value);
} break;
case CD_XRequest: {
x_mutex.lock();
x_selected.clear();
ba >> x_selected;
x_.setSelectedX(false);
piForeachC (PIDeque<int> & p, x_selected) {
x_[p].x_enabled = true;
}
x_mutex.unlock();
} break;
case CD_XValues: {
x_mutex.lock();
x_selected.clear();
ba >> x_selected;
piForeachC (PIDeque<int> & p, x_selected) {
x_[p].readX(ba);
}
x_mutex.unlock();
} break;
case CD_CQuery:
C_Send();
break;
case CD_CSend: {
piCoutObj << "C received";
PIByteArray c;
ba >> c;
c << uchar(0);
PIString s = PIString::fromUTF8((const char *)c.data());
PIIOString ios(&s);
cd_read(&c_, &ios);
C_Received();
} break;
case CD_Command: {
piCoutObj << "C command";
PIDeque<int> p;
ba >> p;
if (p.isEmpty()) return;
PIString sp = pathToString(p);
OHPair h = c_handlers.value(sp, OHPair(0, 0));
//piCoutObj << "found" << sp << h.first;
if (h.first && h.second) h.second(h.first);
} break;
default: break;
}
}
PIString CDCore::pathToString(const PIDeque<int> & p) {
PIString ret;
for (int i = 0; i < p.size_s(); ++i) {
if (!ret.isEmpty()) ret += ".";
ret << p[i];
}
return ret;
}
PIDeque<int> CDCore::stringToPath(const PIString & p) {
PIDeque<int> ret;
PIStringList sl = p.split(".");
piForeachC (PIString & s, sl)
ret << s.toInt();
return ret;
}
void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) {
//piCoutObj << "dataReceived" << from << data.size();
PIIODevice * d = connection.deviceByName("cd");