##// 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
Initial commit: rmapplugin fully operational with the GRESB Ethernet/SpaceWire bridge.
r0 #include "rmapoperations.h"
Plugin modified to allow the launch of interactiv tests from the python interpreter...
r11 RMAP::RMAP(RMAP_command_codes commandCode, unsigned char targetLogicalAddress, unsigned char initiatorLogicalAddress,
int startAddress, int nbBytes, char* data)
Initial commit: rmapplugin fully operational with the GRESB Ethernet/SpaceWire bridge.
r0 {
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);
}
paul@pc-solar1.lab-lpp.local
First version with the Star Dundee bridge operational
r1 GRESBHeader.GRESBProtocoleID = 0x00; // packets with protocole ID 0 have a SpaceWire packet as payload
Initial commit: rmapplugin fully operational with the GRESB Ethernet/SpaceWire bridge.
r0 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 ;
Plugin modified to allow the launch of interactiv tests from the python interpreter...
r11 RMAPHeader.protocolIdentifier = 0x01; // 0x01 is the protocole identifier for RMAP
Initial commit: rmapplugin fully operational with the GRESB Ethernet/SpaceWire bridge.
r0 RMAPHeader.instruction = (packetType<<6) + (command<<2) + (replyAddressLength);
Plugin modified to allow the launch of interactiv tests from the python interpreter...
r11 RMAPHeader.key = initiatorLogicalAddress; // used for command authorization
Initial commit: rmapplugin fully operational with the GRESB Ethernet/SpaceWire bridge.
r0 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);
}