rmapoperations.cpp
96 lines
| 3.9 KiB
| text/x-c
|
CppLexer
/ rmapplugin / rmapoperations.cpp
r0 | #include "rmapoperations.h" | |||
r11 | RMAP::RMAP(RMAP_command_codes commandCode, unsigned char targetLogicalAddress, unsigned char initiatorLogicalAddress, | |||
int startAddress, int nbBytes, char* data) | ||||
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
|
r1 | GRESBHeader.GRESBProtocoleID = 0x00; // packets with protocole ID 0 have a SpaceWire packet as payload | ||
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; | ||||
} | ||||
r17 | RMAPHeader.targetLogicalAddress = targetLogicalAddress; | |||
r11 | RMAPHeader.protocolIdentifier = 0x01; // 0x01 is the protocole identifier for RMAP | |||
r0 | RMAPHeader.instruction = (packetType<<6) + (command<<2) + (replyAddressLength); | |||
r17 | RMAPHeader.key = DEFAULT_DESTINATION_KEY; // used for command authorization | |||
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); | ||||
} | ||||