#include "rmapoperations.h" RMAP::RMAP(RMAP_command_codes commandCode, char targetLogicalAddress, 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 SpaceWire a 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 = 0; // 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