etherkit / jtencode Goto Github PK
View Code? Open in Web Editor NEWJT65/JT9/JT4/WSPR/FSQ Encoder Library for Arduino
License: GNU General Public License v3.0
JT65/JT9/JT4/WSPR/FSQ Encoder Library for Arduino
License: GNU General Public License v3.0
Hi there!
Since the demo does not seems to work for me, i've started with a blank project and copied part of your code into mine.
Can someone explain me why it hangs on
si5351.set_freq((freq * 100) + (tx_buffer[i] * tone_spacing), SI5351_CLK0); // HANGS HERE!!!!!!!!!!
The code is located here:
Many many thanks!
Hi,
It looks like this might be a GPL v3 project based on the header file license block.
thanks!
I read through the code because I had an other problem and searched for all occurences of strcpy, strncpy, ..
I see the following problem with callsign, defined in JTEncode.h:
char callsign[12];
We know, compound calls in wspr type2 messages are 12 bytes long: <DL9/DL9SAU>, plus the terminating \0.
JTEncode.cpp does:
strncpy(callsign, call, 12);
-> No buffer overflow, but the copied 12 bytes long string is not terminated.
The operation further down,
char* slash_avail = strchr(callsign, (int)'/');
may search for '/' beyond end of char[] callsign (if user had a wrong input). Same for
char* bracket_avail = strchr(callsign, (int)'>');
Fix:
I see no reason to keep char callsign 12 bytes long.
-> Define in JTEncode.h
char callsign[13];
should solve the hypothetical problem.
Hi Jason.
I would be very interested to see this supporting JS8Call mode, say with heartbeat packets.
http://bygra.pl/wp-content/uploads/2019/02/JS8Call.pdf
Thanks for this great project!
Patrick
Hi
Great library, thank you for all your work.
A few ways to save more memory - I saved 562 bytes of flash and 530 bytes of flash with these changes through suggestions made to me:
Moved the tables from jt65_merge_sync_vector, jt9_merge_sync_vector, jt4_merge_sync_vector and wspr_sync_vector all to PROGMEM and read back via pgm_read_byte(wspr_sync_vector +i) etc.
In ft8_merge_sync_vector moved costas7x7 and graymap to PROGMEM. Then memcpy_P and pgm_read_byte(&graymap[idx]) to read them back:
`void JTEncode::ft8_merge_sync_vector(uint8_t* symbols, uint8_t* output)
{
static const uint8_t PROGMEM costas7x7[7] = {3, 1, 4, 0, 6, 5, 2};
static const uint8_t PROGMEM graymap[8] = {0, 1, 3, 2, 5, 6, 4, 7};
uint8_t i, j, k, idx;
// Insert Costas sync arrays
memcpy_P(output, costas7x7, 7);
memcpy_P(output + 36, costas7x7, 7);
memcpy_P(output + FT8_SYMBOL_COUNT - 7, costas7x7, 7);
k = 6;
for(j = 0; j < 58; ++j) // 58 data symbols
{
i = 3 * j;
++k;
if(j == 29)
{
k += 7;
}
idx = symbols[i] * 4 + symbols[i + 1] * 2 + symbols[i + 2];
output[k] = pgm_read_byte(&graymap[idx]);
}
}`
If you would rather a pull request I can do that.
Thanks very much
Kevin
Hi!
Yes...it's me again...but this time i think the problem is very hard to investigate...
The library and my project worked ok till now...but...
If i simply add
TinyGPSPlus gpsext;
The jtencode.jt65_encode(message, tx_buffer); doesn't work anymore
If i remove the TinyGPSPlus declaration (i've only added the declaration!!!! and the #include <TinyGPS++.h>) everythings works ok.
Leaving the #include <TinyGPS++.h> and not declaring the gpsext object, it works ok.
I've NO idea how to investigate this strange thing...the examples examples of TiniGPS++ works ok, the jtencode works ok.....but when i use the 2 libraryes in the same project jt65_encode(message, tx_buffer); hangs somewhere
Is it possible for you to add CW mode? It could be very easy...
Hi!
Will you implement a 6 char locator in wspr_encode() ?
Many thanks!
PS: If you need a betatester...here I am!
Hello Jason,
Playing with Si5351JTDemo ( using <si5351.h> v. 2.1.4 and <JTEncode.h> v.1.2.1 ) I met the following problem - transmiting of FT8 (also on JT4) text on 144MHz is interrupted on every new tone, breaks and starts of transmition occures everytime frequency has changed. It's looks like Si5351 could not locks the frequencies. This problem is missing on HF, 50 and 70MHz. I've tried with different chips and reference frequencies ( 25MHz, 26MHz and 27Mhz) but without any luck. Any suggestion ?
Thank you very much for your great support to the HAM community !
Best regards,
Georgi LZ1ZP
There is a bug in the FT8 telemetry mode code.
In JTEncode.cpp line 887 the line: snprintf(temp_msg, 19, "%*s", 18, c18); sets temp_msg to a zero length string. This causes the variable "message" further down in the code to have a zero 1st byte and corrupts the telemetry message.
Replace the snprintf call with the following: snprintf(temp_msg, 19, "%18s", c18);
I am running the code on an Arduno Pro Mini (Atmel chip) and it appears that the %*s formatter is not functioning correctly on this tool chain. Since the length is hard coded, the simpler %18s will work.
73s de KJ6FO
Please, i'm very frustrated now...
I've started a very little project from your demo (that seems TO ME to not being working).
The problem is when i use the function
jtencode.jt65_encode(message, tx_buffer);
It seems to stop my arduino
My code is here:
The offending line is the n. 61
If I uncomment that line, the program/arduino hangs, instead if i comment that line everything works (ok...no jt65 good message, but i can see the carriers on the spectrum of my sdr).
PLEASE, any help is very appreciated!
Hi Jason, any chance you will be adding FT8 to the supported modes:
http://www.arrl.org/news/new-ft8-mode-included-in-wsjt-x-beta-release
George M1GEO (y)
Hello,
I did have some trouble with a one char prefix in the wspr callsign (F/PE0FKO), it was not received by the wspr systems.
Did check the code for the JTEncode::wspr_encode() function and found the problem in JTEncode::wspr_bit_packing(). There, in the function line 1000, the 3 and 2 char prefix is handled, only the one char prefix is not!
I fixed the code with some extra if statement for the 1 char prefix and it works (for me ;-)), maybe you update the repo for that.
73, Fred, pe0fko
Hi!
It would be great if you can add CW mode (wanna build a sort of multimode beacon with your library).
Greeting Mike iu5hes
Hi! I noticed today that in jt_message_prep, the code that pads a short string (less than 13 characters) with spaces overwrites the terminating null byte (undesirable).
This
if(len < 13)
{
for(i = len; i <= 13; i++)
{
message[i] = ' ';
}
}
could be simply
for(i = len; i < 13; i++)
{
message[i] = ' ';
}
(Note 'i <= 13' changed to 'i < 13')
If message[]
is exactly 11 characters, as in the example sketch, the library does not work. See a shorter example sketch below. This sketch should simply output a single tone, and many lines of "tone change" to the serial monitor. Instead, "tone change" prints once, and the sketch stops.
Changing message[]
to some other string that is not 11 characters results in the sketch reaching completion.
#include <si5351.h>
#include <Wire.h>
#include <JTEncode.h>
Si5351 si5351;
JTEncode jtencode;
char message[] = "abababababa";
uint8_t tx_buffer[255];
unsigned long baseFreq;
void encode(){
uint8_t i;
memset(tx_buffer, 0, 255);
jtencode.jt9_encode(message, tx_buffer);
si5351.output_enable(SI5351_CLK0, 1);
for(i = 0; i < JT9_SYMBOL_COUNT; i++){
Serial.println("tone change");
uint8_t test = tx_buffer[i];
si5351.set_freq(708080000ULL, SI5351_CLK0);
delay(580);
}
si5351.output_enable(SI5351_CLK0, 0);
}
void setup() {
Serial.begin(9600);
baseFreq = 708080000ULL;
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
si5351.set_freq(baseFreq, SI5351_CLK0);
si5351.output_enable(SI5351_CLK0, 0);
si5351.update_status();
}
void loop() {
delay(1000);
Serial.println("Calling encode();");
encode();
Serial.println("Returned from encode();");
}
Hello,
First of, I would like to thank you for this great library, it works amazingly well.
My question is, is it possible to decode the received signal using an Arduino. For the project I'm working on I need to be able to send and receive the signal with an Arduino using the JT65 protocol.
Hi,
when using jtencode as shown in the example, data from the calling routine gets lost as soon as wspr_merge_sync_vectors is called. Which is funny as it does not do anything dangerous and the needed 255 bytes should fit in the remaining 800 bytes pretty well.
Please tell me how I can help you debug stuff.
Hi!
Please, ,, can you add CW mode?
Many thanks!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.