2020-06-15 08:45:54 +00:00
|
|
|
/*---------------------------------------------------------------------------*\
|
|
|
|
|
|
|
|
FILE........: horus_gen_tx_bits.c
|
|
|
|
AUTHOR......: Mark Jessop
|
|
|
|
DATE CREATED: May 2020
|
|
|
|
|
|
|
|
Horus dummy packet generation, for use with fsk_demod.
|
|
|
|
|
|
|
|
Build:
|
|
|
|
gcc horus_gen_test_bits.c horus_l2.c golay23.c -o horus_get_test_bits -Wall -DSCRAMBLER -DINTERLEAVER
|
|
|
|
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <getopt.h>
|
|
|
|
|
|
|
|
#include "horus_l2.h"
|
2020-07-11 10:37:01 +00:00
|
|
|
#include "H_128_384_23.h"
|
|
|
|
#include "H_256_768_22.h"
|
2020-06-15 08:45:54 +00:00
|
|
|
|
|
|
|
// TODO: Move these packet format definitions to somehwere common.
|
|
|
|
|
|
|
|
/* Horus Mode 0 (Legacy 22-byte) Binary Packet */
|
|
|
|
struct TBinaryPacket0
|
|
|
|
{
|
|
|
|
uint8_t PayloadID;
|
|
|
|
uint16_t Counter;
|
|
|
|
uint8_t Hours;
|
|
|
|
uint8_t Minutes;
|
|
|
|
uint8_t Seconds;
|
|
|
|
float Latitude;
|
|
|
|
float Longitude;
|
|
|
|
uint16_t Altitude;
|
|
|
|
uint8_t Speed; // Speed in Knots (1-255 knots)
|
|
|
|
uint8_t Sats;
|
|
|
|
int8_t Temp; // Twos Complement Temp value.
|
|
|
|
uint8_t BattVoltage; // 0 = 0.5v, 255 = 2.0V, linear steps in-between.
|
|
|
|
uint16_t Checksum; // CRC16-CCITT Checksum.
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
/* Horus v2 Mode 1 (32-byte) Binary Packet */
|
2020-06-15 08:45:54 +00:00
|
|
|
struct TBinaryPacket1
|
|
|
|
{
|
|
|
|
uint16_t PayloadID;
|
|
|
|
uint16_t Counter;
|
|
|
|
uint8_t Hours;
|
|
|
|
uint8_t Minutes;
|
|
|
|
uint8_t Seconds;
|
|
|
|
float Latitude;
|
|
|
|
float Longitude;
|
|
|
|
uint16_t Altitude;
|
|
|
|
uint8_t Speed; // Speed in Knots (1-255 knots)
|
|
|
|
uint8_t Sats;
|
|
|
|
int8_t Temp; // Twos Complement Temp value.
|
|
|
|
uint8_t BattVoltage; // 0 = 0.5v, 255 = 2.0V, linear steps in-between.
|
|
|
|
uint8_t dummy1; // Dummy values for user-configurable section.
|
|
|
|
uint8_t dummy2;
|
|
|
|
uint8_t dummy3;
|
|
|
|
uint8_t dummy4;
|
|
|
|
uint8_t dummy5;
|
|
|
|
uint8_t dummy6;
|
|
|
|
uint8_t dummy7;
|
|
|
|
uint8_t dummy8;
|
|
|
|
uint8_t dummy9;
|
|
|
|
uint16_t Checksum; // CRC16-CCITT Checksum.
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
/* Horus v2 Mode 2 (16-byte) Binary Packet (Not currently used) */
|
2020-06-15 08:45:54 +00:00
|
|
|
struct TBinaryPacket2
|
|
|
|
{
|
|
|
|
uint8_t PayloadID;
|
|
|
|
uint8_t Counter;
|
|
|
|
uint16_t BiSeconds;
|
|
|
|
uint8_t LatitudeMSB;
|
|
|
|
uint16_t Latitude;
|
|
|
|
uint8_t LongitudeMSB;
|
|
|
|
uint16_t Longitude;
|
|
|
|
uint16_t Altitude;
|
|
|
|
uint8_t BattVoltage; // 0 = 0.5v, 255 = 2.0V, linear steps in-between.
|
|
|
|
uint8_t flags; // Dummy values for user-configurable section.
|
|
|
|
uint16_t Checksum; // CRC16-CCITT Checksum.
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc,char *argv[]) {
|
|
|
|
int i, framecnt;
|
|
|
|
int horus_mode = 0;
|
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
char usage[] = "usage: %s horus_mode numFrames\nMode 0 = Legacy 22-byte Golay FEC\nMode 1 = 32-byte Golay FEC\n";
|
2020-06-15 08:45:54 +00:00
|
|
|
|
|
|
|
if (argc < 3) {
|
|
|
|
fprintf(stderr, usage, argv[0]);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
horus_mode = atoi(argv[1]);
|
|
|
|
fprintf(stderr, "Using Horus Mode %d.\n", horus_mode);
|
|
|
|
|
|
|
|
framecnt = atoi(argv[2]);
|
|
|
|
fprintf(stderr, "Generating %d frames.\n", framecnt);
|
|
|
|
|
|
|
|
if(horus_mode == 0){
|
|
|
|
int nbytes = sizeof(struct TBinaryPacket0);
|
|
|
|
struct TBinaryPacket0 input_payload;
|
|
|
|
int num_tx_data_bytes = horus_l2_get_num_tx_data_bytes(nbytes);
|
|
|
|
unsigned char tx[num_tx_data_bytes];
|
|
|
|
|
2020-07-19 00:28:38 +00:00
|
|
|
uint16_t counter = 0;
|
2020-06-15 08:45:54 +00:00
|
|
|
|
2020-07-19 00:28:38 +00:00
|
|
|
/* all zeros is nastiest sequence for demod before scrambling */
|
|
|
|
while(framecnt > 0){
|
|
|
|
memset(&input_payload, 0, nbytes);
|
|
|
|
input_payload.Counter = counter;
|
|
|
|
input_payload.Checksum = horus_l2_gen_crc16((unsigned char*)&input_payload, nbytes-2);
|
2020-06-15 08:45:54 +00:00
|
|
|
|
2020-07-19 00:28:38 +00:00
|
|
|
horus_l2_encode_tx_packet(tx, (unsigned char*)&input_payload, nbytes);
|
2020-06-15 08:45:54 +00:00
|
|
|
|
2020-07-19 00:28:38 +00:00
|
|
|
int b;
|
|
|
|
uint8_t tx_bit;
|
2020-06-15 08:45:54 +00:00
|
|
|
for(i=0; i<num_tx_data_bytes; i++) {
|
|
|
|
for(b=0; b<8; b++) {
|
|
|
|
tx_bit = (tx[i] >> (7-b)) & 0x1; /* msb first */
|
|
|
|
fwrite(&tx_bit,sizeof(uint8_t),1,stdout);
|
|
|
|
fflush(stdout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
framecnt -= 1;
|
2020-07-19 00:28:38 +00:00
|
|
|
counter += 1;
|
2020-06-15 08:45:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} else if(horus_mode == 1){
|
|
|
|
int nbytes = sizeof(struct TBinaryPacket1);
|
|
|
|
struct TBinaryPacket1 input_payload;
|
2021-08-25 10:56:47 +00:00
|
|
|
int num_tx_data_bytes = horus_l2_get_num_tx_data_bytes(nbytes);
|
2020-06-15 08:45:54 +00:00
|
|
|
unsigned char tx[num_tx_data_bytes];
|
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
uint16_t counter = 0;
|
2020-06-15 08:45:54 +00:00
|
|
|
|
|
|
|
/* all zeros is nastiest sequence for demod before scrambling */
|
2021-08-25 10:56:47 +00:00
|
|
|
while(framecnt > 0){
|
|
|
|
memset(&input_payload, 0, nbytes);
|
|
|
|
input_payload.PayloadID = 257;
|
|
|
|
input_payload.Hours = 12;
|
|
|
|
input_payload.Minutes = 34;
|
|
|
|
input_payload.Seconds = 56;
|
|
|
|
input_payload.Counter = counter;
|
|
|
|
input_payload.Checksum = horus_l2_gen_crc16((unsigned char*)&input_payload, nbytes-2);
|
2020-06-15 08:45:54 +00:00
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
horus_l2_encode_tx_packet(tx, (unsigned char*)&input_payload, nbytes);
|
2020-06-15 08:45:54 +00:00
|
|
|
|
2021-08-25 10:56:47 +00:00
|
|
|
int b;
|
|
|
|
uint8_t tx_bit;
|
2020-06-15 08:45:54 +00:00
|
|
|
for(i=0; i<num_tx_data_bytes; i++) {
|
|
|
|
for(b=0; b<8; b++) {
|
|
|
|
tx_bit = (tx[i] >> (7-b)) & 0x1; /* msb first */
|
|
|
|
fwrite(&tx_bit,sizeof(uint8_t),1,stdout);
|
|
|
|
fflush(stdout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
framecnt -= 1;
|
2021-08-25 10:56:47 +00:00
|
|
|
counter += 1;
|
2020-06-15 08:45:54 +00:00
|
|
|
}
|
2021-08-25 10:56:47 +00:00
|
|
|
// Leaving this in place unless we ever decide to do an LDPC mode.
|
|
|
|
// } else if(horus_mode == 2){
|
|
|
|
// // 16-Byte LDPC Encoded mode.
|
|
|
|
// int nbytes = sizeof(struct TBinaryPacket2);
|
|
|
|
// struct TBinaryPacket2 input_payload;
|
|
|
|
|
|
|
|
// // TODO: Add Calculation of expected number of TX bytes based on LDPC code.
|
|
|
|
// int num_tx_data_bytes = 4 + H_128_384_23_DATA_BYTES + H_128_384_23_PARITY_BYTES;
|
|
|
|
// unsigned char tx[num_tx_data_bytes];
|
|
|
|
|
|
|
|
// /* all zeros is nastiest sequence for demod before scrambling */
|
|
|
|
// memset(&input_payload, 0, nbytes);
|
|
|
|
// input_payload.Checksum = horus_l2_gen_crc16((unsigned char*)&input_payload, nbytes-2);
|
|
|
|
|
|
|
|
|
|
|
|
// int ldpc_tx_bytes = ldpc_encode_packet(tx, (unsigned char*)&input_payload, 2);
|
|
|
|
|
|
|
|
// int b;
|
|
|
|
// uint8_t tx_bit;
|
|
|
|
// while(framecnt > 0){
|
|
|
|
// for(i=0; i<num_tx_data_bytes; i++) {
|
|
|
|
// for(b=0; b<8; b++) {
|
|
|
|
// tx_bit = (tx[i] >> (7-b)) & 0x1; /* msb first */
|
|
|
|
// fwrite(&tx_bit,sizeof(uint8_t),1,stdout);
|
|
|
|
// fflush(stdout);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// framecnt -= 1;
|
|
|
|
// }
|
2020-06-15 08:45:54 +00:00
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Unknown Mode!");
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|