##// END OF EJS Templates
Functions added to the plugin to get the number of CCSDS packets...
Functions added to the plugin to get the number of CCSDS packets transmitted (linked to the lfrcontrol plugin counter of TC transmitted, it is possible to flush the TC transmission before changing the spacewire link in use)

File last commit:

r11:27ed47eb6044 default
r40:cda6b4e8adc1 Patch 3 from Paul on spwplugin default
Show More
spw.h
213 lines | 11.6 KiB | text/x-c | CLexer
/*------------------------------------------------------------------------------
-- This file is a part of the SocExplorer 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 3 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
----------------------------------------------------------------------------*/
#ifndef SPW_H
#define SPW_H
#include <stdint.h>
/*
███████╗██████╗ ██╗ ██╗ ██████╗ ██████╗ ███╗ ███╗███╗ ███╗ ██████╗ ███╗ ██╗
██╔════╝██╔══██╗██║ ██║ ██╔════╝██╔═══██╗████╗ ████║████╗ ████║██╔═══██╗████╗ ██║
███████╗██████╔╝██║ █╗ ██║ ██║ ██║ ██║██╔████╔██║██╔████╔██║██║ ██║██╔██╗ ██║
╚════██║██╔═══╝ ██║███╗██║ ██║ ██║ ██║██║╚██╔╝██║██║╚██╔╝██║██║ ██║██║╚██╗██║
███████║██║ ╚███╔███╔╝ ╚██████╗╚██████╔╝██║ ╚═╝ ██║██║ ╚═╝ ██║╚██████╔╝██║ ╚████║
╚══════╝╚═╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝
*/
enum SPW_PROTOCOL_IDs{
SPW_PROTO_ID_EXTEND =0,
SPW_PROTO_ID_RMAP = 1,
SPW_PROTO_ID_CCSDS = 2,
SPW_PROTO_ID_GOES_R = 238,
SPW_PROTO_ID_STUP = 239
};
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;
}
/*
██████╗ ███╗ ███╗ █████╗ ██████╗ ██████╗ ██████╗ ██████╗ ████████╗ ██████╗ ██████╗ ██████╗ ██╗
██╔══██╗████╗ ████║██╔══██╗██╔══██╗ ██╔══██╗██╔══██╗██╔═══██╗╚══██╔══╝██╔═══██╗██╔════╝██╔═══██╗██║
██████╔╝██╔████╔██║███████║██████╔╝ ██████╔╝██████╔╝██║ ██║ ██║ ██║ ██║██║ ██║ ██║██║
██╔══██╗██║╚██╔╝██║██╔══██║██╔═══╝ ██╔═══╝ ██╔══██╗██║ ██║ ██║ ██║ ██║██║ ██║ ██║██║
██║ ██║██║ ╚═╝ ██║██║ ██║██║ ██║ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝╚██████╗╚██████╔╝███████╗
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝
*/
enum RMAP_CMD_CODE{
RMAP_CMD_CODE_invalid0, //0000
RMAP_CMD_CODE_invalid1, //0001
RMAP_CMD_CODE_read_Single, //0010
RMAP_CMD_CODE_read_Inc, //0011
RMAP_CMD_CODE_invalid2, //0100
RMAP_CMD_CODE_invalid3, //0101
RMAP_CMD_CODE_invalid4, //0110
RMAP_CMD_CODE_readModWri_Inc, //0111
RMAP_CMD_CODE_writeSingle_noVer_noRep, //1000
RMAP_CMD_CODE_writeInc_noVer_noRep, //1001
RMAP_CMD_CODE_writeSingle_noVer_Rep, //1010
RMAP_CMD_CODE_writeInc_noVer_Rep, //1011
RMAP_CMD_CODE_writeSingle_ver_noRep, //1100
RMAP_CMD_CODE_writeInc_ver_noRep, //1101
RMAP_CMD_CODE_writeSingle_ver_rep, //1110
RMAP_CMD_CODE_writeInc_ver_rep //1111
};
/*
* Rmap read command header:
*
* | Destination Logical Address | Protocol identifier | Packet type | Destination key |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Source Logical Address | Transaction identifier | Transaction identifier | Extended read address |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Read address MSB | Read address | Read address | Read address LSB |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Data length MSB | Data length | Data length LSB | CRC |
* |-----------------------------|------------------------|------------------------|------------------------|
*
* Packet type field:
*
* | msb
* | reserved = 0 | Comand = 1| Read = 0 | Read = 0 | Read = 1 | Increment/ | Source Path | Source Path |
* | (Ack/NoAck) | No Inc. address | Address Length | Address Length |
*
*/
#define RMAP_READ_HEADER_MIN_SZ 16
inline void RMAP_build_rx_request_header(char destinationLogicalAddress, char destKey,char sourceLogicalAddress,uint16_t transactionID,int readAddress,int length,char *buffer)
{
buffer[0] = destinationLogicalAddress;
buffer[1] = SPW_PROTO_ID_RMAP;
buffer[2] = 0b01001100;
buffer[3] = destKey;
buffer[4] = sourceLogicalAddress;
buffer[5] = (char)(transactionID >> 8);
buffer[6] = (char)(transactionID);
buffer[7] = 0;
buffer[8] = (char)(readAddress >> 24);
buffer[9] = (char)(readAddress >> 16);
buffer[10] = (char)(readAddress >> 8);
buffer[11] = (char)(readAddress);
buffer[12] = (char)(length >> 16);
buffer[13] = (char)(length >> 8);
buffer[14] = (char)(length);
buffer[15] = (char)spw_CRC(buffer,15);
}
inline int RMAP_get_transactionID(char *packet)
{
return ((((unsigned int)packet[5])<<8) + ((unsigned int)packet[6]));
}
/*
* Rmap Write command header:
*
* | Destination Logical Address | Protocol identifier | Packet type | Destination key |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Source Logical Address | Transaction identifier | Transaction identifier | Extended write address |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Write address MSB | Write address | Write address | Write address LSB |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Data length MSB | Data length | Data length LSB | Header CRC |
* |-----------------------------|------------------------|------------------------|------------------------|
* | Data | (...) | Last data byte | Data CRC |
* |-----------------------------|------------------------|------------------------|------------------------|
*
* Packet type field:
*
* | msb
* | reserved = 0 | Comand = 1| Write = 1 | Verify data = 1 | Ack = 1 | Increment/ | Source Path | Source Path |
* | Don't Verify data = 0 | No Ack = 0 | No Inc. address | Address Length | Address Length |
*
*/
#define RMAP_WRITE_HEADER_MIN_SZ 16
#define RMAP_WRITE_PACKET_MIN_SZ(bytesCnt) (RMAP_WRITE_HEADER_MIN_SZ+bytesCnt+1) //header=16 + data + data CRC=1
inline void RMAP_build_tx_request_header(char destinationLogicalAddress, char destKey,char sourceLogicalAddress,uint16_t transactionID,int readAddress,int length,char *buffer)
{
buffer[0] = destinationLogicalAddress;
buffer[1] = SPW_PROTO_ID_RMAP;
buffer[2] = 0b01101100;
buffer[3] = destKey;
buffer[4] = sourceLogicalAddress;
buffer[5] = (char)(transactionID >> 8);
buffer[6] = (char)(transactionID);
buffer[7] = 0;
buffer[8] = (char)(readAddress >> 24);
buffer[9] = (char)(readAddress >> 16);
buffer[10] = (char)(readAddress >> 8);
buffer[11] = (char)(readAddress);
buffer[12] = (char)(length >> 16);
buffer[13] = (char)(length >> 8);
buffer[14] = (char)(length);
buffer[15] = (char)spw_CRC(buffer,15);
buffer[16+length] = (char)spw_CRC(buffer+16,length);
}
#endif // SPW_H