uprobeprotocol.h
179 lines
| 6.9 KiB
| text/x-c
|
CLexer
/ src / uprobeprotocol.h
|
r4 | /*------------------------------------------------------------------------------ | ||
-- This file is a part of the Uprobe Software | ||||
-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | ||||
-- | ||||
-- This program is free software; you can redistribute it and/or modify | ||||
-- it under the terms of the GNU General Public License as published by | ||||
-- the Free Software Foundation; either version 2 of the License, or | ||||
-- (at your option) any later version. | ||||
-- | ||||
-- This program is distributed in the hope that it will be useful, | ||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
-- GNU General Public License for more details. | ||||
-- | ||||
-- You should have received a copy of the GNU General Public License | ||||
-- along with this program; if not, write to the Free Software | ||||
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
-------------------------------------------------------------------------------*/ | ||||
/*-- Author : Alexis Jeandet | ||||
-- Mail : alexis.jeandet@member.fsf.org | ||||
-- Author : Kaveh Mohamadabadi | ||||
-- Mail : kaveh.mohamadabadi@lpp.polytechnique.fr | ||||
--------------------------------------------------------------------------------*/ | ||||
|
r2 | #ifndef UPROBEPROTOCOL_H | ||
#define UPROBEPROTOCOL_H | ||||
#include <QObject> | ||||
#include <QThread> | ||||
#include <QMutex> | ||||
#include <QSemaphore> | ||||
#include <ucomport.h> | ||||
|
r3 | #define UProbeProtocolMaxPacketSize 512 | ||
#define bufferSize (((UProbeProtocolMaxPacketSize+7)+6)*2+32) | ||||
/* | ||||
=========================================================================================== | ||||
=========================================================================================== | ||||
██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗ ██████╗ ██████╗ ██████╗ ██╗ | ||||
██║ ██║██╔══██╗██╔══██╗██╔═══██╗╚══██╔══╝██╔═══██╗██╔════╝██╔═══██╗██║ | ||||
██║ ██║██████╔╝██████╔╝██║ ██║ ██║ ██║ ██║██║ ██║ ██║██║ | ||||
██║ ██║██╔═══╝ ██╔══██╗██║ ██║ ██║ ██║ ██║██║ ██║ ██║██║ | ||||
╚██████╔╝██║ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝╚██████╗╚██████╔╝███████╗ | ||||
╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ | ||||
------------------------------------------------------------------------------------------- | ||||
|| Sync (2Bytes) || Header(4 Bytes) || Payload Data (2 to 512 Bytes) || CRC(1 Byte) || | ||||
|
r4 | || 0xA5 0xF0 || PCPT | (PSZ/2)-1 | SHAPE | ID || [...] || Uses SpaceWire CRC || | ||
|
r3 | |||
Shape: | ||||
|msb lsb| | ||||
| Channel count -1 [7:4] | Coding [3:2] | Channel resolution[1:0] -1 | | ||||
Coding: | ||||
0 Unsigned integer | ||||
1 Signed integer (Two complement) | ||||
2 Signed integer (sign bit) | ||||
3 floating point | ||||
=========================================================================================== | ||||
*/ | ||||
static const unsigned char SPW_CRCTable[] = { | ||||
0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75, | ||||
0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b, | ||||
0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69, | ||||
0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67, | ||||
0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d, | ||||
0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43, | ||||
0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51, | ||||
0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f, | ||||
0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05, | ||||
0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b, | ||||
0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19, | ||||
0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17, | ||||
0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d, | ||||
0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33, | ||||
0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21, | ||||
0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f, | ||||
0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95, | ||||
0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b, | ||||
0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89, | ||||
0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87, | ||||
0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad, | ||||
0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3, | ||||
0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1, | ||||
0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf, | ||||
0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5, | ||||
0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb, | ||||
0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9, | ||||
0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7, | ||||
0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd, | ||||
0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3, | ||||
0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1, | ||||
0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf | ||||
}; | ||||
inline unsigned char _spw_CRC_(unsigned char INCR, unsigned char INBYTE) | ||||
{ | ||||
return SPW_CRCTable[INCR ^ INBYTE]; | ||||
} | ||||
inline char spw_CRC(char* buffer, int size) | ||||
{ | ||||
unsigned char CRC = 0; | ||||
for(int i=0;i<size;i++) | ||||
{ | ||||
CRC = _spw_CRC_(CRC,(unsigned char)buffer[i]); | ||||
} | ||||
return CRC; | ||||
} | ||||
|
r2 | |||
class UProbeProtocol : public QThread , public UComPort | ||||
{ | ||||
|
r3 | class UProbeProtocolPacket | ||
{ | ||||
public: | ||||
typedef enum {UProbeUint=0,UProdeInt=1,UProbeSInt=2,UProbeFloat=3}PacketCoding; | ||||
typedef enum {res1Byte=0,res2Bytes=1,res3Bytes=2,res4Bytes=3}PacketResolution; | ||||
UProbeProtocolPacket() | ||||
:packetNumber(0),packetSize(0),channelCount(0), | ||||
coding(UProbeUint),resolution(res1Byte),ID(0),data(NULL),correct(false) | ||||
{ | ||||
} | ||||
int packetNumber; | ||||
int packetSize; | ||||
int channelCount; | ||||
UProbeProtocolPacket::PacketCoding coding; | ||||
UProbeProtocolPacket::PacketResolution resolution; | ||||
int ID; | ||||
char* data; | ||||
bool correct; | ||||
char receivedCRC; | ||||
char localCRC; | ||||
}; | ||||
|
r2 | Q_OBJECT | ||
|
r3 | |||
|
r2 | public: | ||
explicit UProbeProtocol(QObject *parent = 0); | ||||
~UProbeProtocol(); | ||||
void run(); | ||||
signals: | ||||
|
r4 | void packetReady(UProbeProtocolPacket* currentPacket); | ||
|
r2 | |||
public slots: | ||||
void setPortName(const QString& name); | ||||
void setSpeed(int speed); | ||||
|
r3 | bool open(); | ||
bool open(const QString& name,int speed); | ||||
bool close(); | ||||
|
r2 | |||
private: | ||||
|
r3 | void getMoreData(); | ||
bool FSM_SyncState(); | ||||
bool FSM_ExtractHeaderState(); | ||||
bool FSM_ExtractPayloadState(); | ||||
bool FSM_CheckCRCState(); | ||||
char* p_buffer; | ||||
int p_datacount; | ||||
int p_index; | ||||
UProbeProtocolPacket* currentPacket; | ||||
|
r2 | }; | ||
#endif // UPROBEPROTOCOL_H | ||||
|
r3 | |||