##// END OF EJS Templates
Plugin modified to allow the launch of interactiv tests from the python interpreter...
Plugin modified to allow the launch of interactiv tests from the python interpreter the signal processPacketStoreNowSig is sent by the SLOT processPacketStoreLater(unsigned int delay) the SLOT WriteSPWDelay(QList<int> dataList, unsigned int delay) allows the storage of a TC for a sending after "delay" ms

File last commit:

r11:0c9852fa341b default
r11:0c9852fa341b default
Show More
rmapoperations.cpp
96 lines | 3.9 KiB | text/x-c | CppLexer
#include "rmapoperations.h"
RMAP::RMAP(RMAP_command_codes commandCode, unsigned char targetLogicalAddress, unsigned char initiatorLogicalAddress,
int startAddress, int nbBytes, char* data)
{
char packetType; // 2 most Significant Bits
char command; // 4 bits
char replyAddressLength; // 2 Least Significant Bits
int SPWPacketSize;
// GRESB HEADER
if (data == NULL){
SPWPacketSize = sizeof(RMAPHeader) ;
dataCRC = 0x00;
}
else{
SPWPacketSize = sizeof(RMAPHeader) + nbBytes + 1 ; // SPW Packet = Header + Data + dataCRC
dataCRC = RMAPCalculateDataCRC(data, nbBytes);
}
GRESBHeader.GRESBProtocoleID = 0x00; // packets with protocole ID 0 have a SpaceWire packet as payload
GRESBHeader.SPWPacketSize2 = (SPWPacketSize>>16);
GRESBHeader.SPWPacketSize1 = (SPWPacketSize>>8);
GRESBHeader.SPWPacketSize0 = (SPWPacketSize);
// SPACEWIRE HEADER
packetType = (char) 0b01; // 0b01 for a command, 0b00 for a reply
command = (char) commandCode;
replyAddressLength = (char) 0b00; // RMAP command: number of bytes in the reply address field
// RMAP reply: copy of the reply address field of the command
switch (commandCode){
case writeSingle_noVer_noRep:
case writeSingle_noVer_Rep:
case writeSingle_ver_noRep:
case writeSingle_ver_rep:
if (nbBytes > 4) command = command + 1; // switch between Single and Incremental Read/Write operations
break;
default:
break;
}
RMAPHeader.targetLogicalAddress = targetLogicalAddress ;
RMAPHeader.protocolIdentifier = 0x01; // 0x01 is the protocole identifier for RMAP
RMAPHeader.instruction = (packetType<<6) + (command<<2) + (replyAddressLength);
RMAPHeader.key = initiatorLogicalAddress; // used for command authorization
RMAPHeader.initiatorLogicalAddress = initiatorLogicalAddress; // 0 is the default address for the GRESB module
RMAPHeader.transactionIdentifier1 = 0x00;
RMAPHeader.transactionIdentifier0 = 0x01;
RMAPHeader.extendedAddress = 0x00;
RMAPHeader.address3 = (char) (startAddress>>24);
RMAPHeader.address2 = (char) (startAddress>>16);
RMAPHeader.address1 = (char) (startAddress>>8);
RMAPHeader.address0 = (char) (startAddress);
RMAPHeader.dataLength2 = (char) (nbBytes>>16);
RMAPHeader.dataLength1 = (char) (nbBytes>>8);
RMAPHeader.dataLength0 = (char) (nbBytes);
RMAPHeader.headerCRC = RMAPCalculateHeaderCRC();
}
unsigned char RMAP::RMAPCalculateCRC(unsigned char INCR, unsigned char INBYTE)
{
return RMAP_CRCTable[INCR ^ INBYTE];
}
unsigned char RMAP::RMAPCalculateHeaderCRC()
{
unsigned char INCR = 0;
INCR = RMAPCalculateCRC(INCR, RMAPHeader.targetLogicalAddress);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.protocolIdentifier);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.instruction);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.key);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.initiatorLogicalAddress);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.transactionIdentifier1);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.transactionIdentifier0);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.extendedAddress);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.address3);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.address2);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.address1);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.address0);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.dataLength2);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.dataLength1);
INCR = RMAPCalculateCRC(INCR, RMAPHeader.dataLength0);
return(INCR);
}
unsigned char RMAP::RMAPCalculateDataCRC(char *data, int nbBytes)
{
unsigned char INCR = 0;
for (int k=0; k<nbBytes; k++)
{
INCR = RMAPCalculateCRC(INCR, data[k]);
}
return(INCR);
}