mirror of
https://github.com/dj0abr/SSB_HighSpeed_Modem.git
synced 2024-11-22 04:10:19 -05:00
88 lines
3.1 KiB
C
Executable File
88 lines
3.1 KiB
C
Executable File
/*
|
|
* High Speed modem to transfer data in a 2,7kHz SSB channel
|
|
* =========================================================
|
|
* Author: DJ0ABR
|
|
*
|
|
* (c) DJ0ABR
|
|
* www.dj0abr.de
|
|
*
|
|
* 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* The total length of the FEC-secured part is 255,
|
|
* this is a requirement of the Shifra FEC routine, which
|
|
* is the best FEC that I have seen so far, highly recommended
|
|
*/
|
|
|
|
// total "on the air" frame size
|
|
// the total length must be a multiple of 2 and 3, so QPSK and 8PSK symbols fit into full bytes
|
|
// this is the case with a total length of 258
|
|
#define HEADERLEN 3
|
|
#define FECBLOCKLEN 255
|
|
#define UDPBLOCKLEN (HEADERLEN + FECBLOCKLEN)
|
|
|
|
/* !!! IMPORTANT for GNU RADIO !!!
|
|
* the UDP payload size for TX MUST be exactly UDPBLOCKLEN (258 in this case) or
|
|
* the transmitter will not align bits to symbols correctly !
|
|
*
|
|
* RX payload size is not that important. But the currect size for
|
|
* QPSK is UDPBLOCKLEN*8/2 = 1032 and for 8PSK UDPBLOCKLEN*8/3 = 688
|
|
* so we can use 344 which are 2 blocks for 8PSK and 3 blocks for QPSK
|
|
* */
|
|
|
|
// size of the elements inside an FECblock
|
|
// sum must be 255
|
|
#define FECLEN 32 // supported: 16,32,64,128
|
|
#define STATUSLEN 2
|
|
#define CRCLEN 2
|
|
#define PAYLOADLEN (FECBLOCKLEN - FECLEN - CRCLEN - STATUSLEN)
|
|
#define CRCSECUREDLEN (PAYLOADLEN + STATUSLEN)
|
|
#define DATABLOCKLEN (PAYLOADLEN + CRCLEN + STATUSLEN)
|
|
|
|
|
|
// the header is not FEC secured therefore we give some room for bit
|
|
// errors. Only 24 out of the 32 bits must be correct for
|
|
// a valid frame detection
|
|
extern uint8_t header[HEADERLEN];
|
|
|
|
typedef struct {
|
|
// the total size of the following data must be 255 - 32 = 223 bytes
|
|
// the FEC is calculated on FRAME with a length of 223 and returns
|
|
// a data block with length 255.
|
|
|
|
// we use a 10 bits frame counter -> 1024 values
|
|
// so we can transmit a data block with a maximum
|
|
// size of 255 * 1024 = 261kByte. With the maximum modem speed
|
|
// this would be a transmission time of 5,8 minutes which
|
|
// is more then enough for a single data block
|
|
uint8_t counter_LSB; // lower 8 bits of the frame counter
|
|
|
|
// the status byte contains these information:
|
|
// bit 0..3 : 4 bit (16 values) frame type information
|
|
// bit 4 : first frame of a block if "1"
|
|
// bit 5 : last frame of a block if "1"
|
|
// bit 6..7 : MSB of the frame counter
|
|
uint8_t status;
|
|
|
|
// payload
|
|
uint8_t payload[PAYLOADLEN];
|
|
|
|
// CRC16
|
|
uint8_t crc16_MSB;
|
|
uint8_t crc16_LSB;
|
|
} FRAME;
|