29.07.2011 - fundamental new
This commit is contained in:
149
piprotocol.h
149
piprotocol.h
@@ -4,77 +4,108 @@
|
||||
#include "piserial.h"
|
||||
#include "piethernet.h"
|
||||
#include "pitimer.h"
|
||||
#include "piconfig.h"
|
||||
#include "math.h"
|
||||
|
||||
typedef void (*ReceiveFunc)(void * );
|
||||
|
||||
class PIProtocol
|
||||
{
|
||||
enum Type {Serial, Ethernet};
|
||||
enum Type {None, Serial, Ethernet};
|
||||
enum Quality {Unknown = 1, Failure = 2, Bad = 3, Average = 4, Good = 5};
|
||||
|
||||
public:
|
||||
PIProtocol(PIString devName, int speed, void * headerPtr, int headerSize, void * dataPtr, int dataSize); // for RS
|
||||
PIProtocol(PIString ip, int port, void * dataPtr, int dataSize); // for Ethernet
|
||||
~PIProtocol();
|
||||
PIProtocol(const PIString & config, const PIString & name, void * recHeaderPtr = 0, int recHeaderSize = 0,
|
||||
void * recDataPtr = 0, int recDataSize = 0, void * sendDataPtr = 0, int sendDataSize = 0); // from config
|
||||
~PIProtocol();
|
||||
|
||||
void startReceive(float exp_frequency = -1.f); // if "frequency = -1" used last passed value
|
||||
void stopReceive();
|
||||
void setExpectedFrequency(float frequency); // for connection quality diagnostic
|
||||
void setReceiverDevice(const PIString & device, PISerial::Speed speed); // for Serial
|
||||
void setReceiverDevice(const PIString & ip, int port); // for Ethernet
|
||||
void setReceiverData(void * dataPtr, int dataSize) {this->dataPtr = (uchar * )dataPtr; this->dataSize = dataSize;}
|
||||
void setReceiverAddress(const PIString & ip, int port) {if (type_send == PIProtocol::Ethernet && eth != 0) eth->setSendAddress(ip, port);} // for Ethernet
|
||||
void setReceiverParameters(PIFlags<PISerial::Parameters> parameters) {if (type_send == PIProtocol::Serial) ser->setParameters(parameters);} // for Serial
|
||||
void setReceiveSlot(ReceiveFunc slot) {ret_func = slot;}
|
||||
|
||||
void startSend(float frequency = -1.f); // if "frequency = -1" used last passed value
|
||||
void stopSend() {sendTimer->stop();}
|
||||
void setSenderFrequency(float frequency) {send_freq = frequency;}
|
||||
void setSenderDevice(const PIString & device, PISerial::Speed speed); // for Serial
|
||||
void setSenderDevice(const PIString & ip, int port); // for Ethernet
|
||||
void setSenderData(void * dataPtr, int dataSize) {sendDataPtr = (uchar * )dataPtr; sendDataSize = dataSize;}
|
||||
void setSenderAddress(const PIString & ip, int port) {if (type_send == PIProtocol::Ethernet && eth != 0) eth->setSendAddress(ip, port);} // for Ethernet
|
||||
void setSenderParameters(PIFlags<PISerial::Parameters> parameters) {if (type_send == PIProtocol::Serial) ser->setParameters(parameters);} // for Serial
|
||||
|
||||
void send();
|
||||
void send(const void * data, int size);
|
||||
|
||||
enum Quality {Unknown = 1, Failure = 2, Bad = 3, Average = 4, Good = 5};
|
||||
|
||||
void startReceive(); // start receive
|
||||
void stopReceive(); // stop receive
|
||||
void startSend(float frequency = 20.f) {sendtimer->start(frequency > 0 ? 1000.f / frequency : 1000);} // start sending
|
||||
void stopSend() {sendtimer->stop();} // stop sending
|
||||
void setDevice(const PIString & dev_ip, int speed_port);
|
||||
void setSendData(void * dataPtr, int dataSize) {sendDataPtr = (unsigned char * )dataPtr; sendDataSize = dataSize;}
|
||||
void setReceiveData(void * dataPtr, int dataSize) {this->dataPtr = (unsigned char * )dataPtr; this->dataSize = dataSize;}
|
||||
void setSendAddress(const PIString & ip, int port) {if (type == PIProtocol::Ethernet) ether->setSendAddress(ip, port);} // for Ethernet
|
||||
void setParameters(Flags<PISerial::Parameters> parameters) {if (type == PIProtocol::Serial) serial->setParameters(parameters);} // for RS
|
||||
|
||||
void setExpectedFrequency(float frequency); // for start diagnostic connection quality
|
||||
float * immediateFrequency_ptr() {return &immediateFreq;}
|
||||
float * integralFrequency_ptr() {return &integralFreq;}
|
||||
unsigned long long int * wrongCount_ptr() {return &wrong_count;}
|
||||
unsigned long long int * receiveCount_ptr() {return &receive_count;}
|
||||
unsigned long long int * sendCount_ptr() {return &send_count;}
|
||||
PIProtocol::Quality * quality_ptr() {return &net_diag;}
|
||||
PIString * deviceState_ptr() {return &devState;}
|
||||
PIString deviceName() {return devName;}
|
||||
float immediateFrequency() {return immediateFreq;}
|
||||
float integralFrequency() {return integralFreq;}
|
||||
float * immediateFrequency_ptr() {return &immediateFreq;}
|
||||
float * integralFrequency_ptr() {return &integralFreq;}
|
||||
ullong receiveCount() {return receive_count;}
|
||||
ullong * receiveCount_ptr() {return &receive_count;}
|
||||
ullong wrongCount() {return wrong_count;}
|
||||
ullong * wrongCount_ptr() {return &wrong_count;}
|
||||
ullong sendCount() {return send_count;}
|
||||
ullong * sendCount_ptr() {return &send_count;}
|
||||
PIProtocol::Quality quality() {return net_diag;} // receive quality
|
||||
int * quality_ptr() {return (int * )&net_diag;} // receive quality pointer
|
||||
PIString receiverDeviceName() {return devReceiverName;}
|
||||
PIString senderDeviceName() {return devSenderName;}
|
||||
PIString receiverDeviceState() {return devReceiverState;}
|
||||
PIString * receiverDeviceState_ptr() {return &devReceiverState;}
|
||||
PIString senderDeviceState() {return devSenderState;}
|
||||
PIString * senderDeviceState_ptr() {return &devSenderState;}
|
||||
|
||||
protected:
|
||||
virtual bool validate() {return true;} // function for validate algorithm and save data from dataPtr to external struct
|
||||
virtual unsigned int checksum(unsigned char * data, int size) // function for checksum
|
||||
{
|
||||
unsigned char c = 0;
|
||||
for (int i = 0; i < size; ++i)
|
||||
c += data[i];
|
||||
c = ~(c + 1);
|
||||
return c;
|
||||
}
|
||||
virtual bool aboutSend() {return true;} // executed before send data, if return 'false' then data is not sending
|
||||
virtual bool receive(char * data, int size) {memcpy(dataPtr, data, size); return true;} // executed when raw data received, break if 'false' return
|
||||
virtual bool validate() {return true;} // function for validate algorithm and save data from dataPtr to external struct
|
||||
virtual uint checksum_i(void * data, int size) { // function for checksum (uint)
|
||||
uint c = 0;
|
||||
for (int i = 0; i < size; ++i)
|
||||
c += ((uchar*)data)[i];
|
||||
c = ~(c + 1);
|
||||
return c;
|
||||
}
|
||||
virtual uchar checksum_c(void * data, int size) { // function for checksum (uchar)
|
||||
uchar c = 0;
|
||||
for (int i = 0; i < size; ++i)
|
||||
c += ((uchar*)data)[i];
|
||||
c = ~(c + 1);
|
||||
return c;
|
||||
}
|
||||
virtual bool aboutSend() {return true;} // executed before send data, if return 'false' then data is not sending
|
||||
|
||||
void init();
|
||||
void send();
|
||||
void check_state();
|
||||
void calc_freq();
|
||||
void calc_diag();
|
||||
static bool received(void * t, char * data);
|
||||
static void diag_event(void * t);
|
||||
void init();
|
||||
void check_state();
|
||||
void calc_freq();
|
||||
void calc_diag();
|
||||
|
||||
PISerial * serial;
|
||||
PIEthernet * ether;
|
||||
unsigned int dataSize, headerSize, sendDataSize;
|
||||
unsigned char * dataPtr, * headerPtr, * sendDataPtr;
|
||||
PISerial * ser;
|
||||
PIEthernet * eth;
|
||||
uint dataSize, headerSize, sendDataSize;
|
||||
uchar * dataPtr, * headerPtr, * sendDataPtr;
|
||||
|
||||
private:
|
||||
static void run(void * e) {PIProtocol* p = (PIProtocol*)e; if (p->aboutSend()) p->send();}
|
||||
PITimer * timer, * sendtimer;
|
||||
PIProtocol::Type type;
|
||||
PIProtocol::Quality net_diag;
|
||||
deque<float> last_freq;
|
||||
deque<char> last_packets;
|
||||
PIString devState, devName;
|
||||
bool work;
|
||||
float exp_freq, immediateFreq, integralFreq, tf;
|
||||
int packets[2];
|
||||
static void sendEvent(void * e) {((PIProtocol * )e)->send();}
|
||||
static bool receiveEvent(void * t, char * data, int size);
|
||||
static void diagEvent(void * t);
|
||||
ReceiveFunc ret_func;
|
||||
PITimer * diagTimer, * sendTimer;
|
||||
PIProtocol::Type type_send, type_rec;
|
||||
PIProtocol::Quality net_diag;
|
||||
deque<float> last_freq;
|
||||
deque<char> last_packets;
|
||||
PIString devReceiverName, devReceiverState, devSenderName, devSenderState;
|
||||
bool work;
|
||||
float exp_freq, send_freq, immediateFreq, integralFreq, tf;
|
||||
int packets[2];
|
||||
uint pckt_cnt, pckt_cnt_max;
|
||||
char * packet;
|
||||
char cur_pckt;
|
||||
unsigned long long int wrong_count, receive_count, send_count;
|
||||
char * packet, cur_pckt;
|
||||
ullong wrong_count, receive_count, send_count;
|
||||
};
|
||||
|
||||
#endif // PIPROTOCOL_H
|
||||
|
||||
Reference in New Issue
Block a user