Skip to content

Commit

Permalink
Chat: use 300us short pulse for better reception.
Browse files Browse the repository at this point in the history
  • Loading branch information
antirez committed Jan 28, 2023
1 parent a7c8520 commit 7143455
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions protocols/pvchat.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,16 @@
* Protocol description
* ====================
*
* "1" represents a pulse of one-third bit time (100us)
* "0" represents a gap of one-third bit time (100us)
* The protocol works with different data rates. However here is defined
* to use a short pulse/gap duration of 300us and a long pulse/gap
* duration of 600us. Even with the Flipper hardware, the protocol works
* with 100/200us, but becomes less reliable and standard presets can't
* be used because of the higher data rate.
*
* In the following description we have that:
*
* "1" represents a pulse of one-third bit time (300us)
* "0" represents a gap of one-third bit time (300us)
*
* The message starts with a preamble + a sync pattern:
*
Expand All @@ -23,8 +31,8 @@
* The a variable amount of bytes follow, where each bit
* is encoded in the following way:
*
* zero 100 (100 us pulse, 200 us gap)
* one 110 (200 us pulse, 100 us gap)
* zero 100 (300 us pulse, 600 us gap)
* one 110 (600 us pulse, 300 us gap)
*
* Bytes are sent MSB first, so receiving, in sequence, bits
* 11100001, means byte E1.
Expand Down Expand Up @@ -62,10 +70,9 @@
* contains alternating short pulses/gaps at 100us.
*
* 3. Data encoding wastes some bandwidth in order to be more
* robust. The consumed bandwidth is compensated with the ability
* to send the signal with a 100us clock period, so an actual
* bit takes 300us, reaching a data transfer of 416 bytes per
* second. More than enough for the chat.
* robust. Even so, with a 300us clock period, a single bit
* bit takes 900us, reaching a data transfer of 138 characters per
* second. More than enough for the simple chat we have here.
*/

static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) {
Expand Down Expand Up @@ -145,23 +152,23 @@ static void get_fields(ProtoViewFieldSet *fieldset) {
/* Create a signal. */
static void build_message(RawSamplesBuffer *samples, ProtoViewFieldSet *fs)
{
uint32_t te = 100; /* Short pulse duration in microseconds.
uint32_t te = 300; /* Short pulse duration in microseconds.
Our protocol needs three symbol times to send
a bit, so 300 us per bit = 3.33 kBaud. */

// Preamble: 24 alternating 100us pulse/gap pairs.
// Preamble: 24 alternating 300us pulse/gap pairs.
for (int j = 0; j < 24; j++) {
raw_samples_add(samples,true,te);
raw_samples_add(samples,false,te);
}

// Sync: 3 alternating 200 us pulse/gap pairs.
// Sync: 3 alternating 600 us pulse/gap pairs.
for (int j = 0; j < 3; j++) {
raw_samples_add(samples,true,te*2);
raw_samples_add(samples,false,te*2);
}

// Sync: plus 2 alternating 100 us pluse/gap pairs.
// Sync: plus 2 alternating 300 us pluse/gap pairs.
for (int j = 0; j < 2; j++) {
raw_samples_add(samples,true,te);
raw_samples_add(samples,false,te);
Expand Down

0 comments on commit 7143455

Please sign in to comment.