Files
qad/kx_tools/kx_coeffs.cpp
Бычков Андрей 49ea507675 fix kx bugs
git-svn-id: svn://db.shs.com.ru/libs@8 a8b55f48-bf90-11e4-a774-851b48703e85
2015-04-17 14:21:03 +00:00

188 lines
5.1 KiB
C++

#include "kx_coeffs.h"
#include "kx_protocol_x.h"
double X[KX_X_COUNT];
PIVector<double> K;
KX_Coefficients::KX_Coefficients(const PIString & config, const PIString & name, bool _pult) {
setName("kx_coeffs");
PIConfig conf(config, PIIODevice::ReadOnly);
fname = conf.getValue(name).getValue("file", "k.dat");
readCoeffs();
int ns = piMaxi(conf.getValue(name).getValue("count", 0), K.size_s());
if (ns > K.size_s()) {
K.resize(ns, 0.f);
formulas.resize(ns);
writeCoeffs();
}
config_ = config;
name_ = name;
pult_ = _pult;
k_protocol = 0;
renew();
//readCoeffs();
}
KX_Coefficients::~KX_Coefficients() {
stop();
k_protocol->stop();
delete k_protocol;
}
void KX_Coefficients::readCoeffs() {
{
PIConfig conf(fname, PIIODevice::ReadOnly);
int cnt = conf.rootEntry().childCount();
K.resize(cnt);
formulas.resize(cnt);
PIString kn, cf;
for (int i = 0; i < cnt; i++) {
kn = "k" + PIString::fromNumber(i);
K[i] = (double)conf.getValue(kn, 0.f);
cf = conf.getValue(kn + ".formula", "");
if (cf.isEmpty()) cf = PIString::fromNumber(K[i]);
formulas[i] = cf;
}
}
k_content = PIFile(fname, PIIODevice::ReadOnly).readAll();
//piCout << k_content.size();
piCoutObj << "Readed" << K.size_s() << "coefficients in" << k_content.size_s() << "bytes";
coeffs_cnt = K.size_s();
}
void KX_Coefficients::writeCoeffs() {
PIFile::remove(fname);
PIFile conf(fname, PIIODevice::ReadWrite);
//conf.clear();
for (int i = 0; i < K.size_s(); i++) {
conf << "k" + PIString::fromNumber(i) << " = " << PIString::fromNumber(K[i]).replaceAll(",", ".") << "\n";
conf << "k" + PIString::fromNumber(i) << ".formula = " << formulas[i] << "\n";
}
//conf.close();
//conf.writeAll();
k_content = conf.readAll();
//piCout << k_content.size();
piCoutObj << "Written" << K.size_s() << "coefficients in" << k_content.size_s() << "bytes";
coeffs_cnt = K.size_s();
}
void KX_Coefficients::sendCoeffs() {
stop();
int curcnt, pcnt = (k_content.size_s() - 1) / __BYTES_IN_PACKET + 1;
k_protocol->to_k.full_count = k_content.size_s();
for (int i = 0; i < pcnt; i++) {
k_protocol->to_k.first_index = i * __BYTES_IN_PACKET;
if (i == pcnt - 1) curcnt = k_content.size_s() % __BYTES_IN_PACKET;
else curcnt = __BYTES_IN_PACKET;
//cout << "send " << curcnt << " coeffs\n";
k_protocol->to_k.count = curcnt;
memcpy(k_protocol->to_k.coeffs, k_content.data(k_protocol->to_k.first_index), curcnt);
//for (int j = 0; j < curcnt; j++) k_protocol->to_k.coeffs[j] = K.at(k_protocol->to_k.first_index + j);
k_protocol->send();
}
//cout << "waiting for commit ...\n";
waitingCommit = true;
tm.reset();
start(10);
}
void KX_Coefficients::receiveCoeffs() {
stop();
k_protocol->to_k.full_count = k_protocol->to_k.first_index = k_protocol->to_k.count = -6;
k_protocol->send();
//cout << "request send\n";
//cout << "waiting for receive ...\n";
waitingCommit = false;
tm.reset();
start(10);
}
void KX_Coefficients::received(bool correct) {
//cout << "kpi received " << correct << endl;
if (!correct) return;
k_syns = k_protocol->from_k;
if (waitingCommit) {
if (k_syns.first_index != -1 ||
k_syns.full_count != -1 ||
k_syns.count != -k_content.size_s()) return;
//cout << "commit received\n";
waitingCommit = false;
stop();
//cout << "send succeed\n";
//emit sendSucceed();
sendSucceed();
return;
} else {
if (k_syns.first_index == -6 && k_syns.full_count == -6 && k_syns.count == -6) {
//cout << "request received\n";
sendCoeffs();
return;
};
}
if (k_syns.first_index < 0 || k_syns.count < 0) return;
if (k_syns.first_index == 0) {
//cout << "first receive\n";
k_tmp.resize(k_syns.full_count);
received_cnt = 0;
}
//for (int i = 0; i < k_syns.count; i++) K.at(k_syns.first_index + i) = k_syns.coeffs[i];
//piCout << k_tmp.size() << k_syns.first_index << k_syns.count;
memcpy(k_tmp.data(k_syns.first_index), k_syns.coeffs, k_syns.count);
received_cnt += k_syns.count;
tm.reset();
//cout << "received " << k_syns.count << " bytes with " << k_syns.first_index << " first\n";
if (received_cnt < k_syns.full_count) return;
//cout << "finally received " << received_cnt << " bytes\n";
stop();
PIFile::remove(fname);
PIFile conf(fname, PIIODevice::ReadWrite);
conf.write(k_tmp.data(), k_tmp.size_s());
conf.close();
readCoeffs();
//writeCoeffs();
k_protocol->to_k.full_count = k_protocol->to_k.first_index = -1;
k_protocol->to_k.count = -received_cnt;
k_protocol->send();
waitingCommit = false;
//emit receiveSucceed();
receiveSucceed();
//cout << "receive succeed\n";
}
void KX_Coefficients::renew() {
if (k_protocol != 0) {
k_protocol->stop();
delete k_protocol;
}
k_protocol = new __KPi(config_, name_, pult_);
CONNECT1(void, bool, k_protocol, received, this, received)
waitingCommit = false;
}
void KX_Coefficients::tick(void * , int ) {
//piCout << "timer" << tm.elapsed_s();
if (tm.elapsed_s() < 10.) return;
if (waitingCommit) {
//cout << "commit timeout\n";
//cout << "send failed\n";
//emit sendFailed();
sendFailed();
} else {
//cout << "receive timeout\n";
//cout << "receive failed\n";
//emit receiveFailed();
receiveFailed();
}
waitingCommit = false;
stop();
}