Device-Chip-CC1101

 view release on metacpan or  search on metacpan

lib/Device/Chip/CC1101.pm  view on Meta::CPAN

      my ( $rssi, $lqi ) = unpack( "c C", substr( $bytes, -2, 2, "" ) );

      # RSSI is 2s complement in 0.5dBm units offset from -74dBm
      $ret{RSSI} = $rssi / 2 - 74;

      # LQI/CRC_OK
      $ret{LQI}    = $lqi & 0x7F;
      $ret{CRC_OK} = !!( $lqi & 0x80 );
   }

   $ret{data} = $bytes;

   return \%ret;
}

=head2 transmit

   await $chip->transmit( $bytes );

Enters TX mode and sends a packet containing the given bytes.

This method automatically handles prepending the packet length if the chip is
configured in variable-length packet mode.

=cut

async method transmit ( $bytes )
{
   my $fixedlen = $_cached_config{LENGTH_CONFIG} eq "fixed";

   my $pktlen = length $bytes;
   if( $fixedlen ) {
      $pktlen == $_cached_config{PACKET_LENGTH} or
         croak "Expected a packet $_cached_config{PACKET_LENGTH} bytes long";
   }
   else {
      # Ensure we can't overflow either TX or RX FIFO
      $pktlen <= 62 or
         croak "Expected no more than 62 bytes of packet data"
   }

   await $self->start_tx;

   $bytes = pack "C a*", $pktlen, $bytes if !$fixedlen;

   await $self->write_txfifo( $bytes );

   # Transmit should definitely be over in well under 50msec
   my $deadline = gettimeofday + 0.050;

   while( await( $self->read_chipstatus_tx )->{STATE} eq "TX" ) {
      gettimeofday < $deadline or croak "Timed out waiting for TX to complete";
      await Future::IO->sleep( $_poll_interval );
   }
}

{
   while( readline DATA ) {
      chomp;
      next if m/^#/;
      my ( $name, $fields ) = split m/\|/, $_;

      $PRESET_MODES{$name} = +{
         map { m/(.*?)=(.*)/ } split m/,/, $fields
      };
   }

   %BANDS = (
      "433MHz" => {
         FREQ    => 1091426,
         # From the datasheet presuming 433MHz on multilayer inductors
         PATABLE => "12.0E.1D.34.60.84.C8.C0",
      },

      "868MHz" => {
         FREQ    => 2188650,
         # From the datasheet presuming 868MHz on multilayer inductors
         PATABLE => "03.0F.1E.27.50.81.CB.C2",
      },
   );
}

0x55AA;

=head1 TODO

=over 4

=item *

Polling/interrupts to wait for RX packet

=item *

Support addressing modes in L</transmit> and L</receive>

=back

=head1 AUTHOR

Paul Evans <leonerd@leonerd.org.uk>

=cut

__DATA__
# The following data is automatically generated by update-configs.pl
common|FOC_BS_CS_GATE=,FREQ=2188650,FS_AUTOCAL=on-unidle,PO_TIMEOUT=x64
ASK-4.8kb|CHANBW_E=3,DEVIATION_M=0,DRATE_E=7,DRATE_M=131,FREQ_IF=6,FSCAL=3928621087,MAX_DVGA_GAIN=not-top,MOD_FORMAT=ASK,SYNC_MODE=15/16
GFSK-1.2kb|CCA_MODE=always,CHANBW_E=3,CHANBW_M=3,CHANSPC_E=0,DEVIATION_E=1,DEVIATION_M=5,DRATE_E=5,DRATE_M=131,FEC_EN=1,FREQ_IF=8,FSCAL=2836004881,MOD_FORMAT=GFSK,PA_POWER=7,RXOFF_MODE=RX,SYNC_MODE=30/32
GFSK-100kb|AGC_LNA_PRIORITY=lna-first,BS_PRE_KI=KI,BS_PRE_KP=2KP,CCA_MODE=always,CHANBW_E=1,CHANBW_M=1,CHANSPC_E=0,DRATE_E=11,DRATE_M=248,FEC_EN=1,FILTER_LENGTH=32sa,FOC_LIMIT=BW/8,FOC_PRE_K=4K,FREQ_IF=8,FSCAL=3926523921,LNA2MIX_CURRENT=3,LNA_CURRENT...
GFSK-38.4kb|CCA_MODE=always,CHANBW_E=3,CHANSPC_E=0,DEVIATION_E=3,DEVIATION_M=4,DRATE_E=10,DRATE_M=131,FEC_EN=1,FREQ_IF=6,FSCAL=2836004881,MAX_DVGA_GAIN=not-top,MOD_FORMAT=GFSK,PA_POWER=7,RXOFF_MODE=RX,SYNC_MODE=30/32
MSK-250kb|AGC_LNA_PRIORITY=lna-first,BS_PRE_KI=KI,BS_PRE_KP=2KP,CCA_MODE=always,CHANBW_E=0,CHANBW_M=2,CHANSPC_E=0,DEVIATION_E=0,DEVIATION_M=0,DRATE_E=13,DRATE_M=59,FEC_EN=1,FILTER_LENGTH=32sa,FOC_LIMIT=BW/8,FOC_PRE_K=4K,FREQ_IF=11,FSCAL=3926523921,LN...
MSK-500kb|BS_PRE_KI=KI,BS_PRE_KP=2KP,CCA_MODE=always,CHANBW_E=0,CHANSPC_E=0,DEVIATION_E=0,DEVIATION_M=0,DRATE_E=14,DRATE_M=59,FEC_EN=1,FILTER_LENGTH=32sa,FOC_LIMIT=BW/8,FOC_PRE_K=4K,FREQ_IF=12,FSCAL=3926523929,LNA2MIX_CURRENT=3,LNA_CURRENT=2,MAGN_TAR...



( run in 0.895 second using v1.01-cache-2.11-cpan-71847e10f99 )