Files
qad/kx_utils/kx_coeffs.h
Бычков Андрей fa98165775 pvs fix
git-svn-id: svn://db.shs.com.ru/libs@133 a8b55f48-bf90-11e4-a774-851b48703e85
2016-11-07 13:37:42 +00:00

96 lines
2.3 KiB
C++

#ifndef KX_COEFFS_H
#define KX_COEFFS_H
#include "piprotocol.h"
#define __BYTES_IN_PACKET 4000
extern PIVector<double> K;
class __KPi: public PIProtocol
{
PIOBJECT_SUBCLASS(__KPi, PIProtocol)
public:
#pragma pack (push, 1)
struct KX_K_Sync {
uchar type;
uchar addr_to;
int count;
int full_count;
int first_index;
uchar coeffs[__BYTES_IN_PACKET];
uint checksum;
};
#pragma pack (pop)
__KPi(const PIString & config, const PIString & name, bool _pult = false): PIProtocol(config, name, &from_k, 2, &(from_k.count), sizeof(from_k) - 2, &to_k, sizeof(to_k)) {
PIConfig conf(config, PIIODevice::ReadOnly);
PIConfig::Entry ce = conf.getValue(name);
to_k.type = from_k.type = ce.getValue("type", 0xA);
to_k.addr_to = ce.getValue("addr_k", 0x15);
from_k.addr_to = ce.getValue("addr_pult", 0x75);
if (_pult) piSwap<uchar>(to_k.addr_to, from_k.addr_to);
packetExtractor()->setHeader(PIByteArray(&from_k, 2));
start();
}
KX_K_Sync to_k, from_k;
private:
bool validate() {
return (from_k.checksum == checksum_i(&from_k, sizeof(from_k) - 4));
}
bool aboutSend() {
to_k.checksum = checksum_i(&to_k, sizeof(to_k) - 4);
return true;
}
};
class KX_Coefficients: public PITimer
{
PIOBJECT_SUBCLASS(KX_Coefficients, PITimer)
friend class KX_Pult;
public:
KX_Coefficients(const PIString & config, const PIString & name = "k", bool _pult = false);
~KX_Coefficients();
void readCoeffs();
void writeCoeffs();
void sendCoeffs();
void receiveCoeffs();
bool isReady() const {return !waitingCommit;}
const PIString & fileName() const {return fname;}
const PIString * fileName_ptr() const {return &fname;}
int coeffsCount() {coeffs_cnt = K.size_s(); return coeffs_cnt;}
const int * coeffsCount_ptr() const {return &coeffs_cnt;}
const PIString & formula(int index) const {return formulas[index];}
void setFormula(int index, const PIString & f) {formulas[index] = f;}
void setKFile(const PIString & f);
EVENT(sendSucceed)
EVENT(sendFailed)
EVENT(receiveSucceed)
EVENT(receiveFailed)
__KPi * k_protocol;
private:
EVENT_HANDLER1(void, received, bool, correct);
void renew();
void tick(void *, int);
__KPi::KX_K_Sync k_syns;
bool pult_, waitingCommit;
int received_cnt, coeffs_cnt;
PIString fname, config_, name_;
PIStringList formulas;
PIByteArray k_content, k_tmp;
PITimeMeasurer tm;
};
#endif // KX_COEFFS_H