From e2d04932d549d3b94f86105d526ff07df09e6bb9 Mon Sep 17 00:00:00 2001 From: Jerome FORESTIER Date: Fri, 14 Aug 2020 18:31:27 +0200 Subject: [PATCH 1/3] add came top432 --- ftgen.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 ftgen.php diff --git a/ftgen.php b/ftgen.php new file mode 100644 index 0000000..c354547 --- /dev/null +++ b/ftgen.php @@ -0,0 +1,75 @@ + Date: Tue, 8 Sep 2020 18:12:45 +0200 Subject: [PATCH 2/3] Demo to send OOK --- sendook | Bin 0 -> 92944 bytes src/Makefile | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100755 sendook diff --git a/sendook b/sendook new file mode 100755 index 0000000000000000000000000000000000000000..9b2151897b9629e5c9e4dda4055038c770fe6bb4 GIT binary patch literal 92944 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 Date: Tue, 8 Sep 2020 18:33:12 +0200 Subject: [PATCH 3/3] add command line tools sendook --- ftgen.php | 75 --------------- src/ook/IQ_sendook.png | Bin 0 -> 15478 bytes src/ook/README.md | 42 +++++++++ src/ook/sendook.cpp | 203 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+), 75 deletions(-) delete mode 100644 ftgen.php create mode 100644 src/ook/IQ_sendook.png create mode 100644 src/ook/README.md create mode 100644 src/ook/sendook.cpp diff --git a/ftgen.php b/ftgen.php deleted file mode 100644 index c354547..0000000 --- a/ftgen.php +++ /dev/null @@ -1,75 +0,0 @@ -b$?`K=A4;1d-m*^+4DSmp6ltT(Ve_-l8lUu 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 J7D6n7{tFdG(?$RQ literal 0 HcmV?d00001 diff --git a/src/ook/README.md b/src/ook/README.md new file mode 100644 index 0000000..1ae20ad --- /dev/null +++ b/src/ook/README.md @@ -0,0 +1,42 @@ +# SendOOK + +`sendook` allow you to send On Off Keying packend with librpitx. + +## Usage + +Run the program in SUDO, even if using the "dry run" switch. It is because of the DMA things of librpitx. +``` +usage : sendook [options] "binary code" +Options: +-h : this help +-v : verbose (-vv : more verbose) +-d : dry run : do not send anything +-f freq : frequency in Hz (default : 433.92MHz) +-0 nb : duration in microsecond of 0 bit (by default : 500us). Use integer only. +-1 nb : duration in microsecond of 1 bit (by default : 250us) +-r nb : repeat nb times the message (default : 3) +-p nb : pause between each message (default : 1000us=1ms) + +"binary code": + a serie of 0 or 1 char (space allowed and ignored) + +Examples: + sendook -f 868.3M -0 500 -1 250 -r 3 1010101001010101 + send 0xaa55 three times (with the default pause of 1ms) on 868.3MHz. A 0 is a gap of 500us, a 1 is a pulse of 250us +``` +The program return 0 if message send. + +### Known limitation + +- a gap or a pulse can not be shorter than 10us (options `-0` or `-1`). +- the pulse is not really a pulse : it is not modulated (you cant have a pulse of 7Khz for ex.) +- but the signal is not really a square signal too, because librpitx, for an unkown reason, modulate the generated signal globally : +-- for example, the command `sendook -f 868.3M -0 500 -1 250 -r 3 101010` should generate : +``` +| .... .... .... +| : : : : : : ++-+--+----+--+----+--+-----------------------> +``` +-- but if record the I/Q of the signal, you will see : + +![IQ_sendook.png](IQ_sendook.png) diff --git a/src/ook/sendook.cpp b/src/ook/sendook.cpp new file mode 100644 index 0000000..b580eac --- /dev/null +++ b/src/ook/sendook.cpp @@ -0,0 +1,203 @@ +#include +#include "../librpitx/src/librpitx.h" +#include "../librpitx/src/optparse.h" +#include +#include "stdio.h" +#include +#include +#include +#include + +bool running = true; + +void print_usage(void) +{ +/** Future options : +-g nb : power output +-o nb : GPIO out port +-p freq : frequency of the bit 1 pulse (0 : continuous pulse) +**/ + fprintf(stderr,"sendook : a program to send On-Off-Keying with a Raspberry PI.\n\ +usage : sendook [options] \"binary code\"\n\ +Options:\n\ +-h : this help\n\ +-v : verbose (-vv : more verbose)\n\ +-d : dry run : do not send anything\n\ +-f freq : frequency in Hz (default : 433.92MHz)\n\ +-0 nb : duration in microsecond of 0 bit (by default : 500us). Use integer only.\n\ +-1 nb : duration in microsecond of 1 bit (by default : 250us)\n\ +-r nb : repeat nb times the message (default : 3)\n\ +-p nb : pause between each message (default : 1000us=1ms)\n\ +\n\ +\"binary code\":\n\ + a serie of 0 or 1 char (space allowed and ignored)\n\ +\n\ +Examples:\n\ + sendook -f 868.3M -0 500 -1 250 -r 3 1010101001010101\n\ + send 0xaa55 three times (with the default pause of 1ms) on 868.3MHz. A 0 is a gap of 500us, a 1 is a pulse of 250us\n\ +"); + +} /* end function print_usage */ + +static void +terminate(int num) +{ + running = false; + fprintf(stderr, "Caught signal - Terminating\n"); +} + +// MIN_DURATION (in us) is based on limitation of the ookbursttiming object +#define MIN_DURATION 10 +void FATAL_ERROR(const int exitcode, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "FATAL : "); + vfprintf(stderr, fmt, args); + va_end(args); + exit(exitcode); +} + +/** + **/ +int main(int argc, char *argv[]) +{ + int anyargs = 1; + int a; + uint64_t Freq = 433920000; + uint64_t bit0duration = 500; // in microsecond + uint64_t bit1duration = 500; + int nbrepeat = 3; + int pause = 1000; // in us + int dryrun = 0; // if 1 : hte message is not really transmitted + char *bits = NULL; + + for (int i = 0; i < 64; i++) + { + struct sigaction sa; + std::memset(&sa, 0, sizeof(sa)); + sa.sa_handler = terminate; + sigaction(i, &sa, NULL); + } + while(1) + { + a = getopt(argc, argv, "f:0:1:r:p:hvd"); + if(a == -1) + { + if(anyargs) break; + else a='h'; //print usage and exit + } + anyargs = 1; + switch(a) + { + case 'f': // Frequency + Freq = atouint32_metric(optarg, "Error with -f : "); + break; + case '0': // bit 0 duration + bit0duration = atouint32_metric(optarg, "Error with -0 : "); + break; + case '1': // bit 0 duration + bit1duration = atouint32_metric(optarg, "Error with -1 : "); + break; + case 'r': + nbrepeat = atoi(optarg); + break; + case 'p': + pause = atoi(optarg); + break; + case 'h' : + print_usage(); + exit(0); + break; + case 'v': // verbose + dbg_setlevel(dbg_getlevel() + 1); + break; + case 'd': // Dry run + dryrun = 1; + break; + case -1: + break; + default: + print_usage(); + exit(1); + break; + }/* end switch a */ + }/* end while getopt() */ + if (optind >= argc) { + FATAL_ERROR(-2, "Missing bit message.\n"); + } + bits = argv[optind]; + printf("Frequency set to : %" PRIu64 "Hz \n", Freq); + printf("Bit duration 0 : %" PRIu64 "us ; 1 : %" PRIu64 "us\n", + bit0duration, bit1duration); + printf("Send message %d times with a pause of %dus\n", nbrepeat, pause); + if (dryrun) + printf("Dry run mode enabled : no message will be sent\n"); + dbg_printf(1, "Verbose mode enabled, level %d.\n", dbg_getlevel()); + // Simplify the message to send + int computed_duration = 0; // in us + int nbbits = 0; + for(size_t i = 0; i < strlen(bits); i++) + { + char c = bits[i]; + if (c == '0') + { + nbbits ++; + computed_duration += bit0duration; + } else if (c == '1') + { + nbbits ++; + computed_duration += bit1duration; + } + // any other char is ignored (it allows to speparate nibble with a space for example) + // improvement : allow "." and "-" or "i" and "a" to create a MORSE sender + } + dbg_printf(1, "Send %d bits, with a total duration of %d us.\n", nbbits, computed_duration); + if (computed_duration == 0 || nbbits == 0) + { + FATAL_ERROR(-2, "Message duration or number of bits invalid.\n"); + } + if (bit0duration < MIN_DURATION || bit1duration < MIN_DURATION) + { + FATAL_ERROR(-2, "Currently, sendook support only bit longer than 10us.\n"); + } + + // Prepare the message + ookbursttiming ooksender(Freq, computed_duration); + ookbursttiming::SampleOOKTiming Message[nbbits]; + for(size_t i = 0; i < strlen(bits); i++) + { + char c = bits[i]; + if (c == '0') + { + Message[i].value = 0; + Message[i].duration = bit0duration; + } else if (c == '1') + { + Message[i].value = 1; + Message[i].duration = bit1duration; + } + } + + // Send the message + for (int i = 0; i < nbrepeat; i++) + { + if (!dryrun) + ooksender.SendMessage(Message, nbbits); + else + { + printf("Simulating SendMessage of %d bits\n", nbbits); + usleep(computed_duration); + } + if(!running) + break; + if (i